2 // Microsoft.TeamFoundation.VersionControl.Client.Repository
5 // Joel Reed (joelwreed@gmail.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Collections
.Generic
;
33 using System
.Reflection
;
36 using System
.Xml
.Schema
;
37 using System
.Web
.Services
;
38 using System
.Web
.Services
.Description
;
39 using System
.Web
.Services
.Discovery
;
40 using System
.Web
.Services
.Protocols
;
41 using Microsoft
.TeamFoundation
.VersionControl
.Common
;
43 namespace Microsoft
.TeamFoundation
.VersionControl
.Client
45 [System
.Web
.Services
.WebServiceBinding(Name
="RepositorySoap", Namespace
="http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03")]
46 [System
.Diagnostics
.DebuggerStepThroughAttribute()]
47 [System
.ComponentModel
.DesignerCategoryAttribute("code")]
48 [System
.Xml
.Serialization
.XmlIncludeAttribute(typeof(SecurityChange
))]
49 internal class Repository
: System
.Web
.Services
.Protocols
.SoapHttpClientProtocol
{
51 private VersionControlServer versionControlServer
;
52 private string itemUrl
;
53 private string uploadUrl
;
55 public Repository(VersionControlServer versionControlServer
,
56 Uri url
, ICredentials credentials
)
58 this.versionControlServer
= versionControlServer
;
59 this.Url
= String
.Format("{0}/{1}", url
, "VersionControl/v1.0/Repository.asmx");
60 this.itemUrl
= String
.Format("{0}/{1}", url
, RepositoryConstants
.DownloadUrlSuffix
);
61 this.uploadUrl
= String
.Format("{0}/{1}", url
, RepositoryConstants
.UploadUrlSuffix
);
62 this.Credentials
= credentials
;
65 public void UploadFile(string workspaceName
, string ownerName
, PendingChange change
)
67 FileInfo fi
= new FileInfo(change
.LocalItem
);
70 UploadFile upload
= new UploadFile(uploadUrl
, Credentials
);
71 upload
.AddValue(RepositoryConstants
.ServerItemField
, change
.ServerItem
);
72 upload
.AddValue(RepositoryConstants
.WorkspaceNameField
, workspaceName
);
73 upload
.AddValue(RepositoryConstants
.WorkspaceOwnerField
, ownerName
);
74 upload
.AddValue(RepositoryConstants
.LengthField
, len
.ToString());
75 upload
.AddValue(RepositoryConstants
.HashField
, Convert
.ToBase64String(change
.UploadHashValue
));
78 // TODO: handle files to large to fit in a single POST
79 upload
.AddValue(RepositoryConstants
.RangeField
,
80 String
.Format("bytes=0-{0}/{1}", len
-1, len
));
82 upload
.AddFile(change
.LocalItem
);
88 response
= upload
.Send();
90 catch (WebException ex
)
92 response
= ex
.Response
;
93 HttpWebResponse http_response
= response
as HttpWebResponse
;
94 if (http_response
== null || http_response
.StatusCode
!= HttpStatusCode
.InternalServerError
)
98 // Get the stream associated with the response.
99 //Stream receiveStream = response.GetResponseStream ();
100 //StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
101 //Console.WriteLine (readStream.ReadToEnd ());
104 //readStream.Close();
107 protected HttpWebResponse
Invoke (Message message
)
110 HttpWebResponse response
= GetWebResponse(message
.Request
) as HttpWebResponse
;
112 if (response
== null)
114 throw new TeamFoundationServerException("No response from server");
117 if (response
.StatusCode
== HttpStatusCode
.Unauthorized
)
119 string msg
= String
.Format("TF30063: You are not authorized to access {0} ({1}).\n--> Did you supply the correct username, password, and domain?",
120 (new Uri(this.Url
)).Host
, message
.MethodName
);
122 //StreamReader readStream = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
123 // Console.Error.WriteLine (readStream.ReadToEnd ());
124 //readStream.Close();
126 throw new TeamFoundationServerException(msg
);
129 if (response
.StatusCode
== HttpStatusCode
.InternalServerError
)
131 throw new VersionControlException(GetExceptionMessage(response
));
137 public string GetExceptionMessage(HttpWebResponse response
)
139 StreamReader sr
= new StreamReader(response
.GetResponseStream(), new UTF8Encoding (false), false);
140 XmlReader reader
= new XmlTextReader(sr
);
141 string msg
= String
.Empty
;
142 while (reader
.Read())
144 if (reader
.NodeType
== XmlNodeType
.Element
&& reader
.Name
== "faultstring")
146 msg
= reader
.ReadElementContentAsString();
155 public int CheckIn(Workspace workspace
, string[] serverItems
, string comment
)
157 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "CheckIn");
159 msg
.Body
.WriteElementString("workspaceName", workspace
.Name
);
160 msg
.Body
.WriteElementString("ownerName", workspace
.OwnerName
);
162 msg
.Body
.WriteStartElement("serverItems");
163 foreach (string serverItem
in serverItems
)
165 msg
.Body
.WriteElementString("string", serverItem
);
167 msg
.Body
.WriteEndElement();
169 // write info subtree
170 msg
.Body
.WriteStartElement("info");
171 msg
.Body
.WriteAttributeString("date", DateTime
.Now
.ToString("s"));
172 msg
.Body
.WriteAttributeString("cset", "0");
173 msg
.Body
.WriteAttributeString("owner", workspace
.OwnerName
);
174 msg
.Body
.WriteElementString("Comment", comment
);
175 msg
.Body
.WriteElementString("CheckinNote", "");
176 msg
.Body
.WriteElementString("PolicyOverride", "");
177 msg
.Body
.WriteElementString("CheckinOptions", "ValidateCheckinOwner");
178 msg
.Body
.WriteEndElement();
181 using (HttpWebResponse response
= Invoke(msg
))
183 XmlReader results
= msg
.ResponseReader(response
);
184 cset
= Convert
.ToInt32(results
.GetAttribute("cset"));
186 List
<Failure
> failures
= new List
<Failure
>();
188 //TODO: read <UndoneServerItems /> and <ImplicitItems />
189 //<CheckInResponse xmlns="http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03"><CheckInResult cset="11486"><UndoneServerItems /><ImplicitItems /></CheckInResult><failures /></CheckInResponse>
190 while (results
.Read())
192 if (results
.NodeType
== XmlNodeType
.Element
)
194 switch (results
.Name
)
197 failures
.Add(Failure
.FromXml(this, results
));
203 foreach (Failure failure
in failures
)
205 versionControlServer
.OnNonFatalError(workspace
, failure
);
212 public void CreateTeamProjectFolder(TeamProjectFolderOptions teamProjectOptions
)
214 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "CreateTeamProjectFolder");
215 teamProjectOptions
.ToXml(msg
.Body
, "");
216 HttpWebResponse response
= Invoke(msg
);
220 public Workspace
CreateWorkspace(Workspace workspace
)
222 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "CreateWorkspace");
223 workspace
.ToXml(msg
.Body
, "workspace");
225 Workspace newWorkspace
;
226 using (HttpWebResponse response
= Invoke(msg
))
228 XmlReader results
= msg
.ResponseReader(response
);
229 newWorkspace
= Workspace
.FromXml(this, results
);
235 [System
.Web
.Services
.Protocols
.SoapDocumentMethodAttribute("http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03/DeleteWorkspace", RequestNamespace
="http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03", ResponseNamespace
="http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03", ParameterStyle
=System
.Web
.Services
.Protocols
.SoapParameterStyle
.Wrapped
, Use
=System
.Web
.Services
.Description
.SoapBindingUse
.Literal
)]
236 public void DeleteWorkspace(string workspaceName
, string ownerName
)
238 this.Invoke("DeleteWorkspace", new object[] { workspaceName, ownerName}
);
241 public LabelResult
[] LabelItem(Workspace workspace
, VersionControlLabel label
,
242 LabelItemSpec
[] labelSpecs
, LabelChildOption children
)
244 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "LabelItem");
246 msg
.Body
.WriteElementString("workspaceName", workspace
.Name
);
247 msg
.Body
.WriteElementString("workspaceOwner", workspace
.OwnerName
);
248 label
.ToXml(msg
.Body
, "label");
250 msg
.Body
.WriteStartElement("labelSpecs");
251 foreach (LabelItemSpec labelSpec
in labelSpecs
)
253 labelSpec
.ToXml(msg
.Body
, "LabelItemSpec");
255 msg
.Body
.WriteEndElement();
257 msg
.Body
.WriteElementString("children", children
.ToString());
259 List
<LabelResult
> labelResults
= new List
<LabelResult
>();
260 List
<Failure
> faillist
= new List
<Failure
>();
262 using (HttpWebResponse response
= Invoke(msg
))
264 XmlReader results
= msg
.ResponseReader(response
);
266 while (results
.Read())
268 if (results
.NodeType
== XmlNodeType
.Element
)
270 switch (results
.Name
)
273 labelResults
.Add(LabelResult
.FromXml(this, results
));
276 faillist
.Add(Failure
.FromXml(this, results
));
283 foreach (Failure failure
in faillist
)
285 versionControlServer
.OnNonFatalError(workspace
, failure
);
288 return labelResults
.ToArray();
291 public LabelResult
[] UnlabelItem(Workspace workspace
, string labelName
,
292 string labelScope
, ItemSpec
[] itemSpecs
,
295 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "UnlabelItem");
297 msg
.Body
.WriteElementString("workspaceName", workspace
.Name
);
298 msg
.Body
.WriteElementString("workspaceOwner", workspace
.OwnerName
);
299 msg
.Body
.WriteElementString("labelName", labelName
);
301 if (!String
.IsNullOrEmpty(labelScope
))
302 msg
.Body
.WriteElementString("labelScope", labelScope
);
304 msg
.Body
.WriteStartElement("items");
305 foreach (ItemSpec itemSpec
in itemSpecs
)
307 itemSpec
.ToXml(msg
.Body
, "ItemSpec");
309 msg
.Body
.WriteEndElement();
311 version
.ToXml(msg
.Body
, "version");
313 List
<LabelResult
> labelResults
= new List
<LabelResult
>();
314 List
<Failure
> faillist
= new List
<Failure
>();
316 using (HttpWebResponse response
= Invoke(msg
))
318 XmlReader results
= msg
.ResponseReader(response
);
320 while (results
.Read())
322 if (results
.NodeType
== XmlNodeType
.Element
)
324 switch (results
.Name
)
327 labelResults
.Add(LabelResult
.FromXml(this, results
));
330 faillist
.Add(Failure
.FromXml(this, results
));
337 foreach (Failure failure
in faillist
)
339 versionControlServer
.OnNonFatalError(workspace
, failure
);
342 return labelResults
.ToArray();
345 public GetOperation
[] Get(string workspaceName
, string ownerName
,
346 GetRequest
[] requests
, bool force
, bool noGet
) {
348 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "Get");
349 msg
.Body
.WriteElementString("workspaceName", workspaceName
);
350 msg
.Body
.WriteElementString("ownerName", ownerName
);
352 msg
.Body
.WriteStartElement("requests");
353 foreach (GetRequest request
in requests
)
355 request
.ToXml(msg
.Body
, "");
357 msg
.Body
.WriteEndElement();
359 msg
.Body
.WriteElementString("force", force
.ToString().ToLower());
360 msg
.Body
.WriteElementString("noGet", noGet
.ToString().ToLower());
362 List
<GetOperation
> operations
= new List
<GetOperation
>();
363 using (HttpWebResponse response
= Invoke(msg
))
365 XmlReader results
= msg
.ResponseReader(response
);
367 while (results
.Read())
369 if (results
.NodeType
== XmlNodeType
.Element
&&
370 results
.Name
== "GetOperation")
371 operations
.Add(GetOperation
.FromXml(ItemUrl
, results
));
375 return operations
.ToArray();
378 public RepositoryProperties
GetRepositoryProperties()
380 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "GetRepositoryProperties");
381 RepositoryProperties properties
;
382 using (HttpWebResponse response
= Invoke(msg
))
384 XmlReader results
= msg
.ResponseReader(response
);
385 properties
= RepositoryProperties
.FromXml(this, results
);
391 public GetOperation
[] PendChanges(Workspace workspace
, ChangeRequest
[] changes
)
393 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "PendChanges");
395 msg
.Body
.WriteElementString("workspaceName", workspace
.Name
);
396 msg
.Body
.WriteElementString("ownerName", workspace
.OwnerName
);
397 msg
.Body
.WriteStartElement("changes");
398 foreach (ChangeRequest change
in changes
)
400 change
.ToXml(msg
.Body
, "");
402 msg
.Body
.WriteEndElement();
404 List
<GetOperation
> operations
= new List
<GetOperation
>();
405 List
<Failure
> faillist
= new List
<Failure
>();
407 using (HttpWebResponse response
= Invoke(msg
))
409 XmlReader results
= msg
.ResponseReader(response
);
411 while (results
.Read())
413 if (results
.NodeType
== XmlNodeType
.Element
)
415 switch (results
.Name
)
418 operations
.Add(GetOperation
.FromXml(ItemUrl
, results
));
421 faillist
.Add(Failure
.FromXml(this, results
));
428 foreach (Failure failure
in faillist
)
430 versionControlServer
.OnNonFatalError(workspace
, failure
);
433 return operations
.ToArray();
436 public Annotation
[] QueryAnnotation(string annotationName
, string annotatedItem
, int version
)
438 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryAnnotation");
440 msg
.Body
.WriteElementString("annotationName", annotationName
);
441 msg
.Body
.WriteElementString("annotatedItem", annotatedItem
);
442 msg
.Body
.WriteElementString("version", Convert
.ToString(version
));
444 List
<Annotation
> labels
= new List
<Annotation
>();
445 using (HttpWebResponse response
= Invoke(msg
))
447 XmlReader results
= msg
.ResponseReader(response
);
449 while (results
.Read())
451 if (results
.NodeType
== XmlNodeType
.Element
&&
452 results
.Name
== "Annotation")
453 labels
.Add(Annotation
.FromXml(this, results
));
457 return labels
.ToArray();
460 public Changeset
QueryChangeset(int changesetId
, bool includeChanges
,
461 bool generateDownloadUrls
)
463 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryChangeset");
465 msg
.Body
.WriteElementString("changesetId", Convert
.ToString(changesetId
));
466 msg
.Body
.WriteElementString("includeChanges", Convert
.ToString(includeChanges
).ToLower());
467 msg
.Body
.WriteElementString("generateDownloadUrls", Convert
.ToString(generateDownloadUrls
).ToLower());
469 Changeset changeset
= null;
471 using (HttpWebResponse response
= Invoke(msg
))
473 XmlReader results
= msg
.ResponseReader(response
);
474 changeset
= Changeset
.FromXml(this, results
);
480 public Changeset
[] QueryHistory (string workspaceName
, string workspaceOwner
,
481 ItemSpec itemSpec
, VersionSpec version
,
482 string user
, VersionSpec versionFrom
,
483 VersionSpec versionTo
, int maxCount
,
484 bool includeFiles
, bool slotMode
,
485 bool generateDownloadUrls
)
487 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryHistory");
489 if (!String
.IsNullOrEmpty(workspaceName
)) msg
.Body
.WriteElementString("workspaceName", workspaceName
);
490 if (!String
.IsNullOrEmpty(workspaceOwner
)) msg
.Body
.WriteElementString("workspaceOwner", workspaceOwner
);
492 itemSpec
.ToXml(msg
.Body
, "itemSpec");
493 if (version
!= null) version
.ToXml(msg
.Body
, "versionItem");
494 if (versionFrom
!= null) versionFrom
.ToXml(msg
.Body
, "versionFrom");
495 if (versionTo
!= null) versionTo
.ToXml(msg
.Body
, "versionTo");
497 if (!String
.IsNullOrEmpty(user
)) msg
.Body
.WriteElementString("user", user
);
498 msg
.Body
.WriteElementString("maxCount", Convert
.ToString(maxCount
));
499 msg
.Body
.WriteElementString("includeFiles", Convert
.ToString(includeFiles
).ToLower());
500 msg
.Body
.WriteElementString("generateDownloadUrls", Convert
.ToString(generateDownloadUrls
).ToLower());
501 msg
.Body
.WriteElementString("slotMode", Convert
.ToString(slotMode
).ToLower());
503 List
<Changeset
> changes
= new List
<Changeset
>();
504 using (HttpWebResponse response
= Invoke(msg
))
506 XmlReader results
= msg
.ResponseReader(response
);
508 while (results
.Read())
510 if (results
.NodeType
== XmlNodeType
.Element
&&
511 results
.Name
== "Changeset")
512 changes
.Add(Changeset
.FromXml(this, results
));
516 return changes
.ToArray();
519 public ItemSet
QueryItems(string workspaceName
, string workspaceOwner
,
520 ItemSpec
[] itemSpecs
, VersionSpec versionSpec
,
521 DeletedState deletedState
, ItemType itemType
,
522 bool generateDownloadUrls
)
524 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryItems");
526 if (!String
.IsNullOrEmpty(workspaceName
)) msg
.Body
.WriteElementString("workspaceName", workspaceName
);
527 if (!String
.IsNullOrEmpty(workspaceOwner
)) msg
.Body
.WriteElementString("workspaceOwner", workspaceOwner
);
528 msg
.Body
.WriteStartElement("items");
529 foreach (ItemSpec itemSpec
in itemSpecs
)
530 itemSpec
.ToXml(msg
.Body
, "ItemSpec");
531 msg
.Body
.WriteEndElement();
533 versionSpec
.ToXml(msg
.Body
, "version");
535 msg
.Body
.WriteElementString("deletedState",
536 deletedState
.ToString());
537 msg
.Body
.WriteElementString("itemType",
538 itemType
.ToString());
539 msg
.Body
.WriteElementString("generateDownloadUrls",
540 generateDownloadUrls
.ToString().ToLower());
543 using (HttpWebResponse response
= Invoke(msg
))
545 XmlReader results
= msg
.ResponseReader(response
);
546 itemSet
= ItemSet
.FromXml(this, results
);
552 public ExtendedItem
[][] QueryItemsExtended(string workspaceName
, string workspaceOwner
,
553 ItemSpec
[] itemSpecs
,
554 DeletedState deletedState
, ItemType itemType
)
556 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryItemsExtended");
558 if (!String
.IsNullOrEmpty(workspaceName
)) msg
.Body
.WriteElementString("workspaceName", workspaceName
);
559 if (!String
.IsNullOrEmpty(workspaceOwner
)) msg
.Body
.WriteElementString("workspaceOwner", workspaceOwner
);
561 msg
.Body
.WriteStartElement("items");
562 foreach (ItemSpec itemSpec
in itemSpecs
)
564 itemSpec
.ToXml(msg
.Body
, "ItemSpec");
566 msg
.Body
.WriteEndElement();
568 msg
.Body
.WriteElementString("deletedState",
569 deletedState
.ToString());
570 msg
.Body
.WriteElementString("itemType",
571 itemType
.ToString());
573 List
< ExtendedItem
[] > listOfItemArrays
= new List
<ExtendedItem
[] >();
574 using (HttpWebResponse response
= Invoke(msg
))
576 XmlReader results
= msg
.ResponseReader(response
);
577 while (results
.Read())
579 // Console.WriteLine(results.Name + ":" + results.NodeType);
580 if (results
.NodeType
== XmlNodeType
.Element
&&
581 results
.Name
== "ArrayOfExtendedItem")
583 List
<ExtendedItem
> items
= new List
<ExtendedItem
>();
584 while (results
.Read())
586 //Console.WriteLine(" " + results.Name + ":" + results.NodeType);
587 if (results
.NodeType
== XmlNodeType
.EndElement
&&
588 results
.Name
== "ArrayOfExtendedItem") break;
589 if (results
.NodeType
== XmlNodeType
.Element
&&
590 results
.Name
== "ExtendedItem")
591 items
.Add(ExtendedItem
.FromXml(this, results
));
593 listOfItemArrays
.Add(items
.ToArray());
598 return listOfItemArrays
.ToArray();
601 public VersionControlLabel
[] QueryLabels(string workspaceName
, string workspaceOwner
,
602 string labelName
, string labelScope
,
603 string owner
, string filterItem
,
604 VersionSpec versionFilterItem
,
605 bool includeItems
, bool generateDownloadUrls
)
607 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryLabels");
609 if (!String
.IsNullOrEmpty(workspaceName
)) msg
.Body
.WriteElementString("workspaceName", workspaceName
);
610 if (!String
.IsNullOrEmpty(workspaceOwner
)) msg
.Body
.WriteElementString("workspaceOwner", workspaceOwner
);
611 if (!String
.IsNullOrEmpty(labelName
)) msg
.Body
.WriteElementString("labelName", labelName
);
612 if (!String
.IsNullOrEmpty(labelScope
)) msg
.Body
.WriteElementString("labelScope", labelScope
);
613 if (!String
.IsNullOrEmpty(owner
)) msg
.Body
.WriteElementString("owner", owner
);
614 if (!String
.IsNullOrEmpty(filterItem
)) msg
.Body
.WriteElementString("filterItem", filterItem
);
616 if (null != versionFilterItem
) versionFilterItem
.ToXml(msg
.Body
, "versionFilterItem");
617 msg
.Body
.WriteElementString("includeItems", includeItems
.ToString().ToLower());
618 msg
.Body
.WriteElementString("generateDownloadUrls", generateDownloadUrls
.ToString().ToLower());
620 List
<VersionControlLabel
> labels
= new List
<VersionControlLabel
>();
621 using (HttpWebResponse response
= Invoke(msg
))
623 XmlReader results
= msg
.ResponseReader(response
);
625 while (results
.Read())
627 if (results
.NodeType
== XmlNodeType
.Element
&&
628 results
.Name
== "VersionControlLabel")
629 labels
.Add(VersionControlLabel
.FromXml(this, results
));
633 return labels
.ToArray();
636 public Item
[] QueryItemsById(int[] ids
, int changeSet
,
637 bool generateDownloadUrls
)
639 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryItemsById");
641 msg
.Body
.WriteStartElement("itemIds");
642 foreach (int id
in ids
)
644 msg
.Body
.WriteElementString("int", Convert
.ToString(id
));
646 msg
.Body
.WriteEndElement();
648 msg
.Body
.WriteElementString("changeSet", Convert
.ToString(changeSet
));
649 msg
.Body
.WriteElementString("generateDownloadUrls",
650 generateDownloadUrls
.ToString().ToLower());
652 List
<Item
> items
= new List
<Item
>();
653 using (HttpWebResponse response
= Invoke(msg
))
655 XmlReader results
= msg
.ResponseReader(response
);
657 while (results
.Read())
659 if (results
.NodeType
== XmlNodeType
.Element
&&
660 results
.Name
== "Item")
661 items
.Add(Item
.FromXml(this, results
));
665 return items
.ToArray();
668 public ItemSecurity
[] QueryItemPermissions(string[] identityNames
, string[] items
,
669 RecursionType recursion
)
671 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryItemPermissions");
673 msg
.Body
.WriteStartElement("itemSpecs");
674 foreach (string item
in items
)
676 ItemSpec spec
= new ItemSpec(item
, recursion
);
677 spec
.ToXml(msg
.Body
, "ItemSpec");
679 msg
.Body
.WriteEndElement();
681 List
<ItemSecurity
> itemSecurities
= new List
<ItemSecurity
>();
682 using (HttpWebResponse response
= Invoke(msg
))
684 XmlReader results
= msg
.ResponseReader(response
);
686 while (results
.Read())
688 if (results
.NodeType
== XmlNodeType
.Element
&&
689 results
.Name
== "ItemSecurity")
690 itemSecurities
.Add(ItemSecurity
.FromXml(this, results
));
694 return itemSecurities
.ToArray();
697 public PendingChange
[] QueryPendingSets(string localWorkspaceName
, string localWorkspaceOwner
,
698 string queryWorkspaceName
, string ownerName
,
699 ItemSpec
[] itemSpecs
, bool generateDownloadUrls
,
700 out Failure
[] failures
)
702 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryPendingSets");
703 msg
.Body
.WriteElementString("localWorkspaceName", localWorkspaceName
);
704 msg
.Body
.WriteElementString("localWorkspaceOwner", localWorkspaceOwner
);
705 msg
.Body
.WriteElementString("queryWorkspaceName", queryWorkspaceName
);
706 msg
.Body
.WriteElementString("ownerName", ownerName
);
708 msg
.Body
.WriteStartElement("itemSpecs");
709 foreach (ItemSpec item
in itemSpecs
)
711 item
.ToXml(msg
.Body
, "ItemSpec");
713 msg
.Body
.WriteEndElement();
715 msg
.Body
.WriteElementString("generateDownloadUrls",
716 generateDownloadUrls
.ToString().ToLower());
718 List
<PendingChange
> changes
= new List
<PendingChange
>();
719 List
<Failure
> faillist
= new List
<Failure
>();
721 using (HttpWebResponse response
= Invoke(msg
))
723 XmlReader results
= msg
.ResponseReader(response
);
725 while (results
.Read())
727 if (results
.NodeType
== XmlNodeType
.Element
)
729 switch (results
.Name
)
731 case "PendingChange":
732 changes
.Add(PendingChange
.FromXml(this, results
));
735 faillist
.Add(Failure
.FromXml(this, results
));
742 failures
= faillist
.ToArray();
743 return changes
.ToArray();
746 public Workspace
QueryWorkspace(string workspaceName
, string ownerName
)
748 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryWorkspace");
749 msg
.Body
.WriteElementString("workspaceName", workspaceName
);
750 msg
.Body
.WriteElementString("ownerName", ownerName
);
753 using (HttpWebResponse response
= Invoke(msg
))
755 XmlReader results
= msg
.ResponseReader(response
);
756 workspace
= Workspace
.FromXml(this, results
);
762 public Workspace
[] QueryWorkspaces(string workspaceName
, string ownerName
,
765 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "QueryWorkspaces");
766 if (!String
.IsNullOrEmpty(workspaceName
)) msg
.Body
.WriteElementString("workspaceName", workspaceName
);
767 if (!String
.IsNullOrEmpty(ownerName
)) msg
.Body
.WriteElementString("ownerName", ownerName
);
768 if (!String
.IsNullOrEmpty(computer
)) msg
.Body
.WriteElementString("computer", computer
);
770 List
<Workspace
> workspaces
= new List
<Workspace
>();
771 using (HttpWebResponse response
= Invoke(msg
))
773 XmlReader results
= msg
.ResponseReader(response
);
775 while (results
.Read())
777 if (results
.NodeType
== XmlNodeType
.Element
&&
778 results
.Name
== "Workspace")
779 workspaces
.Add(Workspace
.FromXml(this, results
));
784 return workspaces
.ToArray();
787 // <?xml version=_T("1.0") encoding=_T("utf-8")?><soap:Envelope xmlns:xsi=_T("http://www.w3.org/2001/XMLSchema-instance") xmlns=_T("http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03") xmlns:soap=_T("http://www.w3.org/2003/05/soap-envelope")><soap:Body><UpdateWorkspace><oldWorkspaceName>neo</oldWorkspaceName><ownerName>DDI\JREED</ownerName><newWorkspace computer=_T("neo") name=_T("neo") owner=_T("DDI\JREED")><Comment /><LastAccessDate>0001-01-01T00:00:00</LastAccessDate><Folders><WorkingFolder local=_T("C:\MSOCache") item=_T("$/LSG-1.0") /></Folders></newWorkspace></UpdateWorkspace></soap:Body></soap:Envelope
788 public Workspace
UpdateWorkspace(string oldWorkspaceName
, string ownerName
,
789 Workspace newWorkspace
)
791 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "UpdateWorkspace");
792 msg
.Body
.WriteElementString("oldWorkspaceName", oldWorkspaceName
);
793 msg
.Body
.WriteElementString("ownerName", ownerName
);
794 newWorkspace
.ToXml(msg
.Body
, "newWorkspace");
797 using (HttpWebResponse response
= Invoke(msg
))
799 XmlReader results
= msg
.ResponseReader(response
);
800 workspace
= Workspace
.FromXml(this, results
);
806 public GetOperation
[] UndoPendingChanges(string workspaceName
, string ownerName
,
807 ItemSpec
[] itemSpecs
)
809 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "UndoPendingChanges");
810 msg
.Body
.WriteElementString("workspaceName", workspaceName
);
811 msg
.Body
.WriteElementString("ownerName", ownerName
);
813 msg
.Body
.WriteStartElement("items");
814 foreach (ItemSpec item
in itemSpecs
)
816 item
.ToXml(msg
.Body
, "ItemSpec");
818 msg
.Body
.WriteEndElement();
820 List
<GetOperation
> operations
= new List
<GetOperation
>();
821 using (HttpWebResponse response
= Invoke(msg
))
823 XmlReader results
= msg
.ResponseReader(response
);
825 while (results
.Read())
827 if (results
.NodeType
== XmlNodeType
.Element
&&
828 results
.Name
== "GetOperation")
829 operations
.Add(GetOperation
.FromXml(ItemUrl
, results
));
833 return operations
.ToArray();
836 public void UpdateLocalVersion(UpdateLocalVersionQueue queue
)
838 Message msg
= new Message(GetWebRequest (new Uri(Url
)), "UpdateLocalVersion");
839 queue
.ToXml(msg
.Body
, "UpdateLocalVersion");
841 HttpWebResponse response
= Invoke(msg
);
845 public VersionControlServer VersionControlServer
847 get { return versionControlServer; }
850 public string ItemUrl
852 get { return itemUrl; }
859 private static bool runningOnUnix
= true;
863 int p
= (int) Environment
.OSVersion
.Platform
;
864 if (!((p
== 4) || (p
== 128))) runningOnUnix
= false;
867 public static string ToPlatformPath(string path
)
869 if (String
.IsNullOrEmpty(path
)) return path
;
871 // TFS servers corrupt *nix type paths
872 if (!runningOnUnix
) return path
;
873 return path
.Remove(0, 2).Replace('\\', '/');
876 public static string FromPlatformPath(string path
)
878 if (String
.IsNullOrEmpty(path
)) return path
;
880 // TFS servers corrupt *nix type paths
881 if (!runningOnUnix
) return path
;
882 return "C:" + path
.Replace('/', '\\');