Trouble with Xerces 3.0.1

Qbox installation issues
Forum rules
You must be a registered user to post in this forum. Registered users may also post new topics if they consider that their subject do not correspond to any topic already present on the forum.
Post Reply
d-farrell2
Posts: 6
Joined: Sat Nov 22, 2008 12:29 am

Trouble with Xerces 3.0.1

Post by d-farrell2 »

When trying to compile Qbox with xerces 3.0.1 I ran into a few errors.

One was : WavefunctionHandler.C:415: error: invalid conversion from ‘XMLByte**’ to ‘char**’ - easily fixed by editing that line to read 'XMLString::release((char**)&b);'

the second which I am not so sure about is:
WavefunctionHandler.C: In member function ‘virtual void WavefunctionHandler::endElement(const XMLCh*, const XMLCh*, const XMLCh*, std::string&)’:
WavefunctionHandler.C:407: error: no matching function for call to ‘xercesc_3_0::Base64::decode(XMLByte*, unsigned int*)’
/home/defarr/Qbox/xerces-c-3.0.1/include/xercesc/util/Base64.hpp:102: note: candidates are: static XMLByte* xercesc_3_0::Base64::decode(const XMLByte*, XMLSize_t*, xercesc_3_0::MemoryManager*, xercesc_3_0::Base64::Conformance)
/home/defarr/Qbox/xerces-c-3.0.1/include/xercesc/util/Base64.hpp:186: note: static XMLByte* xercesc_3_0::Base64::decode(const XMLByte*, XMLSize_t*, XMLByte*&, xercesc_3_0::MemoryManager*, xercesc_3_0::Base64::Conformance)
make: *** [WavefunctionHandler.o] Error 1


any thoughts?
d-farrell2
Posts: 6
Joined: Sat Nov 22, 2008 12:29 am

Re: Trouble with Xerces 3.0.1

Post by d-farrell2 »

ok - found my problem is actually nested dependencies in the various libraries linked.
fgygi
Site Admin
Posts: 150
Joined: Tue Jun 17, 2008 7:03 pm

Re: Trouble with Xerces 3.0.1

Post by fgygi »

Regarding the first problem: It is interesting that the Xerces API is somewhat inconsistent here. The Base64 class API says that Base64::decode allocates the returned XMLByte buffer and that it should be deallocated using an XMLString member (XMLString::release). In Xerces 2.8.0, XMLString::release(XMLByte** buf) exists, but it has disappeared in Xerces 3.0.1. However, since XMLByte is a typedef for unsigned char, I will assume it is legal to cast XMLByte** to char** which then allows one to use XMLString::release(char** buf), but this is a little weird.

I will schedule the change for inclusion in the next release.
Thanks.
fgygi
Site Admin
Posts: 150
Joined: Tue Jun 17, 2008 7:03 pm

Re: Trouble with Xerces 3.0.1

Post by fgygi »

The error reported in the original post can be avoided by replacing WavefunctionHandler.C:407 by the following line:

Code: Select all

  XMLByte* b = Base64::decode((XMLByte*) content.c_str(), (XMLSize_t*) &length);
The cast to (XMLSize_t*) is necessary to conform to the 3.0.1 API. However, this makes the code incompatible with Xerces 2.8.0.
This may be a good time to migrate Qbox to Xerces-C 3.0.1, but there is still a fair number of platforms on which we haven't built 3.0.1.
There is at least one platform (TACC Ranger) on which 2.8.0 does not build with g++ 3.4.6, and migration to Xerces 3.0.1 is necessary.
The probable course of action will be an #ifdef ... :(
correaa
Posts: 5
Joined: Wed Oct 15, 2008 7:33 pm

Re: Trouble with Xerces 3.0.1

Post by correaa »

Hi, any news on this front? as of version 1.52 I still can not use xerces 3. The library still reads negative values for zval and lmax which raise an exception while reading the 'species'.
fgygi
Site Admin
Posts: 150
Joined: Tue Jun 17, 2008 7:03 pm

Re: Trouble with Xerces 3.0.1

Post by fgygi »

The problem seems to come from the following change in the Xerces-C 3 API (tested here with Xerces-C 3.1.1).

From the migration guide from 2.8.0 to 3.0.0 on page http://xerces.apache.org/xerces-c/migra ... fiedAPI300
Many public interfaces that used int/long types to represent memory-related sizes, counts, indexes, etc., have been modified to use the 64-bit safe XMLSize_t type instead
The type of some arguments of the members of SAX2 DefaultHandler have changed. In particular, the "length"
argument in member function ::characters has changed from unsigned int to XMLSize_t.

This affects the following files:

StructuredDocumentHandler.h
StructuredDocumentHandler.C

You can fix it with the following:

Code: Select all

===================================================================
--- StructuredDocumentHandler.C	(revision 800)
+++ StructuredDocumentHandler.C	(working copy)
@@ -61,7 +61,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 void StructuredDocumentHandler::characters(const XMLCh* const chars,
-  const unsigned int length)
+  const XMLSize_t length)
 {
 #if TIMING
   Timer tm;

===================================================================
--- StructuredDocumentHandler.h	(revision 800)
+++ StructuredDocumentHandler.h	(working copy)
@@ -61,7 +61,7 @@
 
   void startElement(const XMLCh* const uri,const XMLCh* const localname,
     const XMLCh* const qname, const Attributes& attributes);
-  void characters(const XMLCh* const chars, const unsigned int length);
+  void characters(const XMLCh* const chars, const XMLSize_t length);
   void endElement(const XMLCh* const uri, const XMLCh* const localname,
                   const XMLCh* const qname);
   void ignorableWhitespace(const XMLCh* const chars,

===================================================================
--- WavefunctionHandler.C	(revision 836)
+++ WavefunctionHandler.C	(working copy)
@@ -405,7 +405,7 @@
       {
         // base64 encoding
         unsigned int length;
-#ifdef XERCESC_3_0_1
+#ifdef XERCESC_3
         XMLByte* b = Base64::decode((XMLByte*)content.c_str(),
                                     (XMLSize_t*) &length);
 #else
Note the change of the test for XERCESC_3_0_1 in WavefunctionHandler.C to XERCESC_3, since the minor versions upgrades are likely not affecting the API.
The above fix was released in 1.52.3. See http://eslab.ucdavis.edu/software/qbox
Please post to this list if you find more Xerces-C 3 problems.
Thanks
Post Reply