appfw/apparchitecture/apgrfx/APGPRIV.CPP
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/apparchitecture/apgrfx/APGPRIV.CPP	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,191 @@
+// Copyright (c) 1997-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:
+// apgpriv.cpp
+//
+
+#include "APGPRIV.H"
+#include <e32hal.h>
+#include <s32strm.h>
+#include "APGCLI.H"
+#include "APGICNFL.H"
+#include "APGSTD.H"
+
+#define KDefaultIconSizeInPixels TSize(96,96)
+
+CApaIconPicture* CApaIconPicture::NewL(const TSize& aIconSizeInTwips, const TUid aAppUid)
+	{
+	CApaIconPicture* self=new(ELeave) CApaIconPicture(aIconSizeInTwips, aAppUid);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->CreateIconL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CApaIconPicture::CApaIconPicture(const TSize& aIconSizeInTwips, const TUid aAppUid)
+	: iAppUid(aAppUid),
+	iOriginalSizeInTwips(aIconSizeInTwips),
+	iScaleFactorWidth(1000),
+	iScaleFactorHeight(1000)
+	{
+	}
+
+void CApaIconPicture::ConstructL()
+	{
+	TMachineInfoV1Buf machineInfoBuf;
+	User::LeaveIfError( UserHal::MachineInfo(machineInfoBuf) );
+	TMachineInfoV1& machineInfo=machineInfoBuf();
+	iDisplaySizeInTwips = machineInfo.iPhysicalScreenSize;
+	iDisplaySizeInPixels = machineInfo.iDisplaySizeInPixels;
+	//
+	}
+
+CApaIconPicture::~CApaIconPicture()
+	{
+	delete iIcon;
+	}
+
+
+void CApaIconPicture::CreateIconL()
+	{
+	// calculate the size of icon required in pixels
+	TSize sizeInPixels;
+	sizeInPixels.iWidth = (iOriginalSizeInTwips.iWidth*iDisplaySizeInPixels.iWidth*ScaleFactorWidth())/(iDisplaySizeInTwips.iWidth*1000);
+	sizeInPixels.iHeight = (iOriginalSizeInTwips.iHeight*iDisplaySizeInPixels.iHeight*ScaleFactorHeight())/(iDisplaySizeInTwips.iHeight*1000);
+	// if the required icon is not square get a large one and gdi will squash it during drawing
+	CApaMaskedBitmap* newIcon = CApaMaskedBitmap::NewLC();
+	RApaLsSession ls;
+	CleanupClosePushL(ls);
+	User::LeaveIfError(ls.Connect());
+	User::LeaveIfError(ls.GetAppIcon(iAppUid, sizeInPixels, *newIcon));
+	delete iIcon;
+	iIcon = newIcon;
+	CleanupStack::PopAndDestroy(&ls);
+	CleanupStack::Pop(newIcon);
+	//
+	// set physical size
+	TSize iconSizeInTwips;
+	iconSizeInTwips.iWidth = (iOriginalSizeInTwips.iWidth*ScaleFactorWidth())/1000;
+	iconSizeInTwips.iHeight = (iOriginalSizeInTwips.iHeight*ScaleFactorHeight())/1000;
+	iIcon->SetSizeInTwips(iconSizeInTwips);
+	}
+
+void CApaIconPicture::Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,
+						   MGraphicsDeviceMap* aMap) const
+	{
+	__ASSERT_DEBUG(iIcon,Panic(EDPanicNoIconInPicture));
+	//
+	TSize sizeInPixels(0,0);
+	sizeInPixels.iWidth = aMap->HorizontalTwipsToPixels(iOriginalSizeInTwips.iWidth);
+	sizeInPixels.iHeight = aMap->VerticalTwipsToPixels(iOriginalSizeInTwips.iHeight);
+	sizeInPixels.iWidth = (ScaleFactorWidth()*sizeInPixels.iWidth)/1000;
+	sizeInPixels.iHeight = (ScaleFactorHeight()*sizeInPixels.iHeight)/1000;
+	//
+	TRect originalRectInPixels(aTopLeft,sizeInPixels);
+	aGc.SetClippingRect(aClipRect);
+	aGc.DrawBitmap(originalRectInPixels,iIcon);
+	aGc.CancelClippingRect();
+	}
+
+	
+void CApaIconPicture::InternalizeL(RReadStream& /*aStream*/)
+	{} //lint !e1762 Suppress member function could be made const
+
+
+	
+void CApaIconPicture::ExternalizeL(RWriteStream& /*aStream*/)const
+	{}
+
+
+void CApaIconPicture::GetOriginalSizeInTwips(TSize& aOriginalSize) const
+	{
+	aOriginalSize = iOriginalSizeInTwips;
+	}
+
+
+void CApaIconPicture::SetScaleFactor(TInt aScaleFactorWidth,TInt aScaleFactorHeight)
+	{
+	iScaleFactorWidth = aScaleFactorWidth;
+	iScaleFactorHeight = aScaleFactorHeight;
+	TRAP_IGNORE(CreateIconL()); // ignore any error, just keep using the current icon instead
+	}
+
+
+TInt CApaIconPicture::ScaleFactorWidth() const
+	{
+	return iScaleFactorWidth;
+	}
+
+
+TInt CApaIconPicture::ScaleFactorHeight() const
+	{
+	return iScaleFactorHeight;
+	}
+
+
+TPictureCapability CApaIconPicture::Capability() const
+	{
+	return TPictureCapability(TPictureCapability::ENotScaleable,EFalse); // scalable, not cropable
+	}
+
+
+//
+// class CApaAppServiceInfoArrayImpl
+//
+
+void CleanupAppServiceArray(TAny* aServiceArray)
+	{
+	__ASSERT_DEBUG(aServiceArray, Panic(EPanicNullPointer));
+	CArrayFixFlat<TApaAppServiceInfo>* serviceArray = static_cast<CArrayFixFlat<TApaAppServiceInfo>*>(aServiceArray);
+	TInt serviceCount = serviceArray->Count();
+	if (serviceCount > 0)
+		{
+		for (TInt i = serviceCount - 1; i >= 0; i--)
+			{
+			(*serviceArray)[i].Release();
+			}
+		}
+	delete serviceArray;
+	serviceArray = 0;
+	}
+
+CApaAppServiceInfoArrayImpl* CApaAppServiceInfoArrayImpl::NewL(CArrayFix<TApaAppServiceInfo>* aServiceInfoArray)
+	{
+	CApaAppServiceInfoArrayImpl* self = new CApaAppServiceInfoArrayImpl(aServiceInfoArray);
+	if (!self)
+		{
+		CleanupAppServiceArray(aServiceInfoArray);
+		User::LeaveNoMemory();
+		}
+	return self;
+	}
+
+CApaAppServiceInfoArrayImpl::CApaAppServiceInfoArrayImpl(CArrayFix<TApaAppServiceInfo>* aServiceInfoArray)
+	: iServiceInfoArray(aServiceInfoArray)
+	{
+	}
+
+CApaAppServiceInfoArrayImpl::~CApaAppServiceInfoArrayImpl()
+	{
+	CleanupAppServiceArray(iServiceInfoArray);
+	iServiceInfoArray = NULL;
+	}
+
+TArray<TApaAppServiceInfo> CApaAppServiceInfoArrayImpl::Array()
+	{
+	return iServiceInfoArray->Array();
+	}
+
+
+