--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/accountcreationplugin/engine/src/acpxmlhandler.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,509 @@
+/*
+* Copyright (c) 2007-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: Implements CAcpXmlHandler methods
+*
+*/
+
+
+#include <escapeutils.h>
+#include "acpprovider.h"
+#include "acpxmlhandler.h"
+#include "accountcreationpluginlogger.h"
+#include "macpxmlhandlerobserver.h"
+#include "accountcreationengineconstants.h"
+
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::CAcpXmlHandler
+// ---------------------------------------------------------------------------
+//
+CAcpXmlHandler::CAcpXmlHandler( MAcpXmlHandlerObserver& aObserver )
+ : CActive( EPriorityStandard ),
+ iObserver( aObserver )
+ {
+ // Add active scheduler.
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::ConstructL()
+ {
+ ACPLOG( "CAcpXmlHandler::ConstructL begin" );
+ // Create XML parser
+ iParser = CParser::NewL( KXmlMimeType, *this );
+ ACPLOG( "CAcpXmlHandler::ConstructL end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::NewL
+// ---------------------------------------------------------------------------
+//
+CAcpXmlHandler* CAcpXmlHandler::NewL( MAcpXmlHandlerObserver& aObserver )
+ {
+ CAcpXmlHandler* self = CAcpXmlHandler::NewLC( aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::NewLC
+// ---------------------------------------------------------------------------
+//
+CAcpXmlHandler* CAcpXmlHandler::NewLC( MAcpXmlHandlerObserver& aObserver )
+ {
+ CAcpXmlHandler* self = new ( ELeave ) CAcpXmlHandler( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::~CAcpXmlHandler
+// ---------------------------------------------------------------------------
+//
+CAcpXmlHandler::~CAcpXmlHandler()
+ {
+ ACPLOG( "CAcpXmlHandler::~CAcpXmlHandler begin" );
+
+ Cancel(); // Ensures that the parsing is stopped
+ delete iParser;
+ delete iBuffer;
+ delete iOngoingAttr;
+ delete iProvider;
+
+ ACPLOG( "CAcpXmlHandler::~CAcpXmlHandler end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::StartParsingL
+// Starts parsing xml with given filename.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::StartParsingL( const TFileName& aFilename )
+ {
+ ACPLOG( "CAcpXmlHandler::StartParsingL begin" );
+
+ // Save the filename because of deleting file later on.
+ iFilename.Append( aFilename );
+
+ // Leave if parsing is active.
+ if ( IsActive() )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ // Connect to fileserver and open xml file to be parsed.
+ User::LeaveIfError( iFileServer.Connect() );
+ User::LeaveIfError( iFile.Open( iFileServer, aFilename, EFileRead ) );
+
+ delete iBuffer;
+ iBuffer = NULL;
+
+ TEntry entry;
+
+ // Get size of file.
+ User::LeaveIfError( iFileServer.Entry( aFilename, entry ) );
+
+ TInt fileSize = entry.iSize;
+
+ // Create buffer for file reading and start process.
+ iBuffer = HBufC8::NewL( fileSize );
+
+ TPtr8 ptr( iBuffer->Des() );
+ ptr.Zero();
+
+ iFile.Read( ptr, fileSize, iStatus );
+ SetActive();
+
+ iParser->ParseBeginL();
+
+ ACPLOG( "CAcpXmlHandler::StartParsingL end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::HandleFinishedProviderL
+// Handles finished provider and notifies observer.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::HandleFinishedProviderL()
+ {
+ ACPLOG( "CAcpXmlHandler::HandleFinishedProviderL" );
+
+ // Provider exists, save it by calling observer.
+ if ( iProvider )
+ {
+ iObserver.NotifyParsedProviderL( *iProvider );
+ delete iProvider;
+ iProvider = NULL;
+ }
+
+ // Start new provider by creating instance from CAcpProvider.
+ iProvider = CAcpProvider::NewL();
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::DoCancel
+// From CActive.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::DoCancel()
+ {
+ ACPLOG( "CAcpXmlHandler::DoCancel begin" );
+
+ ACPLOG( "CAcpXmlHandler::DoCancel - ReadCancel" );
+ iFile.ReadCancel();
+
+ TRAP_IGNORE( iParser->ParseEndL() );
+
+ iFileServer.Delete( iFilename ); // Delete old file
+
+ iFile.Close();
+ iFileServer.Close();
+
+ delete iBuffer;
+ iBuffer = NULL;
+
+ delete iOngoingAttr;
+ iOngoingAttr = NULL;
+
+ ACPLOG( "CAcpXmlHandler::DoCancel end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::RunL
+// From CActive.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::RunL()
+ {
+ ACPLOG( "CAcpXmlHandler::RunL begin" );
+
+ if ( KErrNone == iStatus.Int() )
+ {
+ // When buffer length is zero, we have reached end of the document.
+ if ( !iBuffer->Length() )
+ {
+ ACPLOG( " - end of XML document reached" );
+ DoCancel();
+ }
+ // Otherwise continue reading of Xml file.
+ else
+ {
+ iParser->ParseL( *iBuffer );
+ TPtr8 ptr( iBuffer->Des() );
+ iFile.Read( ptr, iStatus );
+ SetActive();
+ ACPLOG( " - continuing reading XML document" );
+ }
+ }
+ else
+ {
+ iObserver.NotifyParsingCompleted( iStatus.Int() );
+ }
+
+ ACPLOG( "CAcpXmlHandler::RunL end" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnStartDocumentL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnStartDocumentL(
+ const RDocumentParameters& /*aDocParam*/,
+ TInt aErrorCode )
+ {
+ if ( KErrNone != aErrorCode )
+ {
+ ACPLOG2( "CAcpXmlHandler::OnStartDocumentL: error=%d", aErrorCode );
+ iObserver.NotifyParsingCompleted( aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnEndDocumentL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnEndDocumentL( TInt aErrorCode )
+ {
+ ACPLOG2( "CAcpXmlHandler::OnEndDocumentL begin: error=%d", aErrorCode );
+
+ if ( KErrNone == aErrorCode )
+ {
+ // Save last one.
+ HandleFinishedProviderL();
+ delete iProvider;
+ iProvider = NULL;
+ }
+
+ iObserver.NotifyParsingCompleted( aErrorCode );
+
+ ACPLOG( "CAcpXmlHandler::OnEndDocumentL end" );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnStartElementL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnStartElementL(
+ const RTagInfo& aElement,
+ const RAttributeArray& ,
+ TInt aErrorCode )
+ {
+ TBuf<KMaxElementLength>element;
+ element.Copy(aElement.LocalName().DesC());
+
+ ACPLOG2( "CAcpXmlHandler::OnStartElementL: element=%S", &element );
+ ACPLOG2( "CAcpXmlHandler::OnStartElementL: error=%d", aErrorCode );
+
+ if ( KErrNone == aErrorCode )
+ {
+ // No need to go through attributes since they're not used.
+ // Parsing has reached to some of supported elements.
+ // Save element value to member data for further actions.
+ TPtrC8 ptr = aElement.LocalName().DesC();
+
+ if ( !ptr.Compare( KServiceProvider ) ||
+ !ptr.Compare( KProviderName ) ||
+ !ptr.Compare( KIconUrl ) ||
+ !ptr.Compare( KSisUrl ) ||
+ !ptr.Compare( KCreateUrl ) ||
+ !ptr.Compare( KActivateUrl ) ||
+ !ptr.Compare( KProviderDescription ) ||
+ !ptr.Compare( KProviderType ) ||
+ !ptr.Compare( KReportUrl ) )
+ {
+ iOngoingAttr = HBufC8::NewL( ptr.Length() );
+ iOngoingAttr->Des().Copy( ptr );
+ iGetContentNow = ETrue;
+ // just for creating provider
+ if ( !ptr.Compare( KServiceProvider ) )
+ {
+ iGetContentNow = EFalse;
+ }
+ }
+
+ if ( iOngoingAttr )
+ {
+ // Parsing of provider has been started.
+ // This means that old provider is ready for saving
+ // if it's not first one. In that case, new provider is started.
+ if ( !iOngoingAttr->Compare( KServiceProvider ) )
+ {
+ HandleFinishedProviderL();
+ delete iOngoingAttr;
+ iOngoingAttr = NULL;
+ }
+ }
+ }
+ else
+ {
+ ACPLOG2( "CAcpXmlHandler::OnStartElementL: error=%d", aErrorCode );
+ iObserver.NotifyParsingCompleted( aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnEndElementL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnEndElementL( const RTagInfo& /*aElement*/,
+ TInt aErrorCode )
+ {
+ if ( KErrNone == aErrorCode )
+ {
+ // Reset member variables.
+ iGetContentNow = EFalse;
+
+ delete iOngoingAttr;
+ iOngoingAttr = NULL;
+ }
+ else
+ {
+ ACPLOG2( "CAcpXmlHandler::OnEndElementL: error=%d", aErrorCode );
+ iObserver.NotifyParsingCompleted( aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnContentL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnContentL( const TDesC8& aBytes, TInt aErrorCode )
+ {
+ if ( KErrNone == aErrorCode )
+ {
+ ACPLOG( "CAcpXmlHandler::OnContentL" );
+ // We need to save content data if iGetContentNow is set.
+ if ( iGetContentNow )
+ {
+ // Convert unicode data to 16-bit descriptor.
+ HBufC* bytes = EscapeUtils::ConvertToUnicodeFromUtf8L( aBytes );
+
+ // On the cleanup stack
+ CleanupStack::PushL( bytes );
+
+ ACPLOG2( "CAcpXmlHandler::OnContentL: aBytes=%S", bytes );
+
+ // Provider name.
+ if ( !iOngoingAttr->Compare( KProviderName ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetProviderNameL" );
+ iProvider->SetProviderNameL( *bytes );
+ }
+ // Location of icons package.
+ else if ( !iOngoingAttr->Compare( KIconUrl ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetIconUrlL" );
+ iProvider->SetIconUrlL( aBytes );
+ }
+ // Location of sis package.
+ else if ( !iOngoingAttr->Compare( KSisUrl ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetSisUrlL" );
+ iProvider->SetSisUrlL( aBytes );
+ }
+ // Location to create settings.
+ else if ( !iOngoingAttr->Compare( KCreateUrl ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetCreationUrlL" );
+ iProvider->SetCreationUrlL( aBytes );
+ }
+ // Location to activate settings.
+ else if ( !iOngoingAttr->Compare( KActivateUrl ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetActivationUrlL" );
+ iProvider->SetActivationUrlL( aBytes );
+ }
+ // Provider description.
+ else if ( !iOngoingAttr->Compare( KProviderDescription ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetProviderDescription" );
+ iProvider->SetProviderDescriptionL( *bytes );
+ }
+ // Provider type.
+ else if ( !iOngoingAttr->Compare( KProviderType ) )
+ {
+ ACPLOG( "CAcpXmlHandler::SetProviderType" );
+ iProvider->SetProviderTypeL( *bytes );
+ }
+ // Location to activate settings.
+ else if ( !iOngoingAttr->Compare( KReportUrl ) )
+ {
+ ACPLOG( " - Provider report url ignored" );
+ }
+ // Should never happen.
+ else
+ {
+ User::Leave( KErrNotSupported );
+ }
+ CleanupStack::PopAndDestroy( bytes );
+ }
+ }
+ else
+ {
+ ACPLOG2( "CAcpXmlHandler::OnContentL: error=%d", aErrorCode );
+ iObserver.NotifyParsingCompleted( aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnStartPrefixMappingL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnStartPrefixMappingL(
+ const RString& /*aPrefix*/,
+ const RString& /*aUri*/,
+ TInt /*aErrorCode*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnEndPrefixMappingL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnEndPrefixMappingL(
+ const RString& /*aPrefix*/,
+ TInt /*aErrorCode*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnIgnorableWhiteSpaceL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnIgnorableWhiteSpaceL(
+ const TDesC8& /*aBytes*/,
+ TInt /*aErrorCode*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnSkippedEntityL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnSkippedEntityL(
+ const RString& /*aName*/,
+ TInt /*aErrorCode*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnProcessingInstructionL
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnProcessingInstructionL(
+ const TDesC8& /*aTarget*/,
+ const TDesC8& /*aData*/,
+ TInt /*aErrorCode*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::OnError
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+void CAcpXmlHandler::OnError( TInt aErrorCode )
+ {
+ ACPLOG2( "CAcpXmlHandler::OnError: error=%d", aErrorCode );
+
+ // Send a notification that the parsing stopped because of error.
+ iObserver.NotifyParsingCompleted( aErrorCode );
+ }
+
+// ---------------------------------------------------------------------------
+// CAcpXmlHandler::GetExtendedInterface
+// From MContentHandler.
+// ---------------------------------------------------------------------------
+//
+TAny* CAcpXmlHandler::GetExtendedInterface( const TInt32 /*aUid*/ )
+ {
+ return NULL;
+ }
+
+// End of file.