[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Parser Problems
Good job, Scott. I am pretty sure that http_XmlReturnUcs() is a great
enhancement of HTTPAPI.
Thomas.
ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx schrieb am 10.10.2011 07:51:11:
> Von: sk@xxxxxxxxxxxxxxxx
> An: ftpapi@xxxxxxxxxxxxxxxxxxxxxx
> Datum: 10.10.2011 07:55
> Betreff: Re: Parser Problems
> Gesendet von: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
>
> Hello,
>
> >
> > Honestly, I already have the code updates completed. I would've
posted
> > them yesterday, but you told me not to spend my weekend working on
it,
> > so I was going to wait until Monday to tell you. :-)
> >
>
> If you'd like to try it, grab the latest "beta" copy from here:
> [1]http://www.scottklement.com/httpapi/beta
>
> The new feature is called http_XmlReturnUcs(*on/*off). You call
this
> procedure before asking HTTPAPI to parse XML. If you pass *ON,
it'll
> return the output to your program in UCS-2 (Unicode) format. If you
> pass *OFF, the XML parser will return EBCDIC (this is the default.)
>
> This setting will be remembered until you call http_XmlReturnUcs()
> again, or until the activation group containing HTTPAPIR4 is ended.
So
> if you call the XML parser multiple times, the setting will be
retained
> (unless you explicitly change it.)
>
> In your case, Tom, you'll want to do this:
>
> h dftactgrp(*no) bnddir('HTTPAPI':'QC2LE')
>
> /define WEBFORMS
> /copy httpapi_h
>
> D Parse1 PR
> D UserData likeds(value_t)
> D depth 10I 0 value
> D name 1024A varying const
> D path 24576A varying const
> D value likeds(value_t) const
> D Parse2 PR
> D UserData * value
> D depth 10I 0 value
> D name 1024A varying const
> D path 24576A varying const
> D value 65535A varying const
>
> D value_t ds qualified
> D buf *
> D len 10i 0
> D result ds likeds(value_t)
>
> D url s 2000a varying
> D rc s 10i 0
>
> D myForm s like(WEBFORM)
> D myPostData s *
> D myPostDataLen s 10i 0
>
> /free
> http_debug(*on : '/tmp/TomThomsonTest_log.txt');
> http_XmlReturnPtr(*on);
> http_XmlReturnUcs(*on);
>
> url =
'http://api.netroomz.com.au/allotmentserviceextended.asmx+
> /GetAllotmentList';
>
> myForm = WEBFORM_open();
> WEBFORM_setVar( myForm : 'callerID': 'XXXXXXXXXXX' );
> WEBFORM_setVar( myForm : 'username': 'YYY' );
> WEBFORM_setVar( myForm : 'password': 'ZZZZZZ' );
> WEBFORM_postData( myForm: myPostData: myPostDataLen );
>
> rc = http_post_xml( url
> : myPostData
> : myPostDataLen
> : *null
> : %paddr(Parse1)
> : %addr(Result)
> : HTTP_TIMEOUT
> : *omit
> : 'application/x-www-form-urlencoded' );
>
> WEBFORM_close(myForm);
>
> if rc <> 1;
> http_crash();
> endif;
>
> http_XmlReturnUcs(*off);
> http_XmlReturnPtr(*off);
>
> rc = http_parse_xml_string( Result.buf
> : Result.len
> : 1200
> : *null
> : %paddr(Parse2)
> : *null );
> if (rc < 0);
> http_crash();
> endif;
>
> if (Result.buf <> *null);
> dealloc Result.buf;
> endif;
>
> *inlr = *on;
> /end-free
>
>
> P Parse1 B
> D PI
> D UserData likeds(value_t)
> D depth 10I 0 value
> D name 1024A varying const
> D path 24576A varying const
> D value likeds(value_t) const
>
> D memcpy pr * extproc('memcpy')
> D dest * value
> D src * value
> D size 10u 0 value
> /free
> if name = 'string';
> UserData.len = value.len;
> if UserData.buf = *null;
> UserData.buf = %alloc(userdata.len);
> else;
> UserData.buf = %realloc(UserData.buf:userdata.len);
> endif;
> memcpy( UserData.buf: Value.buf: UserData.len);
> endif;
> /end-free
> P E
>
>
> P Parse2 B
> D PI
> D UserData * value
> D depth 10I 0 value
> D name 1024A varying const
> D path 24576A varying const
> D value 65535A varying const
> /free
> if name = 'ShortDescription';
> // I did this just for debugging, so
> // I can set a breakpoint below, and
> // see the that I'm getting the proper
> // result.
> if %scan('Children': value) > 0;
> dsply 'found';
> endif;
> endif;
> /end-free
> P E
>
> You'll notice that I called http_XmlReturnUcs() twice. The first
call
> tells HTTPAPI to return UCS (Unicode) data. It uses the Parse1()
> subprocedure to load the "inner XML" into a memory buffer. Since
this
> is true Unicode, the slanted double quotes will remain slanted
double
> quotes...
>
> Then, after that, it turns http_XmlReturnUcs() off again, so when it
> does the 2nd parse, the data will be returned in EBCDIC. When it
calls
> http_parse_xml_string(), it passes a CCSID 1200 (which is UTF-16)
and
> that tells the XML parser to treat the input as Unicode (rather than
> EBCDIC). It uses a procedure called Parse2() for the XML parsing.
>
> When Parse2() gets the data, it'll be in EBCDIC. The slanted double
> quote is translated to x'3F' -- but this is no problem at this
point,
> since the XML parsing is complete. (Plus, the data should now be
fed in
> small enough pieces translate it with %xlate or %scan/%replace.)
>
> Hope that helps.
>
----------------------------------------------------------------------
-
> This is the FTPAPI mailing list. To unsubscribe, please go to:
> [2]http://www.scottklement.com/mailman/listinfo/ftpapi
>
----------------------------------------------------------------------
-
--
IMPORTANT NOTICE:
This email is confidential, may be legally privileged, and is for the
intended recipient only. Access, disclosure, copying, distribution, or
reliance on any of it by anyone else is prohibited and may be a
criminal
offence. Please delete if obtained in error and email confirmation to
the sender.
References
1. http://www.scottklement.com/httpapi/beta
2. 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
-----------------------------------------------------------------------