diff -r 000000000000 -r b16258d2340f applayerpluginsandutils/uripermissionservices/server/src/urilistwritestream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerpluginsandutils/uripermissionservices/server/src/urilistwritestream.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,170 @@ +// Copyright (c) 2007-2009 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: +// + +#include +#include +#include "urilistwritestream.h" +#include "ineturiimpl.h" +#include "ineturiproperties.h" +#include "urilist.h" +#include "ineturilistserver.h" +#include "uriqueryfilter.h" + +/** +Stanadard factory construction method +*/ +CUriListStream* CUriListStream::NewL ( CUriQueryFilter* aQueryFilter ) + { + CUriListStream* self = new (ELeave) CUriListStream; + CleanupStack::PushL ( self ); + self->ConstructL (aQueryFilter); + CleanupStack::Pop (); + return self; + } + +CUriListStream::CUriListStream () + { + + } + +CUriListStream::~CUriListStream () + { + iWriteStream.Close (); + delete iInetUri; + // Delete the buffer + delete iIpcBuffer; + delete iQueryFilter; + } + +void CUriListStream::ConstructL ( CUriQueryFilter* aQueryFilter ) + { + iIpcBuffer = CBufFlat::NewL ( KIpcDataSize ); + iIpcBuffer->ExpandL ( 0, KIpcDataSize ); + iWriteStream.Open ( *iIpcBuffer ); // Open the stream + iInetUri = CInetUriImpl::NewL (); + iQueryFilter = aQueryFilter; + } + +/** +Writes the URI list to the IPC data stream. The results could contain multiple +data records. The stream position will be set to the beginning before the write +operation. It returns the total number of records returned via the data stream. +*/ +TInt CUriListStream::WriteUriListL ( TPtrC8& aData ) + { + ResetL (); + + MDBTransaction& dbTrans = iQueryFilter->DBTransaction(); + + TInt totalRecords = 0; + TBool dirty = iInetUri->IsDirty (); + + while ( !dirty || dbTrans.Next() ) + { + if ( iQueryFilter->MatchRecordL () ) + { + PopulateDataFieldsL (); + if ( PendingWriteStreamSizeL () >= iInetUri->Size() ) + { + iInetUri->PackL ( iWriteStream ); + iInetUri->Clear (); + dirty = ETrue; + ++totalRecords; // Increment the total no. of records + } + else + { + break; + } + } + } + // Write to the buffer. + aData.Set ( iIpcBuffer->Ptr(0) ); + + // return with total no. of records + return totalRecords; + } + +/** +Resets the write stream position to the begining. +*/ +void CUriListStream::ResetL () + { + MStreamBuf* srcStream = iWriteStream.Sink (); + srcStream->SeekL ( MStreamBuf::EWrite, EStreamBeginning, 0 ); + } + +/** +Returns the number of bytes remaining in the stream for the write operation. +*/ +TInt CUriListStream::PendingWriteStreamSizeL () + { + MStreamBuf* srcStream = iWriteStream.Sink (); + TStreamPos streamPos = srcStream->TellL ( MStreamBuf::EWrite ); + + return KIpcDataSize - streamPos.Offset(); + } + + +/** +Reads the data from the storage and populates the CInetUriImpl object. Later this +data will be packed and send it via IPC data buffer +*/ +void CUriListStream::PopulateDataFieldsL () + { + MDBTransaction& dbTrans = iQueryFilter->DBTransaction(); + iInetUri->SetUriId ( dbTrans.ColumnIntL ( URILIST::EId ) ); + CUri8* uri = CreateUriL (); + iInetUri->SetUri ( *uri ); + + // Populate the properties + CInetUriProperties& properties = iInetUri->Properties (); + + properties.SetPropId ( dbTrans.ColumnIntL ( URILIST::EPropId - 1 ) ); + properties.SetServiceType ( static_cast ( dbTrans.ColumnIntL ( URILIST::EServiceType - 1 ) ) ); + properties.SetListType ( static_cast ( dbTrans.ColumnIntL ( URILIST::EListType - 1 ) ) ); + properties.SetFavouriteNameL ( dbTrans.ColumnTextL ( URILIST::EFavouriteName - 1 ) ); + properties.SetPermission ( static_cast ( dbTrans.ColumnIntL ( URILIST::EPermission - 1 ) ) ); + } + +/** +Creates a new URI object by setting the individual components. The individual componentes are +read from the storage. +*/ +CUri8* CUriListStream::CreateUriL () + { + MDBTransaction& dbTrans = iQueryFilter->DBTransaction(); + CUri8* uri = CUri8::NewL (); + CleanupStack::PushL ( uri ); + + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EScheme ), EUriScheme ); + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EHost ), EUriHost ); + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EPort ), EUriPort ); + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EUserInfo ), EUriUserinfo ); + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EPath ), EUriPath ); + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EQuery ), EUriQuery ); + SetUriComponentL ( *uri, dbTrans.ColumnTextL ( URILIST::EFragments ), EUriFragment ); + + CleanupStack::Pop (); // uri + return uri; + } + +/** +Sets the URI component. +*/ +void CUriListStream::SetUriComponentL ( CUri8& aUri, const TDesC8& aUriComponent, TUriComponent aComponent ) + { + aUri.SetComponentL ( aUriComponent, aComponent ); + } +