diff options
Diffstat (limited to 'sca-cpp/trunk/components/chat/chat-sendreceiver.cpp')
-rw-r--r-- | sca-cpp/trunk/components/chat/chat-sendreceiver.cpp | 99 |
1 files changed, 30 insertions, 69 deletions
diff --git a/sca-cpp/trunk/components/chat/chat-sendreceiver.cpp b/sca-cpp/trunk/components/chat/chat-sendreceiver.cpp index bfbd32b9ae..94577b7551 100644 --- a/sca-cpp/trunk/components/chat/chat-sendreceiver.cpp +++ b/sca-cpp/trunk/components/chat/chat-sendreceiver.cpp @@ -51,56 +51,46 @@ const failable<value> post(const list<value>& params, XMPPClient& xc) { } /** - * A relay function that posts the XMPP messages it receives to a relay component reference. + * Start the component. */ -class relay { -public: - relay(const lambda<value(const list<value>&)>& rel) : rel(rel) { - } +const failable<value> start(const list<value>& params) { + // Extract the relay reference and the XMPP JID and password + const bool hasRelay = !isNil(cddr(params)); + const lvvlambda rel = hasRelay? (lvvlambda)car(params) : lvvlambda(); + const list<value> props = hasRelay? cdr(params) : params; + const value jid = ((lvvlambda)car(props))(nilListValue); + const value pass = ((lvvlambda)cadr(props))(nilListValue); + + // Create an XMPP client session + XMPPClient xc(jid, pass, false); + const failable<bool> r = connect(xc); + if (!hasContent(r)) + return mkfailure<value>(r); - const failable<bool> operator()(const value& jid, const value& val, unused XMPPClient& xc) const { + // Listen and relay messages in a worker thread + worker w(3); + const lambda<const failable<bool>(const value&, const value&, XMPPClient&)> rl = [rel](const value& jid, const value& val, unused XMPPClient& xc) -> const failable<bool> { + // A relay function that posts the XMPP messages it receives to a relay component reference. if (isNil(rel)) return true; debug(jid, "chat::relay::jid"); debug(val, "chat::relay::value"); const value res = rel(mklist<value>("post", mklist<value>(jid), val)); return true; - } - -private: - const lambda<value(const list<value>&)> rel; -}; - -/** - * Subscribe and listen to an XMPP session. - */ -class subscribe { -public: - subscribe(const lambda<failable<bool>(const value&, const value&, XMPPClient&)>& l, XMPPClient& xc) : l(l), xc(xc) { - } + }; - const failable<bool> operator()() const { - gc_pool pool; + // Subscribe and listen to the XMPP session. + const lambda<const failable<bool>()> subscribe = [rl, xc]() -> const failable<bool> { + const gc_pool pool; debug("chat::subscribe::listen"); - const failable<bool> r = listen(l, const_cast<XMPPClient&>(xc)); + const failable<bool> r = listen(rl, const_cast<XMPPClient&>(xc)); debug("chat::subscribe::stopped"); return r; - } - -private: - const lambda<failable<bool>(const value&, const value&, XMPPClient&)> l; - XMPPClient xc; -}; - -/** - * Chat sender/receiver component lambda function - */ -class chatSenderReceiver { -public: - chatSenderReceiver(XMPPClient& xc, worker& w) : xc(xc), w(w) { - } + }; + submit<failable<bool> >(w, subscribe); - const value operator()(const list<value>& params) const { + // Return the chat sender/receiver component lambda function + const lvvlambda senderReceiver = [xc, w](const list<value>& params) -> const value { const tuscany::value func(car(params)); if (func == "post") return post(cdr(params), const_cast<XMPPClient&>(xc)); @@ -115,38 +105,9 @@ public: cancel(const_cast<worker&>(w)); debug("chat::sendreceiver::stopped"); - return failable<value>(value(lambda<value(const list<value>&)>())); - } - -private: - const XMPPClient xc; - worker w; -}; - -/** - * Start the component. - */ -const failable<value> start(const list<value>& params) { - // Extract the relay reference and the XMPP JID and password - const bool hasRelay = !isNil(cddr(params)); - const value rel = hasRelay? car(params) : value(lambda<value(const list<value>&)>()); - const list<value> props = hasRelay? cdr(params) : params; - const value jid = ((lambda<value(const list<value>&)>)car(props))(list<value>()); - const value pass = ((lambda<value(const list<value>&)>)cadr(props))(list<value>()); - - // Create an XMPP client session - XMPPClient xc(jid, pass, false); - const failable<bool> r = connect(xc); - if (!hasContent(r)) - return mkfailure<value>(r); - - // Listen and relay messages in a worker thread - worker w(3); - const lambda<failable<bool>(const value&, const value&, XMPPClient&)> rl = relay(rel); - submit<failable<bool> >(w, lambda<failable<bool>()>(subscribe(rl, xc))); - - // Return the chat sender/receiver component lambda function - return value(lambda<value(const list<value>&)>(chatSenderReceiver(xc, w))); + return failable<value>(value(lvvlambda())); + }; + return value(senderReceiver); } } |