PECengine/PresenceManager2/SrcNWSessionSlot/CPEngNWSessionSlotID2Imp.cpp
branchRCL_3
changeset 13 a941bc465d9f
parent 0 094583676ce7
--- /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    <s32strm.h>
+#include    <s32mem.h>
+
+
+// ============================ 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
+
+