1 /** 2 * @file megaclient.cpp 3 * @brief sample application, interactive GNU Readline CLI 4 * 5 * (c) 2013 by Mega Limited, Wellsford, New Zealand 6 * 7 * This file is part of the MEGA SDK - Client Access Engine. 8 * 9 * Applications using the MEGA API must present a valid application key 10 * and comply with the the rules set forth in the Terms of Service. 11 * 12 * The MEGA SDK is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15 * 16 * @copyright Simplified (2-clause) BSD License. 17 * 18 * You should have received a copy of the license along with this 19 * program. 20 */ 21 22 #include "mega.h" 23 24 using namespace mega; 25 26 extern MegaClient* client; 27 extern MegaClient* clientFolder; 28 29 extern void megacli(); 30 31 extern void term_init(); 32 extern void term_restore(); 33 extern void term_echo(int); 34 35 extern void read_pw_char(char*, int, int*, char**); 36 37 typedef list<struct AppFile*> appfile_list; 38 39 struct AppFile : public File 40 { 41 // app-internal sequence number for queue management 42 int seqno; 43 44 void progress(); 45 46 appfile_list::iterator appxfer_it; 47 48 AppFile(); 49 }; 50 51 // application-managed GET and PUT queues (only pending and active files) 52 extern appfile_list appxferq[2]; 53 54 struct AppFileGet : public AppFile 55 { 56 void start() override; 57 void update(); 58 void completed(Transfer*, LocalNode*) override; 59 void terminated() override; 60 61 AppFileGet(Node*, handle = UNDEF, byte* = NULL, m_off_t = -1, m_time_t = 0, string* = NULL, string* = NULL, const string& targetfolder = ""); 62 ~AppFileGet(); 63 }; 64 65 struct AppFilePut : public AppFile 66 { 67 void start() override; 68 void update(); 69 void completed(Transfer*, LocalNode*) override; 70 void terminated() override; 71 72 void displayname(string*); 73 74 AppFilePut(const LocalPath&, handle, const char*); 75 ~AppFilePut(); 76 }; 77 78 struct AppReadContext 79 { 80 SymmCipher key; 81 }; 82 83 class TreeProcListOutShares : public TreeProc 84 { 85 public: 86 void proc(MegaClient*, Node*); 87 }; 88 89 struct DemoApp : public MegaApp 90 { 91 FileAccess* newfile(); 92 93 void request_error(error) override; 94 95 void request_response_progress(m_off_t, m_off_t) override; 96 97 void prelogin_result(int version, string* email, string *salt, error e) override; 98 void login_result(error) override; 99 void multifactorauthdisable_result(error) override; 100 void multifactorauthsetup_result(string *code, error e) override; 101 void multifactorauthcheck_result(int enabled) override; 102 103 void ephemeral_result(error) override; 104 void ephemeral_result(handle, const byte*) override; 105 void cancelsignup_result(error) override; 106 107 void whyamiblocked_result(int) override; 108 109 void sendsignuplink_result(error) override; 110 void querysignuplink_result(error) override; 111 void querysignuplink_result(handle, const char*, const char*, const byte*, const byte*, const byte*, size_t) override; 112 void confirmsignuplink_result(error) override; 113 void setkeypair_result(error) override; 114 115 void getrecoverylink_result(error) override; 116 void queryrecoverylink_result(error) override; 117 void queryrecoverylink_result(int type, const char *email, const char *ip, time_t ts, handle uh, const vector<string> *emails) override; 118 void getprivatekey_result(error, const byte *privk, const size_t len_privk) override; 119 void confirmrecoverylink_result(error) override; 120 void confirmcancellink_result(error) override; 121 void validatepassword_result(error) override; 122 void getemaillink_result(error) override; 123 void confirmemaillink_result(error) override; 124 125 void users_updated(User**, int) override; 126 void useralerts_updated(UserAlert::Base** ua, int count) override; 127 void nodes_updated(Node**, int) override; 128 void pcrs_updated(PendingContactRequest**, int) override; 129 void nodes_current() override; 130 void account_updated() override; 131 void notify_confirmation(const char *email) override; 132 133 #ifdef ENABLE_CHAT 134 void chatcreate_result(TextChat *, error) override; 135 void chatinvite_result(error) override; 136 void chatremove_result(error) override; 137 void chaturl_result(string *, error) override; 138 void chatgrantaccess_result(error) override; 139 void chatremoveaccess_result(error) override; 140 virtual void chatupdatepermissions_result(error) override; 141 virtual void chattruncate_result(error) override; 142 virtual void chatsettitle_result(error) override; 143 virtual void chatpresenceurl_result(string *, error) override; 144 void chatlink_result(handle, error) override; 145 void chatlinkclose_result(error) override; 146 void chatlinkurl_result(handle, int, string*, string*, int, m_time_t, error) override; 147 void chatlinkjoin_result(error) override; 148 149 void chats_updated(textchat_map*, int) override; 150 151 static void printChatInformation(TextChat *); 152 static string getPrivilegeString(privilege_t priv); 153 154 void richlinkrequest_result(string*, error) override; 155 #endif 156 157 void setattr_result(handle, error) override; 158 void rename_result(handle, error) override; 159 void unlink_result(handle, error) override; 160 161 void fetchnodes_result(const Error&) override; 162 163 void putnodes_result(error, targettype_t, NewNode*) override; 164 165 void share_result(error) override; 166 void share_result(int, error) override; 167 168 void setpcr_result(handle, error, opcactions_t) override; 169 void updatepcr_result(error, ipcactions_t) override; 170 171 void fa_complete(handle, fatype, const char*, uint32_t) override; 172 int fa_failed(handle, fatype, int, error) override; 173 174 void putfa_result(handle, fatype, error) override; 175 void putfa_result(handle, fatype, const char*) override; 176 177 void removecontact_result(error) override; 178 void putua_result(error) override; 179 void getua_result(error) override; 180 void getua_result(byte*, unsigned, attr_t) override; 181 void getua_result(TLVstore *, attr_t) override; 182 #ifdef DEBUG 183 void delua_result(error) override; 184 void senddevcommand_result(int) override; 185 #endif 186 187 void querytransferquota_result(int) override; 188 189 void account_details(AccountDetails*, bool, bool, bool, bool, bool, bool) override; 190 void account_details(AccountDetails*, error) override; 191 192 // sessionid is undef if all sessions except the current were killed 193 void sessions_killed(handle sessionid, error e) override; 194 195 void exportnode_result(error) override; 196 void exportnode_result(handle, handle) override; 197 198 void openfilelink_result(const Error&) override; 199 void openfilelink_result(handle, const byte*, m_off_t, string*, string*, int) override; 200 201 void folderlinkinfo_result(error, handle, handle, string *, string*, m_off_t, uint32_t, uint32_t, m_off_t, uint32_t) override; 202 203 void checkfile_result(handle, const Error&) override; 204 void checkfile_result(handle, error, byte*, m_off_t, m_time_t, m_time_t, string*, string*, string*) override; 205 206 dstime pread_failure(const Error&, int, void*, dstime) override; 207 bool pread_data(byte*, m_off_t, m_off_t, m_off_t, m_off_t, void*) override; 208 209 void transfer_added(Transfer*) override; 210 void transfer_removed(Transfer*) override; 211 void transfer_prepare(Transfer*) override; 212 void transfer_failed(Transfer*, const Error&, dstime) override; 213 void transfer_update(Transfer*) override; 214 void transfer_complete(Transfer*) override; 215 216 #ifdef ENABLE_SYNC 217 void syncupdate_state(Sync*, syncstate_t) override; 218 void syncupdate_scanning(bool) override; 219 void syncupdate_local_folder_addition(Sync*, LocalNode*, const char*) override; 220 void syncupdate_local_folder_deletion(Sync* , LocalNode*) override; 221 void syncupdate_local_file_addition(Sync*, LocalNode*, const char*) override; 222 void syncupdate_local_file_deletion(Sync*, LocalNode*) override; 223 void syncupdate_local_file_change(Sync*, LocalNode*, const char*) override; 224 void syncupdate_local_move(Sync*, LocalNode*, const char*) override; 225 void syncupdate_local_lockretry(bool) override; 226 void syncupdate_get(Sync*, Node*, const char*) override; 227 void syncupdate_put(Sync*, LocalNode*, const char*) override; 228 void syncupdate_remote_file_addition(Sync*, Node*) override; 229 void syncupdate_remote_file_deletion(Sync*, Node*) override; 230 void syncupdate_remote_folder_addition(Sync*, Node*) override; 231 void syncupdate_remote_folder_deletion(Sync*, Node*) override; 232 void syncupdate_remote_copy(Sync*, const char*) override; 233 void syncupdate_remote_move(Sync*, Node*, Node*) override; 234 void syncupdate_remote_rename(Sync*, Node*, const char*) override; 235 void syncupdate_treestate(LocalNode*) override; 236 237 bool sync_syncable(Sync*, const char*, LocalPath&, Node*) override; 238 bool sync_syncable(Sync*, const char*, LocalPath&) override; 239 #endif 240 241 void changepw_result(error) override; 242 243 void userattr_update(User*, int, const char*) override; 244 void resetSmsVerifiedPhoneNumber_result(error e) override; 245 246 void enumeratequotaitems_result(unsigned, handle, unsigned, int, int, unsigned, unsigned, unsigned, const char*, const char*, const char*, const char*) override; 247 void enumeratequotaitems_result(error) override; 248 void additem_result(error) override; 249 void checkout_result(const char*, error) override; 250 251 void getmegaachievements_result(AchievementsDetails*, error) override; 252 void getwelcomepdf_result(handle, string*, error) override; 253 254 void contactlinkcreate_result(error, handle) override; 255 void contactlinkquery_result(error, handle, string*, string*, string*, string*) override; 256 void contactlinkdelete_result(error) override; 257 258 void smsverificationsend_result(error); 259 void smsverificationcheck_result(error, string*); 260 261 void reload(const char*) override; 262 void clearing() override; 263 264 void notify_retry(dstime, retryreason_t) override; 265 266 string getExtraInfoErrorString(const Error&); 267 }; 268 269 struct DemoAppFolder : public DemoApp 270 { 271 void login_result(error); 272 void fetchnodes_result(const Error&); 273 274 void nodes_updated(Node **, int); users_updatedDemoAppFolder275 void users_updated(User**, int) {} pcrs_updatedDemoAppFolder276 void pcrs_updated(PendingContactRequest**, int) {} 277 }; 278 279 #include <mega/autocomplete.h> 280 281 void exec_apiurl(autocomplete::ACState& s); 282 void exec_login(autocomplete::ACState& s); 283 void exec_begin(autocomplete::ACState& s); 284 void exec_signup(autocomplete::ACState& s); 285 void exec_cancelsignup(autocomplete::ACState& s); 286 void exec_confirm(autocomplete::ACState& s); 287 void exec_session(autocomplete::ACState& s); 288 void exec_mount(autocomplete::ACState& s); 289 void exec_ls(autocomplete::ACState& s); 290 void exec_cd(autocomplete::ACState& s); 291 void exec_pwd(autocomplete::ACState& s); 292 void exec_lcd(autocomplete::ACState& s); 293 void exec_lls(autocomplete::ACState& s); 294 void exec_lpwd(autocomplete::ACState& s); 295 void exec_lmkdir(autocomplete::ACState& s); 296 void exec_import(autocomplete::ACState& s); 297 void exec_folderlinkinfo(autocomplete::ACState& s); 298 void exec_open(autocomplete::ACState& s); 299 void exec_put(autocomplete::ACState& s); 300 void exec_putq(autocomplete::ACState& s); 301 void exec_get(autocomplete::ACState& s); 302 void exec_getq(autocomplete::ACState& s); 303 void exec_pause(autocomplete::ACState& s); 304 void exec_getfa(autocomplete::ACState& s); 305 void exec_mediainfo(autocomplete::ACState& s); 306 void exec_smsverify(autocomplete::ACState& s); 307 void exec_verifiedphonenumber(autocomplete::ACState& s); 308 void exec_mkdir(autocomplete::ACState& s); 309 void exec_rm(autocomplete::ACState& s); 310 void exec_mv(autocomplete::ACState& s); 311 void exec_cp(autocomplete::ACState& s); 312 void exec_du(autocomplete::ACState& s); 313 void exec_sync(autocomplete::ACState& s); 314 void exec_syncconfig(autocomplete::ACState& s); 315 void exec_export(autocomplete::ACState& s); 316 void exec_share(autocomplete::ACState& s); 317 void exec_invite(autocomplete::ACState& s); 318 void exec_clink(autocomplete::ACState& s); 319 void exec_ipc(autocomplete::ACState& s); 320 void exec_showpcr(autocomplete::ACState& s); 321 void exec_users(autocomplete::ACState& s); 322 void exec_getua(autocomplete::ACState& s); 323 void exec_putua(autocomplete::ACState& s); 324 void exec_delua(autocomplete::ACState& s); 325 void exec_alerts(autocomplete::ACState& s); 326 void exec_recentactions(autocomplete::ACState& s); 327 void exec_recentnodes(autocomplete::ACState& s); 328 void exec_putbps(autocomplete::ACState& s); 329 void exec_killsession(autocomplete::ACState& s); 330 void exec_whoami(autocomplete::ACState& s); 331 void exec_verifycredentials(autocomplete::ACState& s); 332 void exec_passwd(autocomplete::ACState& s); 333 void exec_reset(autocomplete::ACState& s); 334 void exec_recover(autocomplete::ACState& s); 335 void exec_cancel(autocomplete::ACState& s); 336 void exec_email(autocomplete::ACState& s); 337 void exec_retry(autocomplete::ACState& s); 338 void exec_recon(autocomplete::ACState& s); 339 void exec_reload(autocomplete::ACState& s); 340 void exec_logout(autocomplete::ACState& s); 341 void exec_locallogout(autocomplete::ACState& s); 342 void exec_symlink(autocomplete::ACState& s); 343 void exec_version(autocomplete::ACState& s); 344 void exec_debug(autocomplete::ACState& s); 345 void exec_verbose(autocomplete::ACState& s); 346 void exec_clear(autocomplete::ACState& s); 347 void exec_codepage(autocomplete::ACState& s); 348 void exec_log(autocomplete::ACState& s); 349 void exec_test(autocomplete::ACState& s); 350 void exec_chats(autocomplete::ACState& s); 351 void exec_chatc(autocomplete::ACState& s); 352 void exec_chati(autocomplete::ACState& s); 353 void exec_chatcp(autocomplete::ACState& s); 354 void exec_chatr(autocomplete::ACState& s); 355 void exec_chatu(autocomplete::ACState& s); 356 void exec_chatup(autocomplete::ACState& s); 357 void exec_chatpu(autocomplete::ACState& s); 358 void exec_chatga(autocomplete::ACState& s); 359 void exec_chatra(autocomplete::ACState& s); 360 void exec_chatst(autocomplete::ACState& s); 361 void exec_chata(autocomplete::ACState& s); 362 void exec_chatl(autocomplete::ACState& s); 363 void exec_chatsm(autocomplete::ACState& s); 364 void exec_chatlu(autocomplete::ACState& s); 365 void exec_chatlj(autocomplete::ACState& s); 366 void exec_enabletransferresumption(autocomplete::ACState& s); 367 void exec_setmaxdownloadspeed(autocomplete::ACState& s); 368 void exec_setmaxuploadspeed(autocomplete::ACState& s); 369 void exec_handles(autocomplete::ACState& s); 370 void exec_httpsonly(autocomplete::ACState& s); 371 void exec_mfac(autocomplete::ACState& s); 372 void exec_mfae(autocomplete::ACState& s); 373 void exec_mfad(autocomplete::ACState& s); 374 void exec_autocomplete(autocomplete::ACState& s); 375 void exec_history(autocomplete::ACState& s); 376 void exec_help(autocomplete::ACState& s); 377 void exec_quit(autocomplete::ACState& s); 378 void exec_find(autocomplete::ACState& s); 379 #ifdef USE_FILESYSTEM 380 void exec_treecompare(autocomplete::ACState& s); 381 void exec_querytransferquota(autocomplete::ACState& s); 382 #endif 383 void exec_metamac(autocomplete::ACState& s); 384 void exec_resetverifiedphonenumber(autocomplete::ACState& s); 385