/**
  * @param $job_object
  * @return bool
  */
 public function job_run_archive(&$job_object)
 {
     $job_object->substeps_todo = 2 + $job_object->backup_filesize;
     if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) {
         $job_object->log(sprintf(__('%d. Try to send backup file to Dropbox …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE);
     }
     try {
         $dropbox = new BackWPup_Destination_Dropbox_API($job_object->job['dropboxroot']);
         // set the tokens
         $dropbox->setOAuthTokens($job_object->job['dropboxtoken'], BackWPup_Encryption::decrypt($job_object->job['dropboxsecret']));
         //get account info
         if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) {
             $info = $dropbox->accountInfo();
             if (!empty($info['uid'])) {
                 $job_object->log(sprintf(__('Authenticated with Dropbox of user %s', 'backwpup'), $info['display_name'] . ' (' . $info['email'] . ')'), E_USER_NOTICE);
             } else {
                 $job_object->log(__('Not Authenticated with Dropbox!', 'backwpup'), E_USER_ERROR);
                 return FALSE;
             }
             // put the file
             $job_object->log(__('Uploading to Dropbox …', 'backwpup'), E_USER_NOTICE);
         }
         self::$backwpup_job_object =& $job_object;
         if ($job_object->substeps_done < $job_object->backup_filesize) {
             //only if upload not complete
             $response = $dropbox->upload($job_object->backup_folder . $job_object->backup_file, $job_object->job['dropboxdir'] . $job_object->backup_file);
             if ($response['bytes'] == $job_object->backup_filesize) {
                 if (!empty($job_object->job['jobid'])) {
                     BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloaddropbox&file=' . ltrim($response['path'], '/') . '&jobid=' . $job_object->job['jobid']);
                 }
                 $job_object->substeps_done = 1 + $job_object->backup_filesize;
                 $job_object->log(sprintf(__('Backup transferred to %s', 'backwpup'), 'https://api-content.dropbox.com/1/files/' . $job_object->job['dropboxroot'] . $response['path']), E_USER_NOTICE);
             } else {
                 if ($response['bytes'] != $job_object->backup_filesize) {
                     $job_object->log(__('Uploaded file size and local file size don\'t match.', 'backwpup'), E_USER_ERROR);
                 } else {
                     $job_object->log(sprintf(__('Error transfering backup to %s.', 'backwpup') . ' ' . $response['error'], __('Dropbox', 'backwpup')), E_USER_ERROR);
                 }
                 return FALSE;
             }
         }
         $backupfilelist = array();
         $filecounter = 0;
         $files = array();
         $metadata = $dropbox->metadata($job_object->job['dropboxdir']);
         if (is_array($metadata)) {
             foreach ($metadata['contents'] as $data) {
                 if ($data['is_dir'] != TRUE) {
                     $file = basename($data['path']);
                     if ($job_object->is_backup_archive($file)) {
                         $backupfilelist[strtotime($data['modified'])] = $file;
                     }
                     $files[$filecounter]['folder'] = "https://api-content.dropbox.com/1/files/" . $job_object->job['dropboxroot'] . dirname($data['path']) . "/";
                     $files[$filecounter]['file'] = $data['path'];
                     $files[$filecounter]['filename'] = basename($data['path']);
                     $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloaddropbox&file=' . $data['path'] . '&jobid=' . $job_object->job['jobid'];
                     $files[$filecounter]['filesize'] = $data['bytes'];
                     $files[$filecounter]['time'] = strtotime($data['modified']) + get_option('gmt_offset') * 3600;
                     $filecounter++;
                 }
             }
         }
         if ($job_object->job['dropboxmaxbackups'] > 0 && is_object($dropbox)) {
             //Delete old backups
             if (count($backupfilelist) > $job_object->job['dropboxmaxbackups']) {
                 ksort($backupfilelist);
                 $numdeltefiles = 0;
                 while ($file = array_shift($backupfilelist)) {
                     if (count($backupfilelist) < $job_object->job['dropboxmaxbackups']) {
                         break;
                     }
                     $response = $dropbox->fileopsDelete($job_object->job['dropboxdir'] . $file);
                     //delete files on Cloud
                     if ($response['is_deleted'] == 'true') {
                         foreach ($files as $key => $filedata) {
                             if ($filedata['file'] == '/' . $job_object->job['dropboxdir'] . $file) {
                                 unset($files[$key]);
                             }
                         }
                         $numdeltefiles++;
                     } else {
                         $job_object->log(sprintf(__('Error while deleting file from Dropbox: %s', 'backwpup'), $file), E_USER_ERROR);
                     }
                 }
                 if ($numdeltefiles > 0) {
                     $job_object->log(sprintf(_n('One file deleted from Dropbox', '%d files deleted on Dropbox', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE);
                 }
             }
         }
         set_site_transient('backwpup_' . $job_object->job['jobid'] . '_dropbox', $files, 60 * 60 * 24 * 7);
     } catch (Exception $e) {
         $job_object->log(E_USER_ERROR, sprintf(__('Dropbox API: %s', 'backwpup'), htmlentities($e->getMessage())), $e->getFile(), $e->getLine());
         return FALSE;
     }
     $job_object->substeps_done++;
     return TRUE;
 }