phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkVCardPropertyParser.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkVCardPropertyParser.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,224 @@
+/*
+* Copyright (c) 2006-2007 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:  Parsing one CParserProperty into the TVPbkFieldVersitProperty
+*
+*/
+
+
+// Internal includes
+#include "CVPbkVCardPropertyParser.h"
+#include "CVPbkVCardContactFieldIterator.h"
+#include "TVPbkMappingsFindTool.h"
+#include "CVPbkVCardData.h"
+#include "CVPbkVCardFieldTypeProperty.h"
+#include "CVPbkVCardAttributeHandler.h"
+#include "VPbkVCardEngError.h"
+#include "CVPbkVCardParser.h"
+
+// System includes
+#include <vcard.h>
+
+// Local definitions
+namespace 
+    {
+    const TInt KAtFirstIndex ( 0 );
+    } // unnamed namespace
+
+CVPbkVCardPropertyParser* CVPbkVCardPropertyParser::NewL(
+    CVPbkVCardData& aData, CVPbkVCardAttributeHandler& aAttributeHandler)
+    {
+    CVPbkVCardPropertyParser* self = new (ELeave) 
+        CVPbkVCardPropertyParser(aData, aAttributeHandler);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+CVPbkVCardPropertyParser::CVPbkVCardPropertyParser(
+    CVPbkVCardData& aData, CVPbkVCardAttributeHandler& aAttributeHandler)
+:   iData( aData ), iAttributeHandler( aAttributeHandler )
+    {
+    }
+    
+void CVPbkVCardPropertyParser::ConstructL()
+    {
+    // Do nothing
+    }
+    
+CVPbkVCardPropertyParser::~CVPbkVCardPropertyParser()
+    {
+    }
+    
+CVPbkVCardContactFieldIterator* CVPbkVCardPropertyParser::ParseNextL( CParserProperty* aProperty )
+    {
+    iCurrentProperty = aProperty;
+    return ComposeVersitPropertyL();
+    }
+    
+CVPbkVCardContactFieldIterator* CVPbkVCardPropertyParser::ComposeVersitPropertyL()
+    {
+    CVPbkVCardContactFieldIterator* iterator = 
+        CVPbkVCardContactFieldIterator::NewLC( *iCurrentProperty, iData );
+    if ( !Ignore( iCurrentProperty ) )
+        {
+        ResolveNameL( iCurrentProperty, *iterator );
+        ResolveParamsL( iCurrentProperty, *iterator );
+        ResolveSubfieldsL( iCurrentProperty, *iterator );
+        }    
+    
+    CleanupStack::Pop(); // iterator
+    return iterator;
+    }
+    
+TBool CVPbkVCardPropertyParser::Ignore( CParserProperty* aProperty )
+    {
+    // Check if this property is BEGIN/END/VERSION token
+    if ( aProperty->NameUid() == TUid::Uid( KVersitTokenBeginUid ) ||
+         aProperty->NameUid() == TUid::Uid( KVersitTokenEndUid ) ||
+         aProperty->NameUid() == TUid::Uid( KVersitTokenVersionUid ) )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+    
+void CVPbkVCardPropertyParser::ResolveNameL( CParserProperty* aProperty, 
+    CVPbkVCardContactFieldIterator& /*aIterator*/ )
+    {
+    HBufC8* name = ConvertToUpperCaseLC( aProperty->Name() );
+
+    iVersitProperty.SetName( 
+        static_cast<TVPbkFieldTypeName>(
+            TVPbkMappingsFindTool::FindIdByName( *name, 
+                                   iData.VNameIdNameMappings() ) ) );
+    // Set extension name if exists
+    // All VCard properties
+    for ( TInt i = 0; i < iData.Properties().Count(); ++i )
+        {
+        CVPbkVCardFieldTypeProperty* vcardProperty = iData.Properties()[ i ];
+        if ( vcardProperty->Name().Compare( *name ) == 0 )
+            {
+            const TVPbkVCardIndexedProperty& indexedProperty = 
+                vcardProperty->IndexedPropertyAt( KAtFirstIndex );                  
+            
+            // Add extension name
+            if ( indexedProperty.Property().ExtensionName().Length() > 0 )
+                {
+                iVersitProperty.SetExtensionName
+                    ( indexedProperty.Property().ExtensionName() );
+                break;
+                }
+            }
+        }    
+    CleanupStack::PopAndDestroy( name );
+    }
+    
+void CVPbkVCardPropertyParser::ResolveParamsL( CParserProperty* aProperty,
+    CVPbkVCardContactFieldIterator& aIterator )
+    {
+    TArray< CVPbkVCardIdNameMapping* > paramArray = 
+                                            iData.ParamIdNameMappings();
+    TVPbkFieldTypeParameters parameters;
+
+    for ( TInt n = 0; n < paramArray.Count(); ++n )
+        {
+        CParserParam* param = aProperty->Param( paramArray[ n ]->Name() );        
+        if ( param )
+            {
+            HBufC8* name = ConvertToUpperCaseLC( param->Name() );
+
+            TVPbkFieldTypeParameter fieldTypeParam = 
+                static_cast<TVPbkFieldTypeParameter>( 
+                    TVPbkMappingsFindTool::FindIdByName( *name, paramArray ) );
+            if (!iAttributeHandler.CreateAttributeL(fieldTypeParam))
+                {
+                // No attribute created from fieldTypeParam,
+                // so add to parameters list
+                parameters.Add(fieldTypeParam);                  
+                }                                
+            aIterator.AppendAttribute( iAttributeHandler.Attribute() );
+            CleanupStack::PopAndDestroy( name );
+            }
+        else
+            {
+            // If EMAIL property not include default parameter then we need to 
+            // set it here, because otherwise it not mapped to any field in VPbk
+            if ( paramArray[ n ]->Id() == EVPbkVersitParamINTERNET )
+                {            
+                HBufC8* name = ConvertToUpperCaseLC( paramArray[ n ]->Name() );
+                
+                TVPbkFieldTypeParameter fieldTypeParam = 
+                static_cast<TVPbkFieldTypeParameter>( 
+                    TVPbkMappingsFindTool::FindIdByName( *name, paramArray ) );
+                if (!iAttributeHandler.CreateAttributeL(fieldTypeParam))
+                    {
+                    // No attribute created from fieldTypeParam,
+                    // so add to parameters list
+                    parameters.Add(fieldTypeParam);                  
+                    }                                
+                aIterator.AppendAttribute( iAttributeHandler.Attribute() );
+                CleanupStack::PopAndDestroy( name );                   
+                }
+            }
+        }
+
+    iVersitProperty.SetParameters( parameters );
+    }        
+    
+void CVPbkVCardPropertyParser::ResolveSubfieldsL( CParserProperty* aProperty,
+    CVPbkVCardContactFieldIterator& aIterator )
+    {
+    CParserPropertyValue* value = aProperty->Value();
+
+    if ( value->Uid() == TUid::Uid( KVersitPropertyHBufCUid ) ||
+         value->Uid() == TUid::Uid( KVersitPropertyBinaryUid ) ||
+         value->Uid() == TUid::Uid( KVersitPropertyDateUid ) )
+        {
+        iVersitProperty.SetSubField(
+            static_cast<TVPbkSubFieldType>(
+                EVPbkVersitSubFieldNone ) );
+        aIterator.AppendVersitProperty( iVersitProperty );
+        }
+    else if ( value->Uid() == TUid::Uid( KVersitPropertyCDesCArrayUid ) )
+        {        
+        CParserPropertyValue* value = aProperty->Value();
+        CParserPropertyValueCDesCArray* arrayProperty = 
+    	        static_cast<CParserPropertyValueCDesCArray*>( value );
+        CDesCArray* values = arrayProperty->Value(); 
+        
+        for ( TInt i = 0; i < values->MdcaCount(); ++i )
+            {            
+            iVersitProperty.SetSubField(
+                static_cast<TVPbkSubFieldType>( i ) );
+            aIterator.AppendVersitProperty( iVersitProperty );
+            }
+        }
+    }  
+    
+HBufC8* CVPbkVCardPropertyParser::ConvertToUpperCaseLC( 
+    const TDesC8& aOriginalDesC )
+    {
+    __ASSERT_DEBUG( aOriginalDesC.Length() > 0, 
+        VPbkVCardEngError::Panic( VPbkVCardEngError::EInvalidDescriptor ) );
+
+    HBufC8* buffer = HBufC8::NewLC( aOriginalDesC.Length() );
+    TPtr8 bufferPtr( buffer->Des() );
+    bufferPtr.Copy( aOriginalDesC );
+    bufferPtr.UpperCase();
+    return buffer;
+    } 
+
+// End of file