You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ca...@apache.org on 2006/07/07 17:41:28 UTC

svn commit: r419911 - /xerces/c/branches/xerces-2.7/src/xercesc/util/Platforms/OS400/OS400PlatformUtils.cpp

Author: cargilld
Date: Fri Jul  7 08:41:28 2006
New Revision: 419911

URL: http://svn.apache.org/viewvc?rev=419911&view=rev
Log:
OS400 fixes from Jay Hansen.

Modified:
    xerces/c/branches/xerces-2.7/src/xercesc/util/Platforms/OS400/OS400PlatformUtils.cpp

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/Platforms/OS400/OS400PlatformUtils.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/Platforms/OS400/OS400PlatformUtils.cpp?rev=419911&r1=419910&r2=419911&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/Platforms/OS400/OS400PlatformUtils.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/Platforms/OS400/OS400PlatformUtils.cpp Fri Jul  7 08:41:28 2006
@@ -47,6 +47,13 @@
 #include    <mih/cmpswp.h>
 #include    "OS400PlatformUtils.hpp"
 #include    <xercesc/util/OutOfMemoryException.hpp>
+#include    <qlgusr.h>   // @1aa
+#include    <qusrjobi.h>  // @1aa
+#include    <qusec.h>  // @1aa
+#include    "utypes.h"  // @1aa
+#include    "iconv_util.hpp"  // @1aa
+#include    "iconv_cnv.hpp"  // @1aa
+#include    <qmhrtvm.h>   // @1aa
 
 #if defined (XML_USE_ICONV400_TRANSCODER)
     #include <xercesc/util/Transcoders/Iconv400/Iconv400TransService.hpp>
@@ -219,24 +226,125 @@
     return (unsigned int)retVal;
 }
 
-FileHandle XMLPlatformUtils::openFile(const XMLCh* const fileName
+static char JOBCCSID_CONVERTER_NAME[60] = "";  // @1aa
+static UConverter *jobCCSID_Converter = NULL;  // @1aa
+void get_jobCCSID_converter()   // @1aa
+{
+  Qwc_JOBI0400_t job_attr;                 /* Job attribute receive. @1aa */
+  Qus_EC_t       recv_error;               /* Error on receive?   @1aa  */
+  UErrorCode uerr = U_ZERO_ERROR;          /* Error structure for creating converter @1aa */
+
+  recv_error.Bytes_Provided = sizeof(recv_error);  // @1aa
+
+  QUSRJOBI(&job_attr,
+	   sizeof(job_attr),
+	   "JOBI0400",
+	   "*                         ",
+	   "                ",
+	   &recv_error);   // extract job ccsid (integer form) @1aa
+
+  if ( recv_error.Bytes_Available != 0 )  // @1aa
+  {  /* The 'QUSRJOBI' API failed for some reason.  */
+      strcpy(JOBCCSID_CONVERTER_NAME, "ibm037");  // use internal default @1aa  
+  }
+  else  // @1aa
+  {  /* Get the default job CCSID.   */
+      int JobCCSID = job_attr.Default_Coded_Char_Set_Id;   // @1aa
+      char jobCCSID_str[30];   // @1aa
+
+      sprintf(jobCCSID_str, "%05d", JobCCSID);  // @1aa
+      // convert job CCSID (integer format) to IANA text format.
+      int rc = QlgCvtTextDescToDesc(0,
+				    11,
+				    (char *)jobCCSID_str,
+				    strlen(jobCCSID_str),
+				    &JOBCCSID_CONVERTER_NAME[0],
+				    sizeof(JOBCCSID_CONVERTER_NAME),
+				    JobCCSID);  // @1aa
+      if (rc < 0)  // @1aa
+	  strcpy(JOBCCSID_CONVERTER_NAME, "ibm037"); // @1aa   
+
+  }
+
+  // create converter for job CCSID
+  jobCCSID_Converter = createConverter (JOBCCSID_CONVERTER_NAME, &uerr); // @1aa
+
+  if (U_FAILURE (uerr))  // @1aa
+  {
+      jobCCSID_Converter = NULL; // don't use jobCCSID_Converter @1aa  
+  }
+
+  return;    // @1aa
+}
+
+#include <qmhrtvm.h>
+#include <qusec.h>
+#include <errno.h> // for UErrorCode  @1aa 
+
+FileHandle XMLPlatformUtils::openFile(const XMLCh* const FILENAME
                                       , MemoryManager* const manager)
-{   char errno_id[7];
-    const char* tmpFileName = XMLString::transcode(fileName, manager);
-    ArrayJanitor<char> janText((char*)tmpFileName, manager);
+{   char errno_id[7];  // @1aa
+    int numChars = (u_strlen(FILENAME)*2) + 2;  // @1aa @1bc add 2 bytes for null terminator 
+    char* saved_myTarget = new char[numChars];  // target for transcoding to job CCSID @1aa
+    char* myTarget = (char *) saved_myTarget;  // ucnv_fromUnicode can change myTarget pointer @1aa
+    memset(myTarget,'\0',numChars); // make sure storage is zeroed out to allow for
+                                    // automatic null terminator @1ba 
+    char* myTargetLimit = myTarget + (numChars - 1);    // @1aa
+    const UChar *mySource = (UChar *) FILENAME;
+
+    int mySourceChars = u_strlen(mySource);  // @1aa 
+    const UChar* mySourceLimit = (UChar *) mySource + u_strlen(mySource);    // @1aa
+
+    UErrorCode err = U_ZERO_ERROR;    /* Error structure for creating converter @1aa */
+
+    if (jobCCSID_Converter == NULL)  // should only need to create this converter once. @1aa
+    {
+	  get_jobCCSID_converter();   // @1aa
+    }
+ 
+    // need to do open with pathname/filename in job CCSID, not IBM037.  The other
+    // openFile( ) is dead code, so didn't bother with converting the pathname/fileName there.
+    // Alternative to using converter code is to use XLATEMB MI instruction.  @1aa
+    const char* TMPFILENAME;
+    if (jobCCSID_Converter != NULL) {
+       ucnv_fromUnicode (jobCCSID_Converter,
+			&myTarget,
+			myTargetLimit,
+			&mySource,
+			mySourceLimit,
+			NULL,
+			TRUE,
+			&err);  // @1aa
+
+       TMPFILENAME = saved_myTarget;  // @1aa
+       if (U_FAILURE (err)) {
+	   TMPFILENAME = XMLString::transcode(FILENAME);  // transcode to IBM037 as backup @1aa.
+       }
+ 
+    }
+    else {
+	TMPFILENAME = XMLString::transcode(FILENAME);  // transcode to IBM037 as backup @1aa.
+    }
+
+    //    ArrayJanitor<char> janText((char*)saved_myTarget);  @1dd
     errno = 0;
-    FileHandle retVal = (FILE*)fopen( tmpFileName , "rb" );
+    FileHandle retVal = (FILE*)fopen( TMPFILENAME , "rb" );
 
     if (retVal == NULL)
     {
-     send_message((char*)tmpFileName,FILE_OPEN_PROBLEMS,'d');
-     convert_errno(errno_id,errno);
-     send_message(NULL,errno_id,'d');
-        return 0;
+	send_message((char*)TMPFILENAME,FILE_OPEN_PROBLEMS,'d');
+	convert_errno(errno_id,errno);
+	send_message(NULL,errno_id,'d');
+	delete [] saved_myTarget;  // @1aa
+	return 0;
     }
+    delete [] saved_myTarget;  // @1aa
+
     return retVal;
 }
 
+// If this version of openFile is ever called, need to convert the filename
+// to job CCSID similar to what's done in the other openFile method.  @1aa.
 FileHandle XMLPlatformUtils::openFile(const char* const fileName
                                       , MemoryManager* const manager)
 {   char errno_id[7];



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org