Exportfile for AOT version 1.0 or later Formatversion: 1 ***Element: JOB ; Navision Axapta Job: test_xmlrpc unloaded at Thursday 4/21/2005 ; -------------------------------------------------------------------------------- JOBVERSION 1 SOURCE #test_xmlrpc #static void test_xmlrpc(Args _args) #{ # XMLRPCClient xmlrpc = new XMLRPCClient( "http://localhost:8200/index_html", "edit", true ); # str username = "test"; # str password = "tester"; # Struct params = new Struct(); # # params.add( "text_format", "html" ); # params.add( "text", "blech" ); # # //xmlrpc.addStructParam( params ); # xmlrpc.addStringParam( "html" ); # xmlrpc.addStringParam( "blech" ); # xmlrpc.execute( username, password ); # #} ENDSOURCE ***Element: CLS ; Navision Axapta Class: XMLRPCClient unloaded at Thursday 4/21/2005 ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #XMLRPCClient PROPERTIES Name #XMLRPCClient Extends # RunOn #Called from ENDPROPERTIES METHODS Version: 3 SOURCE #addBooleanParam #void addBooleanParam( boolean value ) #{ # container element; # # element = conins( element, 1, "boolean" ); # if( value ) # element = conins( element, 2, 1 ); # else # element = conins( element, 2, 0 ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} # ENDSOURCE SOURCE #addContainerParam #void addContainerParam( container c ) #{ # container element; # # element = conins( element, 1, "array" ); # element = conins( element, 2, c ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} # ENDSOURCE SOURCE #addDatetimeParam #void addDatetimeParam( date d, timeOfDay t ) #{ # container element; # # element = conins( element, 1, "dateTime.iso8601" ); # element = conins( element, 2, this.dateTimeToString( d, t ) ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} ENDSOURCE SOURCE #addIntParam #void addIntParam( int value ) #{ # container element; # # element = conins( element, 1, "i4" ); # element = conins( element, 2, value ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} ENDSOURCE SOURCE #addRealParam #void addRealParam( real value ) #{ # container element; # # element = conins( element, 1, "double" ); # element = conins( element, 2, value ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} # ENDSOURCE SOURCE #addStringParam #void addStringParam( str value ) #{ # container element; # # element = conins( element, 1, "string" ); # element = conins( element, 2, value ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} ENDSOURCE SOURCE #addStructParam #void addStructParam( struct s ) #{ # container element; # # element = conins( element, 1, "struct" ); # element = conins( element, 2, s.pack() ); # # params = conins( params, paramsPosition, element ); # paramsPosition++; #} # ENDSOURCE SOURCE #buildParamNode #private void buildParamNode( XMLNode node, container c ) #{ # XMLNode baseParamNode, valueNode, tempNode, structNode, subStructNode, dataNode, dataValueNode; # XMLNode typeNode; # Struct s; # anytype a; # int ix, type; # container arrayCont; # # baseParamNode = xmlRequest.createElement( "param" ); # valueNode = xmlRequest.createElement( "value" ); # # switch ( conpeek( c, 1 ) ) # { # case "struct" : # s = Struct::create( conpeek( c, 2 ) ); # # tempNode = xmlRequest.createElement( "struct" ); # # for (ix = 1; ix <= s.fields(); ix++) # { # structNode = xmlRequest.createElement( "member" ); # # switch ( s.fieldType(ix) ) # { # case Types::STRING : # subStructNode = xmlRequest.createElement( "name" ); # subStructNode.text( s.fieldName(ix) ); # structNode.appendChild( subStructNode ); # subStructNode = xmlRequest.createElement( "value" ); # typeNode = xmlRequest.createElement( "string" ); # typeNode.text( s.value( s.fieldName(ix) ) ); # subStructNode.appendChild( typeNode ); # break; # case Types::INTEGER : # subStructNode = xmlRequest.createElement( "name" ); # subStructNode.text( s.fieldName(ix) ); # structNode.appendChild( subStructNode ); # subStructNode = xmlRequest.createElement( "value" ); # typeNode = xmlRequest.createElement( "i4" ); # typeNode.text( s.value( s.fieldName(ix) ) ); # subStructNode.appendChild( typeNode ); # break; # case Types::REAL : # subStructNode = xmlRequest.createElement( "name" ); # subStructNode.text( s.fieldName(ix) ); # structNode.appendChild( subStructNode ); # subStructNode = xmlRequest.createElement( "value" ); # typeNode = xmlRequest.createElement( "double" ); # typeNode.text( s.value( s.fieldName(ix) ) ); # subStructNode.appendChild( typeNode ); # break; # case Types::ENUM : # subStructNode = xmlRequest.createElement( "name" ); # subStructNode.text( s.fieldName(ix) ); # structNode.appendChild( subStructNode ); # subStructNode = xmlRequest.createElement( "value" ); # typeNode = xmlRequest.createElement( "boolean" ); # typeNode.text( s.value( s.fieldName(ix) ) ); # subStructNode.appendChild( typeNode ); # break; # } # # structNode.appendChild( subStructNode ); # tempNode.appendChild( structNode ); # } # break; # case "array" : # arrayCont = conpeek( c, 2 ); # tempNode = xmlRequest.createElement( "array" ); # dataNode = xmlRequest.createElement( "data" ); # # for( ix = 1; ix <= conlen( arrayCont ); ix++ ) # { # //a = conpeek( arrayCont, ix ); # //type = typeOf(a); # # dataValueNode = xmlRequest.createElement( "value" ); # # switch( typeOf( conpeek( arrayCont, ix ) ) ) # { # case Types::STRING : # typeNode = xmlRequest.createElement("string"); # typeNode.text( conpeek( arrayCont, ix ) ); # dataValueNode.appendChild( typeNode ); # break; # case Types::INTEGER : # typeNode = xmlRequest.createElement("i4"); # typeNode.text( int2str( conpeek( arrayCont, ix ) ) ); # dataValueNode.appendChild( typeNode ); # break; # case Types::ENUM : # typeNode = xmlRequest.createElement("boolean"); # typeNode.text( int2str( conpeek( arrayCont, ix ) ) ); # dataValueNode.appendChild( typeNode ); # break; # case Types::REAL : # typeNode = xmlRequest.createElement("double"); # typeNode.text( conpeek( arrayCont, ix ) ); # dataValueNode.appendChild( typeNode ); # break; # case Types::DATE : # typeNode = xmlRequest.createElement("dateTime.iso8601"); # typeNode.text( this.dateTimeToString( conpeek( arrayCont, ix ) ) ); # dataValueNode.appendChild( typeNode ); # break; # case Types::CONTAINER : # this.buildParamNode( dataValueNode, ["array", arrayCont] ); # break; # } # # dataNode.appendChild( dataValueNode ); # } # tempNode.appendChild( dataNode ); # break; # default : # tempNode = xmlRequest.createElement( conpeek( c, 1 ) ); # tempNode.text( conpeek( c, 2 ) ); # } # # valueNode.appendChild( tempNode ); # baseParamNode.appendChild( valueNode ); # node.appendChild( baseParamNode ); # #} ENDSOURCE SOURCE #buildRequestXML #private void buildRequestXML() #{ # XMLProcessingInstruction xmlProc; # XMLNode topNode; # XMLElement xmlElement; # XMLNode methodNode, paramNode, tempNode; # int ix; # container c; # struct s; # # xmlRequest = new XMLDocument(); # xmlProc = xmlRequest.createProcessingInstruction("xml", "version=\"1.0\""); # topNode = xmlRequest.documentElement(); # xmlElement = xmlRequest.createElement("methodCall"); # topNode = xmlRequest.appendChild( xmlElement ); # xmlRequest.insertBefore( xmlProc, topNode.com() ); # # methodNode = xmlRequest.createElement("methodName"); # methodNode.text( method ); # topNode.appendChild( methodNode ); # # paramNode = xmlRequest.createElement("params"); # # for ( ix = 1; ix <= conlen( params ); ix++ ) # { # c = conpeek( params, ix ); # this.buildParamNode( paramNode, c ); # } # # topNode.appendChild( paramNode ); # #} ENDSOURCE SOURCE #classDeclaration #/* # #XMLRPCClient for Axapta, v. 0.9 #(c) 2001/10/26 by Greg Pierce, greg@turtleprod.com #http://greg.turtleprod.com/ # #Implementation of the XML-RPC client specification in the form #of an Axapta project. For more information on xml-rpc, visit http://www.xmlrpc.com/ # #REQUIREMENTS: Axapta 2.5 or greater # #KNOWN ISSUES: #This release does not yet support the following: #--nested struct params #--struct return values #--base64 encoded binary elements # #LICENSING: #This is code is (c) 2001, Greg Pierce...but is distributed for use free #of charge for non-commercial application -- ie, not for use in other commercially #sold packages. If you use the code, or have any bug reports, let me know at greg@turtleprod.com. # #Thanks, greg. # #*/ # #class XMLRPCClient #{ # str serverURL; # str protocol, host, path, method; # int port; # XMLDocument xmlRequest, xmlResult; # container params; # int paramsPosition; # int resultType; # int faultCode; # str faultString; # str resultString; # int resultInt; # boolean resultBoolean; # real resultReal; # date resultDate; # timeOfDay resultTime; # container resultContainer; # struct resultStruct; # boolean flDebug; #} ENDSOURCE SOURCE #dateTimeToString #/* 2001/10/26 by Greg Pierce # convert date and time to iso8601 date-time string # */ # #private str dateTimeToString( date d, timeOfDay t = 0 ) #{ # str s = ""; # # // DATE # s += int2str( year( d ) ); # if( mthOfYr( d ) < 10 ) # s += "0"; # s += int2str( mthOfYr( d ) ); # if( dayOfMth( d ) < 10 ) # s += "0"; # s += int2str( dayOfMth( d ) ); # # // TIME # s += "T"; # s += time2str( t, 1, 1 ); # # return s; #} ENDSOURCE SOURCE #errorReturned #boolean errorReturned() #{ # if( resultType == XMLRPCResultTypes::Error ) # return true; # # return false; #} ENDSOURCE SOURCE #execute #/* 2004/09/30 by Greg Pierce # rev. added username/password for basic authentication # requires ALT_Base64 module # */ # #public boolean execute( str username = '', str password = '' ) #{ # XMLHttpRequest xmlReq = new XMLHttpRequest(); # AsciiIO io = new AsciiIo( "C:\\data\\rawResponse.txt", "W" ); # # this.resultType(); # this.buildRequestXML(); # # if( flDebug ) # xmlRequest.save( "C:\\Data\\xmlRequest.xml" ); # # xmlReq.open("POST", serverURL ); # if( username && password ) # xmlReq.setRequestHeader( "AUTHORIZATION", strfmt( "Basic %1", new ALT_Base64().Encode( username + ":" + password ) ) ); # xmlReq.setRequestHeader("Content-Type", "text/xml"); # xmlReq.sendXML( xmlRequest ); # # if( flDebug ) # io.write( xmlReq.responseText() ); # # xmlResult = new XMLDocument( xmlReq.responseXML() ); # # if( flDebug ) # xmlResult.save( "C:\\Data\\xmlResult.xml" ); # # this.parseResultXML(); # # if( this.errorReturned() ) # return false; # # return true; #} ENDSOURCE SOURCE #faultCode #public int faultCode() #{ # return faultCode; #} # ENDSOURCE SOURCE #faultString #public str faultString() #{ # return faultString; #} ENDSOURCE SOURCE #method #public str method( str _method = "" ) #{ # if( _method ) # method = _method; # # return method; #} ENDSOURCE SOURCE #new #public void new( str _serverURL, str _method, boolean _flDebug = false ) #{ # this.serverURL( _serverURL ); # this.method( _method ); # paramsPosition = 1; # flDebug = _flDebug; #} ENDSOURCE SOURCE #parseArrayNode #private container parseArrayNode( XMLNode node ) #{ # container c; # int ix = 1; # XMLNode dataNode, valueNode, valueTypeNode; # str valueTypeStr; # XMLNodeListIterator _iterator; # # dataNode = node.firstChild(); # _iterator = new XMLNodeListIterator( dataNode.childNodes() ); # # while( _iterator.moreValues() ) # { # valueNode = _iterator.value(); # valueTypeNode = valueNode.firstChild(); # # if( !valueTypeNode || valueTypeNode.nodeName() == "#text" ) # { # valueTypeStr = "string"; # valueTypeNode = _iterator.value(); # } # else # valueTypeStr = valueTypeNode.nodeName(); # # switch ( valueTypeStr ) # { # case "string" : # c = conpoke( c, ix, valueTypeNode.text() ); # break; # case "int" : # c = conpoke( c, ix, str2int( valueTypeNode.text() ) ); # break; # case "i4" : # c = conpoke( c, ix, str2int( valueTypeNode.text() ) ); # break; # case "dateTime.iso8601" : # c = conpoke( c, ix, this.stringToDateTime( valueTypeNode.text() ) ); # break; # case "boolean" : # if( valueTypeNode.text() == "1" ) # c = conpoke( c, ix, true ); # else # c = conpoke( c, ix, false ); # break; # case "double" : # resultType = XMLRPCResultTypes::RealType; # resultReal = str2num( valueTypeNode.text() ); # break; # case "array" : # c = conpoke( c, ix, this.parseArrayNode( valueTypeNode ) ); # break; # case "struct" : # throw error( "Structs nested in arrays not yet handled." ); # } # # ix++; # _iterator.nextValue(); # } # # return c; #} ENDSOURCE SOURCE #parseFaultNode #private void parseFaultNode( XMLNode faultNode ) #{ # XMLNode faultValueNode, faultStructNode, faultStructMemberNode, nameNode, valueNode, valueTypeNode; # XMLNodeListIterator iterator; # boolean first = true; # # this.resultType( XMLRPCResultTypes::Error ); # # faultValueNode = faultNode.firstChild(); # faultStructNode = faultValueNode.firstChild(); # iterator = new XMLNodeListIterator( faultStructNode.childNodes() ); # # while( iterator.moreValues() ) # { # faultStructMemberNode = iterator.value(); # # if( first ) # { # valueNode = faultStructMemberNode.selectSingleNode("value"); # valueTypeNode = valueNode.firstChild(); # faultCode = str2int( valueTypeNode.text() ); # first = false; # } # else # { # valueNode = faultStructMemberNode.selectSingleNode("value"); # valueTypeNode = valueNode.firstChild(); # faultString = valueTypeNode.text(); # } # # iterator.nextValue(); # } #} ENDSOURCE SOURCE #parseResultNode #private void parseResultNode( XMLNode resultNode ) #{ # XMLNode paramNode, valueNode, valueTypeNode; # XMLNodeListIterator paramsIterator = new XMLNodeListIterator( resultNode.childNodes() ); # str valueTypeStr; # str dateStr, timeStr; # # while( paramsIterator.moreValues() ) # { # paramNode = paramsIterator.value(); # valueNode = paramNode.firstChild(); # valueTypeNode = valueNode.firstChild(); # # if( !valueTypeNode || valueTypeNode.nodeName() == "#text" ) # { # valueTypeStr = "string"; # valueTypeNode = paramNode.firstChild(); # } # else # valueTypeStr = valueTypeNode.nodeName(); # # switch ( valueTypeStr ) # { # case "string" : # resultType = XMLRPCResultTypes::StringType; # resultString = valueTypeNode.text(); # break; # case "i4" : # resultType = XMLRPCResultTypes::IntegerType; # resultInt = str2int(valueTypeNode.text()); # break; # case "int" : # resultType = XMLRPCResultTypes::IntegerType; # resultInt = str2int(valueTypeNode.text()); # break; # case "boolean" : # resultType = XMLRPCResultTypes::BooleanType; # if( valueTypeNode.text() == "1" ) # resultBoolean = true; # else # resultBoolean = false; # break; # case "double" : # resultType = XMLRPCResultTypes::RealType; # resultReal = str2num( valueTypeNode.text() ); # break; # case "dateTime.iso8601" : # resultType = XMLRPCResultTypes::DateType; # [ resultDate, resultTime ] = this.stringToDateTime( valueTypeNode.text() ); # break; # case "struct" : # resultType = XMLRPCResultTypes::StructType; # throw error( "Struct results not yet handled." ); # case "array" : # resultType = XMLRPCResultTypes::ContainerType; # resultContainer = this.parseArrayNode( valueTypeNode ); # break; # case "base64" : # throw error( "base64 results not yet handled." ); # } # # paramsIterator.nextValue(); # } # #} ENDSOURCE SOURCE #parseResultXML #private void parseResultXML() #{ # XMLNode rootNode, thisNode; # # rootNode = xmlResult.documentElement(); # thisNode = rootNode.firstChild(); # # switch ( thisNode.nodeName() ) # { # case "fault" : # this.parseFaultNode( thisNode ); # break; # case "params" : # this.parseResultNode( thisNode ); # break; # default : # throw error( "XMLRPC error: Poorly formed response XML." ); # } #} ENDSOURCE SOURCE #resetParams #void resetParams() #{ # params = connull(); #} ENDSOURCE SOURCE #resultBoolean #public boolean resultBoolean() #{ # return resultBoolean; #} ENDSOURCE SOURCE #resultContainer #public container resultContainer() #{ # return resultContainer; #} ENDSOURCE SOURCE #resultDatetime #public container resultDatetime() #{ # return [resultDate, resultTime]; #} ENDSOURCE SOURCE #resultInt #public int resultInt() #{ # return resultInt; #} # ENDSOURCE SOURCE #resultReal #public real resultReal() #{ # return resultReal; #} # ENDSOURCE SOURCE #resultString #public str resultString() #{ # return resultString; #} # ENDSOURCE SOURCE #resultStruct #public Struct resultStruct() #{ # return resultStruct; #} # ENDSOURCE SOURCE #resultType #public int resultType( int _resultType = 0 ) #{ # if( resultType != 0 ) # resultType = _resultType; # # return resultType; #} # ENDSOURCE SOURCE #serverURL #public str serverURL( str _serverURL = "" ) #{ # URLTools _urlTools; # # if( _serverURL ) # { # _urlTools = new URLTools( ); # serverURL = _serverURL; # [protocol, host, port, path] = _urlTools.splitURL( _serverURL ); # # # } # # return serverURL; #} ENDSOURCE SOURCE #stringToDateTime #/* 2001/10/26 by Greg Pierce # convert iso8601 date-time string to a container # containing two elements, the date and time # rev. 2005/04/21 by Greg Pierce # fixed string functions. # */ # #private container stringToDateTime( str s ) #{ # date d; # timeOfDay t; # str dStr = ""; # container c; # # dStr = strdel( s, 9, strlen( s )- 8 ); # dStr = strins( dStr, ".", 7 ); # dStr = strins( dStr, ".", 5 ); # d = str2date( dStr, 321 ); # # t = str2time( strdel( s, 1, 9 ) ); # # c = conpoke( c, 1, d ); # c = conpoke( c, 2, t ); # # return c; #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: DBE ; Navision Axapta Enumtype : XMLRPCResultTypes unloaded at Thursday 4/21/2005 ; -------------------------------------------------------------------------------- ENUMTYPEVERSION 1 ENUMTYPE #XMLRPCResultTypes PROPERTIES Name #XMLRPCResultTypes Label # Help # DisplayLength #Auto Style #Combo box FeatureKey # ConfigurationKey # UseEnumValue #Yes ENDPROPERTIES TYPEELEMENTS #Error PROPERTIES Name #Error Label #Error FeatureKey # ConfigurationKey # EnumValue #0 ENDPROPERTIES #StringType PROPERTIES Name #StringType Label #String FeatureKey # ConfigurationKey # EnumValue #1 ENDPROPERTIES #IntegerType PROPERTIES Name #IntegerType Label #Integer FeatureKey # ConfigurationKey # EnumValue #2 ENDPROPERTIES #RealType PROPERTIES Name #RealType Label #Real FeatureKey # ConfigurationKey # EnumValue #3 ENDPROPERTIES #DateType PROPERTIES Name #DateType Label #Date FeatureKey # ConfigurationKey # EnumValue #4 ENDPROPERTIES #ContainerType PROPERTIES Name #ContainerType Label #Container FeatureKey # ConfigurationKey # EnumValue #5 ENDPROPERTIES #StructType PROPERTIES Name #StructType Label #Struct FeatureKey # ConfigurationKey # EnumValue #6 ENDPROPERTIES #BooleanType PROPERTIES Name #BooleanType Label #Boolean FeatureKey # ConfigurationKey # EnumValue #7 ENDPROPERTIES ENDTYPEELEMENTS ENDENUMTYPE ***Element: CLS ; Navision Axapta Class: URLTools unloaded at Thursday 4/21/2005 ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #URLTools PROPERTIES Name #URLTools Extends # RunOn #Called from ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class URLTools #{ # str 500 _url; #} ENDSOURCE SOURCE #new #void new( str 500 url = "" ) #{ # _url = url; #} ENDSOURCE SOURCE #splitURL #/* 2001/05/24 by Greg Pierce # break url in proctocal, host, path parts # args will still be part of the path after this operation # */ # #container splitURL( str 500 url = _url ) #{ # str _protocol, _host, _path, s; # int ix, _port = 80; # # ix = strfind(url, ":", 1, 10); # _protocol = strdel(url, ix, strlen(url)-ix+1); # # s = strdel( url, 1, ix + 2 ); # ix = strfind( s, "/", 1, 100 ); # if( ix != 0 ) # { # _host = strdel( s, ix, strlen(s) - ix + 1 ); # _path = strdel( s, 1, strlen( _host ) ); # } # else # { # _host = s; # _path = "/"; # } # # if( strfind( _host, ":", 1, strlen( _host ) ) != 0 ) // split port # { # ix = strfind( _host, ":", 1, strlen( _host ) ); # _port = decround( str2num( strdel( _host, 1, ix ) ), 0 ); # _host = strdel( _host, ix, strlen( _host ) - ix + 1 ); # } # # return [_protocol, _host, _port, _path]; #} ENDSOURCE SOURCE #url #str url( str 500 url = _url ) #{ # _url = url; # return _url; #} ENDSOURCE SOURCE #decode #static str decode( str s ) #{ # SysURLEncoder _obj = new SysURLEncoder(); # # return _obj.decode(s); #} # ENDSOURCE SOURCE #encode #static str encode( str s ) #{ # SysURLEncoder _obj = new SysURLEncoder(); # # return _obj.encode(s); #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: PRN ; Navision Axapta Project : XMLRPCClient unloaded at Thursday 4/21/2005 ; -------------------------------------------------------------------------------- PROJECTVERSION 2 PROJECT #XMLRPCClient PRIVATE PROPERTIES Name #XMLRPCClient ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 5 UTILOBJECTID 0 NODETYPE 215 NAME #test_xmlrpc ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 50050 NODETYPE 329 NAME #XMLRPCClient ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 40 UTILOBJECTID 50021 NODETYPE 209 NAME #XMLRPCResultTypes ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 50044 NODETYPE 329 NAME #URLTools ENDNODE ENDPROJECT ***Element: END