<?php
/*
 * require_onceでXML_RPC_Serverを読み込みます。
 * これだけでXML_RPC_Message, XML_RPC_Responseも読み込めます。
 */
require_once('XML/RPC/Server.php');

/**
 * 送信されたXML_RPCのデータ解析を行います。
 * 引数で与えられる$msgはPHPのPEARパッケージのXML_RPC内に定義されている
 * クラスで、pingデータとして送信されたものが既に分解された状態で収まっ
 * ています。
 * このクラス内からページタイトルやURLを取得して自分なりのpingデータ更新
 * を行います。
 * 処理を行った後はきちんとレスポンスをしなければなりませんが、これも
 * XML_RPCパッケージ内に定義されているXML_RPC_VALUEとXML_RPC_Response
 * にて行うようにします。
 *
 * XML_RPCの詳しい定義、PHPでの実装方法については、下記を参照してください。
 *    http://www.xmlrpc.com/weblogsCom
 *    http://revjim.net/comments/9500/
 *
 * @param    XML_RPC_Message    $msg    XML_RPCデータクラス
 * @return    XML_RPC_Response    XML_RPCのレスポンスクラス
 *
 */
function weblogUpdates($msg)
{
    
/*
     * pingデータは順番が決まっているみたいです。
     * 必須データはタイトルとURLのみですので、これだけ解析できれば
     * いいかと思います。
     *
     * 1番目 : ページタイトル (必須)
     * 2番目 : ページURL (必須)
     * 3番目 : 変更されたURL (オプション)
     * 4番目 : ページカテゴリ (オプション)
     *
     */
    
for ($i 0$i $msg->getNumParams(); $i++) {
    if (
$i == 0) {
        
$title $msg->getParam($i)->getval();
    } else if (
$i == 1) {
        
$url $msg->getParam($i)->getval();
    } else if (
$i == 2) {
        
$change_url $msg->getParam($i)->getval();
    } else if (
$i == 3) {
        
$category $msg->getParam($i)->getval();
    }
    }
    
/*
     * ここで取得したpingデータを処理します。
     * 例えばデータベースへの更新や、ファイル出力など
     */

    /*
     * レスポンス内容はXML_RPCデータの構造体でなければなりませんので、
     * 下記のように定義します。
     * flerrorについては処理が成功したらbooleanで0、失敗したらbooleanで
     * 1を返すようにします。
     * messageについては処理が成功したらサンクスメッセージ、失敗したら
     * 失敗した旨のメッセージにすれば適切かとおもいます。
     * 下記の例では成功した場合の定義をしています。
     */
    
$value = new XML_RPC_Value(
        array(
            
"flerror" => new XML_RPC_Value(0"boolean"),
            
"message" => new XML_RPC_Value("Thanks for the ping.")),
        
"struct");
    
/*
     * 上記でレスポンスメッセージを定義したら、その内容をXML_RPC_Response
     * クラスで戻り値を生成します。下記のようにすれば大体大丈夫かと思われ
     * ます。
     */
    
return new XML_RPC_Response($value);
}

/*
 * pingデータを取得する関数定義をします。
 * Weblogではpingデータを送信するフォーマットが決まっており、名称が
 * 「weblogUpdates.ping」となっているみたいですので、この名前でリクエスト
 * が送られてきた場合はこの関数を実行する、という定義を書きます。
 */
$map = array("weblogUpdates.ping" => array("function" => "weblogUpdates"));

/*
 * 上記で定義した関数などをXML_RPC_Serverへ引数として渡してクラス生成を
 * します。これだけでOKです。
 * XML_RPC_ServerはPEARパッケージのXML_RPCが必要です。
 */
$server =& new XML_RPC_Server($map);

/*
 * exit(0)は単にスクリプトをきちんと終了させるために書いてあります。
 */
exit(0);
?>