書いたといっても結構前からあったのですが、いらん所を削ぎ落として簡素なXMLRPCライブラリとして仕立て上げました。
簡素とは言えど、一般的な物ならば色々動きます。
例えば、ブログに一気に、しかも機械的にポストしたい場合とか
って事ないですか?MovablebTypeをインストールしたけど、XMLRPCするのにC++コンパイラは入ってるけど、PerlやRubyやPythonは入ってない...とか悲しすぎます。おれは今すぐXMLRPCしたいんだ!そしてどうしてもC++でXMLRPCしたいんだー!
今回紹介する"tinyxmlrpc"はそんな、小さい様で大きな問題を解決出来るかもしれないライブラリです。
mattn's tinyxmlrpc at master - GitHub今githubが不調でpushが反映されていません。リポジトリからのcloneは出来る様です。
tiny xmlrpc library written in C++
http://github.com/mattn/tinyxmlrpc/tree/master
ソースはC++で書いてます。WindowsとUNIX(Linuxでだけ動作確認)で動作します。
機能としては、STLのvectorとかmapとかに親和性高くなる様になっています。内部ではlibxmlでパースしていてcurlで通信しています。
小ささをウリにしていますが、libxmlとcurlのリンクは必須です。
サンプルコードを以下に示します。
#include "tinyxmlrpc.h"
#include <iostream>
class vargs {
private:
tinyxmlrpc::value::Array args_;
public:
vargs& operator <<(tinyxmlrpc::value arg) {
args_.push_back(arg);
return *this;
}
tinyxmlrpc::value::Array& list() {
return this->args_;
}
vargs& first() {
this->args_.clear();
return *this;
}
};
int main(int argc, char* argv[]) {
#ifdef _WIN32
WSAData wsadata;
WSAStartup(MAKEWORD(2,0), &wsadata);
#endif
if (argc != 4) return -1;
std::string endpoint = argv[1];
std::string user = argv[2];
std::string pass = argv[3];
try {
tinyxmlrpc::value::Array req;
tinyxmlrpc::value res;
tinyxmlrpc::value::Struct entry;
vargs args;
res = tinyxmlrpc::call(endpoint,
"metaWeblog.getRecentPosts",
(args.first() << "1" << user << pass << 3 << true).list());
if (!tinyxmlrpc::failed(res)) {
for(int n = 0; n < res.size(); n++) {
std::vector<std::string> members = res[n].listMembers();
std::vector<std::string>::const_iterator it;
std::cout << "{" << std::endl;
for(it = members.begin(); it != members.end(); it++) {
std::string val = res[n][*it].to_str();
std::cout << " " << it->c_str() << "=" << val.c_str() << std::endl;
}
std::cout << "}" << std::endl;
}
} else {
std::cerr << res << std::endl;
}
entry["title"] = "hasegawaにいじめられた";
entry["description"] = "今日は、wassrでhasegawaにいじめられた。悲しかった。";
entry["dateCreated"] = "";
res = tinyxmlrpc::call(
endpoint,
"metaWeblog.newPost",
(args.first() << "1" << user << pass << entry << 1).list());
if (!tinyxmlrpc::failed(res)) {
std::cout << "result:" << res << std::endl;
} else
std::cerr << res << std::endl;
} catch(tinyxmlrpc::value::Exception& e) {
std::cerr << e.message << std::endl;
}
return 0;
}
これを使ってコマンドラインから引数として、MetaWeblogをサポートしているブログのエンドポイントURL、ユーザ、パスワードを指定すると、「hasegawaにいじめられた」というエントリがポストされます。タイトルや本文に、特に意味はありません。すごいですね!
ライセンスはまだ決めてませんが、今のところBSDを予定しています。使ってみて下さい。
コードはgithubにあるので、patchウェルカムです。
今後は、この記事の為だけに仕上げた疑いのある汚いコードを綺麗にしていくつもりです。
参考文献:C++で軽量Webサーバ書いた。