/// <summary>
        /// <para>Get the shared link's metadata.</para>
        /// </summary>
        /// <param name="url">URL of the shared link.</param>
        /// <param name="path">If the shared link is to a folder, this parameter can be used to
        /// retrieve the metadata for a specific file or sub-folder in this folder. A relative
        /// path should be used.</param>
        /// <param name="linkPassword">If the shared link has a password, this parameter can be
        /// used.</param>
        /// <returns>The task that represents the asynchronous send operation. The TResult
        /// parameter contains the response from the server.</returns>
        /// <exception cref="Dropbox.Api.ApiException{TError}">Thrown if there is an error
        /// processing the request; This will contain a <see
        /// cref="SharedLinkError"/>.</exception>
        public t.Task<SharedLinkMetadata> GetSharedLinkMetadataAsync(string url,
                                                                     string path = null,
                                                                     string linkPassword = null)
        {
            var getSharedLinkMetadataArg = new GetSharedLinkMetadataArg(url,
                                                                        path,
                                                                        linkPassword);

            return this.GetSharedLinkMetadataAsync(getSharedLinkMetadataArg);
        }
        /// <summary>
        /// <para>Begins an asynchronous send to the get shared link file route.</para>
        /// </summary>
        /// <param name="url">URL of the shared link.</param>
        /// <param name="path">If the shared link is to a folder, this parameter can be used to
        /// retrieve the metadata for a specific file or sub-folder in this folder. A relative
        /// path should be used.</param>
        /// <param name="linkPassword">If the shared link has a password, this parameter can be
        /// used.</param>
        /// <param name="callback">The method to be called when the asynchronous send is
        /// completed.</param>
        /// <param name="callbackState">A user provided object that distinguished this send
        /// from other send requests.</param>
        /// <returns>An object that represents the asynchronous send request.</returns>
        public sys.IAsyncResult BeginGetSharedLinkFile(string url,
                                                       string path = null,
                                                       string linkPassword = null,
                                                       sys.AsyncCallback callback = null,
                                                       object callbackState = null)
        {
            var getSharedLinkMetadataArg = new GetSharedLinkMetadataArg(url,
                                                                        path,
                                                                        linkPassword);

            return this.BeginGetSharedLinkFile(getSharedLinkMetadataArg, callback, callbackState);
        }
        /// <summary>
        /// <para>Download the shared link's file from a user's Dropbox.</para>
        /// </summary>
        /// <param name="url">URL of the shared link.</param>
        /// <param name="path">If the shared link is to a folder, this parameter can be used to
        /// retrieve the metadata for a specific file or sub-folder in this folder. A relative
        /// path should be used.</param>
        /// <param name="linkPassword">If the shared link has a password, this parameter can be
        /// used.</param>
        /// <returns>The task that represents the asynchronous send operation. The TResult
        /// parameter contains the response from the server.</returns>
        /// <exception cref="Dropbox.Api.ApiException{TError}">Thrown if there is an error
        /// processing the request; This will contain a <see
        /// cref="GetSharedLinkFileError"/>.</exception>
        public t.Task<enc.IDownloadResponse<SharedLinkMetadata>> GetSharedLinkFileAsync(string url,
                                                                                        string path = null,
                                                                                        string linkPassword = null)
        {
            var getSharedLinkMetadataArg = new GetSharedLinkMetadataArg(url,
                                                                        path,
                                                                        linkPassword);

            return this.GetSharedLinkFileAsync(getSharedLinkMetadataArg);
        }
        /// <summary>
        /// <para>Begins an asynchronous send to the get shared link file route.</para>
        /// </summary>
        /// <param name="getSharedLinkMetadataArg">The request parameters.</param>
        /// <param name="callback">The method to be called when the asynchronous send is
        /// completed.</param>
        /// <param name="state">A user provided object that distinguished this send from other
        /// send requests.</param>
        /// <returns>An object that represents the asynchronous send request.</returns>
        public sys.IAsyncResult BeginGetSharedLinkFile(GetSharedLinkMetadataArg getSharedLinkMetadataArg, sys.AsyncCallback callback, object state = null)
        {
            var task = this.GetSharedLinkFileAsync(getSharedLinkMetadataArg);

            return enc.Util.ToApm(task, callback, state);
        }
 /// <summary>
 /// <para>Download the shared link's file from a user's Dropbox.</para>
 /// </summary>
 /// <param name="getSharedLinkMetadataArg">The request parameters</param>
 /// <returns>The task that represents the asynchronous send operation. The TResult
 /// parameter contains the response from the server.</returns>
 /// <exception cref="Dropbox.Api.ApiException{TError}">Thrown if there is an error
 /// processing the request; This will contain a <see
 /// cref="GetSharedLinkFileError"/>.</exception>
 public t.Task<enc.IDownloadResponse<SharedLinkMetadata>> GetSharedLinkFileAsync(GetSharedLinkMetadataArg getSharedLinkMetadataArg)
 {
     return this.Transport.SendDownloadRequestAsync<GetSharedLinkMetadataArg, SharedLinkMetadata, GetSharedLinkFileError>(getSharedLinkMetadataArg, "content", "/sharing/get_shared_link_file", Dropbox.Api.Sharing.GetSharedLinkMetadataArg.Encoder, Dropbox.Api.Sharing.SharedLinkMetadata.Decoder, Dropbox.Api.Sharing.GetSharedLinkFileError.Decoder);
 }
 /// <summary>
 /// <para>Get the shared link's metadata.</para>
 /// </summary>
 /// <param name="getSharedLinkMetadataArg">The request parameters</param>
 /// <returns>The task that represents the asynchronous send operation. The TResult
 /// parameter contains the response from the server.</returns>
 /// <exception cref="Dropbox.Api.ApiException{TError}">Thrown if there is an error
 /// processing the request; This will contain a <see
 /// cref="SharedLinkError"/>.</exception>
 public t.Task<SharedLinkMetadata> GetSharedLinkMetadataAsync(GetSharedLinkMetadataArg getSharedLinkMetadataArg)
 {
     return this.Transport.SendRpcRequestAsync<GetSharedLinkMetadataArg, SharedLinkMetadata, SharedLinkError>(getSharedLinkMetadataArg, "api", "/sharing/get_shared_link_metadata", Dropbox.Api.Sharing.GetSharedLinkMetadataArg.Encoder, Dropbox.Api.Sharing.SharedLinkMetadata.Decoder, Dropbox.Api.Sharing.SharedLinkError.Decoder);
 }
Esempio n. 7
0
        private async Task <int> Run()
        {
            DropboxCertHelper.InitializeCertPinning();

            string[] scopeList = new string[] { "files.metadata.read", "files.content.read", "account_info.read", "sharing.read" };
            var      uid       = await AcquireAccessToken(scopeList, IncludeGrantedScopes.None);

            if (string.IsNullOrEmpty(uid))
            {
                return(1);
            }

            // Specify socket level timeout which decides maximum waiting time when no bytes are received by the socket.
            var httpClient = new HttpClient(new WebRequestHandler {
                ReadWriteTimeout = 10 * 1000
            })
            {
                // Specify request level timeout which decides maximum time that can be spent on download/upload files.
                Timeout = TimeSpan.FromMinutes(20)
            };

            try
            {
                var config = new DropboxClientConfig("SimpleOAuthApp")
                {
                    HttpClient = httpClient
                };

                var client = new DropboxClient(Settings.Default.AccessToken, Settings.Default.RefreshToken, Settings.Default.ApiKey, Settings.Default.ApiSecret, config);
                var scopes = new string[] { "files.metadata.read", "files.content.read", "sharing.read" };
                await client.RefreshAccessToken(scopes);

                if (Settings.Default.SharedLinks == null || Settings.Default.SharedLinks.Count == 0)
                {
                    Settings.Default.SharedLinks = new System.Collections.Specialized.StringCollection();

                    Console.Write("Shared link URL: ");
                    var line = Console.ReadLine();
                    while (line.Length > 0)
                    {
                        Settings.Default.SharedLinks.Add(line);

                        Console.Write("Additional shared link URL (leave blank to finish): ");
                        line = Console.ReadLine();
                    }
                    Settings.Default.Save();
                }

                var sharedLinks = Settings.Default.SharedLinks;
                foreach (var sharedLinkUrl in sharedLinks)
                {
                    GetSharedLinkMetadataArg arg = new GetSharedLinkMetadataArg(sharedLinkUrl);
                    var sharedLinkMetaData       = await client.Sharing.GetSharedLinkMetadataAsync(arg);

                    var localDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), sharedLinkMetaData.Name);
                    Directory.CreateDirectory(localDir);

                    Console.WriteLine($"Processing shared link name: {sharedLinkMetaData.Name}");
                    if (Verbose)
                    {
                        Console.WriteLine($"Shared link local folder: {localDir}");
                    }

                    SharedLink    sharedLink    = new SharedLink(sharedLinkUrl);
                    ListFolderArg listFolderArg = new ListFolderArg(path: "", sharedLink: sharedLink);
                    var           listFiles     = await client.Files.ListFolderAsync(listFolderArg);

                    foreach (var listFile in listFiles.Entries)
                    {
                        try
                        {
                            if (Verbose)
                            {
                                Console.WriteLine($"Processing: {listFile.Name}");
                            }

                            // Get the remote object details
                            var remoteFile = listFile.AsFile;

                            // Construct a reference to the local equivalent
                            var localFile = Path.Combine(localDir, listFile.Name);
                            if (Verbose)
                            {
                                Console.WriteLine($"  Local filename: {localFile}");
                            }

                            // Do we have a file already
                            if (File.Exists(localFile))
                            {
                                if (Verbose)
                                {
                                    Console.WriteLine($"  Local file exists. Comparing timestamp");
                                }

                                var localTimestamp = File.GetLastWriteTimeUtc(localFile);

                                if (Verbose)
                                {
                                    Console.WriteLine($"  Checking {remoteFile.ServerModified} with {localTimestamp}");
                                }

                                if (DateTime.Compare(remoteFile.ServerModified, localTimestamp) == 0)
                                {
                                    if (Verbose)
                                    {
                                        Console.WriteLine($"  Skipping unchanged file: {listFile.Name}");
                                    }
                                    continue;
                                }
                            }

                            GetSharedLinkMetadataArg downloadArg = new GetSharedLinkMetadataArg(sharedLinkUrl, $"/{listFile.Name}");
                            if (Verbose)
                            {
                                Console.WriteLine($"SharedLinkUrl: {sharedLinkUrl}");
                                Console.WriteLine($"    File Name: {listFile.Name}");
                            }
                            var download = await client.Sharing.GetSharedLinkFileAsync(downloadArg);

                            Console.WriteLine($"  Downloading: {remoteFile.Name}");
                            using (var ms = new MemoryStream())
                            {
                                var bytes = await download.GetContentAsByteArrayAsync();

                                if (bytes.Length > 0)
                                {
                                    File.WriteAllBytes(localFile, bytes.ToArray());
                                    File.SetCreationTimeUtc(localFile, remoteFile.ServerModified);
                                    File.SetLastWriteTimeUtc(localFile, remoteFile.ServerModified);
                                }
                                else
                                {
                                    Console.Error.WriteLine($"No bytes downloaded");
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.Error.WriteLine($"Failed during download: ${ex.Message}");
                        }
                    }

                    if (Verbose)
                    {
                        Console.WriteLine("Download complete!");
                    }
                }

                if (Verbose)
                {
                    Console.WriteLine("All downloads complete!");
                }

                if (PromptToExit)
                {
                    Console.WriteLine("Exit with any key");
                    Console.ReadKey();
                }
            }
            catch (HttpException e)
            {
                Console.WriteLine("Exception reported from RPC layer");
                Console.WriteLine("    Status code: {0}", e.StatusCode);
                Console.WriteLine("    Message    : {0}", e.Message);
                if (e.RequestUri != null)
                {
                    Console.WriteLine("    Request uri: {0}", e.RequestUri);
                }
            }

            return(0);
        }