1<?php
2
3set_include_path(get_include_path() . PATH_SEPARATOR . ".libs");
4dl('libmegaphp.so');
5
6include 'mega.php';
7
8interface MegaRequestListenerInterface
9{
10    public function onRequestStart($api, $request);
11    public function onRequestFinish($api, $request, $error);
12    public function onRequestTemporaryError($api, $request, $error);
13}
14
15interface MegaTransferListenerInterface
16{
17    public function onTransferStart($api, $transfer);
18    public function onTransferFinish($api, $transfer, $error);
19    public function onTransferUpdate($api, $transfer);
20    public function onTransferTemporaryError($api, $request, $error);
21}
22
23interface MegaGlobalListenerInterface
24{
25    public function onUsersUpdate($api, $users);
26    public function onNodesUpdate($api, $nodes);
27    public function onReloadNeeded($api);
28}
29
30interface MegaListenerInterface extends MegaRequestListenerInterface,
31MegaTransferListenerInterface, MegaGlobalListenerInterface { }
32
33class MegaListenerPHP extends MegaListener
34{
35    var $megaApi;
36    var $listener;
37
38    public function __construct($megaApi, $listener)
39    {
40        parent::__construct();
41
42        $this->megaApi = $megaApi;
43        $this->listener = $listener;
44    }
45
46    public function getUserListener()
47    {
48        return $this->listener;
49    }
50
51    public function onRequestStart($api, $request)
52    {
53        if ($this->listener != null)
54        {
55            $megaApi = $this->megaApi;
56            $megaRequest = $megaApi->getCurrentRequest()->copy();
57            $this->listener->onRequestStart($megaApi, $megaRequest);
58        }
59    }
60
61    public function onRequestFinish($api, $request, $error)
62    {
63        if ($this->listener != null)
64        {
65            $megaApi = $this->megaApi;
66            $megaRequest = $megaApi->getCurrentRequest()->copy();
67            $megaError = $megaApi->getCurrentError()->copy();
68
69            $this->listener->onRequestFinish($megaApi, $megaRequest, $megaError);
70        }
71    }
72
73    public function onRequestTemporaryError($api, $request, $error)
74    {
75        if ($this->listener != null)
76        {
77            $megaApi = $this->megaApi;
78            $megaRequest = $megaApi->getCurrentRequest()->copy();
79            $megaError = $megaApi->getCurrentError()->copy();
80
81            $this->listener->onRequestTemporaryError($megaApi, $megaRequest, $megaError);
82        }
83    }
84
85    public function onTransferStart($api, $transfer)
86    {
87        if ($this->listener != null)
88        {
89            $megaApi = $this->megaApi;
90            $megaTransfer = $megaApi->getCurrentTransfer()->copy();
91
92            $this->listener->onTransferStart($megaApi, $megaTransfer);
93        }
94    }
95
96    public function onTransferFinish($api, $transfer, $error)
97    {
98        if ($this->listener != null)
99        {
100            $megaApi = $this->megaApi;
101            $megaTransfer = $megaApi->getCurrentTransfer()->copy();
102            $megaError = $megaApi->getCurrentError()->copy();
103
104            $this->listener->onTransferFinish($megaApi, $megaTransfer, $megaError);
105        }
106    }
107
108    public function onTransferUpdate($api, $transfer)
109    {
110        if ($this->listener != null)
111        {
112            $megaApi = $this->megaApi;
113            $megaTransfer = $megaApi->getCurrentTransfer()->copy();
114
115            $this->listener->onTransferUpdate($megaApi, $megaTransfer);
116        }
117    }
118
119    public function onTransferTemporaryError($api, $request, $error)
120    {
121        if ($this->listener != null)
122        {
123            $megaApi = $this->megaApi;
124            $megaTransfer = $megaApi->getCurrentTransfer()->copy();
125            $megaError = $megaApi->getCurrentError()->copy();
126
127            $this->listener->onTransferTemporaryError($megaApi, $megaTransfer, $megaError);
128        }
129    }
130
131    public function onUsersUpdate($api, $users)
132    {
133        if ($this->listener != null)
134        {
135            $megaApi = $this->megaApi;
136            if ($megaApi->getCurrentUsers() != null)
137            {
138                $megaUsers = $megaApi->getCurrentUsers();
139            }
140            else
141            {
142                $megaUsers = null;
143            }
144
145            $this->listener->onUsersUpdate($megaApi, $megaUsers);
146        }
147    }
148
149    public function onNodesUpdate($api, $nodes)
150    {
151        if ($this->listener != null)
152        {
153            $megaApi = $this->megaApi;
154            if ($megaApi->getCurrentNodes() != null)
155            {
156                $megaNodes = $megaApi->getCurrentNodes();
157            }
158            else
159            {
160                $megaNodes = null;
161            }
162
163            $this->listener->onNodesUpdate ($megaApi, $megaNodes);
164        }
165    }
166
167    public function onReloadNeeded($api)
168    {
169        if ($this->listener != null)
170        {
171            $megaApi = $this->megaApi;
172            $this->listener->onReloadNeeded ($megaApi);
173        }
174    }
175}
176
177class MegaRequestListenerPHP extends MegaRequestListener
178{
179	var $megaApi;
180	var $listener;
181	var $singleListener;
182
183	public function __construct($megaApi, $listener, $single)
184	{
185            parent::__construct();
186
187            $this->megaApi = $megaApi;
188            $this->listener = $listener;
189            $this->singleListener = $single;
190	}
191
192	public function getUserListener()
193	{
194            return $this->listener;
195	}
196
197	public function onRequestStart($api, $request)
198	{
199            if ($this->listener != null)
200            {
201                $megaApi = $this->megaApi;
202                $megaRequest = $megaApi->getCurrentRequest()->copy();
203
204                $this->listener->onRequestStart($megaApi, $megaRequest);
205            }
206	}
207
208	public function onRequestFinish($api, $request, $error)
209	{
210            if ($this->listener != null)
211            {
212                $megaApi = $this->megaApi;
213                $megaRequest = $megaApi->getCurrentRequest()->copy();
214                $megaError = $megaApi->getCurrentError()->copy();
215
216                $this->listener->onRequestFinish($megaApi, $megaRequest, $megaError);
217
218                if($this->singleListener == 1)
219                {
220                        $megaApi->privateFreeRequestListener($this);
221                }
222            }
223	}
224
225	public function onRequestTemporaryError($api, $request, $error)
226	{
227            if ($this->listener != null)
228            {
229                $megaApi = $this->megaApi;
230                $megaRequest = $megaApi->getCurrentRequest()->copy();
231                $megaError = $megaApi->getCurrentError()->copy();
232
233                $this->listener->onRequestTemporaryError($megaApi, $megaRequest, $megaError);
234            }
235	}
236}
237
238class MegaTransferListenerPHP extends MegaTransferListener
239{
240	var $megaApi;
241	var $listener;
242	var $singleListener;
243
244	public function __construct($megaApi, $listener, $single)
245	{
246            parent::__construct();
247
248            $this->megaApi = $megaApi;
249            $this->listener = $listener;
250            $this->singleListener = $single;
251	}
252
253	public function getUserListener()
254	{
255            return $this->listener;
256	}
257
258	public function onTransferStart($api, $transfer)
259	{
260            if($this->listener != null)
261            {
262                $megaApi = $this->megaApi;
263                $megaTransfer = $megaApi->getCurrentTransfer()->copy();
264
265                $this->listener->onTransferStart($megaApi, $megaTransfer);
266            }
267	}
268
269	public function onTransferFinish($api, $transfer, $error)
270	{
271            if ($this->listener != null)
272            {
273                $megaApi = $this->megaApi;
274                $megaTransfer = $megaApi->getCurrentTransfer()->copy();
275                $megaError = $megaApi->getCurrentError()->copy();
276
277                $this->listener->onTransferFinish($megaApi, $megaTransfer, $megaError);
278
279                if ($this->singleListener == 1)
280                {
281                    $megaApi->privateFreeTransferListener($this);
282                }
283            }
284	}
285
286	public function onTransferUpdate($api, $transfer)
287	{
288            if ($this->listener != null)
289            {
290                $megaApi = $this->megaApi;
291                $megaTransfer = $megaApi->getCurrentTransfer()->copy();
292
293                $this->listener->onTransferUpdate($megaApi, $megaTransfer);
294            }
295	}
296
297	public function onTransferTemporaryError($api, $request, $error)
298	{
299            if ($this->listener != null)
300            {
301                $megaApi = $this->megaApi;
302                $megaTransfer = $megaApi->getCurrentTransfer()->copy();
303                $megaError = $megaApi->getCurrentError()->copy();
304
305                $this->listener->onTransferTemporaryError($megaApi, $megaTransfer, $megaError);
306            }
307	}
308}
309
310class MegaGlobalListenerPHP extends MegaGlobalListener
311{
312	var $megaApi;
313	var $listener;
314
315	public function __construct($megaApi, $listener)
316	{
317            parent::__construct();
318
319            $this->megaApi = $megaApi;
320            $this->listener = $listener;
321	}
322
323	public function getUserListener()
324	{
325            return $this->listener;
326	}
327
328	public function onUsersUpdate($api, $users)
329	{
330            if ($this->listener != null)
331            {
332                $megaApi = $this->megaApi;
333                if($megaApi->getCurrentUsers() != null)
334                {
335                        $megaUsers = $megaApi->getCurrentUsers()->copy();
336                }
337                else
338                {
339                        $megaUsers = null;
340                }
341
342                $this->listener->onUsersUpdate($megaApi, $megaUsers);
343            }
344	}
345
346	public function onNodesUpdate($api, $nodes)
347	{
348            if ($this->listener != null)
349            {
350                $megaApi = $this->megaApi;
351                if ($megaApi->getCurrentNodes() != null)
352                {
353                        $megaNodes = $megaApi->getCurrentNodes()->copy();
354                }
355                else
356                {
357                        $megaNodes = null;
358                }
359
360                $this->listener->onNodesUpdate ($megaApi, $megaNodes);
361            }
362	}
363
364	public function onReloadNeeded($api)
365	{
366            if ($this->listener != null)
367            {
368                $megaApi = $this->megaApi;
369                $this->listener->onReloadNeeded ($megaApi);
370            }
371	}
372}
373
374class MegaApiPHP extends MegaApi
375{
376    private $megaApi;
377    private $activeMegaListeners = array();
378    private $activeMegaRequestListeners = array();
379    private $activeMegaTransferListeners = array();
380    private $activeMegaGlobalListeners = array();
381    private $semaphore;
382
383    public function __construct($appKey, $userAgent, $basePath = null)
384    {
385        $this->megaApi = new MegaApi($appKey, $basePath, $userAgent);
386        $this->semaphore = sem_get("32462", 1, 0666, 1);
387    }
388
389    private function createDelegateMegaListener($listener)
390    {
391        if ($listener == null)
392        {
393            return null;
394        }
395
396        $delegateListener = new MegaListenerPHP($this, $listener);
397
398        sem_acquire($this->semaphore);
399        array_push($this->activeMegaListeners, $delegateListener);
400        sem_release($this->semaphore);
401
402        return $delegateListener;
403    }
404
405    private function createDelegateRequestListener($listener, $singleListener = 1)
406    {
407        if ($listener == null)
408        {
409            return null;
410        }
411
412        $delegateListener = new MegaRequestListenerPHP($this, $listener, $singleListener);
413
414        sem_acquire($this->semaphore);
415        array_push($this->activeMegaRequestListeners, $delegateListener);
416        sem_release($this->semaphore);
417
418        return $delegateListener;
419    }
420
421    private function createDelegateTransferListener($listener, $singleListener = 1)
422    {
423        if ($listener == null)
424        {
425            return null;
426        }
427
428        $delegateListener = new MegaTransferListenerPHP($this, $listener, $singleListener);
429
430        sem_acquire($this->semaphore);
431        array_push($this->activeMegaTransferListeners, $delegateListener);
432        sem_release($this->semaphore);
433
434        return $delegateListener;
435    }
436
437    private function createDelegateGlobalListener($listener)
438    {
439        if ($listener == null)
440        {
441            return null;
442        }
443
444        $delegateListener = new MegaGlobalListenerPHP($this, $listener);
445
446        sem_acquire($this->semaphore);
447        array_push($this->activeMegaGlobalListeners, $delegateListener);
448        sem_release($this->semaphore);
449
450        return $delegateListener;
451    }
452
453    function addListener($listener)
454    {
455        $this->megaApi->addListener($this->createDelegateMegaListener($listener));
456    }
457
458    function addRequestListener($listener)
459    {
460        $this->megaApi->addRequestListener($this->createDelegateRequestListener($listener, 0));
461    }
462
463    function addTransferListener($listener)
464    {
465        $this->megaApi->addTransferListener($this->createDelegateTransferListener($listener, 0));
466    }
467
468    function addGlobalListener($listener)
469    {
470        $this->megaApi->addGlobalListener($this->createDelegateGlobalListener($listener));
471    }
472
473
474    function removeListener($listener)
475    {
476        sem_acquire($this->semaphore);
477        foreach ($this->activeMegaListeners as $delegate)
478        {
479            if($delegate->getUserListener() == $listener)
480            {
481                $this->megaApi->removeListener($delegate);
482                unset($this->activeMegaListeners[$delegate]);
483                break;
484            }
485        }
486        sem_release($this->semaphore);
487    }
488
489    function removeRequestListener($listener)
490    {
491        sem_acquire($this->semaphore);
492        foreach ($this->activeMegaRequestListeners as $delegate)
493        {
494            if ($delegate->getUserListener() == $listener)
495            {
496                $this->megaApi->removeRequestListener($delegate);
497                unset($this->activeMegaRequestListeners[$delegate]);
498                break;
499            }
500        }
501        sem_release($this->semaphore);
502    }
503
504    function removeTransferListener($listener)
505    {
506        sem_acquire($this->semaphore);
507        foreach ($this->activeMegaTransferListeners as $delegate)
508        {
509            if ($delegate->getUserListener() == $listener)
510            {
511                $this->megaApi->removeTransferListener($delegate);
512                unset($this->activeMegaTransferListeners[$delegate]);
513                break;
514            }
515        }
516        sem_release($this->semaphore);
517    }
518
519    function removeGlobalListener($listener)
520    {
521        sem_acquire($this->semaphore);
522        foreach ($this->activeMegaGlobalListeners as $delegate)
523        {
524            if ($delegate->getUserListener() == $listener)
525            {
526                    $this->megaApi->removeGlobalListener($delegate);
527                    unset($this->activeMegaGlobalListeners[$delegate]);
528                    break;
529            }
530        }
531        sem_release($this->semaphore);
532    }
533
534    function getBase64PwKey($password)
535    {
536        return $this->megaApi->getBase64PwKey($password);
537    }
538
539    function getStringHash($base64pwkey, $email)
540    {
541        return $this->megaApi->getStringHash($base64pwkey, $email);
542    }
543
544    static function base64ToHandle($base64Handle)
545    {
546        return MegaApi::base64ToHandle($handle);
547    }
548
549    static function handleToBase64($handle)
550    {
551        return MegaApi::handleToBase64($handle);
552    }
553
554    static function userHandleToBase64($handle)
555    {
556        return MegaApi::userHandleToBase64($handle);
557    }
558
559    static function addEntropy($data, $size)
560    {
561        MegaApi::addEntropy($data, $size);
562    }
563
564    function retryPendingConnections($disconnect = false, $includexfers = false, $listener = null)
565    {
566        $this->megaApi->retryPendingConnections($disconnect, $includexfers, $this->createDelegateRequestListener($listener));
567    }
568
569    function login($email, $password, $listener = null)
570    {
571        $this->megaApi->login($email, $password, $this->createDelegateRequestListener($listener));
572    }
573
574    function loginToFolder($megaFolderLink, $listener = null)
575    {
576        $this->megaApi->loginToFolder($megaFolderLink, $this->createDelegateRequestListener($listener));
577    }
578
579    function dumpSession()
580    {
581        return $this->megaApi->dumpSession();
582    }
583
584    function dumpXMPPSession()
585    {
586        return $this->megaApi->dumpXMPPSession();
587    }
588
589    function createAccount($email, $password, $firstname, $lastname, $listener = null)
590    {
591        $this->megaApi->createAccount($email, $password, $firstname, $lastname, $this->createDelegateRequestListener($listener));
592    }
593
594    function fastCreateAccount($email, $base64pwkey, $name, $listener = null)
595    {
596        $this->megaApi->fastCreateAccount($email, $base64pwkey, $name, $this->createDelegateRequestListener($listener));
597    }
598
599    function querySignupLink($link, $listener = null)
600    {
601        $this->megaApi->querySignupLink($link, $this->createDelegateRequestListener($listener));
602    }
603
604    function confirmAccount($link, $password, $listener = null)
605    {
606        $this->megaApi->confirmAccount($link, $password, $this->createDelegateRequestListener($listener));
607    }
608
609    function fastConfirmAccount($link, $base64pwkey, $listener = null)
610    {
611        $this->megaApi->fastConfirmAccount($link, $base64pwkey, $this->createDelegateRequestListener($listener));
612    }
613
614    function setProxySettings($proxySettings)
615    {
616        $this->megaApi->setProxySettings($proxySettings);
617    }
618
619    function getAutoProxySettings()
620    {
621        return $this->megaApi->getAutoProxySettings();
622    }
623
624    function isLoggedIn()
625    {
626        return $this->megaApi->isLoggedIn();
627    }
628
629    function getMyEmail()
630    {
631        return $this->megaApi->getMyEmail();
632    }
633
634    static function setLogLevel($logLevel)
635    {
636        MegaApi::setLogLevel($logLevel);
637    }
638
639    static function setLoggerObject($megaLogger)
640    {
641        MegaApi::setLoggerObject($megaLogger);
642    }
643
644    static function log($logLevel, $message, $filename = "", $line = -1)
645    {
646        MegaApi::log($logLevel, $message, $filename, $line);
647    }
648
649    function createFolder($name, $parent, $listener = null)
650    {
651        $this->megaApi->createFolder($name, $parent, $this->createDelegateRequestListener($listener));
652    }
653
654    function moveNode($node, $newParent, $listener = null)
655    {
656        $this->megaApi->moveNode($node, $newParent, $this->createDelegateRequestListener($listener));
657    }
658
659    function copyNode($node, $newParent, $listener = null)
660    {
661        $this->megaApi->copyNode($node, $newParent, $this->createDelegateRequestListener($listener));
662    }
663
664    function renameNode($node, $newName, $listener = null)
665    {
666        $this->megaApi->renameNode($node, $newName, $this->createDelegateRequestListener($listener));
667    }
668
669    function remove($node, $listener = null)
670    {
671        $this->megaApi->remove($node, $this->createDelegateRequestListener($listener));
672    }
673
674    function sendFileToUser($node, $user, $listener = null)
675    {
676        $this->megaApi->sendFileToUser($node, $user, $this->createDelegateRequestListener($listener));
677    }
678
679    function share($node, $user_or_email, $level, $listener = null)
680    {
681        $this->megaApi->share($node, $user_or_email, $level, $this->createDelegateRequestListener($listener));
682    }
683
684    function importFileLink($megaFileLink, $parent, $listener = null)
685    {
686        $this->megaApi->importFileLink($megaFileLink, $parent, $this->createDelegateRequestListener($listener));
687    }
688
689    function getPublicNode($megaFileLink, $listener = null)
690    {
691        $this->megaApi->getPublicNode($megaFileLink, $this->createDelegateRequestListener($listener));
692    }
693
694    function getThumbnail($node, $dstFilePath, $listener = null)
695    {
696        $this->megaApi->getThumbnail($node, $dstFilePath, $this->createDelegateRequestListener($listener));
697    }
698
699    function getPreview($node, $dstFilePath, $listener = null)
700    {
701        $this->megaApi->getPreview($node, $dstFilePath, $this->createDelegateRequestListener($listener));
702    }
703
704    function getUserAvatar($user, $dstFilePath, $listener=null)
705    {
706        $this->megaApi->getUserAvatar($user, $dstFilePath, $this->createDelegateRequestListener($listener));
707    }
708
709    function cancelGetThumbnail($node, $listener = null)
710    {
711        $this->megaApi->cancelGetThumbnail($node, $this->createDelegateRequestListener($listener));
712    }
713
714    function cancelGetPreview($node, $listener = null)
715    {
716        $this->megaApi->cancelGetPreview($node, $this->createDelegateRequestListener($listener));
717    }
718
719    function setThumbnail($node, $srcFilePath, $listener = null)
720    {
721        $this->megaApi->setThumbnail($node, $srcFilePath, $this->createDelegateRequestListener($listener));
722    }
723
724    function setPreview($node, $srcFilePath, $listener = null)
725    {
726        $this->megaApi->setPreview($node, $srcFilePath, $this->createDelegateRequestListener($listener));
727    }
728
729    function setAvatar($srcFilePath, $listener = null)
730    {
731        $this->megaApi->setAvatar($srcFilePath, $this->createDelegateRequestListener($listener));
732    }
733
734    function exportNode($node, $listener = null)
735    {
736        $this->megaApi->exportNode($node, $this->createDelegateRequestListener($listener));
737    }
738
739    function disableExport($node, $listener = null)
740    {
741        $this->megaApi->disableExport($node, $this->createDelegateRequestListener($listener));
742    }
743
744    function fetchNodes($listener = null)
745    {
746        $this->megaApi->fetchNodes($this->createDelegateRequestListener($listener));
747    }
748
749    function getAccountDetails($listener = null)
750    {
751        $this->megaApi->getAccountDetails($this->createDelegateRequestListener($listener));
752    }
753
754    function getPricing($listener = null)
755    {
756        $this->megaApi->getPricing($this->createDelegateRequestListener($listener));
757    }
758
759    function getPaymentUrl($productHandle, $listener = null)
760    {
761        $this->megaApi->getPaymentUrl($productHandle, $this->createDelegateRequestListener($listener));
762    }
763
764    function exportMasterKey()
765    {
766        return $this->megaApi->exportMasterKey();
767    }
768
769    function changePassword($oldPassword, $newPassword, $listener = null)
770    {
771        $this->megaApi->changePassword($oldPassword, $newPassword, $this->createDelegateRequestListener($listener));
772    }
773
774    function inviteContact($user, $message, $action, $listener = null)
775    {
776        $this->megaApi->inviteContact($user, $message, $action, $this->createDelegateRequestListener($listener));
777    }
778
779    function removeContact($user, $listener = null)
780    {
781        $this->megaApi->removeContact($user, $this->createDelegateRequestListener($listener));
782    }
783
784    function logout($listener = null)
785    {
786        $this->megaApi->logout($this->createDelegateRequestListener($listener));
787    }
788
789    function submitFeedback($rating, $comment, $listener = null)
790    {
791        $this->megaApi->submitFeedback($rating, $comment, $this->createDelegateRequestListener($listener));
792    }
793
794    function reportDebugEvent($text, $listener = null)
795    {
796        $this->megaApi->reportDebugEvent($text, $this->createDelegateRequestListener($listener));
797    }
798
799    function startUpload($localPath, $parent, $listener = null)
800    {
801        $this->megaApi->startUpload($localPath, $parent, null, null, $this->createDelegateTransferListener($listener));
802    }
803
804    function startDownload($node, $localPath, $listener = null)
805    {
806        $this->megaApi->startDownload($node, $localPath, $this->createDelegateTransferListener($listener));
807    }
808
809    function cancelTransfer($transfer, $listener = null)
810    {
811        $this->megaApi->cancelTransfer($transfer, $this->createDelegateRequestListener($listener));
812    }
813
814    function cancelTransfers($type, $listener = null)
815    {
816        $this->megaApi->cancelTransfers($type, $this->createDelegateRequestListener($listener));
817    }
818
819    function pauseTransfers($pause, $listener = null)
820    {
821        $this->megaApi->pauseTransfers($pause, $this->createDelegateRequestListener($listener));
822    }
823
824    function setUploadLimit($bpslimit)
825    {
826        $this->megaApi->setUploadLimit($bpslimit);
827    }
828
829    function getTransfers($type = null)
830    {
831        if ($type == null)
832            return $this->listToArray($this->megaApi->getTransfersAll());
833        else
834            return $this->listToArray($this->megaApi->getTransfers($type));
835    }
836
837    function update()
838    {
839        $this->megaApi->update();
840    }
841
842    function isWaiting()
843    {
844        return $this->megaApi->isWaiting();
845    }
846
847    function getNumPendingUploads()
848    {
849        return $this->megaApi->getNumPendingUploads();
850    }
851
852    function getNumPendingDownloads()
853    {
854        return $this->megaApi->getNumPendingDownloads();
855    }
856
857    function getTotalUploads()
858    {
859        return $this->megaApi->getTotalUploads();
860    }
861
862    function getTotalDownloads()
863    {
864        return $this->megaApi->getTotalDownloads();
865    }
866
867    function resetTotalDownloads()
868    {
869        $this->megaApi->resetTotalDownloads();
870    }
871
872    function resetTotalUploads()
873    {
874        $this->megaApi->resetTotalUploads();
875    }
876
877    function getTotalDownloadedBytes()
878    {
879        return $this->megaApi->getTotalDownloadedBytes();
880    }
881
882    function getTotalUploadedBytes()
883    {
884        return $this->megaApi->getTotalUploadedBytes();
885    }
886
887    function updateStats()
888    {
889        $this->megaApi->updateStats();
890    }
891
892    const ORDER_NONE = 0;
893    const ORDER_DEFAULT_ASC = MegaApi::ORDER_DEFAULT_ASC;
894    const ORDER_DEFAULT_DESC = MegaApi::ORDER_DEFAULT_DESC;
895    const ORDER_SIZE_ASC = MegaApi::ORDER_SIZE_ASC;
896    const ORDER_SIZE_DESC = MegaApi::ORDER_SIZE_DESC;
897    const ORDER_CREATION_ASC = MegaApi::ORDER_CREATION_ASC;
898    const ORDER_CREATION_DESC = MegaApi::ORDER_CREATION_DESC;
899    const ORDER_MODIFICATION_ASC = MegaApi::ORDER_MODIFICATION_ASC;
900    const ORDER_MODIFICATION_DESC = MegaApi::ORDER_MODIFICATION_DESC;
901    const ORDER_ALPHABETICAL_ASC = MegaApi::ORDER_ALPHABETICAL_ASC;
902    const ORDER_ALPHABETICAL_DESC = MegaApi::ORDER_ALPHABETICAL_DESC;
903
904    function getNumChildren($parent)
905    {
906        return $this->megaApi->getNumChildren($parent);
907    }
908
909    function getNumChildFiles($parent)
910    {
911        return $this->megaApi->getNumChildFiles($parent);
912    }
913
914    function getNumChildFolders($parent)
915    {
916        return $this->megaApi->getNumChildFolders($parent);
917    }
918
919    function getChildren($parent, $order = 1)
920    {
921        return $this->listToArray($this->megaApi->getChildren($parent, $order));
922    }
923
924    function getChildNode($parent, $name)
925    {
926        return $this->megaApi->getChildNode($parent, $name);
927    }
928
929    function getParentNode($node)
930    {
931        return $this->megaApi->getParentNode($node);
932    }
933
934    function getNodePath($node)
935    {
936        return $this->megaApi->getNodePath($node);
937    }
938
939    function getNodeByPath($path, $base = null)
940    {
941        return $this->megaApi->getNodeByPath($path, $base);
942    }
943
944    function getNodeByHandle($handle)
945    {
946        return $this->megaApi->getNodeByHandle($handle);
947    }
948
949    function getContacts()
950    {
951        return $this->listToArray($this->megaApi->getContacts());
952    }
953
954    function getContact($email)
955    {
956        return $this->megaApi->getContact($email);
957    }
958
959    function getInShares($user = null)
960    {
961        if ($user == null)
962            return $this->listToArray($this->megaApi->getInSharesAll());
963        else
964            return $this->listToArray($this->megaApi->getInShares($user));
965    }
966
967    function isShared($node)
968    {
969        return $this->megaApi->isShared($node);
970    }
971
972    function getOutShares($node = null)
973    {
974        if ($node == null)
975            return $this->listToArray($this->megaApi->getOutSharesAll());
976        else
977            return $this->listToArray($this->megaApi->getOutShares($node));
978    }
979
980    function getAccess($node)
981    {
982        return $this->megaApi->getAccess($node) ;
983    }
984
985    function getSize($node)
986    {
987        return $this->megaApi->getSize($node) ;
988    }
989
990    function getFingerprint($filePath_or_node)
991    {
992        return $this->megaApi->getFingerprint($filePath_or_node);
993    }
994
995    function getNodeByFingerprint($fingerprint)
996    {
997        return $this->megaApi->getNodeByFingerprint($fingerprint);
998    }
999
1000    function hasFingerprint($fingerprint)
1001    {
1002        return $this->megaApi->hasFingerprint($fingerprint);
1003    }
1004
1005    function checkAccess($node, $level)
1006    {
1007        return $this->megaApi->checkAccess($node, $level);
1008    }
1009
1010    function checkMove($node, $target)
1011    {
1012        return $this->megaApi->checkMove($node, $target);
1013    }
1014
1015    function getRootNode()
1016    {
1017        return $this->megaApi->getRootNode();
1018    }
1019
1020    function getInboxNode()
1021    {
1022        return $this->megaApi->getInboxNode();
1023    }
1024
1025    function getRubbishNode()
1026    {
1027        return $this->megaApi->getRubbishNode();
1028    }
1029
1030    function search($node, $searchString, $recursive = true)
1031    {
1032        return $this->listToArray($this->megaApi->search($node, $searchString, $recursive));
1033    }
1034
1035    function getCurrentRequest()
1036    {
1037        return $this->megaApi->getCurrentRequest();
1038    }
1039
1040    function getCurrentTransfer()
1041    {
1042        return $this->megaApi->getCurrentTransfer();
1043    }
1044
1045    function getCurrentError()
1046    {
1047        return $this->megaApi->getCurrentError();
1048    }
1049
1050    function getCurrentNodes()
1051    {
1052        return $this->listToArray($this->megaApi->getCurrentNodes());
1053    }
1054
1055    function getCurrentUsers()
1056    {
1057        return $this->listToArray($this->megaApi->getCurrentUsers());
1058    }
1059
1060    private function listToArray($list)
1061    {
1062        if ($list == null)
1063        {
1064            return array();
1065        }
1066
1067        $result = array();
1068        for ($i = 0; $i < $list->size(); $i++)
1069        {
1070            array_push($result, $list->get($i)->copy());
1071        }
1072
1073        return $result;
1074    }
1075
1076    function privateFreeRequestListener($listener)
1077    {
1078        sem_acquire($this->semaphore);
1079        activeRequestListeners.remove(listener);
1080        sem_release($this->semaphore);
1081    }
1082
1083    function privateFreeTransferListener($listener)
1084    {
1085        sem_acquire($this->semaphore);
1086        activeTransferListeners.remove(listener);
1087        sem_release($this->semaphore);
1088    }
1089
1090    public function __destruct()
1091    {
1092        foreach ($this->activeMegaListeners as $listener)
1093        {
1094            $this->megaApi->removeListener($listener);
1095        }
1096
1097        foreach ($this->activeMegaRequestListeners as $listener)
1098        {
1099            $this->megaApi->removeRequestListener($listener);
1100        }
1101
1102        foreach ($this->activeMegaTransferListeners as $listener)
1103        {
1104            $this->megaApi->removeTransferListener($listener);
1105        }
1106
1107        foreach ($this->activeMegaGlobalListeners as $listener)
1108        {
1109            $this->megaApi->removeGlobalListener($listener);
1110        }
1111
1112        sem_remove($this->semaphore);
1113    }
1114}
1115?>
1116