diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexEntry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexEntry.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,410 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexEntry +* +*/ + + + + +// INCLUDE FILES +#include "ServerDefines.h" +#include "XcapCacheServer.h" +#include "XcapCacheIndexEntry.h" +#include "XcapCacheEntryProperty.h" + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::CXcapCacheIndexEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry::CXcapCacheIndexEntry() + { + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry* CXcapCacheIndexEntry::NewL( const TCacheEntryInfo* aHeader ) + { + CXcapCacheIndexEntry* self = new( ELeave ) CXcapCacheIndexEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aHeader ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry* CXcapCacheIndexEntry::NewL( TPtr8& aEntryData ) + { + CXcapCacheIndexEntry* self = new( ELeave ) CXcapCacheIndexEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aEntryData ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::~CXcapCacheIndexEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry::~CXcapCacheIndexEntry() + { + iPropertyList.ResetAndDestroy(); + iPropertyList.Close(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::ConstructL( TPtr8& aEntryData ) + { + while( aEntryData.Length() > 0 ) + { + CXcapCacheEntryProperty* prop = NULL; + TInt index = aEntryData.FindF( KValueFieldSeparator ); + if( index > 0 ) + { + TPtrC8 propData = aEntryData.Left( index ); + TInt separator = propData.FindF( KValuePropertySeparator ); + if( separator > 0 ) + { + TPtrC8 name = propData.Left( separator ); + TPtrC8 value = propData.Right( propData.Length() - separator - 1 ); + const TInt nameId = FindPropNameId( name ); + __ASSERT_DEBUG( nameId != KErrNotFound, User::Leave( KErrCorrupt ) ); + prop = CreatePropertyL( nameId, value ); + CleanupStack::PushL( prop ); + User::LeaveIfError( iPropertyList.Append( prop ) ); + CleanupStack::Pop(); //prop + } + aEntryData.Delete( 0, index + 1 ); + } + } + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::ConstructL( const TCacheEntryInfo* aHeader ) + { + CreateFromHeaderL( aHeader ); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::FindPropNameId +// +// ---------------------------------------------------------- +// +TInt CXcapCacheIndexEntry::FindPropNameId( const TDesC8& aNameString ) const + { + TBool found = EFalse; + TInt ret = KErrNotFound; + TInt arrayLength = sizeof( KCacheEntryArray ) / + sizeof( KCacheEntryArray[0] ); + for( TInt i = 0;!found && i < arrayLength;i++ ) + { + if( aNameString.CompareF( TPtrC8( KCacheEntryArray[i] ) ) == 0 ) + { + ret = i; + found = ETrue; + } + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::UpdateEntryL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::UpdateEntryL( const TCacheEntryInfo* aHeader ) + { + TTime access = LastAccess(); + DeleteFileL( FileNameL() ); + iPropertyList.ResetAndDestroy(); + CreateFromHeaderL( aHeader ); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::DeleteFileL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::DeleteFileL( const TDesC8& aFileName ) + { + HBufC* buf = HBufC::NewLC( aFileName.Length() ); + buf->Des().Copy( aFileName ); + CFileMan* manager = CFileMan::NewL( CXcapCacheServer::FileSession() ); + CleanupStack::PushL( manager ); + TInt error = manager->Delete( buf->Des() ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::DeleteFileL() - Error: %d" ), error ); + #endif + CleanupStack::PopAndDestroy( 2 ); //manager, buf + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::CreatePropertyL +// +// ---------------------------------------------------------- +// +CXcapCacheEntryProperty* CXcapCacheIndexEntry::CreatePropertyL( const TInt aPropertyName, + const TDesC8& aPropertyValue ) + { + return CXcapCacheEntryProperty::NewL( aPropertyName, aPropertyValue ); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::FindProperty +// +// --------------------------------------------------------- +// +const CXcapCacheEntryProperty& CXcapCacheIndexEntry::FindProperty( const TInt aPropId ) const + { + TBool found = EFalse; + TInt count = iPropertyList.Count(); + CXcapCacheEntryProperty* property = NULL; + for( TInt i = 0;!found && i < count;i++ ) + { + property = iPropertyList[i]; + if( property->Name() == aPropId ) + found = ETrue; + } + return *property; + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::LastAccess +// +// --------------------------------------------------------- +// +TTime CXcapCacheIndexEntry::LastAccess() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheLastAccess ); + return property.TimeValue(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::LastModified +// +// --------------------------------------------------------- +// +TTime CXcapCacheIndexEntry::LastModified() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheLastModified ); + return property.TimeValue(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::XmlSize +// +// --------------------------------------------------------- +// +TInt CXcapCacheIndexEntry::XmlSize() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheXmlSize ); + return property.IntValue(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::FileNameL +// +// --------------------------------------------------------- +// +TPtrC8 CXcapCacheIndexEntry::FileNameL() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheXmlFile ); + return property.DesValue8(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::FileName16L +// +// --------------------------------------------------------- +// +TPtrC CXcapCacheIndexEntry::FileName16L() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheXmlFile ); + return property.DesValue16(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::ETag +// +// --------------------------------------------------------- +// +TPtrC8 CXcapCacheIndexEntry::ETag() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheEntryETag ); + return property.DesValue8(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::CreateFromHeaderL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::CreateFromHeaderL( const TCacheEntryInfo* aHeader ) + { + TInt arrayLength = sizeof( KCacheEntryArray ) / + sizeof( KCacheEntryArray[0] ); + HBufC8* hour = HourStringLC(); + for( TInt i = 0;i < arrayLength;i++ ) + { + CXcapCacheEntryProperty* prop = NULL; + switch( i ) + { + case KCacheEntryETag: + prop = CreatePropertyL( KCacheEntryETag, *aHeader->iEtag ); + break; + case KCacheXmlSize: + { + TBuf8<10> sizeBuf; + sizeBuf.AppendNum( aHeader->iDataLength ); + prop = CreatePropertyL( KCacheXmlSize, sizeBuf ); + } + break; + case KCacheXmlFile: + { + HBufC8* fileName = StoreXmlFileLC( *aHeader->iRespData ); + prop = CreatePropertyL( KCacheXmlFile, fileName->Des() ); + CleanupStack::PopAndDestroy(); //fileName + } + break; + case KCacheLastAccess: + prop = CreatePropertyL( KCacheLastAccess, hour->Des() ); + break; + case KCacheLastModified: + prop = CreatePropertyL( KCacheLastModified, hour->Des() ); + break; + default: + break; + } + if( prop != NULL ) + User::LeaveIfError( iPropertyList.Append( prop ) ); + } + CleanupStack::PopAndDestroy(); //hour + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::HourStringLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheIndexEntry::HourStringLC() + { + HBufC8* hourString = NULL; + HBufC* date = CXcapCacheServer::DateL(); + HBufC* time = CXcapCacheServer::TimeL(); + hourString = HBufC8::NewLC( date->Length() + time->Length() + 1 ); + TPtr8 pointer( hourString->Des() ); + pointer.Copy( *date ); + pointer.Append( KPageFileSeparator ); + pointer.Append( *time ); + delete date; + date = NULL; + delete time; + time = NULL; + return hourString; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::StoreXmlFileLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheIndexEntry::StoreXmlFileLC( const TDesC8& aXmlData ) + { + RFile file; + HBufC* nameBuf = NULL; + HBufC* randomString = NULL; + TPtrC randomName( _L( "" ) ); + TInt error = KErrAlreadyExists; + //It is extremely unlikely that the random string generator + //creates two exact same patterns, but let's check for it, anyway. + while( error == KErrAlreadyExists ) + { + randomString = CXcapCacheServer::RandomStringL(); + randomName.Set( *randomString ); + nameBuf = HBufC::NewLC( KCacheServerRoot().Length() + randomName.Length() ); + nameBuf->Des().Copy( KCacheServerRoot ); + nameBuf->Des().Append( randomName ); + error = file.Create( CXcapCacheServer::FileSession(), + nameBuf->Des(), EFileWrite ); + if( error != KErrNone ) + CleanupStack::PopAndDestroy(); //nameBuf + } + file.Write( aXmlData ); + file.Close(); + __ASSERT_ALWAYS( nameBuf != NULL, User::Leave( KErrCorrupt ) ); + HBufC8* ret = HBufC8::NewLC( nameBuf->Des().Length() ); + ret->Des().Copy( nameBuf->Des() ); + CleanupStack::Pop(); //ret + CleanupStack::PopAndDestroy(); //nameBuf + CleanupStack::PushL( ret ); + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::PrintLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheIndexEntry::PrintLC() const + { + TInt position = 0; + CBufFlat* buffer = NULL; + HBufC8* entryString = NULL; + TInt count = iPropertyList.Count(); + if( count > 0 ) + { + buffer = CBufFlat::NewL( 50 ); + CleanupStack::PushL( buffer ); + for( TInt i = 0;i < count;i++ ) + { + TPtrC8 name = TPtrC8( KCacheEntryArray[iPropertyList[i]->Name()] ); + TPtrC8 value = iPropertyList[i]->DesValue8(); + buffer->InsertL( position, name ); + position = position + name.Length(); + buffer->InsertL( position, KValuePropertySeparator ); + position = position + KValuePropertySeparator().Length(); + buffer->InsertL( position, value ); + position = position + value.Length(); + buffer->InsertL( position, KValueFieldSeparator ); + position = position + KValueFieldSeparator().Length(); + } + buffer->InsertL( position, KIndexFileEndOfLine ); + TPtr8 pointer( buffer->Ptr( 0 ) ); + entryString = HBufC8::NewL( pointer.Length() ); + entryString->Des().Copy( pointer ); + CleanupStack::PopAndDestroy(); //buffer + CleanupStack::PushL( entryString ); + } + return entryString; + } + + +