[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: New to XML - Dequeue2 Request Issue



Did you try to read the program example PReid posted? It is pretty much laid out in the program to do what you need.

The parsing procedure is called INCOMING in which the element called "transactions" is found and base64 decoded. Sound familiar? You can see how to base64 decode "inline" without the use of work files. First, the length of the decoded data is set to the max of decodedData. Then the routine is called with parameters encoded_Data: encoded_DataLength: where_to_put_decodedData: maximum_length_of_decodedData. The return value is the actual length of the decodedData. Use this to set the length of the decodedData field. Now decodedData is ready for next step.

This decoded XML is then parsed for the real data in procedure embedded.
rc2 = http_parse_xml_string(%addr(decodedData: *DATA)
                                       : %len(decodedData)
                                       : 819
                                       : *NULL
                                       : %paddr(embedded)
                                       : *NULL);
You will need to change the embedded procedure to pull out the information you need but the general "how to get there" is in the program.

-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of corby.weaver@xxxxxxxxxxxxxxxxx
Sent: Tuesday, December 15, 2015 10:36 AM
To: HTTPAPI and FTPAPI Projects
Subject: RE: New to XML - Dequeue2 Request Issue

   I'm hoping to be able to use the base64_decode process, just not sure
   how to go about doing it.  I've got everything else working fine
   (bringing the XML file in, parsing the actual data from that response,
   etc).  I've gone thru the forum and looked at various
   suggestions/examples that are out there but not having success with it.
    I feel like I'm spinning my wheels.
   From:        PReid@xxxxxxxxxxxx
   To:        HTTPAPI and FTPAPI Projects <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>,
   Cc:        ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   Date:        12/14/2015 10:49 AM
   Subject:        RE: New to XML - Dequeue2 Request Issue
   Sent by:        ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     __________________________________________________________________

   Hello. I'll admit that I haven't read this thread entirely, but I'd
   like
   to try and offer some assistance back to the group that has helped me
   so
   much in the past. I believe that I'm doing exactly what you are trying
   to
   do. Below I have copied the source from my program in the hopes that
   maybe
   this will assist you. Of course I have removed any sensitive User ID,
   Password info, etc, and replaced is with ***.
   I'm still at the learning stage with all of this, so I know I'm not
   using
   the best methodology for creating my XML SOAP request (just creating a
   big
   string...apologies to Jon Paris) , that is something for me to learn in
   the future, however I'm hoping you still may find this useful.
   This code is currently in production as is working fine for us,
   however; I
   offer no guarantees on it working for you.
       H BNDDIR('DSBNDDIR':'HTTPAPI':'QC2LE':'UTBNDDIR')

   *----------------------------------------------------------------------
   --*
        * DSRPERFMON - Download Performance Monitoring data from SHAW.
   *
        * Currently this program receives two different transactions from
   the web*
        * service: 1 : T.4.01.0 - PM Performance Data Transaction Type.  *

        *          2 : T.3.02.0 - Critical Event Reporting (CER).     *

        * The data from both of these transactions is written out to file

   *
        * DSPPERFMON.     *

   *----------------------------------------------------------------------
   --*
        * Prototype call to this program:     *

   *----------------------------------------------------------------------
   --*
        *
       D DSRPERFMON      PR                  extpgm('DSRPERFMON')

        *
       D DSRPERFMON      PI
        *

   *----------------------------------------------------------------------
   --*
        * Prototypes:     *

   *----------------------------------------------------------------------
   --*
        *
        * Scott Klement's HTTPAPI.
        /include qrpglesrc,HTTPAPI_H
        *
        * Scott Klement's Base64 encoder/decoder.
        /include qrpglesrc,BASE64_H
        *
        * Scott Klement's prototype for performing I/O with the IFS.
        /include qrpglesrc,IFSIO_H
        *
        * Write out performance monitoring data to out database.
        /include qcopysrc,DSTPERFUP
        *
        * For sending email notifications.
        /include qcopysrc,UTTEMAIL
        *

   *----------------------------------------------------------------------
   --*
        * incoming - Parse response from SHAW.     *

   *----------------------------------------------------------------------
   --*
        *
       D incoming...
       D                 PR
       D   userData...
       D                                8F
       D   nestingDepth...
       D                               10I 0 value
       D   elementName...
       D                             1024A   varying const
       D   elementPath...
       D                            24576A   varying const
       D   elementValue...
       D                                     likeds(Xmlstring_t)
       D   attributes...
       D                                 *   dim(32767)
       D                                     const options(*varsize)

        *

   *----------------------------------------------------------------------
   --*
        * embedded - Parse the embedded XML.     *

   *----------------------------------------------------------------------
   --*
        *
       D embedded...
       D                 PR
       D   userData...
       D                                 *   value
       D   nestingDepth...
       D                               10I 0 value
       D   elementName...
       D                             1024A   varying const
       D   elementPath...
       D                            24576A   varying const
       D   elementValue...
       D                            65535A   varying const
       D   attributes...
       D                                 *   dim(32767)
       D                                     const options(*varsize)

        *

   *----------------------------------------------------------------------
   --*
        * All data required to write a record to DSPPERFMON.     *

   *----------------------------------------------------------------------
   --*
        *
       D allPerfDataDS...
       D                 DS
   likeDS(DSRMPERFUP_allPerfDataDS)
        *

   *----------------------------------------------------------------------
   --*
        * Errors on procedure call when writing to DSPPERFMON.     *

   *----------------------------------------------------------------------
   --*
        *
       D errorInfo...
       D                 DS                  likeDS(UTTERRDS_errorDS)

        *

   *----------------------------------------------------------------------
   --*
        * Receive data with pointers into a data structure.     *

   *----------------------------------------------------------------------
   --*
        *
       D XmlString_t...
       D                 DS                  qualified Template
       D  data                           *
       D  len                          10I 0
        *

   *----------------------------------------------------------------------
   --*
        * Last transaction ID.     *

   *----------------------------------------------------------------------
   --*
        *
       D ##PERFMON...
       D                 S             17  0 dtaara(##PERFMON)
        *

   *----------------------------------------------------------------------
   --*
        * Local variables in alphabetical order:     *

   *----------------------------------------------------------------------
   --*
        *
       D decodedData...
       D                 S               A   len(2000000) varying

       D decodedLength...
       D                 S             10I 0
       D errorMessage...
       D                 S            100A   inz(*blanks)
       D parserLog...
       D                 S           1000A   varying
       D peErrorNo...
       D                 S             10I 0 inz(*zeros)
       D rc1...
       D                 S             10I 0
       D rc2...
       D                 S             10I 0
       D responseLog...
       D                 S           1000A   varying
       D scMsg...
       D                 S            102A   inz(*blanks)
       D sndGroup...
       D                 S             10A   inz('OPSSUPPORT')
       D sndMessage...
       D                 S           1000A   inz(*blanks)
       D sndSubject...
       D                 S             50A   inz(*blanks)
       D soapRequest...
       D                 S          32767A   varying
       D soapHeader...
       D                 S          32767A   varying
       D soapBody...
       D                 S          32767A   varying
       D subscriberId...
       D                 S              9A   varying
       D transCount...
       D                 S              5P 0 inz(*zeros)
       D transIdIn...
       D                 S             17A   varying
       D transIdOut...
       D                 S             17  0 inz(*zeros)
       D userData...
       D                 S              8F
       D var...
       D                 S             50A   based(p_var)
        *

   *----------------------------------------------------------------------
   --*
        * Mainline:     *

   *----------------------------------------------------------------------
   --*
        *
        /free

            // Assemble an XML SOAP request to be posted to SHAW's Web
   Service.
            exsr assembleSOAPheader;
            exsr assembleSOAPbody;
            soapRequest = %trim(soapHeader) + %trim(soapBody);

            // Turn on the debugger before the post.
            responseLog = '/PerformanceMonitoring/responseLog.txt';
            http_debug(*on : responseLog);

            // Change the way the XML parser returns the data. We need

            // to return pointers because the amount of data is so large.

            http_XmlReturnPtr(*on);

            // Post XML SOAP request.
            rc1 = http_url_post_xml(
                 'https:
   //www.myshawtracking.ca:443/otsWebWS/services/OTSWebSvcs'
                : %addr(soapRequest) + 2
                : %len(soapRequest)
                : *NULL
                : %paddr(incoming)
                : %addr(userData)
                : HTTP_TIMEOUT
                : HTTP_USERAGENT
                : 'text/xml'
                : 'http://www.qualcomm.com/dequeue2');

            // Change the XML parser so that no longer just returns
   pointers.
            http_XmlReturnPtr(*off);

            // Turn off the debugger.
            http_debug(*off);

            // When we receive a valid response rc1 = 1.
            if rc1 = 1;

               // Only continue process if data was returned (transCount >
   0).
               if transCount > 0;

                  // Parse the decoded XML eturned from SHAW.
                  exsr parseDecodedXML;

            // If an error occurs while consuming the Web Service then
   send
            // a message to OPS support.
            else;
               scMsg      = http_error(peErrorNo);
               sndSubject = 'Error retrieving performace data from SHAW.
   #1';
               sndMessage = 'SHAW Web Service dequeue2 returned an error'
   +
                            ' &N ' +
                            'Run date . . . :' +
                            %trim(%char(%date())) +
                            ' &N ' +
                            'Run time . . . :' +
                            %trim(%char(%time())) +
                            ' &N ' +
                            'transCount . . :' +
                            %trim(%char(transCount)) +
                            ' &N ' +
                            'transIdOut . . :' +
                            %trim(%char(transIdOut)) +
                            ' &N ' +
                            'Error returned :' +
                            %trim(errorMessage) +
                            ' &N ' +
                            'http_error() . :' +
                            %trim(scMsg) +
                            ' &N ' +
                            'peErrorNo. . . :' +
                            %trim(%char(peErrorNo)) +
                            ' &N ' +
                            'Please Investigate!' +
                            ' &N ' +
                            'Program name = DSRPERFMON' +
                            ' &N ' +
                            'See log
   /PerformanceMonitoring/responseLog.txt';
               exsr eMailErrorMessage;
            endif;

            // The End.
            *inlr = *on;
            return;


   //---------------------------------------------------------------------
   --*
         // Parse the decoded XML.      *

   //---------------------------------------------------------------------
   --*

            begsr parseDecodedXML;

               // Initialize all data fields in file DSPPERFMON.
               clear allPerfDataDS;

               // Turn on the dubugger before parsing the embedded XML.

               parserLog = '/PerformanceMonitoring/parserLog.txt';
               http_debug(*on : parserLog);

               // Parse the XML repsponse embedded in the "transactions"
   element.
               rc2 = http_parse_xml_string(%addr(decodedData: *DATA)
                                         : %len(decodedData)
                                         : 819
                                         : *NULL
                                         : %paddr(embedded)
                                         : *NULL);

               // turn off the debugger.
               http_debug(*off);

               // If the parsing was not successful send an error to Ops
   support.
               if rc2 <> 0;
                  scMsg      = http_error(peErrorNo);
                  sndSubject = 'Error parsing performace data from SHAW.
   #2';
                  sndMessage = 'SHAW Web Service dequeue2 parsing error' +

                               ' &N ' +
                               'Run date . . . :' +
                               %trim(%char(%date())) +
                               ' &N ' +
                               'Run time . . . :' +
                               %trim(%char(%time())) +
                               ' &N ' +
                               'transCount . . :' +
                               %trim(%char(transCount)) +
                               ' &N ' +
                               'transIdOut . . :' +
                               %trim(%char(transIdOut)) +
                               ' &N ' +
                               'Error returned :' +
                               %trim(errorMessage) +
                               ' &N ' +
                               'http_error() . :' +
                               %trim(scMsg) +
                               ' &N ' +
                               'peErrorNo. . . :' +
                               %trim(%char(peErrorNo)) +
                               ' &N ' +
                               'Please Investigate!' +
                               ' &N ' +
                               'Program name = DSRPERFMON' +
                               ' &N ' +
                               'See log
   /PerformanceMonitoring/parserLog.txt';
                  exsr eMailErrorMessage;

               // Output the last transaction ID to the data area. The
   next
   time
               // we run this process we will start at this transaction
   number.
               else;
                  ##PERFMON = transIdOut + 1;
                  out ##PERFMON;
               endif;

            endsr;


   //---------------------------------------------------------------------
   --*
         // Assemble SOAP header XML request. Username and password have
   been     *
         // hard coded as they are not expected to change.      *

   //---------------------------------------------------------------------
   --*

            begsr assembleSOAPheader;

            soapHeader =
            '<?xml version="1.0" encoding="utf-8"?>'
            +' <soap:Envelope'
            +' xmlns:soap="[1]http://schemas.xmlsoap.org/soap/envelope/";'

            +'
   xmlns:wsa="[2]http://schemas.xmlsoap.org/ws/2004/03/addressing";'
            +' xmlns:wsse="http:
   //docs.oasis-open.org/wss/2004/01/oasis-200401-'
                         +'wss-wssecurity-secext-1.0.xsd"'
            +' xmlns:wsu="http:
   //docs.oasis-open.org/wss/2004/01/oasis-200401-'
                        +'wss-wssecurity-utility-1.0.xsd"'
            +' xmlns:xsd="[3]http://www.w3.org/2001/XMLSchema";'
            +' xmlns:xsi="[4]http://www.w3.org/2001/XMLSchema-instance";>'

            +'<soap:Header>'
            +'<wsse:Security soap:mustUnderstand="1" >'
            +'<wsse:UsernameToken>'
            +'<wsse:Username>******@*******</wsse:Username>'
            +'<wsse:Password
   Type="[5]http://docs.oasis-open.org/wss/2004/01/'
          +'oasis-200401-wss-username-token-profile-1.0#'

   +'PasswordText">*********</wsse:Password>'
            +'</wsse:UsernameToken>'
            +'</wsse:Security>'
            +'</soap:Header>';

            endsr;


   //---------------------------------------------------------------------
   --*
         // Assemble SOAP body XML request. Subscriber ID has been hard
   coded as  *
         // is not expected to change.      *

   //---------------------------------------------------------------------
   --*

            begsr assembleSOAPbody;

            subscriberId    = '*';
            in *lock ##PERFMON;
            transIdIn = %trim(%char(##PERFMON));

               soapBody =
                '<soap:Body>'
                  +'<dequeue2>'
                     +'<subscriberId>'
                        + subscriberId
                     +'</subscriberId>'
                     +'<transactionIdIn>'
                        + transIdIn
                     +'</transactionIdIn>'
                  +'</dequeue2>'
               +'</soap:Body>'
            +'</soap:Envelope>';

            endsr;


   //---------------------------------------------------------------------
   --*
         // eMail error message.      *

   //---------------------------------------------------------------------
   --*

            begsr eMailErrorMessage;

               UTRMEMAIL_sendSimpleToGroup(sndGroup
                                         : sndSubject
                                         : sndMessage);

            endsr;

        /end-free
        *

   *----------------------------------------------------------------------
   --*
        * incoming - Parse XML response from SHAW.     *

   *----------------------------------------------------------------------
   --*
        *
       P incoming...
       P                 B
        *
       D incoming...
       D                 PI
       D   userData...
       D                                8F
       D   nestingDepth...
       D                               10I 0 value
       D   elementName...
       D                             1024A   varying const
       D   elementPath...
       D                            24576A   varying const
       D   elementValue...
       D                                     likeds(XmlString_t)
       D   attributes...
       D                                 *   dim(32767)
       D                                     const options(*varsize)

        *
        /free

            // The number of transcations returbed on this run.
            if elementName = 'count';
               p_var = elementValue.data;
               transCount = %dec(%subst(var:1:elementValue.len):5:0);


            // The data in the 'transactions' element
            // is a base64 encoded XML document.
            elseif elementName = 'transactions';
               %len(decodedData) = %len(decodedData : *MAX);
               decodedLength = base64_decode( elementValue.data
                                            : elementValue.len
                                            : %addr(decodedData : *data)

                                            : %len(decodedData : *MAX) );

               %len(decodedData) = decodedLength;

            // The last transaction ID that was returned.
            elseif elementName = 'transactionIdOut';
               p_var = elementValue.data;
               transIdOut = %dec(%subst(var:1:elementValue.len):17:0);


            elseif elementName = 'soap:Text';
               p_var = elementValue.data;
               errorMessage = %subst(var:1:elementValue.len);
            endif;

        /end-free
        *
       P incoming        E
        *

   *----------------------------------------------------------------------
   --*
        * embedded - Parse the embedded XML and write to our database.
   *

   *----------------------------------------------------------------------
   --*
        *
       P embedded...
       P                 B
        *
       D embedded...
       D                 PI
       D   userData...
       D                                 *   value
       D   nestingDepth...
       D                               10I 0 value
       D   elementName...
       D                             1024A   varying const
       D   elementPath...
       D                            24576A   varying const
       D   elementValue...
       D                            65535A   varying const
       D   attributes...
       D                                 *   dim(32767)
       D                                     const options(*varsize)

        *
        * Local variables:
       D attributeCount...
       D                 S             10I 0
       D attributeName...
       D                 S           1024A   varying
       D attributeValue...
       D                 S          65535A   varying
        *
        * General work fields.
       D mobileType...
       D                 S              2A   inz(*blanks)
       D posType...
       D                 S              1A   inz(*blanks)
       D ignitionStatus...
       D                 S              1A   inz(*blanks)
       D tripStatus...
       D                 S              1A   inz(*blanks)
       D faultFlag...
       D                 S              1A   inz(*blanks)
       D registeredDriver...
       D                 S              1A   inz(*blanks)
        *
        * Work fields used to covert GMT (Greenwich Mean Time) to
        * EST (Eastern Standard Time).
        D gmtDateTime...
       D                 S             20A   inz(*blanks)
       D isoAlphaDateTime...
       D                 S             26A   inz(*blanks)
       D timeStamp...
       D                 S               Z
   inz(Z'0001-01-01-00.00.00.000000')
       D isoDate...
       D                 S               D   inz(*loval)
       D isoTime...
       D                 S               T   inz(*loval)
        *
        * Work fields for a Proximity location:
       D  proxCity...
       D                 S             10A   inz(*blanks)
       D  proxDist...
       D                 S              7A   inz(*blanks)
       D  proxDir...
       D                 S              3A   inz(*blanks)
       D  proxPlac...
       D                 S             10A   inz(*blanks)
       D  proxPlTp...
       D                 S              4A   inz(*blanks)
       D  proxStPr...
       D                 S              2A   inz(*blanks)
       D  proxPost...
       D                 S              6A   inz(*blanks)
       D  proxCoun...
       D                 S              2A   inz(*blanks)
        *
        /free

            // Transaction ID - Container for a single transaction (aka:
   event)
            // of any type.
            select;
            when elementName = 'tran';
                 attributeCount = 1;
                 dow http_nextXmlAttr(attributes
                                    : attributeCount
                                    : attributeName
                                    : attributeValue);
                     if attributeName = 'ID';
                          allPerfDataDS.pmTransID# =
   %trim(attributeValue);
                     endif;
                 enddo;

                 // Write a new record for each T.4.01.0 or
                 // T.3.02.0 transaction received.
                 if allPerfDataDS.pmTranType = 'T.4.01.0' or
                    allPerfDataDS.pmTranType = 'T.3.02.0';
                    DSRMPERFUP_writeAllPerformanceData(
                               allPerfDataDS :
                               errorInfo);
                 endif;

                 // Clear fields used to write DSPPERFMON records.
                 clear allPerfDataDS;

                 // Clear general work fields.
                 mobileType       = *blanks;
                 posType          = *blanks;
                 ignitionStatus   = *blanks;
                 tripStatus       = *blanks;
                 faultFlag        = *blanks;
                 registeredDriver = *blanks;

            // T.4.01.0 - PM Performance Data Transaction Type.
            // T.3.02.0 - Critical Event Reporting (CER) Data Transaction
   Type.
            when elementName = 'T.4.01.0';
                 allPerfDataDS.pmTranType = 'T.4.01.0';
            when elementName = 'T.3.02.0';
                 allPerfDataDS.pmTranType = 'T.3.02.0';

            // Date and Time when the event took place.
            when elementName = 'eventTS';
                 gmtDateTime = *blanks;
                 gmtDateTime = %trim(elementValue);
                 exsr convertGMTtoEST;
                 allPerfDataDS.pmEvntDate = isoDate;
                 allPerfDataDS.pmEvntTime = isoTime;

            // Uniquely define a piece of equipment (truck).
            when elementName = 'equipment';
                 attributeCount = 1;
                 dow http_nextXmlAttr(attributes
                                    : attributeCount
                                    : attributeName
                                    : attributeValue);

                     // Unique customer-defined equipment identifier.

                     // In our system this is our truck number.
                     select;
                     when attributeName = 'ID';
                          allPerfDataDS.pmEqpID = %trim(attributeValue);


                     // Unique manufacture-assigned address of the
                     // equipment's mobile communication unit.
                     when attributeName = 'unitAddress';
                          allPerfDataDS.pmEqpAddr = %trim(attributeValue);


                     // Indicates the type of equipment, "trailer" or
   "tractor".
                     when attributeName = 'equipType';
                          allPerfDataDS.pmEqpType = %trim(attributeValue);


                     // Indicates the type of mobile communication device.

                     when attributeName = 'mobileType';
                          mobileType = %trim(attributeValue);
                          select;
                          when mobileType = '0 ';
                               allPerfDataDS.pmEqpMobTp = 'Unknown ';

                          when mobileType = '1 ';
                               allPerfDataDS.pmEqpMobTp = 'MCT     ';

                          when mobileType = '2 ';
                               allPerfDataDS.pmEqpMobTp = 'TMCT    ';

                          when mobileType = '3 ';
                               allPerfDataDS.pmEqpMobTp = 'OmniOne ';

                          when mobileType = '4 ';
                               allPerfDataDS.pmEqpMobTp = 'MCP     ';

                          when mobileType = '5 ';
                               allPerfDataDS.pmEqpMobTp = 'MCP100  ';

                          when mobileType = '6 ';
                               allPerfDataDS.pmEqpMobTp = 'MCP110  ';

                          when mobileType = '7 ';
                               allPerfDataDS.pmEqpMobTp = 'MCP200  ';

                          when mobileType = '8 ';
                               allPerfDataDS.pmEqpMobTp = 'MCP50   ';

                          when mobileType = '10';
                               allPerfDataDS.pmEqpMobTp = 'UTT     ';

                          when mobileType = '11';
                               allPerfDataDS.pmEqpMobTp = 'Tethered';

                          when mobileType = '12';
                               allPerfDataDS.pmEqpMobTp = 'Stingray';

                          endsl;

                     // On-board device identifier.
                     when attributeName = 'deviceID';
                          allPerfDataDS.pmEqpDevID =
   %trim(attributeValue);
                     endsl;
                 enddo;

            // Driver I.D.
            when elementName = 'driverID';
                 allPerfDataDS.pmDriverID = %trim(elementValue);

            // Geographical coordinates at a point in time.
            when elementName = 'position';
                 attributeCount = 1;
                 dow http_nextXmlAttr(attributes
                                    : attributeCount
                                    : attributeName
                                    : attributeValue);
                     select;

                     // Longitude expressed in signed degrees with
                     // floating-point decimal precision.
                     when attributeName = 'lon';
                          allPerfDataDS.pmLongitud =
   %trim(attributeValue);

                     // Latitude expressed in signed degrees with
                     // floating-point decimal precision.
                     when attributeName = 'lat';
                          allPerfDataDS.pmLatitud = %trim(attributeValue);


                     // Position timestamp in GMT.
                     when attributeName = 'posTS';
                          gmtDateTime = *blanks;
                          gmtDateTime = %trim(attributeValue);
                          exsr convertGMTtoEST;
                          allPerfDataDS.pmPosnDate = isoDate;
                          allPerfDataDS.pmPosnTime = isoTime;
                     endsl;
                 enddo;

            // Identifies the hardware that was used to determine the
   position
            // information contained in the tranaction.
            when elementName = 'posType';
                 posType = %trim(elementValue);
                 select;
                 when posType = '0';
                      allPerfDataDS.pmPosnType = 'Unknown';
                 when posType = '1';
                      allPerfDataDS.pmPosnType = 'LORAN  ';
                 when posType = '2';
                      allPerfDataDS.pmPosnType = 'QASPR  ';
                 when posType = '3';
                      allPerfDataDS.pmPosnType = 'GPS    ';
                 endsl;

            // Ignition Status of the truck. "On" or "Off".
            when elementName = 'ignitionStatus';
                 ignitionStatus = %trim(elementValue);
                 select;
                 when ignitionStatus = '1';
                 allPerfDataDS.pmIgnStat = 'On ';
                 when ignitionStatus = '2';
                 allPerfDataDS.pmIgnStat = 'Off';
                 endsl;

            // The Trip status of the truck. "In" or "Out" of Trip. Note:

            // The trip status feature requires that SensorTRACS service

            // to be enabled. and configured.
            when elementName = 'tripStatus';
                 tripStatus = %trim(elementValue);
                 select;
                 when tripStatus = 'I';
                 allPerfDataDS.pmTripStat = 'In ';
                 when tripStatus = 'O';
                 allPerfDataDS.pmTripStat = 'Out';
                 endsl;

            // Date and time recording started for this Driver.
            // (Since last extraction reset).
            when elementName = 'dataStartTS';
                 gmtDateTime = *blanks;
                 gmtDateTime = %trim(elementValue);
                 exsr convertGMTtoEST;
                 allPerfDataDS.pmStrtDate = isoDate;
                 allPerfDataDS.pmStrtTime = isoTime;

            // Date and time that recording ended for this Driver.
            // (Time of this extraction reset).
            when elementName = 'dataEndTS';
                 gmtDateTime = *blanks;
                 gmtDateTime = %trim(elementValue);
                 exsr convertGMTtoEST;
                 allPerfDataDS.pmEndDate = isoDate;
                 allPerfDataDS.pmEndTime = isoTime;

            // Distance travelled in miles or kilometers.
            when elementName = 'distance';
                 allPerfDataDS.pmDistance = %trim(elementValue);

            // The number of minutes recorded for this Driver while
   ignition
   was
            // on but excluding intertrip idle time (includes idle time
   during
            // trip but not between trips).
            when elementName = 'driveTime';
                 allPerfDataDS.pmDrivTime = %trim(elementValue);

            // The number of minutes recorded for this Driver while the
   ignition
            // was on.
            when elementName = 'engineTime';
                 allPerfDataDS.pmEngTime = %trim(elementValue);

            // The number of minutes when the vehicle speed was greater
   than
   zero.
            when elementName = 'moveTime';
                 allPerfDataDS.pmMoveTime = %trim(elementValue);

            // The number of minutes idling between trips (excess idle
   time
   for
            // this Driver).
            when elementName = 'intertripIdleTime';
                 allPerfDataDS.pmIntIdle   = %trim(elementValue);

            // The number of minutes idling when the duration of the
   idling
   period
            // was longer than the end of trip (EOT) threshold, but
   shorter
   than
            // the short idle threshold. Note MCT firmware version 14.02
   or
   higher
            // is required.
            when elementName = 'shortIdleTime';
                 allPerfDataDS.pmShrtIdle  = %trim(elementValue);

            // The number of minutes the Driver has exceeded the settable
   RPM
            // threshold.
            when elementName = 'overRPMTime';
                 allPerfDataDS.pmOverRPMT  = %trim(elementValue);

            // The number of times the settable RPM threshold was exceeded
   in
            // one minute.
            when elementName = 'overRPMCount';
                 allPerfDataDS.pmOverRPMC  = %trim(elementValue);

            // The longest duration exceeding the settable RPM threshold
   (rounded
            // up to the next minute).
            when elementName = 'overRPMMax';
                 allPerfDataDS.pmOverRPMM  = %trim(elementValue);

            // The number of minutes the Driver exceeded the settable
   speed
            // threshold.
            when elementName = 'overSpdTime';
                 allPerfDataDS.pmOverSpdT = %trim(elementValue);

            // The number of times the settable speed threshold exceeded 1
   min.
            when elementName = 'overSpdCount';
                 allPerfDataDS.pmOverSpdC  = %trim(elementValue);

            // The longest duration exceeded the settable speed threshold
   (rounded
            // up to the next minute).
            when elementName = 'overSpdMax';
                 allPerfDataDS.pmOverSpdM  = %trim(elementValue);

            // The number of minutes the driver has exceeded the settable

            // excessive speed threshold. Note: MCT firmware version >
   10.51
            // required.
            when elementName = 'excessSpdTime';
                 allPerfDataDS.pmExceSpdT  = %trim(elementValue);

            // The total amount of fuel burned by this Driver in gallons,
   liters,
            // or imperial gallons based on the customer's preference.
   Note:
   MCT
            // firmware version above 10.51 is required.
            when elementName = 'totalFuelUsed';
                 allPerfDataDS.pmTotlFuel = %trim(elementValue);

            // The total amount of fuel burned by this Driver while the
   vehicle
            // was not moving and a PTO was not active. Units are in
   gallons,
            // liters, or imperial gallons based on the company's
   preference.
            // Note MCT firmware version above 10.51 is required.
            when elementName = 'idleFuelUsed';
                 allPerfDataDS.pmIdleFuel = %trim(elementValue);

            // The total amount of fuel burned by this Driver while the
   parking
            // brake was applied. Units are in gallons, liters, or
   imperial
            // gallons based on the company's preference. Note: MCT
   firmware
            // version above 10.51 is required.
            when elementName = 'parkIdleFuelUsed';
                 allPerfDataDS.pmParkIdle  = %trim(elementValue);

            // Indicates whether or not any fault conditions were present.

            when elementName = 'faultFlag';
                 faultFlag = %trim(elementValue);
                 select;
                 when faultFlag = '0';
                      allPerfDataDS.pmFaultFlg = 'No Faults      ';
                 when faultFlag = '1';
                      allPerfDataDS.pmFaultFlg = 'Faults detected';
                 endsl;

            // Indicates whether or not the Driver is registered.
            when elementName = 'registeredDriver';
                 registeredDriver = %trim(elementValue);
                 select;
                 when registeredDriver = '0';
                      allPerfDataDS.pmRegiDriv = 'Unregistered';
                 when registeredDriver = '1';
                      allPerfDataDS.pmRegiDriv = 'Registered  ';
                 endsl;

            // The number of minutes cruise control was active and a speed
   was
            // set.
            when elementName = 'cruiseCtrlTime';
                 allPerfDataDS.pmCruiseCt = %trim(elementValue);

            // The number of minutes vehicle was in top gear.
            when elementName = 'topGearTime';
                 allPerfDataDS.pmTopGear = %trim(elementValue);

            // The method or source used to acquire gear data for
   determining time
            // in top gear. Possible values are: "Vehicle data bus (J1939)
   is the
            // sole source", "Hybrid combination of data bus and onboard

            // algorithmic sources", or "Onboard algorithm is the sole
   source".
            when elementName = 'gearDataSource';
                 allPerfDataDS.pmGearData = %trim(elementValue);

            // Either "MPH" or "KPH".
            when elementName = 'spdRpmTimes';
                 attributeCount = 1;
                 dow http_nextXmlAttr(attributes
                                    : attributeCount
                                    : attributeName
                                    : attributeValue);
                     select;
                     when attributeName = 'spdUnits';
                          allPerfDataDS.pmSpeedUOM =
   %trim(attributeValue);
                     endsl;
                 enddo;

            // Proximity - Location information expressed as a reference
   to
   a
            // nearby place.
            when elementName = 'proximity';
                 attributeCount = 1;
                 dow http_nextXmlAttr(attributes
                                    : attributeCount
                                    : attributeName
                                    : attributeValue);

                     select;

                     // Proximity City name.
                     when attributeName = 'city';
                          proxCity = %trim(attributeValue);

                     // The distance to the (proximity) place in miles or
   kms.
                     when attributeName = 'distance';
                          proxDist = %trim(attributeValue);

                     // Direction to the (proximity) place using a compass
   notation
                     // notation containing a maximum of 3 characters.

                     // (e.g. N, SE, NNW).
                     when attributeName = 'direction';
                          proxDir = %trim(attributeValue);

                     // The unique customer-defined name of the
   (proximity)
   place, if
                     // the place type is not CITY or TOWN.
                     when attributeName = 'placeName';
                          proxPlac = %trim(attributeValue);

                     // Proximity Place Type such as CITY or TOWN.
                     when attributeName = 'placeType';
                          proxPlTp = %trim(attributeValue);

                     // Proximity State or Province code.
                     when attributeName = 'stateProv';
                          proxStPr = %trim(attributeValue);

                     // Proximity Postal code - 12 character maximum.

                     when attributeName = 'postal';
                          proxPost = %trim(attributeValue);

                     // Proximity Country code, possible values are US,
   CA,
   MX.
                     when attributeName = 'country';
                          proxCoun = %trim(attributeValue);
                     endsl;
                 enddo;

                 // If this is a TOWN then populate the Proximity Town
   fields.
                 if proxPlTp = 'TOWN';
                    allPerfDataDS.pmPrxTCity = proxCity;
                    allPerfDataDS.pmPrxTDist = proxDist;
                    allPerfDataDS.pmPrxTDir  = proxDir;
                    allPerfDataDS.pmPrxTPlac = proxPlac;
                    allPerfDataDS.pmPrxTPlTp = proxPlTp;
                    allPerfDataDS.pmPrxTStPr = proxStPr;
                    allPerfDataDS.pmPrxTPost = proxPost;
                    allPerfDataDS.pmPrxTCoun = proxCoun;

                 // If this is a CITY then populate the Proximity City
   fields.
                 elseif proxPlTp = 'CITY';
                    allPerfDataDS.pmPrxCCity = proxCity;
                    allPerfDataDS.pmPrxCDist = proxDist;
                    allPerfDataDS.pmPrxCDir  = proxDir;
                    allPerfDataDS.pmPrxCPlac = proxPlac;
                    allPerfDataDS.pmPrxCPlTp = proxPlTp;
                    allPerfDataDS.pmPrxCStPr = proxStPr;
                    allPerfDataDS.pmPrxCPost = proxPost;
                    allPerfDataDS.pmPrxCCoun = proxCoun;
                 endif;

                 // Reset the proximity work fields.
                 proxCity = *blanks;
                 proxDist = *blanks;
                 proxDir  = *blanks;
                 proxPlac = *blanks;
                 proxPlTp = *blanks;
                 proxStPr = *blanks;
                 proxPost = *blanks;
                 proxCoun = *blanks;

            // T.3.02.0 - Critical Event Reporting (CER)

            // A unique identifier for this incident.
            when elementName = 'eventKey';
                 allPerfDataDS.pmCerEvtKy = %trim(elementValue);

            // Date and Time that this event was sent in.
            when elementName = 'sentTS';
                 gmtDateTime = *blanks;
                 gmtDateTime = %trim(elementValue);
                 exsr convertGMTtoEST;
                 allPerfDataDS.pmCerSntDt = isoDate;
                 allPerfDataDS.pmCerSntTm = isoTime;

            // The event that triggered this incident.
            when elementName = 'eventTrigger';
                 allPerfDataDS.pmCerEvent = %trim(elementValue);

            // Trigger specific data for the incident.
            when elementName = 'triggerData';
                 allPerfDataDS.pmCerTrgDa = %trim(elementValue);

            // Purpose of this is similar to the Event Trigger element.
   But,
            // this will be used specifically for EVIMS with value EVIMS.

            when elementName = 'eventType';
                 allPerfDataDS.pmCerEvtTp = %trim(elementValue);

            // Speed.
            when elementName = 'speed';
                 allPerfDataDS.pmCerSpeed = %trim(elementValue);

            // Parking Brake Status.
            when elementName = 'parkBrakeStatus';
                 allPerfDataDS.pmCerParBk = %trim(elementValue);

            // Message location, date and time.
            when elementName = 'messageLocation';
                 allPerfDataDS.pmCerMLon  = allPerfDataDS.pmLongitud;

                 allPerfDataDS.pmCerMLat  = allPerfDataDS.pmLatitud;
                 allPerfDataDS.pmCerMDate = allPerfDataDS.pmPosnDate;

                 allPerfDataDS.pmCerMTime = allPerfDataDS.pmPosnTime;

                 allPerfDataDS.pmLongitud = *blanks;
                 allPerfDataDS.pmLatitud  = *blanks;
                 allPerfDataDS.pmPosnDate = *loval;
                 allPerfDataDS.pmPosnTime = *loval;

                 // Proximity to the nearest town.
                 allPerfDataDS.pmCerTDist = allPerfDataDS.pmPrxTDist;

                 allPerfDataDS.pmCerTDir  = allPerfDataDS.pmPrxTDir;
                 allPerfDataDS.pmCerTPlac = allPerfDataDS.pmPrxTPlac;

                 allPerfDataDS.pmCerTPlTp = allPerfDataDS.pmPrxTPlTp;

                 allPerfDataDS.pmCerTCity = allPerfDataDS.pmPrxTCity;

                 allPerfDataDS.pmCerTStPr = allPerfDataDS.pmPrxTStPr;

                 allPerfDataDS.pmCerTPost = allPerfDataDS.pmPrxTPost;

                 allPerfDataDS.pmCerTCoun = allPerfDataDS.pmPrxTCoun;

                 allPerfDataDS.pmPrxTDist = *blanks;
                 allPerfDataDS.pmPrxTDir  = *blanks;
                 allPerfDataDS.pmPrxTPlac = *blanks;
                 allPerfDataDS.pmPrxTPlTp = *blanks;
                 allPerfDataDS.pmPrxTCity = *blanks;
                 allPerfDataDS.pmPrxTStPr = *blanks;
                 allPerfDataDS.pmPrxTPost = *blanks;
                 allPerfDataDS.pmPrxTCoun = *blanks;

                 // Proximity to the nearest city.
                 allPerfDataDS.pmCerCDist = allPerfDataDS.pmPrxCDist;

                 allPerfDataDS.pmCerCDir  = allPerfDataDS.pmPrxCDir;
                 allPerfDataDS.pmCerCPlac = allPerfDataDS.pmPrxCPlac;

                 allPerfDataDS.pmCerCPlTp = allPerfDataDS.pmPrxCPlTp;

                 allPerfDataDS.pmCerCCity = allPerfDataDS.pmPrxCCity;

                 allPerfDataDS.pmCerCStPr = allPerfDataDS.pmPrxCStPr;

                 allPerfDataDS.pmCerCPost = allPerfDataDS.pmPrxCPost;

                 allPerfDataDS.pmCerCCoun = allPerfDataDS.pmPrxCCoun;

                 allPerfDataDS.pmPrxCDist = *blanks;
                 allPerfDataDS.pmPrxCDir  = *blanks;
                 allPerfDataDS.pmPrxCPlac = *blanks;
                 allPerfDataDS.pmPrxCPlTp = *blanks;
                 allPerfDataDS.pmPrxCCity = *blanks;
                 allPerfDataDS.pmPrxCStPr = *blanks;
                 allPerfDataDS.pmPrxCPost = *blanks;
                 allPerfDataDS.pmPrxCCoun = *blanks;

            // Message location, date and time.
            when elementName = 'incidentLocation';
                 allPerfDataDS.pmCerILon  = allPerfDataDS.pmLongitud;

                 allPerfDataDS.pmCerILat  = allPerfDataDS.pmLatitud;
                 allPerfDataDS.pmCerIDate = allPerfDataDS.pmPosnDate;

                 allPerfDataDS.pmCerITime = allPerfDataDS.pmPosnTime;

                 allPerfDataDS.pmLongitud = *blanks;
                 allPerfDataDS.pmLatitud  = *blanks;
                 allPerfDataDS.pmPosnDate = *loval;
                 allPerfDataDS.pmPosnTime = *loval;

            // CER URL.
            when elementName = 'eventUrl';
                 allPerfDataDS.pmCerUrl = %trim(elementValue);

            endsl;


   //---------------------------------------------------------------------
   --*

         // Convert a GMT Date/Time Stamp to EST in ISO format.      *

   //---------------------------------------------------------------------
   --*

            begsr convertGMTtoEST;

               isoDate = *loval;
               isoTime = *loval;
               isoAlphaDateTime = *blanks;
               timeStamp        = *loval;
               isoAlphaDateTime = %subst(gmtDateTime:1:4) +
                                  '-' +
                                  %subst(gmtDateTime:6:2) +
                                  '-' +
                                  %subst(gmtDateTime:9:2) +
                                  '-' +
                                  %subst(gmtDateTime:12:2) +
                                  '.' +
                                  %subst(gmtDateTime:15:2) +
                                    '.' +
                                  %subst(gmtDateTime:18:2) +
                                  '.' +
                                  '000000';
               test(ZE) *ISO isoAlphaDateTime;
               if not %error;
                  timeStamp = %timestamp(isoAlphaDateTime:*ISO)
                                         - %hours(5);  // Convert GMT to
   EST.
                  isoDate = %date(%subst(%char(timeStamp):1:10));
                  isoTime = %time(%subst(%char(timeStamp):12:8));
               endif;

            endsr;

        /end-free
        *
       P embedded...
       P                 E
        *
   ___________________________________________________________
   Paul Reid
   Application Developer III
   From:   corby.weaver@xxxxxxxxxxxxxxxxx
   To:     HTTPAPI and FTPAPI Projects <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>
   Date:   12/14/2015 10:54 AM
   Subject:        RE: New to XML - Dequeue2 Request Issue
   Sent by:        ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     OK, I'm still struggling with the base64_decode portion of this.
   I've
     searched thru the forum and I'm not finding what I think I need.  I
     could be wrong.  Where in my process will a do the call to
     base64_decode and what is the correct code to add?
     Thanks again!
     Corby Weaver
     From:        Mike Krebs <mkrebs@xxxxxxxxxxxxxxxxxx>
     To:        HTTPAPI and FTPAPI Projects
   <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>,
     Date:        12/11/2015 12:28 PM
     Subject:        RE: New to XML - Dequeue2 Request Issue
     Sent by:        ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
       __________________________________________________________________
     Upon further review, I see you don't understand what happens here:
         if (http_parse_xml_stmf( soapfile
                              : HTTP_XML_CALC
                              : *null
                              : %paddr(SaveEmbed)
                              : %addr(embfile) ) < 0);
     The Expat parser and Scott's port of it handle the incoming XML as a
     stream of elements. There are various ways to parse the XML. The API
   as
     called above will call SaveEmbed each time it gets to the end of an
     element. That is on a </whatever>. By looking at your incoming data,
     transactions is the inner most element we are interested in. So, my
     code checks if name matches transactions. It is called a bunch of
   other
     times (every time there is a </whatever>) but every other time it
   does
     not do anything other than return.
     So your SaveEmbed was working but the last element didn't have a
     "value" with it. So, your code created the file with just the header.
     You want just the base64 encoded data in the file. Then you can
   decode
     the file and parse that for the actual data.
     -----Original Message-----
     From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     [[1][6]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of
   Mike
     Krebs
     Sent: Friday, December 11, 2015 11:47 AM
     To: HTTPAPI and FTPAPI Projects
     Subject: RE: New to XML - Dequeue2 Request Issue
     You didn't make it convenient by including extra data in your post.
     Many of us don't just read code, we try to code the problem
   ourselves!
     I managed to recreate the SOAPfile data and was able to parse using
     your saveembed with minor tweak to create the embfile.
     I saved the SOAPfile data to a file called /home/mikekr/corby.xml and
     changed the "data" portion to
   <transactions>base64stuff</transactions>
     Here is my complete program that parses corby.xml and creates embfile
     with what you need. Change the file names appropriately and see if
   you
     have the base64 encoded data in /tmp/OmniTracsFuleFin.soap after you
     run it.
     h bnddir('HTTPAPI')
     /copy httpapi_h
     /copy ifsio_h
      dcl-s embfile  varchar(50);
      dcl-s soapfile varchar(50);
     D SaveEmbed       PR
     D   embfile                     50a   varying
     D   depth                       10I 0 value
     D   name                      1024A   varying const
     D   path                     24576A   varying const
     D   value                    32767A   varying const
     D   attrs                         *   dim(32767)
     D                                     const options(*varsize)
      http_debug(*on);
      soapfile = '/home/MIKEKR/corby.xml';
      embfile  = '/tmp/OmniTracsFuelFin.soap';
         if (http_parse_xml_stmf( soapfile
                              : HTTP_XML_CALC
                              : *null
                              : %paddr(SaveEmbed)
                              : %addr(embfile) ) < 0);
            // callp close(fd);
            // unlink(soapfile);
            // unlink(embfile);
             http_crash();
           endif;
       *inlr = *on;
       //  unlink(soapfile);
     P SaveEmbed       B
     D SaveEmbed       PI
     D   embfile                     50a   varying
     D   depth                       10I 0 value
     D   name                      1024A   varying const
     D   path                     24576A   varying const
     D   value                    32767A   varying const
     D   attrs                         *   dim(32767)
     D                                     const options(*varsize)
     D writeConst      PR            10I 0 ExtProc('write')
     D  fildes                       10i 0 value
     D  buf                       65535A   const options(*varsize)
     D  bytes                        10U 0 value
     D xmlhdr          s             80a   varying
     D fd              s             10i 0
        if name = 'transactions';
        unlink(embfile);
        fd = open(embfile:O_CREAT+O_CCSID+O_WRONLY
                  :S_IRUSR + S_IWUSR:819);
        callp close(fd);
        fd = open(embfile: O_WRONLY+O_TEXTDATA);
        writeConst(fd: value:  %len(value));
        callp close(fd);
        endif;
     P                 e
     -----Original Message-----
     From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     [[2][7]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of
   Scott
     Klement
     Sent: Friday, December 11, 2015 8:58 AM
     To: HTTPAPI and FTPAPI Projects
     Subject: Re: New to XML - Dequeue2 Request Issue
     Corby,
     I see that a few weeks ago, you acknowledged that the data being sent
     to
     you is base64-encoded..   As far as I can tell, however, you never
   call
     the base64_decode() routine to decode it...   am I missing something?
     -SK
     On 12/11/2015 8:22 AM, corby.weaver@xxxxxxxxxxxxxxxxx wrote:
     >     Here is my full code, less proprietary info.  I wouldn't
   normally
     >     include D specs, but I want to be sure all of my bases are
     covered.
     >     0012.00 H DFTACTGRP(*NO) BNDDIR('HTTPAPI':'QC2LE':'BASE64')
     >     0013.00  /define DEBUGGING
     >     0014.00
     >     0020.00  /copy httpapi_h
     >     0021.00  /copy base64_h
     >     0022.00  /copy ifsio_h
     >     0023.00
     >     0024.00 D QCMDEXC         PR                  ExtPgm('QCMDEXC')
     >     0025.00 D   command                  32702a   const
     options(*varsize)
     >     0026.00 D   len                         15p 5 const
     >     0027.00 D   igc                          3a   const
     options(*nopass)
     >     0028.00
     >     0029.00 D SOAP            s          32767A   varying
     >     0030.00 D rc              s             10I 0
     >     0031.00 D fd              s             10I 0
     >     0032.00 D soapfile        s             50a   varying
     >     0033.00 D embfile         s             50a   varying
     >     0034.00 D fuel            ds                  likeds(fuel_t)
     >     0035.00 D cmd             s            200A
     >     0036.00 D wait            s              1A
     >     0037.00
     >     0038.00 D SaveEmbed       PR
     >     0039.00 D   embfile                     50a   varying
     >     0040.00 D   depth                       10I 0 value
     >     0041.00 D   name                      1024A   varying const
     >     0042.00 D   path                     24576A   varying const
     >     0043.00 D   value                    32767A   varying const
     >     0044.00 D   attrs                         *   dim(32767)
     >     0045.00 D                                     const
     options(*varsize)
     >     0046.00
     >     0047.00 D fuel_t          ds                  qualified
     >     0048.00 D                                     based(Template)
     >     0049.00 D   vehicle                     20a   varying
     >     0050.00 D   driver                      30a   varying
     >     0051.00 D   comp                        30a   varying
     >     0052.00
     >     0053.00 D embedded        PR
     >     0054.00 D   fuel                              likeds(fuel_t)
     >     0055.00 D   depth                       10I 0 value
     >     0056.00 D   name                      1024A   varying const
     >     0057.00 D   path                     24576A   varying const
     >     0058.00 D   value                    32767A   varying const
     >     0059.00 D   attrs                         *   dim(32767)
     >     0060.00 D                                     const
     options(*varsize)
     >
     >     0061.00 D                 ds
     >
     >     0062.00 D DS_TimeStamp                    z
     >
     >     0063.00 D  ds_curdate                   10
     overlay(ds_timestamp:1)
     >
     >     0064.00 D  ds_curtime                   12
     overlay(ds_timestamp:12)
     >
     >     0065.00
     >
     >     0066.00 D                 ds
     >
     >     0067.00 D DS_TimeStampB                   z
     >
     >     0068.00 D  ds_curdateB                  10
     overlay(ds_timestampB:1)
     >
     >     0069.00 D  ds_curtimeB                  12
     overlay(ds_timestampB:12)
     >
     >     0070.00
     >
     >     0071.00 D createdate      s             10
     >
     >     0072.00 D createtime      s             12
     >
     >     0073.00 D expiredate      s             10
     >
     >     0074.00 D expiretime      s             12
     >
     >     0075.00 D reqfrmdate      s             10
     >
     >     0076.00 D reqtodate       s             10
     >
     >     0077.00 D digit1099       s              1
     >
     >     0078.00
     >
     >     0079.00 D tokentxt        s             18a   varying
     >
     >     0080.00 D token64         s             24a
     >     0081.00 D p_tokenUTF      s               *
     >     0082.00 D utflen          s             10i 0
     >     0083.00 D b64len          s             10i 0
     >     0084.00 D timoffset       s              3  0
     >     0085.00 D lasttrip        s              8
     >     0086.00
     >     0087.00 C     *entry        plist
     >     0088.00 C                   parm                    timoffset
     >     0089.00 C                   parm                    lasttrip
     >     0090.00
     >     0091.00 C                   Time
   DS_TimeStamp
     >     0092.00
     >     0093.00  /free
     >     0094.00  /if defined(DEBUGGING)
     >     0095.00    http_debug(*ON);
     >     0096.00  /endif
     >     0097.00    *inlr = *on;
     >     0098.00
     >     0099.00   DS_TimeStampB = DS_TimeStamp;
     >     0100.00
     >
     >     0101.00   // Calculate UTC Create Time And Date
     >
     >     0102.00   timoffset = timoffset * -1;
     >
     >     0103.00   DS_TimeStamp = DS_TimeStamp + %minutes(timoffset);
     >
     >     0104.00   createdate = ds_curdate;
     >
     >     0105.00   createtime = ds_curtime;
     >
     >     0106.00   %subst(createtime:3:1) = ':';
     >
     >     0107.00   %subst(createtime:6:1) = ':';
     >
     >     0108.00
     >
     >     0109.00   // Calculate UTC Expire Time And Date
     >
     >     0110.00   DS_TimeStamp = DS_TimeStamp + %minutes(5);
     >
     >     0111.00   expiredate = ds_curdate;
     >
     >     0112.00   expiretime = ds_curtime;
     >
     >     0113.00   %subst(expiretime:3:1) = ':';
     >
     >     0114.00   %subst(expiretime:6:1) = ':';
     >
     >     0115.00
     >
     >     0116.00   // Calculate UTC Requested To Date
     >
     >     0117.00   DS_TimeStampB = DS_TimeStampB - %days(1);
     >
     >     0118.00   reqtodate = ds_curdateB;
     >
     >     0119.00
     >
     >     0120.00   // Calculate UTC Requested From Date
     >     0121.00   DS_TimeStampB = DS_TimeStampB - %days(1);
     >     0122.00   reqfrmdate = ds_curdateB;
     >     0123.00
     >     0124.00   http_setCCSIDs( 1208: 0 );
     >     0125.00
     >     0126.00   tokentxt = %triml(createdate + createtime);
     >     0127.00
     >     0128.00   utflen = HTTP_xlatedyn( %len(tokentxt)
     >     0129.00                         : %addr(tokentxt) + 2
     >     0130.00                         : TO_ASCII
     >     0131.00                         : p_tokenUTF );
     >     0132.00
     >     0133.00   b64len = base64_encode( p_tokenUTF
     >     0134.00                         : utflen
     >     0135.00                         : %addr(token64)
     >     0136.00                         : %size(token64) );
     >     0137.00
     >     0138.00   dealloc p_tokenUTF;
     >     0139.00
     >     0140.00   // Note:  http_debug(*ON/*OFF) can be used to turn
     debugging
     >
     >     0141.00   //        on and off.  When debugging is turned on,
     >     diagnostic
     >     0142.00   //        info is written to an IFS file named
     >
     >     0143.00   //        /tmp/httpapi_debug.txt
     >
     >     0144.00
     >
     >     0145.00   //http_debug(*ON);
     >
     >     0146.00
     >
     >     0147.00   // Note:  http_XmlStripCRLF(*ON/*OFF) controls
   whether
     or not
     >
     >     0148.00   //        the XML parser removes CR and LF characters
     from
     >     the
     >     0149.00   //        Xml data that's passed to your 'Incoming'
     >     procedure.
     >     0150.00
     >
     >     0151.00   http_XmlStripCRLF(*ON);
     >
     >     0152.00
     >
     >     0153.00   SOAP =
     >
     >     0154.00    '<?xml version="1.0" encoding="UTF-8"
     standalone="no"?>'
     >
     >     0155.00   +'<SOAP-ENV:Envelope'
     >
     >     0156.00   +'
     >
   xmlns:SOAP-ENV="[1][3][8]http://schemas.xmlsoap.org/soap/envelope/";'
     >     0157.00   +'    xmlns:web="[2][4][9]http://websvcs.otswebws";>'
     >
     >     0158.00   +'<SOAP-ENV:Header>'
     >
     >     0159.00   +'    <wsse:Security SOAP-ENV:mustUnderstand="1"'
     >
     >     0160.00   +'
     >

   xmlns:wsse="[3][5][10]http://docs.oasis-open.org/wss/2004/01/oasis-2004
   01-'
     >     0161.00   +'wss-wssecurity-secext-1.0.xsd">'
     >
     >     0162.00   +'    <wsu:Timestamp wsu:Id="Timestamp-6"'
     >
     >     0163.00   +'
     >

   xmlns:wsu="[4][6][11]http://docs.oasis-open.org/wss/2004/01/oasis-20040
   1'
     >     0164.00   +'-wss-wssecurity-utility-1.0.xsd">'
     >
     >     0165.00   +'
     >     <wsu:Created>'+createdate+'T'+createtime+'Z</wsu:Created>'
     >     0166.00   +'
     >     <wsu:Expires>'+expiredate+'T'+expiretime+'Z</wsu:Expires>'
     >     0167.00   +'    </wsu:Timestamp>'
     >
     >     0168.00   +'    <wsse:UsernameToken wsu:Id="UsernameToken-5"
     xmlns:wsu'
     >
     >     0169.00
     +'="[5][7][12]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
     >
     >     0170.00   +'wss-wssecurity-utility-1.0.xsd">'
     >
     >     0171.00   +'    <wsse:Username>XXXXXXXXXX</wsse:Username>'
     >
     >     0172.00   +'    <wsse:Password
     Type="[6][8][13]http://docs.oasis-open.org/wss'
     >
     >     0173.00
   +'/2004/01/oasis-200401-wss-username-token-profile-1.0'
     >
     >     0174.00   +'#PasswordText">XXXXXXXXXX</wsse:Password>'
     >
     >     0175.00   +'    <wsse:Nonce
     >     EncodingType="[7][9][14]http://docs.oasis-open.org/'
     >     0176.00
   +'wss/2004/01/oasis-200401-wss-soap-message-security-'
     >
     >     0177.00
   //+'1.0#Base64Binary">Qcw0k1jjcEvvrNldT3ex1A==</wsse:'
     >
     >     0178.00   +'1.0#Base64Binary">'+token64+'</wsse:'
     >
     >     0179.00   +'Nonce>'
     >
     >     0180.00   +'
     >     <wsu:Created>'+createdate+'T'+createtime+'Z</wsu:Created>'
     >     0181.00   +'    </wsse:UsernameToken>'
     >
     >     0182.00   +'    </wsse:Security>'
     >
     >     0183.00   +'</SOAP-ENV:Header>'
     >
     >     0184.00   +'<SOAP-ENV:Body>'
     >
     >     0185.00   +'    <web:dequeue2>'
     >
     >     0186.00   +'         <subscriberId>3</subscriberId>'
     >
     >     0187.00   +'         <transactionIdIn>0</transactionIdIn>'
     >
     >     0188.00   +'    </web:dequeue2>'
     >
     >     0189.00   +'</SOAP-ENV:Body>'
     >
     >     0190.00   +'</SOAP-ENV:Envelope>';
     >
     >     0191.00
     >
     >     0192.00   http_debug(*ON);
     >
     >     0193.00
     >
     >     0194.00     soapfile = '/tmp/OmniTracsFuelRaw.soap';
     >
     >     0195.00
     >
     >     0196.00     rc = http_url_post(
     >
     >     0197.00
     >
     >     0198.00
     >
   'https://services.omnitracs.com:443/otsWebWS/services/OTSWebSvcs'
     >     0199.00                     : %addr(SOAP) + 2
     >
     >     0200.00                     : %len(SOAP)
     >     0201.00                     : soapfile
     >     0202.00                     : HTTP_TIMEOUT
     >     0203.00                     : HTTP_USERAGENT
     >     0204.00                     : 'text/xml'
     >     0205.00                     : 'ETS Test');
     >     0206.00
     >     0207.00   if (rc <> 1);
     >     0208.00      unlink(soapfile);
     >     0209.00      http_crash();
     >     0210.00   endif;
     >     0211.00
     >     0212.00   // ----------------------------------------------
     >     0213.00   //   The response from the server will be in
     >     0214.00   //   the IFS in a file with a unique name.
     >     0215.00   //   that IFS filename is in the "tempfile"
     >     0216.00   //   variable at this point.
     >     0217.00   //
     >     0218.00   //   For debugging purposes, display the
     >     0219.00   //   contents of that file, now.
     >     0220.00   // ----------------------------------------------
     >     0221.00  /if defined(DEBUGGING)
     >     0222.00      dsply ('Press <ENTER> to see SOAP response') ' '
     wait;
     >     0223.00      cmd = 'DSPF STMF(''' + soapfile + ''')';
     >     0224.00      QCMDEXC(cmd: %len(cmd));
     >     0225.00  /endif
     >     0226.00
     >     0227.00    // ----------------------------------------------
     >     0228.00    //  Parse the SOAP document (the one in soapfile)
     >     0229.00    //  Inside it will be another XML document that's
     >     0230.00    //  embedded within -- save that to a separate
     >     0231.00    //  file in the IFS.
     >     0232.00    // ----------------------------------------------
     >     0233.00
     >     0234.00      embfile = '/tmp/OmniTracsFuelFin.soap';
     >     0235.00
     >     0236.00      if (http_parse_xml_stmf( soapfile
     >     0237.00                             : HTTP_XML_CALC
     >     0238.00                             : *null
     >     0239.00                             : %paddr(SaveEmbed)
     >     0240.00                             : %addr(embfile) ) < 0);
     >     0241.00          callp close(fd);
     >     0242.00          unlink(soapfile);
     >     0243.00          unlink(embfile);
     >     0244.00          http_crash();
     >     0245.00      endif;
     >     0246.00
     >     0247.00      unlink(soapfile);
     >     0248.00
     >     0249.00    // ----------------------------------------------
     >     0250.00    //   For the sake of debugging, display the
     >     0251.00    //   contents of the embedded XML document
     >     0252.00    //   (Remove from production code)
     >     0253.00    // ----------------------------------------------
     >     0254.00
     >     0255.00  /if defined(DEBUGGING)
     >     0256.00      dsply ('Press <ENTER> to see extracted XML') ' '
     wait;
     >     0257.00      cmd = 'DSPF STMF(''' + embfile + ''')';
     >     0258.00      QCMDEXC(cmd: %len(cmd));
     >     0259.00  /endif
     >     0260.00
     >     0261.00    // ----------------------------------------------
     >     0262.00    //    Parse the second XML document (the one
     >     0263.00    //    that was embedded)
     >     0264.00    // ----------------------------------------------
     >     0265.00      fuel = *allx'00';
     >     0266.00      if (http_parse_xml_stmf( embfile
     >     0267.00                             : HTTP_XML_CALC
     >     0268.00                             : *null
     >     0269.00                             : %paddr(Embedded)
     >     0270.00                             : %addr(fuel) ) < 0);
     >     0271.00          unlink(embfile);
     >     0272.00          http_crash();
     >     0273.00      endif;
     >     0274.00
     >     0275.00
     >     0276.00   *inlr = *on;
     >     0277.00
     >     0278.00  /end-free
     >     0279.00
     >     0280.00 P SaveEmbed       B
     >     0281.00 D SaveEmbed       PI
     >     0282.00 D   embfile                     50a   varying
     >     0283.00 D   depth                       10I 0 value
     >     0284.00 D   name                      1024A   varying const
     >     0285.00 D   path                     24576A   varying const
     >     0286.00 D   value                    32767A   varying const
     >     0287.00 D   attrs                         *   dim(32767)
     >     0288.00 D                                     const
     options(*varsize)
     >     0289.00
     >     0290.00 D writeConst      PR            10I 0 ExtProc('write')
     >     0291.00 D  fildes                       10i 0 value
     >     0292.00 D  buf                       65535A   const
     options(*varsize)
     >     0293.00 D  bytes                        10U 0 value
     >     0294.00
     >     0295.00 D xmlhdr          s             80a   varying
     >     0296.00 D fd              s             10i 0
     >     0297.00
     >     0298.00  /free
     >     0299.00  //    if (name <>
   'GetABADetailsByRoutingNumberResult');
     >     0300.00  //      return;
     >     0301.00  //    endif;
     >     0302.00
     >     0303.00       // ------------------------------------------
     >     0304.00       //   create new stream file in IFS
     >     0305.00       //   tag it with CCSID 1208 (UTF-8)
     >     0306.00       // ------------------------------------------
     >     0307.00
     >     0308.00       unlink(embfile);
     >     0309.00       fd = open(embfile: O_CREAT+O_CCSID+O_WRONLY
     >     0310.00                        : S_IRUSR + S_IWUSR: 819);
     >     0311.00       callp close(fd);
     >     0312.00
     >     0313.00       // ------------------------------------------
     >     0314.00       //    Open stream file for appending data
     >     0315.00       //    and write embedded XML document to it
     >     0316.00       // ------------------------------------------
     >     0317.00
     >     0318.00       fd = open(embfile: O_WRONLY+O_TEXTDATA);
     >     0319.00
     >     0320.00       xmlhdr= '<?xml version="1.0" encoding="UTF-8"?>'
   +
     >     x'0d25';
      >     0321.00       writeConst(fd: xmlhdr: %len(xmlhdr));
     >
     >     0322.00       writeConst(fd: value:  %len(value));
     >
     >     0323.00
     >
     >     0324.00       callp close(fd);
     >
     >     0325.00  /end-free
     >
     >     0326.00 P                 E
     >
     >     0327.00
     >
     >     0328.00
     >
     >     0329.00 P embedded        B
     >
     >     0330.00 D embedded        PI
     >
     >     0331.00 D   fuel                              likeds(fuel_t)
     >
     >     0332.00 D   depth                       10I 0 value
     >
     >     0333.00 D   name                      1024A   varying const
     >
     >     0334.00 D   path                     24576A   varying const
     >
     >     0335.00 D   value                    32767A   varying const
     >
     >     0336.00 D   attrs                         *   dim(32767)
     >
     >     0337.00 D                                     const
     options(*varsize)
     >
     >     0338.00
     >
     >     0339.00  /free
     >
     >     0340.00     select;
     >     0341.00     when name = 'vehicleID';
     >     0342.00        fuel.vehicle = %trimr(value);
     >     0343.00     when name = 'driverName';
     >     0344.00        fuel.driver = %trimr(value);
     >     0345.00     when name = 'companyName';
     >     0346.00        fuel.comp = %trimr(value);
     >     0347.00     endsl;
     >     0348.00  /end-free
     >     0349.00 P                 E
     >     Here are my results as seen in step 221.00:
     >      ************Beginning of data**************
     >
     >     <soapenv:Envelope
     >
   xmlns:soapenv="[8][10][15]http://schemas.xmlsoap.org/soap/envelope/";
     >
   xmlns:soapenc="[9][11][16]http://schemas.xmlsoap.org/soap/encoding/
     >     " xmlns:xsd="[10][12][17]http://www.w3.org/2001/XMLSchema";
     >

   xmlns:xsi="[11][13][18]http://www.w3.org/2001/XMLSchema-instance";><soap
   env:
     Head
     >     er/><soapenv:Body>
     >     <p917:dequeue2Response
     >

   xmlns:p917="[12][14][19]http://websvcs.otswebws";><dequeue2Return><count
   >1</
     coun
     >     t><transactions>PD94bWwgdmVyc2lvbj0iMS4wIi
     >

   BlbmNvZGluZz0iVVRGLTgiPz48dHJhbkJsb2NrPjx0cmFuIElEPSI0ODQ5MTgiIGNvbXBhb
     >     nlJRD0iRkFSTkVSQk9DSyIgYXV4SUQ9IjA1NDYwNTk4MjQiPjxULjIuUk0wMS
     >

   4wPjxldmVudFRTPjIwMTUtMDktMjJUMjE6MzM6MDZaPC9ldmVudFRTPjxlcXVpcG1lbnQgS
     >     UQ9IkJBR1VOSVQiIGVxdWlwVHlwZT0idHJhY3RvciIgdW5pdEFkZHJlc3M9Ij
     >

   AxMDcwNTI2OTAiIG1vYmlsZVR5cGU9IjgiLz48ZHJpdmVySUQ+VFJBSU5FUjwvZHJpdmVyS
     >     UQ+PHBvc2l0aW9uIGxvbj0iLTk0LjgzNzU5MiIgbGF0PSI0Mi4wNjYwMTgiIH
     >

   Bvc1RTPSIyMDE1LTA5LTIyVDE0OjU0OjIyWiIvPjxwb3NUeXBlPjM8L3Bvc1R5cGU+PGlnb
     >     ml0aW9uU3RhdHVzPjE8L2lnbml0aW9uU3RhdHVzPjx0cmlwU3RhdHVzPk88L3
     >

   RyaXBTdGF0dXM+PEdNSD4wMDEwMTgwMzE8L0dNSD48cmVjZWl2ZWRUUz4yMDE1LTA5LTIyV
     >     DIxOjM2OjU2WjwvcmVjZWl2ZWRUUz48bXNnUHJpb3JpdHk+MDwvbXNnUHJpb3
     >

   JpdHk+PG1hY3JvQm9keT48bWFjcm9UeXBlIGRpcmVjdGlvbj0iUiIgbnVtYmVyPSIxIiB2Z
     >     XJzaW9uPSIyIj5UUlVDSyBGVUVMPC9tYWNyb1R5cGU+PG1hY3JvRmllbGQgZG
     >

   ljdFRhZz0idmVoaWNsZUlkIj5CMDE8L21hY3JvRmllbGQ+PG1hY3JvRmllbGQgZGljdFRhZ
     >     z0iZHJpdmVyTmFtZSI+QklMTFkgQk9CPC9tYWNyb0ZpZWxkPjxtYWNyb0ZpZW
     >

   xkIGRpY3RUYWc9ImNvbXBhbnlOYW1lIj5TUEFSS1lTIENBUlJPTEw8L21hY3JvRmllbGQ+P
     >     G1hY3JvRmllbGQgZGljdFRhZz0ic3RhdGUiPklBPC9tYWNyb0ZpZWxkPjxtYW
     >

   Nyb0ZpZWxkIGRpY3RUYWc9ImdhbGxvbnMiPjUwPC9tYWNyb0ZpZWxkPjxtYWNyb0ZpZWxkI
     >     GRpY3RUYWc9ImNvc3Qgb2YgZnVlbCI+MjAwLjAwPC9tYWNyb0ZpZWxkPjxtYW
     >

   Nyb0ZpZWxkIGRpY3RUYWc9IndlaWdodCI+NTAwPC9tYWNyb0ZpZWxkPjwvbWFjcm9Cb2R5P
     >     jwvVC4yLlJNMDEuMD48L3RyYW4+PC90cmFuQmxvY2s+</transactions><tr
     >

   ansactionIdOut>484918</transactionIdOut></dequeue2Return></p917:dequeue
     >     2Response></soapenv:Body></soapenv:Envelope>
     >      ************End of Data********************
     >     My results as seen in step 255.00
     >      ************Beginning of data**************
     >     <?xml version="1.0" encoding="UTF-8"?>
     >      ************End of Data********************
     >     When I move on to the next step, I get "XML parse failed at
   line
     2, col
     >     0, element not found."  What am I missing?
     >     Thanks for the feedback.
     >
     >     Corby Weaver
     >     From:        Mike Krebs <mkrebs@xxxxxxxxxxxxxxxxxx>
     >     To:        HTTPAPI and FTPAPI Projects
     <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>,
     >     Date:        12/07/2015 10:37 AM
     >     Subject:        RE: New to XML - Dequeue2 Request Issue
     >     Sent by:        ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >
     > __________________________________________________________________
     >
     >     Nothing stands out to me...you never explained how and where
   "I'm
     >     having an issue".
     >     Post debug. Make sure to scrub proprietary or confidential
     information.
     >     -----Original Message-----
     >     From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >     [[13][15][20]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On
   Behalf
     Of
     >     corby.weaver@xxxxxxxxxxxxxxxxx
     >     Sent: Wednesday, December 2, 2015 10:50 AM
     >     To: HTTPAPI and FTPAPI Projects
     >     Subject: RE: New to XML - Dequeue2 Request Issue
     >       I've got my initial file coming in fine (Step 1).  I'm having
     an
     >     issue
     >       with Step 2, parsing the "real" data.
     >       Here is my code:
     >           soapfile = '/tmp/OmniTracsFuelRaw.soap';
     >           rc = http_url_post(
     >
     >
   'https://services.omnitracs.com:443/otsWebWS/services/OTSWebSvcs'
     >                           : %addr(SOAP) + 2
     >                           : %len(SOAP)
     >                           : soapfile
     >                           : HTTP_TIMEOUT
     >                           : HTTP_USERAGENT
     >                           : 'text/xml'
     >                           : 'ETS Test');
     >         if (rc <> 1);
     >            unlink(soapfile);
     >            http_crash();
     >         endif;
     >         // ----------------------------------------------
     >         //   The response from the server will be in
     >         //   the IFS in a file with a unique name.
     >         //   that IFS filename is in the "tempfile"
     >         //   variable at this point.
     >         //
     >         //   For debugging purposes, display the
     >         //   contents of that file, now.
     >         // ----------------------------------------------
     >          // ----------------------------------------------
     >          //  Parse the SOAP document (the one in soapfile)
     >          //  Inside it will be another XML document that's
     >          //  embedded within -- save that to a separate
     >          //  file in the IFS.
     >          // ----------------------------------------------
     >            embfile = '/tmp/OmniTracsFuelFin.soap';
     >            if (http_parse_xml_stmf( soapfile
     >                                   : HTTP_XML_CALC
     >                                   : *null
     >                                   : %paddr(SaveEmbed)
     >                                   : %addr(embfile) ) < 0);
     >                callp close(fd);
     >                unlink(soapfile);
     >                unlink(embfile);
     >                http_crash();
     >            endif;
     >            unlink(soapfile);
     >       Anything stand out?  Thoughts and suggestions are
   appreciated.
     >       Thanks!
     >       Corby Weaver
     >       From:        Mike Krebs <mkrebs@xxxxxxxxxxxxxxxxxx>
     >       To:        HTTPAPI and FTPAPI Projects
     >     <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>,
     >       Date:        11/20/2015 05:09 PM
     >       Subject:        RE: New to XML - Dequeue2 Request Issue
     >       Sent by:        ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >
     __________________________________________________________________
     >       Let's break the project into steps:
     >       1. Send request and receive response
     >       2. Parse the IFS file saving the "real" data
     >       3. Decode the "real" data
     >       4. Parse the "real" data
     >       See Example17 for 1, 2, and 4. To decode see Scott's Base64
   or
     the
     >       built-in support in OS400.
     >       Alternatively, use WSDL2RPG as in the linked thread to do
   what
     you
     >       need. It is a little harder to understand initially but it
   will
     >       generate programs for you to modify for the service.
   Depending
     on the
     >       WSDL, it might do everything you need.
     >       -----Original Message-----
     >       From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >       [[1][14][16][21]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx]
   On
     Behalf Of
     >       corby.weaver@xxxxxxxxxxxxxxxxx
     >       Sent: Friday, November 20, 2015 1:05 PM
     >       To: HTTPAPI and FTPAPI Projects
     >       Subject: Re: New to XML - Dequeue2 Request Issue
     >         Sorry, it is encoded, not encrypted.  There was a similar
     post a
     >     few
     >         years ago where the transaction portion of the XML document
     was
     >       parsed
     >         and I assume the base64 decoder worked.  Being unfamiliar
     with XML,
     >     I
     >         do not know what the code should be for my specific
   program.
     >         Here is a link to the previous thread...
     >
     >

   [1][2][15][17][22]https://scottklement.com/archives/ftpapi/201210/msg00
   121.
     html
     >         I'm hoping someone is able to help me with the portion of
     code that
     >         does the parse.
     >         Thanks,
     >         Corby Weaver
     >       References
     >         1.
     >
     >

   [3][16][18][23]https://scottklement.com/archives/ftpapi/201210/msg00121
   .htm
     l
     >
     >

   -----------------------------------------------------------------------
     >       This is the FTPAPI mailing list.  To unsubscribe, please go
   to:
     >
   [4][17][19][24]http://www.scottklement.com/mailman/listinfo/ftpapi
     >
     >
     >

   ----------------------------------------------------------------------
     > -
     >
     >

   -----------------------------------------------------------------------
     >       This is the FTPAPI mailing list.  To unsubscribe, please go
   to:
     >
   [5][18][20][25]http://www.scottklement.com/mailman/listinfo/ftpapi
     >
     >

   -----------------------------------------------------------------------
     >     References
     >       1. [19][21][26]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >       2.

   [20][22][27]https://scottklement.com/archives/ftpapi/201210/msg00121.ht
   ml
     >       3.

   [21][23][28]https://scottklement.com/archives/ftpapi/201210/msg00121.ht
   ml
     >       4.
   [22][24][29]http://www.scottklement.com/mailman/listinfo/ftpapi
     >       5.
   [23][25][30]http://www.scottklement.com/mailman/listinfo/ftpapi
     >

   -----------------------------------------------------------------------
     >     This is the FTPAPI mailing list.  To unsubscribe, please go to:
     >     [24][26][31]http://www.scottklement.com/mailman/listinfo/ftpapi
     >

   -----------------------------------------------------------------------
     >

   -----------------------------------------------------------------------
     >     This is the FTPAPI mailing list.  To unsubscribe, please go to:
     >     [25][27][32]http://www.scottklement.com/mailman/listinfo/ftpapi
     >
     >

   ----------------------------------------------------------------------
     > -
     >
     > References
     >
     >     1. [28][33]http://schemas.xmlsoap.org/soap/envelope/
     >     2. [29][34]http://websvcs.otswebws/
     >     3.
   [30][35]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
     >     4. [31][36]http://docs.oasis-open.org/wss/2004/01/oasis-200401'
     >     5.
   [32][37]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
     >     6. [33][38]http://docs.oasis-open.org/wss'
     >     7. [34][39]http://docs.oasis-open.org/'
     >     8. [35][40]http://schemas.xmlsoap.org/soap/envelope/
     >     9. [36][41]http://schemas.xmlsoap.org/soap/encoding/
     >    10. [37][42]http://www.w3.org/2001/XMLSchema
     >    11. [38][43]http://www.w3.org/2001/XMLSchema-instance
     >    12. [39][44]http://websvcs.otswebws/
     >    13. [40][45]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >    14. [41][46]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >    15.
     [42][47]https://scottklement.com/archives/ftpapi/201210/msg00121.html
     >    16.
     [43][48]https://scottklement.com/archives/ftpapi/201210/msg00121.html
     >    17. [44][49]http://www.scottklement.com/mailman/listinfo/ftpapi
     >    18. [45][50]http://www.scottklement.com/mailman/listinfo/ftpapi
     >    19. [46][51]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     >    20.
     [47][52]https://scottklement.com/archives/ftpapi/201210/msg00121.html
     >    21.
     [48][53]https://scottklement.com/archives/ftpapi/201210/msg00121.html
     >    22. [49][54]http://www.scottklement.com/mailman/listinfo/ftpapi
     >    23. [50][55]http://www.scottklement.com/mailman/listinfo/ftpapi
     >    24. [51][56]http://www.scottklement.com/mailman/listinfo/ftpapi
     >    25. [52][57]http://www.scottklement.com/mailman/listinfo/ftpapi
     >

   ----------------------------------------------------------------------
     > - This is the FTPAPI mailing list.  To unsubscribe, please go to:
     > [53][58]http://www.scottklement.com/mailman/listinfo/ftpapi
     >

   ----------------------------------------------------------------------
     > -
     >
     >
     >
     > -----
     > No virus found in this message.
     > Checked by AVG - [54][59]www.avg.com
     > Version: 2015.0.6176 / Virus Database: 4483/11157 - Release Date:
     > 12/11/15

   -----------------------------------------------------------------------
     This is the FTPAPI mailing list.  To unsubscribe, please go to:
     [55][60]http://www.scottklement.com/mailman/listinfo/ftpapi

   -----------------------------------------------------------------------

   -----------------------------------------------------------------------
     This is the FTPAPI mailing list.  To unsubscribe, please go to:
     [56][61]http://www.scottklement.com/mailman/listinfo/ftpapi

   -----------------------------------------------------------------------

   -----------------------------------------------------------------------
     This is the FTPAPI mailing list.  To unsubscribe, please go to:
     [57][62]http://www.scottklement.com/mailman/listinfo/ftpapi

   -----------------------------------------------------------------------
   References
     1. [63]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     2. [64]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
     3. [65]http://schemas.xmlsoap.org/soap/envelope/
     4.
   [66]http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC
   8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtS
   gpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
     5. [67]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
     6. [68]http://docs.oasis-open.org/wss/2004/01/oasis-200401'
     7. [69]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
     8. [70]http://docs.oasis-open.org/wss'
     9. [71]http://docs.oasis-open.org/'
    10. [72]http://schemas.xmlsoap.org/soap/envelope/
    11. [73]http://schemas.xmlsoap.org/soap/encoding/
    12. [74]http://www.w3.org/2001/XMLSchema
    13. [75]http://www.w3.org/2001/XMLSchema-instance
    14.
   [76]http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC
   8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtS
   gpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
    15. [77]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
    16. [78]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
    17. [79]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    18. [80]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    19. [81]http://www.scottklement.com/mailman/listinfo/ftpapi
    20. [82]http://www.scottklement.com/mailman/listinfo/ftpapi
    21. [83]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
    22. [84]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    23. [85]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    24. [86]http://www.scottklement.com/mailman/listinfo/ftpapi
    25. [87]http://www.scottklement.com/mailman/listinfo/ftpapi
    26. [88]http://www.scottklement.com/mailman/listinfo/ftpapi
    27. [89]http://www.scottklement.com/mailman/listinfo/ftpapi
    28. [90]http://schemas.xmlsoap.org/soap/envelope/
    29.
   [91]http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC
   8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtS
   gpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
    30. [92]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
    31. [93]http://docs.oasis-open.org/wss/2004/01/oasis-200401'
    32. [94]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
    33. [95]http://docs.oasis-open.org/wss'
    34. [96]http://docs.oasis-open.org/'
    35. [97]http://schemas.xmlsoap.org/soap/envelope/
    36. [98]http://schemas.xmlsoap.org/soap/encoding/
    37. [99]http://www.w3.org/2001/XMLSchema
    38. [100]http://www.w3.org/2001/XMLSchema-instance
    39.
   [101]http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwP
   C8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8Uht
   SgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
    40. [102]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
    41. [103]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
    42. [104]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    43. [105]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    44. [106]http://www.scottklement.com/mailman/listinfo/ftpapi
    45. [107]http://www.scottklement.com/mailman/listinfo/ftpapi
    46. [108]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
    47. [109]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    48. [110]https://scottklement.com/archives/ftpapi/201210/msg00121.html
    49. [111]http://www.scottklement.com/mailman/listinfo/ftpapi
    50. [112]http://www.scottklement.com/mailman/listinfo/ftpapi
    51. [113]http://www.scottklement.com/mailman/listinfo/ftpapi
    52. [114]http://www.scottklement.com/mailman/listinfo/ftpapi
    53. [115]http://www.scottklement.com/mailman/listinfo/ftpapi
    54. [116]file://localhost/tmp/www.avg.com
    55. [117]http://www.scottklement.com/mailman/listinfo/ftpapi
    56. [118]http://www.scottklement.com/mailman/listinfo/ftpapi
    57. [119]http://www.scottklement.com/mailman/listinfo/ftpapi
   -----------------------------------------------------------------------
   This is the FTPAPI mailing list.  To unsubscribe, please go to:
   [120]http://www.scottklement.com/mailman/listinfo/ftpapi
   -----------------------------------------------------------------------
   -----------------------------------------------------------------------
   This is the FTPAPI mailing list.  To unsubscribe, please go to:
   [121]http://www.scottklement.com/mailman/listinfo/ftpapi
   -----------------------------------------------------------------------

References

   1. http://schemas.xmlsoap.org/soap/envelope/
   2. http://schemas.xmlsoap.org/ws/2004/03/addressing
   3. http://www.w3.org/2001/XMLSchema
   4. http://www.w3.org/2001/XMLSchema-instance
   5. http://docs.oasis-open.org/wss/2004/01/'
   6. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   7. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   8. http://schemas.xmlsoap.org/soap/envelope/
   9. http://websvcs.otswebws/
  10. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  11. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  12. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  13. http://docs.oasis-open.org/wss'
  14. http://docs.oasis-open.org/'
  15. http://schemas.xmlsoap.org/soap/envelope/
  16. http://schemas.xmlsoap.org/soap/encoding/
  17. http://www.w3.org/2001/XMLSchema
  18. http://www.w3.org/2001/XMLSchema-instance
  19. http://websvcs.otswebws/
  20. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  21. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  22. https://scottklement.com/archives/ftpapi/201210/msg00121
  23. https://scottklement.com/archives/ftpapi/201210/msg00121.htm
  24. http://www.scottklement.com/mailman/listinfo/ftpapi
  25. http://www.scottklement.com/mailman/listinfo/ftpapi
  26. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  27. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  28. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  29. http://www.scottklement.com/mailman/listinfo/ftpapi
  30. http://www.scottklement.com/mailman/listinfo/ftpapi
  31. http://www.scottklement.com/mailman/listinfo/ftpapi
  32. http://www.scottklement.com/mailman/listinfo/ftpapi
  33. http://schemas.xmlsoap.org/soap/envelope/
  34. http://websvcs.otswebws/
  35. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  36. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  37. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  38. http://docs.oasis-open.org/wss'
  39. http://docs.oasis-open.org/'
  40. http://schemas.xmlsoap.org/soap/envelope/
  41. http://schemas.xmlsoap.org/soap/encoding/
  42. http://www.w3.org/2001/XMLSchema
  43. http://www.w3.org/2001/XMLSchema-instance
  44. http://websvcs.otswebws/
  45. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  46. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  47. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  48. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  49. http://www.scottklement.com/mailman/listinfo/ftpapi
  50. http://www.scottklement.com/mailman/listinfo/ftpapi
  51. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  52. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  53. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  54. http://www.scottklement.com/mailman/listinfo/ftpapi
  55. http://www.scottklement.com/mailman/listinfo/ftpapi
  56. http://www.scottklement.com/mailman/listinfo/ftpapi
  57. http://www.scottklement.com/mailman/listinfo/ftpapi
  58. http://www.scottklement.com/mailman/listinfo/ftpapi
  59. file://localhost/tmp/www.avg.com
  60. http://www.scottklement.com/mailman/listinfo/ftpapi
  61. http://www.scottklement.com/mailman/listinfo/ftpapi
  62. http://www.scottklement.com/mailman/listinfo/ftpapi
  63. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  64. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  65. http://schemas.xmlsoap.org/soap/envelope/
  66. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  67. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  68. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  69. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  70. http://docs.oasis-open.org/wss'
  71. http://docs.oasis-open.org/'
  72. http://schemas.xmlsoap.org/soap/envelope/
  73. http://schemas.xmlsoap.org/soap/encoding/
  74. http://www.w3.org/2001/XMLSchema
  75. http://www.w3.org/2001/XMLSchema-instance
  76. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  77. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  78. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  79. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  80. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  81. http://www.scottklement.com/mailman/listinfo/ftpapi
  82. http://www.scottklement.com/mailman/listinfo/ftpapi
  83. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  84. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  85. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  86. http://www.scottklement.com/mailman/listinfo/ftpapi
  87. http://www.scottklement.com/mailman/listinfo/ftpapi
  88. http://www.scottklement.com/mailman/listinfo/ftpapi
  89. http://www.scottklement.com/mailman/listinfo/ftpapi
  90. http://schemas.xmlsoap.org/soap/envelope/
  91. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  92. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  93. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  94. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  95. http://docs.oasis-open.org/wss'
  96. http://docs.oasis-open.org/'
  97. http://schemas.xmlsoap.org/soap/envelope/
  98. http://schemas.xmlsoap.org/soap/encoding/
  99. http://www.w3.org/2001/XMLSchema
 100. http://www.w3.org/2001/XMLSchema-instance
 101. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
 102. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
 103. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
 104. https://scottklement.com/archives/ftpapi/201210/msg00121.html
 105. https://scottklement.com/archives/ftpapi/201210/msg00121.html
 106. http://www.scottklement.com/mailman/listinfo/ftpapi
 107. http://www.scottklement.com/mailman/listinfo/ftpapi
 108. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
 109. https://scottklement.com/archives/ftpapi/201210/msg00121.html
 110. https://scottklement.com/archives/ftpapi/201210/msg00121.html
 111. http://www.scottklement.com/mailman/listinfo/ftpapi
 112. http://www.scottklement.com/mailman/listinfo/ftpapi
 113. http://www.scottklement.com/mailman/listinfo/ftpapi
 114. http://www.scottklement.com/mailman/listinfo/ftpapi
 115. http://www.scottklement.com/mailman/listinfo/ftpapi
 116. file://localhost/tmp/www.avg.com
 117. http://www.scottklement.com/mailman/listinfo/ftpapi
 118. http://www.scottklement.com/mailman/listinfo/ftpapi
 119. http://www.scottklement.com/mailman/listinfo/ftpapi
 120. http://www.scottklement.com/mailman/listinfo/ftpapi
 121. http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------