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

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/
/cmake-build-debug/
/doc/

View File

@ -16,7 +16,6 @@
* 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>.
*/
#ifndef YADISK_YADISK_H
#define YADISK_YADISK_H

View File

@ -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);

View File

@ -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) \

View File

@ -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));

View File

@ -18,12 +18,19 @@
* 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>.
*/
/**
* @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

View File

@ -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;

View File

@ -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

View File

@ -18,7 +18,9 @@
* 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>.
*/
/**
* @file
*/
#ifndef YADISK_YADISK_SHARED_H
#define YADISK_YADISK_SHARED_H
@ -26,17 +28,74 @@
#include <curl/curl.h>
#include <json.h>
/**
* @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

View File

@ -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, &params, &resource);
printf("Path: %s\n", resource.path);
printf("Name: %s\n", resource.name);
printf("Type: %s\n", resource.type);