Esempio n. 1
0
        public DriveResponse <DriveEmptyDataInfo> Execute(DriveClient driveClient)
        {
            var log = Log;

            log.Debug("Execute: Downloading a file.");
            var driveFile = DriveFile;

            if (driveFile == null)
            {
                var request  = new DriveFileGetRequest(FileId);
                var response = driveClient.Execute(request);
                DriveFile = driveFile = response.Data;
            }

            var uriItems = driveFile.DownloadUrl.Split(new[] { '?' }, StringSplitOptions.RemoveEmptyEntries);

            IRestResponse restResponse;
            long          rangeBegin     = 0;
            uint          chunkSize      = ChunkSize ?? DefaultChunkSize;
            var           responseWriter = ResponseWriter;
            long          fileSize       = driveFile.FileSize;

            RaiseDownloadProgress(0, fileSize);
            IRestClient restClient = driveClient.CreateRestClient(uriItems[0]);
            int         timeout    = WriteChunkTimeout ?? DefaultWriteChunkTimeout;

            do
            {
                IRestRequest restRequest = CreateRestRequest(uriItems.Length > 1 ? uriItems[1] : string.Empty);
                restRequest.Timeout = timeout;
                long   rangeEnd = Math.Min(rangeBegin + chunkSize, fileSize - 1);
                string rangeStr = string.Format("bytes={0}-{1}", rangeBegin, rangeEnd);
                log.Trace("Execute: Downloading a chunk of file. FilePos: \"{0}\"; BufferLen: \"{1}\"; FileLen: \"{2}\"", rangeBegin, rangeEnd - rangeBegin, fileSize);
                restRequest.AddParameter("Range", rangeStr, ParameterType.HttpHeader);
                restRequest.ResponseWriter = stream => stream.CopyTo(responseWriter);
                restResponse = RequestHandler.Request(restClient, restRequest, HttpStatusCode.OK, HttpStatusCode.PartialContent);

                if (restResponse.StatusCode == HttpStatusCode.PartialContent)
                {
                    uriItems = restResponse.ResponseUri.ToString().Split(new[] { '?' }, StringSplitOptions.RemoveEmptyEntries);
                    string rangeResultStr = GetUploadedRange(restResponse, ref rangeBegin, ref rangeEnd, ref fileSize);
                    log.Trace("Execute: Chunk downloaded. Content-Range: \"{0}\"", rangeResultStr);
                    RaiseDownloadProgress(rangeEnd, fileSize);
                    rangeBegin = rangeEnd + 1;

                    if (rangeBegin >= fileSize)
                    {
                        break;
                    }
                }

                restClient.BaseUrl = uriItems[0];
            } while (restResponse.StatusCode == HttpStatusCode.PartialContent);

            var result = new DriveResponse <DriveEmptyDataInfo>(restResponse);

            return(result);
        }
Esempio n. 2
0
        private static DriveFileInfo GetDriveFolder(DriveClient client, string rootFolderId, IEnumerable <string> pathItems, bool createIfNotExists = false)
        {
            DriveFileInfo currentFolder = null;
            string        currentId     = rootFolderId;

            foreach (var pathItem in pathItems)
            {
                var getRequest = new DriveFileListRequest
                {
                    MaxResults = 4,
                    Query      = string.Format("trashed = false and title = '{0}' and mimeType = 'application/vnd.google-apps.folder'", pathItem)
                };
                var getResponse = client.Execute(getRequest);
                currentFolder = getResponse.Data.Items.FirstOrDefault();

                if (currentFolder == null)
                {
                    if (!createIfNotExists)
                    {
                        break;
                    }

                    var createRequest = new DriveFolderCreateRequest(new DriveFolderShortInfo
                    {
                        Title   = pathItem,
                        Parents = new List <DriveParentReferenceInfo>
                        {
                            new DriveParentReferenceInfo {
                                Id = currentId
                            }
                        }
                    });
                    var createResponse = client.Execute(createRequest);
                    currentFolder = createResponse.Data;
                }
                currentId = currentFolder.Id;
            }

            return(currentFolder);
        }