diff --git a/.gitignore b/.gitignore index 5ac6c48..7499123 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.idea/ /cmake-build-debug/ +/doc/ \ No newline at end of file diff --git a/src/yadisk.h b/src/yadisk.h index cd4d61e..868fb09 100644 --- a/src/yadisk.h +++ b/src/yadisk.h @@ -16,7 +16,6 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ - #ifndef YADISK_YADISK_H #define YADISK_YADISK_H diff --git a/src/yadisk_api_internal.c b/src/yadisk_api_internal.c index 5eb86f7..f1ddcc6 100644 --- a/src/yadisk_api_internal.c +++ b/src/yadisk_api_internal.c @@ -114,6 +114,7 @@ int api_http_request( } else { snprintf(url, sizeof(url), "%s%s", YANDEX_DISK_API_HOST, path); } + printf("%s\n", url); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk); diff --git a/src/yadisk_api_internal.h b/src/yadisk_api_internal.h index a4e58ca..4178996 100644 --- a/src/yadisk_api_internal.h +++ b/src/yadisk_api_internal.h @@ -41,12 +41,13 @@ int api_http_request(yadisk_api_client* client, return YADISK_FAILED_PARSE_JSON; \ } -#define __DANGER_GET_JSON_OBJECT(root, key) \ - json_object* obj = NULL; \ - if (!json_object_object_get_ex(root, key, &obj)){\ - json_object_put(root); \ - THROW_PARSE_JSON_ERROR \ - } \ +#define __DANGER_GET_JSON_OBJECT(root, key) \ + json_object* obj = NULL; \ + if (!json_object_object_get_ex(root, key, &obj)){ \ + } + +// json_object_put(root); +// THROW_PARSE_JSON_ERROR #define GET_JSON_STRING(root, key, v) { \ __DANGER_GET_JSON_OBJECT(root, key) \ diff --git a/src/yadisk_get_disk.c b/src/yadisk_get_disk.c index d07282f..02c85bd 100644 --- a/src/yadisk_get_disk.c +++ b/src/yadisk_get_disk.c @@ -22,10 +22,23 @@ #include "yadisk_get_disk.h" #include "yadisk_api_internal.h" -yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_disk_info* info) +yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_get_disk_params* params, yadisk_disk_info* info) { + query_param* qparams = NULL; + int num_params = 0; + const int max_params = 1; + + if (params != NULL) { + qparams = malloc(max_params * sizeof(query_param)); + if (params->fields != NULL) { + qparams[num_params].key = "fields"; + qparams[num_params].value = strdup(params->fields); + num_params++; + } + } + char* output = NULL; - int error = api_http_request(client, "GET", "/v1/disk", NULL, 0, &output); + int error = api_http_request(client, "GET", "/v1/disk", qparams, num_params, &output); if (error) { return YADISK_FAILED_HTTP_REQUEST; } @@ -40,35 +53,41 @@ yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_disk_info* info) GET_JSON_BOOL(root, "is_paid", &(info->is_paid)); json_object *user_object; - if (!json_object_object_get_ex(root, "user", &user_object)) - THROW_PARSE_JSON_ERROR + if (!json_object_object_get_ex(root, "user", &user_object)) { + // THROW_PARSE_JSON_ERROR + } - GET_JSON_STRING(user_object, "reg_time", &(info->user.reg_time)); - GET_JSON_STRING(user_object, "display_name", &(info->user.display_name)); - GET_JSON_STRING(user_object, "uid", &(info->user.uid)); - GET_JSON_STRING(user_object, "country", &(info->user.country)); - GET_JSON_BOOL(user_object, "is_child", &(info->user.is_child)); - GET_JSON_STRING(user_object, "login", &(info->user.login)); + if (user_object) { + GET_JSON_STRING(user_object, "reg_time", &(info->user.reg_time)); + GET_JSON_STRING(user_object, "display_name", &(info->user.display_name)); + GET_JSON_STRING(user_object, "uid", &(info->user.uid)); + GET_JSON_STRING(user_object, "country", &(info->user.country)); + GET_JSON_BOOL(user_object, "is_child", &(info->user.is_child)); + GET_JSON_STRING(user_object, "login", &(info->user.login)); + } json_object *system_folders; - if (!json_object_object_get_ex(root, "system_folders", &system_folders)) - THROW_PARSE_JSON_ERROR + if (!json_object_object_get_ex(root, "system_folders", &system_folders)) { + // THROW_PARSE_JSON_ERROR + } - GET_JSON_STRING(system_folders, "odnoklassniki", &(info->system_folders.odnoklassniki)); - GET_JSON_STRING(system_folders, "google", &(info->system_folders.google)); - GET_JSON_STRING(system_folders, "instagram", &(info->system_folders.instagram)); - GET_JSON_STRING(system_folders, "vkontakte", &(info->system_folders.vkontakte)); - GET_JSON_STRING(system_folders, "attach", &(info->system_folders.attach)); - GET_JSON_STRING(system_folders, "mailru", &(info->system_folders.mailru)); - GET_JSON_STRING(system_folders, "downloads", &(info->system_folders.downloads)); - GET_JSON_STRING(system_folders, "applications", &(info->system_folders.applications)); - GET_JSON_STRING(system_folders, "facebook", &(info->system_folders.facebook)); - GET_JSON_STRING(system_folders, "social", &(info->system_folders.social)); - GET_JSON_STRING(system_folders, "messenger", &(info->system_folders.messenger)); - GET_JSON_STRING(system_folders, "calendar", &(info->system_folders.calendar)); - GET_JSON_STRING(system_folders, "photostream", &(info->system_folders.photostream)); - GET_JSON_STRING(system_folders, "screenshots", &(info->system_folders.screenshots)); - GET_JSON_STRING(system_folders, "scans", &(info->system_folders.scans)); + if (system_folders) { + GET_JSON_STRING(system_folders, "odnoklassniki", &(info->system_folders.odnoklassniki)); + GET_JSON_STRING(system_folders, "google", &(info->system_folders.google)); + GET_JSON_STRING(system_folders, "instagram", &(info->system_folders.instagram)); + GET_JSON_STRING(system_folders, "vkontakte", &(info->system_folders.vkontakte)); + GET_JSON_STRING(system_folders, "attach", &(info->system_folders.attach)); + GET_JSON_STRING(system_folders, "mailru", &(info->system_folders.mailru)); + GET_JSON_STRING(system_folders, "downloads", &(info->system_folders.downloads)); + GET_JSON_STRING(system_folders, "applications", &(info->system_folders.applications)); + GET_JSON_STRING(system_folders, "facebook", &(info->system_folders.facebook)); + GET_JSON_STRING(system_folders, "social", &(info->system_folders.social)); + GET_JSON_STRING(system_folders, "messenger", &(info->system_folders.messenger)); + GET_JSON_STRING(system_folders, "calendar", &(info->system_folders.calendar)); + GET_JSON_STRING(system_folders, "photostream", &(info->system_folders.photostream)); + GET_JSON_STRING(system_folders, "screenshots", &(info->system_folders.screenshots)); + GET_JSON_STRING(system_folders, "scans", &(info->system_folders.scans)); + } GET_JSON_BOOL(root, "unlimited_autoupload_enabled", &(info->unlimited_autoupload_enabled)); GET_JSON_UINT64(root, "revision", &(info->revision)); diff --git a/src/yadisk_get_disk.h b/src/yadisk_get_disk.h index 1dc7e7b..86c5773 100644 --- a/src/yadisk_get_disk.h +++ b/src/yadisk_get_disk.h @@ -18,12 +18,19 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ - +/** + * @file + */ #ifndef YADISK_YADISK_GET_DISK_H #define YADISK_YADISK_GET_DISK_H #include "yadisk_shared.h" +/** + * @brief + * @en User info + * @ru Информация о пользователе + */ typedef struct { const char* reg_time; const char* display_name; @@ -33,6 +40,11 @@ typedef struct { const char* login; } yadisk_user_info; +/** + * @brief + * @en System folders paths + * @ru Пути системных папок + */ typedef struct { const char* odnoklassniki; const char* google; @@ -51,18 +63,90 @@ typedef struct { const char* scans; } yadisk_system_folders; +/** + * @brief + * @en Information about the disk + * @ru Информация о диске + */ typedef struct yadisk_disk_info { + /** + * @brief + * @en Total space + * @ru Общий объем + */ unsigned long total_space; + /** + * @brief + * @en Trash size + * @ru Объем корзины + */ unsigned long trash_size; + /** + * @brief + * @en Used space + * @ru Использованный объем + */ unsigned long used_space; + /** + * @brief + * @en Is paid tariff + * @ru Платный ли тариф + */ int is_paid; + /** + * @brief + * @en Registration date + * @ru Дата регистрации + */ const char* reg_time; + /** + * @brief + * @en System folders paths + * @ru Пути системных папок + */ yadisk_system_folders system_folders; + /** + * @brief + * @en Info about user + * @ru Информация о пользователе + */ yadisk_user_info user; + /** + * @brief + * @en Unlimited autoupload + * @ru Безлимитная автозагрузка + */ int unlimited_autoupload_enabled; + /** + * @brief + * @en Revision + * @ru Ревизия + */ unsigned long revision; } yadisk_disk_info; -yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_disk_info* info); +typedef struct { + /** + * @brief + * @ru Список возвращаемых атрибутов. + */ + const char* fields; +} yadisk_get_disk_params; + +/** + * @brief + * @ru Функция для получения метаинформации о диске пользователя. + * + * Реализует метод `GET /v1/disk` + * @param client + * @ru Клиент Яндекс.Диска + * @param params + * @ru Параметры запроса + * @param info + * @ru Информация о диске. Результат выполнения операции + * @return + * @ru Код возврата (YADISK_OK в случае успеха). + */ +yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_get_disk_params* params, yadisk_disk_info* info); #endif //YADISK_YADISK_GET_DISK_H diff --git a/src/yadisk_get_disk_resources.c b/src/yadisk_get_disk_resources.c index 2848e4e..0c97988 100644 --- a/src/yadisk_get_disk_resources.c +++ b/src/yadisk_get_disk_resources.c @@ -22,7 +22,7 @@ yadisk_code yadisk_get_disk_resources( - yadisk_api_client* client, const char* path, yadisk_resource_info* info + yadisk_api_client* client, yadisk_get_disk_resources_params* path, yadisk_resource_info* info ) { char* output = NULL; diff --git a/src/yadisk_get_disk_resources.h b/src/yadisk_get_disk_resources.h index b9538dd..95a4add 100644 --- a/src/yadisk_get_disk_resources.h +++ b/src/yadisk_get_disk_resources.h @@ -65,6 +65,7 @@ struct yadisk_resource_item { }; typedef struct { + /** Массив элементов */ struct yadisk_resource_item* items; // Массив элементов unsigned long items_count; // Количество элементов unsigned long limit; @@ -79,6 +80,16 @@ typedef struct { const yadisk_resource_embedded* _embedded; } yadisk_resource_info; -yadisk_code yadisk_get_disk_resources(yadisk_api_client* client, const char* path, yadisk_resource_info* resource); +typedef struct { + const char* path; + const char* fields; + unsigned long limit; + unsigned long offset; + int preview_crop; + const char* preview_size; + const char* sort; +} yadisk_get_disk_resources_params; + +yadisk_code yadisk_get_disk_resources(yadisk_api_client* client, yadisk_get_disk_resources_params* params, yadisk_resource_info* resource); #endif // YADISK_GET_DISK_RESOURCES_H_INCLUDED diff --git a/src/yadisk_shared.h b/src/yadisk_shared.h index 39dc72d..6361898 100644 --- a/src/yadisk_shared.h +++ b/src/yadisk_shared.h @@ -18,7 +18,9 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ - +/** + * @file + */ #ifndef YADISK_YADISK_SHARED_H #define YADISK_YADISK_SHARED_H @@ -26,17 +28,74 @@ #include #include +/** + * @brief + * @ru Определение кодов ошибок для взаимодействия с сервисом Яндекс.Диск. + * + * Это перечисление используется для представления различных состояний, которые могут возникнуть + * при взаимодействии с API Яндекс.Диска. Оно включает в себя как успешные, так и ошибочные + * результаты операций. + */ typedef enum { + /** + * @brief + * @ru Операция выполнена успешно, без ошибок. + */ YADISK_OK = 0, + /** + * @brief + * @ru Ошибка при разборе JSON. + * + * Возникает, если полученный от Яндекс.Диска ответ не может быть + * корректно интерпретирован как валидный JSON. + */ YADISK_FAILED_PARSE_JSON = 1, + /** + * @brief + * @ru Ошибка HTTP запроса. + * + * Этот код возвращается, когда происходит сбой в процессе + * отправки запроса или получения ответа от Яндекс.Диска, + * например, из-за проблем с сетевым соединением. + */ YADISK_FAILED_HTTP_REQUEST = 2 } yadisk_code; +/** + * @brief + * @ru Структура для клиента API Яндекс.Диска. + * + * Эта структура используется для хранения данных, необходимых для взаимодействия с API Яндекс.Диска. + */ typedef struct { + /** + * @brief + * @ru OAuth токен для аутентификации в API Яндекс.Диска. + */ char* token; } yadisk_api_client; + +/** + * @brief + * @ru Инициализирует клиента Яндекс.Диска. + * + * Вызывает необходимые процедуры для подготовки клиента к работе с API Яндекс.Диска. + * Эта функция должна быть вызвана перед началом работы с API. + * + * @return + * @ru Код ошибки (0 в случае успеха). + */ int yadisk_init(); + +/** + * @brief + * @ru Освобождает ресурсы, связанные с клиентом Яндекс.Диска. + * + * Эта функция освобождает все ресурсы и выполняет необходимые действия по очистке + * после завершения работы с API Яндекс.Диска. Она должна быть вызвана после + * завершения всех операций с API. + */ void yadisk_cleanup(); #endif //YADISK_YADISK_SHARED_H diff --git a/tests/app.c b/tests/app.c index 57e59ab..f8f4f6b 100644 --- a/tests/app.c +++ b/tests/app.c @@ -36,7 +36,12 @@ int main() } yadisk_disk_info info; - yadisk_get_disk(client, &info); + // yadisk_get_disk_params params1 = {.fields = "total_space"}; + yadisk_code result = yadisk_get_disk(client, NULL, &info); + if (result != YADISK_OK) { + printf("Erorr yadisk_get_disk\n"); + return -1; + } printf("Total disk size: %lu\n", info.total_space); printf("Trash size: %lu\n", info.trash_size); @@ -75,7 +80,10 @@ int main() printf("=================\n"); yadisk_resource_info resource; - yadisk_get_disk_resources(client, "/", &resource); + yadisk_get_disk_resources_params params = { + .path = "/" + }; + yadisk_get_disk_resources(client, ¶ms, &resource); printf("Path: %s\n", resource.path); printf("Name: %s\n", resource.name); printf("Type: %s\n", resource.type);