예제 #1
0
        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());
        }
예제 #2
0
/*        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());
        }
예제 #3
0
        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());
        }