ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintfactory.cpp
branchGCC_SURGE
changeset 25 59ea2209bb67
parent 23 08cc4cc059d4
parent 15 a92d00fca574
equal deleted inserted replaced
23:08cc4cc059d4 25:59ea2209bb67
     1 /*
       
     2 * Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Declares CUPPrintFactory class
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include <f32file.h>
       
    21 
       
    22 #include "cupprintfactory.h"
       
    23 #include "upconsts.h"
       
    24 #include "cuplogger.h"
       
    25 
       
    26 _LIT( KHtmFileName, "UPnPPrint_%d.xhtml" );
       
    27 _LIT(KUPnPSettingsFile, "settings.txt");
       
    28 
       
    29 // (TInt64 == 21 chars)*2 + , + \n --> must fit in 50
       
    30 const TInt KSettingsLength = 50;
       
    31 
       
    32 
       
    33 // -----------------------------------------------------------------------------
       
    34 // CUPPrintFactory::NewL
       
    35 // -----------------------------------------------------------------------------
       
    36 //
       
    37 CUPPrintFactory* CUPPrintFactory::NewL( )
       
    38 {
       
    39 	CUPPrintFactory* self = new (ELeave) CUPPrintFactory();
       
    40 	CleanupStack::PushL(self);
       
    41 	self->ConstructL();
       
    42 	CleanupStack::Pop();	// self
       
    43 	return self;
       
    44 }
       
    45 
       
    46 
       
    47 // -----------------------------------------------------------------------------
       
    48 // CUPPrintFactory::~CUPPrintFactory
       
    49 // Destructor
       
    50 // -----------------------------------------------------------------------------
       
    51 //
       
    52 CUPPrintFactory::~CUPPrintFactory( )
       
    53 {
       
    54 	// No can do if deleting fails -> ignore leave
       
    55     TRAP_IGNORE( DeleteXhtmlFilesL() );
       
    56     iFileSession.Close();
       
    57     iCapabilities.Close();
       
    58 }
       
    59 
       
    60 // -----------------------------------------------------------------------------
       
    61 // CUPPrintFactory::CreateXhtmlFileL
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 void CUPPrintFactory::CreateXhtmlFileL(const RArray<CImageInfo>& aJobURIs, const TInt aLayout, 
       
    65 								  const TInt aPaperSize, const TInt aQuality,
       
    66 								  TDes& aXhtmlPrintFile, TInt& aPageCount)
       
    67 {
       
    68 	if ( aJobURIs.Count() < 1 )
       
    69 	{
       
    70 		User::Leave( KErrArgument );
       
    71 	}
       
    72 
       
    73     iFileCount++;
       
    74 
       
    75     //Create XHTML-print file
       
    76 	aXhtmlPrintFile.Format(KHtmFileName(), iFileCount);
       
    77 	
       
    78 	// parse XHTML-file
       
    79 	CXhtmlFileComposer *fileParser = CXhtmlFileComposer::NewLC(KUPnPXhtmlPath());
       
    80 	fileParser->CreateXhtmlFileL(aJobURIs, aLayout, aPaperSize, aQuality, aXhtmlPrintFile, aPageCount);
       
    81 	CleanupStack::PopAndDestroy(fileParser);
       
    82 }
       
    83 
       
    84 // -----------------------------------------------------------------------------
       
    85 // CUPPrintFactory::DeleteXhtmlFilesL
       
    86 // -----------------------------------------------------------------------------
       
    87 //
       
    88 void CUPPrintFactory::DeleteXhtmlFilesL( )
       
    89 {
       
    90     CFileMan* fileMan = CFileMan::NewL( iFileSession );
       
    91     CleanupStack::PushL( fileMan ); 
       
    92     fileMan->RmDir( KUPnPXhtmlPath() );
       
    93     CleanupStack::PopAndDestroy(fileMan);
       
    94 }
       
    95 
       
    96 
       
    97 // -----------------------------------------------------------------------------
       
    98 // CUPPrintFactory::FileCount
       
    99 // -----------------------------------------------------------------------------
       
   100 //
       
   101 TInt CUPPrintFactory::FileCount()
       
   102 {
       
   103 	return iFileCount;
       
   104 }
       
   105 
       
   106 // -----------------------------------------------------------------------------
       
   107 // CUPPrintFactory::GetCapabilityIDs
       
   108 // -----------------------------------------------------------------------------
       
   109 //
       
   110 void CUPPrintFactory::GetCapabilityIDs(RArray<TInt>& aCapabilityIDs )
       
   111 {
       
   112 	for (TInt i=0; i < iCapabilities.Count(); i++)
       
   113 	{
       
   114 		aCapabilityIDs.Append(iCapabilities[i].iCapabilityID);
       
   115 	}
       
   116 }
       
   117 
       
   118 // -----------------------------------------------------------------------------
       
   119 // CUPPrintFactory::GetCapability
       
   120 // -----------------------------------------------------------------------------
       
   121 //
       
   122 TInt CUPPrintFactory::GetCapability(const TInt aCapabilityID, TPrintCapability& aCapability)
       
   123 {
       
   124 	for (TInt i=0; i < iCapabilities.Count(); i++)
       
   125 	{
       
   126 		if (aCapabilityID == iCapabilities[i].iCapabilityID)
       
   127 		{
       
   128 			// copy capability to ouput param
       
   129 			aCapability.iCapabilityID 	= aCapabilityID;
       
   130 			aCapability.iDefaultValue 	= iCapabilities[i].iDefaultValue;
       
   131 			aCapability.iType 			= iCapabilities[i].iType;
       
   132 			aCapability.iEnumCount 		= 0;
       
   133 
       
   134 			
       
   135 			for (TInt j=0; j < iCapabilities[i].iEnumCount; j++)
       
   136 			{
       
   137 				aCapability.iEnumCodes[j] = iCapabilities[i].iEnumCodes[j];
       
   138 				aCapability.iEnumCount++;
       
   139 			}
       
   140 			
       
   141 			return KErrNone;
       
   142 		}
       
   143 	}
       
   144 	
       
   145 	return KErrNotSupported;
       
   146 }
       
   147 
       
   148 //--------------------------------------------------------------------------------------------
       
   149 // CUPPrintFactory::GetPrintSetting
       
   150 //--------------------------------------------------------------------------------------------
       
   151 TInt CUPPrintFactory::GetPrintSetting(TInt aCapabilityID, TInt& aValue)
       
   152 {
       
   153 	for (TInt i=0; i<iCapabilities.Count(); i++)
       
   154 	{
       
   155 		if (iCapabilities[i].iCapabilityID == aCapabilityID)
       
   156 		{
       
   157 			aValue = iCapabilities[i].iDefaultValue;
       
   158 			return KErrNone;
       
   159 		}
       
   160 	}
       
   161 	return KErrNotSupported;
       
   162 }
       
   163 
       
   164 
       
   165 // -----------------------------------------------------------------------------
       
   166 // CUPPrintFactory::SetPrintSetting
       
   167 // -----------------------------------------------------------------------------
       
   168 //
       
   169 TInt CUPPrintFactory::SetPrintSetting(TInt aCapabilityID, TInt aValue)
       
   170 {
       
   171 	for (TInt i=0; i<iCapabilities.Count(); i++)
       
   172 	{
       
   173 		if (iCapabilities[i].iCapabilityID == aCapabilityID)
       
   174 		{
       
   175 			// validate value
       
   176 			for (TInt j=0; j<iCapabilities[i].iEnumCount; j++)
       
   177 			{
       
   178 				if ( aValue == iCapabilities[i].iEnumCodes[j] )
       
   179 				{
       
   180 					iCapabilities[i].iDefaultValue = aValue;
       
   181 					TRAPD(err, SetDefaultSettingsL());
       
   182 					if(KErrNone != err)
       
   183 						LOG1("[CUPPrintFactory::SetPrintSetting]\t Writing default values failed. Error: %d", err);
       
   184 					return KErrNone;
       
   185 				}
       
   186 			}
       
   187 			return KErrArgument;
       
   188 		}
       
   189 	}
       
   190 	
       
   191 	return KErrNotSupported;
       
   192 }
       
   193 
       
   194 // PRIVATE
       
   195 // -----------------------------------------------------------------------------
       
   196 // CUPPrintFactory::CUPPrintFactory
       
   197 // CPP constructor
       
   198 // -----------------------------------------------------------------------------
       
   199 //
       
   200 CUPPrintFactory::CUPPrintFactory()
       
   201 {
       
   202     iFileCount = 0;
       
   203 }
       
   204 
       
   205 
       
   206 // -----------------------------------------------------------------------------
       
   207 // CUPPrintFactory::ConstructL
       
   208 // Two-phased constructor
       
   209 // -----------------------------------------------------------------------------
       
   210 //
       
   211 void CUPPrintFactory::ConstructL( )
       
   212 {
       
   213 	User::LeaveIfError( iFileSession.Connect() );
       
   214 	iFileSession.SetSessionPath( KUPnPDataPath() );	
       
   215 
       
   216 	// Create data and XHTML-file folder
       
   217 	TInt err = iFileSession.MkDirAll( KUPnPDataPath() );
       
   218 	if (err == KErrNone || err == KErrAlreadyExists)
       
   219 	{
       
   220 		err = iFileSession.MkDirAll( KUPnPXhtmlPath() );
       
   221 	}
       
   222 
       
   223 	if (err != KErrNone && err != KErrAlreadyExists)
       
   224 	{
       
   225 		User::Leave(err);
       
   226 	}
       
   227 
       
   228 	// Init capabilities
       
   229 	InitCapabilities();
       
   230 
       
   231 }
       
   232 
       
   233 // -----------------------------------------------------------------------------
       
   234 // CUPPrintFactory::InitCapabilities
       
   235 // -----------------------------------------------------------------------------
       
   236 //
       
   237 void CUPPrintFactory::InitCapabilities()
       
   238 {
       
   239 	// Layout
       
   240 	TPrintCapability layout;
       
   241 	layout.iCapabilityID = EPrintCapabLayout;
       
   242 	layout.iType = TPrintCapability::Int;
       
   243 	layout.iDefaultValue = EPrintCapabLayout1UpBorderless;
       
   244 
       
   245 	// Supported layouts
       
   246 	layout.iEnumCodes[0] = EPrintCapabLayout1UpBorderless;
       
   247 	layout.iEnumCodes[1] = EPrintCapabLayout1UpBorder;
       
   248 	layout.iEnumCodes[2] = EPrintCapabLayout2Up;
       
   249 	layout.iEnumCodes[3] = EPrintCapabLayout4Up;
       
   250 	layout.iEnumCodes[4] = EPrintCapabLayout6Up;
       
   251 	layout.iEnumCodes[5] = EPrintCapabLayout9Up;
       
   252 	layout.iEnumCodes[6] = EPrintCapabLayout12Up;
       
   253 	layout.iEnumCodes[7] = EPrintCapabLayout16Up;
       
   254 	layout.iEnumCount = 8;
       
   255 	
       
   256 	// Quality
       
   257 	TPrintCapability quality;
       
   258 	quality.iCapabilityID = EPrintCapabQuality;
       
   259 	quality.iType = TPrintCapability::Int;
       
   260 	quality.iDefaultValue = EPrintCapabQualityNormal;
       
   261 
       
   262 	// Supported quality
       
   263 	quality.iEnumCodes[0] = EPrintCapabQualityNormal;
       
   264 	quality.iEnumCount = 1;
       
   265 	
       
   266 	// Paper size
       
   267 	TPrintCapability paper;
       
   268 	paper.iCapabilityID = EPrintCapabPaperSize;
       
   269 	paper.iType = TPrintCapability::Int;
       
   270 	paper.iDefaultValue = EPrintCapabPaperSize4x6;
       
   271 
       
   272 	// Supported paper sizes
       
   273 	paper.iEnumCodes[0] = EPrintCapabPaperSize4x6;
       
   274 	paper.iEnumCodes[1] = EPrintCapabPaperSize5x7;
       
   275 	paper.iEnumCodes[2] = EPrintCapabPaperSizeA6;
       
   276 	paper.iEnumCodes[3] = EPrintCapabPaperSizeA4;
       
   277 	paper.iEnumCodes[4] = EPrintCapabPaperSizeLetter;
       
   278 	paper.iEnumCount = 5;
       
   279 	
       
   280 	// Add to settings array
       
   281 	TRAPD(err, GetDefaultSettingsL(layout.iDefaultValue, paper.iDefaultValue, quality.iDefaultValue))
       
   282 	if(KErrNone != err)
       
   283 		LOG1("[CUPPrintFactory::InitCapabilities]\t Reading default values failed. Error: %d", err);
       
   284 
       
   285 	iCapabilities.Append(layout);
       
   286 	iCapabilities.Append(quality);
       
   287 	iCapabilities.Append(paper);
       
   288 	
       
   289 }
       
   290 
       
   291 //--------------------------------------------------------------------------------------------
       
   292 // CUPPrintFactory::GetDefaultSettingsL
       
   293 //--------------------------------------------------------------------------------------------
       
   294 void CUPPrintFactory::GetDefaultSettingsL(TInt& aLayout, TInt& aSize, TInt& aQuality)
       
   295 {
       
   296 	LOG("[CUAPrintingJobContainer::GetDefaultSettingsL]\t");
       
   297 	
       
   298 	RFile file;
       
   299 	RFs fs;
       
   300 	User::LeaveIfError(file.Open(iFileSession, KUPnPSettingsFile, EFileRead));
       
   301 	CleanupClosePushL(file);
       
   302 	
       
   303 	TInt fileSize = 250;
       
   304 	file.Size(fileSize);
       
   305 	
       
   306 	if(0 >= fileSize)
       
   307 		fileSize = 250;
       
   308 	
       
   309 	// Create buffer
       
   310 	HBufC8* fileBuffer = HBufC8::NewL(fileSize);
       
   311 	CleanupStack::PushL(fileBuffer);
       
   312 
       
   313 	TPtr8 bufferPtr( fileBuffer->Des() );
       
   314 	bufferPtr.Zero();
       
   315 	
       
   316 	User::LeaveIfError(file.Read(bufferPtr));
       
   317 	LOG81("bufferPtr: %S", &bufferPtr);
       
   318 
       
   319 	TInt stopper = 0;
       
   320 	TInt pos = bufferPtr.Find(KUPnPLineFeed8());
       
   321 	while (pos > 0 && stopper < 20)
       
   322 	{
       
   323 		++stopper;
       
   324 		LOG("----------------");
       
   325 
       
   326 		TLex8 lex(bufferPtr.Left(pos));
       
   327 		LOG81("bufferPtr.Left(pos): %S", &(bufferPtr.Left(pos)));
       
   328 
       
   329 		// get id
       
   330 		if ((lex.Peek()).IsDigit()) 
       
   331 		{
       
   332 			TInt id;
       
   333 			TInt err =  lex.Val(id);
       
   334 			LOG1("id: %d", id);
       
   335 			
       
   336 			bufferPtr = bufferPtr.Right(bufferPtr.Length() - lex.Offset()-1);
       
   337 			lex.Assign(bufferPtr);
       
   338 
       
   339 			//get value
       
   340 			if ((lex.Peek()).IsDigit()) 
       
   341 			{
       
   342 				switch( id ) 
       
   343 				{
       
   344 					case EPrintCapabLayout:
       
   345 						User::LeaveIfError(lex.Val(aLayout));
       
   346 						LOG1("aLayout: %d", aLayout);
       
   347 						break;
       
   348 					case EPrintCapabPaperSize:
       
   349 						User::LeaveIfError(lex.Val(aSize));
       
   350 						LOG1("aSize: %d", aLayout);
       
   351 						break;
       
   352 					case EPrintCapabQuality:
       
   353 						User::LeaveIfError(lex.Val(aQuality));
       
   354 						LOG1("aQuality: %d", aQuality);
       
   355 						break;
       
   356 					default:
       
   357 						break;
       
   358 				}
       
   359 
       
   360 				bufferPtr = bufferPtr.Right(bufferPtr.Length() - lex.Offset()-1);
       
   361 				lex.Assign(bufferPtr);
       
   362 			}
       
   363 		}
       
   364 		// find next
       
   365 		pos = bufferPtr.Find(KUPnPLineFeed8());
       
   366 	}
       
   367 	CleanupStack::PopAndDestroy(2); //fileBuffer, file
       
   368 }
       
   369 
       
   370 //--------------------------------------------------------------------------------------------
       
   371 // CUPPrintFactory::SetDefaultSettingsL
       
   372 //--------------------------------------------------------------------------------------------
       
   373 void CUPPrintFactory::SetDefaultSettingsL()
       
   374 {
       
   375 	LOG("[CUAPrintingJobContainer::SetDefaultSettingsL]\t");
       
   376 	
       
   377 	// Create buffer
       
   378 	HBufC8* settingsBuf = HBufC8::NewL(KSettingsLength * iCapabilities.Count());
       
   379 	CleanupStack::PushL(settingsBuf);
       
   380 
       
   381 	for (TInt i=0; i<iCapabilities.Count(); i++)
       
   382 	{
       
   383 		
       
   384 		TBuf8<50> settingsStr;
       
   385 		settingsStr.AppendNum(iCapabilities[i].iCapabilityID);
       
   386 		settingsStr.Append(KUPnPComma());
       
   387 		settingsStr.AppendNum(iCapabilities[i].iDefaultValue);
       
   388 		settingsStr.Append(KUPnPLineFeed8());
       
   389 
       
   390 		settingsBuf->Des().Append(settingsStr);
       
   391 	}
       
   392 	
       
   393 	RFile file;
       
   394 	User::LeaveIfError(file.Replace(iFileSession, KUPnPSettingsFile, EFileWrite));
       
   395 	CleanupClosePushL(file);
       
   396 	file.Write(settingsBuf->Des());
       
   397 
       
   398 	CleanupStack::PopAndDestroy(2); //file, settingsBuf
       
   399 }
       
   400 
       
   401 // End of file