diff -r 000000000000 -r dd21522fd290 browserutilities/favouritesengine/ClientServer/src/FavouritesItemImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/favouritesengine/ClientServer/src/FavouritesItemImpl.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,353 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Implementation of class CFavouritesItemImpl +* +* +*/ + + +// INCLUDE FILES + +#include "FavouritesItemImpl.h" +#include "FavouritesPanic.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CFavouritesItemImpl::NewL +// --------------------------------------------------------- +// +CFavouritesItemImpl* CFavouritesItemImpl::NewL() + { + CFavouritesItemImpl* item = NewLC(); + CleanupStack::Pop( item ); + return item; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::NewLC +// --------------------------------------------------------- +// +CFavouritesItemImpl* CFavouritesItemImpl::NewLC() + { + CFavouritesItemImpl* item = new (ELeave) CFavouritesItemImpl(); + CleanupStack::PushL( item ); + item->ConstructL(); + return item; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::~CFavouritesItemImpl +// --------------------------------------------------------- +// +CFavouritesItemImpl::~CFavouritesItemImpl() + { + delete iName; + delete iUrl; + delete iUserName; + delete iPassword; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::operator= +// --------------------------------------------------------- +// +CFavouritesItemImpl& CFavouritesItemImpl::operator= +( const CFavouritesItemImpl& aCopyFrom ) + { + if( &aCopyFrom != this ) + { + iUid = aCopyFrom.iUid; + iParentFolder = aCopyFrom.iParentFolder; + iType = aCopyFrom.iType; + SetNameL( *(aCopyFrom.iName) ); + SetUrlL( *(aCopyFrom.iUrl) ); + iWapAp = aCopyFrom.iWapAp; + SetUserNameL( *(aCopyFrom.iUserName) ); + SetPasswordL( *(aCopyFrom.iPassword) ); + iFactoryItem = aCopyFrom.iFactoryItem; + iReadOnly = aCopyFrom.iReadOnly; + iContextId = aCopyFrom.iContextId; + iModified = aCopyFrom.iModified; + iHidden = aCopyFrom.iHidden; + } + return *this; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::ConstructL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::ConstructL() + { + iUid = KFavouritesNullUid; + iParentFolder = KFavouritesNullUid; + iType = CFavouritesItem::EItem; + iName = HBufC::NewL( 0 ); + iUrl = HBufC::NewL( 0 ); + iWapAp.SetDefault(); + iUserName = HBufC::NewL( 0 ); + iPassword = HBufC::NewL( 0 ); + iFactoryItem = EFalse; + iReadOnly = EFalse; + iContextId = KFavouritesNullContextId; + iModified = Time::NullTTime(); + iHidden = EFalse; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::SetNameL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::SetNameL( const TDesC& aName ) + { + HBufC* buf = HBufC::NewLC( aName.Length() ); + TPtr bufp( buf->Des() ); + User::LeaveIfError( MakeName( aName, bufp ) ); + CleanupStack::Pop( buf ); + delete iName; + iName = buf; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::ExternalizeL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::ExternalizeL( RWriteStream& aStream ) const + { + aStream.WriteInt32L( iUid ); + aStream.WriteInt32L( iParentFolder ); + aStream.WriteInt32L( STATIC_CAST( TInt, iType ) ); + BufToStreamL( *iName, aStream ); + BufToStreamL( *iUrl, aStream ); + iWapAp.ExternalizeL( aStream ); + BufToStreamL( *iUserName, aStream ); + BufToStreamL( *iPassword, aStream ); + aStream.WriteInt32L( STATIC_CAST( TInt, iReadOnly ) ); + aStream.WriteInt32L( STATIC_CAST( TInt, iFactoryItem ) ); + aStream.WriteInt32L( iContextId ); + aStream.WriteInt32L( I64HIGH( iModified.Int64() ) ); + aStream.WriteInt32L( I64LOW( iModified.Int64() ) ); + aStream.WriteInt32L( STATIC_CAST( TInt, iHidden ) ); + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::InternalizeL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::InternalizeL( RReadStream& aStream ) + { + iUid = aStream.ReadInt32L(); + iParentFolder = aStream.ReadInt32L(); + iType = STATIC_CAST( CFavouritesItem::TType, aStream.ReadInt32L() ); + BufFromStreamL( iName, aStream ); + BufFromStreamL( iUrl, aStream ); + iWapAp.InternalizeL( aStream ); + BufFromStreamL( iUserName, aStream ); + BufFromStreamL( iPassword, aStream ); + iReadOnly = STATIC_CAST( TBool, aStream.ReadInt32L() ); + iFactoryItem = STATIC_CAST( TBool, aStream.ReadInt32L() ); + iContextId = aStream.ReadInt32L(); + // Need to use local variables, cannot read to TInt64 constructor directly + // from stream. Order of argument evaluation is compiler dependent! + TUint32 high = aStream.ReadInt32L(); + TUint32 low = aStream.ReadInt32L(); + iModified = MAKE_TINT64( high, low ); + iHidden = STATIC_CAST( TBool, aStream.ReadInt32L() ); + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::ExternalizeUpdateDeltaL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::ExternalizeUpdateDeltaL( RWriteStream& aStream ) const + { + aStream.WriteInt32L( iUid ); + BufToStreamL( *iName, aStream ); + aStream.WriteInt32L( I64HIGH( iModified.Int64() ) ); + aStream.WriteInt32L( I64LOW( iModified.Int64() ) ); + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::InternalizeUpdateDeltaL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::InternalizeUpdateDeltaL( RReadStream& aStream ) + { + iUid = aStream.ReadInt32L(); + BufFromStreamL( iName, aStream ); + // Need to use local variables, cannot read to TInt64 constructor directly + // from stream. Order of argument evaluation is compiler dependent! + TUint32 high = aStream.ReadInt32L(); + TUint32 low = aStream.ReadInt32L(); + iModified = MAKE_TINT64( high, low ); + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::BufToStreamL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::BufToStreamL +( const TDesC& aBuf, RWriteStream& aStream ) const + { + aStream.WriteInt32L( aBuf.Length() ); + aStream.WriteL( aBuf ); + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::BufFromStreamL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::BufFromStreamL( HBufC*& aBuf, RReadStream& aStream ) + { + TInt len = aStream.ReadInt32L(); + HBufC* buf = HBufC::NewLC( len ); + TPtr ptr( buf->Des() ); ptr.SetLength( len ); + aStream.ReadL( ptr, len ); + delete aBuf; + aBuf = buf; + CleanupStack::Pop( buf ); // Now member. + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::SetBufL +// --------------------------------------------------------- +// +void CFavouritesItemImpl::SetBufL +( HBufC*& aBuf, const TDesC& aDesc, TInt aMaxLength ) + { + if ( aDesc.Length() > aMaxLength ) + { + User::Leave( KErrOverflow ); + } + HBufC* buf = aDesc.AllocL(); + delete aBuf; + aBuf = buf; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::IsValid +// --------------------------------------------------------- +// +TBool CFavouritesItemImpl::IsValid() const + { + TBool ret = ETrue; + if ( !IsValidName( *iName ) ) + { + // Valid name is required for all (except the root folder). + ret = EFalse; + } + else + { + switch ( iType ) + { + case CFavouritesItem::EItem: + if ( !iUrl->Length() ) + { + // URL is required for items. + ret = EFalse; + } + break; + + case CFavouritesItem::EFolder: + if ( + iUrl->Length() || + iUserName->Length() || + iPassword->Length() + ) + { + // URL, Username, Password are not allowed + // for folders. + ret = EFalse; + } + break; + + default: + { + FavouritesPanic( EFavouritesBadType ); + } + } + } + return ret; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::MakeName +// --------------------------------------------------------- +// +TInt CFavouritesItemImpl::MakeName( const TDesC& aSource, TDes& aTarget ) + { + TInt err( KErrNone ); + _LIT(KEikEdwinRightToLeftMark, "\x200F" ); + // Copy source to target. + aTarget = aSource; + TBool rightRemove, leftRemove; + rightRemove = EFalse; + leftRemove = EFalse; + + // Remove leading/trailing spaces. + if(aTarget.Right(1).Compare(KEikEdwinRightToLeftMark) ==0) + { + aTarget.Delete(aTarget.Length() -1,1); + rightRemove = ETrue; + } + + if(aTarget.Left(1).Compare(KEikEdwinRightToLeftMark) ==0) + { + aTarget.Delete(0,1); + leftRemove = ETrue; + } + + + aTarget.Trim(); + if(rightRemove) + { + if(aTarget.Right(1).Compare(KEikEdwinRightToLeftMark) ==0) + { + aTarget.Delete(aTarget.Length() -1,1); + } + + } + if(leftRemove) + { + if(aTarget.Left(1).Compare(KEikEdwinRightToLeftMark) ==0) + { + aTarget.Delete(0,1); + } + } + + // Trim to valid length. + if ( aTarget.Length() > KFavouritesMaxName ) + { + aTarget.SetLength( KFavouritesMaxName ); + err = KErrOverflow; + } + return err; + } + +// --------------------------------------------------------- +// CFavouritesItemImpl::IsValidName +// --------------------------------------------------------- +// +TBool CFavouritesItemImpl::IsValidName( const TDesC& aName ) + { + // All characters accepted (no exclusion of special characters.). + // Name must contain at least non-whitespace; since this method expects + // a trimmed name, this is equivalent of checking if the name is empty. + // This method always gets a trimmed name (MakeName generated). + return aName.Length(); + } + +// End of File