<?php

// {{{ BrdCtl

/**
 * rep2 - BrdCtl -- 板リストコントロールクラス for menu.php
 *
 * @static
 */
class BrdCtl
{
    // {{{ read_brds()

    /**
     * boardを全て読み込む
     */
    static public function read_brds()
    {
        $brd_menus_dir = BrdCtl::read_brd_dir();
        $brd_menus_online = BrdCtl::read_brd_online();
        $brd_menus = array_merge($brd_menus_dir, $brd_menus_online);
        return $brd_menus;
    }

    // }}}
    // {{{ read_brd_dir()

    /**
     * boardディレクトリを走査して読み込む
     */
    static public function read_brd_dir()
    {
        global $_conf;
        $brd_menus = array();
        $brd_dir = $_conf['data_dir'] . '/board';

        // ディレクトリがない場合は新規で作成
        if (!file_exists($brd_dir)) {
            FileCtl::mkdirRecursive($brd_dir);
            if(!is_writable($brd_dir)){
                // 書き込み権限を得られなかった場合はパーミッションの注意喚起をする
                p2die("親ディレクトリのパーミッションを見直して下さい。");
            }
            return $brd_menus;
        }

        if ($cdir = @dir($brd_dir)) {
            // ディレクトリ走査
            while ($entry = $cdir->read()) {
                if ($entry[0] == '.') {
                    continue;
                }
                $filepath = $brd_dir.'/'.$entry;
                if ($data = FileCtl::file_read_lines($filepath)) {
                    $aBrdMenu = new BrdMenu();    // クラス BrdMenu のオブジェクトを生成
                    $aBrdMenu->setBrdMatch($filepath);    // パターンマッチ形式を登録
                    $aBrdMenu->setBrdList($data);    // カテゴリーと板をセット
                    $brd_menus[] = $aBrdMenu;

                } else {
                    P2Util::pushInfoHtml("<p>p2 error: 板リスト {$entry} が読み込めませんでした。</p>");
                }
            }
            $cdir->close();
        }

        return $brd_menus;
    }

    // }}}
    // {{{ read_brd_online()

    /**
    * オンライン板リストを読込む
    */
    static public function read_brd_online()
    {
        global $_conf;

        $brd_menus = array();
        $isNewDL = false;

        if ($_conf['brdfile_online']) {
            $cachefile = P2Util::cacheFileForDL($_conf['brdfile_online']);

            $read_html_flag = false;

            // DLする、ただしnorefreshならDLしない
            if (empty($_GET['nr']) || !file_exists($cachefile.'.p2.brd')) {
                //echo "DL!<br>";//
                $cache_time = time() - 60 * 30 * $_conf['menu_dl_interval'];
                $brdfile_online_res = P2Commun::fileDownload($_conf['brdfile_online'], $cachefile, $cache_time);
                if (isset($brdfile_online_res) && $brdfile_online_res->getStatus() != 304) {
                    $isNewDL = true;
                }

                unset($brdfile_online_res);
            }

            // html形式なら
            if (preg_match('/html?$/', $_conf['brdfile_online'])) {

                // 更新されていたら新規キャッシュ作成
                if ($isNewDL) {
                    // 検索結果がキャッシュされるのを回避
                    if (isset($GLOBALS['word']) && strlen($GLOBALS['word']) > 0) {
                        $_tmp = array($GLOBALS['word'], $GLOBALS['word_fm'], $GLOBALS['words_fm']);
                        $GLOBALS['word'] = null;
                        $GLOBALS['word_fm'] = null;
                        $GLOBALS['words_fm'] = null;
                    } else {
                        $_tmp = null;
                    }

                    //echo "NEW!<br>"; //
                    $aBrdMenu = new BrdMenu(); // クラス BrdMenu のオブジェクトを生成
                    $aBrdMenu->makeBrdFile($cachefile); // .p2.brdファイルを生成
                    $brd_menus[] = $aBrdMenu;
                    unset($aBrdMenu);

                    if ($_tmp) {
                        list($GLOBALS['word'], $GLOBALS['word_fm'], $GLOBALS['words_fm']) = $_tmp;
                        $brd_menus = array();
                    } else {
                        $read_html_flag = true;
                    }
                }

                if (file_exists($cachefile.'.p2.brd')) {
                    $cache_brd = $cachefile.'.p2.brd';
                } else {
                    $cache_brd = $cachefile;
                }

            } else {
                $cache_brd = $cachefile;
            }

            if (!$read_html_flag) {
                if ($data = FileCtl::file_read_lines($cache_brd)) {
                    $aBrdMenu = new BrdMenu(); // クラス BrdMenu のオブジェクトを生成
                    $aBrdMenu->setBrdMatch($cache_brd); // パターンマッチ形式を登録
                    $aBrdMenu->setBrdList($data); // カテゴリーと板をセット
                    if ($aBrdMenu->num) {
                        $brd_menus[] = $aBrdMenu;
                    } else {
                        P2Util::pushInfoHtml("<p>p2 error: {$cache_brd} から板メニューを生成することはできませんでした。</p>");
                    }
                    unset($data, $aBrdMenu);
                } else {
                    P2Util::pushInfoHtml("<p>p2 error: {$cachefile} は読み込めませんでした。</p>");
                }
            }
        }

        return $brd_menus;
    }

    // }}}
}

// }}}

/*
 * Local Variables:
 * mode: php
 * coding: cp932
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * End:
 */
// vim: set syn=php fenc=cp932 ai et ts=4 sw=4 sts=4 fdm=marker:
