добавлена документация

This commit is contained in:
Maxim Slipenko 2024-01-23 11:42:31 +03:00
parent 7efbd654b7
commit 5bc1c8de68
10 changed files with 224 additions and 41 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/.idea/ /.idea/
/cmake-build-debug/ /cmake-build-debug/
/doc/

View File

@ -16,7 +16,6 @@
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>. * along with this program. If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
*/ */
#ifndef YADISK_YADISK_H #ifndef YADISK_YADISK_H
#define YADISK_YADISK_H #define YADISK_YADISK_H

View File

@ -114,6 +114,7 @@ int api_http_request(
} else { } else {
snprintf(url, sizeof(url), "%s%s", YANDEX_DISK_API_HOST, path); 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_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cb); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);

View File

@ -43,10 +43,11 @@ int api_http_request(yadisk_api_client* client,
#define __DANGER_GET_JSON_OBJECT(root, key) \ #define __DANGER_GET_JSON_OBJECT(root, key) \
json_object* obj = NULL; \ json_object* obj = NULL; \
if (!json_object_object_get_ex(root, key, &obj)){\ if (!json_object_object_get_ex(root, key, &obj)){ \
json_object_put(root); \ }
THROW_PARSE_JSON_ERROR \
} \ // json_object_put(root);
// THROW_PARSE_JSON_ERROR
#define GET_JSON_STRING(root, key, v) { \ #define GET_JSON_STRING(root, key, v) { \
__DANGER_GET_JSON_OBJECT(root, key) \ __DANGER_GET_JSON_OBJECT(root, key) \

View File

@ -22,10 +22,23 @@
#include "yadisk_get_disk.h" #include "yadisk_get_disk.h"
#include "yadisk_api_internal.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; 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) { if (error) {
return YADISK_FAILED_HTTP_REQUEST; return YADISK_FAILED_HTTP_REQUEST;
} }
@ -40,20 +53,25 @@ yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_disk_info* info)
GET_JSON_BOOL(root, "is_paid", &(info->is_paid)); GET_JSON_BOOL(root, "is_paid", &(info->is_paid));
json_object *user_object; json_object *user_object;
if (!json_object_object_get_ex(root, "user", &user_object)) if (!json_object_object_get_ex(root, "user", &user_object)) {
THROW_PARSE_JSON_ERROR // THROW_PARSE_JSON_ERROR
}
if (user_object) {
GET_JSON_STRING(user_object, "reg_time", &(info->user.reg_time)); 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, "display_name", &(info->user.display_name));
GET_JSON_STRING(user_object, "uid", &(info->user.uid)); GET_JSON_STRING(user_object, "uid", &(info->user.uid));
GET_JSON_STRING(user_object, "country", &(info->user.country)); GET_JSON_STRING(user_object, "country", &(info->user.country));
GET_JSON_BOOL(user_object, "is_child", &(info->user.is_child)); GET_JSON_BOOL(user_object, "is_child", &(info->user.is_child));
GET_JSON_STRING(user_object, "login", &(info->user.login)); GET_JSON_STRING(user_object, "login", &(info->user.login));
}
json_object *system_folders; json_object *system_folders;
if (!json_object_object_get_ex(root, "system_folders", &system_folders)) if (!json_object_object_get_ex(root, "system_folders", &system_folders)) {
THROW_PARSE_JSON_ERROR // THROW_PARSE_JSON_ERROR
}
if (system_folders) {
GET_JSON_STRING(system_folders, "odnoklassniki", &(info->system_folders.odnoklassniki)); 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, "google", &(info->system_folders.google));
GET_JSON_STRING(system_folders, "instagram", &(info->system_folders.instagram)); GET_JSON_STRING(system_folders, "instagram", &(info->system_folders.instagram));
@ -69,6 +87,7 @@ yadisk_code yadisk_get_disk(yadisk_api_client* client, yadisk_disk_info* info)
GET_JSON_STRING(system_folders, "photostream", &(info->system_folders.photostream)); 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, "screenshots", &(info->system_folders.screenshots));
GET_JSON_STRING(system_folders, "scans", &(info->system_folders.scans)); GET_JSON_STRING(system_folders, "scans", &(info->system_folders.scans));
}
GET_JSON_BOOL(root, "unlimited_autoupload_enabled", &(info->unlimited_autoupload_enabled)); GET_JSON_BOOL(root, "unlimited_autoupload_enabled", &(info->unlimited_autoupload_enabled));
GET_JSON_UINT64(root, "revision", &(info->revision)); GET_JSON_UINT64(root, "revision", &(info->revision));

View File

@ -18,12 +18,19 @@
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>. * along with this program. If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
*/ */
/**
* @file
*/
#ifndef YADISK_YADISK_GET_DISK_H #ifndef YADISK_YADISK_GET_DISK_H
#define YADISK_YADISK_GET_DISK_H #define YADISK_YADISK_GET_DISK_H
#include "yadisk_shared.h" #include "yadisk_shared.h"
/**
* @brief
* @en User info
* @ru Информация о пользователе
*/
typedef struct { typedef struct {
const char* reg_time; const char* reg_time;
const char* display_name; const char* display_name;
@ -33,6 +40,11 @@ typedef struct {
const char* login; const char* login;
} yadisk_user_info; } yadisk_user_info;
/**
* @brief
* @en System folders paths
* @ru Пути системных папок
*/
typedef struct { typedef struct {
const char* odnoklassniki; const char* odnoklassniki;
const char* google; const char* google;
@ -51,18 +63,90 @@ typedef struct {
const char* scans; const char* scans;
} yadisk_system_folders; } yadisk_system_folders;
/**
* @brief
* @en Information about the disk
* @ru Информация о диске
*/
typedef struct yadisk_disk_info { typedef struct yadisk_disk_info {
/**
* @brief
* @en Total space
* @ru Общий объем
*/
unsigned long total_space; unsigned long total_space;
/**
* @brief
* @en Trash size
* @ru Объем корзины
*/
unsigned long trash_size; unsigned long trash_size;
/**
* @brief
* @en Used space
* @ru Использованный объем
*/
unsigned long used_space; unsigned long used_space;
/**
* @brief
* @en Is paid tariff
* @ru Платный ли тариф
*/
int is_paid; int is_paid;
/**
* @brief
* @en Registration date
* @ru Дата регистрации
*/
const char* reg_time; const char* reg_time;
/**
* @brief
* @en System folders paths
* @ru Пути системных папок
*/
yadisk_system_folders system_folders; yadisk_system_folders system_folders;
/**
* @brief
* @en Info about user
* @ru Информация о пользователе
*/
yadisk_user_info user; yadisk_user_info user;
/**
* @brief
* @en Unlimited autoupload
* @ru Безлимитная автозагрузка
*/
int unlimited_autoupload_enabled; int unlimited_autoupload_enabled;
/**
* @brief
* @en Revision
* @ru Ревизия
*/
unsigned long revision; unsigned long revision;
} yadisk_disk_info; } 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 #endif //YADISK_YADISK_GET_DISK_H

View File

@ -22,7 +22,7 @@
yadisk_code yadisk_code
yadisk_get_disk_resources( 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; char* output = NULL;

View File

@ -65,6 +65,7 @@ struct yadisk_resource_item {
}; };
typedef struct { typedef struct {
/** Массив элементов */
struct yadisk_resource_item* items; // Массив элементов struct yadisk_resource_item* items; // Массив элементов
unsigned long items_count; // Количество элементов unsigned long items_count; // Количество элементов
unsigned long limit; unsigned long limit;
@ -79,6 +80,16 @@ typedef struct {
const yadisk_resource_embedded* _embedded; const yadisk_resource_embedded* _embedded;
} yadisk_resource_info; } 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 #endif // YADISK_GET_DISK_RESOURCES_H_INCLUDED

View File

@ -18,7 +18,9 @@
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>. * along with this program. If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
*/ */
/**
* @file
*/
#ifndef YADISK_YADISK_SHARED_H #ifndef YADISK_YADISK_SHARED_H
#define YADISK_YADISK_SHARED_H #define YADISK_YADISK_SHARED_H
@ -26,17 +28,74 @@
#include <curl/curl.h> #include <curl/curl.h>
#include <json.h> #include <json.h>
/**
* @brief
* @ru Определение кодов ошибок для взаимодействия с сервисом Яндекс.Диск.
*
* Это перечисление используется для представления различных состояний, которые могут возникнуть
* при взаимодействии с API Яндекс.Диска. Оно включает в себя как успешные, так и ошибочные
* результаты операций.
*/
typedef enum { typedef enum {
/**
* @brief
* @ru Операция выполнена успешно, без ошибок.
*/
YADISK_OK = 0, YADISK_OK = 0,
/**
* @brief
* @ru Ошибка при разборе JSON.
*
* Возникает, если полученный от Яндекс.Диска ответ не может быть
* корректно интерпретирован как валидный JSON.
*/
YADISK_FAILED_PARSE_JSON = 1, YADISK_FAILED_PARSE_JSON = 1,
/**
* @brief
* @ru Ошибка HTTP запроса.
*
* Этот код возвращается, когда происходит сбой в процессе
* отправки запроса или получения ответа от Яндекс.Диска,
* например, из-за проблем с сетевым соединением.
*/
YADISK_FAILED_HTTP_REQUEST = 2 YADISK_FAILED_HTTP_REQUEST = 2
} yadisk_code; } yadisk_code;
/**
* @brief
* @ru Структура для клиента API Яндекс.Диска.
*
* Эта структура используется для хранения данных, необходимых для взаимодействия с API Яндекс.Диска.
*/
typedef struct { typedef struct {
/**
* @brief
* @ru OAuth токен для аутентификации в API Яндекс.Диска.
*/
char* token; char* token;
} yadisk_api_client; } yadisk_api_client;
/**
* @brief
* @ru Инициализирует клиента Яндекс.Диска.
*
* Вызывает необходимые процедуры для подготовки клиента к работе с API Яндекс.Диска.
* Эта функция должна быть вызвана перед началом работы с API.
*
* @return
* @ru Код ошибки (0 в случае успеха).
*/
int yadisk_init(); int yadisk_init();
/**
* @brief
* @ru Освобождает ресурсы, связанные с клиентом Яндекс.Диска.
*
* Эта функция освобождает все ресурсы и выполняет необходимые действия по очистке
* после завершения работы с API Яндекс.Диска. Она должна быть вызвана после
* завершения всех операций с API.
*/
void yadisk_cleanup(); void yadisk_cleanup();
#endif //YADISK_YADISK_SHARED_H #endif //YADISK_YADISK_SHARED_H

View File

@ -36,7 +36,12 @@ int main()
} }
yadisk_disk_info info; 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("Total disk size: %lu\n", info.total_space);
printf("Trash size: %lu\n", info.trash_size); printf("Trash size: %lu\n", info.trash_size);
@ -75,7 +80,10 @@ int main()
printf("=================\n"); printf("=================\n");
yadisk_resource_info resource; yadisk_resource_info resource;
yadisk_get_disk_resources(client, "/", &resource); yadisk_get_disk_resources_params params = {
.path = "/"
};
yadisk_get_disk_resources(client, &params, &resource);
printf("Path: %s\n", resource.path); printf("Path: %s\n", resource.path);
printf("Name: %s\n", resource.name); printf("Name: %s\n", resource.name);
printf("Type: %s\n", resource.type); printf("Type: %s\n", resource.type);