XML-RPC(10) メイン処理

harayoki

2007年05月10日 23:18


XML-RPC links


XML-RPCのサンプルのXML-RPCモジュールを扱うメイン処理部分を解説します。
われながら見てくれが伴わない渋いエントリーだなあ、と思いますが、
いつか誰か(自分かも?)の役に立つかもしれないので詳細まで書いておきます。
(自分が作ったものであっても細部は間が開くと忘れてしまうんですよねえ。)


ハコには前に解説したように、このようなアセット達が含まれています。

ところで、あんまり関係ない話なのですが、

このハコ、床の部分に穴が開いています。
見えない部分だしわざわざふさぐのも面倒なのでふさいでいません。
なんとなくパンダちゃんの隠れ家にぴったり。
他人のいたずらから身を守る効果もアリ!?
さて、今回もソースの該当部分だけ抜粋して解説します。
全体ソース確認はココから。

◆XML-RPCを準備する
Open(){
llSay(0,"Channel Opening...");
bRunning = TRUE;
string autoResponse = "TRUE";
llMessageLinked(LINK_THIS,0,"harayoki.xmlRpcControl TRUE "+autoResponse,NULL_KEY);
}

XML-RPCモジュールを用いてRPC受信を始める関数です。
このようにモジュールにlinkMessageを送るとRPC受信を開始します。
autoResponseを"TRUE"にすると、RPC受信時にモジュールが自動的に
PHP側へ戻り値(固定メッセージ)を送ってくれます。
ここを"FALSE"に設定した場合は、モジュールは自動で戻り値を送らないので、
戻り値を送るコードは自分で書く必要が出てきます。

(※このエントリーでPHPと書いてある部分は、
サーバ側の実装によりそれぞれ別の言語に読みかえて下さい。)


◆XML-RPC受信を停止する
Close(){
llSay(0,"Channel Closing...");
bRunning = FALSE;
llMessageLinked(LINK_THIS,0,"harayoki.xmlRpcControl FALSE",NULL_KEY);
}

XML-RPCモジュールのRPC受信をとめる関数です。
モジュール内ではllCloseRemoteDataChannel命令をしています。
しかしながらlslWiki llCloseRemoteDataChannelによれば
This function does not appear to actually do anything; remote_data events will still fire if a request is received even after llCloseRemoteDataChannel is called, and it doesn't throw any sort of error even if you pass it a string that's clearly not a key. The only way to actually close an XML-RPC channel appears to be to cause the script to be recompiled.

とあるように、scriptをリコンパイルするしかXML-RPCの受信を停止することは出来ないようです。
今後llCloseRemoteDataChannelがきちんと実装された時のために
モジュールにもこの処理を実装してあります。

ほかにもXML-RPC関連には未実装部分が結構あるようです。
発展途上なんでしょうか。


◆XML-RPCを受け取った時の処理
OnXmlRpcReceive(integer num,string str,key id){
string mes = "";
str = llList2String(MyString2List(str," ",2),1);
mes += "iData:"+(string)num +"\n";
mes += "sData:"+(string)str +"\n";
mes += "messageID:"+(string)id +"\n";
Trace("OnXmlRpcReceive\n"+mes);
if(bBusy){
//SendResponce("Now I'm busy.",0,id);
}else{
//SendResponce("Ok your request is received.",1,id);
SayNews(str,num);
}
}

XML-RPCを受け取った時に呼び出される関数です。
numは受信整数データ、strは受信文字列データで、
keyは受信チャンネルキーではなく
1回の通信ごとに割り当てられるメッセージIDの値です。
この値は、どうやら現在のlslではNULL_KEYしか得られない実装になっているようです。
なので、複数のXML-RPCを同時にさばく時、どのように
それぞれを判別してPHP側へ戻り値を返せばいいのかわかりません。
戻り値を返さないと、次のRPCを受け付けない仕様なのかも…?
参考:lslWiki remote_data

bBusyという変数は
次々にXML-RPCがやってきた時に受信拒否メッセージを
PHP側に送ろうとして用意した物なのですが
今回は使用しませんでした。
なのでXML-RPCを受けたった時の処理は
前回説明したSayNews関数で
ニュースナレーション演出をするだけになります。

MyString2Listという関数は
今までもモジュール側のコードでよく出てきましたが
"a,b,c,d,e"というような文字列を["a","b","c d e"]や
["a","b","c","d e"]のように変則的に配列に分配するためのオリジナル関数です。
データとしてスペース(等のセパレータ)自体を含む文字列を
配列に分配する時に使います。


◆XML-RPCへ返答を送る関数
SendResponce(string mes,integer num,key id){
llMessageLinked(LINK_THIS,num,"harayoki.xmlRpcResponse "+mes,id);
}

モジュールを使用してPHPへ返答を送る際はこのような命令を記述します。
引数は文字列、整数、キーがそれぞれ1つずつ送れます。
今回モジュール側に自動でPHPへ返答させているのでこの関数は使いませんでした。


◆XML-RPC受信状態が変化した時の処理
OnXmlRpcOpen(key id){
Trace("OnXmlRpcOpen");
Trace("channel:"+(string)id);
channel = id;
SayStatus();
}
OnXmlRpcClose(){
Trace("OnXmlRpcClose");
channel = NULL_KEY;
SayStatus();
}

XML-RPC受信の用意できた時、OnXmlRpcOpenが、
XML-RPC受信状態を終えた時OnXmlRpcClose
よびだされます。
やっていることは現在の通信チャンネルの保持とステータス表示切替えだけです。


後はXML-RPCとあんまり関係ない部分です。
◆クリック処理
OnSingleClick(key id,integer count){
SayStatus();
}
OnDoubleClick(key id){
if(id!=owner) return;
if(bRunning){
Close();
}else{
Open();
}
}
SayStatus(){
llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES);
if(channel == NULL_KEY){
llSay(0,"RemoteDataChannel Not Ready");
return;
}
llSay(0,"RemoteDataChannel Ready");
llOwnerSay("channel : "+(string)channel);
}

シングルクリックされた際(OnSingleClick)、現在の通信状態を表示します。
オーナーにダブルクリックされた際(OnDoubleClick)、XML-RPCの受信状態を切り替えます。
SayStatus関数が通信状態を表示する処理で、
オーナーにだけ現在の通信チャンネルを表示します。
オーナー以外に通信チャンネルを知られてしまうと
第三者がマイク富丘を操作することが出来てしまうからです。

--

次回はXML-ROCモジュール自体を解説します。
それで終了。ふう。
マイク富丘(RPC)