예제 #1
0
 public function hasUpdated($path, $time)
 {
     if ($this->is_file($path)) {
         return parent::hasUpdated($path, $time);
     }
     $path = $this->normalizePath($path);
     $dh = $this->opendir($path);
     $content = array();
     while (($file = readdir($dh)) !== false) {
         $content[] = $file;
     }
     if ($path === '.') {
         $path = '';
     }
     $cachedContent = $this->getCache()->getFolderContents($path);
     $cachedNames = array_map(function ($content) {
         return $content['name'];
     }, $cachedContent);
     sort($cachedNames);
     sort($content);
     return $cachedNames != $content;
 }
예제 #2
0
 public function hasUpdated($path, $time)
 {
     $appConfig = \OC::$server->getAppConfig();
     if ($this->is_file($path)) {
         return parent::hasUpdated($path, $time);
     } else {
         // Google Drive doesn't change modified times of folders when files inside are updated
         // Instead we use the Changes API to see if folders have been updated, and it's a pain
         $folder = $this->getDriveFile($path);
         if ($folder) {
             $result = false;
             $folderId = $folder->getId();
             $startChangeId = $appConfig->getValue('files_external', $this->getId() . 'cId');
             $params = array('includeDeleted' => true, 'includeSubscribed' => true);
             if (isset($startChangeId)) {
                 $startChangeId = (int) $startChangeId;
                 $largestChangeId = $startChangeId;
                 $params['startChangeId'] = $startChangeId + 1;
             } else {
                 $largestChangeId = 0;
             }
             $pageToken = true;
             while ($pageToken) {
                 if ($pageToken !== true) {
                     $params['pageToken'] = $pageToken;
                 }
                 $changes = $this->service->changes->listChanges($params);
                 if ($largestChangeId === 0 || $largestChangeId === $startChangeId) {
                     $largestChangeId = $changes->getLargestChangeId();
                 }
                 if (isset($startChangeId)) {
                     // Check if a file in this folder has been updated
                     // There is no way to filter by folder at the API level...
                     foreach ($changes->getItems() as $change) {
                         $file = $change->getFile();
                         if ($file) {
                             foreach ($file->getParents() as $parent) {
                                 if ($parent->getId() === $folderId) {
                                     $result = true;
                                     // Check if there are changes in different folders
                                 } else {
                                     if ($change->getId() <= $largestChangeId) {
                                         // Decrement id so this change is fetched when called again
                                         $largestChangeId = $change->getId();
                                         $largestChangeId--;
                                     }
                                 }
                             }
                         }
                     }
                     $pageToken = $changes->getNextPageToken();
                 } else {
                     // Assuming the initial scan just occurred and changes are negligible
                     break;
                 }
             }
             $appConfig->setValue('files_external', $this->getId() . 'cId', $largestChangeId);
             return $result;
         }
     }
     return false;
 }