// Copyright (c) 2000-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 <smut.h>
#include <msvstd.h>
#include <msventry.h>
#include <msvids.h>
#include <msvuids.h>
#include <watcher.h>
#include <pushentry.h>
#include <push/pushlog.h>
#include <push/cwappushmsgutils.h>
EXPORT_C CWapPushMsgUtils* CWapPushMsgUtils::NewL()
/**
Allocates and constructs a new Wap Push Message Utility object.
@return 
New Wap Push Message Utility object.
@leave CWapPushMsgUtils::ConstructL
*/
	{
	CWapPushMsgUtils* self = new (ELeave) CWapPushMsgUtils();
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop();
	return self;
	}
EXPORT_C CWapPushMsgUtils::CWapPushMsgUtils()
	:iPushServiceId(KMsvNullIndexEntryId), iPushFolderId(KMsvNullIndexEntryId)
/**
Constructor.  
*/
	{
	}
EXPORT_C void CWapPushMsgUtils::ConstructL()
/**
Second stage constructor. Creates CMsvSession and CMsvEntry.   
@leave CMsvSession::OpenSyncL
@leave CMsvSession::GetEntryL
@leave CMsvSession::SetSortTypeL
*/
	{
	iMsvSession = CMsvSession::OpenSyncL(*this);
	iMsvEntry = iMsvSession->GetEntryL(KMsvRootIndexEntryId);
	
	// Ensure that our CMsvEntry can always see invisible entries
	TMsvSelectionOrdering sort;
	sort.SetShowInvisibleEntries(ETrue);
	iMsvEntry->SetSortTypeL(sort);
	}
EXPORT_C CWapPushMsgUtils::~CWapPushMsgUtils()
/**
Destructor.
*/
	{
	delete iMsvEntry;
	delete iMsvSession;
	}
EXPORT_C void CWapPushMsgUtils::GetServiceIdL(TUid aMtm, TMsvId& aServiceId)
/**
Gets the Id of the Push Message Service Entry. 
If there is no service entry then KMsvNullIndexEntry is returned. 
 
@param aMtm 
MTM type of the required service entry
@param aServiceId 
Id of the service entry
*/
	{
	//Returns the Service IDs of MTM aMtm
	
	if (iPushServiceId != KMsvNullIndexEntryId)
		{
		aServiceId = iPushServiceId;
		return;
		}
	aServiceId = KMsvNullIndexEntryId;
	iMsvEntry->SetEntryL(KMsvRootIndexEntryId);
	//Get the children on the Root Index Entry
	CMsvEntrySelection* selection = iMsvEntry->ChildrenWithTypeL(KUidMsvServiceEntry);
	CleanupStack::PushL(selection);
	TInt count = selection->Count();
	//Find an entry for MTM aMtm
	for (TInt curChild = 0; curChild < count && (aServiceId == KMsvNullIndexEntryId ); curChild++)
		{
		iMsvEntry->SetEntryL(selection->At(curChild));
		if (iMsvEntry->Entry().iMtm == aMtm)
			{
			TMsvId id = iMsvEntry->Entry().Id();
			if (aServiceId == KMsvNullIndexEntryId)
				aServiceId = id;
			}
		}
	iMsvEntry->SetEntryL(KMsvRootIndexEntryId);//Point our entry to something safe
	//If the service Id is not set and we're not doing not self assignment store the ID
	if (aServiceId != KMsvNullIndexEntryId && (&iPushServiceId != &aServiceId) ) 
		iPushServiceId = aServiceId;  
	CleanupStack::PopAndDestroy(); //selection
	}