diff --git a/CMakeLists.txt b/CMakeLists.txt index a96711c..7ad5df5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,8 @@ add_library(mfapi SHARED mfapi/patch.c mfapi/apicalls.c mfapi/apicalls/file_get_info.c + mfapi/apicalls/file_move.c + mfapi/apicalls/file_update.c mfapi/apicalls/user_get_info.c mfapi/apicalls/file_get_links.c mfapi/apicalls/file_delete.c diff --git a/mfapi/apicalls.h b/mfapi/apicalls.h index dd07616..b4f2701 100644 --- a/mfapi/apicalls.h +++ b/mfapi/apicalls.h @@ -58,6 +58,12 @@ int mfconn_api_file_get_info(mfconn * conn, mffile * file, int mfconn_api_file_get_links(mfconn * conn, mffile * file, const char *quickkey); +int mfconn_api_file_move(mfconn * conn, const char *quickkey, + const char *folderkey); + +int mfconn_api_file_update(mfconn * conn, const char *quickkey, + const char *filename); + int mfconn_api_folder_create(mfconn * conn, const char *parent, const char *name); diff --git a/mfapi/apicalls/file_move.c b/mfapi/apicalls/file_move.c new file mode 100644 index 0000000..a884e3a --- /dev/null +++ b/mfapi/apicalls/file_move.c @@ -0,0 +1,89 @@ +/* + * 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_file_move(mfconn * conn, const char *quickkey, + const char *folderkey) +{ + const char *api_call; + int retval; + mfhttp *http; + int i; + + if (conn == NULL) + return -1; + + if (quickkey == NULL) + return -1; + + if (strlen(quickkey) != 15) + return -1; + + for (i = 0; i < mfconn_get_max_num_retries(conn); i++) { + if (folderkey == NULL) { + api_call = mfconn_create_signed_get(conn, 0, "file/move.php", + "?quick_key=%s" + "&response_format=json", + quickkey); + } else { + api_call = mfconn_create_signed_get(conn, 0, "file/move.php", + "?quick_key=%s" + "&folder_key=%s" + "&response_format=json", + quickkey, folderkey); + } + 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, "file/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/file_update.c b/mfapi/apicalls/file_update.c new file mode 100644 index 0000000..2efb2b3 --- /dev/null +++ b/mfapi/apicalls/file_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_file_update(mfconn * conn, const char *quickkey, + const char *filename) +{ + const char *api_call; + int retval; + mfhttp *http; + int i; + + if (conn == NULL) + return -1; + + if (quickkey == NULL) + return -1; + + if (strlen(quickkey) != 15) + return -1; + + if (filename == NULL) + return -1; + + if (strlen(filename) < 3 || strlen(filename) > 255) + return -1; + + for (i = 0; i < mfconn_get_max_num_retries(conn); i++) { + api_call = mfconn_create_signed_get(conn, 0, "file/update.php", + "?quick_key=%s" + "&filename=%s" + "&response_format=json", quickkey, + filename); + 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, "file/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; +}