[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: New to XML - Dequeue2 Request Issue
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]http://schemas.xmlsoap.org/soap/envelope/"'
0157.00 +' xmlns:web="[2]http://websvcs.otswebws">'
0158.00 +'<SOAP-ENV:Header>'
0159.00 +' <wsse:Security SOAP-ENV:mustUnderstand="1"'
0160.00 +'
xmlns:wsse="[3]http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
0161.00 +'wss-wssecurity-secext-1.0.xsd">'
0162.00 +' <wsu:Timestamp wsu:Id="Timestamp-6"'
0163.00 +'
xmlns:wsu="[4]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]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]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]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]http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="[9]http://schemas.xmlsoap.org/soap/encoding/
" xmlns:xsd="[10]http://www.w3.org/2001/XMLSchema"
xmlns:xsi="[11]http://www.w3.org/2001/XMLSchema-instance"><soapenv:Head
er/><soapenv:Body>
<p917:dequeue2Response
xmlns:p917="[12]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]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]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]https://scottklement.com/archives/ftpapi/201210/msg00121.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]https://scottklement.com/archives/ftpapi/201210/msg00121.html
-----------------------------------------------------------------------
This is the FTPAPI mailing list. To unsubscribe, please go to:
[4][17]http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
-----------------------------------------------------------------------
This is the FTPAPI mailing list. To unsubscribe, please go to:
[5][18]http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
References
1. [19]mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
2. [20]https://scottklement.com/archives/ftpapi/201210/msg00121.html
3. [21]https://scottklement.com/archives/ftpapi/201210/msg00121.html
4. [22]http://www.scottklement.com/mailman/listinfo/ftpapi
5. [23]http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
This is the FTPAPI mailing list. To unsubscribe, please go to:
[24]http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
-----------------------------------------------------------------------
This is the FTPAPI mailing list. To unsubscribe, please go to:
[25]http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
References
1. http://schemas.xmlsoap.org/soap/envelope/
2. http://websvcs.otswebws/
3. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
4. http://docs.oasis-open.org/wss/2004/01/oasis-200401'
5. http://docs.oasis-open.org/wss/2004/01/oasis-200401-'
6. http://docs.oasis-open.org/wss'
7. http://docs.oasis-open.org/'
8. http://schemas.xmlsoap.org/soap/envelope/
9. http://schemas.xmlsoap.org/soap/encoding/
10. http://www.w3.org/2001/XMLSchema
11. http://www.w3.org/2001/XMLSchema-instance
12. http://websvcs.otswebws/
13. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
14. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
15. https://scottklement.com/archives/ftpapi/201210/msg00121.html
16. https://scottklement.com/archives/ftpapi/201210/msg00121.html
17. http://www.scottklement.com/mailman/listinfo/ftpapi
18. http://www.scottklement.com/mailman/listinfo/ftpapi
19. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
20. https://scottklement.com/archives/ftpapi/201210/msg00121.html
21. https://scottklement.com/archives/ftpapi/201210/msg00121.html
22. http://www.scottklement.com/mailman/listinfo/ftpapi
23. http://www.scottklement.com/mailman/listinfo/ftpapi
24. http://www.scottklement.com/mailman/listinfo/ftpapi
25. 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
-----------------------------------------------------------------------