Exemplo n.º 1
0
        private async void LoadFileAsync(string fileID, AsyncContext context)
        {
            try
            {
                LiveConnectClient skyDrive = await _liveLogin.Login();

                if (skyDrive == null)
                {
                    context.Error = new Exception("Login Required");
                    return;
                }

                LiveOperationResult fileData = await skyDrive.GetAsync(fileID);

                string path = FixSkyDriveUrl((string)fileData.Result["source"]);

                LiveDownloadOperationResult downloadResult = await skyDrive.DownloadAsync(path);

                var buffer       = new byte[4096];
                var memoryStream = new MemoryStream();
                StreamUtils.Copy(downloadResult.Stream, memoryStream, buffer);
                memoryStream.Position = 0L;
                context.Stream        = memoryStream;
            }
            catch (WebException e)
            {
                if (e.Status == WebExceptionStatus.RequestCanceled)
                {
                    context.Error = new RestartException(e.Message, e);
                    return;
                }
                context.Error = e;
            }
            catch (TaskCanceledException e)
            {
                context.Error = new RestartException(e.Message, e);
            }
            catch (Exception e)
            {
                context.Error = e;
            }
            finally
            {
                context.WaitHandle.Set();
            }
        }
Exemplo n.º 2
0
        public async Task <string> UploadAsync(BookModel book, CancellationToken cancellationToken)
        {
            LiveConnectClient skyDrive;

            try
            {
                skyDrive = await _liveLogin.Login();

                if (skyDrive == null)
                {
                    return(null);
                }

                var catalog = _catalogRepository.GetAll().Single(c => c.Type == CatalogType.SkyDrive);
                catalog.AccessDenied = false;
                _catalogRepository.Save(catalog);
            }
            catch (LiveAuthException e)
            {
                if (e.ErrorCode != "access_denied")
                {
                    throw;
                }
                return(null);
            }
            catch (Exception e)
            {
                throw new FileUploadException(e.Message, e);
            }

            cancellationToken.ThrowIfCancellationRequested();

            try
            {
                var     root   = (List <dynamic>)(await skyDrive.GetAsync("me/skydrive/files")).Result["data"];
                dynamic folder = root.SingleOrDefault(f => f.type == "folder" && f.name == SkyDriveFolder);
                string  folderId;
                if (folder != null)
                {
                    folderId = folder.id;
                }
                else
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    var folderData = new Dictionary <string, object> {
                        { "name", SkyDriveFolder }
                    };
                    var createFolderData = await skyDrive.PostAsync("me/skydrive", folderData);

                    var createFolderResult = createFolderData.Result;
                    folderId = (string)createFolderResult["id"];
                }

                cancellationToken.ThrowIfCancellationRequested();

                string fileId;

                var     fileName = GetFileName(book);
                var     files    = (List <dynamic>)(await skyDrive.GetAsync(folderId + "/files")).Result["data"];
                dynamic file     = files.SingleOrDefault(f => f.type == "file" && f.name == fileName);
                if (file != null)
                {
                    fileId = file.id;
                }
                else
                {
                    using (Stream fileStream = _bookTool.GetOriginalBook(book))
                    {
                        dynamic fileUploadResult = (await skyDrive.UploadAsync(folderId, GetFileName(book), fileStream,
                                                                               OverwriteOption.DoNotOverwrite, cancellationToken, null)).Result;
                        fileId = fileUploadResult.id;
                    }
                }

                cancellationToken.ThrowIfCancellationRequested();

                LiveOperationResult operationResult = await skyDrive.GetAsync(fileId + "/shared_read_link");

                dynamic result = operationResult.Result;



                return(GetDirectLink(result.link));
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new FileUploadException(e.Message, e);
            }
        }
        private async Task <IEnumerable <CatalogItemModel> > ReadAsync(string path)
        {
            List <CatalogItemModel> items = null;

            try
            {
                if (_skyDrive == null)
                {
                    _skyDrive = await _liveLogin.Login();
                }

                if (_skyDrive == null)
                {
                    throw new CatalogAuthorizationException(CatalogType.SkyDrive, path);
                }

                ChangeAccessToCatalog();

                _cancelSource = new CancellationTokenSource();
                var e = await _skyDrive.GetAsync(path, _cancelSource.Token);

                var skyDriveItems = new List <SkyDriveItem>();
                var data          = (List <object>)e.Result["data"];
                foreach (IDictionary <string, object> content in data)
                {
                    var          type = (string)content["type"];
                    SkyDriveItem item;
                    if (type == "folder")
                    {
                        item = new SkyDriveFolder
                        {
                            Id   = (string)content["id"],
                            Name = (string)content["name"]
                        };
                    }
                    else if (type == "file")
                    {
                        var name = (string)content["name"];

                        if (string.IsNullOrEmpty(_downloadController.GetBookType(name)))
                        {
                            continue;
                        }

                        item = new SkyDriveFile
                        {
                            Id   = (string)content["id"],
                            Name = name
                        };
                    }
                    else
                    {
                        continue;
                    }

                    skyDriveItems.Add(item);
                }

                var folders = skyDriveItems
                              .OfType <SkyDriveFolder>()
                              .Select(i => new CatalogItemModel
                {
                    Title   = i.Name,
                    OpdsUrl = i.Id
                });

                var files = skyDriveItems
                            .OfType <SkyDriveFile>()
                            .Select(file => new CatalogBookItemModel
                {
                    Title   = file.Name,
                    OpdsUrl = file.Id,
                    Links   = new List <BookDownloadLinkModel>
                    {
                        new BookDownloadLinkModel
                        {
                            Url  = file.Id,
                            Type = file.Name
                        }
                    },
                    Id = file.Id
                });

                items = Enumerable.Union(folders, files).ToList();
            }
            catch (OperationCanceledException)
            {
            }
            catch (LiveAuthException e)
            {
                if (e.ErrorCode == "access_denied")
                {
                    throw new CatalogAuthorizationException(e.Message, e, CatalogType.SkyDrive);
                }
                throw new ReadCatalogException(e.Message, e);
            }
            catch (Exception e)
            {
                throw new ReadCatalogException(e.Message, e);
            }

            return(items ?? new List <CatalogItemModel>());
        }