applayerpluginsandutils/uripermissionservices/server/src/urilistwritestream.cpp
changeset 0 b16258d2340f
--- /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 <e32base.h>
+#include <s32buf.h>
+#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 <InetUriList::TServiceType> ( dbTrans.ColumnIntL ( URILIST::EServiceType - 1 ) ) );
+	properties.SetListType ( static_cast <InetUriList::TListType> ( dbTrans.ColumnIntL ( URILIST::EListType - 1 ) ) );
+	properties.SetFavouriteNameL ( dbTrans.ColumnTextL ( URILIST::EFavouriteName - 1 ) );
+	properties.SetPermission ( static_cast <InetUriList::TPermission> ( 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 );
+	}
+