private ComplitionPromise <BactoryMasterLoginResponse> MasterLogin(string authenticationId, string authenticationMasterKey) { ComplitionDeferred <BactoryMasterLoginResponse> deferred = new ComplitionDeferred <BactoryMasterLoginResponse>(); string url = "http://api.backtory.com/auth/login"; try { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url)); webRequest.KeepAlive = true; webRequest.Method = "POST"; webRequest.Headers.Add("X-Backtory-Authentication-Id", authenticationId); webRequest.Headers.Add("X-Backtory-Authentication-Key", authenticationMasterKey); webRequest.ContentLength = 0; using (WebResponse webResponse = webRequest.GetResponse()) { using (System.IO.Stream responseStream = webResponse.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { BactoryMasterLoginResponse bactoryMasterLoginResponse = JsonConvert.DeserializeObject <BactoryMasterLoginResponse>(reader.ReadToEnd()); deferred.Resolve(bactoryMasterLoginResponse); } } } } catch (Exception) { deferred.Reject(); } return(deferred.Promise()); }
/* private string GetServerStoragePath(string localPath) * { * return Base64Decode(Path.GetFileName(localPath)); * }*/ public ComplitionPromise <string> LoadFromStorage(Uri uri, Action <DownloadProgress> progress) { ComplitionDeferred <string> deferred = new ComplitionDeferred <string>(); IDispatcher dispatcher = GameDispatcher.Dispatcher; string localFileName = GetLocalStoragePath(uri.ToString()); string localPath = Path.GetDirectoryName(localFileName); StorageSavedData savedData = ServiceLocator.Resolve <IStorageService>().ResolveData <StorageSavedData>() ?? new StorageSavedData(); if (savedData.Cache.ContainsKey(uri.ToString())) { savedData.Cache.Remove(uri.ToString()); } ServiceLocator.Resolve <IStorageService>().UpdateData(savedData); ThreadPool.QueueUserWorkItem(state => { try { if (!Directory.Exists(localPath)) { Directory.CreateDirectory(localPath); } using (FileStream file = File.Create(localFileName)) { WebRequest request = WebRequest.Create(uri); request.Method = "GET"; using (WebResponse webResponse = request.GetResponse()) { using (System.IO.Stream responseStream = webResponse.GetResponseStream()) { int bytesRead; byte[] buffer = new byte[2048]; long wroteSize = 0; while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) != 0) { file.Write(buffer, 0, bytesRead); wroteSize += bytesRead; long dispatchWroteSize = wroteSize; long dispatchContentLength = webResponse.ContentLength; dispatcher.Dispach(() => { progress(new DownloadProgress(dispatchContentLength, dispatchWroteSize)); }); } } } } dispatcher.Dispach(() => { StorageSavedData storageSavedData = ServiceLocator.Resolve <IStorageService>().ResolveData <StorageSavedData>() ?? new StorageSavedData(); storageSavedData.Cache[uri.ToString()] = localFileName; ServiceLocator.Resolve <IStorageService>().UpdateData(storageSavedData); deferred.Resolve(localFileName); }); } catch (Exception e) { try { File.Delete(localFileName); } catch (Exception) { // ignored } dispatcher.Dispach(() => { Debug.LogException(e); deferred.Reject(); }); } }); return(deferred.Promise()); }
public ComplitionPromise <string[]> SendFilesToStorage(StorageFile[] storageFiles, Action <float> progress) { ComplitionDeferred <string[]> deferred = new ComplitionDeferred <string[]>(); if (storageFiles.Length == 0) { deferred.Resolve(new string[0]); return(deferred.Promise()); } string boundary = "----WebKitFormBoundaryS3pOJgmMVoMmQZ9Y"; MultiPartFormDataStream dataStream = new MultiPartFormDataStream(boundary, storageFiles.Select((file, i) => { MultiPartParameter[] multiPartParameters = new MultiPartParameter[4]; multiPartParameters[0] = new StreamMultiPartParameter(boundary, string.Format("fileItems[{0}].fileToUpload", i), file.FileName, file.Stream); multiPartParameters[1] = new StringMultiPartParameter(boundary, string.Format("fileItems[{0}].path", i), file.Path); multiPartParameters[2] = new StringMultiPartParameter(boundary, string.Format("fileItems[{0}].replacing", i), "true"); multiPartParameters[3] = new StringMultiPartParameter(boundary, string.Format("fileItems[{0}].extract", i), "false"); return(multiPartParameters); }).SelectMany(parameters => parameters).ToArray()); /* using (FileStream test = File.Create(@"d:\1.log")) * { * dataStream.CopyTo(test); * * } * return null;*/ string authenticationId = InfoResolver.Resolve <BacktoryInfo>().AuthenticationId; string authenticationMasterKey = EditorInfoResolver.Resolve <BacktoryEditorInfo>().AuthenticationMasterKey; string storageId = EditorInfoResolver.Resolve <BacktoryEditorInfo>().StorageId; string url = "https://storage.backtory.com/files"; IDispatcher dispatcher = EditorDispatcher.Dispatcher; ThreadPool.QueueUserWorkItem(state => { MasterLogin(authenticationId, authenticationMasterKey).Then(response => { try { string authorization = string.Format("{0} {1}", response.TokenType, response.AccessToken); HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url)); webRequest.KeepAlive = true; webRequest.Method = "POST"; webRequest.ContentType = "multipart/form-data; boundary=" + boundary; webRequest.Headers.Add("x-backtory-storage-id", storageId); webRequest.Headers.Add("Authorization", authorization); webRequest.ContentLength = dataStream.Length; using (System.IO.Stream requestStream = webRequest.GetRequestStream()) { int bytesRead; byte[] buffer = new byte[2048]; long wroteSize = 0; while ((bytesRead = dataStream.Read(buffer, 0, buffer.Length)) != 0) { requestStream.Write(buffer, 0, bytesRead); wroteSize += bytesRead; float normalPosition = (float)wroteSize / dataStream.Length; dispatcher.Dispach(() => { progress(normalPosition); }); } using (WebResponse webResponse = webRequest.GetResponse()) { using (System.IO.Stream responseStream = webResponse.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { string readToEnd = reader.ReadToEnd(); BacktoryStorageResoponce backtoryStorageResoponce = JsonConvert.DeserializeObject <BacktoryStorageResoponce>(readToEnd); foreach (StorageFile storageFile in storageFiles) { storageFile.Stream.Close(); } dispatcher.Dispach(() => deferred.Resolve(backtoryStorageResoponce.SavedFilesUrls)); } } } } } catch (Exception e) { foreach (StorageFile storageFile in storageFiles) { storageFile.Stream.Close(); } Debug.LogException(e); dispatcher.Dispach(() => deferred.Reject()); } }, () => { foreach (StorageFile storageFile in storageFiles) { storageFile.Stream.Close(); } dispatcher.Dispach(() => deferred.Reject()); }); }); return(deferred.Promise()); }