Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.tcp.im.builtinDrivers.jabber.code.handleMessage
on handleMessage (connection, mesAdr) { <<Changes <<5/14/02; 1:51:34 PM by JB <<Changelog created. <<Given a jabber message, extract the information contained in the message and pass it off to the proper handler. mesAdr is an address pointing to xml.compile'd XML. <<Messages relating to being logged in are handled synchronously; all others will be handled asynchronously, so a long <message> or an rpc call won't jam up Jabber for everyone else. on mungeId ( idStr ) { // this munges the id string into a semaphore name, this scriptlet will be copied into several places. if typeOf ( idStr ) == addressType { idStr = nameOf ( idStr^ )}; return "JabberIQTagSem" + idStr}; local ( here = mesAdr, tagName = xml.convertToDisplayName ( nameOf ( here^[1] ) ) ); tagName = string.lower ( tagName ); case tagName { "iq" { // http://docs.jabber.org/jpg/html/main.html#CH-IQNS // the iq is used for a lot of messages, so we need to keep digging to see which one it is local ( iq, query, namespace ); iq = xml.getAddress(here, "iq" ); try { query = xml.getAddress(iq, "query")}; try { id = xml.getAttribute ( iq, "id" )} else { id = ""}; try { namespace = xml.getAttribute ( query, "xmlns" ); namespace = namespace^} else { namespace = ""}; case namespace { "" { // successful login (anything else?) tcp.im.builtinDrivers.jabber.code.handlers.iqLoggedIn ( connection, mesAdr, iq, query )}; "jabber:iq:auth" { // account registration issues, failed login tcp.im.builtinDrivers.jabber.code.handlers.iqRegister ( connection, mesAdr, iq, query )}; "jabber:iq:register" { // account registration issues tcp.im.builtinDrivers.jabber.code.handlers.iqRegister ( connection, mesAdr, iq, query )}; "jabber:iq:roster" { // who this account is subscribed to tcp.im.builtinDrivers.jabber.code.handlers.iqRoster ( connection, mesAdr, iq, query )}; "jabber:iq:version" { // version information requests try { tcp.im.builtinDrivers.jabber.code.handlers.iqVersion ( connection, mesAdr, iq, query )}}} else { // none of the namespaces matched, so look for handlers local ( handlers = tcp.im.builtinDrivers.jabber.code.getHandlerTable(connection, "iq", namespace ) ); if defined ( handlers^ ) { for handler in handlers { while typeOf ( handler^ ) == addressType { handler = handler^}; try { handler^ (iq, query, connection)}}}}; // if there's an ID and the type is result (i.e., a returning query), and the id table exists, unlock the corresponding semaphore // justification for this is in a comment in jabber.idTables.create try { local ( id = xml.getAttributeValue ( iq, "id" ), mesType = xml.getAttributeValue ( iq, "type" ) ); if mesType == "result" and defined ( tcp.im.builtinDrivers.jabber.code.idTables.getAdr ( id )^ ) { semaphore.unlock ( mungeId ( id ) )}}}; "message" { tcp.im.builtinDrivers.jabber.code.handlers.message ( connection, mesAdr )}; "presence" { tcp.im.builtinDrivers.jabber.code.handlers.presence ( connection, mesAdr )}}}; handleMessage ( @workspace.x )
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.