class BananaMBox implements BananaProtocoleInterface
{
+ private $inbox = null;
private $file = null;
private $filesize = null;
private $current_id = null;
*/
public function __construct()
{
- $filename = $this->getFileName(Banana::$group);
- if (is_null($filename)) {
- return;
- }
- $this->filesize = filesize($filename);
- $this->file = @fopen($filename, 'r');
- if (!$this->file) {
- $this->_lasterrno = 1;
- $this->_lasterror = _b_('Can\'t open file');
- $this->file = null;
- }
- $this->current_id = 0;
- $this->at_beginning = true;
+ $this->open();
}
/** Close the file
*/
public function __destruct()
{
- if ($this->file) {
- fclose($this->file);
- }
+ $this->close();
}
/** Indicate if the Protocole handler has been succesfully built
*/
public function isValid()
{
- return !Banana::$group || $this->file;
+ return true;
+ //!Banana::$group || $this->file;
}
- /** Indicate last error n°
+ /** Indicate last error n°
*/
public function lastErrNo()
{
*/
public function &getMessage($id)
{
+ $this->open();
+ $message = null;
+ if (is_null($this->file)) {
+ return $message;
+ }
if (!is_numeric($id)) {
if (!Banana::$spool) {
- return null;
+ return $message;
}
$id = Banana::$spool->ids[$id];
}
- $message = $this->readMessages(array($id));
- if (empty($message)) {
- return null;
+ $messages = $this->readMessages(array($id));
+ if (!empty($messages)) {
+ $message = new BananaMessage($messages[$id]['message']);
}
- $msg = new BananaMessage($message[$id]['message']);
- return $msg;
+ return $message;
}
/** Return the sources of the given message
*/
public function getMessageSource($id)
{
+ $this->open();
+ $message = null;
+ if (is_null($this->file)) {
+ return $message;
+ }
if (!is_numeric($id)) {
if (!Banana::$spool) {
- return null;
+ return $message;
}
$id = Banana::$spool->ids[$id];
- }
+ }
$message = $this->readMessages(array($id));
- return implode("\n", $message);
+ return implode("\n", $message[$id]['message']);
}
/** Compute the number of messages of the box
*/
private function getCount()
{
+ $this->open();
$this->count = count(Banana::$spool->overview);
$max = @max(array_keys(Banana::$spool->overview));
if ($max && Banana::$spool->overview[$max]->storage['next'] == $this->filesize) {
*/
public function getIndexes()
{
+ $this->open();
+ if (is_null($this->file)) {
+ return array(0, 0, 0);
+ }
if (is_null($this->count)) {
$this->getCount();
}
*/
public function &getMessageHeaders($firstid, $lastid, array $msg_headers = array())
{
+ $this->open();
$msg_headers = array_map('strtolower', $msg_headers);
$messages =& $this->readMessages(range($firstid, $lastid), true);
$msg_headers = array_map('strtolower', $msg_headers);
$headers = array();
+ if (is_null($this->file)) {
+ return $headers;
+ }
foreach ($msg_headers as $header) {
foreach ($messages as $id=>&$message) {
if (!isset($headers[$id])) {
*/
public function getNewIndexes($since)
{
+ $this->open();
+ if (is_null($this->file)) {
+ return array();
+ }
if (is_null($this->new_messages)) {
$this->getCount();
}
*/
public function send(BananaMessage &$message)
{
- return true;
+ $headers = $message->getHeaders();
+ $to = $headers['To'];
+ $subject = $headers['Subject'];
+ unset($headers['To']);
+ unset($headers['Subject']);
+ $hdrs = '';
+ foreach ($headers as $key=>$value) {
+ if (!empty($value)) {
+ $hdrs .= "$key: $value\r\n";
+ }
+ }
+ $body = $message->get(false);
+ return mail($to, $subject, $body, $hdrs);
}
/** Cancel a message
# Filesystem functions
#######
- protected function getFileName($box)
+ protected function getFileName()
{
- if (is_null($box)) {
+ if (is_null(Banana::$group)) {
return null;
}
- @list($mail, $domain) = explode('@', $box);
+ @list($mail, $domain) = explode('@', Banana::$group);
return Banana::$mbox_path . '/' . $mail;
}
# MBox parser
#######
+ private function open()
+ {
+ if ($this->inbox == Banana::$group) {
+ return;
+ }
+ $filename = $this->getFileName();
+ if (is_null($filename)) {
+ return;
+ }
+ $this->file = @fopen($filename, 'r');
+ if (!$this->file) {
+ $this->file = null;
+ $this->filesize = 0;
+ } else {
+ $this->filesize = filesize($filename);
+ }
+ $this->current_id = 0;
+ $this->at_beginning = true;
+ $this->inbox = Banana::$group;
+ }
+
+ private function close()
+ {
+ if (is_null($this->file)) {
+ return;
+ }
+ fclose($this->file);
+ $this->inbox = null;
+ $this->file = null;
+ $this->filesize = null;
+ $this->current_id = null;
+ $this->at_beginning = false;
+ $this->file_cache = null;
+ $this->count = null;
+ $this->new_messages = null;
+ $this->messages = null;
+ }
+
/** Go to the given message
*/
private function goTo($id)
}
if ($id != $this->current_id || !$this->at_beginning) {
if (!$this->goTo($id)) {
- continue;
+ if (count($ids)) {
+ continue;
+ } else {
+ break;
+ }
}
}
$beginning = ftell($this->file);
}
}
-// vim:set et sw=4 sts=4 ts=4:
+// vim:set et sw=4 sts=4 ts=4 enc=utf-8:
?>