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