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

Re: [Ftpapi] BASE64 Decode



Ron.

Have a look at this program. See attached.

I believe it does what you are looking for.

I don’t know is this is what you mean by “easy”…it’s just what I did.

 

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

Paul Reid

Application Developer III

Erb Group of Companies | 290 Hamilton Road | New Hamburg, Ontario | N3A 1A2

Phone: 519.662.6133 ext. 2363

Web: http://www.erbgroup.com/

 

From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Ron Koontz
Sent: Monday, June 05, 2017 10:40 AM
To: 'ftpapi@xxxxxxxxxxxxxxxxxxxxxx'
Subject: [Ftpapi] BASE64 Decode

 

Is there an easy way to decode a field from BASE64 ? ( IBM API maybe that I cannot find )

I have tried Scott’s example but get a “Definition not found for symbol 'BASE64_ENCODE'. “ after I compile my program.

I did all the  compile options in the BASE64R4 documentation.

 

I tried an example online as well and got the same error just to make sure it was not my main pgm..

 

Any Ideas?  Its probably something easy I’m not doing  I would guess.

 

Example off the web :

/copy BASE64_H                                 

D Input           S              6a              

D Output          S              8A             

                                                 

 /free                                          

                                                 

     input = x'61626b3735';                      

     Output = *blanks;                          

                                                 

    base64_encode( %addr(Input)                 

     : %len(%trimr(Input))                      

     : %addr(Output)                            

     : %size(Output) );                         

                                                 

     dsply Output;                              

     *inlr = *on;                               

                                                 

 /end-free                                      

 

Thanks

Ron

 



The information contained in this e-mail is intended only for the individual or entity to whom it is addressed. Its contents (including any attachments) may contain confidential and/or privileged information. If you are not an intended recipient you shall not use, disclose, disseminate, copy or print its contents. If you receive this e-mail in error, please notify the sender by reply e-mail and delete and destroy the message. Continental Express, Inc. and its subsidiaries and affiliates will not be held liable for the unintended or unauthorized use of any information contained in this email or as a result of any additions or deletions of information originally contained in this email.

     H BNDDIR('DSBNDDIR':'HTTPAPI':'QC2LE':'UTBNDDIR')
      *------------------------------------------------------------------------*
      * DSRPERFMON - Download Performance Monitoring data from SHAW.           *
      * Created by : Paul Reid                                                 *
      * Created on : Jan 08,2014                                               *
      * Currently this program receives two differnt 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
      *
      * 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 recieve 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;
             endif;

          // If an error occured 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>yourUserName</wsse:Username>'
          +'<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/'
                               +'oasis-200401-wss-username-token-profile-1.0#'
                               +'PasswordText">yourPassword</wsse:Password>'
          +'</wsse:UsernameToken>'
          +'</wsse:Security>'
          +'</soap:Header>';

          endsr;

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

          begsr assembleSOAPbody;

          subscriberId    = 'yourSubcriberId';
          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 tha 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
      *
-- 
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi