C++程序  |  487行  |  18.23 KB

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GOOGLE_APIS_DRIVE_GDATA_WAPI_REQUESTS_H_
#define GOOGLE_APIS_DRIVE_GDATA_WAPI_REQUESTS_H_

#include <string>
#include <vector>

#include "google_apis/drive/base_requests.h"
#include "google_apis/drive/drive_common_callbacks.h"
#include "google_apis/drive/gdata_wapi_url_generator.h"

namespace google_apis {

class AccountMetadata;
class GDataWapiUrlGenerator;
class ResourceEntry;

//============================ GetResourceListRequest ========================

// This class performs the request for fetching a resource list.
class GetResourceListRequest : public GetDataRequest {
 public:
  // override_url:
  //   If empty, a hard-coded base URL of the WAPI server is used to fetch
  //   the first page of the feed. This parameter is used for fetching 2nd
  //   page and onward.
  //
  // start_changestamp:
  //   This parameter specifies the starting point of a delta feed or 0 if a
  //   full feed is necessary.
  //
  // search_string:
  //   If non-empty, fetches a list of resources that match the search
  //   string.
  //
  // directory_resource_id:
  //   If non-empty, fetches a list of resources in a particular directory.
  //
  // callback:
  //   Called once the feed is fetched. Must not be null.
  GetResourceListRequest(RequestSender* sender,
                         const GDataWapiUrlGenerator& url_generator,
                         const GURL& override_url,
                         int64 start_changestamp,
                         const std::string& search_string,
                         const std::string& directory_resource_id,
                         const GetResourceListCallback& callback);
  virtual ~GetResourceListRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const GURL override_url_;
  const int64 start_changestamp_;
  const std::string search_string_;
  const std::string directory_resource_id_;

  DISALLOW_COPY_AND_ASSIGN(GetResourceListRequest);
};

//============================ SearchByTitleRequest ==========================

// This class performs the request for searching resources by title.
class SearchByTitleRequest : public GetDataRequest {
 public:
  // title: the search query.
  //
  // directory_resource_id: If given (non-empty), the search target is
  //   directly under the directory with the |directory_resource_id|.
  //   If empty, the search target is all the existing resources.
  //
  // callback:
  //   Called once the feed is fetched. Must not be null.
  SearchByTitleRequest(RequestSender* sender,
                       const GDataWapiUrlGenerator& url_generator,
                       const std::string& title,
                       const std::string& directory_resource_id,
                       const GetResourceListCallback& callback);
  virtual ~SearchByTitleRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string title_;
  const std::string directory_resource_id_;

  DISALLOW_COPY_AND_ASSIGN(SearchByTitleRequest);
};

//========================= GetResourceEntryRequest ==========================

// This class performs the request for fetching a single resource entry.
class GetResourceEntryRequest : public GetDataRequest {
 public:
  // |callback| must not be null.
  GetResourceEntryRequest(RequestSender* sender,
                          const GDataWapiUrlGenerator& url_generator,
                          const std::string& resource_id,
                          const GURL& embed_origin,
                          const GetDataCallback& callback);
  virtual ~GetResourceEntryRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  // Resource id of the requested entry.
  const std::string resource_id_;
  // Embed origin for an url to the sharing dialog. Can be empty.
  const GURL& embed_origin_;

  DISALLOW_COPY_AND_ASSIGN(GetResourceEntryRequest);
};

//========================= GetAccountMetadataRequest ========================

// Callback used for GetAccountMetadata().
typedef base::Callback<void(GDataErrorCode error,
                            scoped_ptr<AccountMetadata> account_metadata)>
    GetAccountMetadataCallback;

// This class performs the request for fetching account metadata.
class GetAccountMetadataRequest : public GetDataRequest {
 public:
  // If |include_installed_apps| is set to true, the result should include
  // the list of installed third party applications.
  // |callback| must not be null.
  GetAccountMetadataRequest(RequestSender* sender,
                            const GDataWapiUrlGenerator& url_generator,
                            const GetAccountMetadataCallback& callback,
                            bool include_installed_apps);
  virtual ~GetAccountMetadataRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const bool include_installed_apps_;

  DISALLOW_COPY_AND_ASSIGN(GetAccountMetadataRequest);
};

//=========================== DeleteResourceRequest ==========================

// This class performs the request for deleting a resource.
//
// In WAPI, "gd:deleted" means that the resource was put in the trash, and
// "docs:removed" means its permanently gone. Since what the class does is to
// put the resource into trash, we have chosen "Delete" in the name, even though
// we are preferring the term "Remove" in drive/google_api code.
class DeleteResourceRequest : public EntryActionRequest {
 public:
  // |callback| must not be null.
  DeleteResourceRequest(RequestSender* sender,
                        const GDataWapiUrlGenerator& url_generator,
                        const EntryActionCallback& callback,
                        const std::string& resource_id,
                        const std::string& etag);
  virtual ~DeleteResourceRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string resource_id_;
  const std::string etag_;

  DISALLOW_COPY_AND_ASSIGN(DeleteResourceRequest);
};

//========================== CreateDirectoryRequest ==========================

// This class performs the request for creating a directory.
class CreateDirectoryRequest : public GetDataRequest {
 public:
  // A new directory will be created under a directory specified by
  // |parent_resource_id|. If this parameter is empty, a new directory will
  // be created in the root directory.
  // |callback| must not be null.
  CreateDirectoryRequest(RequestSender* sender,
                         const GDataWapiUrlGenerator& url_generator,
                         const GetDataCallback& callback,
                         const std::string& parent_resource_id,
                         const std::string& directory_title);
  virtual ~CreateDirectoryRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual bool GetContentData(std::string* upload_content_type,
                              std::string* upload_content) OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string parent_resource_id_;
  const std::string directory_title_;

  DISALLOW_COPY_AND_ASSIGN(CreateDirectoryRequest);
};

//=========================== RenameResourceRequest ==========================

// This class performs the request for renaming a document/file/directory.
class RenameResourceRequest : public EntryActionRequest {
 public:
  // |callback| must not be null.
  RenameResourceRequest(RequestSender* sender,
                        const GDataWapiUrlGenerator& url_generator,
                        const EntryActionCallback& callback,
                        const std::string& resource_id,
                        const std::string& new_title);
  virtual ~RenameResourceRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;
  virtual GURL GetURL() const OVERRIDE;
  virtual bool GetContentData(std::string* upload_content_type,
                              std::string* upload_content) OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string resource_id_;
  const std::string new_title_;

  DISALLOW_COPY_AND_ASSIGN(RenameResourceRequest);
};

//=========================== AuthorizeAppRequest ==========================

// This class performs the request for authorizing an application specified
// by |app_id| to access a document specified by |resource_id|.
class AuthorizeAppRequest : public GetDataRequest {
 public:
  // |callback| must not be null.
  AuthorizeAppRequest(RequestSender* sender,
                      const GDataWapiUrlGenerator& url_generator,
                      const AuthorizeAppCallback& callback,
                      const std::string& resource_id,
                      const std::string& app_id);
  virtual ~AuthorizeAppRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual bool GetContentData(std::string* upload_content_type,
                              std::string* upload_content) OVERRIDE;
  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;
  virtual GURL GetURL() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string resource_id_;
  const std::string app_id_;

  DISALLOW_COPY_AND_ASSIGN(AuthorizeAppRequest);
};

//======================= AddResourceToDirectoryRequest ======================

// This class performs the request for adding a document/file/directory
// to a directory.
class AddResourceToDirectoryRequest : public EntryActionRequest {
 public:
  // |callback| must not be null.
  AddResourceToDirectoryRequest(RequestSender* sender,
                                const GDataWapiUrlGenerator& url_generator,
                                const EntryActionCallback& callback,
                                const std::string& parent_resource_id,
                                const std::string& resource_id);
  virtual ~AddResourceToDirectoryRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual bool GetContentData(std::string* upload_content_type,
                              std::string* upload_content) OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string parent_resource_id_;
  const std::string resource_id_;

  DISALLOW_COPY_AND_ASSIGN(AddResourceToDirectoryRequest);
};

//==================== RemoveResourceFromDirectoryRequest ====================

// This class performs the request for removing a document/file/directory
// from a directory.
class RemoveResourceFromDirectoryRequest : public EntryActionRequest {
 public:
  // |callback| must not be null.
  RemoveResourceFromDirectoryRequest(RequestSender* sender,
                                     const GDataWapiUrlGenerator& url_generator,
                                     const EntryActionCallback& callback,
                                     const std::string& parent_resource_id,
                                     const std::string& resource_id);
  virtual ~RemoveResourceFromDirectoryRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string resource_id_;
  const std::string parent_resource_id_;

  DISALLOW_COPY_AND_ASSIGN(RemoveResourceFromDirectoryRequest);
};

//======================= InitiateUploadNewFileRequest =======================

// This class performs the request for initiating the upload of a new file.
class InitiateUploadNewFileRequest : public InitiateUploadRequestBase {
 public:
  // |title| should be set.
  // |parent_upload_url| should be the upload_url() of the parent directory.
  //   (resumable-create-media URL)
  // See also the comments of InitiateUploadRequestBase for more details
  // about the other parameters.
  InitiateUploadNewFileRequest(RequestSender* sender,
                               const GDataWapiUrlGenerator& url_generator,
                               const InitiateUploadCallback& callback,
                               const std::string& content_type,
                               int64 content_length,
                               const std::string& parent_resource_id,
                               const std::string& title);
  virtual ~InitiateUploadNewFileRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual bool GetContentData(std::string* upload_content_type,
                              std::string* upload_content) OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string parent_resource_id_;
  const std::string title_;

  DISALLOW_COPY_AND_ASSIGN(InitiateUploadNewFileRequest);
};

//==================== InitiateUploadExistingFileRequest =====================

// This class performs the request for initiating the upload of an existing
// file.
class InitiateUploadExistingFileRequest
    : public InitiateUploadRequestBase {
 public:
  // |upload_url| should be the upload_url() of the file
  //    (resumable-create-media URL)
  // |etag| should be set if it is available to detect the upload confliction.
  // See also the comments of InitiateUploadRequestBase for more details
  // about the other parameters.
  InitiateUploadExistingFileRequest(RequestSender* sender,
                                    const GDataWapiUrlGenerator& url_generator,
                                    const InitiateUploadCallback& callback,
                                    const std::string& content_type,
                                    int64 content_length,
                                    const std::string& resource_id,
                                    const std::string& etag);
  virtual ~InitiateUploadExistingFileRequest();

 protected:
  // UrlFetchRequestBase overrides.
  virtual GURL GetURL() const OVERRIDE;
  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;
  virtual bool GetContentData(std::string* upload_content_type,
                              std::string* upload_content) OVERRIDE;

 private:
  const GDataWapiUrlGenerator url_generator_;
  const std::string resource_id_;
  const std::string etag_;

  DISALLOW_COPY_AND_ASSIGN(InitiateUploadExistingFileRequest);
};

//============================ ResumeUploadRequest ===========================

// Performs the request for resuming the upload of a file.
class ResumeUploadRequest : public ResumeUploadRequestBase {
 public:
  // See also ResumeUploadRequestBase's comment for parameters meaning.
  // |callback| must not be null.
  ResumeUploadRequest(RequestSender* sender,
                      const UploadRangeCallback& callback,
                      const ProgressCallback& progress_callback,
                      const GURL& upload_location,
                      int64 start_position,
                      int64 end_position,
                      int64 content_length,
                      const std::string& content_type,
                      const base::FilePath& local_file_path);
  virtual ~ResumeUploadRequest();

 protected:
  // UploadRangeRequestBase overrides.
  virtual void OnRangeRequestComplete(
      const UploadRangeResponse& response,
      scoped_ptr<base::Value> value) OVERRIDE;
  // content::UrlFetcherDelegate overrides.
  virtual void OnURLFetchUploadProgress(const net::URLFetcher* source,
                                        int64 current, int64 total) OVERRIDE;

 private:
  const UploadRangeCallback callback_;
  const ProgressCallback progress_callback_;

  DISALLOW_COPY_AND_ASSIGN(ResumeUploadRequest);
};

//========================== GetUploadStatusRequest ==========================

// Performs the request to request the current upload status of a file.
class GetUploadStatusRequest : public GetUploadStatusRequestBase {
 public:
  // See also GetUploadStatusRequestBase's comment for parameters meaning.
  // |callback| must not be null.
  GetUploadStatusRequest(RequestSender* sender,
                         const UploadRangeCallback& callback,
                         const GURL& upload_url,
                         int64 content_length);
  virtual ~GetUploadStatusRequest();

 protected:
  // UploadRangeRequestBase overrides.
  virtual void OnRangeRequestComplete(
      const UploadRangeResponse& response,
      scoped_ptr<base::Value> value) OVERRIDE;

 private:
  const UploadRangeCallback callback_;

  DISALLOW_COPY_AND_ASSIGN(GetUploadStatusRequest);
};


//========================== DownloadFileRequest ==========================

// This class performs the request for downloading of a specified file.
class DownloadFileRequest : public DownloadFileRequestBase {
 public:
  // See also DownloadFileRequestBase's comment for parameters meaning.
  DownloadFileRequest(RequestSender* sender,
                      const GDataWapiUrlGenerator& url_generator,
                      const DownloadActionCallback& download_action_callback,
                      const GetContentCallback& get_content_callback,
                      const ProgressCallback& progress_callback,
                      const std::string& resource_id,
                      const base::FilePath& output_file_path);
  virtual ~DownloadFileRequest();

  DISALLOW_COPY_AND_ASSIGN(DownloadFileRequest);
};

}  // namespace google_apis

#endif  // GOOGLE_APIS_DRIVE_GDATA_WAPI_REQUESTS_H_