--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ccservices/cmsservices/cmsengine/Client/src/cmscontactfield.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,555 @@
+/*
+* Copyright (c) 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:
+*
+*
+*/
+
+
+// INCLUDES
+#include "cmscontact.h"
+#include "cmssession.h"
+#include "cmspresencedata.h"
+#include "cmscontactfield.h"
+#include "cmscontactfielditem.h"
+#include "cmscommondefines.h"
+
+// ----------------------------------------------------
+// CCmsContactField::CCmsContactField
+//
+// ----------------------------------------------------
+//
+CCmsContactField::CCmsContactField( RCmsContact& aContact,
+ CCmsContactFieldItem::TCmsContactField aFieldType ) :
+ CCmsContactBase( aContact ),
+ iFieldType( aFieldType )
+ {
+ SelectFieldType();
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::CCmsContactField
+//
+// ----------------------------------------------------
+//
+CCmsContactField::CCmsContactField( RCmsContact& aContact, TRequestStatus& aClientStatus,
+ CCmsContactFieldItem::TCmsContactField aFieldType ) :
+ CCmsContactBase( aContact, aClientStatus ),
+ iFieldType( aFieldType )
+ {
+ SelectFieldType();
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::CCmsContactField
+//
+// ----------------------------------------------------
+//
+CCmsContactField::CCmsContactField( RCmsContact& aContact, TRequestStatus& aClientStatus,
+ CCmsContactFieldItem::TCmsContactFieldGroup aFieldGroup ) :
+ CCmsContactBase( aContact, aClientStatus ),
+ iFieldGroup( aFieldGroup )
+ {
+ SelectFieldType();
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::NewL
+//
+// ----------------------------------------------------
+//
+CCmsContactField* CCmsContactField::NewL( RCmsContact& aContact,
+ CCmsContactFieldItem::TCmsContactField aFieldType )
+ {
+ CCmsContactField* self = new ( ELeave ) CCmsContactField( aContact, aFieldType );
+ CleanupStack::PushL( self );
+ self->BaseConstructL();
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::NewL
+//
+// ----------------------------------------------------
+//
+CCmsContactField* CCmsContactField::NewL( RCmsContact& aContact, TRequestStatus& aClientStatus,
+ CCmsContactFieldItem::TCmsContactField aFieldType )
+ {
+ CCmsContactField* self = new ( ELeave ) CCmsContactField( aContact, aClientStatus, aFieldType );
+ CleanupStack::PushL( self );
+ self->BaseConstructL();
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::NewL
+//
+// ----------------------------------------------------
+//
+CCmsContactField* CCmsContactField::NewL( RCmsContact& aContact, TRequestStatus& aClientStatus,
+ CCmsContactFieldItem::TCmsContactFieldGroup aFieldGroup )
+ {
+ CCmsContactField* self = new ( ELeave ) CCmsContactField( aContact, aClientStatus, aFieldGroup );
+ CleanupStack::PushL( self );
+ self->BaseConstructL();
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::ConstructL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::ConstructL()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::ConstructL()" ) );
+ #endif
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::SelectFieldType
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::SelectFieldType()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::SelectFieldType()" ) );
+ #endif
+ iBinary = CCmsContactFieldItem::ECmsThumbnailPic == iFieldType ||
+ CCmsContactFieldItem::ECmsPresenceData == iFieldType ||
+ CCmsContactFieldItem::ECmsBrandedAvailability == iFieldType;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::~CCmsContactField
+//
+// ----------------------------------------------------
+//
+CCmsContactField::~CCmsContactField()
+ {
+ iFieldItems.ResetAndDestroy();
+ iFieldItems.Close();
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::FieldCount
+//
+// ----------------------------------------------------
+//
+EXPORT_C TInt CCmsContactField::ItemCount() const
+ {
+ return iFieldItems.Count();
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::Item
+//
+// ----------------------------------------------------
+//
+EXPORT_C const CCmsContactFieldItem& CCmsContactField::ItemL( TInt aIndex ) const
+ {
+ CCmsContactFieldItem* item = NULL;
+ if( aIndex >= 0 && aIndex < iFieldItems.Count() )
+ {
+ item = iFieldItems[aIndex];
+ }
+ else
+ {
+ User::Leave( KErrTooBig );
+ }
+ return *item;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::Item
+//
+// ----------------------------------------------------
+//
+EXPORT_C const CCmsContactFieldItem& CCmsContactField::ItemL( CCmsContactFieldItem::TCmsDefaultAttributeTypes aDefaultType ) const
+ {
+ CCmsContactFieldItem* result = NULL;
+
+ TInt count = iFieldItems.Count();
+ for( TInt a = 0; a < count; a++ )
+ {
+ CCmsContactFieldItem* item = iFieldItems[a];
+ if(item->HasDefaultAttribute(aDefaultType))
+ {
+ result = item;
+ break;
+ }
+ }
+
+ if(NULL == result)
+ User::Leave(KErrNotFound);
+
+ return *result;
+ }
+
+
+
+// ----------------------------------------------------
+// CCmsContactField::Items
+//
+// ----------------------------------------------------
+//
+EXPORT_C const RPointerArray<CCmsContactFieldItem>& CCmsContactField::Items() const
+ {
+ return iFieldItems;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::Type
+//
+// ----------------------------------------------------
+//
+EXPORT_C CCmsContactFieldItem::TCmsContactField CCmsContactField::Type() const
+ {
+ return iFieldType;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::GroupType
+//
+// ----------------------------------------------------
+//
+EXPORT_C CCmsContactFieldItem::TCmsContactFieldGroup CCmsContactField::GroupType() const
+ {
+ return iFieldGroup;
+ }
+
+
+// ----------------------------------------------------
+// CCmsContactField::HasDefaultAttribute
+//
+// ----------------------------------------------------
+//
+EXPORT_C TBool CCmsContactField::HasDefaultAttribute( CCmsContactFieldItem::TCmsDefaultAttributeTypes aDefaultType ) const
+ {
+ TBool found = EFalse;
+
+ TInt count = iFieldItems.Count();
+ for( TInt a = 0; !found && a < count; a++ )
+ {
+ CCmsContactFieldItem* item = iFieldItems[a];
+ if(item->HasDefaultAttribute(aDefaultType))
+ {
+ found = ETrue;
+ break;
+ }
+ }
+
+ return found;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::HasDefaultAttribute
+//
+// ----------------------------------------------------
+//
+EXPORT_C TInt CCmsContactField::HasDefaultAttribute( ) const
+ {
+ TInt bitmask = 0;
+ TInt count = CCmsContactFieldItem::ECmsDefaultTypeUrl;
+
+ while (count > 0)
+ {
+ if(HasDefaultAttribute((CCmsContactFieldItem::TCmsDefaultAttributeTypes)count))
+ {
+ bitmask |= count;
+ }
+
+ count >>= 1;
+ }
+
+ return bitmask;
+ }
+
+
+
+// ----------------------------------------------------
+// CCmsContactField::RunL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::RunL()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::RunL() - Error: %d" ), iStatus.Int() );
+ #endif
+ if( KErrNone <= iStatus.Int() )
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( " Field data fetched OK." ) );
+ #endif
+ if( iBinary )
+ {
+ HandleBinaryDataL();
+ }
+ else HandleSixteenBitDataL();
+ }
+ else //An error
+ {
+ //Handle errors in the base class
+ HandleError();
+ }
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::HandleSixteenBitDataL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::HandleSixteenBitDataL()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::HandleSixteenBitDataL()" ) );
+ #endif
+ if( KErrNone == iStatus.Int() )
+ {
+ for( TInt i = 0;iStreamDesc16.Length() > 0;i++ )
+ {
+ TInt length = 0;
+ TInt infoLength = 0;
+ TInt attribute = 0;
+ TPtrC lengthDesc( _L( "" ) );
+
+ //data length
+ TInt index = iStreamDesc16.Locate( KDelimiterSpace );
+ lengthDesc.Set( iStreamDesc16.Left( iStreamDesc16.Locate( KDelimiterSpace ) ) );
+ TLex luthor( lengthDesc );
+ User::LeaveIfError( luthor.Val( length ) );
+ iStreamDesc16.Delete( 0, index + 1 );
+
+ //info length
+ index = iStreamDesc16.Locate( KDelimiterSpace );
+ lengthDesc.Set( iStreamDesc16.Left( iStreamDesc16.Locate( KDelimiterSpace ) ) );
+ TLex luthorInfo( lengthDesc );
+ User::LeaveIfError( luthorInfo.Val( infoLength ) );
+ iStreamDesc16.Delete( 0, index + 1 );
+
+ //default attributes
+ index = iStreamDesc16.Locate( KDelimiterSpace );
+ TPtrC attributedata( iStreamDesc16.Left( iStreamDesc16.Locate( KDelimiterSpace )) );
+ TLex attl( attributedata );
+ User::LeaveIfError( attl.Val( attribute ) );
+
+ //data
+ TPtrC data( iStreamDesc16.Mid( index + 1, length ) );
+ TPtrC dataInfo( iStreamDesc16.Mid( index + length + 1, infoLength ) );
+ CreateFieldItemL( data, dataInfo, attribute );
+
+ index > 0 ? iStreamDesc16.Delete( 0, index + 1 + length + infoLength ) :
+ iStreamDesc16.Delete( 0, iStreamDesc16.Length() );
+
+ }
+ User::RequestComplete( iClientStatus, KErrNone );
+ }
+ else
+ {
+ ReAllocBufferL( iStatus.Int() );
+ TIpcArgs args( iFieldType, StreamDesc16() );
+ TInt operation( ( TInt )ECmsFetchContactField );
+ iContact.ResendReceive( operation, Activate(), args );
+ }
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::HandleBinaryDataL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::HandleBinaryDataL()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::HandleBinaryDataL()" ) );
+ #endif
+ if( KErrNone == iStatus.Int() )
+ {
+ switch( iFieldType )
+ {
+ case CCmsContactFieldItem::ECmsThumbnailPic:
+ case CCmsContactFieldItem::ECmsBrandedAvailability:
+ HandleBasicDataL();
+ break;
+ case CCmsContactFieldItem::ECmsPresenceData:
+ HandlePresenceDataL();
+ break;
+ }
+ }
+ else
+ {
+ ReAllocBufferL( iStatus.Int() );
+ TIpcArgs args( iFieldType, StreamDesc8() );
+ TInt operation( ( TInt )ECmsFetchContactField );
+ iContact.ResendReceive( operation, Activate(), args );
+ }
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::HandleBasicDataL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::HandleBasicDataL()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::HandleBasicDataL()" ) );
+ #endif
+ _LIT8( KDelimiter, "\r\n\r\n" );
+ TPtr8 package( *StreamDesc8() );
+ TInt separator = package.Find( KDelimiter );
+ if( KErrNone < separator )
+ {
+ while( 0 < package.Length() )
+ {
+ TPtrC8 data( package.Left( separator ) );
+ CreateFieldItemL( data );
+ package.Delete( 0, separator + 4 );
+ separator = package.Find( KDelimiter );
+ }
+ }
+ else
+ {
+ CreateFieldItemL( package );
+ }
+ User::RequestComplete( iClientStatus, KErrNone );
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::HandlePresenceDataL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::HandlePresenceDataL()
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::HandlePresenceDataL()" ) );
+ #endif
+ TPtr8 package( *StreamDesc8() );
+ while( 0 < package.Length() )
+ {
+ const TInt index( package.Find( KDelimiterNewLine ) );
+ TPtrC8 presenceData( package.Left( index ) );
+ HandlePresencePackageL( presenceData );
+ package.Delete( 0, index + KDelimiterNewLine().Length() );
+ }
+ User::RequestComplete( iClientStatus, KErrNone );
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::HandlePresencePackageL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::HandlePresencePackageL( const TDesC8& aPresenceData )
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::ExtractFieldType()" ) );
+ #endif
+ const TInt length( aPresenceData.Length() );
+ TPtr8 presenceData( CONST_CAST( TUint8*, aPresenceData.Ptr() ), length, length );
+ CCmsPresenceData* item = CCmsPresenceData::NewL( iContact );
+ CleanupStack::PushL( item );
+ while( 0 < presenceData.Length() )
+ {
+ TInt delIndex = 0;
+ TInt type( ExtractFieldType( presenceData ) );
+ TPtrC8 data( ExtractData( presenceData, delIndex ) );
+ item->AssignDataL( type, data );
+ presenceData.Delete( 0, delIndex );
+ presenceData.TrimAll();
+ }
+ User::LeaveIfError( iFieldItems.Append( item ) );
+ CleanupStack::Pop(); //item
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::ExtractFieldType
+//
+// ----------------------------------------------------
+//
+TInt CCmsContactField::ExtractFieldType( TPtr8& aDataDesc )
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::ExtractFieldType()" ) );
+ #endif
+ TInt fieldType = 0;
+ TInt index = aDataDesc.Locate( KDelimiterSpace );
+ TPtrC8 data( aDataDesc.Left( index ) );
+ TLex8 lex( data );
+ lex.Val( fieldType );
+ aDataDesc.Delete( 0, index + 1 );
+ return fieldType;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::ExtractData
+//
+// ----------------------------------------------------
+//
+TPtrC8 CCmsContactField::ExtractData( const TDesC8& aDataDesc, TInt& aDelIndex )
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsContactField::ExtractData()" ) );
+ #endif
+ TInt index1( aDataDesc.Locate( KDelimiterQuote ) );
+ TPtrC8 temp( aDataDesc.Mid( index1 + 1 ) );
+ RDebug::RawPrint( temp );
+ TInt index2 = temp.Locate( KDelimiterQuote );
+ TPtrC8 data( index2 >= 0 ? temp.Left( index2 ) : temp );
+ RDebug::RawPrint( data );
+ aDelIndex = index1 + data.Length() + 3;
+ return data;
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::CreateFieldItemL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::CreateFieldItemL( const TDesC8& aItemData )
+ {
+ CCmsContactFieldItem* item = CCmsContactFieldItem::NewL( aItemData );
+ CleanupStack::PushL( item );
+ User::LeaveIfError( iFieldItems.Append( item ) );
+ CleanupStack::Pop(); //item
+ }
+
+// ----------------------------------------------------
+// CCmsContactField::CreateFieldItemL
+//
+// ----------------------------------------------------
+//
+void CCmsContactField::CreateFieldItemL( const TDesC& aItemData, const TDesC& aItemInfo, const TInt aDefaultAttribute )
+ {
+ CCmsContactFieldItem* item = CCmsContactFieldItem::NewL( aItemData );
+ CleanupStack::PushL( item );
+ item->SetDefaultAttribute( aDefaultAttribute );
+ User::LeaveIfError( iFieldItems.Append( item ) );
+ CleanupStack::Pop(); //item
+ item->SetInfo( aItemInfo );
+ }
+
+// End of File
+
+