private static ChangesResult GetChanges(OneDriveModel.OneDriveItemCollection items, Dictionary <string, OneDriveModel.ItemInfo> ids, string rootUri) { ChangesResult result = new ChangesResult(); foreach (var item in items.value) { ids[item.id] = new OneDriveModel.ItemInfo { name = item.name, parentId = item.parentReference.id }; var path = GetPath(ids, item); if (item.deleted != null) { result.DeletionChanges.Add(new OneDriveModel.OneDriveChange { Path = path, IsDeleted = true }); } else { var change = new OneDriveModel.OneDriveChange { ContentUri = string.Format(CultureInfo.InvariantCulture, "{0}/items/{1}", rootUri, item.id), Path = path, IsFile = item.file != null, LastModifiedUtc = item.lastModifiedDateTime.ToUniversalTime() }; if (change.IsFile) { result.FileChanges.Add(change); } else { result.DirectoryChanges.Add(change); } } } return(result); }
private async Task <ChangesResult> GetChanges(string changeset, string accessToken, string requestUri, string cursor) { string rootUri = GetOneDriveRootUri(requestUri); requestUri = string.Format(CultureInfo.InvariantCulture, "{0}/{1}", await GetItemUri(accessToken, requestUri, rootUri), "view.changes"); ChangesResult result = new ChangesResult(); IDeploymentStatusFile statusFile = _status.Open(changeset); var loop = 0; using (var client = CreateHttpClient(accessToken)) { var next = cursor; var ids = new Dictionary <string, OneDriveModel.ItemInfo>(); Dictionary <string, object> changes = null; // CORE TODO I can't quite tell what's going on here so failing for now. //var serializer = new JavaScriptSerializer(); do { var uri = requestUri; if (!string.IsNullOrWhiteSpace(next)) { uri = string.Format(CultureInfo.InvariantCulture, "{0}?token={1}", requestUri, next); } ++loop; statusFile.UpdateProgress(string.Format(CultureInfo.CurrentCulture, "Getting delta changes batch #{0}", loop)); using (_tracer.Step("Getting delta changes batch #{0}", loop)) { using (var response = await client.GetAsync(uri)) { changes = await ProcessResponse <Dictionary <string, object> >("GetChanges", response); } } if (changes.ContainsKey("@changes.resync")) { if (string.IsNullOrEmpty(next)) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.OneDriveUnableToSync, changes["@changes.resync"])); } // resync loop = 0; next = null; changes["@changes.hasMoreChanges"] = true; result = new ChangesResult(); continue; } // CORE TODO I can't quite tell what's going on here so failing for now. //var items = serializer.ConvertToType<OneDriveModel.OneDriveItemCollection>(changes); OneDriveModel.OneDriveItemCollection items = null; // changes if (items != null && items.value != null && items.value.Count > 0) { var subResults = GetChanges(items, ids, rootUri); result.DeletionChanges.AddRange(subResults.DeletionChanges); result.DirectoryChanges.AddRange(subResults.DirectoryChanges); result.FileChanges.AddRange(subResults.FileChanges); } // set next token next = (string)changes["@changes.token"]; } while ((bool)changes["@changes.hasMoreChanges"]); result.Cursor = next; return(result); } }