[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
-----------------------------------------------------------------------