65.9K
CodeProject 正在变化。 阅读更多。
Home

GOD:一个 REST Windows 库中访问 Google、Onedrive 和 Dropbox!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (10投票s)

2017年2月2日

CPOL

4分钟阅读

viewsIcon

24633

downloadIcon

372

C++ 目录、上传、下载和管理库

GOD 类现在是我 RGF 库 的一部分。

引言

现在是时候使用我优秀的 REST 库 了。这是一个简单而强大的库,提供了一个抽象类来使用 Google DriveOneDriveDropBox 服务。我在自己的 BAR 应用程序中使用它们。

背景

在本文中,我对已知元素使用了一些简单的扩展,例如 ystring (一个可以返回 UTF-8 中的 ANSI stringwstring)、TEVENT<> (一个 HEVENT 上的包装器) 和 XSOCKET 一个支持 SSL 的 SOCKET 包装器 - 所有这些都易于理解和使用,它们将在后面的文章中讨论或在之前的文章中讨论过。此外,还使用了 Hong Jiang 的 jsonxx 库。

您只需要将 god.h 以及 jsonxx.hsync.hrest.hxsocket.hystring.h 包含到您的项目中。

zip 文件包含一个解决方案,您可以取消注释 main.cpp 行来下载和上传文件。

抽象 DRIVE 类

整个东西都基于一个名为 DRIVE 的抽象类,它是我的 REST 类的后代

class DRIVE : public REST
    {
    protected:

        ystring cid;
        ystring secret;
        jsonxx::Object j;
        int port = 9932;
        TEVENT<> ev;
        XSOCKET x;
        vector<char> nd;
      
    public:

        DRIVE(const char* ccid = 0, const char* ssid = 0,int HostPort = 9932)
            {
            SetClient(ccid, ssid,HostPort);
            }
        virtual void SetClient(const char* ccid = 0, const char* ssid = 0,int HostPort = 9932)
            {
            if (ccid)
                cid = ccid;
            if (ssid)
                secret = ssid;
            port = HostPort;
            }
        virtual string jsonreturn(ihandle& r)
            {
            vector<char> out;
            ReadToMemory(r, out);
            out.resize(out.size() + 1);
            char* p = (char*)out.data();
            return p;
            }

        virtual int Auth(vector<string>&) = 0;
        virtual string CreateFolder(const char* fn,const char*pid) = 0;
        virtual string GetRootFolderID() = 0;
        virtual string IDFromPath(const char* Path,bool CreateIfNotExists = false) = 0;
        virtual string dir(const char* Path = 0,bool IsRDir = false) = 0;
        virtual string ItemProps(const char* id) = 0;
        virtual string SetProperty(const char* id, const char* n, const char* v) = 0;
        virtual HRESULT Download(const char* fid, HANDLE hF, vector<char>* arr, 
        unsigned long long from = 0, unsigned long long to = (unsigned long long) - 1, 
        std::function<HRESULT(unsigned long long, unsigned long long, void*)> fx = 0, 
        void* lp = 0) = 0;
        virtual HRESULT Upload(bool Resumable,HANDLE hX, vector<char>* arr,
        const char* folderid, const char* filename, string& resumedata,string& 
        returndata,std::function<HRESULT(unsigned long long f, unsigned long long t, 
        void* lp)> fx = 0, void* lp = 0) = 0;
        virtual string Delete(const char *rp,const char* fid, bool Trash = false) = 0;
        virtual HRESULT HashItem(const char* id, string& Hash, ALG_ID& HashAlg) = 0;
    };

构造函数

所有这些库的问题在于,它们需要用户手动“OK”才能首次允许访问,并且必须通过浏览器完成。因此,每个构造函数都接受“客户端 ID”和“客户端密钥”参数以及一个临时 Web 服务器正在监听的 TCP 端口。

DRIVE(const char* ccid = 0, const char* ssid = 0,int HostPort = 9932);

身份验证

virtual int Auth(vector<string>&);

您将一个 vector<string> 传递给此函数,其中包含身份验证令牌值。如果是第一次,则传递一个空向量。返回时,此函数返回

  • 0 - 失败。库使用结束
  • 1 - 成功
  • 2 - 成功,已收到新令牌,您现在应该保存此向量的内容以供将来使用。

通常,会返回一个访问令牌、一个刷新令牌和一个代码。第一次调用 Auth() 将创建一个侦听套接字,然后打开一个带有授权 URL 的网页,供用户单击“我接受”,然后,一个代码将返回到应用程序,该代码随后用于声明访问令牌。

文件和文件夹

在 Google Drive 和 OneDrive 中,文件和文件夹由 ID 表示,而在 Dropbox 中,文件由文件名表示。为了确保兼容性,该库使用“id”命名,无论如何。

获取信息

string IDFromPath(const char* Path,bool CreateIfNotExists = false);

此函数从给定的路径名返回 ID。如果此项不存在并且 CreateIfNotExists true,则该函数在该路径下创建一个目录。

string GetRootFolderID();

此函数返回 "root" 文件夹的 ID

string dir(const char* Path = 0,bool IsRDir = false);

此函数返回给定路径的目录(作为 json 字符串)。如果 IsRDir true,则假定 Path 为 ID(如果不是,则使用函数 IDFromPath 将路径转换为 ID)。

创建文件夹

virtual string CreateFolder(const char* fn,const char*pid);

在具有 ID pid 的父目录上创建一个具有给定文件名的文件夹。成功后返回描述性的 json。

删除项目

string Delete(const char *rp,const char* fid, bool Trash = false);

删除一个项目。在 Google 和 OneDrive 中,仅使用第二个参数(ID),而在 DropBox 中,仅使用第一个参数(路径)。如果文件要发送到回收站,则 Trash true

当您使用 Trash 设置为 false 调用 ONEDRIVE::DeleteDROPBOX::Delete 时,将返回 E_NOTIMPL。这些驱动器仅允许从 API 回收,不允许直接删除。

哈希项目

HRESULT HashItem(const char* id, string& Hash, ALG_ID& HashAlg);

哈希一个远程项目(仅 Google Drive),返回一个 CALG_MD5 string

下载数据

HRESULT Download(const char* fid, HANDLE hF, vector<char>* arr, 
unsigned long long from = 0, unsigned long long to = (unsigned long long) - 1, 
std::function<HRESULT(unsigned long long, unsigned long long, void*)> fx = 0, 
void* lp = 0) = 0;

接受的参数为

  • 要下载的文件的 ID
  • 用于保存到文件的 HANDLE 或用于保存到缓冲区的 vector<char>
  • from/to,下载范围(传递 0,-1 以获取整个流)
  • 进度回调及其参数

此函数下载指定的项目。

上传数据

HRESULT Upload(bool Resumable,HANDLE hX, vector<char>* arr,const char* folderid, 
const char* filename, string& resumedata,string& returndata,std::function<HRESULT
(unsigned long long f, unsigned long long t, void* lp)> fx = 0, void* lp = 0) = 0;

接受的参数为

  • 一个标志,指示是否应支持可恢复的上传(仅 Google Drive)
  • 一个句柄或一个用于读取数据的向量
  • 父文件夹的 ID
  • 新文件名
  • 进度回调及其参数。

此函数上传数据。

对于 Google Drive,您可以使用 UploadOnce()

HRESULT UploadOnce(HANDLE hX, vector<char>* arr, const char* folderid, 
const char* filename, string& returndata, std::function<HRESULT
(unsigned long long f, unsigned long long t, void* lp)> fx = 0, void* lp = 0)

或者您可以使用 BeginResumable()

HRESULT BeginResumable(HANDLE hX, vector<char>* arr, const char* folderid, 
const char* filename, string& returndata, string& resumedata,std::function<HRESULT
(unsigned long long f, unsigned long long t, void* lp)> fx = 0, void* lp = 0);

如果此函数失败,可能会返回与恢复相关的数据。在这种情况下,您可以再次调用 ContinueResumable()

HRESULT ContinueResumable(HANDLE hX, vector<char>* arr, const char* folderid, 
const char* filename, string& returndata, string& resumedata, 
std::function<HRESULT(unsigned long long f, unsigned long long t, void* lp)> fx = 0, 
void* lp = 0);

它可以恢复上传。

历史

  • 2017-2-3:首次发布
© . All rights reserved.