ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cprotocolsloader.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:45:53 +0200
changeset 0 d11fb78c4374
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2004-2007 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:  Contains the CProtocolsLoader class definition.
*
*/


#include <ecom/ecom.h>

#include "cprotocolsloader.h"
#include "mprotprintingdevice.h"
#include "clog.h"
#include "imageprint.h"

namespace
	{
	const TUid KImagePrintEcomUid = { 0x10208A1E };
	}

CProtocolsLoader* CProtocolsLoader::NewL()
	{		
	LOG("[CProtocolsLoader::NewL]\t Begin");
	CProtocolsLoader* self = new (ELeave) CProtocolsLoader();
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	LOG("[CProtocolsLoader::NewL]\t End");
	return self;	
	}


CProtocolsLoader::~CProtocolsLoader()
	{
	LOG("[CProtocolsLoader::~CProtocolsLoader]\t Begin");
	iProtocols.ResetAndDestroy(); 
	LOG("[CProtocolsLoader::~CProtocolsLoader]\t End");
	}


TInt CProtocolsLoader::GetNumberOfProtocolsAvailable() const
	{
	LOG("[CProtocolsLoader::GetNumberOfProtocolsAvailable]\t Begin");	
	LOG1("[CProtocolsLoader::GetNumberOfProtocolsAvailable]\t return: %d", iAvailableProtocols);
	LOG("[CProtocolsLoader::GetNumberOfProtocolsAvailable]\t End");
	return iAvailableProtocols;
	}


MProtPrintingDevice* CProtocolsLoader::GetNextProtocol()
	{
	LOG("[CProtocolsLoader::GetNextProtocol]\t Begin");
	if (iAvailableProtocols <= 0)
		return NULL;

	if (iProtIndex == iAvailableProtocols)
		iProtIndex = 0;

	MProtPrintingDevice* temp = iProtocols[iProtIndex];
	iProtIndex++;
	LOG("[CProtocolsLoader::GetNextProtocol]\t End");
	return temp;
	}


MProtPrintingDevice* CProtocolsLoader::GetProtocolAt(TInt aIndex)
	{
	LOG("[CProtocolsLoader::GetProtocolAt]\t Begin");
	if( iAvailableProtocols <= 0 ) return NULL;

	MProtPrintingDevice* temp = NULL;

	if (aIndex < 0)
		temp = (MProtPrintingDevice*) iProtocols[0];
	else
		if (aIndex >= iAvailableProtocols)
			temp = (MProtPrintingDevice*) iProtocols[iAvailableProtocols - 1];
		else
			temp = (MProtPrintingDevice*) iProtocols[aIndex];

	LOG("[CProtocolsLoader::GetProtocolAt]\t End");
	return temp;
	
	}


void CProtocolsLoader::Reset()
	{
	LOG("[CProtocolsLoader::Reset]\t Begin");
	iProtIndex = 0;
	LOG("[CProtocolsLoader::Reset]\t End");
	}


TInt CProtocolsLoader::GetProtocolIndex() const
	{
	LOG("[CProtocolsLoader::GetProtocolIndex]\t Begin");

	TInt retVal = iProtIndex - 1;
	// The next check is probably unnecessary since GetNextProtocol() should only leave iProtIndex with
	// a value between 1 and iAvailableProtocols
	if (retVal < 0)
	{
		retVal = iProtocols.Count() - 1;
	}
	LOG1("[CProtocolsLoader::GetProtocolIndex] return: %d", retVal);
	LOG("[CProtocolsLoader::GetProtocolIndex]\t End");
	return retVal;
	}


TUint CProtocolsLoader::SupportedProtocols() const
	{
	LOG("[CProtocolsLoader::SupportedProtocols]\t Begin");
	LOG1("[CProtocolsLoader::SupportedProtocols] return: %d", iSupportedProtocols);
	LOG("[CProtocolsLoader::SupportedProtocols]\t End");
	return iSupportedProtocols;
	}


CProtocolsLoader::CProtocolsLoader()
	{
	LOG("[CProtocolsLoader::CProtocolsLoader]\t Begin");
	iAvailableProtocols = 0;
	iProtIndex = 0;
	iSupportedProtocols = 0;
	LOG("[CProtocolsLoader::CProtocolsLoader]\t End");
	}

void CProtocolsLoader::ConstructL()
	{
	LOG("[CProtocolsLoader::ConstructL]\t Begin");
	LoadL();
	LOG("[CProtocolsLoader::ConstructL]\t End");
	}

void CProtocolsLoader::LoadL()
	{
	LOG("[CProtocolsLoader::LoadL]\t Begin");	
	RImplInfoPtrArray infoArray;		
	REComSession::ListImplementationsL( KImagePrintEcomUid, infoArray );	
	CleanupClosePushL( infoArray );		
	MProtPrintingDevice* device = NULL;	
	LOG1("CProtocolsLoader::LoadL infoArray.Count(): %d", infoArray.Count());		
	for( TInt i = 0; i < infoArray.Count(); i++ )
		{		
		LOG1("CProtocolsLoader::LoadL i: %d", i);
		TPtrC8 dataType = infoArray[i]->DataType();
		TEComResolverParams resolverParams;
		resolverParams.SetDataType( dataType );
		resolverParams.SetWildcardMatch( ETrue );		
		TAny* prot = REComSession::CreateImplementationL( KImagePrintEcomUid,
				_FOFF( MProtPrintingDevice, iDtor_ID_Key ), NULL, resolverParams );
		device = static_cast<MProtPrintingDevice*>(prot);						
		TCleanupItem clItem( CleanupProt, device );
        CleanupStack::PushL( clItem );				
		device->ConstructL( KNullDesC );
		LOG1("CProtocolsLoader::LoadL device->SupportedProtocols(): %d", device->SupportedProtocols());			
		iProtocols.AppendL( device );
		iSupportedProtocols |= device->SupportedProtocols();														
		CleanupStack::Pop(); // device
		device = NULL;		
		}

	infoArray.ResetAndDestroy();
	CleanupStack::PopAndDestroy(); // infoArray		
	
	iAvailableProtocols = iProtocols.Count();
	LOG("[CProtocolsLoader::LoadL]\t End");
	}
				
void CProtocolsLoader::CleanupProt( TAny* aData )
    {
    LOG("[CProtocolsLoader::CleanupProt]\t Begin");
    MProtPrintingDevice* prot = (MProtPrintingDevice*)aData;
    delete prot;
    LOG("[CProtocolsLoader::CleanupProt]\t End");
    }	

//  End of File