DirectPrint/DirectPrintServer/src/directprintprotocolsloader.cpp
changeset 19 2275db202402
parent 11 613a5ff70823
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DirectPrint/DirectPrintServer/src/directprintprotocolsloader.cpp	Tue May 11 14:10:02 2010 +0800
@@ -0,0 +1,241 @@
+/*
+* Copyright (c) 2010 Kanrikogaku Kenkyusho, Ltd.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Kanrikogaku Kenkyusho, Ltd. - Initial contribution
+*
+* Contributors:
+*
+* Description:  Contains the CDirectPrintProtocolsLoader class definition.
+*
+*/
+
+
+#include <ecom/ecom.h>
+
+#include "directprintprotocolsloader.h"
+#include "mprotprintingdevice.h"
+#include "clog.h"
+#include "imageprint.h"
+
+namespace
+	{
+	const TUid KDirectPrintEcomUid = { 0x10208A1E };
+	}
+
+CDirectPrintProtocolsLoader* CDirectPrintProtocolsLoader::NewL()
+	{		
+	LOG("[CDirectPrintProtocolsLoader::NewL]\t Begin");
+	CDirectPrintProtocolsLoader* self = new (ELeave) CDirectPrintProtocolsLoader();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	LOG("[CDirectPrintProtocolsLoader::NewL]\t End");
+	return self;	
+	}
+
+
+CDirectPrintProtocolsLoader::~CDirectPrintProtocolsLoader()
+	{
+	LOG("[CDirectPrintProtocolsLoader::~CDirectPrintProtocolsLoader]\t Begin");
+	iProtocols.ResetAndDestroy();
+	iProtocolInfos.ResetAndDestroy();
+	LOG("[CDirectPrintProtocolsLoader::~CDirectPrintProtocolsLoader]\t End");
+	}
+
+
+TInt CDirectPrintProtocolsLoader::GetNumberOfProtocolsAvailable() const
+	{
+	LOG("[CDirectPrintProtocolsLoader::GetNumberOfProtocolsAvailable]\t Begin");	
+	LOG1("[CDirectPrintProtocolsLoader::GetNumberOfProtocolsAvailable]\t return: %d", iAvailableProtocols);
+	LOG("[CDirectPrintProtocolsLoader::GetNumberOfProtocolsAvailable]\t End");
+	return iAvailableProtocols;
+	}
+
+
+MProtPrintingDevice* CDirectPrintProtocolsLoader::GetNextProtocol()
+	{
+	LOG("[CDirectPrintProtocolsLoader::GetNextProtocol]\t Begin");
+	if (iAvailableProtocols <= 0)
+		return NULL;
+
+	if (iProtIndex == iAvailableProtocols)
+		iProtIndex = 0;
+
+	MProtPrintingDevice* temp = iProtocols[iProtIndex];
+	iProtIndex++;
+	LOG("[CDirectPrintProtocolsLoader::GetNextProtocol]\t End");
+	return temp;
+	}
+
+
+MProtPrintingDevice* CDirectPrintProtocolsLoader::GetProtocolAt(TInt aIndex)
+	{
+	LOG("[CDirectPrintProtocolsLoader::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("[CDirectPrintProtocolsLoader::GetProtocolAt]\t End");
+	return temp;
+	
+	}
+
+
+void CDirectPrintProtocolsLoader::Reset()
+	{
+	LOG("[CDirectPrintProtocolsLoader::Reset]\t Begin");
+	iProtIndex = 0;
+	LOG("[CDirectPrintProtocolsLoader::Reset]\t End");
+	}
+
+
+TInt CDirectPrintProtocolsLoader::GetProtocolIndex() const
+	{
+	LOG("[CDirectPrintProtocolsLoader::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("[CDirectPrintProtocolsLoader::GetProtocolIndex] return: %d", retVal);
+	LOG("[CDirectPrintProtocolsLoader::GetProtocolIndex]\t End");
+	return retVal;
+	}
+
+
+TUint CDirectPrintProtocolsLoader::SupportedProtocols() const
+	{
+	LOG("[CDirectPrintProtocolsLoader::SupportedProtocols]\t Begin");
+	LOG1("[CDirectPrintProtocolsLoader::SupportedProtocols] return: %d", iSupportedProtocols);
+	LOG("[CDirectPrintProtocolsLoader::SupportedProtocols]\t End");
+	return iSupportedProtocols;
+	}
+
+
+TInt CDirectPrintProtocolsLoader::GetProtocolName(TInt aIndex, TDes& aName, TInt& aUid)
+	{
+	TInt retVal = KErrNone;
+
+	if( iAvailableProtocols <= 0 )
+		{
+		retVal = KErrNotFound;
+		}
+	else
+		{
+		CDirectPrintProtocolInfo* info = NULL;
+
+		if (aIndex < 0)
+			{
+			info = iProtocolInfos[0];
+			}
+		else
+			{
+			if (aIndex >= iAvailableProtocols)
+				{
+				info = iProtocolInfos[iAvailableProtocols - 1];
+				}
+			else
+				{
+				info = iProtocolInfos[aIndex];
+				}
+			}
+
+		if (info)
+			{
+			aName.Copy(info->DisplayName());
+			aUid = info->ImplementationUid().iUid;
+			}
+		}
+
+	return retVal;
+	}
+
+
+CDirectPrintProtocolsLoader::CDirectPrintProtocolsLoader()
+	{
+	LOG("[CDirectPrintProtocolsLoader::CDirectPrintProtocolsLoader]\t Begin");
+	iAvailableProtocols = 0;
+	iProtIndex = 0;
+	iSupportedProtocols = 0;
+	LOG("[CDirectPrintProtocolsLoader::CDirectPrintProtocolsLoader]\t End");
+	}
+
+void CDirectPrintProtocolsLoader::ConstructL()
+	{
+	LOG("[CDirectPrintProtocolsLoader::ConstructL]\t Begin");
+	LoadL();
+	LOG("[CDirectPrintProtocolsLoader::ConstructL]\t End");
+	}
+
+void CDirectPrintProtocolsLoader::LoadL()
+	{
+	LOG("[CDirectPrintProtocolsLoader::LoadL]\t Begin");
+	RImplInfoPtrArray infoArray;
+	REComSession::ListImplementationsL( KDirectPrintEcomUid, infoArray );
+	CleanupClosePushL( infoArray );
+	MProtPrintingDevice* device = NULL;
+	LOG1("CDirectPrintProtocolsLoader::LoadL infoArray.Count(): %d", infoArray.Count());
+	for( TInt i = 0; i < infoArray.Count(); i++ )
+		{
+		LOG1("CDirectPrintProtocolsLoader::LoadL i: %d", i);
+		CImplementationInformation* info = infoArray[i];
+		if (info->Version() == 2)
+			{
+			CDirectPrintProtocolInfo* protocolInfo = CDirectPrintProtocolInfo::NewLC(*info);
+			iProtocolInfos.AppendL( protocolInfo );
+			CleanupStack::Pop( protocolInfo );
+
+			TPtrC8 dataType = info->DataType();
+			TEComResolverParams resolverParams;
+			resolverParams.SetDataType( dataType );
+			resolverParams.SetWildcardMatch( ETrue );
+			TAny* prot = REComSession::CreateImplementationL( KDirectPrintEcomUid,
+					_FOFF( MProtPrintingDevice, iDtor_ID_Key ), NULL, resolverParams );
+			device = reinterpret_cast<MProtPrintingDevice*>(prot);
+			//device->ConstructL( KNullDesC );
+			//device = reinterpret_cast<MProtPrintingDevice*>(prot);
+
+			TCleanupItem clItem( CleanupProt, device );
+			CleanupStack::PushL( clItem );
+			device->ConstructL( KNullDesC );
+			LOG1("CDirectPrintProtocolsLoader::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("[CDirectPrintProtocolsLoader::LoadL]\t End");
+	}
+
+void CDirectPrintProtocolsLoader::CleanupProt( TAny* aData )
+    {
+    LOG("[CDirectPrintProtocolsLoader::CleanupProt]\t Begin");
+    MProtPrintingDevice* prot = (MProtPrintingDevice*)aData;
+    delete prot;
+    LOG("[CDirectPrintProtocolsLoader::CleanupProt]\t End");
+    }
+
+//  End of File