Monday, November 08, 2010 at 12:06 AM.
system.verbs.builtins.tcp.im.builtinDrivers.jabber.code.writeXML
on writeXML (XML, connection = @system.temp.jabber.connection) { <<Changes <<5/14/02; 1:51:34 PM by JB <<Changelog created. <<writeXML directly outputs XML to the Jabber XML stream. Use with extreme caution; if the XML is not valid, you'll corrupt the stream unrecoverably. I recommend passing in an XML table, but watch for the "empty XML table" bug, if it hasn't been fixed yet. if not defined ( connection^ ) { scriptError ("Can't write to Jabber server because the connection reference is invalid.")}; bundle { // confirm that the stream is still available on error () { scriptError ("Can't write to Jabber server because the stream has been terminated.")}; if not defined (connection^.tcpStream) { //JES 7/29/02: we have to have a stream handle to call statusStream error ()}; local ( bytes = 0 ); streamStatus = tcp.statusStream(connection^.tcpStream, @bytes); if streamStatus != "OPEN" and streamStatus != "DATA" { error ()}}; local ( tcpStream = connection^.tcpStream, uniqueId = string(connection), semaphoreName, streamStatus, x ); semaphoreName = "jabberStream" + string(uniqueId); try { // make sure the semaphore always gets unlocked, so we don't hold it try { semaphore.lock(semaphoreName, 60)} // allow one second for writing other things else { scriptError ( "Can't write to the Jabber stream because it was locked for more then " + string ( user.im.jabber.prefs.writeTimeout / 60.0) + " seconds." )}; bundle { // process the XML argument to get it to flat text, suitable for transmission if typeOf ( XML ) == stringType { x = XML}; if typeOf ( XML ) == tableType { // assume it's an XML table x = xml.decompile ( @XML )}; if typeOf ( XML ) == addressType and typeOf ( XML^ ) == tableType { // assume it's an adr to an XML table x = xml.decompile ( XML )}; if x beginsWith "<?" { // this needs to be removed, xml.decompile puts it in x = string.mid ( x, string.patternMatch ( "?>", x ) + 2, infinity )}}; tcp.writeStream ( tcpStream, x ); if user.im.jabber.prefs.flDebug { try { local ( db = Frontier.openDataFile("jabberLog") ); local ( debugStr = @db^.jabberOut ); if not defined ( debugStr^ ) { debugStr^ = ""}; if typeOf ( debugStr^ ) != stringType { // allows conversion to wpText on the fly table.moveAndRename ( debugStr, table.uniqueName ( nameOf ( debugStr^ ), db, 3 ) ); debugStr^ = ""}; debugStr^ = debugStr^ + x; debugStr^ = debugStr^ + "\n"}}}; semaphore.unlock(semaphoreName)}; writeXML("\n \n" )
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.