<?php
/*
   +----------------------------------------------------------------------+
   | Copyright (c) 2006                                                   |
   +----------------------------------------------------------------------+
   | Author: Shoma Suzuki <shoma@catbot.net>                              |
   +----------------------------------------------------------------------+

   $Id:$ 
   Description

 */

require_once 'PEAR.php';
require_once 
'XML/RPC.php';
require_once 
'XML/RSS.php';
require_once 
'HTTP/Request.php';
#require_once 'Services/Hatena/Login.php';
#require_once 'Login.php';

/**
 *
 * はてなブックマーク<http://b.hatena.ne.jp>のAPIラッパークラス
 *
 * 以下の2つのAPIを操作する。Atom APIの操作にはログインが必要。
 *
 * はてなブックマーク件数取得API
 * http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%af%b7%ef%bf%f4%bc%e8%c6%c0API
 *
 * はてなブックマークAtom API
 * http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%afAtomAPI
 *
 * @author     Shoma Suzuki <shoma@catbot.net> 
 * @copyright  (c) 2006 
 * @version    $Id$
 * @package    Package
 * @subpackage SubPackage
 */
class Services_Hatena_Bookmark extends PEAR{
    
/**
     * @var    object  HTTP_Request with WSSL Auth.
     * @access private
     */
    
var $_login;
    
// {{{ public function Services_Hatena_Bookmark($user = null, $pass = null) // constructor
    /**
    *
    * This is the short Description for the Function
    *
    * @return  string   Description
    * @param  string $hoge
    * @access  public
    */
    
function Services_Hatena_Bookmark($user null$pass null){
        if(! empty(
$user) AND ! empty($pass)){
            
$this->_login =& new Services_Hatena_Login();
            
$this->_login->setWSSEAuth($user$pass);
        }
    }
    
// }}}
    // {{{ public function getCount($uri)
    /**
    *
    * 引数のURIがはてなブックマークに登録されている件数を返す
    *
    * @return  mixed   Description
    * @param   string $uri
    * @access  public
    * @see     http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%af%b7%ef%bf%f4%bc%e8%c6%c0API
    */
    
function getCount($uri){
        
$params = array( new XML_RPC_Value($uri'string'));
        return 
$this->_request($params);
    }
    
// }}}
    // {{{ public function getCounts($uris)
    /**
    *
    * 引数のURIがはてなブックマークに登録されている件数を返す
    *
    * @return  mixed   Description
    * @param   array   $urils
    * @access  public
    * @see     http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%af%b7%ef%bf%f4%bc%e8%c6%c0API
    */
    
function getCounts($uris = array()){
        foreach(
$uris as $item){
            
$params[] = new XML_RPC_Value($item'string');
        }
        return 
$this->_request($params);
        
    }
    
// }}}
    // {{{ public function getCommnets($uri)
    /**
    *
    * Atom APIからコメントを取得
    *
    * @return  mixed   Description
    * @param  string   $hoge
    * @access  public
    * @see http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%afAtomAPI
    */
    
function getCommnets($uri){
        
$baseurl 'http://b.hatena.ne.jp/entry/rss/';
        
$rss =& new XML_RSS($baseurl.$uri);
        
$rss->parse();
        foreach(
$rss->getItems() as $item){
            
$rtn[] = $item;
        }
        return 
$rtn;
    }
    
// }}}
    // {{{ public function RegisterURI($uri) not implement
    /**
    *
    * This is the short Description for the Function
    *
    * @return  mixed   Description
    * @param   string  $params, URI, Commnets
    * @access  public
    * @see http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%afAtomAPI
    */
    
function RegisterURI($params = array()){
        
$posturl 'http://b.hatena.ne.jp/atom/post';
        
$this->_login->setURL($posturl);
    }
    
// }}}
    // {{{ public function Edit($uri) not implement
    /**
    *
    * This is the short Description for the Function
    *
    * @return  mixed   Description
    * @param   string $hoge
    * @access  public
    */
    
function Edit($uri){
    }
    
// }}}
    // {{{ public function Delete($uri) not implement
    /**
    *
    * This is the short Description for the Function
    *
    * @return  double   Description
    * @param  string $hoge
    * @access  public
    */
    
function Delete($uri){
    }
    
// }}}
    // {{{ public function GetFeed($uri) not implement
    /**
    *
    * This is the short Description for the Function
    *
    * @return  mixed   Description
    * @param  string $hoge
    * @access  public
    */
    
function GetFeed($uri){
    }
    
// }}}
    // {{{ public function getRecentFeeds($uri) not implement
    /**
    *
    * This is the short Description for the Function
    *
    * @return  mixed   Description
    * @param  string $hoge
    * @access  public
    */
    
function getRecentFeeds($uri){
    }
    
// }}}
    // {{{ private function _request($param)
    /**
    *
    * This is the short Description for the Function
    *
    * @return  mixed   Description
    * @param  string $hoge
    * @access  private
    */
    
function _request($param){
        
$msg = new XML_RPC_Message('bookmark.getCount'$params);
        
$cli = new XML_RPC_Client('/xmlrpc''b.hatena.ne.jp');
        
$resp $cli->send($msg);
        if(! 
$resp){
            
// Error: Communication error
            
return PEAR::raiseError('Communication Error');
        }elseif(
$resp->faultCode()){
            
// Error
            
$err $resp->faultString();
            return  
PEAR::raiseError($err);
        }else{
            
$val $resp->value();
            return 
$resp->XPL_RPC_decode($val);
        }
    }
    
// }}}
}

/*
$bkmk =& new Services_Hatena_Bookmark();
var_dump($bkmk->getCount('http://www.hatena.ne.jp/info/webservices'));
var_dump($bkmk->getCommnets('http://www.hatena.ne.jp/info/webservices'));
*/

/*
 * vim: set expandtab tabstop=4 shiftwidth=4 
 * vim600: foldmethod=marker
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 */
?>