protected function tryLockUpdate()
 {
     $this->getStorageBackend()->lock($this->getBackendStorageSpace(), self::STORAGE_BACKEND_IS_UPDATE_RUNNING_KEY, Customweb_Storage_IBackend::EXCLUSIVE_LOCK);
     $locked = $this->getStorageBackend()->read($this->getBackendStorageSpace(), self::STORAGE_BACKEND_IS_UPDATE_RUNNING_KEY);
     if ($locked == 'yes') {
         $time = $this->getStorageBackend()->read($this->getBackendStorageSpace(), self::STORAGE_BACKEND_LAST_START_UPDATE_KEY);
         if (empty($time)) {
             $time = 0;
         }
         $timeout = Customweb_Util_System::getMaxExecutionTime() * 2;
         if ($time + $timeout < time()) {
             $success = true;
         } else {
             $success = false;
         }
     } else {
         $success = true;
     }
     if ($success) {
         $this->getStorageBackend()->write($this->getBackendStorageSpace(), self::STORAGE_BACKEND_LAST_START_UPDATE_KEY, time());
         $this->getStorageBackend()->write($this->getBackendStorageSpace(), self::STORAGE_BACKEND_IS_UPDATE_RUNNING_KEY, 'yes');
     }
     $this->getStorageBackend()->unlock($this->getBackendStorageSpace(), self::STORAGE_BACKEND_IS_UPDATE_RUNNING_KEY);
     return $success;
 }
 /**
  * @see Customweb_Payment_Update_AbstractProcessor::process()
  * @Cron()
  */
 public function process()
 {
     if ($this->getUpdateAdapter() === null) {
         return;
     }
     if (!$this->tryLockUpdate()) {
         return;
     }
     $approximatelyExecutedTime = 4;
     $maxExecutionTime = Customweb_Util_System::getMaxExecutionTime() - $approximatelyExecutedTime;
     $start = $this->getStartTime();
     $maxEndtime = $maxExecutionTime + $start;
     try {
         $candidates = $this->getHandler()->getScheduledTransactionIds();
         foreach ($candidates as $transactionId) {
             if ($maxEndtime > time()) {
                 $this->executeUpdate($transactionId);
             } else {
                 break;
             }
         }
     } catch (Exception $e) {
         $this->getHandler()->log("Failed to load scheduled transactions: " . $e->getMessage(), Customweb_Payment_Update_IHandler::LOG_TYPE_ERROR);
     }
     $this->unlockUpdate();
 }
 /**
  * Execute all cron jobs.
  * 
  * @throws Exception In case something went wrong.
  */
 public function run()
 {
     $scanner = new Customweb_Annotation_Scanner();
     $annotations = $scanner->find('Customweb_Cron_Annotation_Cron', $this->packages);
     $approxFinalizeTime = 4;
     $maxExecutionTime = Customweb_Util_System::getMaxExecutionTime() - $approxFinalizeTime;
     $start = $this->getStartTime();
     $endTime = $start + $maxExecutionTime;
     foreach ($annotations as $identifier => $annotation) {
         if ($endTime < time()) {
             break;
         }
         if ($annotation instanceof Customweb_Cron_Annotation_Cron) {
             $parts = explode('::', $identifier, 2);
             $className = $parts[0];
             $methodName = $parts[1];
             $this->invoke($className, $methodName, $annotation);
         }
     }
 }
 /**
  * @param string $transactionId
  * @return string
  */
 public function waitForNotification($transaction)
 {
     if (Mage::getStoreConfig('saferpaycw/general/wait_for_success') != '1') {
         $transaction->getOrder()->getPayment()->getMethodInstance()->success($transaction, $_REQUEST);
         return $this->getSuccessUrl($transaction);
     }
     $transactionId = $transaction->getId();
     $maxTime = min(array(Customweb_Util_System::getMaxExecutionTime() - 4, 30));
     $startTime = microtime(true);
     while (true) {
         if (microtime(true) - $startTime >= $maxTime) {
             break;
         }
         $transaction = Mage::getModel('saferpaycw/transaction')->load($transactionId);
         if ($transaction == null || !$transaction->getId() || $transaction->getTransactionObject() == null) {
             continue;
         }
         if ($transaction->getTransactionObject()->isAuthorized()) {
             $transaction->getOrder()->getPayment()->getMethodInstance()->success($transaction, $_REQUEST);
             return $this->getSuccessUrl($transaction);
         }
         if ($transaction->getTransactionObject()->isAuthorizationFailed()) {
             $errorMessages = $transaction->getTransactionObject()->getErrorMessages();
             $messageToDisplay = nl2br(end($errorMessages));
             reset($errorMessages);
             $transaction->getOrder()->getPayment()->getMethodInstance()->fail($transaction, $_REQUEST);
             return $this->getFailUrl($transaction);
         }
         sleep(1);
     }
     $transaction->getOrder()->getPayment()->getMethodInstance()->success($transaction, $_REQUEST);
     Mage::getSingleton('core/session')->addError($this->__('There has been a problem during the processing of your payment. Please contact the shop owner to make sure your order was placed successfully.'));
     return $this->getSuccessUrl($transaction);
 }