1/**
2 * @file MEGASdk.mm
3 * @brief Allows to control a MEGA account or a shared folder
4 *
5 * (c) 2013-2014 by Mega Limited, Auckland, 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#import "MEGASdk.h"
23#import "megaapi.h"
24#import "MEGANode+init.h"
25#import "MEGAUser+init.h"
26#import "MEGATransfer+init.h"
27#import "MEGATransferList+init.h"
28#import "MEGANodeList+init.h"
29#import "MEGAUserList+init.h"
30#import "MEGAUserAlertList+init.h"
31#import "MEGAError+init.h"
32#import "MEGAShareList+init.h"
33#import "MEGAContactRequest+init.h"
34#import "MEGAContactRequestList+init.h"
35#import "MEGAChildrenLists+init.h"
36#import "MEGARecentActionBucket+init.h"
37#import "MEGABackgroundMediaUpload+init.h"
38#import "DelegateMEGARequestListener.h"
39#import "DelegateMEGATransferListener.h"
40#import "DelegateMEGAGlobalListener.h"
41#import "DelegateMEGAListener.h"
42#import "DelegateMEGALoggerListener.h"
43#import "DelegateMEGATreeProcessorListener.h"
44#import "MEGAFileInputStream.h"
45#import "MEGADataInputStream.h"
46#import "MEGACancelToken+init.h"
47#import "MEGAPushNotificationSettings+init.h"
48
49#import <set>
50#import <pthread.h>
51
52using namespace mega;
53
54@interface MEGASdk () {
55    pthread_mutex_t listenerMutex;
56}
57
58@property (nonatomic, assign) std::set<DelegateMEGARequestListener *>activeRequestListeners;
59@property (nonatomic, assign) std::set<DelegateMEGATransferListener *>activeTransferListeners;
60@property (nonatomic, assign) std::set<DelegateMEGAGlobalListener *>activeGlobalListeners;
61@property (nonatomic, assign) std::set<DelegateMEGAListener *>activeMegaListeners;
62@property (nonatomic, assign) std::set<DelegateMEGALoggerListener *>activeLoggerListeners;
63
64- (MegaRequestListener *)createDelegateMEGARequestListener:(id<MEGARequestDelegate>)delegate singleListener:(BOOL)singleListener;
65- (MegaTransferListener *)createDelegateMEGATransferListener:(id<MEGATransferDelegate>)delegate singleListener:(BOOL)singleListener;
66- (MegaGlobalListener *)createDelegateMEGAGlobalListener:(id<MEGAGlobalDelegate>)delegate;
67- (MegaListener *)createDelegateMEGAListener:(id<MEGADelegate>)delegate;
68- (MegaLogger *)createDelegateMegaLogger:(id<MEGALoggerDelegate>)delegate;
69
70@property MegaApi *megaApi;
71
72@end
73
74@implementation MEGASdk
75
76#pragma mark - Properties
77
78- (NSString *)myEmail {
79    const char *val = self.megaApi->getMyEmail();
80    if (!val) return nil;
81
82    NSString *ret = [[NSString alloc] initWithUTF8String:val];
83
84    delete [] val;
85    return ret;
86}
87
88- (MEGANode *)rootNode {
89    MegaNode *node = self.megaApi->getRootNode();
90    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
91}
92
93- (MEGANode *)rubbishNode {
94    MegaNode *node = self.megaApi->getRubbishNode();
95    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
96}
97
98- (MEGANode *)inboxNode {
99    MegaNode *node = self.megaApi->getInboxNode();
100    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
101}
102
103- (MEGATransferList *)transfers {
104    return [[MEGATransferList alloc] initWithTransferList:self.megaApi->getTransfers() cMemoryOwn:YES];
105}
106
107- (MEGATransferList *)downloadTransfers {
108    return [[MEGATransferList alloc] initWithTransferList:self.megaApi->getTransfers(MegaTransfer::TYPE_DOWNLOAD) cMemoryOwn:YES];
109}
110
111- (MEGATransferList *)uploadTransfers {
112    return [[MEGATransferList alloc] initWithTransferList:self.megaApi->getTransfers(MegaTransfer::TYPE_UPLOAD) cMemoryOwn:YES];
113}
114
115- (Retry)waiting {
116    return (Retry) self.megaApi->isWaiting();
117}
118
119- (NSNumber *)totalsDownloadedBytes {
120    return [[NSNumber alloc] initWithLongLong:self.megaApi->getTotalDownloadedBytes()];
121}
122
123- (NSNumber *)totalsUploadedBytes {
124    return [[NSNumber alloc] initWithLongLong:self.megaApi->getTotalUploadedBytes()];
125}
126
127- (NSUInteger)totalNodes {
128    return self.megaApi->getNumNodes();
129}
130
131- (NSString *)masterKey {
132    const char *val = self.megaApi->exportMasterKey();
133    if (!val) return nil;
134
135    NSString *ret = [[NSString alloc] initWithUTF8String:val];
136
137    delete [] val;
138    return ret;
139}
140
141- (NSString *)userAgent {
142    const char *val = self.megaApi->getUserAgent();
143    if (!val) return nil;
144
145    NSString *ret = [[NSString alloc] initWithUTF8String:val];
146
147    return ret;
148}
149
150- (MEGAUser *)myUser {
151    MegaUser *user = self.megaApi->getMyUser();
152    return user ? [[MEGAUser alloc] initWithMegaUser:user cMemoryOwn:YES] : nil;
153}
154
155- (BOOL)isAchievementsEnabled {
156    return self.megaApi->isAchievementsEnabled();
157}
158
159#pragma mark - Business
160
161- (BOOL)isBusinessAccount {
162    return self.megaApi->isBusinessAccount();
163}
164
165- (BOOL)isMasterBusinessAccount {
166    return self.megaApi->isMasterBusinessAccount();
167}
168
169- (BOOL)isBusinessAccountActive {
170    return self.megaApi->isBusinessAccountActive();
171}
172
173- (BusinessStatus)businessStatus {
174    return (BusinessStatus) self.megaApi->getBusinessStatus();
175}
176
177- (NSInteger)numUnreadUserAlerts {
178    return self.megaApi->getNumUnreadUserAlerts();
179}
180
181- (long long)bandwidthOverquotaDelay {
182    return self.megaApi->getBandwidthOverquotaDelay();
183}
184
185#pragma mark - Init
186
187- (instancetype)initWithAppKey:(NSString *)appKey userAgent:(NSString *)userAgent {
188    self.megaApi = new MegaApi((appKey != nil) ? [appKey UTF8String] : (const char *)NULL, (const char *)NULL, (userAgent != nil) ? [userAgent UTF8String] : (const char *)NULL);
189
190    if (pthread_mutex_init(&listenerMutex, NULL)) {
191        return nil;
192    }
193
194    return self;
195}
196
197- (instancetype)initWithAppKey:(NSString *)appKey userAgent:(NSString *)userAgent basePath:(NSString *)basePath {
198    self.megaApi = new MegaApi((appKey != nil) ? [appKey UTF8String] : (const char *)NULL, (basePath != nil) ? [basePath UTF8String] : (const char*)NULL, (userAgent != nil) ? [userAgent UTF8String] : (const char *)NULL);
199
200    if (pthread_mutex_init(&listenerMutex, NULL)) {
201        return nil;
202    }
203
204    return self;
205}
206
207- (void)dealloc {
208    delete _megaApi;
209    pthread_mutex_destroy(&listenerMutex);
210}
211
212- (MegaApi *)getCPtr {
213    return _megaApi;
214}
215
216#pragma mark - Add and remove delegates
217
218- (void)addMEGADelegate:(id<MEGADelegate>)delegate {
219    self.megaApi->addListener([self createDelegateMEGAListener:delegate]);
220}
221
222- (void)addMEGARequestDelegate:(id<MEGARequestDelegate>)delegate {
223    self.megaApi->addRequestListener([self createDelegateMEGARequestListener:delegate singleListener:NO]);
224}
225
226- (void)addMEGATransferDelegate:(id<MEGATransferDelegate>)delegate {
227    self.megaApi->addTransferListener([self createDelegateMEGATransferListener:delegate singleListener:NO]);
228}
229
230- (void)addMEGAGlobalDelegate:(id<MEGAGlobalDelegate>)delegate {
231    self.megaApi->addGlobalListener([self createDelegateMEGAGlobalListener:delegate]);
232}
233
234- (void)removeMEGADelegate:(id<MEGADelegate>)delegate {
235    std::vector<DelegateMEGAListener *> listenersToRemove;
236
237    pthread_mutex_lock(&listenerMutex);
238    std::set<DelegateMEGAListener *>::iterator it = _activeMegaListeners.begin();
239    while (it != _activeMegaListeners.end()) {
240        DelegateMEGAListener *delegateListener = *it;
241        if (delegateListener->getUserListener() == delegate) {
242            listenersToRemove.push_back(delegateListener);
243            _activeMegaListeners.erase(it++);
244        }
245        else {
246            it++;
247        }
248    }
249    pthread_mutex_unlock(&listenerMutex);
250
251    for (int i = 0; i < listenersToRemove.size(); i++)
252    {
253        self.megaApi->removeListener(listenersToRemove[i]);
254        delete listenersToRemove[i];
255    }
256}
257
258- (void)removeMEGARequestDelegate:(id<MEGARequestDelegate>)delegate {
259    std::vector<DelegateMEGARequestListener *> listenersToRemove;
260
261    pthread_mutex_lock(&listenerMutex);
262    std::set<DelegateMEGARequestListener *>::iterator it = _activeRequestListeners.begin();
263    while (it != _activeRequestListeners.end()) {
264        DelegateMEGARequestListener *delegateListener = *it;
265        if (delegateListener->getUserListener() == delegate) {
266            listenersToRemove.push_back(delegateListener);
267            _activeRequestListeners.erase(it++);
268        }
269        else {
270            it++;
271        }
272    }
273    pthread_mutex_unlock(&listenerMutex);
274
275    for (int i = 0; i < listenersToRemove.size(); i++)
276    {
277        self.megaApi->removeRequestListener(listenersToRemove[i]);
278        delete listenersToRemove[i];
279    }
280}
281
282- (void)removeMEGATransferDelegate:(id<MEGATransferDelegate>)delegate {
283    std::vector<DelegateMEGATransferListener *> listenersToRemove;
284
285    pthread_mutex_lock(&listenerMutex);
286    std::set<DelegateMEGATransferListener *>::iterator it = _activeTransferListeners.begin();
287    while (it != _activeTransferListeners.end()) {
288        DelegateMEGATransferListener *delegateListener = *it;
289        if (delegateListener->getUserListener() == delegate) {
290            listenersToRemove.push_back(delegateListener);
291            _activeTransferListeners.erase(it++);
292        }
293        else {
294            it++;
295        }
296    }
297    pthread_mutex_unlock(&listenerMutex);
298
299    for (int i = 0; i < listenersToRemove.size(); i++)
300    {
301        self.megaApi->removeTransferListener(listenersToRemove[i]);
302        delete listenersToRemove[i];
303    }
304}
305
306- (void)removeMEGAGlobalDelegate:(id<MEGAGlobalDelegate>)delegate {
307    std::vector<DelegateMEGAGlobalListener *> listenersToRemove;
308
309    pthread_mutex_lock(&listenerMutex);
310    std::set<DelegateMEGAGlobalListener *>::iterator it = _activeGlobalListeners.begin();
311    while (it != _activeGlobalListeners.end()) {
312        DelegateMEGAGlobalListener *delegateListener = *it;
313        if (delegateListener->getUserListener() == delegate) {
314            listenersToRemove.push_back(delegateListener);
315            _activeGlobalListeners.erase(it++);
316        }
317        else {
318            it++;
319        }
320    }
321    pthread_mutex_unlock(&listenerMutex);
322
323
324    for (int i = 0; i < listenersToRemove.size(); i++)
325    {
326        self.megaApi->removeGlobalListener(listenersToRemove[i]);
327        delete listenersToRemove[i];
328    }
329
330}
331
332- (void)addLoggerDelegate:(id<MEGALoggerDelegate>)delegate {
333    MegaApi::addLoggerObject([self createDelegateMegaLogger:delegate]);
334}
335
336- (void)removeLoggerDelegate:(id<MEGALoggerDelegate>)delegate {
337    std::vector<DelegateMEGALoggerListener *> listenersToRemove;
338
339    pthread_mutex_lock(&listenerMutex);
340    std::set<DelegateMEGALoggerListener *>::iterator it = _activeLoggerListeners.begin();
341    while (it != _activeLoggerListeners.end()) {
342        DelegateMEGALoggerListener *delegateListener = *it;
343        if (delegateListener->getUserListener() == delegate) {
344            listenersToRemove.push_back(delegateListener);
345            _activeLoggerListeners.erase(it++);
346        }
347        else {
348            it++;
349        }
350    }
351    pthread_mutex_unlock(&listenerMutex);
352
353    for (int i = 0; i < listenersToRemove.size(); i++)
354    {
355        MegaApi::removeLoggerObject(listenersToRemove[i]);
356        delete listenersToRemove[i];
357    }
358}
359
360#pragma mark - Utils
361
362- (NSString *)hashForBase64pwkey:(NSString *)base64pwkey email:(NSString *)email {
363    if(base64pwkey == nil || email == nil)  return  nil;
364
365    const char *val = self.megaApi->getStringHash([base64pwkey UTF8String], [email UTF8String]);
366    if (!val) return nil;
367
368    NSString *ret = [[NSString alloc] initWithUTF8String:val];
369
370    delete [] val;
371    return ret;
372}
373
374+ (uint64_t)handleForBase64Handle:(NSString *)base64Handle {
375    if(base64Handle == nil) return ::mega::INVALID_HANDLE;
376
377    return MegaApi::base64ToHandle([base64Handle UTF8String]);
378}
379
380+ (uint64_t)handleForBase64UserHandle:(NSString *)base64UserHandle {
381    if(base64UserHandle == nil) return ::mega::INVALID_HANDLE;
382
383    return MegaApi::base64ToUserHandle([base64UserHandle UTF8String]);
384}
385
386+ (NSString *)base64HandleForHandle:(uint64_t)handle {
387    const char *val = MegaApi::handleToBase64(handle);
388    if (!val) return nil;
389
390    NSString *ret = [[NSString alloc] initWithUTF8String:val];
391
392    delete [] val;
393    return ret;
394}
395
396+ (NSString *)base64HandleForUserHandle:(uint64_t)userhandle {
397    const char *val = MegaApi::userHandleToBase64(userhandle);
398    if (!val) return nil;
399
400    NSString *ret = [[NSString alloc] initWithUTF8String:val];
401
402    delete [] val;
403    return ret;
404}
405
406- (void)retryPendingConnections {
407    self.megaApi->retryPendingConnections();
408}
409
410- (void)reconnect {
411    self.megaApi->retryPendingConnections(true, true);
412}
413
414- (BOOL)serverSideRubbishBinAutopurgeEnabled {
415    return self.megaApi->serverSideRubbishBinAutopurgeEnabled();
416}
417
418- (BOOL)appleVoipPushEnabled {
419    return self.megaApi->appleVoipPushEnabled();
420}
421
422- (void)getSessionTransferURL:(NSString *)path delegate:(id<MEGARequestDelegate>)delegate {
423    self.megaApi->getSessionTransferURL(path.UTF8String, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
424}
425
426- (void)getSessionTransferURL:(NSString *)path {
427    self.megaApi->getSessionTransferURL(path.UTF8String);
428}
429
430#pragma mark - Login Requests
431
432- (BOOL)multiFactorAuthAvailable {
433    return self.megaApi->multiFactorAuthAvailable();
434}
435
436- (void)multiFactorAuthCheckWithEmail:(NSString *)email delegate:(id<MEGARequestDelegate>)delegate {
437    self.megaApi->multiFactorAuthCheck((email ? email.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
438}
439
440- (void)multiFactorAuthCheckWithEmail:(NSString *)email {
441    self.megaApi->multiFactorAuthCheck((email ? email.UTF8String : NULL));
442}
443
444- (void)multiFactorAuthGetCodeWithDelegate:(id<MEGARequestDelegate>)delegate {
445    self.megaApi->multiFactorAuthGetCode([self createDelegateMEGARequestListener:delegate singleListener:YES]);
446}
447
448- (void)multiFactorAuthGetCode {
449    self.megaApi->multiFactorAuthGetCode();
450}
451
452- (void)multiFactorAuthEnableWithPin:(NSString *)pin delegate:(id<MEGARequestDelegate>)delegate {
453    self.megaApi->multiFactorAuthEnable((pin ? pin.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
454}
455
456- (void)multiFactorAuthEnableWithPin:(NSString *)pin  {
457    self.megaApi->multiFactorAuthEnable((pin ? pin.UTF8String : NULL));
458}
459
460- (void)multiFactorAuthDisableWithPin:(NSString *)pin delegate:(id<MEGARequestDelegate>)delegate {
461    self.megaApi->multiFactorAuthDisable((pin ? pin.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
462}
463
464- (void)multiFactorAuthDisableWithPin:(NSString *)pin {
465    self.megaApi->multiFactorAuthDisable((pin ? pin.UTF8String : NULL));
466}
467
468- (void)multiFactorAuthLoginWithEmail:(NSString *)email password:(NSString *)password pin:(NSString *)pin delegate:(id<MEGARequestDelegate>)delegate {
469    self.megaApi->multiFactorAuthLogin((email ? email.UTF8String : NULL), (password ? password.UTF8String : NULL), (pin ? pin.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
470}
471
472- (void)multiFactorAuthLoginWithEmail:(NSString *)email password:(NSString *)password pin:(NSString *)pin {
473    self.megaApi->multiFactorAuthLogin((email ? email.UTF8String : NULL), (password ? password.UTF8String : NULL), (pin ? pin.UTF8String : NULL));
474}
475
476- (void)multiFactorAuthChangePassword:(NSString *)oldPassword newPassword:(NSString *)newPassword pin:(NSString *)pin delegate:(id<MEGARequestDelegate>)delegate {
477    self.megaApi->multiFactorAuthChangePassword((oldPassword ? oldPassword.UTF8String : NULL), (newPassword ? newPassword.UTF8String : NULL), (pin ? pin.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
478}
479
480- (void)multiFactorAuthChangePassword:(NSString *)oldPassword newPassword:(NSString *)newPassword pin:(NSString *)pin {
481    self.megaApi->multiFactorAuthChangePassword((oldPassword ? oldPassword.UTF8String : NULL), (newPassword ? newPassword.UTF8String : NULL), (pin ? pin.UTF8String : NULL));
482}
483
484- (void)multiFactorAuthChangeEmail:(NSString *)email pin:(NSString *)pin delegate:(id<MEGARequestDelegate>)delegate {
485    self.megaApi->multiFactorAuthChangeEmail((email ? email.UTF8String : NULL), (pin ? pin.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
486}
487
488- (void)multiFactorAuthChangeEmail:(NSString *)email pin:(NSString *)pin {
489    self.megaApi->multiFactorAuthChangeEmail((email ? email.UTF8String : NULL), (pin ? pin.UTF8String : NULL));
490}
491
492- (void)multiFactorAuthCancelAccountWithPin:(NSString *)pin delegate:(id<MEGARequestDelegate>)delegate {
493    self.megaApi->multiFactorAuthCancelAccount((pin ? pin.UTF8String : NULL), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
494}
495
496- (void)multiFactorAuthCancelAccountWithPin:(NSString *)pin {
497    self.megaApi->multiFactorAuthCancelAccount((pin ? pin.UTF8String : NULL));
498}
499
500- (void)fetchTimeZoneWithDelegate:(id<MEGARequestDelegate>)delegate {
501    self.megaApi->fetchTimeZone([self createDelegateMEGARequestListener:delegate singleListener:YES]);
502}
503
504- (void)fetchTimeZone {
505    self.megaApi->fetchTimeZone();
506}
507
508- (void)loginWithEmail:(NSString *)email password:(NSString *)password {
509    self.megaApi->login((email != nil) ? [email UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL);
510}
511
512- (void)loginWithEmail:(NSString *)email password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate{
513    self.megaApi->login((email != nil) ? [email UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
514}
515
516- (void)sendDevCommand:(NSString *)command email:(NSString *)email delegate:(id<MEGARequestDelegate>)delegate {
517    self.megaApi->sendDevCommand(command.UTF8String, email.UTF8String, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
518}
519
520- (NSString *)dumpSession {
521    const char *val = self.megaApi->dumpSession();
522    if (!val) return nil;
523
524    NSString *ret = [[NSString alloc] initWithUTF8String:val];
525
526    delete [] val;
527    return ret;
528}
529
530- (NSString *)sequenceNumber {
531    const char *val = self.megaApi->getSequenceNumber();
532    if (!val) return nil;
533
534    NSString *ret = [[NSString alloc] initWithUTF8String:val];
535
536    delete [] val;
537    return ret;
538}
539
540- (void)fastLoginWithEmail:(NSString *)email stringHash:(NSString *)stringHash base64pwKey:(NSString *)base64pwKey {
541    self.megaApi->fastLogin((email != nil) ? [email UTF8String] : NULL, (stringHash != nil) ? [stringHash UTF8String] : NULL, (base64pwKey != nil) ? [base64pwKey UTF8String] : NULL);
542}
543
544- (void)fastLoginWithEmail:(NSString *)email stringHash:(NSString *)stringHash base64pwKey:(NSString *)base64pwKey delegate:(id<MEGARequestDelegate>)delegate {
545    self.megaApi->fastLogin((email != nil) ? [email UTF8String] : NULL, (stringHash != nil) ? [stringHash UTF8String] : NULL, (base64pwKey != nil) ? [base64pwKey UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
546}
547
548- (void)fastLoginWithSession:(NSString *)session {
549    self.megaApi->fastLogin((session != nil) ? [session UTF8String] : NULL);
550}
551
552- (void)fastLoginWithSession:(NSString *)session delegate:(id<MEGARequestDelegate>)delegate {
553    self.megaApi->fastLogin((session != nil) ? [session UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
554}
555
556- (void)loginToFolderLink:(NSString *)folderLink delegate:(id<MEGARequestDelegate>)delegate {
557    self.megaApi->loginToFolder((folderLink != nil) ? [folderLink UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
558}
559
560- (void)loginToFolderLink:(NSString *)folderLink {
561    self.megaApi->loginToFolder((folderLink != nil) ? [folderLink UTF8String] : NULL);
562}
563
564- (NSInteger)isLoggedIn {
565    return self.megaApi->isLoggedIn();
566}
567
568- (void)fetchNodesWithDelegate:(id<MEGARequestDelegate>)delegate {
569    self.megaApi->fetchNodes([self createDelegateMEGARequestListener:delegate singleListener:YES]);
570}
571
572- (void)fetchNodes {
573    self.megaApi->fetchNodes();
574}
575
576- (void)logoutWithDelegate:(id<MEGARequestDelegate>)delegate {
577    self.megaApi->logout([self createDelegateMEGARequestListener:delegate singleListener:YES]);
578}
579
580- (void)logout {
581    self.megaApi->logout();
582}
583
584- (void)localLogoutWithDelegate:(id<MEGARequestDelegate>)delegate {
585    self.megaApi->localLogout([self createDelegateMEGARequestListener:delegate singleListener:YES]);
586}
587
588- (void)localLogout {
589    self.megaApi->localLogout();
590}
591
592- (void)invalidateCache {
593    self.megaApi->invalidateCache();
594}
595
596- (PasswordStrength)passwordStrength:(NSString *)password {
597    return (PasswordStrength) self.megaApi->getPasswordStrength(password ? [password UTF8String] : NULL);
598}
599
600- (BOOL)checkPassword:(NSString *)password {
601    return self.megaApi->checkPassword(password ? [password UTF8String] : NULL);
602}
603
604- (NSString *)myCredentials {
605    const char *val = self.megaApi->getMyCredentials();
606    if (val) {
607        NSString *ret = [NSString.alloc initWithUTF8String:val];
608        delete [] val;
609        return ret;
610    } else {
611        return nil;
612    }
613}
614
615- (void)getUserCredentials:(MEGAUser *)user delegate:(id<MEGARequestDelegate>)delegate {
616    self.megaApi->getUserCredentials(user ? user.getCPtr : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
617}
618
619- (void)getUserCredentials:(MEGAUser *)user {
620    self.megaApi->getUserCredentials(user ? user.getCPtr : NULL);
621}
622
623- (BOOL)areCredentialsVerifiedOfUser:(MEGAUser *)user {
624    return self.megaApi->areCredentialsVerified(user ? user.getCPtr : NULL);
625}
626
627- (void)verifyCredentialsOfUser:(MEGAUser *)user delegate:(id<MEGARequestDelegate>)delegate {
628    self.megaApi->verifyCredentials(user ? user.getCPtr : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
629}
630
631- (void)verifyCredentialsOfUser:(MEGAUser *)user {
632    self.megaApi->verifyCredentials(user ? user.getCPtr : NULL);
633}
634
635- (void)resetCredentialsOfUser:(MEGAUser *)user delegate:(id<MEGARequestDelegate>)delegate {
636    self.megaApi->resetCredentials(user ? user.getCPtr : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
637}
638
639- (void)resetCredentialsOfUser:(MEGAUser *)user {
640    self.megaApi->resetCredentials(user ? user.getCPtr : NULL);
641}
642
643#pragma mark - Create account and confirm account Requests
644
645
646- (void)createAccountWithEmail:(NSString *)email password:(NSString *)password firstname:(NSString *)firstname lastname:(NSString *)lastname {
647    self.megaApi->createAccount((email != nil) ? [email UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, (firstname != nil) ? [firstname UTF8String] : NULL, (lastname != nil) ? [lastname UTF8String] : NULL);
648}
649
650- (void)createAccountWithEmail:(NSString *)email password:(NSString *)password firstname:(NSString *)firstname lastname:(NSString *)lastname delegate:(id<MEGARequestDelegate>)delegate {
651    self.megaApi->createAccount((email != nil) ? [email UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, (firstname != nil) ? [firstname UTF8String] : NULL, (lastname != nil) ? [lastname UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
652}
653
654- (void)createAccountWithEmail:(NSString *)email password:(NSString *)password firstname:(NSString *)firstname lastname:(NSString *)lastname lastPublicHandle:(uint64_t)lastPublicHandle lastPublicHandleType:(AffiliateType)lastPublicHandleType lastAccessTimestamp:(uint64_t)lastAccessTimestamp {
655    self.megaApi->createAccount(email.UTF8String, password.UTF8String, firstname.UTF8String, lastname.UTF8String, lastPublicHandle, (int)lastPublicHandleType, lastAccessTimestamp);
656}
657
658- (void)createAccountWithEmail:(NSString *)email password:(NSString *)password firstname:(NSString *)firstname lastname:(NSString *)lastname lastPublicHandle:(uint64_t)lastPublicHandle lastPublicHandleType:(AffiliateType)lastPublicHandleType lastAccessTimestamp:(uint64_t)lastAccessTimestamp delegate:(id<MEGARequestDelegate>)delegate {
659    self.megaApi->createAccount(email.UTF8String, password.UTF8String, firstname.UTF8String, lastname.UTF8String, lastPublicHandle, (int)lastPublicHandleType, lastAccessTimestamp, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
660}
661
662- (void)resumeCreateAccountWithSessionId:(NSString *)sessionId delegate:(id<MEGARequestDelegate>)delegate {
663    self.megaApi->resumeCreateAccount((sessionId != nil) ? [sessionId UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
664}
665
666- (void)resumeCreateAccountWithSessionId:(NSString *)sessionId {
667    self.megaApi->resumeCreateAccount((sessionId != nil) ? [sessionId UTF8String] : NULL);
668}
669
670- (void)cancelCreateAccountWithDelegate:(id<MEGARequestDelegate>)delegate {
671    self.megaApi->cancelCreateAccount([self createDelegateMEGARequestListener:delegate singleListener:YES]);
672}
673
674- (void)cancelCreateAccount {
675    self.megaApi->cancelCreateAccount();
676}
677
678- (void)sendSignupLinkWithEmail:(NSString *)email name:(NSString *)name password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate {
679    self.megaApi->sendSignupLink((email != nil) ? [email UTF8String] : NULL, (name != nil) ? [name UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
680}
681
682- (void)sendSignupLinkWithEmail:(NSString *)email name:(NSString *)name password:(NSString *)password {
683    self.megaApi->sendSignupLink((email != nil) ? [email UTF8String] : NULL, (name != nil) ? [name UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL);
684}
685
686- (void)fastSendSignupLinkWithEmail:(NSString *)email base64pwkey:(NSString *)base64pwkey name:(NSString *)name delegate:(id<MEGARequestDelegate>)delegate {
687    self.megaApi->fastSendSignupLink(email ? [email UTF8String] : NULL, base64pwkey ? [base64pwkey UTF8String] : NULL, name ? [name UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
688}
689
690- (void)fastSendSignupLinkWithEmail:(NSString *)email base64pwkey:(NSString *)base64pwkey name:(NSString *)name {
691    self.megaApi->fastSendSignupLink(email ? [email UTF8String] : NULL, base64pwkey ? [base64pwkey UTF8String] : NULL, name ? [name UTF8String] : NULL);
692}
693
694- (void)querySignupLink:(NSString *)link {
695    self.megaApi->querySignupLink((link != nil) ? [link UTF8String] : NULL);
696}
697
698- (void)querySignupLink:(NSString *)link delegate:(id<MEGARequestDelegate>)delegate {
699    self.megaApi->querySignupLink((link != nil) ? [link UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
700}
701
702- (void)confirmAccountWithLink:(NSString *)link password:(NSString *)password {
703    self.megaApi->confirmAccount((link != nil) ? [link UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL);
704}
705
706- (void)confirmAccountWithLink:(NSString *)link password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate {
707    self.megaApi->confirmAccount((link != nil) ? [link UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
708}
709
710- (void)fastConfirmAccountWithLink:(NSString *)link base64pwkey:(NSString *)base64pwkey {
711    self.megaApi->fastConfirmAccount((link != nil) ? [link UTF8String] : NULL, (base64pwkey != nil) ? [base64pwkey UTF8String] : NULL);
712}
713
714
715- (void)fastConfirmAccountWithLink:(NSString *)link base64pwkey:(NSString *)base64pwkey delegate:(id<MEGARequestDelegate>)delegate {
716    self.megaApi->fastConfirmAccount((link != nil) ? [link UTF8String] : NULL, (base64pwkey != nil) ? [base64pwkey UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
717}
718
719- (void)resetPasswordWithEmail:(NSString *)email hasMasterKey:(BOOL)hasMasterKey delegate:(id<MEGARequestDelegate>)delegate {
720    self.megaApi->resetPassword((email != nil) ? [email UTF8String] : NULL, hasMasterKey, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
721}
722
723- (void)resetPasswordWithEmail:(NSString *)email hasMasterKey:(BOOL)hasMasterKey {
724    self.megaApi->resetPassword((email != nil) ? [email UTF8String] : NULL, hasMasterKey);
725}
726
727- (void)queryResetPasswordLink:(NSString *)link delegate:(id<MEGARequestDelegate>)delegate {
728    self.megaApi->queryResetPasswordLink((link != nil) ? [link UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
729}
730
731- (void)queryResetPasswordLink:(NSString *)link {
732    self.megaApi->queryResetPasswordLink((link != nil) ? [link UTF8String] : NULL);
733}
734
735- (void)confirmResetPasswordWithLink:(NSString *)link newPassword:(NSString *)newPassword masterKey:(nullable NSString *)masterKey delegate:(id<MEGARequestDelegate>)delegate {
736    self.megaApi->confirmResetPassword((link != nil) ? [link UTF8String] : NULL, (newPassword != nil) ? [newPassword UTF8String] : NULL, (masterKey != nil) ? [masterKey UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
737}
738
739- (void)confirmResetPasswordWithLink:(NSString *)link newPassword:(NSString *)newPassword masterKey:(nullable NSString *)masterKey {
740    self.megaApi->confirmResetPassword((link != nil) ? [link UTF8String] : NULL, (newPassword != nil) ? [newPassword UTF8String] : NULL, (masterKey != nil) ? [masterKey UTF8String] : NULL);
741}
742
743- (void)cancelAccountWithDelegate:(id<MEGARequestDelegate>)delegate {
744    self.megaApi->cancelAccount([self createDelegateMEGARequestListener:delegate singleListener:YES]);
745}
746
747- (void)cancelAccount {
748    self.megaApi->cancelAccount();
749}
750
751- (void)queryCancelLink:(NSString *)link {
752    self.megaApi->queryCancelLink((link != nil) ? [link UTF8String] : NULL);
753}
754
755- (void)queryCancelLink:(NSString *)link delegate:(id<MEGARequestDelegate>)delegate {
756    self.megaApi->queryCancelLink((link != nil) ? [link UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
757}
758
759- (void)confirmCancelAccountWithLink:(NSString *)link password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate {
760    self.megaApi->confirmCancelAccount((link != nil) ? [link UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
761}
762
763- (void)confirmCancelAccountWithLink:(NSString *)link password:(NSString *)password {
764    self.megaApi->confirmCancelAccount((link != nil) ? [link UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL);
765}
766
767- (void)resendVerificationEmailWithDelegate:(id<MEGARequestDelegate>)delegate {
768    self.megaApi->resendVerificationEmail([self createDelegateMEGARequestListener:delegate singleListener:YES]);
769}
770
771- (void)resendVerificationEmail {
772    self.megaApi->resendVerificationEmail();
773}
774
775- (void)changeEmail:(NSString *)email delegate:(id<MEGARequestDelegate>)delegate {
776    self.megaApi->changeEmail((email != nil) ? [email UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
777}
778
779- (void)changeEmail:(NSString *)email {
780    self.megaApi->changeEmail((email != nil) ? [email UTF8String] : NULL);
781}
782
783- (void)queryChangeEmailLink:(NSString *)link delegate:(id<MEGARequestDelegate>)delegate {
784    self.megaApi->queryChangeEmailLink((link != nil) ? [link UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
785}
786
787- (void)queryChangeEmailLink:(NSString *)link {
788    self.megaApi->queryChangeEmailLink((link != nil) ? [link UTF8String] : NULL);
789}
790
791- (void)confirmChangeEmailWithLink:(NSString *)link password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate {
792    self.megaApi->confirmChangeEmail((link != nil) ? [link UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
793}
794
795- (void)confirmChangeEmailWithLink:(NSString *)link password:(NSString *)password {
796    self.megaApi->confirmChangeEmail((link != nil) ? [link UTF8String] : NULL, (password != nil) ? [password UTF8String] : NULL);
797}
798
799- (void)contactLinkCreateRenew:(BOOL)renew delegate:(id<MEGARequestDelegate>)delegate {
800    self.megaApi->contactLinkCreate(renew, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
801}
802
803- (void)contactLinkCreateRenew:(BOOL)renew {
804    self.megaApi->contactLinkCreate(renew);
805}
806
807- (void)contactLinkQueryWithHandle:(uint64_t)handle delegate:(id<MEGARequestDelegate>)delegate {
808    self.megaApi->contactLinkQuery(handle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
809}
810
811- (void)contactLinkQueryWithHandle:(uint64_t)handle {
812    self.megaApi->contactLinkQuery(handle);
813}
814
815- (void)contactLinkDeleteWithDelegate:(id<MEGARequestDelegate>)delegate {
816    self.megaApi->contactLinkDelete(INVALID_HANDLE, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
817}
818
819- (void)contactLinkDelete {
820    self.megaApi->contactLinkDelete();
821}
822
823- (void)keepMeAliveWithType:(KeepMeAlive)type enable:(BOOL)enable delegate:(id<MEGARequestDelegate>)delegate {
824    self.megaApi->keepMeAlive((int) type, enable, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
825}
826
827- (void)keepMeAliveWithType:(KeepMeAlive)type enable:(BOOL)enable {
828    self.megaApi->keepMeAlive((int) type, enable);
829}
830
831- (void)whyAmIBlockedWithDelegate:(id<MEGARequestDelegate>)delegate {
832    self.megaApi->whyAmIBlocked([self createDelegateMEGARequestListener:delegate singleListener:YES]);
833}
834
835- (void)whyAmIBlocked {
836    self.megaApi->whyAmIBlocked();
837}
838
839- (void)getPSAWithDelegate:(id<MEGARequestDelegate>)delegate {
840    self.megaApi->getPSA([self createDelegateMEGARequestListener:delegate singleListener:YES]);
841}
842
843- (void)getPSA{
844    self.megaApi->getPSA();
845}
846
847- (void)setPSAWithIdentifier:(NSInteger)identifier delegate:(id<MEGARequestDelegate>)delegate {
848    self.megaApi->setPSA((int)identifier, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
849}
850
851- (void)setPSAWithIdentifier:(NSInteger)identifier {
852    self.megaApi->setPSA((int)identifier);
853}
854
855- (void)acknowledgeUserAlertsWithDelegate:(id<MEGARequestDelegate>)delegate {
856    self.megaApi->acknowledgeUserAlerts([self createDelegateMEGARequestListener:delegate singleListener:YES]);
857}
858
859- (void)acknowledgeUserAlerts {
860    self.megaApi->acknowledgeUserAlerts();
861}
862
863#pragma mark - Filesystem changes Requests
864
865- (void)createFolderWithName:(NSString *)name parent:(MEGANode *)parent delegate:(id<MEGARequestDelegate>)delegate {
866    self.megaApi->createFolder((name != nil) ? [name UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
867}
868
869- (void)createFolderWithName:(NSString *)name parent:(MEGANode *)parent {
870    self.megaApi->createFolder((name != nil) ? [name UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL);
871}
872
873- (void)moveNode:(MEGANode *)node newParent:(MEGANode *)newParent delegate:(id<MEGARequestDelegate>)delegate {
874    self.megaApi->moveNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
875}
876
877- (void)moveNode:(MEGANode *)node newParent:(MEGANode *)newParent {
878    self.megaApi->moveNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL);
879}
880
881- (void)moveNode:(MEGANode *)node newParent:(MEGANode *)newParent newName:(NSString *)newName delegate:(id<MEGARequestDelegate>)delegate {
882    self.megaApi->moveNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL, newName.UTF8String, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
883}
884
885- (void)moveNode:(MEGANode *)node newParent:(MEGANode *)newParent newName:(NSString *)newName {
886    self.megaApi->moveNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL, newName.UTF8String);
887}
888
889- (void)copyNode:(MEGANode *)node newParent:(MEGANode *)newParent delegate:(id<MEGARequestDelegate>)delegate {
890    self.megaApi->copyNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
891}
892
893- (void)copyNode:(MEGANode *)node newParent:(MEGANode *)newParent {
894    self.megaApi->copyNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL);
895}
896
897- (void)copyNode:(MEGANode *)node newParent:(MEGANode *)newParent newName:(NSString *)newName delegate:(id<MEGARequestDelegate>)delegate {
898    self.megaApi->copyNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL, (newName != nil) ? [newName UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
899}
900
901- (void)copyNode:(MEGANode *)node newParent:(MEGANode *)newParent newName:(NSString *)newName {
902    self.megaApi->copyNode((node != nil) ? [node getCPtr] : NULL, (newParent != nil) ? [newParent getCPtr] : NULL, (newName != nil) ? [newName UTF8String] : NULL);
903}
904
905- (void)renameNode:(MEGANode *)node newName:(NSString *)newName delegate:(id<MEGARequestDelegate>)delegate {
906    self.megaApi->renameNode((node != nil) ? [node getCPtr] : NULL, (newName != nil) ? [newName UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
907}
908
909- (void)renameNode:(MEGANode *)node newName:(NSString *)newName {
910    self.megaApi->renameNode((node != nil) ? [node getCPtr] : NULL, (newName != nil) ? [newName UTF8String] : NULL);
911}
912
913- (void)removeNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
914    self.megaApi->remove((node != nil) ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
915}
916
917- (void)removeNode:(MEGANode *)node {
918    self.megaApi->remove((node != nil) ? [node getCPtr] : NULL);
919}
920
921- (void)removeVersionsWithDelegate:(id<MEGARequestDelegate>)delegate {
922    self.megaApi->removeVersions([self createDelegateMEGARequestListener:delegate singleListener:YES]);
923}
924
925- (void)removeVersions {
926    self.megaApi->removeVersions();
927}
928
929- (void)removeVersionNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
930    self.megaApi->removeVersion(node ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
931}
932
933- (void)removeVersionNode:(MEGANode *)node {
934    self.megaApi->removeVersion(node ? [node getCPtr] : NULL);
935}
936
937- (void)restoreVersionNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
938    self.megaApi->restoreVersion(node ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
939}
940
941- (void)restoreVersionNode:(MEGANode *)node {
942    self.megaApi->restoreVersion(node ? [node getCPtr] : NULL);
943}
944
945- (void)cleanRubbishBinWithDelegate:(id<MEGARequestDelegate>)delegate {
946    self.megaApi->cleanRubbishBin([self createDelegateMEGARequestListener:delegate singleListener:YES]);
947}
948
949- (void)cleanRubbishBin {
950    self.megaApi->cleanRubbishBin();
951}
952
953#pragma mark - Sharing Requests
954
955- (void)shareNode:(MEGANode *)node withUser:(MEGAUser *)user level:(NSInteger)level delegate:(id<MEGARequestDelegate>)delegate {
956    self.megaApi->share((node != nil) ? [node getCPtr] : NULL, (user != nil) ? [user getCPtr] : NULL, (int)level, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
957}
958
959- (void)shareNode:(MEGANode *)node withUser:(MEGAUser *)user level:(NSInteger)level {
960    self.megaApi->share((node != nil) ? [node getCPtr] : NULL, (user != nil) ? [user getCPtr] : NULL, (int)level);
961}
962
963- (void)shareNode:(MEGANode *)node withEmail:(NSString *)email level:(NSInteger)level delegate:(id<MEGARequestDelegate>)delegate {
964    self.megaApi->share((node != nil) ? [node getCPtr] : NULL, (email != nil) ? [email UTF8String] : NULL, (int)level, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
965}
966
967- (void)shareNode:(MEGANode *)node withEmail:(NSString *)email level:(NSInteger)level {
968    self.megaApi->share((node != nil) ? [node getCPtr] : NULL, (email != nil) ? [email UTF8String] : NULL, (int)level);
969}
970
971- (void)importMegaFileLink:(NSString *)megaFileLink parent:(MEGANode *)parent delegate:(id<MEGARequestDelegate>)delegate {
972    self.megaApi->importFileLink((megaFileLink != nil) ? [megaFileLink UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
973}
974
975- (void)importMegaFileLink:(NSString *)megaFileLink parent:(MEGANode *)parent {
976    self.megaApi->importFileLink((megaFileLink != nil) ? [megaFileLink UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL);
977}
978
979
980- (void)decryptPasswordProtectedLink:(NSString *)link password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate {
981    self.megaApi->decryptPasswordProtectedLink(link ? [link UTF8String] : NULL, password ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
982}
983
984- (void)decryptPasswordProtectedLink:(NSString *)link password:(NSString *)password {
985    self.megaApi->decryptPasswordProtectedLink(link ? [link UTF8String] : NULL, password ? [password UTF8String] : NULL);
986}
987
988- (void)encryptLinkWithPassword:(NSString *)link password:(NSString *)password delegate:(id<MEGARequestDelegate>)delegate {
989    self.megaApi->encryptLinkWithPassword(link ? [link UTF8String] : NULL, password ? [password UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
990}
991
992- (void)encryptLinkWithPassword:(NSString *)link password:(NSString *)password {
993    self.megaApi->encryptLinkWithPassword(link ? [link UTF8String] : NULL, password ? [password UTF8String] : NULL);
994}
995
996- (void)publicNodeForMegaFileLink:(NSString *)megaFileLink delegate:(id<MEGARequestDelegate>)delegate {
997    self.megaApi->getPublicNode((megaFileLink != nil) ? [megaFileLink UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
998}
999
1000- (void)publicNodeForMegaFileLink:(NSString *)megaFileLink {
1001    self.megaApi->getPublicNode((megaFileLink != nil) ? [megaFileLink UTF8String] : NULL);
1002}
1003
1004- (NSString *)buildPublicLinkForHandle:(NSString *)publicHandle key:(NSString *)key isFolder:(BOOL)isFolder {
1005    const char *link = self.megaApi->buildPublicLink(publicHandle.UTF8String, key.UTF8String, isFolder);
1006
1007    if (!link) return nil;
1008    NSString *stringLink = [NSString.alloc initWithUTF8String:link];
1009
1010    delete [] link;
1011    return stringLink;
1012}
1013
1014- (void)setNodeCoordinates:(MEGANode *)node latitude:(NSNumber *)latitude longitude:(NSNumber *)longitude delegate:(id<MEGARequestDelegate>)delegate {
1015    self.megaApi->setNodeCoordinates(node ? [node getCPtr] : NULL, (latitude ? latitude.doubleValue : MegaNode::INVALID_COORDINATE), (longitude ? longitude.doubleValue : MegaNode::INVALID_COORDINATE), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1016}
1017
1018- (void)setNodeCoordinates:(MEGANode *)node latitude:(NSNumber *)latitude longitude:(NSNumber *)longitude {
1019    self.megaApi->setNodeCoordinates(node ? [node getCPtr] : NULL, (latitude ? latitude.doubleValue : MegaNode::INVALID_COORDINATE), (longitude ? longitude.doubleValue : MegaNode::INVALID_COORDINATE));
1020}
1021
1022- (void)setUnshareableNodeCoordinates:(MEGANode *)node latitude:(NSNumber *)latitude longitude:(NSNumber *)longitude delegate:(id<MEGARequestDelegate>)delegate {
1023        self.megaApi->setUnshareableNodeCoordinates(node ? [node getCPtr] : NULL, (latitude ? latitude.doubleValue : MegaNode::INVALID_COORDINATE), (longitude ? longitude.doubleValue : MegaNode::INVALID_COORDINATE), [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1024}
1025
1026- (void)exportNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
1027    self.megaApi->exportNode((node != nil) ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1028}
1029
1030- (void)exportNode:(MEGANode *)node {
1031    self.megaApi->exportNode((node != nil) ? [node getCPtr] : NULL);
1032}
1033
1034- (void)exportNode:(MEGANode *)node expireTime:(NSDate *)expireTime delegate:(id<MEGARequestDelegate>)delegate {
1035    self.megaApi->exportNode((node != nil) ? [node getCPtr] : NULL, (int64_t)[expireTime timeIntervalSince1970], [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1036}
1037
1038- (void)exportNode:(MEGANode *)node expireTime:(NSDate *)expireTime {
1039    self.megaApi->exportNode((node != nil) ? [node getCPtr] : NULL, (int64_t)[expireTime timeIntervalSince1970]);
1040}
1041
1042- (void)disableExportNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
1043    self.megaApi->disableExport((node != nil) ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1044}
1045
1046- (void)disableExportNode:(MEGANode *)node {
1047    self.megaApi->disableExport((node != nil) ? [node getCPtr] : NULL);
1048}
1049
1050#pragma mark - Attributes Requests
1051
1052- (void)getThumbnailNode:(MEGANode *)node destinationFilePath:(NSString *)destinationFilePath delegate:(id<MEGARequestDelegate>)delegate {
1053    self.megaApi->getThumbnail((node != nil) ? [node getCPtr] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1054}
1055
1056- (void)getThumbnailNode:(MEGANode *)node destinationFilePath:(NSString *)destinationFilePath {
1057    self.megaApi->getThumbnail((node != nil) ? [node getCPtr] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL);
1058}
1059
1060- (void)cancelGetThumbnailNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
1061    self.megaApi->cancelGetThumbnail((node != nil) ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1062}
1063
1064- (void)cancelGetThumbnailNode:(MEGANode *)node {
1065    self.megaApi->cancelGetThumbnail((node != nil) ? [node getCPtr] : NULL);
1066}
1067
1068- (void)setThumbnailNode:(MEGANode *)node sourceFilePath:(NSString *)sourceFilePath delegate:(id<MEGARequestDelegate>)delegate {
1069    self.megaApi->setThumbnail((node != nil) ? [node getCPtr] : NULL, (sourceFilePath != nil) ? [sourceFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1070}
1071
1072- (void)setThumbnailNode:(MEGANode *)node sourceFilePath:(NSString *)sourceFilePath {
1073    self.megaApi->setThumbnail((node != nil) ? [node getCPtr] : NULL, (sourceFilePath != nil) ? [sourceFilePath UTF8String] : NULL);
1074}
1075
1076- (void)getPreviewNode:(MEGANode *)node destinationFilePath:(NSString *)destinationFilePath delegate:(id<MEGARequestDelegate>)delegate {
1077    self.megaApi->getPreview((node != nil) ? [node getCPtr] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1078}
1079
1080- (void)getPreviewNode:(MEGANode *)node destinationFilePath:(NSString *)destinationFilePath {
1081    self.megaApi->getPreview((node != nil) ? [node getCPtr] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL);
1082}
1083
1084- (void)cancelGetPreviewNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
1085    self.megaApi->cancelGetPreview((node != nil) ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1086}
1087
1088- (void)cancelGetPreviewNode:(MEGANode *)node {
1089    self.megaApi->cancelGetPreview((node != nil) ? [node getCPtr] : NULL);
1090}
1091
1092- (void)setPreviewNode:(MEGANode *)node sourceFilePath:(NSString *)sourceFilePath delegate:(id<MEGARequestDelegate>)delegate {
1093    self.megaApi->setPreview((node != nil) ? [node getCPtr] : NULL, (sourceFilePath != nil) ? [sourceFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1094}
1095
1096- (void)setPreviewNode:(MEGANode *)node sourceFilePath:(NSString *)sourceFilePath {
1097    self.megaApi->setPreview((node != nil) ? [node getCPtr] : NULL, (sourceFilePath != nil) ? [sourceFilePath UTF8String] : NULL);
1098}
1099
1100- (void)getAvatarUser:(MEGAUser *)user destinationFilePath:(NSString *)destinationFilePath delegate:(id<MEGARequestDelegate>)delegate {
1101    self.megaApi->getUserAvatar((user != nil) ? [user getCPtr] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1102}
1103
1104- (void)getAvatarUser:(MEGAUser *)user destinationFilePath:(NSString *)destinationFilePath {
1105    self.megaApi->getUserAvatar((user != nil) ? [user getCPtr] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL);
1106}
1107
1108- (void)getAvatarUserWithEmailOrHandle:(NSString *)emailOrHandle destinationFilePath:(NSString *)destinationFilePath delegate:(id<MEGARequestDelegate>)delegate {
1109    self.megaApi->getUserAvatar((emailOrHandle != nil) ? [emailOrHandle UTF8String] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1110}
1111
1112- (void)getAvatarUserWithEmailOrHandle:(NSString *)emailOrHandle destinationFilePath:(NSString *)destinationFilePath {
1113    self.megaApi->getUserAvatar((emailOrHandle != nil) ? [emailOrHandle UTF8String] : NULL, (destinationFilePath != nil) ? [destinationFilePath UTF8String] : NULL);
1114}
1115
1116+ (NSString *)avatarColorForUser:(MEGAUser *)user {
1117    const char *val = MegaApi::getUserAvatarColor((user != nil) ? [user getCPtr] : NULL);
1118    if (!val) return nil;
1119
1120    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1121
1122    delete [] val;
1123    return ret;
1124}
1125
1126+ (NSString *)avatarColorForBase64UserHandle:(NSString *)base64UserHandle {
1127    const char *val = MegaApi::getUserAvatarColor((base64UserHandle != nil) ? [base64UserHandle UTF8String] : NULL);
1128    if (!val) return nil;
1129
1130    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1131
1132    delete [] val;
1133    return ret;
1134}
1135
1136+ (NSString *)avatarSecondaryColorForUser:(MEGAUser *)user {
1137    const char *val = MegaApi::getUserAvatarSecondaryColor((user != nil) ? [user getCPtr] : NULL);
1138    if (!val) return nil;
1139
1140    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1141
1142    delete [] val;
1143    return ret;
1144}
1145
1146+ (NSString *)avatarSecondaryColorForBase64UserHandle:(NSString *)base64UserHandle {
1147    const char *val = MegaApi::getUserAvatarSecondaryColor((base64UserHandle != nil) ? [base64UserHandle UTF8String] : NULL);
1148    if (!val) return nil;
1149
1150    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1151
1152    delete [] val;
1153    return ret;
1154}
1155
1156- (void)setAvatarUserWithSourceFilePath:(NSString *)sourceFilePath delegate:(id<MEGARequestDelegate>)delegate {
1157    self.megaApi->setAvatar((sourceFilePath != nil) ? [sourceFilePath UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1158}
1159
1160- (void)setAvatarUserWithSourceFilePath:(NSString *)sourceFilePath {
1161    self.megaApi->setAvatar((sourceFilePath != nil) ? [sourceFilePath UTF8String] : NULL);
1162}
1163
1164- (void)getUserAttributeForUser:(MEGAUser *)user type:(MEGAUserAttribute)type {
1165    self.megaApi->getUserAttribute((user != nil) ? [user getCPtr] : NULL, (int)type);
1166}
1167
1168- (void)getUserAttributeForUser:(MEGAUser *)user type:(MEGAUserAttribute)type delegate:(id<MEGARequestDelegate>)delegate {
1169    self.megaApi->getUserAttribute((user != nil) ? [user getCPtr] : NULL, (int)type, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1170}
1171
1172- (void)getUserAttributeForEmailOrHandle:(NSString *)emailOrHandle type:(MEGAUserAttribute)type {
1173    self.megaApi->getUserAttribute((emailOrHandle != nil) ? [emailOrHandle UTF8String] : NULL, (int)type);
1174}
1175
1176- (void)getUserAttributeForEmailOrHandle:(NSString *)emailOrHandle type:(MEGAUserAttribute)type delegate:(id<MEGARequestDelegate>)delegate {
1177    self.megaApi->getUserAttribute((emailOrHandle != nil) ? [emailOrHandle UTF8String] : NULL, (int)type, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1178}
1179
1180- (void)getUserAttributeType:(MEGAUserAttribute)type {
1181    self.megaApi->getUserAttribute((int)type);
1182}
1183
1184- (void)getUserAttributeType:(MEGAUserAttribute)type delegate:(id<MEGARequestDelegate>)delegate {
1185    self.megaApi->getUserAttribute((int)type, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1186}
1187
1188- (void)setUserAttributeType:(MEGAUserAttribute)type value:(NSString *)value {
1189    self.megaApi->setUserAttribute((int)type, (value != nil) ? [value UTF8String] : NULL);
1190}
1191
1192- (void)setUserAttributeType:(MEGAUserAttribute)type value:(NSString *)value delegate:(id<MEGARequestDelegate>)delegate {
1193    self.megaApi->setUserAttribute((int)type, (value != nil) ? [value UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1194}
1195
1196- (void)getUserAliasWithHandle:(uint64_t)handle delegate:(id<MEGARequestDelegate>)delegate {
1197    self.megaApi->getUserAlias(handle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1198}
1199
1200- (void)getUserAliasWithHandle:(uint64_t)handle {
1201    self.megaApi->getUserAlias(handle);
1202}
1203
1204- (void)setUserAlias:(nullable NSString *)alias forHandle:(uint64_t)handle delegate:(id<MEGARequestDelegate>)delegate {
1205    self.megaApi->setUserAlias(handle,
1206                               alias.UTF8String,
1207                               [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1208}
1209
1210- (void)setUserAlias:(nullable NSString *)alias forHandle:(uint64_t)handle {
1211    self.megaApi->setUserAlias(handle, alias.UTF8String);
1212}
1213
1214#pragma mark - Account management Requests
1215
1216- (void)getAccountDetailsWithDelegate:(id<MEGARequestDelegate>)delegate {
1217    self.megaApi->getAccountDetails([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1218}
1219
1220- (void)getAccountDetails {
1221    self.megaApi->getAccountDetails();
1222}
1223
1224- (void)queryTransferQuotaWithSize:(long long)size delegate:(id<MEGARequestDelegate>)delegate {
1225    self.megaApi->queryTransferQuota(size, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1226}
1227
1228- (void)queryTransferQuotaWithSize:(long long)size {
1229    self.megaApi->queryTransferQuota(size);
1230}
1231
1232- (void)getPricingWithDelegate:(id<MEGARequestDelegate>)delegate {
1233    self.megaApi->getPricing([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1234}
1235
1236- (void)getPricing {
1237    self.megaApi->getPricing();
1238}
1239
1240- (void)getPaymentIdForProductHandle:(uint64_t)productHandle delegate:(id<MEGARequestDelegate>)delegate {
1241    self.megaApi->getPaymentId(productHandle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1242}
1243
1244- (void)getPaymentIdForProductHandle:(uint64_t)productHandle {
1245    self.megaApi->getPaymentId(productHandle);
1246}
1247
1248- (void)getPaymentIdForProductHandle:(uint64_t)productHandle lastPublicHandle:(uint64_t)lastPublicHandle lastPublicHandleType:(AffiliateType)lastPublicHandleType lastAccessTimestamp:(uint64_t)lastAccessTimestamp delegate:(id<MEGARequestDelegate>)delegate {
1249    self.megaApi->getPaymentId(productHandle, lastPublicHandle, (int)lastPublicHandleType, lastAccessTimestamp, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1250}
1251
1252- (void)getPaymentIdForProductHandle:(uint64_t)productHandle lastPublicHandle:(uint64_t)lastPublicHandle lastPublicHandleType:(AffiliateType)lastPublicHandleType lastAccessTimestamp:(uint64_t)lastAccessTimestamp {
1253    self.megaApi->getPaymentId(productHandle, lastPublicHandle, (int)lastPublicHandleType, lastAccessTimestamp);
1254}
1255
1256- (void)submitPurchase:(MEGAPaymentMethod)gateway receipt:(NSString *)receipt delegate:(id<MEGARequestDelegate>)delegate {
1257    self.megaApi->submitPurchaseReceipt((int)gateway, (receipt != nil) ? [receipt UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1258}
1259
1260- (void)submitPurchase:(MEGAPaymentMethod)gateway receipt:(NSString *)receipt {
1261    self.megaApi->submitPurchaseReceipt((int)gateway, (receipt != nil) ? [receipt UTF8String] : NULL);
1262}
1263
1264- (void)submitPurchase:(MEGAPaymentMethod)gateway receipt:(NSString *)receipt lastPublicHandle:(uint64_t)lastPublicHandle delegate:(id<MEGARequestDelegate>)delegate {
1265    self.megaApi->submitPurchaseReceipt((int)gateway, (receipt != nil) ? [receipt UTF8String] : NULL, lastPublicHandle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1266}
1267
1268- (void)submitPurchase:(MEGAPaymentMethod)gateway receipt:(NSString *)receipt lastPublicHandle:(uint64_t)lastPublicHandle {
1269    self.megaApi->submitPurchaseReceipt((int)gateway, (receipt != nil) ? [receipt UTF8String] : NULL, lastPublicHandle);
1270}
1271
1272- (void)submitPurchase:(MEGAPaymentMethod)gateway receipt:(NSString *)receipt lastPublicHandle:(uint64_t)lastPublicHandle lastPublicHandleType:(AffiliateType)lastPublicHandleType lastAccessTimestamp:(uint64_t)lastAccessTimestamp delegate:(id<MEGARequestDelegate>)delegate {
1273    self.megaApi->submitPurchaseReceipt((int)gateway, receipt.UTF8String, lastPublicHandle, (int)lastPublicHandleType, lastAccessTimestamp, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1274}
1275
1276- (void)submitPurchase:(MEGAPaymentMethod)gateway receipt:(NSString *)receipt lastPublicHandle:(uint64_t)lastPublicHandle lastPublicHandleType:(AffiliateType)lastPublicHandleType lastAccessTimestamp:(uint64_t)lastAccessTimestamp {
1277    self.megaApi->submitPurchaseReceipt((int)gateway, receipt.UTF8String, lastPublicHandle, (int)lastPublicHandleType, lastAccessTimestamp);
1278}
1279
1280- (void)changePassword:(NSString *)oldPassword newPassword:(NSString *)newPassword delegate:(id<MEGARequestDelegate>)delegate {
1281    self.megaApi->changePassword((oldPassword != nil) ? [oldPassword UTF8String] : NULL, (newPassword != nil) ? [newPassword UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1282}
1283
1284- (void)changePassword:(NSString *)oldPassword newPassword:(NSString *)newPassword {
1285    self.megaApi->changePassword((oldPassword != nil) ? [oldPassword UTF8String] : NULL, (newPassword != nil) ? [newPassword UTF8String] : NULL);
1286}
1287
1288- (void)masterKeyExportedWithDelegate:(id<MEGARequestDelegate>)delegate {
1289    self.megaApi->masterKeyExported([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1290}
1291
1292- (void)masterKeyExported {
1293    self.megaApi->masterKeyExported();
1294}
1295
1296- (void)passwordReminderDialogSucceededWithDelegate:(id<MEGARequestDelegate>)delegate {
1297    self.megaApi->passwordReminderDialogSucceeded([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1298}
1299
1300- (void)passwordReminderDialogSucceeded {
1301    self.megaApi->passwordReminderDialogSucceeded();
1302}
1303
1304- (void)passwordReminderDialogSkippedWithDelegate:(id<MEGARequestDelegate>)delegate {
1305    self.megaApi->passwordReminderDialogSkipped([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1306}
1307
1308- (void)passwordReminderDialogSkipped {
1309    self.megaApi->passwordReminderDialogSkipped();
1310}
1311
1312- (void)passwordReminderDialogBlockedWithDelegate:(id<MEGARequestDelegate>)delegate {
1313    self.megaApi->passwordReminderDialogBlocked([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1314}
1315
1316- (void)passwordReminderDialogBlocked {
1317    self.megaApi->passwordReminderDialogBlocked();
1318}
1319
1320- (void)shouldShowPasswordReminderDialogAtLogout:(BOOL)atLogout delegate:(id<MEGARequestDelegate>)delegate {
1321    self.megaApi->shouldShowPasswordReminderDialog(atLogout, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1322}
1323
1324- (void)shouldShowPasswordReminderDialogAtLogout:(BOOL)atLogout {
1325    self.megaApi->shouldShowPasswordReminderDialog(atLogout);
1326}
1327
1328- (void)isMasterKeyExportedWithDelegate:(id<MEGARequestDelegate>)delegate {
1329    self.megaApi->isMasterKeyExported([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1330}
1331
1332- (void)isMasterKeyExported {
1333    self.megaApi->isMasterKeyExported();
1334}
1335
1336- (void)enableRichPreviews:(BOOL)enable delegate:(id<MEGARequestDelegate>)delegate {
1337    self.megaApi->enableRichPreviews(enable, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1338}
1339
1340- (void)enableRichPreviews:(BOOL)enable {
1341    self.megaApi->enableRichPreviews(enable);
1342}
1343
1344- (void)isRichPreviewsEnabledWithDelegate:(id<MEGARequestDelegate>)delegate {
1345    self.megaApi->isRichPreviewsEnabled([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1346}
1347
1348- (void)isRichPreviewsEnabled {
1349    self.megaApi->isRichPreviewsEnabled();
1350}
1351
1352- (void)shouldShowRichLinkWarningWithDelegate:(id<MEGARequestDelegate>)delegate {
1353    self.megaApi->shouldShowRichLinkWarning([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1354}
1355
1356- (void)shouldShowRichLinkWarning {
1357    self.megaApi->shouldShowRichLinkWarning();
1358}
1359
1360- (void)setRichLinkWarningCounterValue:(NSUInteger)value delegate:(id<MEGARequestDelegate>)delegate {
1361    self.megaApi->setRichLinkWarningCounterValue((int)value, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1362}
1363
1364- (void)setRichLinkWarningCounterValue:(NSUInteger)value {
1365    self.megaApi->setRichLinkWarningCounterValue((int)value);
1366}
1367
1368- (void)enableGeolocationWithDelegate:(id<MEGARequestDelegate>)delegate {
1369    self.megaApi->enableGeolocation([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1370}
1371
1372- (void)enableGeolocation {
1373    self.megaApi->enableGeolocation();
1374}
1375
1376- (void)isGeolocationEnabledWithDelegate:(id<MEGARequestDelegate>)delegate {
1377    self.megaApi->isGeolocationEnabled([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1378}
1379
1380- (void)isGeolocationEnabled {
1381    self.megaApi->isGeolocationEnabled();
1382}
1383
1384- (void)setMyChatFilesFolderWithHandle:(uint64_t)handle delegate:(id<MEGARequestDelegate>)delegate {
1385    self.megaApi->setMyChatFilesFolder(handle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1386}
1387
1388- (void)setMyChatFilesFolderWithHandle:(uint64_t)handle {
1389    self.megaApi->setMyChatFilesFolder(handle);
1390}
1391
1392- (void)getMyChatFilesFolderWithDelegate:(id<MEGARequestDelegate>)delegate {
1393    self.megaApi->getMyChatFilesFolder([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1394}
1395
1396- (void)getMyChatFilesFolder {
1397    self.megaApi->getMyChatFilesFolder();
1398}
1399
1400- (void)setCameraUploadsFolderWithHandle:(uint64_t)handle delegate:(id<MEGARequestDelegate>)delegate {
1401    self.megaApi->setCameraUploadsFolder(handle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1402}
1403
1404- (void)setCameraUploadsFolderWithHandle:(uint64_t)handle {
1405    self.megaApi->setCameraUploadsFolder(handle);
1406}
1407
1408- (void)getCameraUploadsFolderWithDelegate:(id<MEGARequestDelegate>)delegate {
1409    self.megaApi->getCameraUploadsFolder([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1410}
1411
1412- (void)getCameraUploadsFolder {
1413    self.megaApi->getCameraUploadsFolder();
1414}
1415
1416- (void)getRubbishBinAutopurgePeriodWithDelegate:(id<MEGARequestDelegate>)delegate {
1417    self.megaApi->getRubbishBinAutopurgePeriod([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1418}
1419
1420- (void)getRubbishBinAutopurgePeriod {
1421    self.megaApi->getRubbishBinAutopurgePeriod();
1422}
1423
1424- (void)setRubbishBinAutopurgePeriodInDays:(NSInteger)days delegate:(id<MEGARequestDelegate>)delegate {
1425    self.megaApi->setRubbishBinAutopurgePeriod((int)days, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1426}
1427
1428- (void)setRubbishBinAutopurgePeriodInDays:(NSInteger)days {
1429    self.megaApi->setRubbishBinAutopurgePeriod((int)days);
1430}
1431
1432- (void)useHttpsOnly:(BOOL)httpsOnly delegate:(id<MEGARequestDelegate>)delegate {
1433    self.megaApi->useHttpsOnly(httpsOnly, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1434}
1435
1436- (void)useHttpsOnly:(BOOL)httpsOnly {
1437    self.megaApi->useHttpsOnly(httpsOnly);
1438}
1439
1440- (BOOL)usingHttpsOnly {
1441    return self.megaApi->usingHttpsOnly();
1442}
1443
1444- (void)inviteContactWithEmail:(NSString *)email message:(NSString *)message action:(MEGAInviteAction)action delegate:(id<MEGARequestDelegate>)delegate {
1445    self.megaApi->inviteContact((email != nil) ? [email UTF8String] : NULL, (message != nil) ? [message UTF8String] : NULL, (int)action, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1446}
1447
1448- (void)inviteContactWithEmail:(NSString *)email message:(NSString *)message action:(MEGAInviteAction)action {
1449    self.megaApi->inviteContact((email != nil) ? [email UTF8String] : NULL, (message != nil) ? [message UTF8String] : NULL, (int)action);
1450}
1451
1452- (void)inviteContactWithEmail:(NSString *)email message:(NSString *)message action:(MEGAInviteAction)action handle:(uint64_t)handle delegate:(id<MEGARequestDelegate>)delegate {
1453    self.megaApi->inviteContact((email != nil) ? [email UTF8String] : NULL, (message != nil) ? [message UTF8String] : NULL, (int)action, handle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1454}
1455
1456- (void)inviteContactWithEmail:(NSString *)email message:(NSString *)message action:(MEGAInviteAction)action handle:(uint64_t)handle {
1457    self.megaApi->inviteContact((email != nil) ? [email UTF8String] : NULL, (message != nil) ? [message UTF8String] : NULL, (int)action, handle);
1458}
1459
1460- (void)replyContactRequest:(MEGAContactRequest *)request action:(MEGAReplyAction)action delegate:(id<MEGARequestDelegate>)delegate {
1461    self.megaApi->replyContactRequest((request != nil) ? [request getCPtr] : NULL, (int)action, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1462}
1463
1464- (void)replyContactRequest:(MEGAContactRequest *)request action:(MEGAReplyAction)action {
1465    self.megaApi->replyContactRequest((request != nil) ? [request getCPtr] : NULL, (int)action);
1466}
1467
1468- (void)removeContactUser:(MEGAUser *)user delegate:(id<MEGARequestDelegate>)delegate {
1469    self.megaApi->removeContact((user != nil) ? [user getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1470}
1471
1472- (void)removeContactUser:(MEGAUser *)user {
1473    self.megaApi->removeContact((user != nil) ? [user getCPtr] : NULL);
1474}
1475
1476- (void)submitFeedbackWithRating:(NSInteger)rating comment:(NSString *)comment delegate:(id<MEGARequestDelegate>)delegate {
1477    self.megaApi->submitFeedback((int)rating, (comment != nil) ? [comment UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1478}
1479
1480- (void)submitFeedbackWithRating:(NSInteger)rating comment:(NSString *)comment {
1481    self.megaApi->submitFeedback((int)rating, (comment != nil) ? [comment UTF8String] : NULL);
1482}
1483
1484- (void)reportDebugEventWithText:(NSString *)text delegate:(id<MEGARequestDelegate>)delegate {
1485    self.megaApi->reportDebugEvent((text != nil) ? [text UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1486}
1487
1488- (void)reportDebugEventWithText:(NSString *)text {
1489    self.megaApi->reportDebugEvent((text != nil) ? [text UTF8String] : NULL);
1490}
1491
1492- (void)getUserDataWithDelegate:(id<MEGARequestDelegate>)delegate {
1493    self.megaApi->getUserData([self createDelegateMEGARequestListener:delegate singleListener:YES]);
1494}
1495
1496- (void)getUserData {
1497    self.megaApi->getUserData();
1498}
1499
1500- (void)getUserDataWithMEGAUser:(MEGAUser *)user delegate:(id<MEGARequestDelegate>)delegate {
1501    self.megaApi->getUserData((user != nil) ? [user getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1502}
1503
1504- (void)getUserDataWithMEGAUser:(MEGAUser *)user {
1505    self.megaApi->getUserData((user != nil) ? [user getCPtr] : NULL);
1506}
1507
1508- (void)getUserDataWithUser:(NSString *)user delegate:(id<MEGARequestDelegate>)delegate {
1509    self.megaApi->getUserData((user != nil) ? [user UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1510}
1511
1512- (void)getUserDataWithUser:(NSString *)user {
1513    self.megaApi->getUserData((user != nil) ? [user UTF8String] : NULL);
1514}
1515
1516- (void)killSession:(uint64_t)sessionHandle delegate:(id<MEGARequestDelegate>)delegate {
1517    self.megaApi->killSession(sessionHandle, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1518}
1519
1520- (void)killSession:(uint64_t)sessionHandle {
1521    self.megaApi->killSession(sessionHandle);
1522}
1523
1524- (NSDate *)overquotaDeadlineDate {
1525    return [[NSDate alloc] initWithTimeIntervalSince1970:self.megaApi->getOverquotaDeadlineTs()];
1526}
1527
1528- (NSArray<NSDate *> *)overquotaWarningDateList {
1529    MegaIntegerList *warningTimeIntervalList = self.megaApi->getOverquotaWarningsTs();
1530    int sizeOfWarningTimestamps = warningTimeIntervalList->size();
1531    NSMutableArray *warningDateList = [[NSMutableArray alloc] initWithCapacity:sizeOfWarningTimestamps];
1532
1533    for (int i = 0; i < sizeOfWarningTimestamps; i++) {
1534        NSDate *warningDate = [[NSDate alloc] initWithTimeIntervalSince1970:warningTimeIntervalList->get(i)];
1535        [warningDateList addObject:warningDate];
1536    }
1537    return [warningDateList copy];
1538}
1539
1540#pragma mark - Transfer
1541
1542- (MEGATransfer *)transferByTag:(NSInteger)transferTag {
1543    MegaTransfer *transfer = self.megaApi->getTransferByTag((int)transferTag);
1544
1545    return transfer ? [[MEGATransfer alloc] initWithMegaTransfer:transfer cMemoryOwn:YES] : nil;
1546}
1547
1548- (void)startUploadWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent delegate:(id<MEGATransferDelegate>)delegate {
1549    self.megaApi->startUpload((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1550}
1551
1552- (void)startUploadWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent {
1553    self.megaApi->startUpload((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL);
1554}
1555
1556- (void)startUploadToFileWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent filename:(NSString *)filename delegate:(id<MEGATransferDelegate>)delegate {
1557    self.megaApi->startUpload((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (filename != nil) ? [filename UTF8String] : NULL, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1558}
1559
1560- (void)startUploadToFileWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent filename:(NSString *)filename {
1561    self.megaApi->startUpload((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (filename != nil) ? [filename UTF8String] : NULL);
1562}
1563
1564- (void)startUploadWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent appData:(nullable NSString *)appData delegate:(id<MEGATransferDelegate>)delegate {
1565    self.megaApi->startUploadWithData((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (appData !=nil) ? [appData UTF8String] : NULL, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1566}
1567
1568- (void)startUploadWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent appData:(nullable NSString *)appData {
1569    self.megaApi->startUploadWithData((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (appData !=nil) ? [appData UTF8String] : NULL);
1570}
1571
1572- (void)startUploadWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent appData:(nullable NSString *)appData isSourceTemporary:(BOOL)isSourceTemporary delegate:(id<MEGATransferDelegate>)delegate {
1573    self.megaApi->startUploadWithData((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (appData !=nil) ? [appData UTF8String] : NULL, isSourceTemporary, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1574}
1575
1576- (void)startUploadWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent appData:(nullable NSString *)appData isSourceTemporary:(BOOL)isSourceTemporary {
1577    self.megaApi->startUploadWithData((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (appData !=nil) ? [appData UTF8String] : NULL, isSourceTemporary);
1578}
1579
1580- (void)startUploadTopPriorityWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent appData:(nullable NSString *)appData isSourceTemporary:(BOOL)isSourceTemporary delegate:(id<MEGATransferDelegate>)delegate {
1581    self.megaApi->startUploadWithTopPriority((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (appData !=nil) ? [appData UTF8String] : NULL, isSourceTemporary, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1582}
1583
1584- (void)startUploadTopPriorityWithLocalPath:(NSString *)localPath parent:(MEGANode *)parent appData:(nullable NSString *)appData isSourceTemporary:(BOOL)isSourceTemporary {
1585    self.megaApi->startUploadWithTopPriority((localPath != nil) ? [localPath UTF8String] : NULL, (parent != nil) ? [parent getCPtr] : NULL, (appData !=nil) ? [appData UTF8String] : NULL, isSourceTemporary);
1586}
1587
1588- (void)startUploadForChatWithLocalPath:(NSString *)localPath
1589                                 parent:(MEGANode *)parent
1590                                appData:(nullable NSString *)appData
1591                      isSourceTemporary:(BOOL)isSourceTemporary
1592                               delegate:(id<MEGATransferDelegate>)delegate {
1593    self.megaApi->startUploadForChat(localPath.UTF8String,
1594                                     parent.getCPtr,
1595                                     appData.UTF8String,
1596                                     isSourceTemporary,
1597                                     [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1598}
1599
1600- (void)startDownloadNode:(MEGANode *)node localPath:(NSString *)localPath delegate:(id<MEGATransferDelegate>)delegate {
1601    self.megaApi->startDownload((node != nil) ? [node getCPtr] : NULL, (localPath != nil) ? [localPath UTF8String] : NULL, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1602}
1603
1604- (void)startDownloadNode:(MEGANode *)node localPath:(NSString *)localPath {
1605    self.megaApi->startDownload((node != nil) ? [node getCPtr] : NULL, (localPath != nil) ? [localPath UTF8String] : NULL);
1606}
1607
1608- (void)startDownloadNode:(MEGANode *)node localPath:(NSString *)localPath appData:(nullable NSString *)appData {
1609    self.megaApi->startDownloadWithData((node != nil) ? [node getCPtr] : NULL, (localPath != nil) ? [localPath UTF8String] : NULL, (appData != nil) ? [appData UTF8String] : NULL);
1610}
1611
1612- (void)startDownloadNode:(MEGANode *)node localPath:(NSString *)localPath appData:(nullable NSString *)appData delegate:(id<MEGATransferDelegate>)delegate{
1613    self.megaApi->startDownloadWithData((node != nil) ? [node getCPtr] : NULL, (localPath != nil) ? [localPath UTF8String] : NULL, (appData != nil) ? [appData UTF8String] : NULL, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1614}
1615
1616- (void)startDownloadTopPriorityWithNode:(MEGANode *)node localPath:(NSString *)localPath appData:(nullable NSString *)appData delegate:(id<MEGATransferDelegate>)delegate {
1617    self.megaApi->startDownloadWithTopPriority((node != nil) ? [node getCPtr] : NULL, (localPath != nil) ? [localPath UTF8String] : NULL, (appData != nil) ? [appData UTF8String] : NULL, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1618}
1619
1620- (void)startDownloadTopPriorityWithNode:(MEGANode *)node localPath:(NSString *)localPath appData:(nullable NSString *)appData {
1621    self.megaApi->startDownloadWithTopPriority((node != nil) ? [node getCPtr] : NULL, (localPath != nil) ? [localPath UTF8String] : NULL, (appData != nil) ? [appData UTF8String] : NULL);
1622}
1623
1624- (void)startStreamingNode:(MEGANode *)node startPos:(NSNumber *)startPos size:(NSNumber *)size delegate:(id<MEGATransferDelegate>)delegate {
1625    self.megaApi->startStreaming((node != nil) ? [node getCPtr] : NULL, (startPos != nil) ? [startPos longLongValue] : 0, (size != nil) ? [size longLongValue] : 0, [self createDelegateMEGATransferListener:delegate singleListener:YES]);
1626}
1627
1628- (void)startStreamingNode:(MEGANode *)node startPos:(NSNumber *)startPos size:(NSNumber *)size {
1629    self.megaApi->startStreaming((node != nil) ? [node getCPtr] : NULL, (startPos != nil) ? [startPos longLongValue] : 0, (size != nil) ? [size longLongValue] : 0, NULL);
1630}
1631
1632- (void)cancelTransfer:(MEGATransfer *)transfer delegate:(id<MEGARequestDelegate>)delegate {
1633    self.megaApi->cancelTransfer((transfer != nil) ? [transfer getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1634}
1635
1636- (void)cancelTransfer:(MEGATransfer *)transfer {
1637    self.megaApi->cancelTransfer((transfer != nil) ? [transfer getCPtr] : NULL);
1638}
1639
1640- (void)moveTransferToFirst:(MEGATransfer *)transfer delegate:(id<MEGARequestDelegate>)delegate {
1641    self.megaApi->moveTransferToFirst((transfer != nil) ? [transfer getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1642}
1643
1644- (void)moveTransferToFirst:(MEGATransfer *)transfer {
1645    self.megaApi->moveTransferToFirst((transfer != nil) ? [transfer getCPtr] : NULL);
1646}
1647
1648- (void)moveTransferToLast:(MEGATransfer *)transfer delegate:(id<MEGARequestDelegate>)delegate {
1649    self.megaApi->moveTransferToLast((transfer != nil) ? [transfer getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1650}
1651
1652- (void)moveTransferToLast:(MEGATransfer *)transfer {
1653    self.megaApi->moveTransferToLast((transfer != nil) ? [transfer getCPtr] : NULL);
1654}
1655
1656- (void)moveTransferBefore:(MEGATransfer *)transfer prevTransfer:(MEGATransfer *)prevTransfer delegate:(id<MEGARequestDelegate>)delegate {
1657    self.megaApi->moveTransferBefore((transfer != nil) ? [transfer getCPtr] : NULL, (prevTransfer != nil) ? [prevTransfer getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1658}
1659
1660- (void)moveTransferBefore:(MEGATransfer *)transfer prevTransfer:(MEGATransfer *)prevTransfer {
1661    self.megaApi->moveTransferBefore((transfer != nil) ? [transfer getCPtr] : NULL, (prevTransfer != nil) ? [prevTransfer getCPtr] : NULL);
1662}
1663
1664- (void)cancelTransfersForDirection:(NSInteger)direction delegate:(id<MEGARequestDelegate>)delegate {
1665    self.megaApi->cancelTransfers((int)direction, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1666}
1667
1668- (void)cancelTransfersForDirection:(NSInteger)direction {
1669    self.megaApi->cancelTransfers((int)direction);
1670}
1671
1672- (void)cancelTransferByTag:(NSInteger)transferTag delegate:(id<MEGARequestDelegate>)delegate {
1673    self.megaApi->cancelTransferByTag((int)transferTag, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1674}
1675
1676- (void)cancelTransferByTag:(NSInteger)transferTag {
1677    self.megaApi->cancelTransferByTag((int)transferTag);
1678}
1679
1680- (void)pauseTransfers:(BOOL)pause delegate:(id<MEGARequestDelegate>)delegate {
1681    self.megaApi->pauseTransfers(pause, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1682}
1683
1684- (void)pauseTransfers:(BOOL)pause {
1685    self.megaApi->pauseTransfers(pause);
1686}
1687
1688- (void)pauseTransfers:(BOOL)pause forDirection:(NSInteger)direction delegate:(id<MEGARequestDelegate>)delegate {
1689    self.megaApi->pauseTransfers(pause, (int)direction, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1690}
1691
1692- (void)pauseTransfers:(BOOL)pause forDirection:(NSInteger)direction {
1693    self.megaApi->pauseTransfers(pause, (int)direction);
1694}
1695
1696- (void)pauseTransfer:(MEGATransfer *)transfer pause:(BOOL)pause delegate:(id<MEGARequestDelegate>)delegate {
1697    self.megaApi->pauseTransfer((transfer != nil) ? [transfer getCPtr] : NULL, pause, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1698}
1699
1700- (void)pauseTransfer:(MEGATransfer *)transfer pause:(BOOL)pause {
1701    self.megaApi->pauseTransfer((transfer != nil) ? [transfer getCPtr] : NULL, pause);
1702}
1703
1704- (void)pauseTransferByTag:(NSInteger)transferTag pause:(BOOL)pause delegate:(id<MEGARequestDelegate>)delegate {
1705    self.megaApi->pauseTransferByTag((int)transferTag, pause, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1706}
1707
1708- (void)pauseTransferByTag:(NSInteger)transferTag pause:(BOOL)pause {
1709    self.megaApi->pauseTransferByTag((int)transferTag, pause);
1710}
1711
1712- (void)enableTransferResumption:(NSString *)loggedOutId {
1713    self.megaApi->enableTransferResumption((loggedOutId != nil) ? [loggedOutId UTF8String] : NULL);
1714}
1715
1716- (void)enableTransferResumption {
1717    self.megaApi->enableTransferResumption();
1718}
1719
1720- (void)disableTransferResumption:(NSString *)loggedOutId {
1721    self.megaApi->disableTransferResumption((loggedOutId != nil) ? [loggedOutId UTF8String] : NULL);
1722}
1723
1724- (void)disableTransferResumption {
1725    self.megaApi->disableTransferResumption();
1726}
1727
1728- (BOOL)areTransferPausedForDirection:(NSInteger)direction {
1729    return self.megaApi->areTransfersPaused((int)direction);
1730}
1731
1732- (void)setUploadLimitWithBpsLimit:(NSInteger)bpsLimit {
1733    self.megaApi->setUploadLimit((int)bpsLimit);
1734}
1735
1736- (void)requestBackgroundUploadURLWithFileSize:(int64_t)filesize mediaUpload:(MEGABackgroundMediaUpload *)mediaUpload delegate:(id<MEGARequestDelegate>)delegate {
1737    self.megaApi->backgroundMediaUploadRequestUploadURL(filesize, mediaUpload.getCPtr, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1738}
1739
1740- (void)completeBackgroundMediaUpload:(MEGABackgroundMediaUpload *)mediaUpload fileName:(NSString *)fileName parentNode:(MEGANode *)parentNode fingerprint:(NSString *)fingerprint originalFingerprint:(NSString *)originalFingerprint binaryUploadToken:(NSData *)token delegate:(id<MEGARequestDelegate>)delegate {
1741    const char *base64Token = MegaApi::binaryToBase64((const char *)token.bytes, token.length);
1742    self.megaApi->backgroundMediaUploadComplete(mediaUpload.getCPtr, fileName.UTF8String, parentNode.getCPtr, fingerprint.UTF8String, originalFingerprint.UTF8String, base64Token, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1743}
1744
1745- (BOOL)ensureMediaInfo {
1746    return self.megaApi->ensureMediaInfo();
1747}
1748
1749- (BOOL)testAllocationByAllocationCount:(NSUInteger)count allocationSize:(NSUInteger)size {
1750    return self.megaApi->testAllocation((unsigned)count, size);
1751}
1752
1753#pragma mark - Filesystem inspection
1754
1755- (NSInteger)numberChildrenForParent:(MEGANode *)parent {
1756    return self.megaApi->getNumChildren((parent != nil) ? [parent getCPtr] : NULL);
1757}
1758
1759- (NSInteger)numberChildFilesForParent:(MEGANode *)parent {
1760    return self.megaApi->getNumChildFiles((parent != nil) ? [parent getCPtr] : NULL);
1761}
1762
1763- (NSInteger)numberChildFoldersForParent:(MEGANode *)parent {
1764    return self.megaApi->getNumChildFolders((parent != nil) ? [parent getCPtr] : NULL);
1765}
1766
1767- (MEGANodeList *)childrenForParent:(MEGANode *)parent order:(NSInteger)order {
1768    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getChildren((parent != nil) ? [parent getCPtr] : NULL, (int)order) cMemoryOwn:YES];
1769}
1770
1771- (MEGANodeList *)childrenForParent:(MEGANode *)parent {
1772    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getChildren((parent != nil) ? [parent getCPtr] : NULL) cMemoryOwn:YES];
1773}
1774
1775- (MEGANodeList *)versionsForNode:(MEGANode *)node {
1776    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getVersions(node ? [node getCPtr] : NULL) cMemoryOwn:YES];
1777}
1778
1779- (NSInteger)numberOfVersionsForNode:(MEGANode *)node {
1780    return self.megaApi->getNumVersions(node ? [node getCPtr] : NULL);
1781}
1782
1783- (BOOL)hasVersionsForNode:(MEGANode *)node {
1784    return self.megaApi->hasVersions(node ? [node getCPtr] : NULL);
1785}
1786
1787- (void)getFolderInfoForNode:(MEGANode *)node delegate:(id<MEGARequestDelegate>)delegate {
1788    self.megaApi->getFolderInfo(node ? [node getCPtr] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
1789}
1790
1791- (void)getFolderInfoForNode:(MEGANode *)node {
1792    self.megaApi->getFolderInfo(node ? [node getCPtr] : NULL);
1793}
1794
1795- (MEGAChildrenLists *)fileFolderChildrenForParent:(MEGANode *)parent order:(NSInteger)order {
1796    return [[MEGAChildrenLists alloc] initWithMegaChildrenLists:self.megaApi->getFileFolderChildren(parent ? [parent getCPtr] : NULL, (int)order) cMemoryOwn:YES];
1797}
1798
1799- (MEGAChildrenLists *)fileFolderChildrenForParent:(MEGANode *)parent {
1800    return [[MEGAChildrenLists alloc] initWithMegaChildrenLists:self.megaApi->getFileFolderChildren(parent ? [parent getCPtr] : NULL) cMemoryOwn:YES];
1801}
1802
1803- (MEGANode *)childNodeForParent:(MEGANode *)parent name:(NSString *)name {
1804    if (parent == nil || name == nil) return nil;
1805
1806    MegaNode *node = self.megaApi->getChildNode([parent getCPtr], [name UTF8String]);
1807
1808    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
1809}
1810
1811- (MEGANode *)parentNodeForNode:(MEGANode *)node {
1812    if (node == nil) return nil;
1813
1814    MegaNode *parent = self.megaApi->getParentNode([node getCPtr]);
1815
1816    return parent ? [[MEGANode alloc] initWithMegaNode:parent cMemoryOwn:YES] : nil;
1817}
1818
1819- (NSString *)nodePathForNode:(MEGANode *)node {
1820    if (node == nil) return nil;
1821
1822    const char *val = self.megaApi->getNodePath([node getCPtr]);
1823    if (!val) return nil;
1824
1825    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1826
1827    delete [] val;
1828    return ret;
1829}
1830
1831- (MEGANode *)nodeForPath:(NSString *)path node:(MEGANode *)node {
1832    if (path == nil || node == nil) return nil;
1833
1834    MegaNode *n = self.megaApi->getNodeByPath([path UTF8String], [node getCPtr]);
1835
1836    return n ? [[MEGANode alloc] initWithMegaNode:n cMemoryOwn:YES] : Nil;
1837}
1838
1839- (MEGANode *)nodeForPath:(NSString *)path {
1840    if (path == nil) return nil;
1841
1842    MegaNode *node = self.megaApi->getNodeByPath([path UTF8String]);
1843
1844    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
1845}
1846
1847- (MEGANode *)nodeForHandle:(uint64_t)handle {
1848    if (handle == ::mega::INVALID_HANDLE) return nil;
1849
1850    MegaNode *node = self.megaApi->getNodeByHandle(handle);
1851
1852    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
1853}
1854
1855- (MEGAUserList *)contacts {
1856    return [[MEGAUserList alloc] initWithUserList:self.megaApi->getContacts() cMemoryOwn:YES];
1857}
1858
1859- (MEGAUser *)contactForEmail:(NSString *)email {
1860    if (email == nil) return nil;
1861
1862    MegaUser *user = self.megaApi->getContact([email UTF8String]);
1863    return user ? [[MEGAUser alloc] initWithMegaUser:user cMemoryOwn:YES] : nil;
1864}
1865
1866- (MEGAUserAlertList *)userAlertList {
1867    return [[MEGAUserAlertList alloc] initWithMegaUserAlertList:self.megaApi->getUserAlerts() cMemoryOwn:YES];
1868}
1869
1870- (MEGANodeList *)inSharesForUser:(MEGAUser *)user {
1871    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getInShares((user != nil) ? [user getCPtr] : NULL) cMemoryOwn:YES];
1872}
1873
1874- (MEGANodeList *)inShares {
1875    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getInShares() cMemoryOwn:YES];
1876}
1877
1878- (MEGAShareList *)inSharesList:(MEGASortOrderType)order {
1879    return [[MEGAShareList alloc] initWithShareList:self.megaApi->getInSharesList((int)order) cMemoryOwn:YES];
1880}
1881
1882- (MEGAUser *)userFromInShareNode:(MEGANode *)node {
1883    return [[MEGAUser alloc] initWithMegaUser:self.megaApi->getUserFromInShare(node ? [node getCPtr] : NULL) cMemoryOwn:YES];
1884}
1885
1886- (MEGAUser *)userFromInShareNode:(MEGANode *)node recurse:(BOOL)recurse {
1887    return [MEGAUser.alloc initWithMegaUser:self.megaApi->getUserFromInShare(node ? [node getCPtr] : NULL, recurse) cMemoryOwn:YES];
1888}
1889
1890- (BOOL)isSharedNode:(MEGANode *)node {
1891    if (!node) return NO;
1892
1893    return self.megaApi->isShared([node getCPtr]);
1894}
1895
1896- (MEGAShareList *)outShares:(MEGASortOrderType)order {
1897    return [[MEGAShareList alloc] initWithShareList:self.megaApi->getOutShares((int)order) cMemoryOwn:YES];
1898}
1899
1900- (MEGAShareList *)outSharesForNode:(MEGANode *)node {
1901    return [[MEGAShareList alloc] initWithShareList:self.megaApi->getOutShares((node != nil) ? [node getCPtr] : NULL) cMemoryOwn:YES];
1902}
1903
1904- (MEGANodeList *)publicLinks:(MEGASortOrderType)order {
1905    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getPublicLinks((int)order) cMemoryOwn:YES];
1906}
1907
1908- (MEGAContactRequestList *)incomingContactRequests {
1909    return [[MEGAContactRequestList alloc] initWithMegaContactRequestList:self.megaApi->getIncomingContactRequests() cMemoryOwn:YES];
1910}
1911
1912- (MEGAContactRequestList *)outgoingContactRequests {
1913    return [[MEGAContactRequestList alloc] initWithMegaContactRequestList:self.megaApi->getOutgoingContactRequests() cMemoryOwn:YES];
1914}
1915
1916- (NSString *)fingerprintForFilePath:(NSString *)filePath {
1917    if (filePath == nil) return nil;
1918
1919    const char *val = self.megaApi->getFingerprint([filePath UTF8String]);
1920    if (!val) return nil;
1921
1922    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1923
1924    delete [] val;
1925    return ret;
1926}
1927
1928- (NSString *)fingerprintForData:(NSData *)data modificationTime:(NSDate *)modificationTime {
1929    if (data == nil) return nil;
1930
1931    MEGADataInputStream mis = MEGADataInputStream(data);
1932    return [self fingerprintForInputStream:&mis modificationTime:modificationTime];
1933}
1934
1935- (NSString *)fingerprintForFilePath:(NSString *)filePath modificationTime:(NSDate *)modificationTime {
1936    if (filePath.length == 0) return nil;
1937
1938    MEGAFileInputStream mis = MEGAFileInputStream(filePath);
1939    return [self fingerprintForInputStream:&mis modificationTime:modificationTime];
1940}
1941
1942- (NSString *)fingerprintForInputStream:(MegaInputStream *)stream modificationTime:(NSDate *)modificationTime {
1943    const char *val = self.megaApi->getFingerprint(stream, (long long)[modificationTime timeIntervalSince1970]);
1944    if (val != NULL) {
1945        NSString *ret = [[NSString alloc] initWithUTF8String:val];
1946        delete [] val;
1947        return ret;
1948    } else {
1949        return nil;
1950    }
1951}
1952
1953- (NSString *)fingerprintForNode:(MEGANode *)node {
1954    if (node == nil) return nil;
1955
1956    const char *val = self.megaApi->getFingerprint([node getCPtr]);
1957    if (!val) return nil;
1958
1959    NSString *ret = [[NSString alloc] initWithUTF8String:val];
1960
1961    delete [] val;
1962    return ret;
1963}
1964
1965- (MEGANode *)nodeForFingerprint:(NSString *)fingerprint {
1966    if (fingerprint == nil) return nil;
1967
1968    MegaNode *node = self.megaApi->getNodeByFingerprint([fingerprint UTF8String]);
1969
1970    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
1971}
1972
1973- (MEGANode *)nodeForFingerprint:(NSString *)fingerprint parent:(MEGANode *)parent {
1974    if (fingerprint == nil) return nil;
1975
1976    MegaNode *node = self.megaApi->getNodeByFingerprint([fingerprint UTF8String], (parent != nil) ? [parent getCPtr] : NULL);
1977
1978    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
1979}
1980
1981- (MEGANodeList *)nodesForOriginalFingerprint:(NSString *)fingerprint {
1982    if (fingerprint.length == 0) {
1983        return nil;
1984    }
1985
1986    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->getNodesByOriginalFingerprint([fingerprint UTF8String], NULL) cMemoryOwn:YES];
1987}
1988
1989- (BOOL)hasFingerprint:(NSString *)fingerprint{
1990    if (fingerprint == nil) return NO;
1991
1992    return self.megaApi->hasFingerprint([fingerprint UTF8String]);
1993}
1994
1995- (NSString *)CRCForFilePath:(NSString *)filePath {
1996    if (filePath == nil) return nil;
1997
1998    const char *val = self.megaApi->getCRC([filePath UTF8String]);
1999    if (!val) return nil;
2000
2001    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2002
2003    delete [] val;
2004    return ret;
2005}
2006
2007- (NSString *)CRCForFingerprint:(NSString *)fingerprint{
2008    if (fingerprint == nil) {
2009        return nil;
2010    }
2011
2012    const char *val = self.megaApi->getCRCFromFingerprint([fingerprint UTF8String]);
2013    if (!val) return nil;
2014
2015    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2016
2017    delete [] val;
2018    return ret;
2019}
2020
2021- (NSString *)CRCForNode:(MEGANode *)node {
2022    if (node == nil) return nil;
2023
2024    const char *val = self.megaApi->getCRC([node getCPtr]);
2025    if (!val) return nil;
2026
2027    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2028
2029    delete [] val;
2030    return ret;
2031}
2032
2033- (MEGANode *)nodeByCRC:(NSString *)crc parent:(MEGANode *)parent {
2034    if (crc == nil) return nil;
2035
2036    MegaNode *node = self.megaApi->getNodeByCRC([crc UTF8String], (parent != nil) ? [parent getCPtr] : NULL);
2037
2038    return node ? [[MEGANode alloc] initWithMegaNode:node cMemoryOwn:YES] : nil;
2039}
2040
2041- (MEGAShareType)accessLevelForNode:(MEGANode *)node {
2042    if (node == nil) return MEGAShareTypeAccessUnknown;
2043
2044    return (MEGAShareType) self.megaApi->getAccess([node getCPtr]);
2045}
2046
2047- (MEGAError *)checkAccessForNode:(MEGANode *)node level:(MEGAShareType)level {
2048    if (node == nil) return nil;
2049
2050    return [[MEGAError alloc] initWithMegaError:self.megaApi->checkAccess((node != nil) ? [node getCPtr] : NULL, (int) level).copy() cMemoryOwn:YES];
2051}
2052
2053- (BOOL)isNodeInRubbish:(MEGANode *)node {
2054    return self.megaApi->isInRubbish(node ? [node getCPtr] : NULL);
2055}
2056
2057- (MEGAError *)checkMoveForNode:(MEGANode *)node target:(MEGANode *)target {
2058    return [[MEGAError alloc] initWithMegaError:self.megaApi->checkMove((node != nil) ? [node getCPtr] : NULL, (target != nil) ? [target getCPtr] : NULL).copy() cMemoryOwn:YES];
2059}
2060
2061- (MEGANodeList *)nodeListSearchForNode:(MEGANode *)node searchString:(NSString *)searchString recursive:(BOOL)recursive {
2062    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->search((node != nil) ? [node getCPtr] : NULL, (searchString != nil) ? [searchString UTF8String] : NULL, recursive) cMemoryOwn:YES];
2063}
2064
2065- (MEGANodeList *)nodeListSearchForNode:(MEGANode *)node searchString:(NSString *)searchString cancelToken:(MEGACancelToken *)cancelToken recursive:(BOOL)recursive order:(MEGASortOrderType)order {
2066    return [MEGANodeList.alloc initWithNodeList:self.megaApi->search(node ? [node getCPtr] : NULL, searchString.UTF8String, cancelToken ? [cancelToken getCPtr] : NULL, recursive, (int)order) cMemoryOwn:YES];
2067}
2068
2069- (MEGANodeList *)nodeListSearchForNode:(MEGANode *)node searchString:(NSString *)searchString {
2070    return [[MEGANodeList alloc] initWithNodeList:self.megaApi->search((node != nil) ? [node getCPtr] : NULL, (searchString != nil) ? [searchString UTF8String] : NULL, YES) cMemoryOwn:YES];
2071}
2072
2073- (NSMutableArray *)recentActions {
2074    MegaRecentActionBucketList *megaRecentActionBucketList = self.megaApi->getRecentActions();
2075    int count = megaRecentActionBucketList->size();
2076    NSMutableArray *recentActionBucketMutableArray = [NSMutableArray.alloc initWithCapacity:(NSInteger)count];
2077    for (int i = 0; i < count; i++) {
2078        MEGARecentActionBucket *recentActionBucket = [MEGARecentActionBucket.alloc initWithMegaRecentActionBucket:megaRecentActionBucketList->get(i)->copy() cMemoryOwn:YES];
2079        [recentActionBucketMutableArray addObject:recentActionBucket];
2080    }
2081
2082    return recentActionBucketMutableArray;
2083}
2084
2085- (NSMutableArray *)recentActionsSinceDays:(NSInteger)days maxNodes:(NSInteger)maxNodes {
2086    MegaRecentActionBucketList *megaRecentActionBucketList = self.megaApi->getRecentActions((int)days, (int)maxNodes);
2087    int count = megaRecentActionBucketList->size();
2088    NSMutableArray *recentActionBucketMutableArray = [NSMutableArray.alloc initWithCapacity:(NSInteger)count];
2089    for (int i = 0; i < count; i++) {
2090        MEGARecentActionBucket *recentActionBucket = [MEGARecentActionBucket.alloc initWithMegaRecentActionBucket:megaRecentActionBucketList->get(i)->copy() cMemoryOwn:YES];
2091        [recentActionBucketMutableArray addObject:recentActionBucket];
2092    }
2093
2094    return recentActionBucketMutableArray;
2095}
2096
2097- (BOOL)processMEGANodeTree:(MEGANode *)node recursive:(BOOL)recursive delegate:(id<MEGATreeProcessorDelegate>)delegate {
2098    return self.megaApi->processMegaTree(node ? [node getCPtr] : NULL, [self createMegaTreeProcessor:delegate], recursive);
2099}
2100
2101- (MEGANode *)authorizeNode:(MEGANode *)node {
2102    return [[MEGANode alloc] initWithMegaNode:self.megaApi->authorizeNode((node != nil) ? [node getCPtr] : NULL) cMemoryOwn:YES];
2103}
2104
2105#ifdef ENABLE_CHAT
2106
2107- (MEGANode *)authorizeChatNode:(MEGANode *)node cauth:(NSString *)cauth {
2108    return [[MEGANode alloc] initWithMegaNode:self.megaApi->authorizeChatNode(node ? [node getCPtr] : NULL, cauth ? [cauth UTF8String] : NULL) cMemoryOwn:YES];
2109}
2110
2111#endif
2112
2113- (NSNumber *)sizeForNode:(MEGANode *)node {
2114    return [[NSNumber alloc] initWithLongLong:self.megaApi->getSize([node getCPtr])];
2115}
2116
2117- (NSString *)escapeFsIncompatible:(NSString *)name {
2118    if (name == nil) return nil;
2119
2120    const char *val = self.megaApi->escapeFsIncompatible([name UTF8String]);
2121    if (!val) return nil;
2122
2123    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2124
2125    delete [] val;
2126    return ret;
2127}
2128
2129- (NSString *)escapeFsIncompatible:(NSString *)name destinationPath:(NSString *)destinationPath {
2130    if (name == nil) return nil;
2131
2132    const char *val = self.megaApi->escapeFsIncompatible(name.UTF8String, destinationPath.UTF8String);
2133    if (!val) return nil;
2134
2135    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2136
2137    delete [] val;
2138    return ret;
2139}
2140
2141- (NSString *)unescapeFsIncompatible:(NSString *)localName {
2142    if (localName == nil) return nil;
2143
2144    const char *val = self.megaApi->unescapeFsIncompatible([localName UTF8String]);
2145    if (!val) return nil;
2146
2147    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2148
2149    delete [] val;
2150    return ret;
2151}
2152
2153- (NSString *)unescapeFsIncompatible:(NSString *)localName destinationPath:(NSString *)destinationPath {
2154    if (localName == nil) return nil;
2155
2156    const char *val = self.megaApi->unescapeFsIncompatible(localName.UTF8String, destinationPath.UTF8String);
2157    if (!val) return nil;
2158
2159    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2160
2161    delete [] val;
2162    return ret;
2163}
2164
2165- (void)changeApiUrl:(NSString *)apiURL disablepkp:(BOOL)disablepkp {
2166    self.megaApi->changeApiUrl((apiURL != nil) ? [apiURL UTF8String] : NULL, disablepkp);
2167}
2168
2169- (BOOL)setLanguageCode:(NSString *)languageCode {
2170    return self.megaApi->setLanguage(languageCode ? [languageCode UTF8String] : NULL);
2171}
2172
2173- (void)setLanguangePreferenceCode:(NSString *)languageCode delegate:(id<MEGARequestDelegate>)delegate {
2174    self.megaApi->setLanguagePreference(languageCode ? [languageCode UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2175}
2176
2177- (void)setLanguangePreferenceCode:(NSString *)languageCode {
2178    self.megaApi->setLanguagePreference(languageCode ? [languageCode UTF8String] : NULL);
2179}
2180
2181- (void)getLanguagePreferenceWithDelegate:(id<MEGARequestDelegate>)delegate {
2182    self.megaApi->getLanguagePreference([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2183}
2184
2185- (void)getLanguagePreference {
2186    self.megaApi->getLanguagePreference();
2187}
2188
2189- (void)setFileVersionsOption:(BOOL)disable delegate:(id<MEGARequestDelegate>)delegate {
2190    self.megaApi->setFileVersionsOption(disable, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2191}
2192
2193- (void)setFileVersionsOption:(BOOL)disable {
2194    self.megaApi->setFileVersionsOption(disable);
2195}
2196
2197- (void)getFileVersionsOptionWithDelegate:(id<MEGARequestDelegate>)delegate {
2198    self.megaApi->getFileVersionsOption([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2199}
2200
2201- (void)getFileVersionsOption {
2202    self.megaApi->getFileVersionsOption();
2203}
2204
2205- (void)setContactLinksOptionDisable:(BOOL)disable delegate:(id<MEGARequestDelegate>)delegate {
2206    self.megaApi->setContactLinksOption(disable, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2207}
2208
2209- (void)setContactLinksOptionDisable:(BOOL)disable {
2210    self.megaApi->setContactLinksOption(disable);
2211}
2212
2213- (void)getContactLinksOptionWithDelegate:(id<MEGARequestDelegate>)delegate {
2214    self.megaApi->getContactLinksOption([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2215}
2216
2217- (void)getContactLinksOption {
2218    self.megaApi->getContactLinksOption();
2219}
2220
2221- (void)retrySSLErrors:(BOOL)enable {
2222    self.megaApi->retrySSLerrors(enable);
2223}
2224
2225- (void)setPublicKeyPinning:(BOOL)enable {
2226    self.megaApi->setPublicKeyPinning(enable);
2227}
2228
2229- (BOOL)createThumbnail:(NSString *)imagePath destinatioPath:(NSString *)destinationPath {
2230    if (imagePath == nil || destinationPath == nil) return NO;
2231
2232    return self.megaApi->createThumbnail([imagePath UTF8String], [destinationPath UTF8String]);
2233}
2234
2235- (BOOL)createPreview:(NSString *)imagePath destinatioPath:(NSString *)destinationPath {
2236    if (imagePath == nil || destinationPath == nil) return NO;
2237
2238    return self.megaApi->createPreview([imagePath UTF8String], [destinationPath UTF8String]);
2239}
2240
2241- (BOOL)createAvatar:(NSString *)imagePath destinationPath:(NSString *)destinationPath {
2242    if (imagePath == nil || destinationPath == nil) return NO;
2243
2244    return self.megaApi->createAvatar([imagePath UTF8String], [destinationPath UTF8String]);
2245}
2246
2247#ifdef HAVE_LIBUV
2248
2249#pragma mark - HTTP Proxy Server
2250
2251- (BOOL)httpServerStart:(BOOL)localOnly port:(NSInteger)port {
2252    return self.megaApi->httpServerStart(localOnly, (int)port, false, NULL, NULL, true);
2253}
2254
2255- (void)httpServerStop {
2256    self.megaApi->httpServerStop();
2257}
2258
2259- (NSInteger)httpServerIsRunning {
2260    return (NSInteger)self.megaApi->httpServerIsRunning();
2261}
2262
2263- (BOOL)httpServerIsLocalOnly {
2264    return self.megaApi->httpServerIsLocalOnly();
2265}
2266
2267- (void)httpServerEnableFileServer:(BOOL)enable {
2268    self.megaApi->httpServerEnableFileServer(enable);
2269}
2270
2271- (BOOL)httpServerIsFileServerEnabled {
2272    return self.megaApi->httpServerIsFileServerEnabled();
2273}
2274
2275- (void)httpServerEnableFolderServer:(BOOL)enable {
2276    self.megaApi->httpServerEnableFolderServer(enable);
2277}
2278
2279- (BOOL)httpServerIsFolderServerEnabled {
2280    return self.megaApi->httpServerIsFolderServerEnabled();
2281}
2282
2283- (void)httpServerSetRestrictedMode:(NSInteger)mode {
2284    self.megaApi->httpServerSetRestrictedMode((int)mode);
2285}
2286
2287- (NSInteger)httpServerGetRestrictedMode {
2288    return (NSInteger)self.megaApi->httpServerGetRestrictedMode();
2289}
2290
2291- (void)httpServerEnableSubtitlesSupport:(BOOL)enable {
2292    self.megaApi->httpServerEnableSubtitlesSupport(enable);
2293}
2294
2295- (BOOL)httpServerIsSubtitlesSupportEnabled {
2296    return self.megaApi->httpServerIsSubtitlesSupportEnabled();
2297}
2298
2299- (void)httpServerAddDelegate:(id<MEGATransferDelegate>)delegate {
2300    self.megaApi->httpServerAddListener([self createDelegateMEGATransferListener:delegate singleListener:NO]);
2301}
2302
2303- (void)httpServerRemoveDelegate:(id<MEGATransferDelegate>)delegate {
2304    self.megaApi->httpServerRemoveListener([self createDelegateMEGATransferListener:delegate singleListener:NO]);
2305}
2306
2307- (NSURL *)httpServerGetLocalLink:(MEGANode *)node {
2308    const char *val = self.megaApi->httpServerGetLocalLink([node getCPtr]);
2309    if (!val) return nil;
2310
2311    NSURL *ret = [NSURL URLWithString:[NSString stringWithUTF8String:val]];
2312
2313    delete [] val;
2314    return ret;
2315}
2316
2317- (void)httpServerSetMaxBufferSize:(NSInteger)bufferSize {
2318    self.megaApi->httpServerSetMaxBufferSize((int)bufferSize);
2319}
2320
2321- (NSInteger)httpServerGetMaxBufferSize {
2322    return (NSInteger)self.megaApi->httpServerGetMaxBufferSize();
2323}
2324
2325- (void)httpServerSetMaxOutputSize:(NSInteger)outputSize {
2326    self.megaApi->httpServerSetMaxOutputSize((int)outputSize);
2327}
2328
2329- (NSInteger)httpServerGetMaxOutputSize {
2330    return (NSInteger)self.megaApi->httpServerGetMaxOutputSize();
2331}
2332
2333#endif
2334
2335+ (NSString *)mimeTypeByExtension:(NSString *)extension {
2336    const char *val = MegaApi::getMimeType([extension UTF8String]);
2337    if (!val) return nil;
2338
2339    NSString *ret = [[NSString alloc] initWithUTF8String:val];
2340
2341    delete [] val;
2342    return ret;
2343}
2344
2345- (void)registeriOSdeviceToken:(NSString *)deviceToken delegate:(id<MEGARequestDelegate>)delegate {
2346    self.megaApi->registerPushNotifications(PushNotificationTokenTypeiOSStandard, deviceToken ? [deviceToken UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2347}
2348
2349- (void)registeriOSdeviceToken:(NSString *)deviceToken {
2350    self.megaApi->registerPushNotifications(PushNotificationTokenTypeiOSStandard, deviceToken ? [deviceToken UTF8String] : NULL);
2351}
2352
2353- (void)registeriOSVoIPdeviceToken:(NSString *)deviceToken delegate:(id<MEGARequestDelegate>)delegate {
2354    self.megaApi->registerPushNotifications(PushNotificationTokenTypeiOSVoIP, deviceToken ? [deviceToken UTF8String] : NULL, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2355}
2356
2357- (void)registeriOSVoIPdeviceToken:(NSString *)deviceToken {
2358    self.megaApi->registerPushNotifications(PushNotificationTokenTypeiOSVoIP, deviceToken ? [deviceToken UTF8String] : NULL);
2359}
2360
2361- (void)getAccountAchievementsWithDelegate:(id<MEGARequestDelegate>)delegate {
2362    self.megaApi->getAccountAchievements([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2363}
2364
2365- (void)getAccountAchievements {
2366    self.megaApi->getAccountAchievements();
2367}
2368
2369- (void)getMegaAchievementsWithDelegate:(id<MEGARequestDelegate>)delegate {
2370    self.megaApi->getMegaAchievements([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2371}
2372
2373- (void)getMegaAchievements {
2374    self.megaApi->getMegaAchievements();
2375}
2376
2377- (void)getPublicLinkInformationWithFolderLink:(NSString *)folderLink delegate:(id<MEGARequestDelegate>)delegate {
2378    self.megaApi->getPublicLinkInformation(folderLink.UTF8String, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2379}
2380
2381- (void)getPublicLinkInformationWithFolderLink:(NSString *)folderLink {
2382    self.megaApi->getPublicLinkInformation(folderLink.UTF8String);
2383}
2384
2385#pragma mark - SMS
2386
2387- (SMSState)smsAllowedState {
2388    return (SMSState)self.megaApi->smsAllowedState();
2389}
2390
2391- (nullable NSString *)smsVerifiedPhoneNumber {
2392    char *number = self.megaApi->smsVerifiedPhoneNumber();
2393
2394    if (number == NULL) {
2395        return nil;
2396    }
2397
2398    NSString *numberString = @(number);
2399    delete [] number;
2400    return numberString;
2401}
2402
2403- (void)getRegisteredContacts:(NSArray<NSDictionary *> *)contacts delegate:(id<MEGARequestDelegate>)delegate {
2404    MegaStringMap *stringMapContacts = MegaStringMap::createInstance();
2405    for (NSDictionary *contact in contacts) {
2406        NSString *key = contact.allKeys.firstObject;
2407        NSString *value = contact.allValues.firstObject;
2408        stringMapContacts->set(key.UTF8String, value.UTF8String);
2409    }
2410
2411    self.megaApi->getRegisteredContacts(stringMapContacts, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2412
2413    delete stringMapContacts;
2414}
2415
2416- (void)getCountryCallingCodesWithDelegate:(id<MEGARequestDelegate>)delegate {
2417    self.megaApi->getCountryCallingCodes([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2418}
2419
2420- (void)sendSMSVerificationCodeToPhoneNumber:(NSString *)phoneNumber delegate:(id<MEGARequestDelegate>)delegate {
2421    self.megaApi->sendSMSVerificationCode([phoneNumber UTF8String], [self createDelegateMEGARequestListener:delegate singleListener:YES], YES);
2422}
2423
2424- (void)checkSMSVerificationCode:(NSString *)verificationCode delegate:(id<MEGARequestDelegate>)delegate {
2425    self.megaApi->checkSMSVerificationCode([verificationCode UTF8String], [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2426}
2427
2428- (void)resetSmsVerifiedPhoneNumberWithDelegate:(id<MEGARequestDelegate>)delegate {
2429    self.megaApi->resetSmsVerifiedPhoneNumber([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2430}
2431
2432- (void)resetSmsVerifiedPhoneNumberWithDelegate {
2433    self.megaApi->resetSmsVerifiedPhoneNumber();
2434}
2435
2436#pragma mark - Push Notification Settings
2437
2438- (void)getPushNotificationSettingsWithDelegate:(id<MEGARequestDelegate>)delegate {
2439    self.megaApi->getPushNotificationSettings([self createDelegateMEGARequestListener:delegate singleListener:YES]);
2440}
2441
2442- (void)getPushNotificationSettings {
2443    self.megaApi->getPushNotificationSettings();
2444}
2445
2446- (void)setPushNotificationSettings:(MEGAPushNotificationSettings *)pushNotificationSettings
2447                           delegate:(id<MEGARequestDelegate>)delegate {
2448    self.megaApi->setPushNotificationSettings(pushNotificationSettings.getCPtr,
2449                                              [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2450}
2451
2452- (void)setPushNotificationSettings:(MEGAPushNotificationSettings *)pushNotificationSettings {
2453    self.megaApi->setPushNotificationSettings(pushNotificationSettings.getCPtr);
2454}
2455
2456#pragma mark - Debug
2457
2458+ (void)setLogLevel:(MEGALogLevel)logLevel {
2459    MegaApi::setLogLevel((int)logLevel);
2460}
2461
2462+ (void)setLogToConsole:(BOOL)enable {
2463    MegaApi::setLogToConsole(enable);
2464}
2465
2466+ (void)logWithLevel:(MEGALogLevel)logLevel message:(NSString *)message filename:(NSString *)filename line:(NSInteger)line {
2467    MegaApi::log((int)logLevel, (message != nil) ? [message UTF8String] : NULL, (filename != nil) ? [filename UTF8String] : NULL, (int)line);
2468}
2469
2470+ (void)logWithLevel:(MEGALogLevel)logLevel message:(NSString *)message filename:(NSString *)filename {
2471    MegaApi::log((int)logLevel, (message != nil) ? [message UTF8String] : NULL, (filename != nil) ? [filename UTF8String] : NULL);
2472}
2473
2474+ (void)logWithLevel:(MEGALogLevel)logLevel message:(NSString *)message {
2475    MegaApi::log((int)logLevel, (message != nil) ? [message UTF8String] : NULL);
2476}
2477
2478- (void)sendEvent:(NSInteger)eventType message:(NSString *)message delegate:(id<MEGARequestDelegate>)delegate {
2479    self.megaApi->sendEvent((int)eventType, message.UTF8String, [self createDelegateMEGARequestListener:delegate singleListener:YES]);
2480}
2481
2482- (void)sendEvent:(NSInteger)eventType message:(NSString *)message {
2483    self.megaApi->sendEvent((int)eventType, message.UTF8String);
2484}
2485
2486#pragma mark - Private methods
2487
2488- (MegaRequestListener *)createDelegateMEGARequestListener:(id<MEGARequestDelegate>)delegate singleListener:(BOOL)singleListener {
2489    if (delegate == nil) return nil;
2490
2491    DelegateMEGARequestListener *delegateListener = new DelegateMEGARequestListener(self, delegate, singleListener);
2492    pthread_mutex_lock(&listenerMutex);
2493    _activeRequestListeners.insert(delegateListener);
2494    pthread_mutex_unlock(&listenerMutex);
2495    return delegateListener;
2496}
2497
2498- (MegaTransferListener *)createDelegateMEGATransferListener:(id<MEGATransferDelegate>)delegate singleListener:(BOOL)singleListener {
2499    if (delegate == nil) return nil;
2500
2501    DelegateMEGATransferListener *delegateListener = new DelegateMEGATransferListener(self, delegate, singleListener);
2502    pthread_mutex_lock(&listenerMutex);
2503    _activeTransferListeners.insert(delegateListener);
2504    pthread_mutex_unlock(&listenerMutex);
2505    return delegateListener;
2506}
2507
2508- (MegaGlobalListener *)createDelegateMEGAGlobalListener:(id<MEGAGlobalDelegate>)delegate {
2509    if (delegate == nil) return nil;
2510
2511    DelegateMEGAGlobalListener *delegateListener = new DelegateMEGAGlobalListener(self, delegate);
2512    pthread_mutex_lock(&listenerMutex);
2513    _activeGlobalListeners.insert(delegateListener);
2514    pthread_mutex_unlock(&listenerMutex);
2515    return delegateListener;
2516}
2517
2518- (MegaListener *)createDelegateMEGAListener:(id<MEGADelegate>)delegate {
2519    if (delegate == nil) return nil;
2520
2521    DelegateMEGAListener *delegateListener = new DelegateMEGAListener(self, delegate);
2522    pthread_mutex_lock(&listenerMutex);
2523    _activeMegaListeners.insert(delegateListener);
2524    pthread_mutex_unlock(&listenerMutex);
2525    return delegateListener;
2526}
2527
2528- (MegaLogger *)createDelegateMegaLogger:(id<MEGALoggerDelegate>)delegate {
2529    if (delegate == nil) return nil;
2530
2531    DelegateMEGALoggerListener *delegateListener = new DelegateMEGALoggerListener(delegate);
2532    pthread_mutex_lock(&listenerMutex);
2533    _activeLoggerListeners.insert(delegateListener);
2534    pthread_mutex_unlock(&listenerMutex);
2535    return delegateListener;
2536}
2537
2538- (MegaTreeProcessor *)createMegaTreeProcessor:(id<MEGATreeProcessorDelegate>)delegate {
2539    if (delegate == nil) return nil;
2540
2541    DelegateMEGATreeProcessorListener *delegateListener = new DelegateMEGATreeProcessorListener(delegate);
2542
2543    return delegateListener;
2544}
2545
2546- (void)freeRequestListener:(DelegateMEGARequestListener *)delegate {
2547    if (delegate == nil) return;
2548
2549    pthread_mutex_lock(&listenerMutex);
2550    _activeRequestListeners.erase(delegate);
2551    pthread_mutex_unlock(&listenerMutex);
2552    delete delegate;
2553}
2554
2555- (void)freeTransferListener:(DelegateMEGATransferListener *)delegate {
2556    if (delegate == nil) return;
2557
2558    pthread_mutex_lock(&listenerMutex);
2559    _activeTransferListeners.erase(delegate);
2560    pthread_mutex_unlock(&listenerMutex);
2561    delete delegate;
2562}
2563
2564@end
2565