ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintfactory.cpp
changeset 0 d11fb78c4374
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintfactory.cpp	Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,401 @@
+/*
+* Copyright (c) 2002-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:  Declares CUPPrintFactory class
+*
+*/
+
+
+
+#include <f32file.h>
+
+#include "cupprintfactory.h"
+#include "upconsts.h"
+#include "cuplogger.h"
+
+_LIT( KHtmFileName, "UPnPPrint_%d.xhtml" );
+_LIT(KUPnPSettingsFile, "settings.txt");
+
+// (TInt64 == 21 chars)*2 + , + \n --> must fit in 50
+const TInt KSettingsLength = 50;
+
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::NewL
+// -----------------------------------------------------------------------------
+//
+CUPPrintFactory* CUPPrintFactory::NewL( )
+{
+	CUPPrintFactory* self = new (ELeave) CUPPrintFactory();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();	// self
+	return self;
+}
+
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::~CUPPrintFactory
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CUPPrintFactory::~CUPPrintFactory( )
+{
+	// No can do if deleting fails -> ignore leave
+    TRAP_IGNORE( DeleteXhtmlFilesL() );
+    iFileSession.Close();
+    iCapabilities.Close();
+}
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::CreateXhtmlFileL
+// -----------------------------------------------------------------------------
+//
+void CUPPrintFactory::CreateXhtmlFileL(const RArray<CImageInfo>& aJobURIs, const TInt aLayout, 
+								  const TInt aPaperSize, const TInt aQuality,
+								  TDes& aXhtmlPrintFile, TInt& aPageCount)
+{
+	if ( aJobURIs.Count() < 1 )
+	{
+		User::Leave( KErrArgument );
+	}
+
+    iFileCount++;
+
+    //Create XHTML-print file
+	aXhtmlPrintFile.Format(KHtmFileName(), iFileCount);
+	
+	// parse XHTML-file
+	CXhtmlFileComposer *fileParser = CXhtmlFileComposer::NewLC(KUPnPXhtmlPath());
+	fileParser->CreateXhtmlFileL(aJobURIs, aLayout, aPaperSize, aQuality, aXhtmlPrintFile, aPageCount);
+	CleanupStack::PopAndDestroy(fileParser);
+}
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::DeleteXhtmlFilesL
+// -----------------------------------------------------------------------------
+//
+void CUPPrintFactory::DeleteXhtmlFilesL( )
+{
+    CFileMan* fileMan = CFileMan::NewL( iFileSession );
+    CleanupStack::PushL( fileMan ); 
+    fileMan->RmDir( KUPnPXhtmlPath() );
+    CleanupStack::PopAndDestroy(fileMan);
+}
+
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::FileCount
+// -----------------------------------------------------------------------------
+//
+TInt CUPPrintFactory::FileCount()
+{
+	return iFileCount;
+}
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::GetCapabilityIDs
+// -----------------------------------------------------------------------------
+//
+void CUPPrintFactory::GetCapabilityIDs(RArray<TInt>& aCapabilityIDs )
+{
+	for (TInt i=0; i < iCapabilities.Count(); i++)
+	{
+		aCapabilityIDs.Append(iCapabilities[i].iCapabilityID);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::GetCapability
+// -----------------------------------------------------------------------------
+//
+TInt CUPPrintFactory::GetCapability(const TInt aCapabilityID, TPrintCapability& aCapability)
+{
+	for (TInt i=0; i < iCapabilities.Count(); i++)
+	{
+		if (aCapabilityID == iCapabilities[i].iCapabilityID)
+		{
+			// copy capability to ouput param
+			aCapability.iCapabilityID 	= aCapabilityID;
+			aCapability.iDefaultValue 	= iCapabilities[i].iDefaultValue;
+			aCapability.iType 			= iCapabilities[i].iType;
+			aCapability.iEnumCount 		= 0;
+
+			
+			for (TInt j=0; j < iCapabilities[i].iEnumCount; j++)
+			{
+				aCapability.iEnumCodes[j] = iCapabilities[i].iEnumCodes[j];
+				aCapability.iEnumCount++;
+			}
+			
+			return KErrNone;
+		}
+	}
+	
+	return KErrNotSupported;
+}
+
+//--------------------------------------------------------------------------------------------
+// CUPPrintFactory::GetPrintSetting
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintFactory::GetPrintSetting(TInt aCapabilityID, TInt& aValue)
+{
+	for (TInt i=0; i<iCapabilities.Count(); i++)
+	{
+		if (iCapabilities[i].iCapabilityID == aCapabilityID)
+		{
+			aValue = iCapabilities[i].iDefaultValue;
+			return KErrNone;
+		}
+	}
+	return KErrNotSupported;
+}
+
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::SetPrintSetting
+// -----------------------------------------------------------------------------
+//
+TInt CUPPrintFactory::SetPrintSetting(TInt aCapabilityID, TInt aValue)
+{
+	for (TInt i=0; i<iCapabilities.Count(); i++)
+	{
+		if (iCapabilities[i].iCapabilityID == aCapabilityID)
+		{
+			// validate value
+			for (TInt j=0; j<iCapabilities[i].iEnumCount; j++)
+			{
+				if ( aValue == iCapabilities[i].iEnumCodes[j] )
+				{
+					iCapabilities[i].iDefaultValue = aValue;
+					TRAPD(err, SetDefaultSettingsL());
+					if(KErrNone != err)
+						LOG1("[CUPPrintFactory::SetPrintSetting]\t Writing default values failed. Error: %d", err);
+					return KErrNone;
+				}
+			}
+			return KErrArgument;
+		}
+	}
+	
+	return KErrNotSupported;
+}
+
+// PRIVATE
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::CUPPrintFactory
+// CPP constructor
+// -----------------------------------------------------------------------------
+//
+CUPPrintFactory::CUPPrintFactory()
+{
+    iFileCount = 0;
+}
+
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::ConstructL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+void CUPPrintFactory::ConstructL( )
+{
+	User::LeaveIfError( iFileSession.Connect() );
+	iFileSession.SetSessionPath( KUPnPDataPath() );	
+
+	// Create data and XHTML-file folder
+	TInt err = iFileSession.MkDirAll( KUPnPDataPath() );
+	if (err == KErrNone || err == KErrAlreadyExists)
+	{
+		err = iFileSession.MkDirAll( KUPnPXhtmlPath() );
+	}
+
+	if (err != KErrNone && err != KErrAlreadyExists)
+	{
+		User::Leave(err);
+	}
+
+	// Init capabilities
+	InitCapabilities();
+
+}
+
+// -----------------------------------------------------------------------------
+// CUPPrintFactory::InitCapabilities
+// -----------------------------------------------------------------------------
+//
+void CUPPrintFactory::InitCapabilities()
+{
+	// Layout
+	TPrintCapability layout;
+	layout.iCapabilityID = EPrintCapabLayout;
+	layout.iType = TPrintCapability::Int;
+	layout.iDefaultValue = EPrintCapabLayout1UpBorderless;
+
+	// Supported layouts
+	layout.iEnumCodes[0] = EPrintCapabLayout1UpBorderless;
+	layout.iEnumCodes[1] = EPrintCapabLayout1UpBorder;
+	layout.iEnumCodes[2] = EPrintCapabLayout2Up;
+	layout.iEnumCodes[3] = EPrintCapabLayout4Up;
+	layout.iEnumCodes[4] = EPrintCapabLayout6Up;
+	layout.iEnumCodes[5] = EPrintCapabLayout9Up;
+	layout.iEnumCodes[6] = EPrintCapabLayout12Up;
+	layout.iEnumCodes[7] = EPrintCapabLayout16Up;
+	layout.iEnumCount = 8;
+	
+	// Quality
+	TPrintCapability quality;
+	quality.iCapabilityID = EPrintCapabQuality;
+	quality.iType = TPrintCapability::Int;
+	quality.iDefaultValue = EPrintCapabQualityNormal;
+
+	// Supported quality
+	quality.iEnumCodes[0] = EPrintCapabQualityNormal;
+	quality.iEnumCount = 1;
+	
+	// Paper size
+	TPrintCapability paper;
+	paper.iCapabilityID = EPrintCapabPaperSize;
+	paper.iType = TPrintCapability::Int;
+	paper.iDefaultValue = EPrintCapabPaperSize4x6;
+
+	// Supported paper sizes
+	paper.iEnumCodes[0] = EPrintCapabPaperSize4x6;
+	paper.iEnumCodes[1] = EPrintCapabPaperSize5x7;
+	paper.iEnumCodes[2] = EPrintCapabPaperSizeA6;
+	paper.iEnumCodes[3] = EPrintCapabPaperSizeA4;
+	paper.iEnumCodes[4] = EPrintCapabPaperSizeLetter;
+	paper.iEnumCount = 5;
+	
+	// Add to settings array
+	TRAPD(err, GetDefaultSettingsL(layout.iDefaultValue, paper.iDefaultValue, quality.iDefaultValue))
+	if(KErrNone != err)
+		LOG1("[CUPPrintFactory::InitCapabilities]\t Reading default values failed. Error: %d", err);
+
+	iCapabilities.Append(layout);
+	iCapabilities.Append(quality);
+	iCapabilities.Append(paper);
+	
+}
+
+//--------------------------------------------------------------------------------------------
+// CUPPrintFactory::GetDefaultSettingsL
+//--------------------------------------------------------------------------------------------
+void CUPPrintFactory::GetDefaultSettingsL(TInt& aLayout, TInt& aSize, TInt& aQuality)
+{
+	LOG("[CUAPrintingJobContainer::GetDefaultSettingsL]\t");
+	
+	RFile file;
+	RFs fs;
+	User::LeaveIfError(file.Open(iFileSession, KUPnPSettingsFile, EFileRead));
+	CleanupClosePushL(file);
+	
+	TInt fileSize = 250;
+	file.Size(fileSize);
+	
+	if(0 >= fileSize)
+		fileSize = 250;
+	
+	// Create buffer
+	HBufC8* fileBuffer = HBufC8::NewL(fileSize);
+	CleanupStack::PushL(fileBuffer);
+
+	TPtr8 bufferPtr( fileBuffer->Des() );
+	bufferPtr.Zero();
+	
+	User::LeaveIfError(file.Read(bufferPtr));
+	LOG81("bufferPtr: %S", &bufferPtr);
+
+	TInt stopper = 0;
+	TInt pos = bufferPtr.Find(KUPnPLineFeed8());
+	while (pos > 0 && stopper < 20)
+	{
+		++stopper;
+		LOG("----------------");
+
+		TLex8 lex(bufferPtr.Left(pos));
+		LOG81("bufferPtr.Left(pos): %S", &(bufferPtr.Left(pos)));
+
+		// get id
+		if ((lex.Peek()).IsDigit()) 
+		{
+			TInt id;
+			TInt err =  lex.Val(id);
+			LOG1("id: %d", id);
+			
+			bufferPtr = bufferPtr.Right(bufferPtr.Length() - lex.Offset()-1);
+			lex.Assign(bufferPtr);
+
+			//get value
+			if ((lex.Peek()).IsDigit()) 
+			{
+				switch( id ) 
+				{
+					case EPrintCapabLayout:
+						User::LeaveIfError(lex.Val(aLayout));
+						LOG1("aLayout: %d", aLayout);
+						break;
+					case EPrintCapabPaperSize:
+						User::LeaveIfError(lex.Val(aSize));
+						LOG1("aSize: %d", aLayout);
+						break;
+					case EPrintCapabQuality:
+						User::LeaveIfError(lex.Val(aQuality));
+						LOG1("aQuality: %d", aQuality);
+						break;
+					default:
+						break;
+				}
+
+				bufferPtr = bufferPtr.Right(bufferPtr.Length() - lex.Offset()-1);
+				lex.Assign(bufferPtr);
+			}
+		}
+		// find next
+		pos = bufferPtr.Find(KUPnPLineFeed8());
+	}
+	CleanupStack::PopAndDestroy(2); //fileBuffer, file
+}
+
+//--------------------------------------------------------------------------------------------
+// CUPPrintFactory::SetDefaultSettingsL
+//--------------------------------------------------------------------------------------------
+void CUPPrintFactory::SetDefaultSettingsL()
+{
+	LOG("[CUAPrintingJobContainer::SetDefaultSettingsL]\t");
+	
+	// Create buffer
+	HBufC8* settingsBuf = HBufC8::NewL(KSettingsLength * iCapabilities.Count());
+	CleanupStack::PushL(settingsBuf);
+
+	for (TInt i=0; i<iCapabilities.Count(); i++)
+	{
+		
+		TBuf8<50> settingsStr;
+		settingsStr.AppendNum(iCapabilities[i].iCapabilityID);
+		settingsStr.Append(KUPnPComma());
+		settingsStr.AppendNum(iCapabilities[i].iDefaultValue);
+		settingsStr.Append(KUPnPLineFeed8());
+
+		settingsBuf->Des().Append(settingsStr);
+	}
+	
+	RFile file;
+	User::LeaveIfError(file.Replace(iFileSession, KUPnPSettingsFile, EFileWrite));
+	CleanupClosePushL(file);
+	file.Write(settingsBuf->Des());
+
+	CleanupStack::PopAndDestroy(2); //file, settingsBuf
+}
+
+// End of file