--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrurlparserplugin/src/cesmrurlparserpluginimpl.cpp Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,330 @@
+/*
+* Copyright (c) 2008-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: Parser class for parsing landmarks to url and vice versa
+*
+*/
+
+
+
+#include "cesmrurlparserpluginimpl.h"
+#include "cmrurlparserextension.h"
+
+#include <EPos_CPosLandmark.h>
+#include <EPos_CPosLandmarkEncoder.h>
+#include <EPos_CPosLandmarkParser.h>
+#include <EPos_CPosLmOperation.h>
+#include <lbsposition.h>
+#include <escapeutils.h>
+#include <finditemengine.h>
+#include <calentry.h>
+
+#include "emailtrace.h"
+
+namespace
+{
+_LIT8( KLandmarkUrlMimeType, "maps.ovi.com" );
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::CESMRUrlParserPluginImpl
+// ---------------------------------------------------------------------------
+//
+CESMRUrlParserPluginImpl::CESMRUrlParserPluginImpl()
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRUrlParserPluginImpl* CESMRUrlParserPluginImpl::NewL()
+ {
+ FUNC_LOG;
+
+ CESMRUrlParserPluginImpl* self = CESMRUrlParserPluginImpl::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::NewLC
+// ---------------------------------------------------------------------------
+//
+CESMRUrlParserPluginImpl* CESMRUrlParserPluginImpl::NewLC()
+ {
+ FUNC_LOG;
+
+ CESMRUrlParserPluginImpl* self = new( ELeave ) CESMRUrlParserPluginImpl;
+ CleanupStack::PushL( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::~CESMRUrlParserPluginImpl
+// ---------------------------------------------------------------------------
+//
+CESMRUrlParserPluginImpl::~CESMRUrlParserPluginImpl()
+ {
+ FUNC_LOG;
+
+ delete iParser;
+ delete iEncoder;
+ delete iExtension;
+
+ ReleaseLandmarkResources();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::FindLocationUrl
+// Finds location URL from given text input
+// ---------------------------------------------------------------------------
+//
+TInt CESMRUrlParserPluginImpl::FindLocationUrl(
+ const TDesC& aText,
+ TPtrC& aUrl )
+
+ {
+ FUNC_LOG;
+
+ TInt pos(0);
+ TRAPD( error, DoFindLocationUrlL( aText, pos, aUrl ) );
+ if ( error != KErrNone )
+ {
+ return error;
+ }
+ else
+ {
+ return pos;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::CreateUrlFromLandmarkL
+// Creates location URL from landmark object
+// ---------------------------------------------------------------------------
+//
+HBufC* CESMRUrlParserPluginImpl::CreateUrlFromLandmarkL(
+ const CPosLandmark& aLandmark )
+ {
+ FUNC_LOG;
+
+ CPosLandmarkEncoder& encoder = InitializeEncoderL();
+ CBufBase* buffer = encoder.SetUseOutputBufferL();
+ CleanupStack::PushL( buffer );
+ encoder.AddLandmarkL( aLandmark );
+ CPosLmOperation* operation = encoder.FinalizeEncodingL();
+ ExecuteAndDeleteLD( operation );
+
+ // Convert URL to Unicode and escape encode non-ASCII characters
+ HBufC* unicode = EscapeUtils::ConvertToUnicodeFromUtf8L( buffer->Ptr( 0 ) );
+ CleanupStack::PushL( unicode );
+ HBufC* url = EscapeUtils::EscapeEncodeL( *unicode, EscapeUtils::EEscapeNormal );
+
+ CleanupStack::PopAndDestroy( 2, buffer ); // unicode
+
+ //Transfer ownership of url
+ return url;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::CreateLandmarkFromUrlL
+// Creates landmark object from location URL
+// ---------------------------------------------------------------------------
+//
+CPosLandmark* CESMRUrlParserPluginImpl::CreateLandmarkFromUrlL(
+ const TDesC& aUrl )
+ {
+ FUNC_LOG;
+
+ CPosLandmark* landmark = NULL;
+
+ // Try to create landmark using landmark parser
+ TRAPD( error, landmark = CreateLandmarkFromUrlInternalL( aUrl ) );
+
+ if ( error )
+ {
+ // Try extension
+ landmark = ExtensionL().CreateLandmarkFromUrlL( aUrl );
+ }
+
+ //transfer ownership
+ return landmark;
+ }
+
+// ----------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::CreateGeoValueLC
+// Converts URL to Calendar GEO property
+// ----------------------------------------------------------------------------
+//
+CCalGeoValue* CESMRUrlParserPluginImpl::CreateGeoValueLC( const TDesC& aUrl )
+ {
+ FUNC_LOG;
+
+ // Convert URL to landmark
+ CPosLandmark* landmark = CreateLandmarkFromUrlL( aUrl );
+ CleanupStack::PushL( landmark );
+
+ // Get position data from landmark
+ TLocality position;
+ User::LeaveIfError( landmark->GetPosition( position ) );
+ CleanupStack::PopAndDestroy( landmark );
+
+ // Convert position data to GEO value
+ CCalGeoValue* geoVal = CCalGeoValue::NewL();
+ CleanupStack::PushL( geoVal );
+ geoVal->SetLatLongL( position.Latitude(), position.Longitude() );
+
+ return geoVal;
+ }
+
+// ----------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::InitializeParserL
+// ----------------------------------------------------------------------------
+//
+CPosLandmarkParser& CESMRUrlParserPluginImpl::InitializeParserL()
+ {
+ FUNC_LOG;
+
+ if ( !iParser )
+ {
+ iParser = CPosLandmarkParser::NewL( KLandmarkUrlMimeType );
+ }
+
+ return *iParser;
+ }
+
+// ----------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::InitializeEncoderL
+// ----------------------------------------------------------------------------
+//
+CPosLandmarkEncoder& CESMRUrlParserPluginImpl::InitializeEncoderL()
+ {
+ FUNC_LOG;
+
+ delete iEncoder;
+ iEncoder = NULL;
+ iEncoder = CPosLandmarkEncoder::NewL( KLandmarkUrlMimeType );
+ return *iEncoder;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::DoFindLocationUrlL
+// Finds location URL from given text input
+// ---------------------------------------------------------------------------
+//
+
+void CESMRUrlParserPluginImpl::DoFindLocationUrlL(
+ const TDesC& aText,
+ TInt& aPos,
+ TPtrC& aUrl )
+ {
+ FUNC_LOG;
+
+ aPos = KErrNotFound;
+ aUrl.Set( KNullDesC );
+
+ // Search URL from given text
+ CFindItemEngine* itemEngine = CFindItemEngine::NewL(
+ aText,
+ CFindItemEngine::EFindItemSearchURLBin );
+ CleanupStack::PushL (itemEngine );
+
+ // For each found item
+ CFindItemEngine::SFoundItem item;
+ itemEngine->Item( item );
+
+ TInt itemCount = itemEngine->ItemCount();
+ for ( TInt i = 0; i < itemCount; ++i )
+ {
+ TPtrC url = aText.Mid( item.iStartPos, item.iLength );
+
+ CPosLandmark* landmark = NULL;
+ TRAPD( error, landmark = CreateLandmarkFromUrlL( url ); )
+ delete landmark;
+
+ if ( !error ) // Location url found
+ {
+ aPos = item.iStartPos;
+ aUrl.Set( url );
+ // Stop iteration
+ break;
+ }
+ else
+ {
+ itemEngine->NextItem( item );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( itemEngine );
+
+ if ( aPos < 0 )
+ {
+ ExtensionL().FindLocationUrlL( aText, aUrl, aPos );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::ExtensionL
+// ---------------------------------------------------------------------------
+//
+CMRUrlParserExtension& CESMRUrlParserPluginImpl::ExtensionL()
+ {
+ FUNC_LOG;
+
+ if ( !iExtension )
+ {
+ iExtension = CMRUrlParserExtension::NewL();
+ }
+
+ return *iExtension;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRUrlParserPluginImpl::CreateLandmarkFromUrlInternalL
+// Creates landmark object from location URL
+// ---------------------------------------------------------------------------
+//
+CPosLandmark* CESMRUrlParserPluginImpl::CreateLandmarkFromUrlInternalL(
+ const TDesC& aUrl )
+ {
+ FUNC_LOG;
+
+ // Decode URL and convert it to UTF-8 format
+ HBufC* decodedUrl = EscapeUtils::EscapeDecodeL( aUrl );
+ CleanupStack::PushL( decodedUrl );
+ HBufC8* url = EscapeUtils::ConvertFromUnicodeToUtf8L( *decodedUrl );
+ CleanupStack::PopAndDestroy( decodedUrl );
+ CleanupStack::PushL( url );
+
+ // Create landmark using correct parser
+ CPosLandmarkParser& parser = InitializeParserL();
+ parser.SetInputBuffer( *url );
+ CPosLmOperation* operation = parser.ParseContentL();
+ ExecuteAndDeleteLD( operation );
+ CPosLandmark* landmark = parser.LandmarkLC();
+ CleanupStack::Pop( landmark );
+ CleanupStack::PopAndDestroy( url );
+
+ //transfer ownership
+ return landmark;
+ }
+
+//EOF
+