creator/src/creator_randomdataparser.cpp
changeset 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/src/creator_randomdataparser.cpp	Tue Feb 02 00:17:27 2010 +0200
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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 <utf.h>
+#include <xml/documentparameters.h>
+#include "creator_randomdataparser.h"
+#include "creator_traces.h"
+
+// XML element names
+_LIT(KRootElement, "creatordata");
+_LIT(KFirstName, "firstname");
+_LIT(KSurname, "surname");
+_LIT(KCompany, "company");
+_LIT(KAddress, "address");
+_LIT(KJobTitle, "jobtitle");
+_LIT(KPhoneNumber, "phonenumber");
+_LIT(KGroupName, "groupname");
+_LIT(KMeetingReason, "meetingreason");
+_LIT(KMeetingPlace, "meetingplace");
+_LIT(KMemoText, "memo");
+_LIT(KAnniversaryReason, "anniversary");
+_LIT(KToDoText, "todo");
+_LIT(KReminderText, "reminder");
+_LIT(KMessageSubject, "messagesubject");
+_LIT(KMessageText, "messagetext");
+_LIT(KCity, "city");
+_LIT(KCountry, "country");
+_LIT(KPostcode, "postcode");
+_LIT(KState, "state");
+_LIT(KPobox, "pobox");
+_LIT(KPrefix, "prefix");
+_LIT(KSuffix, "suffix");
+_LIT(KLandmarkName, "landmarkname");
+_LIT(KLandmarkDescription, "landmarkdescription");
+
+using namespace Xml;
+
+CCreatorRandomDataParser::CCreatorRandomDataParser() 
+    {        
+    }
+
+void CCreatorRandomDataParser::ConstructL()
+    {
+    LOGSTRING("Creator: CCreatorRandomDataParser::ConstructL");
+	iElementNameArray = new (ELeave) CDesCArrayFlat(32);
+	iElementNameArray->InsertL(EFirstName, KFirstName);
+	iElementNameArray->InsertL(ESurname, KSurname);
+	iElementNameArray->InsertL(ECompany, KCompany);
+	iElementNameArray->InsertL(EAddress, KAddress);
+	iElementNameArray->InsertL(EJobTitle, KJobTitle);
+	iElementNameArray->InsertL(EPhoneNumber, KPhoneNumber);
+	iElementNameArray->InsertL(EGroupName, KGroupName);
+	iElementNameArray->InsertL(EMeetingReason, KMeetingReason);
+	iElementNameArray->InsertL(EMeetingPlace, KMeetingPlace);
+	iElementNameArray->InsertL(EMemoText, KMemoText);
+	iElementNameArray->InsertL(EAnniversaryReason, KAnniversaryReason);
+	iElementNameArray->InsertL(EToDoText, KToDoText);
+	iElementNameArray->InsertL(EReminderText, KReminderText);
+	iElementNameArray->InsertL(EMessageSubject, KMessageSubject);
+	iElementNameArray->InsertL(EMessageText, KMessageText);
+	iElementNameArray->InsertL(ECity, KCity);
+	iElementNameArray->InsertL(ECountry, KCountry);
+	iElementNameArray->InsertL(EPostcode, KPostcode);
+	iElementNameArray->InsertL(EState, KState);
+	iElementNameArray->InsertL(EPobox, KPobox);
+	iElementNameArray->InsertL(EPrefix, KPrefix);
+	iElementNameArray->InsertL(ESuffix, KSuffix);
+	iElementNameArray->InsertL(ELandmarkName, KLandmarkName);
+	iElementNameArray->InsertL(ELandmarkDescription, KLandmarkDescription);
+	iContentData = HBufC::NewL(16);
+    iResultArray = new (ELeave) CDesCArrayFlat(16);
+    }
+
+CCreatorRandomDataParser* CCreatorRandomDataParser::NewL()
+    {
+    LOGSTRING("Creator: CCreatorRandomDataParser::NewL");
+    CCreatorRandomDataParser* self = CCreatorRandomDataParser::NewLC();    
+    CleanupStack::Pop();
+    return self;
+    }
+
+CCreatorRandomDataParser* CCreatorRandomDataParser::NewLC()
+    {
+    LOGSTRING("Creator: CCreatorRandomDataParser::NewLC");
+    CCreatorRandomDataParser* self = new (ELeave) CCreatorRandomDataParser;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+CCreatorRandomDataParser::~CCreatorRandomDataParser()
+    {
+    delete iParser;
+    delete iResultArray;
+    delete iContentData;
+    delete iElementNameArray;
+    }
+
+void CCreatorRandomDataParser::GetTextFileMode(RFile& aFile, TInt& aFileSize) 
+    { 
+    LOGSTRING("Creator: CCreatorRandomDataParser::GetTextFileMode");
+    iScriptTextFormat = EFormatANSIASCII; 
+
+    // if we are working with text files, check the type first   
+    TBuf8<4> BOM; 
+
+    // first check for UTF-16 
+    if (aFileSize >= 2 && aFile.Read(0, BOM, 2) == KErrNone) 
+        { 
+        if (BOM.Length()==2 && BOM[0]==0xFF && BOM[1]==0xFE) 
+            { 
+            iScriptTextFormat = EFormatUTF16LE; 
+            aFileSize -= 2; 
+            return; 
+            } 
+        else if (BOM.Length()==2 && BOM[0]==0xFE && BOM[1]==0xFF) 
+            { 
+            iScriptTextFormat = EFormatUTF16BE; 
+            aFileSize -= 2; 
+            return;                 
+            }       
+        }
+        // then check for UTF-8 
+    if (aFileSize >= 3 && aFile.Read(0, BOM, 3) == KErrNone) 
+        { 
+        if (BOM.Length()==3 && BOM[0]==0xEF && BOM[1]==0xBB && BOM[2]==0xBF) 
+            { 
+            iScriptTextFormat = EFormatUTF8; 
+            aFileSize -= 3; 
+            return; 
+            } 
+        }
+        
+    // none of those, seek back to beginning 
+    TInt pos(0); 
+    aFile.Seek(ESeekStart, pos); 
+    }    
+ 
+
+
+CDesCArrayFlat* CCreatorRandomDataParser::ParseL(const TDesC& aFileName, const TRandomDataType aDataType)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::ParseL: %S", &aFileName);
+    
+    iDataType = aDataType;
+    
+    // Create and start XML-parser
+    if( iParser == 0)
+        {
+        _LIT8(KXmlMimeType, "text/xml");
+        iParser = CParser::NewL(KXmlMimeType, *this);        
+        }
+
+    RFs filesession;
+    CleanupClosePushL(filesession);
+    User::LeaveIfError( filesession.Connect() );
+    
+    iResultArray->Reset();
+    
+    Xml::ParseL(*iParser, filesession, aFileName);
+    
+    CleanupStack::PopAndDestroy(&filesession); // filesession 
+    
+    CDesCArrayFlat* tempArray = new (ELeave) CDesCArrayFlat(8);
+    CleanupStack::PushL(tempArray);
+    for (TInt i = 0; i < iResultArray->MdcaCount(); i++)
+    	{
+    	tempArray->AppendL(iResultArray->MdcaPoint(i));
+    	}
+    CleanupStack::Pop(tempArray);
+    return tempArray;
+    }
+
+void CCreatorRandomDataParser::OnStartDocumentL(const Xml::RDocumentParameters& /*aDocParam*/, TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnStartDocumentL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);    
+    iInsideRootElement = EFalse;
+	iContentParsingActive = EFalse;
+    }
+
+void CCreatorRandomDataParser::OnEndDocumentL(TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnEndDocumentL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    }
+
+void CCreatorRandomDataParser::OnStartPrefixMappingL(const RString& /*aPrefix*/, 
+                                                     const RString& /*aUri*/, 
+                                                     TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnStartPrefixMappingL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    }
+
+void CCreatorRandomDataParser::OnEndPrefixMappingL(const RString& /*aPrefix*/, TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnEndPrefixMappingL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    }
+
+void CCreatorRandomDataParser::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/, TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnIgnorableWhiteSpaceL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    }
+
+void CCreatorRandomDataParser::OnSkippedEntityL(const RString& /*aName*/, TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnSkippedEntityL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    }
+
+void CCreatorRandomDataParser::OnProcessingInstructionL(const TDesC8& /*aTarget*/, 
+                                                        const TDesC8& /*aData*/, 
+                                                        TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnProcessingInstructionL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    }
+
+void CCreatorRandomDataParser::OnError(TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnError: %d", aErrorCode);
+    
+    iLastError = aErrorCode;
+    }
+
+TAny* CCreatorRandomDataParser::GetExtendedInterface(const TInt32 aUid)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::GetExtendedInterface (UID: %d)", aUid);
+    return this;
+    }
+
+void CCreatorRandomDataParser::OnStartElementL(const Xml::RTagInfo& aElement,
+                                               const Xml::RAttributeArray& /*aAttributes*/,
+                                               TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnStartElementL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+
+    const TDesC8& elementName8 = aElement.LocalName().DesC();        
+    HBufC* elementName16 = Convert8BitTo16BitLC(elementName8);
+    if (iInsideRootElement || (elementName16->Des() == KRootElement))
+    	{
+    	iInsideRootElement = ETrue;
+    	}
+    if (iInsideRootElement && (elementName16->Des() == iElementNameArray->MdcaPoint(iDataType)))
+    	{
+        iContentParsingActive = ETrue;
+        iContentData->Des().Zero();
+    	}
+    CleanupStack::PopAndDestroy(elementName16);
+    }
+
+void CCreatorRandomDataParser::OnEndElementL(const Xml::RTagInfo& aElement, TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnEndElementL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+
+    const TDesC8& elementName8 = aElement.LocalName().DesC();
+    HBufC* elementName16 = Convert8BitTo16BitLC(elementName8);
+    if (!iInsideRootElement || (elementName16->Des() == KRootElement))
+    	{
+    	iInsideRootElement = EFalse;
+    	}
+    CleanupStack::PopAndDestroy(elementName16);
+
+    if (iContentParsingActive)
+		{
+	    if (iContentData->Des().Length() > 0)
+	    	{
+	    	iResultArray->AppendL(*iContentData);
+	    	}
+        iContentParsingActive = EFalse;
+		}
+    }
+
+void CCreatorRandomDataParser::OnContentL(const TDesC8& aBytes, TInt aErrorCode)
+    {
+    LOGSTRING2("Creator: CCreatorRandomDataParser::OnContentL (Error code: %d)", aErrorCode);
+    User::LeaveIfError(aErrorCode);
+    
+    if (iContentParsingActive)
+    	{
+        HBufC* data16 = Convert8BitTo16BitLC(aBytes);
+        TInt newLen = iContentData->Des().Length() + data16->Des().Length();
+        iContentData = iContentData->ReAllocL(newLen);
+        iContentData->Des().Append(*data16);
+        CleanupStack::PopAndDestroy(data16);
+    	}
+    }
+
+HBufC16* CCreatorRandomDataParser::Convert8BitTo16BitLC(const TDesC8& aInput) 
+    {     
+    LOGSTRING("Creator: CCreatorRandomDataParser::Convert8BitTo16BitLC");
+    HBufC16* output = NULL;
+    
+    output = CnvUtfConverter::ConvertToUnicodeFromUtf8L(aInput);
+    
+    CleanupStack::PushL(output);
+    return output;          
+    } 
+
+TInt CCreatorRandomDataParser::GetError() const 
+	{
+    return iLastError;
+	}