public async Task<DFileInfo> UploadFileAsync(DFileInfo destinationFolder, string name, Stream stream, 
            CancellationToken cancellationToken, IProgress<int> progress, long fileSize)
        {
            var dest = (SkydriveFileInfo)destinationFolder;
            var url = sign(string.Format(SkydriveConfig.FilesUrlTemplate, dest.Id) + '/' + name) + "&overwrite=ChooseNewName";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "PUT";
            if (progress != null)
            {
                request.ContentLength = fileSize;
                request.AllowWriteStreamBuffering = false;
            }

            try
            {
                using (var reqStream = await request.GetRequestStreamAsync())
                {
                    await stream.CopyToAsync(reqStream, SkydriveConfig.ChunkSize, cancellationToken, progress, fileSize);
                }

                var webResponse = await request.GetResponseAsync();
                using (var reader = new StreamReader(webResponse.GetResponseStream()))
                {
                    var response = await reader.ReadToEndAsync().ConfigureAwait(false);
                    var metadata = JToken.Parse(response);
                    var newFile = new SkydriveFileInfo() { Parent = destinationFolder };
                    setupFileWithMetadata(newFile, metadata);
                    dest.Contents.Add(newFile.Id, newFile);
                    return newFile;
                }
            }
            catch (WebException e)
            {
                throw parseException(e);
            }
        }
 public async Task NavigatedToAsync(DFileInfo file)
 {
     if (!file.IsDirectory) return;
     var contents = await getFolderContentsMetadata((SkydriveFileInfo)file).ConfigureAwait(false);
     file.Contents.Clear();
     foreach (JToken entry in contents)
     {
         var newFile = new SkydriveFileInfo() { Parent = file };
         setupFileWithMetadata(newFile, entry);
         file.Contents.Add(newFile.Id, newFile);
     }
 }
        public async Task<DFileInfo> CreateFolderAsync(DFileInfo destinationFolder, string name)
        {
            var dest = (SkydriveFileInfo)destinationFolder;
            var url = string.Format(SkydriveConfig.FileInfoUrlTemplate, dest.Id);
            var data = "{ \"name\" : \"" + name + "\" }";
            string response = await dataToServer(data, url, "POST").ConfigureAwait(false);

            var newFolder = new SkydriveFileInfo() { Parent = destinationFolder };
            setupFileWithMetadata(newFolder, JToken.Parse(response));
            return newFolder;
        }
        public async Task LoadInfoAsync()
        {
            var quotaJson = await queryServer(SkydriveConfig.QuotaUrl).ConfigureAwait(false);
            Quota = (long)JToken.Parse(quotaJson)["quota"];
            Name = "SkyDrive";

            _root = new SkydriveFileInfo()
            {
                Id = "me/skydrive",
                Parent = null
            };

            var metadata = await getMetadataFor(_root).ConfigureAwait(false);
            setupFileWithMetadata(_root, metadata);
        }
        private async Task<DFileInfo> fileOperation(SkydriveFileInfo file, SkydriveFileInfo destinationFolder, string operation)
        {
            if (destinationFolder.Contents.ContainsKey(file.Id))
                throw new FileConflictException("File or folder already exists here.");

            var sFile = (SkydriveFileInfo)file;
            var destFolder = (SkydriveFileInfo)destinationFolder;

            var url = string.Format(SkydriveConfig.FileInfoUrlTemplate, sFile.Id);
            var data = new JObject();
            data.Add("destination", destFolder.Id);

            var response = await dataToServer(data.ToString(), url, "MOVE").ConfigureAwait(false);
            var metadata = JToken.Parse(response);

            if (operation == "MOVE")
            {
                sFile.Parent.Contents.Remove(sFile.Id);
                sFile.Parent = destFolder;
                setupFileWithMetadata(sFile, metadata);
                destFolder.Contents.Add(sFile.Id, sFile);
                return sFile;
            }
            else
            {
                var newFile = (SkydriveFileInfo)file.Clone();
                newFile.Parent = destFolder;
                setupFileWithMetadata(newFile, metadata);
                destFolder.Contents.Add(newFile.Id, newFile);
                return newFile;
            }
        }
 private void setupFileWithMetadata(SkydriveFileInfo file, JToken metadata)
 {
     string type = (string)metadata["type"];
     file.IsDirectory = (type == "folder") || (type == "album");
     file.Name = (string)metadata["name"];
     file.Provider = this;
     file.Id = (string)metadata["id"];
     file.Size = (long)(metadata["size"] ?? 0);
 }
 private async Task<JArray> getFolderContentsMetadata(SkydriveFileInfo folder)
 {
     var url = string.Format(SkydriveConfig.FilesUrlTemplate, folder.Id);
     var response = await queryServer(url).ConfigureAwait(false);
     return (JArray)JToken.Parse(response)["data"];
 }
 private async Task<JToken> getMetadataFor(SkydriveFileInfo file)
 {
     // SkyDrive's entry metadata is discussed at:
     // http://msdn.microsoft.com/en-us/library/live/hh243648.aspx
     string url = string.Format(SkydriveConfig.FileInfoUrlTemplate, file.Id);
     string response = await queryServer(url).ConfigureAwait(false);
     return JToken.Parse(response);
 }