Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.tcp.im.builtinDrivers.jabber.code.handlers.presence
on presence ( connection, mesAdr) { <<Changes <<5/14/02; 1:51:34 PM by JB <<Changelog created. on niceCreateTable ( adr ) { if not defined(adr^) { new (tableType, adr)}}; local ( from = "", type = 0, p, show = nil, priority = nil, status = nil); p = xml.getAddress ( mesAdr, "presence" ); try { from = xml.getAttributeValue ( p, "from" ) }; try { type = xml.getAttributeValue ( p, "type" ) }; if type == 0 { // defaults to "available" type = "available"}; try { show = xml.getValue (p, "show") }; try { status = xml.getValue (p, "status") }; try { priority = xml.getValue(p, "priority") }; if type == "subscribe" and from != "" { // the "from" wants to subscribe to us tcp.im.builtinDrivers.jabber.code.messages.presence ( dest: from, type: "subscribed", connection: connection ); return}; if type == "unsubscribe" and from != "" { tcp.im.builtinDrivers.jabber.code.messages.presence (dest: from, type: "unsubscribed", connection: connection )}; // otherwise, it's a notification, defaulting to "available"; handle the presence tables local ( jId = tcp.im.builtinDrivers.jabber.code.parseJabberId ( from ), presenceAdr ); niceCreateTable ( @connection^.presence ); presenceAdr = @connection^.presence[jId[1]+"@"+jId[2]]; niceCreateTable ( presenceAdr); if defined ( presenceAdr^.unknown) { delete ( @presenceAdr^.unknown )}; if jId[3] != "" { presenceAdr = @connection^.presence[jId[1]+"@"+jId[2]][jId[3]]} else { presenceAdr = @connection^.presence[jId[1]+"@"+jId[2]]}; niceCreateTable ( presenceAdr ); if type == "unavailable" or type == "error" { presenceAdr^.JabberFrameworkAvailable = false} // need to avoid naming collision with their choice of resource values else { presenceAdr^.JabberFrameworkAvailable = true}; presenceAdr^.JabberFrameworkShow = show; presenceAdr^.JabberFrameworkStatus = status; // now propogate the presence message to interested parties local ( handler = tcp.im.builtinDrivers.jabber.code.getHandler(connection, "presence")); try { while typeOf ( handler^ ) == addressType { handler = handler^; handler^ ( from, type, body, subject, thread, connection )}}; return}
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.