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

RE: New to XML - Dequeue2 Request Issue



   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="http://schemas.xmlsoap.org/soap/envelope/";'

             +'
   xmlns:wsa="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="http://www.w3.org/2001/XMLSchema";'

             +' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>'

             +'<soap:Header>'

             +'<wsse:Security soap:mustUnderstand="1" >'

             +'<wsse:UsernameToken>'

             +'<wsse:Username>******@*******</wsse:Username>'

             +'<wsse:Password
   Type="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][1]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][2]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][3]http://schemas.xmlsoap.org/soap/envelope/";'
     >     0157.00   +'    xmlns:web="[2][4][4]http://websvcs.otswebws";>'
     >
     >     0158.00   +'<SOAP-ENV:Header>'
     >
     >     0159.00   +'    <wsse:Security SOAP-ENV:mustUnderstand="1"'
     >
     >     0160.00   +'
     >

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

   xmlns:wsu="[4][6][6]http://docs.oasis-open.org/wss/2004/01/oasis-200401
   '
     >     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][7]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][8]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][9]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][10]http://schemas.xmlsoap.org/soap/envelope/";
     >
   xmlns:soapenc="[9][11][11]http://schemas.xmlsoap.org/soap/encoding/
     >     " xmlns:xsd="[10][12][12]http://www.w3.org/2001/XMLSchema";
      >

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

   xmlns:p917="[12][14][14]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][15]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][16]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][17]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][18]https://scottklement.com/archives/ftpapi/201210/msg00121
   .htm
     l
     >
     >

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

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

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

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

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

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

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

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

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

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

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

   ----------------------------------------------------------------------
     > -
     >
     >
     >
     > -----
     > No virus found in this message.
     > Checked by AVG - [54][54]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][55]http://www.scottklement.com/mailman/listinfo/ftpapi

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

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

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

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

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

References

   1. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   2. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   3. http://schemas.xmlsoap.org/soap/envelope/
   4. http://websvcs.otswebws/
   5. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
   6. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
   7. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
   8. http://docs.oasis-open.org/wss'
   9. http://docs.oasis-open.org/'
  10. http://schemas.xmlsoap.org/soap/envelope/
  11. http://schemas.xmlsoap.org/soap/encoding/
  12. http://www.w3.org/2001/XMLSchema
  13. http://www.w3.org/2001/XMLSchema-instance
  14. http://websvcs.otswebws/
  15. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  16. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  17. https://scottklement.com/archives/ftpapi/201210/msg00121
  18. https://scottklement.com/archives/ftpapi/201210/msg00121.htm
  19. http://www.scottklement.com/mailman/listinfo/ftpapi
  20. http://www.scottklement.com/mailman/listinfo/ftpapi
  21. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  22. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  23. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  24. http://www.scottklement.com/mailman/listinfo/ftpapi
  25. http://www.scottklement.com/mailman/listinfo/ftpapi
  26. http://www.scottklement.com/mailman/listinfo/ftpapi
  27. http://www.scottklement.com/mailman/listinfo/ftpapi
  28. http://schemas.xmlsoap.org/soap/envelope/
  29. http://websvcs.otswebws/
  30. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  31. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  32. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  33. http://docs.oasis-open.org/wss'
  34. http://docs.oasis-open.org/'
  35. http://schemas.xmlsoap.org/soap/envelope/
  36. http://schemas.xmlsoap.org/soap/encoding/
  37. http://www.w3.org/2001/XMLSchema
  38. http://www.w3.org/2001/XMLSchema-instance
  39. http://websvcs.otswebws/
  40. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  41. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  42. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  43. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  44. http://www.scottklement.com/mailman/listinfo/ftpapi
  45. http://www.scottklement.com/mailman/listinfo/ftpapi
  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. http://www.scottklement.com/mailman/listinfo/ftpapi
  52. http://www.scottklement.com/mailman/listinfo/ftpapi
  53. http://www.scottklement.com/mailman/listinfo/ftpapi
  54. file://localhost/tmp/www.avg.com
  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. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  59. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  60. http://schemas.xmlsoap.org/soap/envelope/
  61. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  62. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  63. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  64. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  65. http://docs.oasis-open.org/wss'
  66. http://docs.oasis-open.org/'
  67. http://schemas.xmlsoap.org/soap/envelope/
  68. http://schemas.xmlsoap.org/soap/encoding/
  69. http://www.w3.org/2001/XMLSchema
  70. http://www.w3.org/2001/XMLSchema-instance
  71. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  72. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  73. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  74. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  75. https://scottklement.com/archives/ftpapi/201210/msg00121.html
  76. http://www.scottklement.com/mailman/listinfo/ftpapi
  77. http://www.scottklement.com/mailman/listinfo/ftpapi
  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. http://www.scottklement.com/mailman/listinfo/ftpapi
  84. http://www.scottklement.com/mailman/listinfo/ftpapi
  85. http://schemas.xmlsoap.org/soap/envelope/
  86. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  87. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  88. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
  89. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
  90. http://docs.oasis-open.org/wss'
  91. http://docs.oasis-open.org/'
  92. http://schemas.xmlsoap.org/soap/envelope/
  93. http://schemas.xmlsoap.org/soap/encoding/
  94. http://www.w3.org/2001/XMLSchema
  95. http://www.w3.org/2001/XMLSchema-instance
  96. http://webdefence.global.blackspider.com/urlwrap/?q=AXicY3BnOFnLwPC8iYGhKKfS2Cxdr7ioTC83MTMnOT-vpCg_Ry85P5ehxMnVrdgs2c3A0NzS0IihoCg1M8UhtSgpvSi_tACsIqOkpMBKX788Nam4LLlYL7-kGMgsL9ZngAAA8QYhBA&Z
  97. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  98. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  99. https://scottklement.com/archives/ftpapi/201210/msg00121.html
 100. https://scottklement.com/archives/ftpapi/201210/msg00121.html
 101. http://www.scottklement.com/mailman/listinfo/ftpapi
 102. http://www.scottklement.com/mailman/listinfo/ftpapi
 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. http://www.scottklement.com/mailman/listinfo/ftpapi
 109. http://www.scottklement.com/mailman/listinfo/ftpapi
 110. http://www.scottklement.com/mailman/listinfo/ftpapi
 111. file://localhost/tmp/www.avg.com
 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
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------