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