omads/omadsappui/AspSyncUtil/src/AspLogDialog.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 22:40:37 +0200
branchRCL_3
changeset 8 ad0f53516d84
parent 0 dab8a81a92de
permissions -rw-r--r--
Revision: 201003 Kit: 201007

/*
* 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:  
*
*/


// INCLUDE FILES

#include "AspLogDialog.h"
#include "AspDialogUtil.h"
#include "AspUtil.h"
#include "AspDebug.h"

#include <SyncMLErr.h>  // sync error codes
#include "AspSchedule.h"



/*******************************************************************************
 * class CAspLogDialog
 *******************************************************************************/




// -----------------------------------------------------------------------------
// CAspLogDialog::ShowDialogL
// 
// -----------------------------------------------------------------------------
void CAspLogDialog::ShowDialogL()
	{
	HBufC* hBuf = CAspResHandler::ReadLC(R_SML_LOG_SYNCLOG_TITLE);

    TDialogUtil::ShowPopupDialog2L(hBuf->Des(), iList);
    
   	CleanupStack::PopAndDestroy(hBuf);
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::NewL
//
// -----------------------------------------------------------------------------
CAspLogDialog* CAspLogDialog::NewL(const TAspParam& aParam)
    {
    CAspLogDialog* self = new (ELeave) CAspLogDialog(aParam);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);

    return(self);
    }


// -----------------------------------------------------------------------------
// CAspLogDialog::CAspLogDialog
// 
// -----------------------------------------------------------------------------
//
CAspLogDialog::CAspLogDialog(const TAspParam& aParam)
	{
    iProfileId = aParam.iProfileId;
	iSyncSession = aParam.iSyncSession;

	__ASSERT_ALWAYS(iSyncSession, TUtil::Panic(KErrArgument));
    }


// -----------------------------------------------------------------------------
// CAspLogDialog::ConstructL
//
// -----------------------------------------------------------------------------
//
void CAspLogDialog::ConstructL()
    {
    iResHandler = CAspResHandler::NewL();
    iList = new (ELeave) CDesCArrayFlat(1);
   		
    TAspParam param(KErrNotFound, iSyncSession);
	CAspProfile* profile = CAspProfile::NewLC(param);   		
	profile->OpenL(iProfileId, CAspProfile::EOpenRead, CAspProfile::EAllProperties);
	
    TAspParam param2(KErrNotFound, iSyncSession);
	param2.iProfile = profile;
	param2.iMode = CAspContentList::EInitAll;
	CAspContentList* taskList = CAspContentList::NewLC(param2);
	
	CreateListL(iList, profile, taskList);
	
	CleanupStack::PopAndDestroy(taskList);
	CleanupStack::PopAndDestroy(profile);
    } 


// ----------------------------------------------------------------------------
// Destructor
//
// ----------------------------------------------------------------------------
//
CAspLogDialog::~CAspLogDialog()
    {
	delete iResHandler;
    delete iList;
    }


// -----------------------------------------------------------------------------
// CAspLogDialog::CreateListL
// 
// Example log format:
//
// Profile: PC Suite
// Server: PC Suite
// Date: 13/10/2004
// Time: 11:04
// Status: Complete
//
// Phone:  
//
// Added Contacts:
//  4
// Added Notes:
//  12
// Deleted Calendar:
//  2
//
// Server:
//
// Added contacts:
//  12
// 
// -----------------------------------------------------------------------------
void CAspLogDialog::CreateListL(CDesCArray* aList, CAspProfile* aProfile,
                                CAspContentList* aTaskList)
	{
	_LIT(KTab, "\t");
	
	aList->Reset();
	
	const CSyncMLHistoryJob* historyJob = aProfile->LatestHistoryJob();
   	if (!historyJob)
   		{
   		User::Leave(KErrNotFound);  // this profile has not been synced
   		}

		
	TTime time = historyJob->TimeStamp();
	
	CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_PROFILE); //profile name heading
	iBuf.Append(KTab);

#ifdef RD_DSUI_TIMEDSYNC
	 CAspSchedule* schedule = CAspSchedule::NewLC();
	 TInt asProfileId = schedule->AutoSyncProfileId();
	 if (asProfileId == aProfile->ProfileId())
		{
		TInt profileId = schedule->ProfileId();
		TAspParam param(KErrNotFound, iSyncSession);
		CAspProfile* profile = CAspProfile::NewLC(param);
		profile->OpenL(profileId, CAspProfile::EOpenRead, CAspProfile::EAllProperties);

		profile->GetName(iBuf2);
		CleanupStack::PopAndDestroy(profile);
		}
	 else
		{
		aProfile->GetName(iBuf2);
		}
	 CleanupStack::PopAndDestroy(schedule);
#else	 
	aProfile->GetName(iBuf2);
#endif
	iBuf.Append(iBuf2);
	AddLineL(aList, iBuf);
    
	CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_REMOTE); //server name heading
	iBuf.Append(KTab);

	if(aProfile->IsPCSuiteProfile(aProfile))
	{
		aProfile->GetLocalisedPCSuite(iBuf2);
	}
	else
	{
		TInt num = 0;
		aProfile->GetHostAddress(iBuf2, num);
	}	
	iBuf.Append(iBuf2);
	AddLineL(aList, iBuf);
		
    CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_DATE); // sync date heading
	iBuf.Append(KTab);
	TUtil::GetDateTextL(iBuf2, time);
	iBuf.Append(iBuf2);
	AddLineL(aList, iBuf);

	CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_TIME); // sync time heading
	iBuf.Append(KTab);
    TUtil::GetTimeTextL(iBuf2, time);
	iBuf.Append(iBuf2);
	AddLineL(aList, iBuf);	
		

	//
	// check sync errors
	//
	CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_STATUS); // status heading
	iBuf.Append(KTab);	
		
	TInt syncError = historyJob->ResultCode();
	if (syncError != KErrNone && syncError != SyncMLError::KErrSlowSync)
		{
		if (syncError == KErrCancel)
			{
			CAspResHandler::ReadL(iBuf2, R_QTN_SML_LOG_CANCELLED);
			}
		else
			{
			CAspResHandler::ReadL(iBuf2, R_QTN_SML_LOG_ERR);
			}
		
		iBuf.Append(iBuf2);
		AddLineL(aList, iBuf);
		
		// Added for syncml engine error handling and displaying in view logs
		if (syncError <= SyncMLError::KErrSyncEngineErrorBase)
			{
			TInt id = TAspSyncError::GetSmlErrorValue (syncError) ;
			CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_ERROR); // sync error heading
			iBuf.Append(KTab);
			CAspResHandler::ReadL(iBuf2, id);
			iBuf.Append(iBuf2);
			AddLineL(aList, iBuf);
			}
		
		return;
		}
	
	if (HasTaskErrors(historyJob))
		{
		CAspResHandler::ReadL(iBuf2, R_QTN_SML_LOG_ERR);
		iBuf.Append(iBuf2);
    	AddLineL(aList, iBuf);
		}
    else
    	{
    	CAspResHandler::ReadL(iBuf2, R_QTN_SML_LOG_OK);
	    iBuf.Append(iBuf2);
    	AddLineL(aList, iBuf);
    	}
		
	
	if (PhoneModified(historyJob))
		{
		CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_PHONE);
	    iBuf.Append(KTab);
   	    AddLineL(aList, iBuf);

        AddLogItemsL(aList, historyJob, aTaskList, ELogAddedPhone);
        AddLogItemsL(aList, historyJob, aTaskList, ELogUpdatedPhone);
        AddLogItemsL(aList, historyJob, aTaskList, ELogDeletedPhone);
        AddLogItemsL(aList, historyJob, aTaskList, ELogDiscardedPhone);
        AddLogItemsL(aList, historyJob, aTaskList, ELogMovedPhone);
		}

	
	if (ServerModified(historyJob))
		{
		CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_SERVER);
	    iBuf.Append(KTab);
   	    AddLineL(aList, iBuf);

        AddLogItemsL(aList, historyJob, aTaskList, ELogAddedServer);
        AddLogItemsL(aList, historyJob, aTaskList, ELogUpdatedServer);
        AddLogItemsL(aList, historyJob, aTaskList, ELogDeletedServer);
        AddLogItemsL(aList, historyJob, aTaskList, ELogDiscardedServer);
        AddLogItemsL(aList, historyJob, aTaskList, ELogMovedServer);
		}

	if (HasTaskErrors(historyJob))
		{
		CAspResHandler::ReadL(iBuf, R_QTN_SML_LOG_ERROR);
	    iBuf.Append(KTab);
   	    AddLineL(aList, iBuf);

        AddTaskErrorsL(aList, historyJob, aTaskList);
		}
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::AddLogItemsL
// 
// -----------------------------------------------------------------------------
void CAspLogDialog::AddLogItemsL(CDesCArray* aList, const CSyncMLHistoryJob* aHistoryJob, 
                                 CAspContentList* aTaskList, TInt aType)
	{
	_LIT(KFormat, "%S\t%d");
	
	TInt taskCount = aHistoryJob->TaskCount();
	for (TInt i=0; i<taskCount; i++)
		{
		const CSyncMLHistoryJob::TTaskInfo& taskInfo = aHistoryJob->TaskAt(i);
        	
        TInt index = aTaskList->FindProviderIndexForTask(taskInfo.iTaskId);
        if (index == KErrNotFound)
    	    {
       	    continue; // profile no longer has this task
    	    }
       	TAspProviderItem& provider = aTaskList->ProviderItem(index);
     
     
		TInt count = SyncedItemCount(taskInfo, aType);
		if (count == 0)
			{
			continue;
			}

		HBufC* hBuf = LogItemTextLC(aType, provider.iDataProviderId, provider.iDisplayName);
	    TPtr ptr = hBuf->Des();
	    iBuf.Format(KFormat, &ptr, count);
	    CleanupStack::PopAndDestroy(hBuf);
	    
       	AddLineL(aList, iBuf);
		}
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::AddTaskErrorsL
// 
// -----------------------------------------------------------------------------
void CAspLogDialog::AddTaskErrorsL(CDesCArray* aList, 
                                   const CSyncMLHistoryJob* aHistoryJob, 
                                   CAspContentList* aTaskList)
	{
	_LIT(KTab, "\t");
	
	TInt taskCount = aHistoryJob->TaskCount();
	for (TInt i=0; i<taskCount; i++)
		{
		const CSyncMLHistoryJob::TTaskInfo& taskInfo = aHistoryJob->TaskAt(i);
        	
        TInt index = aTaskList->FindProviderIndexForTask(taskInfo.iTaskId);
        if (index == KErrNotFound)
    	    {
       	    continue; // profile no longer has this task
    	    }
    
    	TAspProviderItem& provider = aTaskList->ProviderItem(index);
  	
		if (taskInfo.iError != KErrNone && taskInfo.iError != SyncMLError::KErrSlowSync)
		    {
	    	iBuf = KNullDesC;
	    	HBufC* hBuf = CAspResHandler::GetContentNameLC(provider.iDataProviderId,
	    	                                               provider.iDisplayName);
	        iBuf.Append(hBuf->Des());
	        CleanupStack::PopAndDestroy(hBuf);

		    CAspResHandler::ReadL(iBuf2, R_QTN_SML_LOG_ERR); // "Incomplete"
		    iBuf.Append(KTab);
     	    iBuf.Append(iBuf2);
     	    
#ifdef _DEBUG 
       	    TBuf<64> buf;
     	    buf.Format(_L(" (%d)"), taskInfo.iError);
     	    iBuf.Append(buf);
#endif
     	    
     	    AddLineL(aList, iBuf);
    		}
		}
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::PhoneModified
// 
// -----------------------------------------------------------------------------
TBool CAspLogDialog::PhoneModified(const CSyncMLHistoryJob* aHistoryJob)
	{
	TInt taskCount = aHistoryJob->TaskCount();
	for (TInt i=0; i<taskCount; i++)
		{
		const CSyncMLHistoryJob::TTaskInfo& task = aHistoryJob->TaskAt(i);
	    
	    TInt count = task.iServerItemsAdded + task.iServerItemsChanged +
	                 task.iServerItemsDeleted + task.iServerItemsFailed +
	                 task.iServerItemsMoved;
        
        if (count > 0)
        	{
        	return ETrue;
        	}
		}
		
	return EFalse;
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::ServerModified
// 
// -----------------------------------------------------------------------------
TBool CAspLogDialog::ServerModified(const CSyncMLHistoryJob* aHistoryJob)
	{
	TInt taskCount = aHistoryJob->TaskCount();
	for (TInt i=0; i<taskCount; i++)
		{
		const CSyncMLHistoryJob::TTaskInfo& task = aHistoryJob->TaskAt(i);

	    TInt count = task.iItemsAdded + task.iItemsChanged +
	                 task.iItemsDeleted + task.iItemsFailed +
	                 task.iItemsMoved;
        
        if (count > 0)
        	{
        	return ETrue;
        	}
		}
		
	return EFalse;
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::HasTaskErrors
// 
// -----------------------------------------------------------------------------
TBool CAspLogDialog::HasTaskErrors(const CSyncMLHistoryJob* aHistoryJob)
	{
	TInt taskCount = aHistoryJob->TaskCount();
	for (TInt i=0; i<taskCount; i++)
		{
		const CSyncMLHistoryJob::TTaskInfo& taskInfo = aHistoryJob->TaskAt(i);
        
        if (taskInfo.iError != KErrNone && taskInfo.iError != SyncMLError::KErrSlowSync)
        	{
        	FLOG(_L("### CAspLogDialog::HasTaskErrors (%d) ###"), taskInfo.iError);
        	return ETrue;
        	}
		}
		
	return EFalse;
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::AddLineL
// 
// -----------------------------------------------------------------------------
void CAspLogDialog::AddLineL(CDesCArray* aList, TDes& aText)
	{
	AknTextUtils::DisplayTextLanguageSpecificNumberConversion(aText);
	aList->AppendL(aText);
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::SyncedItemCount
// 
// -----------------------------------------------------------------------------
TInt CAspLogDialog::SyncedItemCount(const CSyncMLHistoryJob::TTaskInfo& aTaskInfo, TInt aType)
	{
	TInt count = 0;

	switch (aType)
		{
		case ELogAddedPhone:
			count = aTaskInfo.iServerItemsAdded;
			break;
		case ELogUpdatedPhone:
			count = aTaskInfo.iServerItemsChanged;
			break;
		case ELogDeletedPhone:
			count = aTaskInfo.iServerItemsDeleted;
			break;
		case ELogDiscardedPhone:
			count = aTaskInfo.iServerItemsFailed;
			break;
		case ELogMovedPhone:
			count = aTaskInfo.iServerItemsMoved;
			break;

		case ELogAddedServer:
			count = aTaskInfo.iItemsAdded;
			break;
		case ELogUpdatedServer:
			count = aTaskInfo.iItemsChanged;
			break;
		case ELogDeletedServer:
			count = aTaskInfo.iItemsDeleted;
			break;
		case ELogDiscardedServer:
			count = aTaskInfo.iItemsFailed;
			break;
		case ELogMovedServer:
			count = aTaskInfo.iItemsMoved;
			break;

		default:
			break;
		}

	return count;
	}


// -----------------------------------------------------------------------------
// CAspLogDialog::LogItemTextLC
// 
// -----------------------------------------------------------------------------
HBufC* CAspLogDialog::LogItemTextLC(TInt aType, TInt aDataProviderId, const TDesC& aDisplayName)
	{
	TInt resourceId = KErrNotFound;
	
	if (aDataProviderId == KUidNSmlAdapterContact.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_CONTACTS;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_CONTACTS;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_CONTACTS;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_CONTACTS;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_CONTACTS;
			}
		}
	else if (aDataProviderId == KUidNSmlAdapterCalendar.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_CALENDAR;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_CALENDAR;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_CALENDAR;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_CALENDAR;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_CALENDAR;
			}
		}
	else if (aDataProviderId == KUidNSmlAdapterEMail.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_EMAIL;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_EMAIL;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_EMAIL;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_EMAIL;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_EMAIL;
			}
		}
	else if (aDataProviderId == KUidNSmlAdapterNote.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_NOTES;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_NOTES;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_NOTES;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_NOTES;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_NOTES;
			}
		}
	else if (aDataProviderId == KUidNSmlAdapterSms.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_SMS;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_SMS;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_SMS;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_SMS;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_SMS;
			}
		}
	else if (aDataProviderId == KUidNSmlAdapterMMS.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_MMS;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_MMS;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_MMS;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_MMS;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_MMS;
			}
		}

	else if (aDataProviderId == KUidNSmlAdapterBookmarks.iUid)
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_BKM;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_BKM;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_BKM;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_BKM;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_BKM;
			}
		}
	
	else  // unknown data provider
		{
		if (aType == ELogAddedPhone || aType == ELogAddedServer)
			{
			resourceId = R_QTN_SML_LOG_ADDED_CONTENT;
			}
		if (aType == ELogUpdatedPhone || aType == ELogUpdatedServer)
			{
			resourceId = R_QTN_SML_LOG_UPDATED_CONTENT;
			}
		if (aType == ELogDeletedPhone || aType == ELogDeletedServer)
			{
			resourceId = R_QTN_SML_LOG_DELETED_CONTENT;
			}
		if (aType == ELogDiscardedPhone || aType == ELogDiscardedServer)
			{
			resourceId = R_QTN_SML_LOG_DISCARDED_CONTENT;
			}
		if (aType == ELogMovedPhone || aType == ELogMovedServer)
			{
			resourceId = R_QTN_SML_LOG_MOVED_CONTENT;
			}

        __ASSERT_DEBUG(resourceId != KErrNotFound, TUtil::Panic(KErrGeneral));
        
		return CAspResHandler::ReadLC(resourceId, aDisplayName);
		}
	
	__ASSERT_DEBUG(resourceId != KErrNotFound, TUtil::Panic(KErrGeneral));
	
    return CAspResHandler::ReadLC(resourceId);
	}






//  End of File