xml/cxmllibrary/src/utils/src/cxml_file_if.cpp
branchRCL_3
changeset 20 889504eac4fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/cxmllibrary/src/utils/src/cxml_file_if.cpp	Tue Aug 31 17:02:56 2010 +0300
@@ -0,0 +1,169 @@
+/*
+* 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: 
+*
+*/
+
+
+
+#include <f32file.h>
+#include <xml/cxml/cxml_file_if.h>
+#include <xml/cxml/nw_string_char.h>
+
+
+//
+//CXML_Read_From_File()
+//
+
+EXPORT_C
+NW_Status_t CXML_Read_From_File(
+				   NW_Byte* input_file,NW_Uint8** buffer, NW_Int32* bufferLen)
+{
+  RFile file;
+  RFs aSession;
+  TInt fileErr;
+  CXML_Uint32 fileNameByteCnt;
+  TInt fileNameLen; 
+  NW_Status_t retVal =  NW_STAT_SUCCESS;
+  TUint16* fileName;
+  TInt i;
+  TInt err = KErrNone;
+  HBufC8*  inBuf;
+  CXML_Uint8* bufPtr;
+  TPtr8 inBufDes(NULL,0);
+
+
+  if( (input_file == NULL) || (buffer == NULL) || (bufferLen == NULL) )
+  {
+	retVal = NW_STAT_FAILURE;
+	return retVal;
+  }
+
+  *bufferLen = -1; //Default value
+
+  err = aSession.Connect();
+  if(KErrNone != err)
+  {
+	retVal = NW_STAT_FAILURE;
+	return retVal;  	
+  }
+  fileNameLen = NW_String_charBuffGetLength(input_file,HTTP_us_ascii,&fileNameByteCnt);
+
+  
+  //This is required for TPtrC
+
+  fileName = new TUint16[fileNameLen];
+
+  if(fileName == NULL)
+  {
+   retVal = NW_STAT_OUT_OF_MEMORY;
+   return retVal;
+  }
+
+
+  for(i=0; i < fileNameLen; i++)
+  {
+	  fileName[i] = input_file[i];
+  }
+
+  TPtrC inFileN(fileName,fileNameLen);
+
+  fileErr = file.Open(aSession,inFileN,EFileRead);
+
+  if ( fileErr != KErrNone )	
+  {
+    retVal = NW_STAT_FILE_NOT_OPEN; 
+	delete[] fileName;
+	return retVal;
+  }
+  
+
+    TInt fileSize;
+	
+  //Get File Size
+
+  fileErr = file.Size( fileSize );
+
+  if(fileErr != KErrNone )	
+  {
+    retVal = NW_STAT_UNEXPECTED_ERROR;
+	delete[] fileName;
+	file.Close();
+	return retVal;
+  }
+
+  *bufferLen = fileSize;
+
+  // Allocate buffer to read the cXML FILE contents
+
+   inBuf = HBufC8::New(fileSize);
+
+   //Get the pointer to heap object
+
+   inBufDes.Set(inBuf->Des()) ;
+
+  if(inBuf)
+  {
+	  
+	  //Now read the file
+
+      fileErr = file.Read(inBufDes);
+
+	  
+     if(fileErr != KErrNone )	
+	 {
+      delete inBuf;  //TODO: Change to more meaningful error
+	  delete[] fileName;
+	  file.Close();
+	  *bufferLen = -1;
+	  retVal = NW_STAT_FILE_READ_ERROR;
+	  return retVal;	
+	 }
+  }
+  else
+  {
+	delete[] fileName;
+	file.Close();
+	*bufferLen = -1;
+	retVal = NW_STAT_FAILURE;
+	return retVal;
+  }
+
+  
+  //Allocate the buffer and copy the contents to this
+
+  *buffer = new CXML_Byte[fileSize];
+
+
+  if(*buffer == NULL)
+  {
+   retVal = NW_STAT_OUT_OF_MEMORY;
+   return retVal;
+  }
+
+
+  bufPtr = (CXML_Byte*) inBuf->Ptr(); //Get pointer to the data
+
+   for(i=0; i < fileSize; i++)
+	{
+	  (*buffer)[i] = bufPtr[i];
+	}
+
+  delete inBuf;
+  delete[] fileName;
+  file.Close();
+  aSession.Close();
+  return retVal;
+ 
+}//end CXMLTestParser::CXML_Read_From_File()