diff -r 000000000000 -r e686773b3f54 ccservices/cmsservices/cmsengine/Client/src/cmscontactfield.cpp --- /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& 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 + +