way to rebuild/construct the basic imap class without using the session based information but preserving tghe cached data

This commit is contained in:
Klaus Leithoff 2014-03-12 13:52:28 +00:00
parent 88f8bfb902
commit 08424b0307

View File

@ -160,7 +160,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
if (!isset($params['setup']))
{
$profileID=(self::$profileID=='G'?emailadmin_bo::getDefaultAccID():self::$profileID);
if (!$this->mail) $this->mail = mail_bo::getInstance(true,$profileID);
if (!$this->mail) $this->mail = mail_bo::getInstance(true,$profileID,true,false,true);
foreach($allIdentities as $key => $singleIdentity) {
if (isset($identities[$singleIdentity['acc_id']])) continue; // only use the first
$iS = mail_bo::generateIdentityString($singleIdentity);
@ -276,6 +276,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
private function _connect($account=0, $verify_mode=false)
{
static $waitOnFailure;
if (is_null($account)) $account = 0;
if ($this->mail && $this->account != $account) $this->_disconnect();
$hereandnow = egw_time::to('now','ts');
@ -284,7 +285,10 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
$connectionFailed = false;
if ($verify_mode==false && (is_null($waitOnFailure)||empty($waitOnFailure[self::$profileID])||empty($waitOnFailure[self::$profileID][$this->backend->_devid]))) $waitOnFailure = egw_cache::getCache(egw_cache::INSTANCE,'email','ActiveSyncWaitOnFailure'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*2);
if ($verify_mode==false && (is_null($waitOnFailure)||empty($waitOnFailure[self::$profileID])||empty($waitOnFailure[self::$profileID][$this->backend->_devid])))
{
$waitOnFailure = egw_cache::getCache(egw_cache::INSTANCE,'email','ActiveSyncWaitOnFailure'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*2);
}
if (isset($waitOnFailure[self::$profileID]) && !empty($waitOnFailure[self::$profileID]) && !empty($waitOnFailure[self::$profileID][$this->backend->_devid]) && isset($waitOnFailure[self::$profileID][$this->backend->_devid]['lastattempt']) && !empty($waitOnFailure[self::$profileID][$this->backend->_devid]['lastattempt']) && isset($waitOnFailure[self::$profileID][$this->backend->_devid]['howlong']) && !empty($waitOnFailure[self::$profileID][$this->backend->_devid]['howlong']))
{
if ($waitOnFailure[self::$profileID][$this->backend->_devid]['lastattempt']+$waitOnFailure[self::$profileID][$this->backend->_devid]['howlong']<$hereandnow)
@ -303,7 +307,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
//error_log(__METHOD__.__LINE__.' create object with ProfileID:'.array2string(self::$profileID));
try
{
$this->mail = mail_bo::getInstance(false,self::$profileID);
$this->mail = mail_bo::getInstance(false,self::$profileID,true,false,true);
if (self::$profileID == 0 && isset($this->mail->icServer->ImapServerId) && !empty($this->mail->icServer->ImapServerId)) self::$profileID = $this->mail->icServer->ImapServerId;
$this->mail->openConnection(self::$profileID,false);
$connectionFailed = false;
@ -335,7 +339,6 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
// in verify_moode, we want the exeption, but not the exit
if ($verify_mode)
{
egw_cache::setCache(egw_cache::INSTANCE,'email','ActiveSyncWaitOnFailure'.trim($GLOBALS['egw_info']['user']['account_id']),$waitOnFailure,$expiration=60*60*2);
throw new egw_exception_not_found(__METHOD__.__LINE__."($account) can not open connection on Profile #".self::$profileID."!".$this->mail->getErrorMessage().' for Instance='.$GLOBALS['egw_info']['user']['domain']);
}
else
@ -346,19 +349,20 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
// ($_SERVER['HTTPS']?'https://':'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."\n\n",3,'/var/lib/egroupware/esync-imap.log');
if ($waitOnFailure[self::$profileID][$this->backend->_devid]['howlong'] > $this->waitOnFailureLimit )
{
header("HTTP/1.1 500 Internal Server Error");
$waitOnFailure[self::$profileID][$this->backend->_devid] = array('howlong'=>$this->waitOnFailureDefault,'lastattempt'=>$hereandnow);
egw_cache::setCache(egw_cache::INSTANCE,'email','ActiveSyncWaitOnFailure'.trim($GLOBALS['egw_info']['user']['account_id']),$waitOnFailure,$expiration=60*60*2);
header("HTTP/1.1 500 Internal Server Error");
throw new egw_exception_not_found(__METHOD__.__LINE__."($account) can not open connection on Profile #".self::$profileID."!".$errorMessage.' for Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid'].', Device:'.$this->backend->_devid);
}
else
{
//error_log(__METHOD__.__LINE__.'# Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid']." Can not open connection for Profile:".self::$profileID.' Device:'.$this->backend->_devid.' should wait '.array2string($waitOnFailure[self::$profileID][$this->backend->_devid]));
header("HTTP/1.1 503 Service Unavailable");
header("Retry-After: ".$waitOnFailure[self::$profileID][$this->backend->_devid]['howlong']);
$waitaslongasthis = $waitOnFailure[self::$profileID][$this->backend->_devid]['howlong'];
$waitOnFailure[self::$profileID][$this->backend->_devid] = array('howlong'=>(empty($waitOnFailure[self::$profileID][$this->backend->_devid]['howlong'])?$this->waitOnFailureDefault:$waitOnFailure[self::$profileID][$this->backend->_devid]['howlong']) * 2,'lastattempt'=>$hereandnow);
egw_cache::setCache(egw_cache::INSTANCE,'email','ActiveSyncWaitOnFailure'.trim($GLOBALS['egw_info']['user']['account_id']),$waitOnFailure,$expiration=60*60*2);
$ethrown = new egw_exception_not_found(__METHOD__.__LINE__."($account) can not open connection on Profile #".self::$profileID."!".$errorMessage.' for Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid'].', Device:'.$this->backend->_devid);
header("HTTP/1.1 503 Service Unavailable");
header("Retry-After: ".$waitaslongasthis);
$ethrown = new egw_exception_not_found(__METHOD__.__LINE__."($account) can not open connection on Profile #".self::$profileID."!".$errorMessage.' for Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid'].', Device:'.$this->backend->_devid." Should wait for:".$waitaslongasthis.'(s)'.' WaitInfoStored2Cache:'.array2string($waitOnFailure));
_egw_log_exception($ethrown);
exit;
}
@ -468,7 +472,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
return false;
}
// initialize our mail_bo
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID,true,false,true);
$activeMailProfiles = $this->mail->getAccountIdentities(self::$profileID);
$activeMailProfile = array_shift($activeMailProfiles);
if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' ProfileID:'.self::$profileID.' ActiveMailProfile:'.array2string($activeMailProfile));
@ -1031,7 +1035,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
public function GetMessage($folderid, $id, $truncsize, $bodypreference=false, $optionbodypreference=false, $mimesupport = 0)
{
//$this->debugLevel=4;
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID,true,false,true);
debugLog(__METHOD__.__LINE__.' FolderID:'.$folderid.' ID:'.$id.' TruncSize:'.$truncsize.' Bodypreference: '.array2string($bodypreference));
$rv = $this->splitID($folderid,$account,$_folderName,$xid);
$this->mail->reopen($_folderName);
@ -1468,7 +1472,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
$this->splitID($folderid, $account, $folder);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID,true,false,true);
$this->mail->reopen($folder);
$attachment = $this->mail->getAttachment($id,$part);
@ -1494,7 +1498,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
$this->splitID($folderid, $account, $folder);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false, self::$profileID);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false, self::$profileID,true,false,true);
$this->mail->reopen($folder);
$att = $this->mail->getAttachment($id,$part);
@ -1559,7 +1563,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
$this->splitID($folderid, $account, $srcFolder);
$this->splitID($newfolderid, $account, $destFolder);
debugLog("IMAP-MoveMessage: (SourceFolder: '$srcFolder' id: '$id' DestFolder: '$destFolder' )");
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID,true,false,true);
$this->mail->reopen($destFolder);
$status = $this->mail->getFolderStatus($destFolder);
$uidNext = $status['uidnext'];
@ -1894,7 +1898,7 @@ class mail_activesync implements activesync_plugin_write, activesync_plugin_send
if (is_numeric($account)) $type = 'mail';
if ($type != 'mail') return false;
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID);
if (!isset($this->mail)) $this->mail = mail_bo::getInstance(false,self::$profileID,true,false,true);
$changes = array();
debugLog("AlterPingChanges on $folderid ($folder) stat: ". $syncstate);