backport of changeFolder and deleteFolder

This commit is contained in:
Klaus Leithoff 2016-11-30 11:58:39 +00:00
parent b39e15f6e7
commit d98aac5381

View File

@ -185,16 +185,32 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
);
/*
$sigOptions = array(
'send'=>'yes, always add EGroupware signatures to outgoing mails',
'nosend'=>'no, never add EGroupware signatures to outgoing mails',
);
if (!isset($hook_data['setup']) && in_array($hook_data['type'], array('user', 'group'))&&$hook_data['account_id'])
{
$pID=self::$profileID;
if ($GLOBALS['egw_info']['user']['preferences']['activesync']['mail-ActiveSyncProfileID']=='G')
{
$pID=Mail\Account::get_default_acc_id();
}
$acc = Mail\Account::read($pID);
error_log(__METHOD__.__LINE__.':'.$pID.'->'.array2string($acc));
$Identities = Mail\Account::identities($pID);
foreach($Identities as &$identity)
{
$Identity = self::identity_name($identity);
}
error_log(__METHOD__.__LINE__.array2string($Identities));
}
$settings['mail-useSignature'] = array(
'type' => 'select',
'label' => 'control if and which available signature is added to outgoing mails',
'name' => 'mail-useSignature',
'help' => 'control the use of signatures',
'values' => array(
'sendifnocalnotif'=>'only send if there is no notification in calendar',
'send'=>'yes, always add EGroupware signatures to outgoing mails',
'nosend'=>'no, never add EGroupware signatures to outgoing mails',
),
'values' => $sigOptions,
'xmlrpc' => True,
'default' => 'nosend',
'admin' => False,
@ -996,6 +1012,7 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
'<body>';
if ($output->nativebodytype==2)
{
if ($css) Api\Mail\Html::replaceTagsCompletley($body,'style');
// as we fetch html, and body is HTML, we may not need to handle this
$htmlbody .= $body;
}
@ -1904,27 +1921,73 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
* @param string $displayname => new folder name (to be created, or to be renamed to)
* @param string $type folder type, ignored in IMAP
*
* @throws StatusException could throw specific SYNC_FSSTATUS_* exceptions
* @return array|boolean stat array or false on error
*/
public function ChangeFolder($id, $oldid, $displayname, $type)
{
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."('$id', '$oldid', '$displayname', $type) NOT supported!");
return false;
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."('$id', '$oldid', '$displayname', $type)");
$account = $parent_id = null;
$this->splitID($id, $account, $parentFolder, $app);
$parent_id = $this->folder2hash($account, $parentFolder);
$old_hash = $oldFolder = null;
if (empty($oldid))
{
$action = 'create';
}
else
{
$action = 'rename';
$this->splitID($oldid, $account, $oldFolder, $app);
$old_hash = $this->folder2hash($account, $oldFolder);
}
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.":{$action}Folder('$id'=>($parentFolder ($parent_id)), '$oldid'".($oldid?"=>($oldFolder ($old_hash))":'').", '$displayname', $type)");
$this->_connect($this->account);
try
{
if ($action=='rename')
{
$newFolderName = $this->mail->renameFolder($oldFolder, $parentFolder, $displayname);
}
elseif ($action=='create')
{
$error=null;
$newFolderName = $this->mail->createFolder($parentFolder, $displayname, $error);
}
}
catch (\Exception $e)
{
//throw new Exception(__METHOD__." $action failed for $oldFolder ($action: $displayname) with error:".$e->getMessage());
return false;
}
$newHash = $this->rename_folder_hash($account, $old_hash, $newFolderName);
$newID = $this->createID($account, $newHash);
ZLog::Write(LOGLEVEL_DEBUG,":{$action}Folder('$id'=>($parentFolder), '$oldid'".($oldid?"=>($oldFolder)":'').", '$displayname' => $newFolderName (ID:$newID))");
return $this->StatFolder($newID);
}
/**
* Deletes (really delete) a Folder
*
* @param string $parentid of the folder to delete
* @param string $id of the folder to delete
* @param string $parentid (=false) of the folder to delete, may be false/not set
*
* @return
* @TODO check what is to be returned
* @throws StatusException could throw specific SYNC_FSSTATUS_* exceptions
* @return boolean true or false on error
*/
public function DeleteFolder($parentid, $id)
public function DeleteFolder($id, $parentid=false)
{
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."('$parentid', '$id') NOT supported!");
return false;
$account = $parent_id = $app = null;
$this->splitID($id, $account, $folder, $app);
$old_hash = $this->folder2hash($account, $folder);
if ($parentid) $this->splitID($parentid, $account, $parentfolder, $app);
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."( '$id (-> $folder)','$parentid ".($parentid?'(->'.$parentfolder.')':'')."') called!");
$ret = $this->mail->deleteFolder($folder);
if ($ret) $newHash = $this->rename_folder_hash($account, $old_hash, "##Dele#edFolder#$folder##");
return $ret;
}
/**
@ -1974,22 +2037,22 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
}
/**
* Split an ID string into $app, $folder and $id
* Split an ID string into $app, $account $folder and $appid
*
* @param string $str
* @param int &$account mail account id
* @param string &$folder
* @param int &$id=null
* @param int &$appid=null (for mail=mail is to be expected)
* @throws Api\Exception\WrongParameter
*/
private function splitID($str,&$account,&$folder,&$id=null)
private function splitID($str,&$account,&$folder,&$appid=null)
{
$this->backend->splitID($str, $account, $folder, $id);
$this->backend->splitID($str, $account, $folder, $appid);
// convert numeric folder-id back to folder name
$folder = $this->hash2folder($account,$f=$folder);
if ($this->debugLevel>1) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."('$str','$account','$folder',$id)");
if ($this->debugLevel>1) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."('$str','$account','$folder',$appid)");
}
/**
@ -2036,6 +2099,25 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
return isset($this->folderHashes[$account]) ? $this->folderHashes[$account][$index] : null;
}
/**
* Rename or create a folder in hash table
*
* @param int $account
* @param int $index or null to create
* @param string $new_name
* @return int $index or new hash if $index is not found
*/
private function rename_folder_hash($account, $index, $new_name)
{
if ((string)$index === '' || !$this->hash2folder($account, $index))
{
return $this->folder2hash($account, $new_name);
}
$this->folderHashes[$account][$index] = $new_name;
$this->storeFolderHashes();
return $index;
}
private $folderHashes;
/**