namespaceMicrosoft.TeamFoundation.WorkItemTracking.Client{ usingMicrosoft.TeamFoundation; usingMicrosoft.TeamFoundation.Client; usingMicrosoft.TeamFoundation.Common; usingMicrosoft.TeamFoundation.WorkItemTracking.Client.DataStore; usingMicrosoft.TeamFoundation.WorkItemTracking.Proxy; usingSystem; usingSystem.Collections; usingSystem.Collections.Generic; usingSystem.Globalization; usingSystem.IO; usingSystem.Reflection; usingSystem.Runtime.InteropServices; usingSystem.Threading; usingSystem.Xml; publicsealed
classWorkItem : IRevisionInternal { internalconst
intc_revisionHistory = -4; internalconst
intc_revisionLatest = -3; internalconst
intc_revisionNull = -1; internalconst
intc_revisionUpdate = -2; privateDateTime? m_asof; privateAttachmentCollection m_attachments; privateint
m_dataVersion; privatebool? m_dirty; privateFieldCollection m_fields; privateWorkItemFieldData m_fieldsData; privateint
m_id; privateint
m_index; privatebool
m_IsUpdating; privateLinkCollection m_links; privateWorkItemLinkData m_linksData; privateWorkItemCollection m_list; privateint
m_metadataVersion; privateOpenState m_openState; privateMicrosoft.TeamFoundation.WorkItemTracking.Client.Project m_project; privatebool? m_readonly; privateRevisionCollection m_revisions; privateWorkItemStore m_store; privateint
m_tempId; privateWorkItemType m_type; privateWorkItemLinkCollection m_wlinks; privateWorkItemLinkCollection m_wlinksHistory; privatestatic
int[] s_areaDependentFieldIds =new
int[] { -12, -42, -43, -44, -45, -46, -47, -48, -49 }; internalstatic
int[] s_internallyCalculatedFieldIds =new
int[] { -7, -12, -42, -43, -44, -45, -46, -47, -48, -49, -105, -50, -51, -52, -53, -54, -55, -56 }; privatestatic
int[] s_iterationDependentFieldIds =new
int[] { -50, -51, -52, -53, -54, -55, -56 }; privatestatic
ints_tempId = 0; publicevent
WorkItemFieldChangeEventHandler FieldChanged; publicWorkItem(WorkItemType type) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, WorkItemType type)"); if(type ==
null) { thrownew
ArgumentNullException("type"); } this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); this.m_store = type.Store; this.m_id = 0; this.m_tempId = Interlocked.Decrement(refs_tempId); this.m_openState = OpenState.New; this.m_readonly =false; this.InitNew(type); this.ApplyRules(); this.m_dirty =true; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalWorkItem(WorkItemCollection list,
intindex) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; this.m_store = list.Store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); this.m_id = list.GetId(index); this.m_tempId =this.m_id; this.m_list = list; this.m_index = index; this.m_openState = OpenState.Queried; if(!list.Query.IsBatchReadMode) { this.m_asof =new
DateTime?(list.Query.AsOfUTC); } } internalWorkItem(WorkItemStore store,
intid) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, int id)"); if(store ==
null) { thrownew
ArgumentNullException("store"); } if(id <= 0) { thrownew
ArgumentOutOfRangeException("id"); } this.m_store = store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); this.m_id = id; this.m_tempId = id; this.LoadWorkItem(id, 0,null); this.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalWorkItem(WorkItemStore store, System.Uri uri) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, Uri uri)"); if(store ==
null) { thrownew
ArgumentNullException("store"); } this.m_store = store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); if(!this.IsValidUri(uri)) { thrownew
ArgumentException("uri"); } ArtifactId artifact =this.GetArtifact(uri); this.m_id = Convert.ToInt32(artifact.ToolSpecificId, CultureInfo.InvariantCulture); this.m_tempId =this.m_id; this.LoadWorkItem(this.m_id, 0,null); this.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalWorkItem(WorkItemStore store,
intid, DateTime at) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, int id, DateTime at)"); if(store ==
null) { thrownew
ArgumentNullException("store"); } if(id <= 0) { thrownew
ArgumentOutOfRangeException("id"); } DateTime time = store.ConvertToUniversalTime(at); if((time <
newDateTime(0x76c, 1, 1)) || (time >= DateTime.MaxValue)) { thrownew
ArgumentOutOfRangeException("at"); } this.m_store = store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); this.m_id = id; this.m_tempId = id; this.LoadWorkItem(id, 0,new
DateTime?(time)); this.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalWorkItem(WorkItemStore store,
intid,
int revision) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, int id, int revision)"); if(store ==
null) { thrownew
ArgumentNullException("store"); } if(id <= 0) { thrownew
ArgumentOutOfRangeException("id"); } if(revision <= 0) { thrownew
ArgumentOutOfRangeException("revision"); } this.m_store = store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); this.m_id = id; this.m_tempId = id; this.LoadWorkItem(id, revision,null); this.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalWorkItem(WorkItemStore store, System.Uri uri, DateTime at) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, Uri uri, DateTime at)"); if(store ==
null) { thrownew
ArgumentNullException("store"); } DateTime time = store.ConvertToUniversalTime(at); if((time <
newDateTime(0x76c, 1, 1)) || (time >= DateTime.MaxValue)) { thrownew
ArgumentOutOfRangeException("at"); } this.m_store = store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); if(!this.IsValidUri(uri)) { thrownew
ArgumentException("uri"); } ArtifactId artifact =this.GetArtifact(uri); this.m_id = Convert.ToInt32(artifact.ToolSpecificId, CultureInfo.InvariantCulture); this.m_tempId =this.m_id; this.LoadWorkItem(this.m_id, 0,new
DateTime?(time)); this.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalWorkItem(WorkItemStore store, System.Uri uri,
intrevision) { this.m_dirty =false; this.m_readonly =null; this.m_asof =null; Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewBegin); TeamFoundationTrace.Verbose("Entering WorkItem(WorkItemStore store, Uri uri, int revision)"); if(store ==
null) { thrownew
ArgumentNullException("store"); } if(revision <= 0) { thrownew
ArgumentOutOfRangeException("revision"); } this.m_store = store; this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); if(!this.IsValidUri(uri)) { thrownew
ArgumentException("uri"); } ArtifactId artifact =this.GetArtifact(uri); this.m_id = Convert.ToInt32(artifact.ToolSpecificId, CultureInfo.InvariantCulture); this.m_tempId =this.m_id; this.LoadWorkItem(this.m_id, revision,null); this.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemNewEnd); } internalvoid
ApplyFieldChange(intfieldId,
objectvalue) { BrieCallBack bc =new
BrieCallBack(this); WorkItemFieldData.FieldUpdate update =new
WorkItemFieldData.FieldUpdate(); update.Value = value; update.Flags = 0; bc.FieldUpdates.Add(fieldId, update); this.ApplyFieldChange(fieldId, bc, 2); bc.FieldUpdates.Remove(fieldId); this.FieldData.SetFieldValues(bc.FieldUpdates); this.Store.PsDatastore.BrieAccessCheck(bc, 1, fieldId); this.FieldData.SetFieldStates(bc.FieldStates); } privatevoid
ApplyFieldChange(intfieldId, BrieCallBack bc,
intrecursive) { if(fieldId != 0) { this.Store.PsDatastore.BrieInvalidateFields(bc, fieldId); bc.SetFieldUpdateFlags(WorkItemFieldData.FieldFlags.SetByDefaultRule); this.Store.PsDatastore.BrieAccessCheck(bc, 0x80, fieldId); bc.SetFieldUpdateFlags(0); this.Store.PsDatastore.BrieAccessCheck(bc, 0x40, fieldId); } Dictionary<int,bool="">
dictionary = bc.ResetChanges(); if(recursive > 0) { foreach(int
num in
dictionary.Keys) { this.ApplyFieldChange(num, bc, recursive - 1); } } } internalvoid
ApplyRules() { this.ApplyRules(true); } internalvoid
ApplyRules(boolfSetChangedBy) { this.FieldData.ResetChangedFields(); BrieCallBack callback =new
BrieCallBack(this); callback.SetFieldUpdateFlags(WorkItemFieldData.FieldFlags.SetByDefaultRule); this.Store.PsDatastore.BrieAccessCheck(callback, 0x80, 0); callback.SetFieldUpdateFlags(0); this.Store.PsDatastore.BrieAccessCheck(callback, 0x20, 0); this.ApplyFieldChange(0, callback, 2); this.FieldData.SetFieldValues(callback.FieldUpdates); this.Store.PsDatastore.BrieAccessCheck(callback, 1, 0); this.FieldData.SetAllFieldStates(callback.FieldStates); if(fSetChangedBy) { intid = 9; stringuserDisplayName =
this.m_store.UserDisplayName; if(this.FieldData.SetUpdateFieldValue(id,
userDisplayName, WorkItemFieldData.FieldFlags.SetByRule)) { this.ApplyFieldChange(id, userDisplayName); } } this.FieldData.FireEvents(); } privateobject
CalculateAuthorizedAsField(intrevision) { objectfieldValue =
this.GetFieldValue(-6, revision); if(fieldValue
isint) { returnthis.m_store.GetPersonNameById((int)
fieldValue); } returnfieldValue; } internalvoid
CalculateFieldLists(intfieldId) { BrieCallBack callback =new
BrieCallBack(this); this.Store.PsDatastore.BrieAccessCheck(callback, 0x17, fieldId); this.FieldData.SetFieldStates(callback.FieldStates); } privateobject
CalculateNodeNameField(intfname,
int fid,
int revision) { objectfieldValue =
this.GetFieldValue(fid, revision); if(fieldValue
isint) { returnthis.m_store.TreeIdToNodeName((int)
fieldValue); } returnfieldValue; } privateobject
CalculateTreeLevelField(intflevel,
intflevel1,
intfid,
int revision) { objectfieldValue =
this.GetFieldValue(fid, revision); if(fieldValue
isint) { returnthis.m_store.TreeIdToNodeLevel((int)
fieldValue, (flevel1 - flevel) + 1); } returnfieldValue; } privateobject
CalculateTreePathField(intfpath,
int fid,
int revision) { objectfieldValue =
this.GetFieldValue(fid, revision); if(fieldValue
isint) { returnthis.m_store.TreeIdToPath((int)
fieldValue); } returnfieldValue; } privatevoid
CheckType() { WorkItemType type =this.Type; } privatevoid
CheckUpdateCachedData() { boolflag =
false; if(this.m_store.MetadataVersion !=this.m_metadataVersion) { flag =true; } intmetadataVersion =
this.m_store.MetadataVersion; if(this.m_project ==null) { objectfieldValue =
this.GetFieldValue(-2, -2); if(fieldValue !=
null) { this.m_project =this.m_store.TreeIdToProject((int)
fieldValue); } } elseif
(flag) { this.m_project =this.m_store.Projects.GetById(this.m_project.Id); this.m_type =null; } if((this.m_type ==null)
&& (this.m_project !=null)) { stringstr = (string)this.GetFieldValue(0x19,
-2); if(!string.IsNullOrEmpty(str) &&this.m_project.WorkItemTypes.Contains(str)) { this.m_type =this.m_project.WorkItemTypes[str]; } } this.m_metadataVersion = metadataVersion; } publicvoid
Close() { if(!this.IsNew) { this.m_fieldsData =new
WorkItemFieldData(this); this.m_linksData =new
WorkItemLinkData(this); this.m_revisions =null; this.m_attachments =null; this.m_links =null; this.m_wlinks =null; this.m_wlinksHistory =null; this.m_fields =null; if(this.m_list !=null) { this.m_openState = OpenState.Queried; } else { this.m_openState = OpenState.Undefined; } } } internalvoid
ConvertFieldValueToExternal(refobject
value, System.Type type) { if((value ==
null) && (type ==typeof(string))) { value =string.Empty; } elseif
(value isDateTime) { value =this.Store.ConvertToLocalTime((DateTime) value); } } internalWorkItemFieldData.FieldFlags ConvertFieldValueToInternal(refobject
value, System.Type type) { if(value ==
null) { return0; } try { objectobj2 = value; if(value.GetType() != type) { if((type ==
typeof(Guid)) && (valueis
string)) { obj2 =new
Guid((string) value); } else { obj2 = Convert.ChangeType(value, type,this.Store.CultureInfo); } } if(obj2
is string) { obj2 = ((string) obj2).Trim(); if(string.IsNullOrEmpty((string)
obj2)) { obj2 =null; } } elseif
(obj2 isDateTime) { DateTime time = (DateTime) obj2; intyear = time.Year; if((year < 0x6d9) || (year > 0x270f)) { returnWorkItemFieldData.FieldFlags.InvalidDate; } obj2 =this.Store.ConvertToUniversalTime((DateTime) obj2); } value = obj2; return0; } catch(FormatException) { returnWorkItemFieldData.FieldFlags.InvalidType; } catch(OverflowException) { returnWorkItemFieldData.FieldFlags.InvalidType; } catch(InvalidCastException) { returnWorkItemFieldData.FieldFlags.InvalidType; } } publicWorkItem Copy() { returnthis.Copy(this.Type); } publicWorkItem Copy(WorkItemType targetType) { returnthis.Copy(targetType, WorkItemCopyFlags.CopyLinks); } publicWorkItem Copy(WorkItemType targetType, WorkItemCopyFlags flags) { if(targetType ==
null) { thrownew
ArgumentNullException("targetType"); } this.CheckType(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemCopyBegin); WorkItem target =new
WorkItem(targetType); intid = targetType.Project.Id; foreach(FieldDefinition definition
intargetType.FieldDefinitions) { if(!definition.IsCloneable) { continue; } Field field =this.Fields.TryGetById(definition.Id); if((((field !=
null) && (field.Value !=null)) && !object.Equals(field.Value,string.Empty))
&& (((definition.Id != -2) && (definition.Id != -104)) || ((field.Valueis
int) && (this.m_store.TreeIdToProjectId((int) field.Value)
== id)))) { target.FieldData.SetUpdateFieldValue(definition.Id, field.Value, 0); } } target.History = HistoryBuilder.BuildHistoryFromItem(this); if((flags & WorkItemCopyFlags.CopyFiles) != WorkItemCopyFlags.None) { foreach(Attachment attachment
inthis.Attachments) { target.Attachments.Add(newAttachment(attachment)); } } if(((flags & WorkItemCopyFlags.CopyLinks) != WorkItemCopyFlags.None) &&this.Store.Equals(target.Store)) { foreach(Link link
inthis.Links) { Link link2 = link.Clone(target); if(link2 !=
null) { target.Links.Add(link2); } } foreach(WorkItemLink link3
inthis.WorkItemLinks) { Link link4 = link3.Clone(target); if(link4 !=
null) { target.Links.Add(link4); } } } if(!this.IsNew) { target.Links.Add(newRelatedLink(this.Id)); } target.ApplyRules(); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemCopyEnd); returntarget; } privatevoid
CreateLocalCopy(TfsWebClient client, WorkItemLinkData.AttachmentInfo fi) { stringtempFileName = GetTempFileName(this.m_store.CacheDirectory); UriBuilder builder =new
UriBuilder(this.m_store.AttachmentServerUrl); builder.Query =string.Format(CultureInfo.InvariantCulture,"{0}={1}",
new object[] {"FileID", fi.ExtId }); client.DownloadFile(builder.Uri.AbsoluteUri.ToString(), tempFileName); File.SetCreationTimeUtc(tempFileName, fi.CreationDate); File.SetLastWriteTimeUtc(tempFileName, fi.LastWriteDate); fi.FileInfo =new
FileInfo(tempFileName); } internalXmlElement CreateUpdateElement(XmlDocument xdoc, SaveFlags saveFlags,out
List<xmlelement> xlist,out
List<workitemlinkdata.workitemlinkinfo> links) { xlist =null; links =null; XmlElement xwi =null; xwi = xdoc.CreateElement(this.IsNew ?"InsertWorkItem"
: "UpdateWorkItem"); xwi.SetAttribute("ObjectType","WorkItem"); if(this.IsNew) { xwi.SetAttribute("TempID", XmlConvert.ToString(-this.TemporaryId)); } else { xwi.SetAttribute("WorkItemID", XmlConvert.ToString(this.Id)); xwi.SetAttribute("Revision", XmlConvert.ToString(this.Rev)); } XmlElement xc = xdoc.CreateElement("Columns"); XmlElement xcc = xdoc.CreateElement("ComputedColumns"); this.FieldData.AddUpdateElements(xdoc, xwi, xc, xcc); this.LinkData.AddUpdateElements(xdoc, xwi, saveFlags,out
xlist, out
links); if((xwi.ChildNodes.Count == 0) && (xc.ChildNodes.Count == 0)) { returnnull; } xwi.AppendChild(xc); xwi.AppendChild(xcc); returnxwi; } internalvoid
EnsureCollections() { if((this.m_openState != OpenState.Opened)
&& (this.m_openState != OpenState.New)) { intrev = 0; if(!this.m_asof.HasValue && (this.m_list
!=null)) { rev =this.m_list.GetAsOfRevision(this.m_index); } this.LoadWorkItem(this.m_id, rev,this.m_asof); } } privatestatic
EditAction FieldIdToAction(intfid) { switch(fid) { case50: returnEditAction.AddAttachment; case0x33: returnEditAction.AddHyperLink; case0x3a: returnEditAction.AddExternalLink; case0x25: returnEditAction.AddWorkItemLink; } thrownew
UnexpectedErrorException(); } privatevoid
FinishConstruction(refEditActionSet
set) { if((set.Flags & EditActionFlags.FieldChanges)
!= 0) { EditActionInfo info =set.Actions.Array[set.Actions.Offset]; set.Tag = HistoryBuilder.BuildTagLine(this,
info.Index); set.Description = (string)this.GetFieldValue(0x36,
info.Index); } else { set.Tag = HistoryBuilder.BuildTagLineLinks(this,this.m_store.GetPersonNameById(set.ChangedBy)); set.Description =string.Empty; } } internalvoid
FireCollectionChangeEvent(objectupdatedCollection,
objectupdatedItem, LinkAction action) { if(!this.m_IsUpdating && (this.m_fieldEventHandler
!=null)) { this.m_fieldEventHandler(this,new
WorkItemLinkEventArgs(updatedCollection, updatedItem, action)); } } internalvoid
FireFieldChangeEvent(intid) { if((!this.m_IsUpdating &&this.IsValidType)
&& (this.m_fieldEventHandler !=null)) { Field o =this.Fields.TryGetById(id); if(o !=
null) { this.m_fieldEventHandler(this,new
WorkItemEventArgs(o)); } } } internalvoid
FireWorkItemChangeEvent() { if(!this.m_IsUpdating && (this.m_fieldEventHandler
!=null)) { this.m_fieldEventHandler(this,new
WorkItemEventArgs(null)); } } internalbool
GetAccessDenied() { return(this.m_openState == OpenState.AccessDenied); } internalobject
GetActionObject(EditActionInfo a) { if(a.Action == EditAction.None) { returnnull; } if(a.Action == EditAction.Revision) { returnthis.Revisions[a.Index]; } returnthis.LinkData.GetLinkInfo(a.Index); } internalEditActionSet[] GetActionsHistory() { intrevisionCount =
this.FieldData.GetRevisionCount(); intlinkInfoCount =
this.LinkData.GetLinkInfoCount(); EditActionInfo[] array =new
EditActionInfo[revisionCount + (linkInfoCount * 2)]; intlength = 0; for(int
i = 0; i < revisionCount; i++) { EditActionInfo info =new
EditActionInfo(); info.Action = EditAction.Revision; info.ChangedDate = (DateTime)this.FieldData.GetFieldValue(-4, i); info.ChangedBy = (int)this.FieldData.GetFieldValue(-6,
i); info.Index = i; array[length++] = info; } for(int
j = 0; j < linkInfoCount; j++) { WorkItemLinkData.LinkInfo linkInfo =this.LinkData.GetLinkInfo(j); if(linkInfo !=
null) { WorkItemLinkData.WorkItemLinkInfo info3 = linkInfoas
WorkItemLinkData.WorkItemLinkInfo; if(linkInfo.AddedDate != WorkItemStore.FutureDateTimeValue) { EditActionInfo info4 =new
EditActionInfo(); info4.ChangedDate = linkInfo.AddedDate; info4.Index = j; info4.ChangedBy = (info3 !=null) ? info3.AddedBy : 0; info4.Action = FieldIdToAction(linkInfo.FieldId); array[length++] = info4; } if(linkInfo.RemovedDate != WorkItemStore.FutureDateTimeValue) { EditActionInfo info5 =new
EditActionInfo(); info5.ChangedDate = linkInfo.RemovedDate; info5.Index = j; info5.ChangedBy = (info3 !=null) ? info3.RemovedBy : 0; info5.Action = FieldIdToAction(linkInfo.FieldId) + 1; array[length++] = info5; } } } Array.Sort<editactioninfo>(array, 0, length,new
EditActionInfoComparator(this)); EditActionSetset
= new
EditActionSet(); intoffset = -1; List<editactionset> list =new
List<editactionset>(); for(int
k = 0; k < length; k++) { EditActionInfo info6 = array[k]; if((info6.ChangedDate !=
set.ChangedDate) || ((info6.ChangedBy != 0) && (info6.ChangedBy !=set.ChangedBy))) { if(offset >= 0) { set.Actions =new
ArraySegment<editactioninfo>(array, offset, k - offset); this.FinishConstruction(refset); list.Add(set); } set=
new EditActionSet(); set.ChangedDate = info6.ChangedDate; set.ChangedBy = info6.ChangedBy; offset = k; } set.Flags |= ((int) 1) << (info6.Action
/ 2); } if(offset >= 0) { set.Actions =new
ArraySegment<editactioninfo>(array, offset, length - offset); this.FinishConstruction(refset); list.Add(set); } returnlist.ToArray(); } privateArtifactId GetArtifact(System.Uri uri) { TeamFoundationTrace.Verbose("Entering WorkItem.GetArtifact, id = {0}, uri = {1}",new
object[] {this.Id, uri }); returnLinkingUtilities.DecodeUri(uri.ToString()); } internalbool
GetCalculatedFieldValue(intid,
int revision,
out object
value) { switch(id) { case-12: value =this.CalculateNodeNameField(id, -2, revision); returntrue; case-7: value =this.CalculateTreePathField(id, -2, revision); returntrue; case-1: value =this.CalculateAuthorizedAsField(revision); returntrue; case-56: case-55: case-54: case-53: case-52: case-51: case-50: value =this.CalculateTreeLevelField(id, -50, -104, revision); returntrue; case-49: case-48: case-47: case-46: case-45: case-44: case-43: value =this.CalculateTreeLevelField(id, -43, -2, revision); returntrue; case-42: value = (this.Project !=null)
? this.Project.Name :string.Empty; returntrue; case-105: value =this.CalculateTreePathField(id, -104, revision); returntrue; } if(this.IsOpen) { switch(id) { case-32: value =this.LinkData.ComputeLinkCount(0x33, revision); returntrue; case-31: value =this.LinkData.ComputeLinkCount(50, revision); returntrue; case0x4b: value =this.LinkData.ComputeLinkCount(0x25, revision); returntrue; case-57: value =this.LinkData.ComputeLinkCount(0x3a, revision); returntrue; } } value =null; returnfalse; } internalobject
GetFieldValue(intid,
int revision) { if(id == -3) { returnthis.m_id; } returnthis.m_fieldsData.GetFieldValue(id, revision); } internalobject
GetFieldValueExternal(FieldDefinition fd,int
revision) { objectfieldValue =
this.GetFieldValue(fd.Id, revision); if(fieldValue
isServerDefaultFieldValue) { fieldValue =this.GetFieldValue(fd.Id, revision - 1); } this.ConvertFieldValueToExternal(reffieldValue,
fd.SystemType); returnfieldValue; } publicstring
GetNextState(stringaction) { returnthis.Type.GetNextState(this.State,
action); } privatestatic
stringGetTempFileName(stringpath) { returnPath.Combine(path, Guid.NewGuid().ToString()); } internalvoid
HandleLinkCollectionChange(WorkItemLinkData.LinkInfo li, LinkAction action) { this.FieldData.ResetChangedFields(); switch(li.FieldId) { case50: if((action == LinkAction.Added) || (action == LinkAction.Removed)) { this.ApplyFieldChange(-31,this.LinkData.ComputeLinkCount(50,
-2)); this.FireFieldChangeEvent(-31); } this.Attachments.HandleChange(li, action); break; case0x33: if((action == LinkAction.Added) || (action == LinkAction.Removed)) { this.ApplyFieldChange(-32,this.LinkData.ComputeLinkCount(0x33,
-2)); this.FireFieldChangeEvent(-32); } this.Links.HandleChange(li, action); break; case0x3a: if((action == LinkAction.Added) || (action == LinkAction.Removed)) { this.ApplyFieldChange(-57,this.LinkData.ComputeLinkCount(0x3a,
-2)); this.FireFieldChangeEvent(-57); } this.Links.HandleChange(li, action); break; case0x25: if((action == LinkAction.Added) || (action == LinkAction.Removed)) { this.ApplyFieldChange(0x4b,this.LinkData.ComputeLinkCount(0x25,
-2)); this.FireFieldChangeEvent(0x4b); } this.Links.HandleChange(li, action); this.WorkItemLinks.HandleChange(li, action); break; } this.FieldData.FireEvents(); } privatevoid
InitNew(WorkItemType type) { intid = type.Project.Id; this.FieldData.SetUpdateFieldValue(-2, id, 0); this.FieldData.SetUpdateFieldValue(-104, id, 0); this.FieldData.SetUpdateFieldValue(0x19, type.Name, 0); this.m_type = type; this.m_project = type.Project; } internalbool? IsChangedInRevision(intid,
int revision) { switch(id) { case-7: case-49: case-48: case-47: case-46: case-45: case-44: case-43: case-42: case-12: id = -2; break; case-1: id = -6; break; case0x4b: case-57: case-32: case-31: returnnull; case-56: case-55: case-54: case-53: case-52: case-51: case-50: case-105: id = -104; break; } returnthis.m_fieldsData.IsChangedInRevision(id, revision); } internalbool
IsFieldValueValid(intid) { return((this.FieldData.GetFieldState(id).Flags
& WorkItemFieldData.FieldFlags.InvalidMask) == 0); } publicbool
IsValid() { returnthis.FieldData.IsValid(); } privatebool
IsValidUri(System.Uri uri) { TeamFoundationTrace.Verbose("Entering WorkItem.IsValidUri, id = {0}, uri = {1}",new
object[] {this.Id, uri }); if(uri !=
null) { try { ArtifactId artifact =this.GetArtifact(uri); if((TFStringComparer.ArtifactType.Equals(artifact.ArtifactType,"WorkItem")
&& TFStringComparer.ArtifactTool.Equals(artifact.Tool,"WorkItemTracking")) && (Convert.ToInt32(artifact.ToolSpecificId, CultureInfo.InvariantCulture) > 0)) { returntrue; } TeamFoundationTrace.Verbose("Invalid Work Item URI: {0}",new
object[] { uri.ToString() }); TeamFoundationTrace.Verbose(" This: {0}, {1}, {2}",new
object[] { artifact.ArtifactType, artifact.Tool, artifact.ToolSpecificId }); TeamFoundationTrace.Verbose(" Should be: {0}, {1}, #>0",new
object[] {"WorkItem",
"WorkItemTracking"
}); } catch { TeamFoundationTrace.Error("Exception while parsing URI: {0}",new
object[] { uri.ToString() }); } } returnfalse; } privatevoid
LoadWorkItem(intid,
int rev, DateTime? asof) { IWorkItemRowSets sets; this.m_store.LoadWorkItem(id, rev, asof,out
sets); this.m_asof = asof; if(!this.FieldData.LoadData(sets)) { thrownew
DeniedOrNotExistException(ResourceStrings.ErrorWorkItemNotExistOrNoAccess); } this.LinkData.LoadData(sets); if(rev != 0) { this.m_asof =new
DateTime?((DateTime)this.GetFieldValue(-4, -3)); } this.m_openState = OpenState.Opened; this.m_readonly =null; this.m_dataVersion++; } objectIRevisionInternal.GetCurrentFieldValue(FieldDefinition fd) { returnthis.GetFieldValueExternal(fd, -2); } objectIRevisionInternal.GetOriginalFieldValue(FieldDefinition fd) { returnthis.GetFieldValueExternal(fd, -3); } voidIRevisionInternal.SetFieldValue(FieldDefinition fd,
object value) { this.SetFieldValueExternal(fd, value); } publicvoid
Open() { Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemOpenBegin); TeamFoundationTrace.Verbose("Entering WorkItem.Open, id = {0}",new
object[] {this.Id }); if(!this.IsNew && !this.IsOpen) { this.LoadWorkItem(this.m_id,
0, null); this.ApplyRules(); this.RefreshCachedData(); this.FireWorkItemChangeEvent(); } TeamFoundationTrace.Verbose("Exiting WorkItem.Open, id = {0}",new
object[] {this.Id }); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemOpenEnd); } publicvoid
PartialOpen() { Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemPartialOpenBegin); TeamFoundationTrace.Verbose("Entering WorkItem.PartialOpen, id = {0}",new
object[] {this.Id }); if((!this.IsNew && !this.IsOpen)
&& !this.IsPartialOpen) { if(this.m_list ==null) { thrownew
ValidationException(ResourceStrings.ErrorWorkItemNeedCollection); } if(!this.m_list.QueryFieldValues(this.m_index,null)) { thrownew
DeniedOrNotExistException(); } this.m_openState = OpenState.PartiallyOpened; this.ApplyRules(); this.RefreshCachedData(); this.FireWorkItemChangeEvent(); this.CheckType(); } TeamFoundationTrace.Verbose("Exiting WorkItem.Open, id = {0}",new
object[] {this.Id }); Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemPartialOpenEnd); } internalvoid
PostSave() { this.LinkData.ProcessResultQueue(); this.RefreshCachedData(); this.FieldData.Reset(); this.ApplyRules(false); this.m_IsUpdating =false; this.FireWorkItemChangeEvent(); } internalvoid
PostSaveError() { this.m_IsUpdating =false; } internalvoid
PreSave() { this.m_IsUpdating =true; this.LinkData.Check(); this.LinkData.ResetResultQueue(); this.UploadAttachments(); } internalvoid
ProcessFieldChange(intid) { if(this.m_fields !=null) { this.m_fields.DropCachedData(); } if(this.IsValidType) { intnum = id; switch(num) { case-105: this.ProcessTreePathField(-105, -104, Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.PsCSSType.CSSTypeIteration); break; case-104: this.ProcessTreeIdField(-104, -105, s_iterationDependentFieldIds); break; case-7: this.ProcessTreePathField(-7, -2, Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.PsCSSType.CSSTypeArea); break; default: if(num == -2) { this.ProcessTreeIdField(-2, -7, s_areaDependentFieldIds); } break; } this.FieldData.RegisterChangedField(id); } } privatevoid
ProcessTreeIdField(intfid,
int fpath,
int[] affected) { if(this.IsFieldValueValid(fid)) { objectfieldValue =
this.GetFieldValue(fid, -2); if((fieldValue ==
null) || (fieldValueis
int)) { if(!this.FieldData.ResetUpdateFieldValue(fpath)) { this.FieldData.RegisterChangedField(fpath); } if(affected !=
null) { for(int
i = 0; i < affected.Length; i++) { this.FieldData.RegisterChangedField(affected[i]); } } } } } privatevoid
ProcessTreePathField(intfpath,
int fid, Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.PsCSSType csstype) { if(this.IsFieldValueValid(fpath)) { objectfieldValue =
this.GetFieldValue(fpath, -2); if(fieldValue ==
null) { this.FieldData.SetUpdateFieldValue(fpath, fieldValue, WorkItemFieldData.FieldFlags.InvalidPath); } elseif
(fieldValue is
string) { intnum =
this.m_store.TreeIdFromPath(this.Project.Id, (string)
fieldValue, csstype); if(num != 0) { this.SetFieldValue(fid, num, 0); this.FieldData.ResetUpdateFieldValue(fpath); } else { this.FieldData.SetUpdateFieldValue(fpath, fieldValue, WorkItemFieldData.FieldFlags.InvalidPath); } } } } internalbool
QueryFieldValue(intfield) { if(this.m_list ==null) { returnfalse; } if(this.IsAccessDenied || !this.m_list.QueryFieldValues(this.m_index,new
int[] { field })) { thrownew
DeniedOrNotExistException(); } returntrue; } privatevoid
RefreshCachedData() { if(this.IsValidType) { if(this.m_revisions !=null) { this.m_revisions.Refresh(); } if(this.m_attachments !=null) { this.m_attachments.Refresh(); } if(this.m_links !=null) { this.m_links.Refresh(); } if(this.m_wlinks !=null) { this.m_wlinks.Refresh(); } if(this.m_wlinksHistory !=null) { this.m_wlinksHistory.Refresh(); } if(this.m_fields !=null) { this.m_fields.DropCachedData(); } } this.m_dirty =null; } publicvoid
Reset() { TeamFoundationTrace.Verbose("Entering WorkItem.Reset, id = {0}",new
object[] {this.Id }); this.FieldData.Reset(); this.LinkData.Reset(); if(this.IsNew) { this.InitNew(this.Type); } this.ApplyRules(); this.RefreshCachedData(); this.FireWorkItemChangeEvent(); this.CheckType(); } internalvoid
ResetDirty() { this.m_dirty =null; } publicvoid
Save() { this.Save(SaveFlags.None); } publicvoid
Save(SaveFlags saveFlags) { if(this.IsDirty) { if(!this.IsValid()) { thrownew
ValidationException(ResourceStrings.ErrorWorkItemIsNotReadyToSave); } Node node =null; objectfieldValue =
this.GetFieldValue(-2, -2); if(fieldValue
isint) { node =this.m_store.TreeIdToNode((int)
fieldValue); } if(node ==
null) { thrownew
ValidationException(ResourceStrings.ErrorWorkItemIsNotReadyToSave); } if(!node.HasWorkItemWriteRights) { thrownew
ValidationException(ResourceStrings.ErrorNoAreaWriteAccess); } Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemSaveBegin); TeamFoundationTrace.Verbose("Entering WorkItem.Save, id = {0}",new
object[] {this.Id }); try { this.Store.SaveWorkItems(newWorkItem[]
{ this},
false, saveFlags); } catch(WorkItemLinkValidationException exception) { throwOME.TranslateLinkingValidationException(exception,
this.m_store,
this); } finally { Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMWorkItemSaveEnd); } } } internalvoid
SetAccessDenied() { this.m_openState = OpenState.AccessDenied; } internalvoid
SetFieldValue(intid,
object value, WorkItemFieldData.FieldFlags flags) { if(id == -3) { thrownew
ValidationException(ResourceStrings.ErrorCantModifyIdField); } boolflag = (flags & (WorkItemFieldData.FieldFlags.SetByDefaultRule | WorkItemFieldData.FieldFlags.SetByRule))
== 0; if(this.FieldData.SetUpdateFieldValue(id,
value, flags) && flag) { this.ApplyFieldChange(id, value); } } internalvoid
SetFieldValueExternal(FieldDefinition fd,object
value) { this.CheckType(); WorkItemFieldData.FieldFlags flags =this.ConvertFieldValueToInternal(refvalue,
fd.SystemType); if(fd.Id == -2) { if(!(value
isint) || !this.m_store.VerifyTreeId(this.Project.Id,
(int) value, Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.PsCSSType.CSSTypeArea)) { thrownew
InvalidTreeNodeException(); } } elseif
((fd.Id == -104) && (!(valueis
int) || !this.m_store.VerifyTreeId(this.Project.Id, (int)
value, Microsoft.TeamFoundation.WorkItemTracking.Client.DataStore.PsCSSType.CSSTypeIteration))) { thrownew
InvalidTreeNodeException(); } objectfieldValue =
this.GetFieldValue(fd.Id, -2); if((fd.Id == 9) || !object.Equals(value,
fieldValue)) { if(!fd.IsEditable) { thrownew
ValidationException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.ErrorReadOnlyField,new
object[] { fd.Name })); } if(fieldValue
isServerDefaultFieldValue) { if((value !=
null) && (!(valueis
string) || (((string) value).Length != 0))) { thrownew
ValidationException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.ErrorReadOnlyField,new
object[] { fd.Name })); } } else { if((fd.SystemType ==
typeof(string)) && (valueis
string)) { strings = (string) value; if((fd.FieldType == FieldType.String) && (s.Length >= 0x100)) { flags |= WorkItemFieldData.FieldFlags.InvalidTooLong; } if(!OMStringUtil.IsValidFieldValueString(s, fd.IsLongText)) { flags |= WorkItemFieldData.FieldFlags.InvalidSpecialChars; } } this.FieldData.ResetChangedFields(); this.SetFieldValue(fd.Id, value, flags); this.FieldData.FireEvents(); } } } internalvoid
SetListIndex(WorkItemCollection list,int
index) { this.m_list = list; this.m_index = index; } publicvoid
SyncToLatest() { TeamFoundationTrace.Verbose("Entering WorkItem.SyncToLatest, id = {0}",new
object[] {this.Id }); if(!this.IsNew) { this.FieldData.Reset(); this.LinkData.Reset(); this.LoadWorkItem(this.m_id,
0, null); this.ApplyRules(); this.RefreshCachedData(); this.FireWorkItemChangeEvent(); } } internalvoid
TakeUpdateLinkResult(WorkItemLinkData.WorkItemLinkInfo li, XmlElement result) { this.LinkData.TakeUpdateLinkResult(li, result); this.m_dataVersion++; } internalvoid
TakeUpdateResult(XmlElement result) { intnum = XmlConvert.ToInt32(result.GetAttribute("ID")); intnewRev = XmlConvert.ToInt32(result.GetAttribute("Revision")); if((this.IsNew ? (num == 0) : (num
!=this.m_id)) || (newRev == 0)) { thrownew
UnexpectedErrorException(ResourceStrings.UnrecognizedServerData); } if(this.m_id == 0) { this.m_id = num; this.m_tempId =this.m_id; } this.FieldData.TakeUpdateResult(result, newRev); this.LinkData.TakeUpdateResult(result); this.m_asof =null; if(this.m_openState == OpenState.New) { this.m_openState = OpenState.Opened; } this.m_readonly =null; this.m_dataVersion++; } privatevoid
UploadAttachments() { if(this.LinkData.GetAddedLinksCount()
!= 0) { stringstr =
this.Project.Uri.ToString(); stringstr2 =
string.Empty; if(this.Project.Id ==this.AreaId) { str2 =this.Project.AreaRootNodeUri.ToString(); } else { foreach(Node node
inthis.Project.AreaRootNodes) { if(node.Id ==
this.AreaId) { str2 = node.Uri.ToString(); break; } try { str2 = node.FindNodeInSubTree(this.AreaId).Uri.ToString(); break; } catch(DeniedOrNotExistException) { continue; } } } Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMAttachmentUploadBegin); WorkItemServer clientService =this.Store.ClientService; TfsWebClient client =null; foreach(WorkItemLinkData.AttachmentInfo info
inthis.LinkData.GetAddedLinks(50)) { if(info.IsUploaded) { continue; } if(info.FileInfo ==
null) { if(!info.IsLocalCopy) { continue; } if(client ==
null) { client =new
TfsWebClient(this.m_store.TeamProjectCollection); } this.CreateLocalCopy(client, info); } try { info.FileInfo.Refresh(); if(!info.FileInfo.Exists || (info.LastWriteDate.Ticks != info.FileInfo.LastWriteTimeUtc.Ticks)) { thrownew
FileAttachmentException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.AttachmentChangedException,new
object[] { info.FileInfo.FullName }),new
Attachment(this, info)); } if(info.FileInfo.Length > clientService.MaxAttachmentSize) { clientService.UpdateMaxAttachmentSize(); if(info.FileInfo.Length > clientService.MaxAttachmentSize) { thrownew
FileAttachmentException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.FileUploadedExceededMax,new
object[] { info.Attribute, clientService.MaxAttachmentSize }),new
Attachment(this, info)); } } using(Stream stream = info.FileInfo.OpenRead()) { FileAttachment fileAttachment =new
FileAttachment(); fileAttachment.FileNameGUID =new
Guid(info.Path); fileAttachment.AreaNodeUri = str2; fileAttachment.ProjectUri = str; fileAttachment.LocalFile = stream; clientService.UploadFile(fileAttachment); } info.IsUploaded =true; } catch(FileAttachmentException) { throw; } catch(FileNotFoundException exception) { thrownew
FileAttachmentException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.AttachmentNotFoundException,new
object[] { info.FileInfo.FullName }),new
Attachment(this, info), exception); } catch(Exception exception2) { thrownew
FileAttachmentException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.ErrorAttachmentUploadFailed,new
object[] { exception2.Message }), exception2); } finally { if(info.IsLocalCopy && (info.FileInfo !=
null)) { info.FileInfo.Delete(); info.FileInfo =null; } if(client !=
null) { client.Dispose(); } } info.IsLocalCopy =false; } Microsoft.TeamFoundation.Common.Marker.Process(Microsoft.TeamFoundation.Common.Mark.OMAttachmentUploadEnd); } } publicArrayList Validate() { returnthis.FieldData.Validate(); } publicint
AreaId { get { objectobj2 =
this[CoreField.AreaId]; if(obj2 !=
null) { return(int) obj2; } return0; } set { this[CoreField.AreaId] = value; } } publicstring
AreaPath { get { return(string)this[CoreField.AreaPath]; } set { this[CoreField.AreaPath] = value; } } internalDateTime? AsOfUTC { get { returnthis.m_asof; } } publicint
AttachedFileCount { get { objectobj2 =
this[CoreField.AttachedFileCount]; if(obj2 !=
null) { return(int) obj2; } return0; } } publicAttachmentCollection Attachments { get { if(this.m_attachments ==null) { this.m_attachments =new
AttachmentCollection(this, -2); } returnthis.m_attachments; } } publicstring
ChangedBy { get { return(string)this[CoreField.ChangedBy]; } } publicDateTime ChangedDate { get { objectobj2 =
this[CoreField.ChangedDate]; if(obj2 !=
null) { return(DateTime) obj2; } returnDateTime.MinValue; } } publicstring
CreatedBy { get { return(string)this[CoreField.CreatedBy]; } } publicDateTime CreatedDate { get { objectobj2 =
this[CoreField.CreatedDate]; if(obj2 !=
null) { return(DateTime) obj2; } returnDateTime.MinValue; } } publicstring
Description { get { return(string)this[CoreField.Description]; } set { this[CoreField.Description] = value; } } publicstring
DisplayForm { get { returnthis.Type.DisplayForm; } } publicint
ExternalLinkCount { get { objectobj2 =
this[CoreField.ExternalLinkCount]; if(obj2 !=
null) { return(int) obj2; } return0; } } internalWorkItemFieldData FieldData { get { returnthis.m_fieldsData; } } publicFieldCollection Fields { get { if(this.m_fields ==null) { this.m_fields =new
FieldCollection(this,this.Type.FieldDefinitions); } returnthis.m_fields; } } publicstring
History { get { return(string)this[CoreField.History]; } set { this[CoreField.History] = value; } } publicint
HyperLinkCount { get { objectobj2 =
this[CoreField.HyperLinkCount]; if(obj2 !=
null) { return(int) obj2; } return0; } } publicint
Id { get { returnthis.m_id; } } internalint
InternalVersion { get { returnthis.m_dataVersion; } } internalbool
IsAccessDenied { get { if((this.m_openState == OpenState.Queried)
&& (this.m_list !=null)) { this.m_list.QueryFieldValues(this.m_index,new
int[] { -2 }); } return(this.m_openState == OpenState.AccessDenied); } } publicbool
IsDirty { get { if(!this.m_dirty.HasValue) { this.m_dirty =false; bool? dirty =this.m_dirty; this.m_dirty =this.FieldData.IsDirty()
? ((bool?)true) : dirty; bool? nullable2 =this.m_dirty; this.m_dirty =this.LinkData.IsDirty()
? ((bool?)true) : nullable2; } returnthis.m_dirty.Value; } } publicbool
IsNew { get { return(this.m_id == 0); } } publicbool
IsOpen { get { if(this.m_openState != OpenState.New) { return(this.m_openState ==
OpenState.Opened); } returntrue; } } publicbool
IsPartialOpen { get { return(this.m_openState == OpenState.PartiallyOpened); } } publicbool
IsReadOnly { get { if(!this.m_readonly.HasValue) { objectfieldValue =
this.GetFieldValue(-2, -3); if(fieldValue
isint) { Node node =this.m_store.TreeIdToNode((int)
fieldValue); if(node !=
null) { this.m_readonly =new
bool?(!node.HasWorkItemWriteRights); } } } if(this.m_readonly.HasValue &&
!this.m_readonly.Value) { return!this.IsValidType; } returntrue; } } publicbool
IsReadOnlyOpen { get { if(!this.IsOpen && !this.IsPartialOpen) { returnfalse; } returnthis.IsReadOnly; } } internalbool
IsRevised { get { DateTime revisedDate =this.RevisedDate; return((revisedDate != DateTime.MinValue) && (revisedDate < WorkItemStore.FutureDateTimeValue)); } } privatebool
IsValidType { get { this.CheckUpdateCachedData(); return(this.m_type !=null); } } publicobject
this[stringname] { get { if(name ==
null) { thrownew
ArgumentNullException("name"); } returnthis.Fields[name].Value; } set { if(name ==
null) { thrownew
ArgumentNullException("name"); } this.Fields[name].Value = value; } } publicobject
this[CoreField id] { get { returnthis.Fields[id].Value; } set { this.Fields[id].Value = value; } } publicint
IterationId { get { objectobj2 =
this[CoreField.IterationId]; if(obj2 !=
null) { return(int) obj2; } return0; } set { this[CoreField.IterationId] = value; } } publicstring
IterationPath { get { return(string)this[CoreField.IterationPath]; } set { this[CoreField.IterationPath] = value; } } internalWorkItemLinkData LinkData { get { returnthis.m_linksData; } } publicLinkCollection Links { get { if(this.m_links ==null) { this.m_links =new
LinkCollection(this, -2); } returnthis.m_links; } } boolIRevisionInternal.IsReadOnly { get { returnfalse; } } intIRevisionInternal.Number { get { return-2; } } WorkItem IRevisionInternal.WorkItem { get { returnthis; } } publicstring
NodeName { get { return(string)this[CoreField.NodeName]; } } publicMicrosoft.TeamFoundation.WorkItemTracking.Client.Project Project { get { this.CheckUpdateCachedData(); if(this.m_project ==null) { thrownew
DeniedOrNotExistException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.ErrorProjectNotExist,new
object[] {string.Empty })); } returnthis.m_project; } } publicstring
Reason { get { return(string)this[CoreField.Reason]; } set { this[CoreField.Reason] = value; } } publicint
RelatedLinkCount { get { objectobj2 =
this[CoreField.RelatedLinkCount]; if(obj2 !=
null) { return(int) obj2; } return0; } } publicint
Rev { get { returnthis.Revision; } } publicDateTime RevisedDate { get { objectobj2 =
this[CoreField.RevisedDate]; if(obj2 !=
null) { return(DateTime) obj2; } returnDateTime.MinValue; } } publicint
Revision { get { objectobj2 =
this[CoreField.Rev]; if(obj2 !=
null) { return(int) obj2; } return0; } } publicRevisionCollection Revisions { get { if(this.m_revisions ==null) { this.m_revisions =new
RevisionCollection(this); } returnthis.m_revisions; } } publicstring
State { get { return(string)this[CoreField.State]; } set { this[CoreField.State] = value; } } publicWorkItemStore Store { get { returnthis.m_store; } } publicint
TemporaryId { get { returnthis.m_tempId; } } publicstring
Title { get { return(string)this[CoreField.Title]; } set { this[CoreField.Title] = value; } } publicWorkItemType Type { get { this.CheckUpdateCachedData(); if(this.m_type ==null) { thrownew
WorkItemTypeDeniedOrNotExistException(string.Format(CultureInfo.CurrentCulture, ResourceStrings.ErrorWorkItemTypeNotExist,new
object[] {string.Empty })); } returnthis.m_type; } } publicSystem.Uri Uri { get { TeamFoundationTrace.Verbose("Entering WorkItem.Uri/Get, id = {0}",new
object[] {this.Id }); ArtifactId artifactId =new
ArtifactId(); artifactId.ArtifactType ="WorkItem"; artifactId.Tool ="WorkItemTracking"; artifactId.ToolSpecificId =this.Id.ToString(CultureInfo.InvariantCulture); artifactId.VisualStudioServerNamespace =this.Store.TeamProjectCollection.Uri.AbsoluteUri; returnnew
System.Uri(LinkingUtilities.EncodeUri(artifactId)); } } publicWorkItemLinkCollection WorkItemLinkHistory { get { if(this.m_wlinksHistory ==null) { this.m_wlinksHistory =new
WorkItemLinkCollection(this, -4); } returnthis.m_wlinksHistory; } } publicWorkItemLinkCollection WorkItemLinks { get { if(this.m_wlinks ==null) { this.m_wlinks =new
WorkItemLinkCollection(this, -2); } returnthis.m_wlinks; } } privateclass
BrieCallBack : IBrieCallBack { privateDictionary<int,bool="">
m_changes; privateWorkItemFieldData.FieldFlags m_flags; privateDictionary<int, workitemfielddata.fieldinfo="">
m_states; privateDictionary<int, workitemfielddata.fieldupdate="">
m_updates; privateWorkItem m_workitem; publicBrieCallBack(WorkItem wi) { this.m_workitem = wi; this.m_states =new
Dictionary<int, workitemfielddata.fieldinfo="">(); this.m_updates =new
Dictionary<int, workitemfielddata.fieldupdate="">(); this.m_changes =new
Dictionary<int,bool="">(); this.m_flags = WorkItemFieldData.FieldFlags.SetByRule; } intIBrieCallBack.GetTreeId(boololdValue) { objectfieldValue =
this.m_workitem.GetFieldValue(-2, oldValue ? -3 : -2); if(fieldValue ==
null) { return-1; } return(int) fieldValue; } objectIBrieCallBack.GetValue(intfieldId,
boololdValue) { objectfieldValue; WorkItemFieldData.FieldUpdate update; if(!oldValue && (this.m_updates.TryGetValue(fieldId,out
update) ||this.m_workitem.FieldData.GetUpdateFieldValue(fieldId,out
update))) { fieldValue = update.Value; } else { fieldValue =this.m_workitem.GetFieldValue(fieldId, oldValue ?
-3 : -2); } if(fieldValue
isGuid) { fieldValue = ((Guid) fieldValue).ToString(); } returnfieldValue; } voidIBrieCallBack.InvalidateField(intfieldId) { } voidIBrieCallBack.SetProperties(intfieldId,
BrieComputedFieldFlags externalFlags, BrieComputedFieldFlags suggestedFlags, BrieComputedFieldFlags requiredFlags, BrieComputedFieldFlags forbiddenFlags, BrieComputedFieldFlags requiredStatus, BrieComputedFieldFlags forbiddenStatus,string[]
values,string[] formats,string[] forbiddenValues) { WorkItemFieldData.FieldFlags readOnly = 0; FieldDefinition definition =this.m_workitem.Store.FieldDefinitions.TryGetById(fieldId); if(definition !=
null) { if(definition.IsComputed) { readOnly = WorkItemFieldData.FieldFlags.ReadOnly; } else { if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagSameAsBefore) != 0) { readOnly |= WorkItemFieldData.FieldFlags.ReadOnly; } if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagEmpty) != 0) { objectfieldValue =
this.m_workitem.GetFieldValue(fieldId, -2); if((fieldValue ==
null) || ((fieldValueis
string) &&string.IsNullOrEmpty((string) fieldValue))) { readOnly |= WorkItemFieldData.FieldFlags.ReadOnly; } } if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagPattern) != 0) { readOnly |= WorkItemFieldData.FieldFlags.HasFormats; } if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagList) != 0) { readOnly |= WorkItemFieldData.FieldFlags.LimitedToValues; if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagKeepEmpty) == 0) { readOnly |= WorkItemFieldData.FieldFlags.Required; } } if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagPattern) != 0) { readOnly |= WorkItemFieldData.FieldFlags.LimitedToFormats; if((requiredFlags & BrieComputedFieldFlags.ComputedFieldFlagKeepEmpty) == 0) { readOnly |= WorkItemFieldData.FieldFlags.Required; } } if((forbiddenFlags & BrieComputedFieldFlags.ComputedFieldFlagEmpty) != 0) { readOnly |= WorkItemFieldData.FieldFlags.Required; } if((externalFlags & BrieComputedFieldFlags.ComputedFieldFlagList) != 0) { readOnly |= WorkItemFieldData.FieldFlags.HasValues; } if((externalFlags & BrieComputedFieldFlags.ComputedFieldFlagPattern) != 0) { readOnly |= WorkItemFieldData.FieldFlags.HasFormats; } if((externalFlags & BrieComputedFieldFlags.ComputedFieldFlagIncludeOldValue) != 0) { readOnly |= WorkItemFieldData.FieldFlags.AllowsOldValue; } if((requiredStatus | forbiddenStatus) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidRule; if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagEmpty) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidNotEmpty; } if((forbiddenStatus & BrieComputedFieldFlags.ComputedFieldFlagEmpty) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidEmpty; } if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagList) != 0) { if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagKeepEmpty) == 0) { objectobj3 =
this.m_workitem.GetFieldValue(fieldId, -2); if((obj3 ==
null) || ((obj3is
string) &&string.IsNullOrEmpty((string) obj3))) { readOnly |= WorkItemFieldData.FieldFlags.InvalidEmpty; } else { readOnly |= WorkItemFieldData.FieldFlags.InvalidListValue; } } else { readOnly |= WorkItemFieldData.FieldFlags.InvalidListValue; } } if((forbiddenStatus & BrieComputedFieldFlags.ComputedFieldFlagList) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidListValue; } if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagPattern) != 0) { if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagKeepEmpty) == 0) { objectobj4 =
this.m_workitem.GetFieldValue(fieldId, -2); if((obj4 ==
null) || ((obj4is
string) &&string.IsNullOrEmpty((string) obj4))) { readOnly |= WorkItemFieldData.FieldFlags.InvalidEmpty; } else { readOnly |= WorkItemFieldData.FieldFlags.InvalidFormat; } } else { readOnly |= WorkItemFieldData.FieldFlags.InvalidFormat; } } if((forbiddenStatus & BrieComputedFieldFlags.ComputedFieldFlagPattern) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidFormat; } if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagSameAsBefore) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidNotOldValue; } if((forbiddenStatus & BrieComputedFieldFlags.ComputedFieldFlagSameAsBefore) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidOldValue; } if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagEmptyOrSameAsBefore) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidNotEmptyOrOldValue; } if((forbiddenStatus & BrieComputedFieldFlags.ComputedFieldFlagEmptyOrSameAsBefore) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidEmptyOrOldValue; } if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagValueInOtherField) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidValueNotInOtherField; } if((forbiddenStatus & BrieComputedFieldFlags.ComputedFieldFlagValueInOtherField) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidValueInOtherField; } if((requiredStatus & BrieComputedFieldFlags.ComputedFieldFlagUnderlying) != 0) { readOnly |= WorkItemFieldData.FieldFlags.InvalidComputedField; } } } WorkItemFieldData.FieldInfo info =new
WorkItemFieldData.FieldInfo(); info.Id = fieldId; info.Flags = readOnly; info.Values = values; info.Formats = formats; info.ProhibitedValues = forbiddenValues; this.m_states[fieldId] = info; } } boolIBrieCallBack.SetValue(intfieldId,
objectvalue) { WorkItemFieldData.FieldUpdate update; WorkItemFieldData.FieldFlags flags = WorkItemFieldData.FieldFlags.SetByRule |this.m_flags; FieldDefinition definition =this.m_workitem.Store.FieldDefinitions.TryGetById(fieldId); if((definition ==
null) || definition.IsComputed) { returnfalse; } if((value
is string) && (definition.SystemType != value.GetType())) { try { value =this.m_workitem.FieldData.ConvertFromXml((string)
value, definition.SystemType); } catch(FormatException) { flags |= WorkItemFieldData.FieldFlags.InvalidType; } catch(OverflowException) { flags |= WorkItemFieldData.FieldFlags.InvalidType; } } if(this.m_updates.TryGetValue(fieldId,out
update) && ((update.Flags & WorkItemFieldData.FieldFlags.SetByDefaultRule) == 0)) { returnfalse; } update =new
WorkItemFieldData.FieldUpdate(); update.Value = value; update.Flags = flags; this.m_updates[fieldId] = update; this.m_changes[fieldId] =true; returntrue; } publicDictionary<int,bool="">
ResetChanges() { Dictionary<int,bool="">
changes =this.m_changes; this.m_changes =new
Dictionary<int,bool="">(); returnchanges; } publicvoid
SetFieldUpdateFlags(WorkItemFieldData.FieldFlags fieldFlags) { this.m_flags = fieldFlags; } publicDictionary<int, workitemfielddata.fieldinfo="">
FieldStates { get { returnthis.m_states; } } publicDictionary<int, workitemfielddata.fieldupdate="">
FieldUpdates { get { returnthis.m_updates; } } } internalenum
EditAction { None, Revision, AddAttachment, DelAttachment, AddHyperLink, DelHyperLink, AddExternalLink, DelExternalLink, AddWorkItemLink, DelWorkItemLink } [Flags] internalenum
EditActionFlags { AttachmentChanges = 2, ExternalLinkChanges = 8, FieldChanges = 1, HyperLinkChanges = 4, WorkItemLinkChanges = 0x10 } [StructLayout(LayoutKind.Sequential)] internalstruct
EditActionInfo { publicWorkItem.EditAction Action; publicDateTime ChangedDate; publicint
ChangedBy; publicint
Index; } privateclass
EditActionInfoComparator : IComparer<workitem.editactioninfo> { privateWorkItem m_item; publicEditActionInfoComparator(WorkItem w) { this.m_item = w; } publicint
Compare(WorkItem.EditActionInfo x, WorkItem.EditActionInfo y) { intnum = DateTime.Compare(x.ChangedDate, y.ChangedDate); if(num == 0) { num = (int) (x.Action - y.Action); } if(((num == 0) && (x.ChangedBy != 0)) && (y.ChangedBy != 0)) { num = x.ChangedBy - y.ChangedBy; } if((num == 0) && ((x.Action == WorkItem.EditAction.AddWorkItemLink) || (x.Action == WorkItem.EditAction.DelWorkItemLink))) { WorkItemLinkData.WorkItemLinkInfo actionObject = (WorkItemLinkData.WorkItemLinkInfo)this.m_item.GetActionObject(x); WorkItemLinkData.WorkItemLinkInfo info2 = (WorkItemLinkData.WorkItemLinkInfo)this.m_item.GetActionObject(y); num = actionObject.LinkType - info2.LinkType; if(num == 0) { num = actionObject.TargetId - info2.TargetId; } } returnnum; } } [StructLayout(LayoutKind.Sequential)] internalstruct
EditActionSet { publicDateTime ChangedDate; publicint
ChangedBy; publicstring
Tag; publicstring
Description; publicWorkItem.EditActionFlags Flags; publicArraySegment<workitem.editactioninfo> Actions; } privateenum
OpenState { Undefined, New, Queried, PartiallyOpened, Opened, AccessDenied } }}[tfs] workitemtracking source code,布布扣,bubuko.com
[tfs] workitemtracking source code
原文:http://blog.csdn.net/wzhiu/article/details/21008959