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); }