pimprotocols/pbap/server/pbapchexporter.cpp
changeset 0 e686773b3f54
child 15 e8e3147d53eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/pbap/server/pbapchexporter.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,451 @@
+// Copyright (c) 2006-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 <cntdb.h>
+
+#include "pbapchexporter.h"
+#include "pbapserver.h"
+#include "pbapexporter.h"
+#include "pbapfolderclient.h"
+#include "pbapcontactdbviews.h"
+#include "pbaplogeng.h"
+
+#include "btaccesshostlog.h"
+
+
+//
+// CPbapChExporter
+//
+CPbapChExporter::CPbapChExporter(MVirtualFolderClient& aClient, 
+								 MPbapExporterCallback& aCallback, 
+								 CPbapChView& aViewToExport,
+								 CPbapChView* aReadViewToExport, 
+								 TUint aStartIndex,
+								 TInt aCount)
+: CPbapExporterBase(aClient, aCallback),
+  iState(EIdle),
+  iStartIndex(aStartIndex),
+  iCount(aCount)
+	{
+	LOG_FUNC
+	
+	// iCurrentEventIndex starts from 0, because CLogView can only start from the first event.
+	iCurrentEventIndex = 0;
+	
+	// get views to export
+	iLogView = aViewToExport.LogView();
+	
+	// read view optional, used for missed calls only
+	if (aReadViewToExport)
+		{
+		iReadEventView = aReadViewToExport->LogView();
+		}
+		
+	CActiveScheduler::Add(this);
+	}
+
+void CPbapChExporter::ConstructL()
+	{
+	LOG_FUNC	
+
+	iState = EStartExport;
+	
+	// complete ourselves to kick-off the async processing
+	TRequestStatus* status=&iStatus;
+	User::RequestComplete(status, KErrNone);
+		
+	SetActive();
+	}
+	
+CPbapChExporter::~CPbapChExporter()
+	{
+	LOG_FUNC
+	
+	Cancel();
+	}
+
+TBool CPbapChExporter::PrepareForFetchingL(TUint aNumberOfEvents)
+	{
+	LOG_FUNC
+
+	// reset the number of items to be exported based on the view size
+	iCount = Min(iCount, (aNumberOfEvents - iStartIndex));
+	return (iCount > 0);
+	}
+
+void CPbapChExporter::StartExportL()
+	{
+	LOG_FUNC	
+
+	iClient.Exporter().StartExport();
+	
+	// check to see if we need to export number of unread events
+	if (iReadEventView)
+		{
+		iClient.Exporter().ExportNewMissedCallsL(iLogView->CountL() - iReadEventView->CountL());
+		}
+	
+	TBool startFetching = PrepareForFetchingL(iLogView->CountL());
+	if (startFetching && iLogView->FirstL(iStatus))
+		{
+		iState = EFetchingLogEvents;
+		SetActive();
+		}
+	else
+		{
+		// no events to fetch
+		FinaliseFetchLogEventsL();
+		}		
+	}
+
+void CPbapChExporter::FetchLogEventsL()
+	{
+	LOG_FUNC
+	
+	// call derived class to process fetched event	
+	TBool continueFetching = EventFetchedL(iLogView->Event(), iCurrentEventIndex);
+	++iCurrentEventIndex;
+	if (continueFetching && iLogView->NextL(iStatus))
+		{
+		SetActive();
+		}
+	else
+		{
+		// all events fetched
+		FinaliseFetchLogEventsL();
+		}				
+	}
+		
+void CPbapChExporter::RunL()
+	{
+	LOG_FUNC
+	
+	User::LeaveIfError(iStatus.Int());
+	
+	switch (iState)
+		{
+		case EStartExport:
+			StartExportL();
+			break;
+		case EFetchingLogEvents:
+			FetchLogEventsL();
+			break;
+		default:
+			break;
+		}
+	}
+
+void CPbapChExporter::DoCancel()
+	{
+	LOG_FUNC
+
+	iLogView->Cancel();
+
+	// export aborted
+	iClient.Exporter().CancelExport();
+	iCallback.HandleExportComplete(KErrCancel);
+	}
+
+
+TInt CPbapChExporter::RunError(TInt aError)
+	{
+	LOG_FUNC
+	
+	// abort the export	
+	iClient.Exporter().CancelExport();
+
+	// notify observer
+	iCallback.HandleExportComplete(aError);
+	return KErrNone;
+	}
+	
+void CPbapChExporter::FinaliseFetchLogEventsL()
+	{
+	LOG_FUNC
+	
+	// no event to fetch
+	FetchingCompleteL();
+	iClient.Exporter().FinaliseExportL();
+	iCallback.HandleExportComplete(KErrNone);
+	}
+	
+	
+//
+// CPbapChListingExporter
+//
+CPbapChListingExporter* CPbapChListingExporter::NewL(MVirtualFolderClient& aClient, 
+													MPbapExporterCallback& aCallback, 
+													CPbapChView& aViewToExport,
+													CPbapChView* aReadViewToExport, 
+													TUint aStartIndex, 
+													TInt aCount)
+	{
+	LOG_STATIC_FUNC
+	CPbapChListingExporter* self = 
+				new(ELeave) CPbapChListingExporter(aClient, aCallback, aViewToExport,
+												   aReadViewToExport, aStartIndex, aCount);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CPbapChListingExporter::CPbapChListingExporter(MVirtualFolderClient& aClient,
+											   MPbapExporterCallback& aCallback,
+											   CPbapChView& aViewToExport,
+											   CPbapChView* aReadViewToExport, 
+											   TUint aStartIndex,
+											   TInt aCount)
+: CPbapChExporter(aClient, aCallback, aViewToExport, aReadViewToExport, aStartIndex, aCount)
+	{
+	LOG_FUNC
+	}
+
+TBool CPbapChListingExporter::PrepareForFetchingL(TUint aNumberOfEvents)
+	{
+	LOG_FUNC
+	// add listing header before first entry is exported
+	iClient.Exporter().ExportListingBeginL();
+
+	return CPbapChExporter::PrepareForFetchingL(aNumberOfEvents);
+	}
+	
+TBool CPbapChListingExporter::EventFetchedL(const CLogEvent& aEvent, TInt aEventIndex)
+	{
+	LOG_FUNC
+
+	TBool moreItemsToExport = EFalse;
+		
+	if (aEventIndex < iStartIndex)
+		{
+		// skip this event
+		moreItemsToExport = ETrue;
+		}
+	else if (aEventIndex < iStartIndex + iCount)
+		{
+		// export event as a listing entry
+		TInt handle = aEventIndex + 1; // call history handles start from 1
+
+		TContactItemId contactId = aEvent.Contact();
+		if (contactId != KNullContactId)
+			{
+			// a contact is associated with the log event so read its name from the database
+			RBuf name;
+			TRAPD(error , name.Assign(iClient.ContactDbViews().GetContactNameFromIdL(contactId)));
+			if (error != KErrNone || !name.Size())
+				{
+				// cannot read contact name (e.g. the contact id doesnot exist
+				// anymore) so fallback to using the log events phone number
+				name.Assign(aEvent.Number().AllocL());
+				}
+			name.CleanupClosePushL();
+			iClient.Exporter().ExportListingEntryL(handle, name);
+			CleanupStack::PopAndDestroy(&name);
+
+			}
+		else
+			{
+			// no contact associated with log event so use number instead of name
+			const TDesC& phoneNumber = aEvent.Number();
+			iClient.Exporter().ExportListingEntryL(handle, phoneNumber);
+			}			
+		moreItemsToExport = ETrue;		
+		}
+	return moreItemsToExport;
+	}
+
+void CPbapChListingExporter::FetchingCompleteL()
+	{
+	LOG_FUNC	
+	// no more listing entries to be exported so close listing
+	iClient.Exporter().ExportListingEndL();	
+	}
+
+	
+//
+// CPbapChItemExporter
+//
+CPbapChItemExporter* CPbapChItemExporter::NewL(MVirtualFolderClient& aClient, 
+											MPbapExporterCallback& aCallback,
+										    CPbapChView& aViewToExport,
+										    CPbapChView* aReadViewToExport, 
+											TUint aStartIndex, 
+											TInt aCount, 
+											TVCardVersion aFormat, 
+											TUint64 aFilter)
+	{
+	LOG_STATIC_FUNC
+	CPbapChItemExporter* self = 
+			new(ELeave) CPbapChItemExporter(aClient, aCallback, aViewToExport, aReadViewToExport,
+											aStartIndex, aCount, aFormat, aFilter);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CPbapChItemExporter::CPbapChItemExporter(MVirtualFolderClient& aClient,
+										 MPbapExporterCallback& aCallback,
+									     CPbapChView& aViewToExport,
+									     CPbapChView* aReadViewToExport, 
+										 TUint aStartIndex,
+										 TInt aCount,
+										 TVCardVersion aFormat,
+										 TUint64 aFilter)
+: CPbapChExporter(aClient, aCallback, aViewToExport, aReadViewToExport, aStartIndex, aCount),
+iFormat(aFormat),
+iFilter(aFilter)
+	{
+	LOG_FUNC
+	}
+		
+TBool CPbapChItemExporter::EventFetchedL(const CLogEvent& aEvent, TInt aEventIndex)
+	{
+	LOG_FUNC
+
+	TBool moreItemsToExport = EFalse;
+
+	if(aEventIndex < iStartIndex)
+		{
+		// skip this event
+		moreItemsToExport =ETrue;
+		}
+	else if (aEventIndex < iStartIndex + iCount)
+		{
+		// export the event
+		iClient.Exporter().ExportCallHistoryL(aEvent, iFormat, iFilter);
+		moreItemsToExport = ETrue;
+		}
+	return moreItemsToExport;
+	}
+
+void CPbapChItemExporter::FetchingCompleteL()
+	{
+	LOG_FUNC
+	// do nothing
+	}
+
+//
+// CPbapChSingleItemExporter
+//
+CPbapChSingleItemExporter* CPbapChSingleItemExporter::NewL(MVirtualFolderClient& aClient,
+														   MPbapExporterCallback& aCallback,
+													       CPbapChView& aViewToExport,
+														   TInt aIndex,
+														   TVCardVersion aFormat,
+														   TUint64 aFilter)
+	{
+	LOG_STATIC_FUNC
+	CPbapChSingleItemExporter* self =
+		new(ELeave) CPbapChSingleItemExporter(aClient, aCallback, aViewToExport, aIndex, aFormat, aFilter);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+CPbapChSingleItemExporter::CPbapChSingleItemExporter(MVirtualFolderClient& aClient,
+													 MPbapExporterCallback& aCallback,
+													 CPbapChView& aViewToExport,
+													 TInt aIndex,
+													 TVCardVersion aFormat,
+													 TUint64 aFilter)
+: CPbapChExporter(aClient, aCallback, aViewToExport), iIndex(aIndex), iFormat(aFormat), iFilter(aFilter)
+	{
+	LOG_FUNC
+	}
+
+TBool CPbapChSingleItemExporter::PrepareForFetchingL(TUint aNumberOfEvents)
+	{
+	LOG_FUNC
+	if (iIndex < 0 || iIndex >= aNumberOfEvents)
+		{
+		// attempting to export an event which doesnot exist 
+		User::Leave(KErrNotFound);
+		}
+	return ETrue;	
+	}
+		
+TBool CPbapChSingleItemExporter::EventFetchedL(const CLogEvent& aEvent, TInt aEventIndex)
+	{
+	LOG_FUNC
+
+	if (aEventIndex == iIndex)
+		{
+		iClient.Exporter().ExportCallHistoryL(aEvent, iFormat, iFilter);
+		return EFalse;
+		}
+	return ETrue;
+	}
+
+void CPbapChSingleItemExporter::FetchingCompleteL()
+	{
+	LOG_FUNC
+	// do nothing
+	}
+	
+//
+// CPbapChCountExporter
+//
+CPbapChCountExporter* CPbapChCountExporter::NewL(MVirtualFolderClient& aClient,
+												 MPbapExporterCallback& aCallback,
+											     CPbapChView& aViewToExport,
+											     CPbapChView* aReadViewToExport) 
+	{
+	LOG_STATIC_FUNC
+	CPbapChCountExporter* self = new(ELeave) CPbapChCountExporter(aClient, aCallback,
+																  aViewToExport, aReadViewToExport);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CPbapChCountExporter::CPbapChCountExporter(MVirtualFolderClient& aClient,
+										   MPbapExporterCallback& aCallback,
+									       CPbapChView& aViewToExport,
+									       CPbapChView* aReadViewToExport) 
+										   
+: CPbapChExporter(aClient, aCallback, aViewToExport, aReadViewToExport)
+	{
+	LOG_FUNC
+	}
+
+TBool CPbapChCountExporter::PrepareForFetchingL(TUint aNumberOfEvents)
+	{
+	LOG_FUNC
+
+	// the size of the phonebook is equal to the number of events in the log view
+	iClient.Exporter().ExportPhonebookSizeL(aNumberOfEvents);
+	
+	// the phonebook size has been exported, so abort fetch
+	return EFalse;
+	}
+	
+TBool CPbapChCountExporter::EventFetchedL(const CLogEvent& /*aEvent*/, TInt /*aEventIndex*/)
+	{
+	LOG_FUNC
+	//Release build should silently ignore the event
+	__ASSERT_DEBUG(EFalse, Panic(EPbapChCountExporterFetchingFails));
+	// do nothing (fetching should have been aborted)
+	return EFalse;
+	}
+
+void CPbapChCountExporter::FetchingCompleteL()
+	{
+	LOG_FUNC
+	// do nothing
+	}