From 90b2bfa332570b9f16e9a63bf78e74d4c6a66d0c Mon Sep 17 00:00:00 2001 From: josch Date: Fri, 19 Dec 2014 08:57:11 +0100 Subject: [PATCH] add new api calls: folder/move and folder/update --- CMakeLists.txt | 2 + mfapi/apicalls.h | 7 +++ mfapi/apicalls/folder_move.c | 90 ++++++++++++++++++++++++++++++++++ mfapi/apicalls/folder_update.c | 88 +++++++++++++++++++++++++++++++++ 4 files changed, 187 insertions(+) create mode 100644 mfapi/apicalls/folder_move.c create mode 100644 mfapi/apicalls/folder_update.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ad5df5..db5f4dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,8 @@ add_library(mfapi SHARED mfapi/apicalls/folder_create.c mfapi/apicalls/folder_get_content.c mfapi/apicalls/folder_delete.c + mfapi/apicalls/folder_move.c + mfapi/apicalls/folder_update.c mfapi/apicalls/device_get_status.c mfapi/apicalls/device_get_changes.c mfapi/apicalls/device_get_patch.c diff --git a/mfapi/apicalls.h b/mfapi/apicalls.h index b4f2701..1585e23 100644 --- a/mfapi/apicalls.h +++ b/mfapi/apicalls.h @@ -75,6 +75,13 @@ long mfconn_api_folder_get_content(mfconn * conn, const int mode, int mfconn_api_folder_get_info(mfconn * conn, mffolder * folder, const char *folderkey); +int mfconn_api_folder_move(mfconn * conn, + const char *folder_key_src, + const char *folder_key_dst); + +int mfconn_api_folder_update(mfconn * conn, const char *folder_key, + const char *foldername); + int mfconn_api_user_get_info(mfconn * conn); int mfconn_api_user_get_session_token(mfconn * conn, diff --git a/mfapi/apicalls/folder_move.c b/mfapi/apicalls/folder_move.c new file mode 100644 index 0000000..f6d5e69 --- /dev/null +++ b/mfapi/apicalls/folder_move.c @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2013 Bryan Christ + * 2014 Johannes Schauer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2, as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include + +#include "../../utils/http.h" +#include "../mfconn.h" +#include "../apicalls.h" // IWYU pragma: keep + +int mfconn_api_folder_move(mfconn * conn, const char *folder_key_src, + const char *folder_key_dst) +{ + const char *api_call; + int retval; + mfhttp *http; + int i; + + if (conn == NULL) + return -1; + + if (folder_key_src == NULL) + return -1; + + if (strlen(folder_key_src) != 13) + return -1; + + for (i = 0; i < mfconn_get_max_num_retries(conn); i++) { + if (folder_key_src == NULL) { + api_call = mfconn_create_signed_get(conn, 0, "folder/move.php", + "?folder_key_src=%s" + "&response_format=json", + folder_key_src); + } else { + api_call = mfconn_create_signed_get(conn, 0, "folder/move.php", + "?folder_key_src=%s" + "&folderkey_dst=%s" + "&response_format=json", + folder_key_src, + folder_key_dst); + } + if (api_call == NULL) { + fprintf(stderr, "mfconn_create_signed_get failed\n"); + return -1; + } + + http = http_create(); + retval = + http_get_buf(http, api_call, mfapi_decode_common, "folder/move"); + http_destroy(http); + mfconn_update_secret_key(conn); + + free((void *)api_call); + + if (retval != 127 && retval != 28) + break; + + // if there was either a curl timeout or a token error, get a new + // token and try again + // + // on a curl timeout we get a new token because it is likely that we + // lost signature synchronization (we don't know whether the server + // accepted or rejected the last call) + fprintf(stderr, "got error %d - negotiate a new token\n", retval); + retval = mfconn_refresh_token(conn); + if (retval != 0) { + fprintf(stderr, "failed to get a new token\n"); + break; + } + } + + return retval; +} diff --git a/mfapi/apicalls/folder_update.c b/mfapi/apicalls/folder_update.c new file mode 100644 index 0000000..591894a --- /dev/null +++ b/mfapi/apicalls/folder_update.c @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2013 Bryan Christ + * 2014 Johannes Schauer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2, as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include + +#include "../../utils/http.h" +#include "../mfconn.h" +#include "../apicalls.h" // IWYU pragma: keep + +int mfconn_api_folder_update(mfconn * conn, const char *folder_key, + const char *foldername) +{ + const char *api_call; + int retval; + mfhttp *http; + int i; + + if (conn == NULL) + return -1; + + if (folder_key == NULL) + return -1; + + if (strlen(folder_key) != 13) + return -1; + + if (foldername == NULL) + return -1; + + if (strlen(foldername) < 3 || strlen(foldername) > 255) + return -1; + + for (i = 0; i < mfconn_get_max_num_retries(conn); i++) { + api_call = mfconn_create_signed_get(conn, 0, "folder/update.php", + "?folder_key=%s" + "&foldername=%s" + "&response_format=json", + folder_key, foldername); + if (api_call == NULL) { + fprintf(stderr, "mfconn_create_signed_get failed\n"); + return -1; + } + + http = http_create(); + retval = + http_get_buf(http, api_call, mfapi_decode_common, "folder/update"); + http_destroy(http); + mfconn_update_secret_key(conn); + + free((void *)api_call); + + if (retval != 127 && retval != 28) + break; + + // if there was either a curl timeout or a token error, get a new + // token and try again + // + // on a curl timeout we get a new token because it is likely that we + // lost signature synchronization (we don't know whether the server + // accepted or rejected the last call) + fprintf(stderr, "got error %d - negotiate a new token\n", retval); + retval = mfconn_refresh_token(conn); + if (retval != 0) { + fprintf(stderr, "failed to get a new token\n"); + break; + } + } + + return retval; +}