/**
* Return a folder object representing an email folder. Attempt to detect
* special folders appropriately.
*
* @param string $sid The server name.
* @param array $fl The complete folder list.
* @param array $f An array describing the folder.
*
* @return Horde_ActiveSync_Message_Folder
*/
protected function _getMailFolder($sid, array $fl, array $f)
{
$folder = new Horde_ActiveSync_Message_Folder();
$folder->_serverid = $sid;
$folder->parentid = '0';
$folder->displayname = $f['label'];
// Check for nested folders. $fl will NEVER contain containers so we
// can assume that any entry in $fl is an actual mailbox. EAS does
// not support containers so we only do this if the parent is an
// actual mailbox.
if ($f['level'] != 0) {
$parts = explode($f['d'], $sid);
$displayname = array_pop($parts);
if (!empty($fl[implode($f['d'], $parts)])) {
$folder->parentid = $this->_getFolderUidForBackendId(implode($f['d'], $parts), Horde_ActiveSync::FOLDER_TYPE_USER_MAIL);
$folder->_parentid = implode($f['d'], $parts);
$folder->displayname = $displayname;
}
}
if (strcasecmp($sid, 'INBOX') === 0) {
$folder->type = Horde_ActiveSync::FOLDER_TYPE_INBOX;
$folder->serverid = $this->_getFolderUidForBackendId($sid, $folder->type);
return $folder;
}
try {
$specialFolders = $this->_imap->getSpecialMailboxes();
} catch (Horde_ActiveSync_Exception $e) {
$this->_logger->err(sprintf("[%s] Problem retrieving special folders: %s", $this->_pid, $e->getMessage()));
throw $e;
}
// Check for known, supported special folders.
foreach ($specialFolders as $key => $value) {
if (!is_array($value)) {
$value = array($value);
}
foreach ($value as $mailbox) {
if (!is_null($mailbox)) {
switch ($key) {
case self::SPECIAL_SENT:
if ($sid == $mailbox->value) {
$folder->type = Horde_ActiveSync::FOLDER_TYPE_SENTMAIL;
$folder->serverid = $this->_getFolderUidForBackendId($sid, $folder->type);
return $folder;
}
break;
case self::SPECIAL_TRASH:
if ($sid == $mailbox->value) {
$folder->type = Horde_ActiveSync::FOLDER_TYPE_WASTEBASKET;
$folder->serverid = $this->_getFolderUidForBackendId($sid, $folder->type);
return $folder;
}
break;
case self::SPECIAL_DRAFTS:
if ($sid == $mailbox->value) {
$folder->type = Horde_ActiveSync::FOLDER_TYPE_DRAFTS;
$folder->serverid = $this->_getFolderUidForBackendId($sid, $folder->type);
return $folder;
}
break;
}
}
}
}
// Not a known folder, set it to user mail.
$folder->type = Horde_ActiveSync::FOLDER_TYPE_USER_MAIL;
$folder->serverid = $this->_getFolderUidForBackendId($sid, $folder->type);
return $folder;
}