X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fspool.inc.php;h=b3c0bfc336440a1db4d9268f5f860363ab7c70d8;hb=e02edbfe524f0a7dcadcb319e927b4804bdd7bc4;hp=172e4aa16bf4e66a54e378fe4d9b1082f950bb0b;hpb=cfb7fe5d9f451e667b12440409ad6cbec6a2be43;p=banana.git diff --git a/banana/spool.inc.php b/banana/spool.inc.php index 172e4aa..b3c0bfc 100644 --- a/banana/spool.inc.php +++ b/banana/spool.inc.php @@ -9,7 +9,7 @@ require_once dirname(__FILE__) . '/banana.inc.php'; -define('BANANA_SPOOL_VERSION', '0.3'); +define('BANANA_SPOOL_VERSION', '0.4'); /** Class spoolhead * class used in thread overviews @@ -72,6 +72,7 @@ class BananaSpool /** thread starts */ public $roots; + private $unreadnb = 0; /** constructor * @param $_group STRING group name @@ -85,12 +86,12 @@ class BananaSpool $this->group = $group; } - public static function getSpool($group, $since = 0, $clean = false) + public static function &getSpool($group, $since = 0, $clean = false) { if (!is_null(Banana::$spool) && Banana::$spool->group == $group) { $spool =& Banana::$spool; } else { - $spool = BananaSpool::readFromFile($group); + $spool =& BananaSpool::readFromFile($group); } if (is_null($spool)) { $spool = new BananaSpool($group); @@ -106,24 +107,26 @@ class BananaSpool private static function spoolFilename($group) { - $file = dirname(dirname(__FILE__)); - $file .= '/spool/' . Banana::$protocole->name() . '/'; + $file = Banana::$spool_root . '/' . Banana::$protocole->name() . '/'; if (!is_dir($file)) { mkdir($file); } return $file . Banana::$protocole->filename(); } - private static function readFromFile($group) + private static function &readFromFile($group) { + $spool = null; $file = BananaSpool::spoolFilename($group); if (!file_exists($file)) { - return null; + return $spool; } $spool = unserialize(file_get_contents($file)); if ($spool->version != BANANA_SPOOL_VERSION || $spool->mode != Banana::SPOOL_ALL) { - return null; + $spool = null; + return $spool; } + $spool->markAllAsRead(); return $spool; } @@ -261,9 +264,10 @@ class BananaSpool foreach ($newpostsids as $mid) { $id = $this->ids[$mid]; if ($this->overview[$id]->isread) { - $this->overview[$id]->isread = false; + $this->overview[$id]->isread = false; + $this->unreadnb++; while (isset($id)) { - $this->overview[$id]->descunread ++; + $this->overview[$id]->descunread++; $id = $this->overview[$id]->parent; } } @@ -292,6 +296,7 @@ class BananaSpool { if (!$this->overview[$id]->isread) { $this->overview[$id]->isread = true; + $this->unreadnb--; while (isset($id)) { $this->overview[$id]->descunread--; $id = $this->overview[$id]->parent; @@ -303,15 +308,20 @@ class BananaSpool */ public function markAllAsRead(array &$array = null) { - if (is_null($array)) { - $array =& $this->roots; + if (!$this->unreadnb) { + return; } - if (!is_array($this->roots)) { + if (is_null($array) && is_array($this->roots)) { + $array =& $this->roots; + } elseif (is_null($array)) { return; } foreach ($array as $id) { if (!$this->overview[$id]->isread) { $this->markAsRead($id); + if (!$this->unreadnb) { + return; + } } if ($this->overview[$id]->descunread) { $this->markAllAsRead($this->overview[$id]->children); @@ -341,27 +351,31 @@ class BananaSpool public function delid($_id, $write = true) { if (isset($this->overview[$_id])) { - if (sizeof($this->overview[$_id]->parent)) { - $this->overview[$this->overview[$_id]->parent]->children = - array_diff($this->overview[$this->overview[$_id]->parent]->children, array($_id)); - if (sizeof($this->overview[$_id]->children)) { - $this->overview[$this->overview[$_id]->parent]->children = - array_merge($this->overview[$this->overview[$_id]->parent]->children, $this->overview[$_id]->children); - foreach ($this->overview[$_id]->children as $c) { - $this->overview[$c]->parent = $this->overview[$_id]->parent; + $overview =& $this->overview[$_id]; + if (!$overview->isread) { + $this->markAsRead($_id); + } + if ($overview->parent) { + $p = $overview->parent; + $parent =& $this->overview[$p]; + $parent->children = array_diff($parent->children, array($_id)); + if (sizeof($overview->children)) { + $parent->children = array_merge($parent->children, $overview->children); + foreach ($overview->children as $c) { + $this->overview[$c]->parent = $p; $this->overview[$c]->parent_direct = false; } } - $p = $this->overview[$_id]->parent; - while ($p) { + while (isset($p)) { $this->overview[$p]->desc--; $p = $this->overview[$p]->parent; } - } elseif (sizeof($this->overview[$_id]->children)) { - foreach ($this->overview[$_id]->children as $c) { + } elseif ($overview->children) { + foreach ($overview->children as $c) { $this->overview[$c]->parent = null; } } + unset($overview); unset($this->overview[$_id]); $msgid = array_search($_id, $this->ids); if ($msgid !== false) { @@ -373,7 +387,6 @@ class BananaSpool } if ($write) { - $this->markAllAsRead(); $this->saveToFile(); } } @@ -393,7 +406,7 @@ class BananaSpool } else { $format = '%a %e %b'; } - return utf8_encode(strftime($format, $stamp)); + return strftime($format, $stamp); } /** displays children tree of a post @@ -435,8 +448,9 @@ class BananaSpool $res .= '\n"; $res .= '' . $this->formatDate($overview->date) . " \n"; - $res .= '' - . $_pfx_node .($hc ? ($_head ? $spfx_f : ($overview->parent_direct ? $spfx_s : $spfx_snd)) : $spfx_n); + $res .= '
' + . $_pfx_node .($hc ? ($_head ? $spfx_f : ($overview->parent_direct ? $spfx_s : $spfx_snd)) : $spfx_n) + . '
'; $subject = $overview->subject; if (function_exists('hook_formatDisplayHeader')) { list($subject, $link) = hook_formatDisplayHeader('subject', $subject, true); @@ -531,7 +545,7 @@ class BananaSpool for ($i = 0; $i < $pos ; $i++) { $ndx += $this->overview[$this->overview[$id_parent]->children[$i]]->desc; } - $ndx++; //noeud père + $ndx++; //noeud père $id_cur = $id_parent; } @@ -663,6 +677,10 @@ class BananaSpool */ public function nextUnread($id = null) { + if (!$this->unreadnb) { + return null; + } + if (!is_null($id)) { // Look in message children foreach ($this->overview[$id]->children as $child) {