diff -r 6ca72c0fe49a -r a941bc465d9f PECengine/PresenceManager2/SrcNWSessionSlot/CPEngNWSessionSlotID2Imp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceManager2/SrcNWSessionSlot/CPEngNWSessionSlotID2Imp.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,617 @@ +/* +* 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 "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: NWSessionSlotID implementation. +* +*/ + +// INCLUDE FILES +#include "CPEngNWSessionSlotID2Imp.h" +#include "CPEngSessionSlotId.h" +#include +#include + + +// ============================ LOCAL FUNCTIONS =============================== +namespace + { + // ----------------------------------------------------------------------------- + // ValueForMatchMode() + // ----------------------------------------------------------------------------- + // + const TDesC& ValueForMatchMode( const TDesC& aReqValue, + TPEngNWSSIDMatchMode aMatchMode ) + { + if ( aMatchMode == EPEngMMWildAny ) + { + return KPEngMatchSymbolWildAny; + } + + return aReqValue; + } + + // ----------------------------------------------------------------------------- + // ExternalizeBufferL() + // ----------------------------------------------------------------------------- + // + void ExternalizeBufferL( const HBufC* aBuffer, RWriteStream& aStream ) + { + if ( aBuffer && aBuffer->Length() != 0 ) + { + aStream.WriteInt32L( aBuffer->Length() ); + aStream.WriteL( *aBuffer ); + } + else + { + aStream.WriteInt32L( 0 ); + } + } + + + // ----------------------------------------------------------------------------- + // InternalizeBufferL() + // ----------------------------------------------------------------------------- + // + HBufC* InternalizeBufferL( RReadStream& aStream ) + { + HBufC* buffer = NULL; + + TInt length = aStream.ReadInt32L(); + if ( length != 0 ) + { + buffer = HBufC::NewLC( length ); + TPtr ptr( buffer->Des() ); + aStream.ReadL( ptr, length ); + CleanupStack::Pop(); //buffer + } + + return buffer; + } + + + // ----------------------------------------------------------------------------- + // BufferExternalizeSizeInBytes() + // ----------------------------------------------------------------------------- + // + TInt BufferExternalizeSizeInBytes( const HBufC* aBuffer ) + { + TInt size( 4 ); //Buffer length indicator: 4 bytes + + if ( aBuffer && aBuffer->Length() != 0 ) + { + size += aBuffer->Size(); + } + + return size; + } + } + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngNWSessionSlotID2Imp* CPEngNWSessionSlotID2Imp::NewL() + { + CPEngNWSessionSlotID2Imp* self = new ( ELeave ) CPEngNWSessionSlotID2Imp(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::CloneL() +// ----------------------------------------------------------------------------- +// +CPEngNWSessionSlotID2Imp* CPEngNWSessionSlotID2Imp::CloneL() const + { + CPEngNWSessionSlotID2Imp* clone = CPEngNWSessionSlotID2Imp::NewL(); + CleanupStack::PushL( clone ); + + clone->iBasePart->CopyL( *iBasePart ); + + if ( iAppId ) + { + clone->iAppId = iAppId->AllocL(); + } + + clone->iServiceAddressMatchMode = iServiceAddressMatchMode; + clone->iUserIdMatchMode = iUserIdMatchMode; + clone->iAppIdMatchMode = iAppIdMatchMode; + + CleanupStack::Pop( clone ); + return clone; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::Reset() +// Reset operation. +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::Reset() + { + iBasePart->Reset(); + + delete iAppId; + iAppId = NULL; + + iServiceAddressMatchMode = EPEngMMExact; + iUserIdMatchMode = EPEngMMExact; + iAppIdMatchMode = EPEngMMExact; + } + + +// Destructor +CPEngNWSessionSlotID2Imp::~CPEngNWSessionSlotID2Imp() + { + delete iBasePart; + delete iAppId; + } + + + + +// ----------------------------------------------------------------------------- +// Symbian OS constructor. +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::ConstructL() + { + iBasePart = CPEngSessionSlotId::NewL(); + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::CPEngNWSessionSlotID2Imp +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngNWSessionSlotID2Imp::CPEngNWSessionSlotID2Imp() + : iServiceAddressMatchMode( EPEngMMExact ), + iUserIdMatchMode( EPEngMMExact ), + iAppIdMatchMode( EPEngMMExact ) + { + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::SetServiceAddressL() +// Mutator +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::SetServiceAddressL( const TDesC& aAddress, + TPEngNWSSIDMatchMode aMatchMode ) + { + iBasePart->SetServiceAddressL( ValueForMatchMode( aAddress, aMatchMode ) ); + iServiceAddressMatchMode = aMatchMode; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::SetUserIdL() +// Mutator +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::SetUserIdL( const TDesC& aUserId, + TPEngNWSSIDMatchMode aMatchMode ) + { + iBasePart->SetUserIdL( ValueForMatchMode( aUserId, aMatchMode ) ); + iUserIdMatchMode = aMatchMode; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::SetAppIdL() +// Mutator +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::SetAppIdL( const TDesC& aAppId, + TPEngNWSSIDMatchMode aMatchMode ) + { + HBufC* tmpBuf = ValueForMatchMode( aAppId, aMatchMode ).AllocL(); + delete iAppId; + iAppId = tmpBuf; + iAppIdMatchMode = aMatchMode; + } + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::SetAllL() +// Mutator +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::SetAllL( const CPEngSessionSlotId& aBasePart, + const TDesC& aAppId ) + { + SetServiceAddressL( aBasePart.ServiceAddress(), EPEngMMExact ); + SetUserIdL( aBasePart.UserId(), EPEngMMExact ); + SetAppIdL( aAppId, EPEngMMExact ); + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::ServiceAddress() +// Accessor +// ----------------------------------------------------------------------------- +// +TPtrC CPEngNWSessionSlotID2Imp::ServiceAddress() const + { + return iBasePart->ServiceAddress(); + } + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::UserId() +// Accessor +// ----------------------------------------------------------------------------- +// +TPtrC CPEngNWSessionSlotID2Imp::UserId() const + { + return iBasePart->UserId(); + } + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::AppId() +// Accessor +// ----------------------------------------------------------------------------- +// +TPtrC CPEngNWSessionSlotID2Imp::AppId() const + { + if ( iAppId ) + { + return *iAppId; + } + + return KNullDesC(); + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::BasePart() +// Accessor +// ----------------------------------------------------------------------------- +// +const CPEngSessionSlotId& CPEngNWSessionSlotID2Imp::BasePart() const + { + return *iBasePart; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::IsServiceAddressWild() +// ----------------------------------------------------------------------------- +// +TBool CPEngNWSessionSlotID2Imp::IsServiceAddressWild() const + { + return ( iServiceAddressMatchMode != EPEngMMExact ); + } + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::IsUserIdWild() +// ----------------------------------------------------------------------------- +// +TBool CPEngNWSessionSlotID2Imp::IsUserIdWild() const + { + return ( iUserIdMatchMode != EPEngMMExact ); + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::IsAppIdWild() +// ----------------------------------------------------------------------------- +// +TBool CPEngNWSessionSlotID2Imp::IsAppIdWild() const + { + return ( iAppIdMatchMode != EPEngMMExact ); + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::IsWild() +// ----------------------------------------------------------------------------- +// +TBool CPEngNWSessionSlotID2Imp::IsWild() const + { + return ( IsServiceAddressWild() || IsUserIdWild() || IsAppIdWild() ); + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::IsFullyDefined() +// ----------------------------------------------------------------------------- +// +TBool CPEngNWSessionSlotID2Imp::IsFullyDefined() const + { + if ( IsWild() ) + { + return EFalse; + } + + + if ( ServiceAddress().Length() == 0 ) + { + return EFalse; + } + + + if ( UserId().Length() == 0 ) + { + return EFalse; + } + + + if ( AppId().Length() == 0 ) + { + return EFalse; + } + + + return ETrue; + } + + + + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::MatchFullId() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotID2Imp::MatchFullId( const CPEngNWSessionSlotID2Imp& aIdToMatch ) const + { + if ( MatchBasePart( aIdToMatch ) != KErrNone ) + { + return KErrNotFound; + } + + if ( MatchAppIdPart( aIdToMatch ) != KErrNone ) + { + return KErrNotFound; + } + + return KErrNone; + } + + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::MatchBasePart() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotID2Imp::MatchBasePart( + const CPEngNWSessionSlotID2Imp& aIdToMatch ) const + { + //In case of full ID container, the wild definitions can be + //in either self object or in parameter one + //==> must be matched both ways + + if ( MatchBasePart( aIdToMatch.BasePart() ) == KErrNone ) + { + return KErrNone; + } + + if ( aIdToMatch.MatchBasePart( BasePart() ) == KErrNone ) + { + return KErrNone; + } + + return KErrNotFound; + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::MatchBasePart() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotID2Imp::MatchBasePart( + const CPEngSessionSlotId& aBasePartToMatch ) const + { + //Both base part fragments must match + + //Check first serviceAddress + TBool serviceAddressMatch = EFalse; + if ( IsServiceAddressWild() ) + { + serviceAddressMatch = ETrue; + } + + else if ( ServiceAddress().Compare( aBasePartToMatch.ServiceAddress() ) + == KErrNone ) + { + serviceAddressMatch = ETrue; + } + + + //And then user ID + TBool userIdMatch = EFalse; + if ( IsUserIdWild() ) + { + userIdMatch = ETrue; + } + + else if ( UserId().Compare( aBasePartToMatch.UserId() ) == KErrNone ) + { + userIdMatch = ETrue; + } + + + if ( serviceAddressMatch && userIdMatch ) + { + return KErrNone; + } + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::MatchAppIdPart() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotID2Imp::MatchAppIdPart( + const CPEngNWSessionSlotID2Imp& aIdToMatch ) const + { + //In case of full ID container, the wild definitions can be + //in either self object or in parameter one + //==> must be matched both ways + if ( MatchAppIdPart( aIdToMatch.AppId() ) == KErrNone ) + { + return KErrNone; + } + + if ( aIdToMatch.MatchAppIdPart( AppId() ) == KErrNone ) + { + return KErrNone; + } + + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::MatchAppIdPart() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotID2Imp::MatchAppIdPart( const TDesC& aAppId ) const + { + if ( IsAppIdWild() ) + { + return KErrNone; + } + + if ( AppId().Compare( aAppId ) == KErrNone ) + { + return KErrNone; + } + + return KErrNotFound; + } + + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::PackFullLC() +// ----------------------------------------------------------------------------- +// +HBufC8* CPEngNWSessionSlotID2Imp::PackFullLC() const + { + TInt size = 6 * 4; //6 static TInts + // - Version + // - 1 x buffer length + // - 3 x matchMode + // - Extension length + + size += iBasePart->Size(); + size += BufferExternalizeSizeInBytes( iAppId ); + + HBufC8* packBuffer = HBufC8::NewLC( size ); + TPtr8 pack( packBuffer->Des() ); + + RDesWriteStream ws; + ws.Open( pack ); // CSI: 65 # + CleanupClosePushL( ws ); + + ExternalizeL( ws ); + + ws.CommitL(); + CleanupStack::PopAndDestroy(); //ws + + + packBuffer = packBuffer->ReAllocL( packBuffer->Length() ); + CleanupStack::Pop(); + CleanupStack::PushL( packBuffer ); //Due realloc + + return packBuffer; + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::UnPackFullL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::UnPackFullL( const TDesC8& aPack ) + { + RDesReadStream rs; + rs.Open( aPack ); // CSI: 65 # + CleanupClosePushL( rs ); + + InternalizeL( rs ); + + CleanupStack::PopAndDestroy(); //rs + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::ExternalizeL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::ExternalizeL( RWriteStream& aStream ) const + { + aStream.WriteInt32L( 0 ); //Version, currently first + + iBasePart->ExternalizeL( aStream ); + aStream.WriteInt32L( iServiceAddressMatchMode ); + aStream.WriteInt32L( iUserIdMatchMode ); + + ExternalizeBufferL( iAppId, aStream ); + aStream.WriteInt32L( iAppIdMatchMode ); + + aStream.WriteInt32L( 0 ); //Extension length for future, currently 0 + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotID2Imp::InternalizeL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotID2Imp::InternalizeL( RReadStream& aStream ) + { + aStream.ReadInt32L(); //Stream version + + iBasePart->InternalizeL( aStream ); + iServiceAddressMatchMode = aStream.ReadInt32L(); + iUserIdMatchMode = aStream.ReadInt32L(); + + + HBufC* tmpBuf = InternalizeBufferL( aStream ); + delete iAppId; + iAppId = tmpBuf; + iAppIdMatchMode = aStream.ReadInt32L(); + + TInt extensionLength = aStream.ReadInt32L(); + if ( extensionLength > 0 ) + { + //skip the extension data + aStream.ReadL( extensionLength ); + } + } + + +// End of File + +