prep for online patch
[tfs.git] / class / Microsoft.TeamFoundation.VersionControl.Client / Repository.cs
blob677049d8a303ee190eec1916562da3ad640b002f
1 //
2 // Microsoft.TeamFoundation.VersionControl.Client.Repository
3 //
4 // Authors:
5 // Joel Reed (joelwreed@gmail.com)
6 //
8 //
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:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
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.
29 using System;
30 using System.IO;
31 using System.Collections.Generic;
32 using System.Net;
33 using System.Reflection;
34 using System.Text;
35 using System.Xml;
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);
68 long len = fi.Length;
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));
77 // send byte range
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);
84 WebResponse response;
86 try
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)
95 throw ex;
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 ());
103 response.Close();
104 //readStream.Close();
107 protected HttpWebResponse Invoke (Message message)
109 message.End();
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));
134 return 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();
147 break;
151 response.Close();
152 return msg;
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();
180 int cset = 0;
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)
196 case "Failure":
197 failures.Add(Failure.FromXml(this, results));
198 break;
203 foreach (Failure failure in failures)
205 versionControlServer.OnNonFatalError(workspace, failure);
209 return cset;
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);
217 response.Close();
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);
232 return newWorkspace;
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)
272 case "LabelResult":
273 labelResults.Add(LabelResult.FromXml(this, results));
274 break;
275 case "Failure":
276 faillist.Add(Failure.FromXml(this, results));
277 break;
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,
293 VersionSpec version)
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)
326 case "LabelResult":
327 labelResults.Add(LabelResult.FromXml(this, results));
328 break;
329 case "Failure":
330 faillist.Add(Failure.FromXml(this, results));
331 break;
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);
388 return properties;
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)
417 case "GetOperation":
418 operations.Add(GetOperation.FromXml(ItemUrl, results));
419 break;
420 case "Failure":
421 faillist.Add(Failure.FromXml(this, results));
422 break;
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);
477 return changeset;
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());
542 ItemSet itemSet;
543 using (HttpWebResponse response = Invoke(msg))
545 XmlReader results = msg.ResponseReader(response);
546 itemSet = ItemSet.FromXml(this, results);
549 return itemSet;
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));
733 break;
734 case "Failure":
735 faillist.Add(Failure.FromXml(this, results));
736 break;
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);
752 Workspace workspace;
753 using (HttpWebResponse response = Invoke(msg))
755 XmlReader results = msg.ResponseReader(response);
756 workspace = Workspace.FromXml(this, results);
759 return workspace;
762 public Workspace[] QueryWorkspaces(string workspaceName, string ownerName,
763 string computer)
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));
783 workspaces.Sort();
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");
796 Workspace workspace;
797 using (HttpWebResponse response = Invoke(msg))
799 XmlReader results = msg.ResponseReader(response);
800 workspace = Workspace.FromXml(this, results);
803 return workspace;
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);
842 response.Close();
845 public VersionControlServer VersionControlServer
847 get { return versionControlServer; }
850 public string ItemUrl
852 get { return itemUrl; }
857 class TfsPath
859 private static bool runningOnUnix = true;
861 static TfsPath()
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('/', '\\');