xml/cxmllibrary/src/xmlp/src/XmlpIntEntity.cpp
branchRCL_3
changeset 20 889504eac4fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/cxmllibrary/src/xmlp/src/XmlpIntEntity.cpp	Tue Aug 31 17:02:56 2010 +0300
@@ -0,0 +1,482 @@
+/*
+* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/* Code to handle Internal Entities */
+
+#include "cxml_internal.h"
+#include <xml/cxml/nw_xmlp_xmlreader.h>
+#include <xml/cxml/nw_xmlp_xmlparser.h>
+#include <xml/cxml/nw_string_string.h>
+
+#include "cxml_xmlp_int_entity.h"
+
+//#include <flogger.h> // Comment out this.
+
+
+
+
+
+/** ----------------------------------------------------------------------- **
+    @function:    CXML_XML_Parser_Store_I_Entity
+    @synopsis:    Function to store the internal entity.
+    @scope:       public      
+
+    @parameters: 
+        [in] entityVal
+                  
+
+        [in] NW_XML_Reader_Interval_t* I_entityName
+                  Internal Entity Name
+
+
+        [in] NW_XML_Reader_Interval_t* I_entityValue
+                  Internal Entity Value
+
+        [in]  RPointerArray <CXML_Internal_Entity_t>*  internalEntityList: Internal Entity list
+
+    @description: This extracts the Internal Entity name from the XML buffer
+                  and stores in the Link list.
+
+    @returns:   
+                  In case of file  related failures:  Error codes is returned defined in 
+				                                      nwx_status.h
+                  NW_STAT_FAILURE : For any general error and entity is not predefined 
+                                    entity.
+                  NW_STAT_SUCCESS: For success
+ -----------------------------------------------------------------------------------**/
+
+ NW_Status_t CXML_XML_Parser_Store_I_Entity(NW_XML_Reader_t* pT, 
+                                            NW_XML_Reader_Interval_t* I_entityName,
+                                            NW_XML_Reader_Interval_t* I_entityValue,
+                                            RPointerArray <CXML_Internal_Entity_t>*  internalEntityList)
+ {
+  NW_Uint32 length;
+  NW_Uint32 nameLength;
+  NW_Uint32 totalByteCount = 0;
+  NW_Uint32 i =0;
+  NW_Uint8* bufPointer;
+  NW_Uint8* pName;
+  NW_Ucs2* ucsName;
+  NW_Uint32 valueByteLength;
+  NW_Uint8* pValue;
+  NW_Ucs2* ucsValue;
+  CXML_Internal_Entity_t* internalEntity=NULL;
+  NW_Ucs2 c;
+  NW_Uint32 numbytes;
+  TInt errorCode;
+  TInt entryCount;
+  NW_Status_t s;
+
+  /* Check Entity Name Interval and Value Interval is valid */
+
+  if ( (!NW_XML_Reader_Interval_IsWellFormed(I_entityName) ) &&
+       (!NW_XML_Reader_Interval_IsWellFormed(I_entityValue) ) )
+  {
+   return NW_STAT_FAILURE;
+  }
+
+
+     /* Entity name */
+
+    length = I_entityName->stop - I_entityName->start;
+    nameLength = length; /* byte length */
+    s = NW_XML_Reader_DataAddressFromBuffer(pT, I_entityName->start,
+                                         &nameLength, &bufPointer);
+    if (NW_STAT_IS_FAILURE(s)) {
+        return s;
+    }
+    if (nameLength != length) {
+        return NW_STAT_FAILURE;
+    }
+    nameLength = I_entityName->charStop - I_entityName->charStart; /* char count */
+
+    /* pName is not NULL terminated so need to use following method. The num byte
+     * will be used for both pName and pVlaue.
+     */
+
+
+    numbytes = NW_String_readChar( (NW_Byte*) bufPointer,&c,pT->encoding);
+
+    /* Calculate the length of string. Also add the number of characters 
+     * required for the NULL termination.
+     */
+        
+    totalByteCount = length + numbytes;
+
+
+    pName = (NW_Uint8*) NW_Mem_Malloc(totalByteCount);
+
+    if (pName  != NULL) 
+     {
+      (void)NW_Mem_memcpy(pName , bufPointer, length );
+
+
+       for(i=0; i < numbytes; i++)
+       {
+        pName[length+i] = '\0';
+       }
+      } /*end if (pName  != NULL)*/
+     else
+     {
+      return NW_STAT_OUT_OF_MEMORY;
+     }
+
+   
+
+    /* The "pName" is already NULL terminated */
+
+    if(pT->encoding != HTTP_iso_10646_ucs_2)
+    {
+     s = NW_String_byteToUCS2Char(pName, length, &ucsName);
+
+     if(s != NW_STAT_SUCCESS)
+     {
+      return s;
+     }
+
+     totalByteCount = 2*totalByteCount;
+    }/*end if(pT->encoding != HTTP_iso_10646_ucs_2)*/
+    else
+    {
+     ucsName = (NW_Ucs2*) NW_Mem_Malloc(totalByteCount); 
+     (void)NW_Mem_memcpy(ucsName, pName, totalByteCount);
+
+    }
+
+    /*Now free the pName */
+
+    if(pName != NULL)
+    {
+     NW_Mem_Free(pName);
+    }
+   
+    internalEntity = (CXML_Internal_Entity_t*) NW_Mem_Malloc(sizeof(CXML_Internal_Entity_t) );
+
+    if(internalEntity == NULL)
+    {
+        if(pName != NULL)
+        {
+         NW_Mem_Free(pName);
+        }
+     return NW_STAT_OUT_OF_MEMORY;
+    }
+ 
+      
+
+            //SSS: Comment me.
+/*
+    RFileLogger::WriteFormat(_L("Browser"), _L("xml_core.log"), 
+                         EFileLoggingModeAppend, _L("In_INT:Name=%s \n"), 
+                         ucsName);
+
+*/
+  
+    /* Length is including the NULL termination. */
+
+    internalEntity->nameLen = totalByteCount; 
+
+    /* value setup */
+    length = I_entityValue->stop - I_entityValue->start;
+    valueByteLength = length;
+    s = NW_XML_Reader_DataAddressFromBuffer(pT, I_entityValue->start,
+                                         &valueByteLength, &bufPointer);
+    if (NW_STAT_IS_FAILURE(s)) {
+        return s;
+    }
+    if (valueByteLength != length) {
+        return NW_STAT_FAILURE;
+    }
+
+    /* Calculate the length of string. Also add the number of characters 
+     * required for the NULL termination.
+     */
+        
+    totalByteCount = length + numbytes;
+
+
+    pValue = (NW_Uint8*) NW_Mem_Malloc(totalByteCount);
+
+    if (pValue  != NULL) 
+     {
+      (void)NW_Mem_memcpy(pValue , bufPointer, length );
+
+
+       for(i=0; i < numbytes; i++)
+       {
+        pValue[length+i] = '\0';
+       }
+      } /*end if (pValue  != NULL)*/  
+     else
+     {
+      return NW_STAT_OUT_OF_MEMORY;
+     }
+
+  
+    if(pT->encoding != HTTP_iso_10646_ucs_2)
+    {
+     s = NW_String_byteToUCS2Char(pValue, length, &ucsValue);
+
+     if(s != NW_STAT_SUCCESS)
+     {
+      return s;
+     }
+     totalByteCount = 2*totalByteCount;
+    }/*end if(pT->encoding != HTTP_iso_10646_ucs_2)*/
+    else
+    {
+     ucsValue = (NW_Ucs2*) NW_Mem_Malloc(totalByteCount); 
+     (void)NW_Mem_memcpy(ucsValue, pValue, totalByteCount);
+
+    }
+     /*Now free the pValue */
+
+    if(pValue != NULL)
+    {
+     NW_Mem_Free(pValue);
+    }
+
+
+
+      //SSS: Comment me.
+/*
+    RFileLogger::WriteFormat(_L("Browser"), _L("xml_core.log"), 
+                         EFileLoggingModeAppend, _L("In_INT:Value=%s \n"), 
+                         ucsValue);
+*/
+
+
+
+     internalEntity->name  = ucsName;
+     internalEntity->value = ucsValue;
+
+    entryCount = internalEntityList->Count();
+
+    errorCode =  internalEntityList->Insert(internalEntity,entryCount);
+
+        if(errorCode != KErrNone)
+        {
+         return NW_STAT_FAILURE;
+        }
+
+        ///SSS:Comment me below.
+  /*
+   RFileLogger::WriteFormat(_L("Browser"), _L("xml_core.log"), 
+                         EFileLoggingModeAppend, _L("In_INT:Adding:nameLen=%d name=%s valueLen=%d value=%s \n"), 
+                         internalEntity->nameLen, internalEntity->name, 
+                         totalByteCount, internalEntity->value );
+
+  */
+ 
+
+
+
+    return NW_STAT_SUCCESS;
+
+ }/*end CXML_XML_Parser_Store_I_Entity*/
+
+  /** ----------------------------------------------------------------------- **
+    @function:    CXML_XML_Parser_Free_I_Entity_List
+    @synopsis:    Function to free the internal entity list.
+    @scope:       public      
+
+    @parameters: void
+        
+
+    @description: Function to free the internal entity list.
+
+    @returns:   
+                  void
+ -----------------------------------------------------------------------------------**/
+
+ void CXML_XML_Parser_Free_I_Entity_List(RPointerArray <CXML_Internal_Entity_t>  internalEntityList)
+ {
+  TInt count = 0;
+  NW_Int32 i = 0;
+  CXML_Internal_Entity_t* internalEntity=NULL;
+
+
+  count = internalEntityList.Count();
+
+  for(i=0; i < count; i++)
+    {
+     internalEntity = (CXML_Internal_Entity_t*) internalEntityList[i]; 
+
+     if(internalEntity != NULL)
+     {
+      /*   
+
+      RFileLogger::WriteFormat(_L("Browser"), _L("xml_core.log"), 
+                         EFileLoggingModeAppend, _L("Deleting: name=%s  value=%s \n"), 
+                         internalEntity->name, internalEntity->value );
+      */
+
+      NW_Mem_Free(internalEntity->name);
+      NW_Mem_Free(internalEntity->value);
+     }
+    } /*end for()*/
+ /* This will destroy the internal pointers */
+
+  internalEntityList.ResetAndDestroy();
+
+ }/*end CXML_XML_Parser_Free_I_Entity_List(void)*/
+
+
+  /** ----------------------------------------------------------------------- **
+    @function:    CXML_XML_Resolve_Internal_Entity
+    @synopsis:    Function to store the internal entity.
+    @scope:       public      
+
+    @parameters: 
+        [in] NW_Ucs2* entityName: Name of Entity
+                  
+
+        [out] CXML_Uint8** entityValStr
+                           If the entity name is the internal entity then this 
+                           contains the entiy value string otherwise NULL.
+                  
+
+
+        [out] NW_Bool* entityFound
+                  If it is internal entity then it is true otherwise false.
+        [in]  NW_Uint32 encoding:
+                   Original encoding of the buffer so that entityValStr contain 
+                   correct.
+
+        [in]  void* internalEntityList: Internal Entity list
+
+    @description: This extracts the Internal Entity name from the XML buffer
+                  and stores in the Link list.
+
+    @returns:   
+                  In case of file  related failures:  Error codes is returned defined in 
+				                                      nwx_status.h
+                  NW_STAT_FAILURE : For any general error and entity is not predefined 
+                                    entity.
+                  NW_STAT_SUCCESS: For success
+ -----------------------------------------------------------------------------------**/
+
+ NW_Status_t CXML_XML_Resolve_Internal_Entity(NW_Ucs2* entityName,
+                                              CXML_Uint8** entityValStr,
+                                              NW_Bool* entityFound,
+                                              NW_Uint32 encoding,
+                                              void* entityList)
+ {
+  NW_Uint32 entityNameByteCnt;
+  TInt count = 0;
+  CXML_Int32 i = 0;
+  CXML_Int32 strCmp;
+  NW_Ucs2*  valBuf;
+  NW_Uint32 valBufByteCnt = 0;
+  CXML_Internal_Entity_t* internalEntity=NULL;
+  RPointerArray <CXML_Internal_Entity_t>*  internalEntityList = (RPointerArray <CXML_Internal_Entity_t>*)  entityList;
+
+  *entityFound = NW_FALSE;
+
+
+
+  /* The entity name at time is always in the Ucs2 so fixed value is used below */
+
+ 
+  NW_Int32 entityNameLen = NW_String_charBuffGetLength((void*) entityName,
+                                              HTTP_iso_10646_ucs_2,
+                                              &entityNameByteCnt);
+
+  
+  (void) entityNameLen; //To remove the warning
+  count = internalEntityList->Count();
+
+  /* Now look for entity name in  "internalEntityList" */
+
+   for(i=0; i < count; i++)
+    {
+     internalEntity = (CXML_Internal_Entity_t*) (*internalEntityList)[i]; 
+      
+
+     if(internalEntity != NULL)
+     {
+      if(internalEntity->nameLen == entityNameByteCnt)
+      {
+       strCmp = CXML_Str_Stricmp( (const CXML_Ucs2 *)internalEntity->name, entityName);
+
+       if(strCmp == 0)
+       {
+         
+        valBuf = internalEntity->value ;
+        NW_Int32 valBufLen = NW_String_charBuffGetLength( (void*)internalEntity->value,
+                                                 HTTP_iso_10646_ucs_2,
+                                                 &valBufByteCnt);
+
+        if(valBuf != NULL)
+        {
+
+          
+         switch(encoding)
+         {
+          /* write the string based on the actual encoding.*/
+         case HTTP_utf_8:
+             *entityValStr = (NW_Byte*) CXML_Str_CvtToAscii(valBuf);
+             *entityFound = NW_TRUE;
+              break;
+
+         case HTTP_iso_8859_1:      
+         case HTTP_us_ascii:
+              *entityValStr = (NW_Byte*) CXML_Str_CvtToAscii(valBuf);
+              *entityFound = NW_TRUE;
+              break;
+         case HTTP_iso_10646_ucs_2:
+             *entityValStr = (CXML_Uint8*) NW_Mem_Malloc(valBufByteCnt);
+             if(*entityValStr == NULL)
+             {
+              return NW_STAT_OUT_OF_MEMORY;
+             }
+             CXML_Mem_memcpy((void*)*entityValStr,internalEntity->value,valBufByteCnt);
+             *entityFound = NW_TRUE;
+             break;
+         default:
+             //Some thing wrong so break
+             break;
+         }/*end switch(encoding)*/
+            
+            if(*entityFound == NW_TRUE)
+            {
+             break;
+            }
+        }/*end if(valBuf != NULL)*/
+       }/*end if(strCmp == 0)*/
+
+      }/*end if(internalEntity->nameLen = entityNameByteCnt)*/
+      
+     }/*end if(internalEntity != NULL)*/
+    } /*end for()*/
+
+
+   if(*entityFound == NW_FALSE)
+   {
+    /*If it is not a internal Entity */
+    *entityValStr = NULL;
+   }
+
+   ///SSS: This will be freed when Internal Entity Array is freed 
+   /*
+   if(valBuf != NULL)
+   {
+    NW_Mem_Free(valBuf);
+   }
+  */
+   return NW_STAT_SUCCESS;
+ }/*end CXML_XML_Resolve_Internal_Entity() */