From f909df9cca1e77f43162e1c0e563139d66970fac Mon Sep 17 00:00:00 2001 From: Endel Dreyer Date: Fri, 19 Sep 2014 20:38:07 -0300 Subject: [PATCH] rename to Hook. add .editorconfig and README --- .editorconfig | 8 ++ .gitignore | 1 + LICENSE | 23 ++++++ Makefile | 3 + README.md | 7 ++ build.sh | 7 -- dlapp | Bin 115232 -> 115156 bytes src/Client.cpp | 54 ++++++------ src/Client.h | 36 ++++---- src/Collection.cpp | 166 ++++++++++++++++++------------------- src/Collection.h | 68 ++++++++-------- src/Dictionary.cpp | 176 ++++++++++++++++++++-------------------- src/Dictionary.h | 46 +++++------ src/{DLApi.h => Hook.h} | 4 +- src/Request.cpp | 122 ++++++++++++++-------------- src/Request.h | 36 ++++---- src/Tools.cpp | 30 +++---- src/Tools.h | 36 ++++---- src/main.cpp | 79 +++++++++--------- 19 files changed, 468 insertions(+), 434 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md delete mode 100644 build.sh rename src/{DLApi.h => Hook.h} (69%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f5a1ad7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +indent_size = 4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d579f20 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dlapp diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c50d83d --- /dev/null +++ b/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2014 Doubleleft + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..40b1a5d --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +default: + clang -lstdc++ src/main.cpp src/cJSON.c src/Client.cpp src/Request.cpp src/Collection.cpp src/Dictionary.cpp src/Tools.cpp -o dlapp -lcurl + ./dlapp diff --git a/README.md b/README.md new file mode 100644 index 0000000..a1d8f6a --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +hook-cpp +=== + +License +--- + +MIT diff --git a/build.sh b/build.sh deleted file mode 100644 index f408ef3..0000000 --- a/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -# g++ src/main.c -o main.o -c -# g++ src/dlapi.c -o dlapi.o -c -# g++ -o dlapi main.o dlapi.o -lcurl - -clang -lstdc++ src/main.cpp src/cJSON.c src/Client.cpp src/Request.cpp src/Collection.cpp src/Dictionary.cpp src/Tools.cpp -o dlapp -lcurl - -./dlapp \ No newline at end of file diff --git a/dlapp b/dlapp index 281ba0c36a63d76249882ba5080e9477fed2d7f2..69aebd059c0b0a21ea92adc80362a47420a79ede 100755 GIT binary patch literal 115156 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 literal 115232 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 B7fb*E diff --git a/src/Client.cpp b/src/Client.cpp index 23cb578..90fc7cd 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -1,43 +1,43 @@ #include "Client.h" -const std::string DLAPI::Method::GET = "GET"; -const std::string DLAPI::Method::POST = "POST"; -const std::string DLAPI::Method::PUT = "PUT"; -const std::string DLAPI::Method::DELETE = "DELETE"; +const std::string Hook::Method::GET = "GET"; +const std::string Hook::Method::POST = "POST"; +const std::string Hook::Method::PUT = "PUT"; +const std::string Hook::Method::DELETE = "DELETE"; -DLAPI::Client::Client(std::string url, std::string key, std::string appId) +Hook::Client::Client(std::string url, std::string key, std::string appId) { - init(url, key, appId); + init(url, key, appId); } -DLAPI::Client::~Client() +Hook::Client::~Client() { - + } -void DLAPI::Client::init(std::string url, std::string key, std::string appId) +void Hook::Client::init(std::string url, std::string key, std::string appId) { - DLAPI::Log("init - url:%s key:%s appId:%s", url.c_str(), key.c_str(), appId.c_str()); + Hook::Log("init - url:%s key:%s appId:%s", url.c_str(), key.c_str(), appId.c_str()); - this->url = url; - this->key = key; - this->appId = appId; + this->url = url; + this->key = key; + this->appId = appId; - headers.push_back("Content-Type: application/json"); - headers.push_back(DLAPI::Str::format("X-App-Id: %s", appId.c_str())); - headers.push_back(DLAPI::Str::format("X-App-Key: %s", key.c_str())); + headers.push_back("Content-Type: application/json"); + headers.push_back(Hook::Str::format("X-App-Id: %s", appId.c_str())); + headers.push_back(Hook::Str::format("X-App-Key: %s", key.c_str())); } -DLAPI::Request DLAPI::Client::request(std::string method, std::string segments, DLAPI::Dictionary* paramsDict, std::string query) +Hook::Request Hook::Client::request(std::string method, std::string segments, Hook::Dictionary* paramsDict, std::string query) { - DLAPI::Request request; - - request.query = query; - request.params = DLAPI::Str::format("{\"data\":%s}", paramsDict->toJSONString().c_str()); - request.url = DLAPI::Str::format("%s/%s", url.c_str(), segments.c_str()); - request.method = method; - request.headers = headers; - request.execute(); - - return request; + Hook::Request request; + + request.query = query; + request.params = Hook::Str::format("{\"data\":%s}", paramsDict->toJSONString().c_str()); + request.url = Hook::Str::format("%s/%s", url.c_str(), segments.c_str()); + request.method = method; + request.headers = headers; + request.execute(); + + return request; } diff --git a/src/Client.h b/src/Client.h index dc9af9d..20e8c00 100644 --- a/src/Client.h +++ b/src/Client.h @@ -1,5 +1,5 @@ -#ifndef dlapi_client_h -#define dlapi_client_h +#ifndef hook_client_h +#define hook_client_h #include #include @@ -8,25 +8,25 @@ #include "Request.h" #include "Tools.h" -namespace DLAPI +namespace Hook { - class Client - { - public: - Client(std::string url, std::string key, std::string appId); - ~Client(); + class Client + { + public: + Client(std::string url, std::string key, std::string appId); + ~Client(); - std::string url; - std::string key; - std::string appId; + std::string url; + std::string key; + std::string appId; - DLAPI::Request request(std::string method, std::string segments, DLAPI::Dictionary* paramsDict, std::string query); - - private: - std::vector headers; + Hook::Request request(std::string method, std::string segments, Hook::Dictionary* paramsDict, std::string query); - void init(std::string url, std::string key, std::string appId); - }; + private: + std::vector headers; + + void init(std::string url, std::string key, std::string appId); + }; } -#endif \ No newline at end of file +#endif diff --git a/src/Collection.cpp b/src/Collection.cpp index ea57e75..7355572 100755 --- a/src/Collection.cpp +++ b/src/Collection.cpp @@ -1,126 +1,126 @@ #include "Collection.h" -DLAPI::Collection::Collection() : name(""), client(NULL) +Hook::Collection::Collection() : name(""), client(NULL) { } -DLAPI::Collection::Collection(DLAPI::Client *client) : client(client), name(""){ +Hook::Collection::Collection(Hook::Client *client) : client(client), name(""){ } -DLAPI::Collection::~Collection() +Hook::Collection::~Collection() { - client = NULL; + client = NULL; } -void DLAPI::Collection::create() +void Hook::Collection::create() { - if (client == NULL) { - std::cout << "no client set. aborting" << std::endl; - return; - } - client->request(DLAPI::Method::POST, getSegments(), ¶ms, ""); + if (client == NULL) { + std::cout << "no client set. aborting" << std::endl; + return; + } + client->request(Hook::Method::POST, getSegments(), ¶ms, ""); } -void DLAPI::Collection::fetch() +void Hook::Collection::fetch() { - if (client == NULL) { - std::cout << "no client set. aborting" << std::endl; - return; - } - - result.resize(0); - DLAPI::Request request = client->request(DLAPI::Method::GET, getSegments(), ¶ms, getQuery()); - - cJSON* json = cJSON_Parse(request.response.c_str()); - if (json == NULL) - return; - - int size = cJSON_GetArraySize(json); - - for (int i = 0; i < size; i++) - { - cJSON* item = cJSON_GetArrayItem(json, i); - DLAPI::Dictionary dict; - dict.fromJSONString(std::string(cJSON_Print(item))); - result.push_back(dict); - } - - cJSON_Delete(json); - json = NULL; + if (client == NULL) { + std::cout << "no client set. aborting" << std::endl; + return; + } + + result.resize(0); + Hook::Request request = client->request(Hook::Method::GET, getSegments(), ¶ms, getQuery()); + + cJSON* json = cJSON_Parse(request.response.c_str()); + if (json == NULL) + return; + + int size = cJSON_GetArraySize(json); + + for (int i = 0; i < size; i++) + { + cJSON* item = cJSON_GetArrayItem(json, i); + Hook::Dictionary dict; + dict.fromJSONString(std::string(cJSON_Print(item))); + result.push_back(dict); + } + + cJSON_Delete(json); + json = NULL; } -void DLAPI::Collection::update() +void Hook::Collection::update() { - if (client == NULL) { - std::cout << "no client set. aborting" << std::endl; - return; - } - DLAPI::Request request = client->request(DLAPI::Method::POST, getSegmentsWithId(), ¶ms, getQuery()); + if (client == NULL) { + std::cout << "no client set. aborting" << std::endl; + return; + } + Hook::Request request = client->request(Hook::Method::POST, getSegmentsWithId(), ¶ms, getQuery()); } -std::string DLAPI::Collection::getSegments() +std::string Hook::Collection::getSegments() { - std::string service = DLAPI::Str::format("collection/%s", name.c_str()); - return service; + std::string service = Hook::Str::format("collection/%s", name.c_str()); + return service; } -std::string DLAPI::Collection::getSegmentsWithId() +std::string Hook::Collection::getSegmentsWithId() { - std::string service = DLAPI::Str::format("collection/%s/%s", name.c_str(), params.getString("_id").c_str()); - return service; + std::string service = Hook::Str::format("collection/%s/%s", name.c_str(), params.getString("_id").c_str()); + return service; } -void DLAPI::Collection::addQueryArg(std::string field, std::string operation, std::string value) +void Hook::Collection::addQueryArg(std::string field, std::string operation, std::string value) { - int size = queryArgs.size(); - queryArgs.setString(DLAPI::Str::format("qa%i", size), DLAPI::Str::format("[\"%s\",\"%s\",\"%s\"]", field.c_str(), operation.c_str(), value.c_str())); + int size = queryArgs.size(); + queryArgs.setString(Hook::Str::format("qa%i", size), Hook::Str::format("[\"%s\",\"%s\",\"%s\"]", field.c_str(), operation.c_str(), value.c_str())); } -void DLAPI::Collection::addQueryArg(std::string field, std::string operation, int value) +void Hook::Collection::addQueryArg(std::string field, std::string operation, int value) { - int size = queryArgs.size(); - queryArgs.setString(DLAPI::Str::format("qa%i", size), DLAPI::Str::format("[\"%s\",\"%s\",%i]", field.c_str(), operation.c_str(), value)); + int size = queryArgs.size(); + queryArgs.setString(Hook::Str::format("qa%i", size), Hook::Str::format("[\"%s\",\"%s\",%i]", field.c_str(), operation.c_str(), value)); } -void DLAPI::Collection::sort(std::string field, DLAPI::Collection::SortingOption operation) +void Hook::Collection::sort(std::string field, Hook::Collection::SortingOption operation) { - ordering.push_back(std::pair(field, operation)); + ordering.push_back(std::pair(field, operation)); } -std::string DLAPI::Collection::getQuery() +std::string Hook::Collection::getQuery() { - int size = queryArgs.size(); - std::string str = "{\"q\":["; - - // Query - for (int i = 0; i < size; i++) - { - if (i != 0) str = str.append(","); - std::string key = queryArgs.getKeyByIndex(i); - std::string val = queryArgs.getString(key); - str = str.append(val); - } - str = str.append("]"); - - // Sorting - if (ordering.size() > 0) { - str = str.append(", \"s\": ["); - for (int i = 0; i < ordering.size(); i++) - { - std::pair p = ordering[i]; - if (i != 0) str = str.append(","); - std::string key = p.first; - std::string val = p.second == Ascending ? "asc" : "desc"; - str = str.append(DLAPI::Str::format("[\"%s\",\"%s\"]", key.c_str(), val.c_str())); - } - str = str.append("]"); + int size = queryArgs.size(); + std::string str = "{\"q\":["; + + // Query + for (int i = 0; i < size; i++) + { + if (i != 0) str = str.append(","); + std::string key = queryArgs.getKeyByIndex(i); + std::string val = queryArgs.getString(key); + str = str.append(val); + } + str = str.append("]"); + + // Sorting + if (ordering.size() > 0) { + str = str.append(", \"s\": ["); + for (int i = 0; i < ordering.size(); i++) + { + std::pair p = ordering[i]; + if (i != 0) str = str.append(","); + std::string key = p.first; + std::string val = p.second == Ascending ? "asc" : "desc"; + str = str.append(Hook::Str::format("[\"%s\",\"%s\"]", key.c_str(), val.c_str())); } + str = str.append("]"); + } - str = str.append("}"); + str = str.append("}"); - return str; + return str; } diff --git a/src/Collection.h b/src/Collection.h index 78d82f2..290ea31 100755 --- a/src/Collection.h +++ b/src/Collection.h @@ -1,45 +1,45 @@ -#ifndef dlapi_collection_h -#define dlapi_collection_h +#ifndef hook_collection_h +#define hook_collection_h #include #include "Client.h" #include "Dictionary.h" #include "cJSON.h" -namespace DLAPI +namespace Hook { - class Collection - { - public: - - enum SortingOption{ - Ascending, - Descending - }; - - Collection(); - Collection(DLAPI::Client *client); - ~Collection(); - - std::string name; - DLAPI::Dictionary params; - DLAPI::Client* client; - std::vector result; - DLAPI::Dictionary queryArgs; - - std::string getSegments(); - std::string getSegmentsWithId(); - void create(); - void fetch(); - void update(); - void addQueryArg(std::string field, std::string operation, std::string value); - void addQueryArg(std::string field, std::string operation, int value); - void sort(std::string field, SortingOption order); - std::string getQuery(); - + class Collection + { + public: + + enum SortingOption{ + Ascending, + Descending + }; + + Collection(); + Collection(Hook::Client *client); + ~Collection(); + + std::string name; + Hook::Dictionary params; + Hook::Client* client; + std::vector result; + Hook::Dictionary queryArgs; + + std::string getSegments(); + std::string getSegmentsWithId(); + void create(); + void fetch(); + void update(); + void addQueryArg(std::string field, std::string operation, std::string value); + void addQueryArg(std::string field, std::string operation, int value); + void sort(std::string field, SortingOption order); + std::string getQuery(); + private: - std::vector > ordering; - }; + std::vector > ordering; + }; } #endif diff --git a/src/Dictionary.cpp b/src/Dictionary.cpp index da5a655..975ceb8 100755 --- a/src/Dictionary.cpp +++ b/src/Dictionary.cpp @@ -1,131 +1,131 @@ #include "Dictionary.h" -DLAPI::Dictionary::Dictionary() +Hook::Dictionary::Dictionary() { - json = cJSON_CreateObject(); + json = cJSON_CreateObject(); } -DLAPI::Dictionary::~Dictionary() +Hook::Dictionary::~Dictionary() { - // if (json) cJSON_Delete(json); - // json = NULL; + // if (json) cJSON_Delete(json); + // json = NULL; } -void DLAPI::Dictionary::clear() +void Hook::Dictionary::clear() { - if (json) cJSON_Delete(json); - json = cJSON_CreateObject(); + if (json) cJSON_Delete(json); + json = cJSON_CreateObject(); } -std::string DLAPI::Dictionary::getKeyByIndex(int index) +std::string Hook::Dictionary::getKeyByIndex(int index) { - std::string r = ""; - int i = 0; - - cJSON* it = json->child; - while (it) - { - if (i == index) - { - r = std::string(it->string); - printf("%s\n", r.c_str()); - break; - } - i++; - it = it->next; - } - - return r; + std::string r = ""; + int i = 0; + + cJSON* it = json->child; + while (it) + { + if (i == index) + { + r = std::string(it->string); + printf("%s\n", r.c_str()); + break; + } + i++; + it = it->next; + } + + return r; } -void DLAPI::Dictionary::setString(std::string key, std::string value) +void Hook::Dictionary::setString(std::string key, std::string value) { - cJSON* j = cJSON_CreateString(value.c_str()); - cJSON_AddItemToObject(json, key.c_str(), j); -} + cJSON* j = cJSON_CreateString(value.c_str()); + cJSON_AddItemToObject(json, key.c_str(), j); +} -void DLAPI::Dictionary::setNumber(std::string key, double value) +void Hook::Dictionary::setNumber(std::string key, double value) { - cJSON* j = cJSON_CreateNumber(value); - cJSON_AddItemToObject(json, key.c_str(), j); + cJSON* j = cJSON_CreateNumber(value); + cJSON_AddItemToObject(json, key.c_str(), j); } -std::string DLAPI::Dictionary::getString(std::string key) +std::string Hook::Dictionary::getString(std::string key) { - std::string result = ""; - cJSON* j = cJSON_GetObjectItem(json, key.c_str()); - if (j && j->valuestring != NULL) result = std::string(j->valuestring); - return result; + std::string result = ""; + cJSON* j = cJSON_GetObjectItem(json, key.c_str()); + if (j && j->valuestring != NULL) result = std::string(j->valuestring); + return result; } -const char* DLAPI::Dictionary::getCString(std::string key) +const char* Hook::Dictionary::getCString(std::string key) { - return getString(key).c_str(); + return getString(key).c_str(); } -double DLAPI::Dictionary::getNumber(std::string key) +double Hook::Dictionary::getNumber(std::string key) { - double result = 0; - cJSON* j = cJSON_GetObjectItem(json, key.c_str()); - if (j) result = j->valuedouble; - return result; + double result = 0; + cJSON* j = cJSON_GetObjectItem(json, key.c_str()); + if (j) result = j->valuedouble; + return result; } -int DLAPI::Dictionary::getInt(std::string key) +int Hook::Dictionary::getInt(std::string key) { - return (int)getNumber(key); + return (int)getNumber(key); } -int DLAPI::Dictionary::size() +int Hook::Dictionary::size() { - int r = 0; + int r = 0; - cJSON* it = json->child; - while (it) - { - r++; - it = it->next; - } + cJSON* it = json->child; + while (it) + { + r++; + it = it->next; + } - return r; + return r; } -std::string DLAPI::Dictionary::toURLParams() +std::string Hook::Dictionary::toURLParams() { - std::string r = ""; - - cJSON* it = json->child; - while (it) - { - std::string str = ""; - const char* k = it->string; - - switch (it->type) - { - case cJSON_Number: - str = DLAPI::Str::format("%s=%d", it->string, it->valueint); - break; - case cJSON_String: - str = DLAPI::Str::format("%s=%s", it->string, it->valuestring); - break; - } - - r.append(str); - it = it->next; - if (it) r.append("&"); - } - - return r; + std::string r = ""; + + cJSON* it = json->child; + while (it) + { + std::string str = ""; + const char* k = it->string; + + switch (it->type) + { + case cJSON_Number: + str = Hook::Str::format("%s=%d", it->string, it->valueint); + break; + case cJSON_String: + str = Hook::Str::format("%s=%s", it->string, it->valuestring); + break; + } + + r.append(str); + it = it->next; + if (it) r.append("&"); + } + + return r; } -std::string DLAPI::Dictionary::toJSONString() +std::string Hook::Dictionary::toJSONString() { - return std::string(cJSON_Print(json)); + return std::string(cJSON_Print(json)); } -void DLAPI::Dictionary::fromJSONString(std::string str) +void Hook::Dictionary::fromJSONString(std::string str) { - if (json) cJSON_Delete(json); - json = cJSON_Parse(str.c_str()); - DLAPI::Log("fromJSONString %s\n", cJSON_Print(json)); -} \ No newline at end of file + if (json) cJSON_Delete(json); + json = cJSON_Parse(str.c_str()); + Hook::Log("fromJSONString %s\n", cJSON_Print(json)); +} diff --git a/src/Dictionary.h b/src/Dictionary.h index acc0dfe..60b7c2a 100644 --- a/src/Dictionary.h +++ b/src/Dictionary.h @@ -1,36 +1,36 @@ -#ifndef dlapi_dictionary_h -#define dlapi_dictionary_h +#ifndef hook_dictionary_h +#define hook_dictionary_h #include #include "cJSON.h" #include "Tools.h" -namespace DLAPI +namespace Hook { - class Dictionary - { - public: - Dictionary(); - ~Dictionary(); + class Dictionary + { + public: + Dictionary(); + ~Dictionary(); - void setString(std::string key, std::string value); - void setNumber(std::string key, double value); - void clear(); - int size(); + void setString(std::string key, std::string value); + void setNumber(std::string key, double value); + void clear(); + int size(); - std::string getKeyByIndex(int index); - std::string getString(std::string key); - const char* getCString(std::string key); - double getNumber(std::string key); - int getInt(std::string key); + std::string getKeyByIndex(int index); + std::string getString(std::string key); + const char* getCString(std::string key); + double getNumber(std::string key); + int getInt(std::string key); - std::string toURLParams(); - std::string toJSONString(); - void fromJSONString(std::string str); + std::string toURLParams(); + std::string toJSONString(); + void fromJSONString(std::string str); - private: - cJSON* json; - }; + private: + cJSON* json; + }; } #endif diff --git a/src/DLApi.h b/src/Hook.h similarity index 69% rename from src/DLApi.h rename to src/Hook.h index 3797664..bf271cf 100644 --- a/src/DLApi.h +++ b/src/Hook.h @@ -1,5 +1,5 @@ -#ifndef dlapi_dlapi_h -#define dlapi_dlapi_h +#ifndef hook_hook_h +#define hook_hook_h #include "Client.h" #include "Request.h" diff --git a/src/Request.cpp b/src/Request.cpp index 1ceb8c4..c76b2b2 100644 --- a/src/Request.cpp +++ b/src/Request.cpp @@ -2,83 +2,83 @@ static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { - ((std::string*)userp)->append((char*)contents, size * nmemb); - return size * nmemb; + ((std::string*)userp)->append((char*)contents, size * nmemb); + return size * nmemb; } static std::string curlRequest(std::string method, std::string url, std::vector headers, std::string params, std::string query) { - std::string readBuffer = ""; + std::string readBuffer = ""; #ifdef __APPLE__ - CURL *curl; - CURLcode res; - - curl = curl_easy_init(); - - if (!curl) - { - DLAPI::Log("ERROR! Curl not initialized."); - return ""; - } - - curl_slist* headerList = NULL; - - for (int i = 0; i < headers.size(); i++) - { - const char* headerStr = headers[i].c_str(); - headerList = curl_slist_append(headerList, headerStr); - } - - const char* paramsStr = params.c_str(); - const char* paramsEsc = curl_easy_escape(curl, paramsStr, strlen(paramsStr)); - // printf("%s\n", paramsStr); - - const char* queryStr = query.c_str(); - const char* queryEsc = curl_easy_escape(curl, queryStr, strlen(queryStr)); - - if (method.compare(DLAPI::Method::GET) == 0) - { - url = DLAPI::Str::format("%s?%s", url.c_str(), queryEsc); - } - - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, paramsStr); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(paramsStr)); - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method.c_str()); - - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); - - res = curl_easy_perform(curl); - - curl_slist_free_all(headerList); - curl_easy_cleanup(curl); - - printf("\n"); + CURL *curl; + CURLcode res; + + curl = curl_easy_init(); + + if (!curl) + { + Hook::Log("ERROR! Curl not initialized."); + return ""; + } + + curl_slist* headerList = NULL; + + for (int i = 0; i < headers.size(); i++) + { + const char* headerStr = headers[i].c_str(); + headerList = curl_slist_append(headerList, headerStr); + } + + const char* paramsStr = params.c_str(); + const char* paramsEsc = curl_easy_escape(curl, paramsStr, strlen(paramsStr)); + // printf("%s\n", paramsStr); + + const char* queryStr = query.c_str(); + const char* queryEsc = curl_easy_escape(curl, queryStr, strlen(queryStr)); + + if (method.compare(Hook::Method::GET) == 0) + { + url = Hook::Str::format("%s?%s", url.c_str(), queryEsc); + } + + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, paramsStr); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(paramsStr)); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method.c_str()); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); + + res = curl_easy_perform(curl); + + curl_slist_free_all(headerList); + curl_easy_cleanup(curl); + + printf("\n"); #endif - return readBuffer; + return readBuffer; } -DLAPI::Request::Request() +Hook::Request::Request() { - data = NULL; - response = ""; - params = ""; - query = ""; + data = NULL; + response = ""; + params = ""; + query = ""; } -DLAPI::Request::~Request() +Hook::Request::~Request() { - + } -void DLAPI::Request::execute() +void Hook::Request::execute() { - DLAPI::Log("execute %s - url:%s params:%s query:%s", method.c_str(), url.c_str(), params.c_str(), query.c_str()); - response = curlRequest(method, url, headers, params, query); + Hook::Log("execute %s - url:%s params:%s query:%s", method.c_str(), url.c_str(), params.c_str(), query.c_str()); + response = curlRequest(method, url, headers, params, query); } diff --git a/src/Request.h b/src/Request.h index fa8f416..0da5820 100644 --- a/src/Request.h +++ b/src/Request.h @@ -1,5 +1,5 @@ -#ifndef dlapi_request_h -#define dlapi_request_h +#ifndef Hook_request_h +#define Hook_request_h #include #include @@ -7,25 +7,25 @@ #include "Dictionary.h" #include "Tools.h" -namespace DLAPI +namespace Hook { - class Request - { - public: - Request(); - ~Request(); + class Request + { + public: + Request(); + ~Request(); - std::string method; - std::string url; - std::string params; - std::string query; - std::vector headers; - DLAPI::Dictionary* data; - std::string response; - int error; + std::string method; + std::string url; + std::string params; + std::string query; + std::vector headers; + Hook::Dictionary* data; + std::string response; + int error; - void execute(); - }; + void execute(); + }; } #endif diff --git a/src/Tools.cpp b/src/Tools.cpp index 51c9348..f70624c 100644 --- a/src/Tools.cpp +++ b/src/Tools.cpp @@ -1,21 +1,21 @@ #include "Tools.h" -void DLAPI::Log(std::string str, ...) +void Hook::Log(std::string str, ...) { - char dest[2048 * 16]; - va_list argptr; - va_start(argptr, str); - vsprintf(dest, str.c_str(), argptr); - va_end(argptr); - printf("[DLAPI] %s\n", dest); + char dest[2048 * 16]; + va_list argptr; + va_start(argptr, str); + vsprintf(dest, str.c_str(), argptr); + va_end(argptr); + printf("[Hook] %s\n", dest); } -std::string DLAPI::Str::format(std::string str, ...) +std::string Hook::Str::format(std::string str, ...) { - char newStr[2048 * 16]; - va_list vl; - va_start(vl, str); - va_end(vl); - vsprintf(newStr, str.c_str(), vl); - return std::string(newStr); -} \ No newline at end of file + char newStr[2048 * 16]; + va_list vl; + va_start(vl, str); + va_end(vl); + vsprintf(newStr, str.c_str(), vl); + return std::string(newStr); +} diff --git a/src/Tools.h b/src/Tools.h index 3c0b701..356c324 100644 --- a/src/Tools.h +++ b/src/Tools.h @@ -1,26 +1,26 @@ -#ifndef dlapi_tools_h -#define dlapi_tools_h +#ifndef hook_tools_h +#define hook_tools_h #include #include -namespace DLAPI +namespace Hook { - namespace Method - { - extern const std::string GET; - extern const std::string POST; - extern const std::string PUT; - extern const std::string DELETE; - } - - extern void Log(std::string str, ...); + namespace Method + { + extern const std::string GET; + extern const std::string POST; + extern const std::string PUT; + extern const std::string DELETE; + } - class Str - { - public: - static std::string format(std::string str, ...); - }; + extern void Log(std::string str, ...); + + class Str + { + public: + static std::string format(std::string str, ...); + }; } -#endif \ No newline at end of file +#endif diff --git a/src/main.cpp b/src/main.cpp index 6a4550c..b73dc54 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,43 +1,42 @@ #include -#include "dlapi.h" - +#include "Hook.h" -int main(int argc, char** argv) +int main(int argc, char** argv) { - DLAPI::Client* client = new DLAPI::Client("http://dl-api.ddll.co", "q1uU7tFtXnLad6FIGGn2cB+gxcx64/uPoDhqe2Zn5AE=", "1"); - - DLAPI::Collection collection1; - collection1.name = "guarana_leaderboards"; - collection1.params.setString("name", "MDT"); - collection1.params.setString("fbid", "1235"); - collection1.client = client; - // collection1.create(); - - // DLAPI::Collection collection2; - // collection2.name = "guarana_leaderboards"; - // collection2.client = client; - // collection2.addQueryArg("fbid", "=", "1234"); - // collection2.fetch(); - - DLAPI::Collection collection3; - collection3.name = "guarana_leaderboards"; - collection3.params.setString("_id", "20"); - collection3.params.setString("name", "MDT"); - collection3.client = client; - collection3.update(); - - DLAPI::Collection collection2; - collection2.name = "guarana_leaderboards"; - collection2.client = client; - collection2.addQueryArg("fbid", "=", "1235"); - collection2.fetch(); - - // std::string args = "{\"q\":[[\"_id\",\"=\",93]]}"; - // collection2.fetch(args); - - // DLAPI::Dictionary result = collection2.result; - - // DLAPI::Log("result: %i", collection2.result.size()); - - return 0; -} \ No newline at end of file + Hook::Client* client = new Hook::Client("http://dl-api.ddll.co", "q1uU7tFtXnLad6FIGGn2cB+gxcx64/uPoDhqe2Zn5AE=", "1"); + + Hook::Collection collection1; + collection1.name = "guarana_leaderboards"; + collection1.params.setString("name", "MDT"); + collection1.params.setString("fbid", "1235"); + collection1.client = client; + // collection1.create(); + + // Hook::Collection collection2; + // collection2.name = "guarana_leaderboards"; + // collection2.client = client; + // collection2.addQueryArg("fbid", "=", "1234"); + // collection2.fetch(); + + Hook::Collection collection3; + collection3.name = "guarana_leaderboards"; + collection3.params.setString("_id", "20"); + collection3.params.setString("name", "MDT"); + collection3.client = client; + collection3.update(); + + Hook::Collection collection2; + collection2.name = "guarana_leaderboards"; + collection2.client = client; + collection2.addQueryArg("fbid", "=", "1235"); + collection2.fetch(); + + // std::string args = "{\"q\":[[\"_id\",\"=\",93]]}"; + // collection2.fetch(args); + + // Hook::Dictionary result = collection2.result; + + // Hook::Log("result: %i", collection2.result.size()); + + return 0; +}