Support contact undelete with new storage classes; only list undeleted imap objects
This commit is contained in:
parent
fc1439c7bd
commit
edaad9b47c
4 changed files with 57 additions and 48 deletions
|
@ -633,54 +633,21 @@ class rcube_kolab_contacts extends rcube_addressbook
|
||||||
$ids = explode(',', $ids);
|
$ids = explode(',', $ids);
|
||||||
|
|
||||||
$count = 0;
|
$count = 0;
|
||||||
$uids = array();
|
foreach ($ids as $id) {
|
||||||
/*
|
$uid = $this->_id2uid($id);
|
||||||
TODO: re-implement this using kolab_storage_folder::undelete();
|
if ($this->storagefolder->undelete($uid)) {
|
||||||
|
$count++;
|
||||||
$imap_uids = $_SESSION['kolab_delete_uids'];
|
|
||||||
|
|
||||||
// convert contact IDs into IMAP UIDs
|
|
||||||
foreach ($ids as $id)
|
|
||||||
if ($uid = $imap_uids[$id])
|
|
||||||
$uids[] = $uid;
|
|
||||||
|
|
||||||
if (!empty($uids)) {
|
|
||||||
$session = &Horde_Kolab_Session::singleton();
|
|
||||||
$imap = &$session->getImap();
|
|
||||||
|
|
||||||
if (is_object($imap) && is_a($imap, 'PEAR_Error')) {
|
|
||||||
$error = $imap;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$result = $imap->select($this->imap_folder);
|
|
||||||
if (is_object($result) && is_a($result, 'PEAR_Error')) {
|
|
||||||
$error = $result;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$result = $imap->undeleteMessages(implode(',', $uids));
|
|
||||||
if (is_object($result) && is_a($result, 'PEAR_Error')) {
|
|
||||||
$error = $result;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this->_connect();
|
|
||||||
$this->storagefolder->synchronize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($error) {
|
|
||||||
raise_error(array(
|
raise_error(array(
|
||||||
'code' => 600, 'type' => 'php',
|
'code' => 600, 'type' => 'php',
|
||||||
'file' => __FILE__, 'line' => __LINE__,
|
'file' => __FILE__, 'line' => __LINE__,
|
||||||
'message' => "Error undeleting a contact object(s) from the Kolab server:" . $error->getMessage()),
|
'message' => "Error undeleting a contact object $uid from the Kolab server"),
|
||||||
true, false);
|
true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$rcmail = rcmail::get_instance();
|
|
||||||
$rcmail->session->remove('kolab_delete_uids');
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
return count($uids);
|
return $count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -217,7 +217,7 @@ class kolab_format_contact extends kolab_format
|
||||||
$this->obj->setPhoto('','');
|
$this->obj->setPhoto('','');
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle spouse, children, profession, initials, pgppublickey, etc.
|
// TODO: handle spouse, children, profession, initials, pgppublickey, etc.
|
||||||
|
|
||||||
// cache this data
|
// cache this data
|
||||||
$this->data = $object;
|
$this->data = $object;
|
||||||
|
|
|
@ -62,7 +62,7 @@ class kolab_storage
|
||||||
/**
|
/**
|
||||||
* Get a list of storage folders for the given data type
|
* Get a list of storage folders for the given data type
|
||||||
*
|
*
|
||||||
* @param string Data type to list folders for (contact,event,task,note)
|
* @param string Data type to list folders for (contact,distribution-list,event,task,note)
|
||||||
*
|
*
|
||||||
* @return array List of Kolab_Folder objects (folder names in UTF7-IMAP)
|
* @return array List of Kolab_Folder objects (folder names in UTF7-IMAP)
|
||||||
*/
|
*/
|
||||||
|
@ -94,6 +94,31 @@ class kolab_storage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for a single Kolab object, identified by its UID.
|
||||||
|
* This will search all folders storing objects of the given type.
|
||||||
|
*
|
||||||
|
* @param string Object UID
|
||||||
|
* @param string Object type (contact,distribution-list,event,task,note)
|
||||||
|
* @return array The Kolab object represented as hash array or false if not found
|
||||||
|
*/
|
||||||
|
public static function get_object($uid, $type)
|
||||||
|
{
|
||||||
|
$folder = null;
|
||||||
|
foreach ((array)self::$imap->list_folders('', '*', $type) as $foldername) {
|
||||||
|
if (!$folder)
|
||||||
|
$folder = new kolab_storage_folder($foldername, self::$imap);
|
||||||
|
else
|
||||||
|
$folder->set_folder($foldername);
|
||||||
|
|
||||||
|
if ($object = $folder->get_object($uid))
|
||||||
|
return $object;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -52,8 +52,20 @@ class kolab_storage_folder
|
||||||
*/
|
*/
|
||||||
function __construct($name, $imap = null)
|
function __construct($name, $imap = null)
|
||||||
{
|
{
|
||||||
$this->name = $name;
|
|
||||||
$this->imap = is_object($imap) ? $imap : rcmail::get_instance()->get_storage();
|
$this->imap = is_object($imap) ? $imap : rcmail::get_instance()->get_storage();
|
||||||
|
$this->imap->set_options(array('skip_deleted' => false));
|
||||||
|
$this->set_folder($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the IMAP folder name this instance connects to
|
||||||
|
*
|
||||||
|
* @param string The folder name/path
|
||||||
|
*/
|
||||||
|
public function set_folder($name)
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
$this->imap->set_folder($this->name);
|
$this->imap->set_folder($this->name);
|
||||||
|
|
||||||
$metadata = $this->imap->get_metadata($this->name, array(kolab_storage::CTYPE_KEY));
|
$metadata = $this->imap->get_metadata($this->name, array(kolab_storage::CTYPE_KEY));
|
||||||
|
@ -146,7 +158,7 @@ class kolab_storage_folder
|
||||||
|
|
||||||
// search by object type
|
// search by object type
|
||||||
$ctype = self::KTYPE_PREFIX . $type;
|
$ctype = self::KTYPE_PREFIX . $type;
|
||||||
$index = $this->imap->search_once($this->name, 'HEADER X-Kolab-Type ' . $ctype);
|
$index = $this->imap->search_once($this->name, 'UNDELETED HEADER X-Kolab-Type ' . $ctype);
|
||||||
|
|
||||||
return $index->count();
|
return $index->count();
|
||||||
}
|
}
|
||||||
|
@ -163,7 +175,7 @@ class kolab_storage_folder
|
||||||
|
|
||||||
// search by object type
|
// search by object type
|
||||||
$ctype = self::KTYPE_PREFIX . $type;
|
$ctype = self::KTYPE_PREFIX . $type;
|
||||||
$search = 'HEADER X-Kolab-Type ' . $ctype;
|
$search = 'UNDELETED HEADER X-Kolab-Type ' . $ctype;
|
||||||
|
|
||||||
$index = $this->imap->search_once($this->name, $search);
|
$index = $this->imap->search_once($this->name, $search);
|
||||||
$results = array();
|
$results = array();
|
||||||
|
@ -194,7 +206,7 @@ class kolab_storage_folder
|
||||||
if ($msguid && ($object = $this->read_object($msguid)))
|
if ($msguid && ($object = $this->read_object($msguid)))
|
||||||
return $object;
|
return $object;
|
||||||
|
|
||||||
return array('uid' => $uid);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -380,7 +392,12 @@ class kolab_storage_folder
|
||||||
*/
|
*/
|
||||||
public function undelete($uid)
|
public function undelete($uid)
|
||||||
{
|
{
|
||||||
// TODO: implement this
|
if ($msguid = $this->uid2msguid($uid)) {
|
||||||
|
if ($this->imap->set_flag($msguid, 'UNDELETED', $this->name)) {
|
||||||
|
return $msguid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue