diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/src/ncdserverdetailsimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/server/src/ncdserverdetailsimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,360 @@ +/* +* Copyright (c) 2006 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: Implementation of CNcdServerDetails +* +*/ + + +#include + +#include "ncdserverdetailsimpl.h" +#include "catalogsdebug.h" +#include "ncd_cp_cookieimpl.h" +#include "ncddatabasestorage.h" +#include "ncdstorageitem.h" +#include "catalogsutils.h" +#include "ncd_cp_cookie.h" +#include "ncd_cp_cookieimpl.h" +#include "catalogsconstants.h" + +// --------------------------------------------------------------------------- +// CNcdServerDetails +// --------------------------------------------------------------------------- +// + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CNcdServerDetails* + CNcdServerDetails::NewLC( + const TDesC& aServerUri, const TDesC& aNamespace ) + { + CNcdServerDetails* self = new( ELeave ) CNcdServerDetails(); + CleanupStack::PushL( self ); + self->ConstructL( aServerUri, aNamespace ); + return self; + } + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +CNcdServerDetails* CNcdServerDetails::NewL( RReadStream& aStream ) + { + CNcdServerDetails* self = new( ELeave ) CNcdServerDetails(); + CleanupStack::PushL( self ); + self->ConstructL( aStream ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CNcdServerDetails::~CNcdServerDetails() + { + delete iServerUri; + delete iNamespace; + delete iCapabilities; + iCookies.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// Externalizes the object +// --------------------------------------------------------------------------- +// +void CNcdServerDetails::ExternalizeL( RWriteStream& aStream ) const + { + DLTRACEIN(( _L("ServerURI: %S, Namespace: %S"), iServerUri, + iNamespace )); + ExternalizeDesL( *iServerUri, aStream ); + ExternalizeDesL( *iNamespace, aStream ); + + TInt count = iCapabilities->MdcaCount(); + DLTRACE(("Externalizing %d capabilities", count )); + aStream.WriteInt32L( count ); + for ( TInt i = 0 ; i < count; i++ ) + { + DLTRACE(( _L("Cap: %S"), &iCapabilities->MdcaPoint( i ) )); + ExternalizeDesL( iCapabilities->MdcaPoint( i ), aStream ); + } + + count = iCookies.Count(); + DLTRACE(("Externalizing %d cookies", count )); + aStream.WriteInt32L( count ); + for ( TInt i = 0; i < count; ++i ) + { + iCookies[i]->ExternalizeL( aStream ); + } + } + +// --------------------------------------------------------------------------- +// Adds a new capability +// --------------------------------------------------------------------------- +// +void CNcdServerDetails::AddCapabilityL( + const TDesC& aCapability ) + { + DLTRACEIN(( _L("Server cap: %S to server: %S"), &aCapability, + iServerUri )); + + iCapabilities->AppendL( aCapability ); + } + + +// --------------------------------------------------------------------------- +// Clears capabilities +// --------------------------------------------------------------------------- +// +void CNcdServerDetails::ClearCapabilitiesL() + { + DLTRACEIN(("")); + delete iCapabilities; + iCapabilities = NULL; + iCapabilities = new( ELeave ) CDesCArrayFlat( KListGranularity ); + DLTRACEOUT(("Capabilities cleared")); + } + + +// --------------------------------------------------------------------------- +// Check if the server supports the given capability +// --------------------------------------------------------------------------- +// +TBool CNcdServerDetails::IsCapabilitySupported( + const TDesC& aCapability ) const + { + TInt pos = 0; + return ( iCapabilities->Find( aCapability, pos, ECmpNormal ) == 0 ); + } + + +// --------------------------------------------------------------------------- +// Server URI getter +// --------------------------------------------------------------------------- +// +const TDesC& CNcdServerDetails::ServerUri() const + { + DASSERT( iServerUri ); + return *iServerUri; + } + + +// --------------------------------------------------------------------------- +// Namespace getter +// --------------------------------------------------------------------------- +// +const TDesC& CNcdServerDetails::Namespace() const + { + DASSERT( iNamespace ); + return *iNamespace; + } + + +// --------------------------------------------------------------------------- +// AddCookieL +// --------------------------------------------------------------------------- +// +void CNcdServerDetails::AddCookieL( + const MNcdConfigurationProtocolCookie& aCookie, + const TDesC8& aSim ) + { + DLTRACEIN(( _L("Key: %S, type: %S"), &aCookie.Key(), &aCookie.Type() )); + TInt index = FindCookie( aCookie ); + + if ( aCookie.Type() == NcdConfigurationProtocolCookieTypes::KRemove ) + { + DLINFO(("Removing cookie")); + if ( index != KErrNotFound ) + { + delete iCookies[index]; + iCookies.Remove( index ); + } + return; + } + + CNcdConfigurationProtocolCookie* cookie = + CNcdConfigurationProtocolCookie::NewLC( aCookie ); + + + // Set SIM identification + AssignDesL( cookie->iSim, aSim ); + + if ( index == KErrNotFound ) + { + DLINFO(("Adding a new cookie")); + iCookies.AppendL( cookie ); + } + else + { + DLINFO(("Replacing an existing cookie")); + delete iCookies[index]; + iCookies[index] = cookie; + } + CleanupStack::Pop( cookie ); + + // Convert expiration delta to expiration time and put it to the cookie + if ( cookie->ExpirationDelta() ) + { + DLINFO(("Expiration delta: %d", cookie->ExpirationDelta() )); + TTimeIntervalMinutes delta( cookie->ExpirationDelta() ); + TTime currentTime; + currentTime.HomeTime(); + currentTime += delta; + cookie->iExpirationTime = currentTime; + } + } + + +// --------------------------------------------------------------------------- +// CookiesL +// --------------------------------------------------------------------------- +// +RPointerArray + CNcdServerDetails::CookiesL( + const TDesC8& aSim ) const + { + DLTRACEIN(("")); + RPointerArray array; + CleanupClosePushL( array ); + for ( TInt i = 0; i < iCookies.Count(); ++i ) + { + if ( iCookies[i]->Scope() != + NcdConfigurationProtocolCookieScopes::KSim || + iCookies[i]->Sim() == aSim ) + { + DLTRACE(("Found a suitable cookie")); + array.AppendL( iCookies[i] ); + } + } + CleanupStack::Pop( &array ); + DLTRACEOUT(("Found %d suitable cookies", array.Count() )); + return array; + } + + +// --------------------------------------------------------------------------- +// Removes cookies that have expired +// --------------------------------------------------------------------------- +// +TInt CNcdServerDetails::RemoveExpiredCookies() + { + DLTRACEIN(("")); + + TInt removed = 0; + TTime time; + time.UniversalTime(); + + TInt i = 0; + while ( i < iCookies.Count() ) + { + if ( iCookies[i]->ExpirationDelta() && + iCookies[i]->ExpirationTime() < time ) + { + DLINFO(( _L("Cookie %S has expired"), &iCookies[i]->Key() )); + delete iCookies[i]; + iCookies.Remove( i ); + removed++; + } + else + { + ++i; + } + } + DLTRACEOUT(("Removed %d cookies", removed)); + return removed; + } + + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CNcdServerDetails::CNcdServerDetails() + { + } + + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CNcdServerDetails::ConstructL( + const TDesC& aServerUri, + const TDesC& aNamespace ) + { + iServerUri = aServerUri.AllocL(); + iNamespace = aNamespace.AllocL(); + iCapabilities = new( ELeave ) CDesCArrayFlat( KListGranularity ); + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CNcdServerDetails::ConstructL( RReadStream& aStream ) + { + DLTRACEIN(("")); + InternalizeDesL( iServerUri, aStream ); + InternalizeDesL( iNamespace, aStream ); + DLTRACE(( _L("ServerURI: %S, Namespace: %S"), iServerUri, iNamespace )); + iCapabilities = new( ELeave ) CDesCArrayFlat( KListGranularity ); + + TInt32 capabilityCount = aStream.ReadInt32L(); + DLTRACE(("Internalizing %d capabilities", capabilityCount )); + + HBufC* capability( NULL ); + for ( TInt i = 0; i < capabilityCount; i++ ) + { + InternalizeDesL( capability, aStream ); + CleanupStack::PushL( capability ); + DLTRACE(( _L("Cap: %S"), capability )); + iCapabilities->AppendL( *capability ); + CleanupStack::PopAndDestroy( capability ); + capability = NULL; + } + + TInt32 cookieCount = aStream.ReadInt32L(); + DLTRACE(("Internalizing %d cookies", cookieCount )); + iCookies.ReserveL( cookieCount ); + for ( TInt i = 0; i < cookieCount; ++i ) + { + CNcdConfigurationProtocolCookie* cookie = + CNcdConfigurationProtocolCookie::NewLC(); + cookie->InternalizeL( aStream ); + iCookies.AppendL( cookie ); + CleanupStack::Pop( cookie ); + } + DLTRACEOUT(("Internalization successful")); + } + + +// --------------------------------------------------------------------------- +// Find cookie +// --------------------------------------------------------------------------- +// +TInt CNcdServerDetails::FindCookie( const + MNcdConfigurationProtocolCookie& aCookie ) const + { + for ( TInt i = 0; i < iCookies.Count(); ++i ) + { + if ( aCookie.Key() == iCookies[i]->Key() ) + { + return i; + } + } + return KErrNotFound; + } +