--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/bwins/btprotocolu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,5 @@
+EXPORTS
+ ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &)
+ ??1CBtPrinterController@@UAE@XZ @ 2 NONAME ; CBtPrinterController::~CBtPrinterController(void)
+ ??1CBtJobChannel@@UAE@XZ @ 3 NONAME ; CBtJobChannel::~CBtJobChannel(void)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/data/01007779.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* 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:
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+// Declares info for BtProtocol
+RESOURCE REGISTRY_INFO theInfo
+ {
+ // UID for the DLL
+ dll_uid = 0x01007779;
+ // Declare array of interface info
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ // UID of interface that is implemented
+ interface_uid = 0x10208A1E;
+ implementations =
+ {
+ // Info for BtProtocol
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = 0x10208A21;
+ version_no = 1;
+ display_name = "BtProtocol";
+ default_data = "BtProtocol";
+ opaque_data = "";
+ }
+ };
+ }
+ };
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/data/btprotocol.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,215 @@
+/*
+* 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:
+*
+*/
+
+
+#include "imageprint.rh"
+#include "printcapabilitycodes.h"
+
+enum PrinterClass // should come from ImgPrintKonst.h
+{
+ EDefault = 0,
+ EBigAdaptive = 1,
+ ESmallAdaptive = 2,
+ EDesk = 3,
+ EOPP = 4,
+ ELinked = 99
+};
+
+RESOURCE RS_CAPABILITIES bt_Capabilities
+{
+ capabilities =
+ {
+ RS_CAPABILITY
+ {
+ printerclass=EDefault;
+ capabilityid=EPrintCapabPaperSize;
+ type=1;
+ defaultvalue=EPrintCapabPaperSize4x6;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabPaperSizeLetter,1,
+ EPrintCapabPaperSizeA4,1,
+ EPrintCapabPaperSize5x7,4,
+ EPrintCapabPaperSizeA6,4,
+ EPrintCapabPaperSize4x6,4,
+ EPrintCapabPaperSizeSticker,5
+ };
+ linkid=0;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=EBigAdaptive;
+ capabilityid=EPrintCapabPaperSize;
+ type=1;
+ defaultvalue=EPrintCapabPaperSize4x6;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabPaperSizeLetter,1,
+ EPrintCapabPaperSizeA4,1,
+ EPrintCapabPaperSize5x7,2,
+ EPrintCapabPaperSizeA6,2,
+ EPrintCapabPaperSize4x6,2,
+ EPrintCapabPaperSizeSticker,5
+ };
+ linkid=0;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ESmallAdaptive;
+ capabilityid=EPrintCapabPaperSize;
+ type=1;
+ defaultvalue=EPrintCapabPaperSize4x6;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabPaperSizeA6,2,
+ EPrintCapabPaperSize4x6,2,
+ EPrintCapabPaperSizeSticker,5
+ };
+ linkid=0;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=EDesk;
+ capabilityid=EPrintCapabPaperSize;
+ type=1;
+ defaultvalue=EPrintCapabPaperSize4x6;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabPaperSizeLetter,1,
+ EPrintCapabPaperSizeA4,1,
+ EPrintCapabPaperSize5x7,4,
+ EPrintCapabPaperSizeA6,3,
+ EPrintCapabPaperSize4x6,3,
+ EPrintCapabPaperSizeSticker,5
+ };
+ linkid=0;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ELinked;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpBorderless;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpBorderless,0,
+ EPrintCapabLayout1Up,0,
+ EPrintCapabLayout2Up,0,
+ EPrintCapabLayout4Up,0,
+ EPrintCapabLayout12Up,0
+ };
+ linkid=1;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ELinked;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpBorderless;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpBorderless,0,
+ EPrintCapabLayout1UpBorder,0,
+ EPrintCapabLayout2Up,0,
+ EPrintCapabLayout4Up,0,
+ EPrintCapabLayout12Up,0
+ };
+ linkid=2;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ELinked;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpBorderless;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpBorderless,0,
+ EPrintCapabLayout1UpBorder,0,
+ EPrintCapabLayout12Up,0
+ };
+ linkid=3;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ELinked;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpBorderless;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpBorderless,0,
+ EPrintCapabLayout1UpBorder,0,
+ EPrintCapabLayout2Up,0,
+ EPrintCapabLayout4Up,0,
+ EPrintCapabLayout12Up,0
+ };
+ linkid=4;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ELinked;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpStick;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpStick,0,
+ EPrintCapabLayout4UpStick,0,
+ EPrintCapabLayout16UpStick,0
+ };
+ linkid=5;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=ELinked;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpBorderless;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpBorderless,0
+ };
+ linkid=10;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=EOPP;
+ capabilityid=EPrintCapabPaperSize;
+ type=1;
+ defaultvalue=EPrintCapabPaperSizeAuto;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabPaperSizeAuto,10
+ };
+ linkid=0;
+ }
+ };
+}
+
+//End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/data/btxmltemplate.txt Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,68 @@
+CONTENT-LENGTH: [BytesInBody]
+CONTENT-TYPE: text/xml; charset="utf-8"
+CONTENT-LANGUAGE: en-US
+SOAPACTION: "urn:schemas-bluetooth-org:service:Printer:1#[Action]"
+
+<s:Envelope
+ xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
+ s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+
+<s:Body>
+ <u:[Action] xmlns:u="urn:schemas-bluetooth-org:service:Printer:1">
+ [ActionData]
+ </u:[Action]>
+</s:Body>
+</s:Envelope>
+
+<!--
+[CreateJobStart]
+ <JobName>[JobName]</JobName>
+ <JobOriginatingUserName>[JobOriginatingUserName]</JobOriginatingUserName>
+ <DocumentFormat></DocumentFormat>
+ <Copies></Copies>
+ <Sides></Sides>
+ <NumberUp></NumberUp>
+ <OrientationRequest></OrientationRequest>
+ <MediaSize></MediaSize>
+ <MediaType></MediaType>
+ <PrintQuality></PrintQuality>
+ <CancelOnLostLink>true</CancelOnLostLink>
+[CreateJobEnd]
+
+[GetPrinterAttributesAllStart]
+[GetPrinterAttributesAllEnd]
+
+[GetPrinterCapabilitiesStart]
+ <RequestedPrinterAttributes>
+ <PrinterAttribute>PrinterState</PrinterAttribute>
+ <PrinterAttribute>PrinterStateReasons</PrinterAttribute>
+ </RequestedPrinterAttributes>
+[GetPrinterCapabilitiesEnd]
+
+[GetPrinterStateStart]
+ <RequestedPrinterAttributes>
+ <PrinterAttribute>PrinterState</PrinterAttribute>
+ <PrinterAttribute>PrinterStateReasons</PrinterAttribute>
+ </RequestedPrinterAttributes>
+[GetPrinterStateEnd]
+
+[JobIdStart]
+ <JobId>[JobId]</JobId>
+[JobIdEnd]
+
+[GetJobAttributesStart]
+ <JobId>[JobId]</JobId>
+ <RequestedJobAttributes>
+ <JobAttribute>JobState</JobAttribute>
+ <JobAttribute>JobName</JobAttribute>
+ <JobAttribute>JobOriginatingUserName</JobAttribute>
+ <JobAttribute>JobMediaSheetsCompleted</JobAttribute>
+ </RequestedJobAttributes>
+[GetJobAttributesEnd]
+
+[GetMarginsStart]
+ <MediaSize>[MediaSizeData]</MediaSize>
+ <MediaType>[MediaTypeData]</MediaType>
+[GetMarginsEnd]
+
+-->
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/eabi/btprotocolu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,13 @@
+EXPORTS
+ _Z24ImplementationGroupProxyRi @ 1 NONAME
+ _ZTI10CBtOnQuery @ 2 NONAME ; #<TI>#
+ _ZTI16CBtPasswordQuery @ 3 NONAME ; #<TI>#
+ _ZTI17CBtPrintingDevice @ 4 NONAME ; #<TI>#
+ _ZTI19CBTAttribValVisitor @ 5 NONAME ; #<TI>#
+ _ZTI8CBtTimer @ 6 NONAME ; #<TI>#
+ _ZTV10CBtOnQuery @ 7 NONAME ; #<VT>#
+ _ZTV16CBtPasswordQuery @ 8 NONAME ; #<VT>#
+ _ZTV17CBtPrintingDevice @ 9 NONAME ; #<VT>#
+ _ZTV19CBTAttribValVisitor @ 10 NONAME ; #<VT>#
+ _ZTV8CBtTimer @ 11 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_EXPORTS
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_MMPFILES
+btprotocol.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/group/btprotocol.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,98 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../../../inc/logdef.h"
+
+deffile btprotocol.def
+
+TARGET btprotocol.dll
+TARGETTYPE PLUGIN
+CAPABILITY CAP_ECOM_PLUGIN
+
+UID 0x10009D8D 0x01007779
+
+APP_LAYER_SYSTEMINCLUDE
+SYSTEMINCLUDE /epoc32/include/libc
+
+USERINCLUDE ../inc
+USERINCLUDE ../../xhtmlfilecomposer/inc
+USERINCLUDE ../../../ImagePrintLibrary/inc
+USERINCLUDE ../../../ImagePrintServer/inc
+USERINCLUDE ../../../inc
+USERINCLUDE ../../../../clog/inc
+
+SOURCEPATH ../src
+
+SOURCE cbtprintingdevice.cpp
+SOURCE crsbtdiscoverengine.cpp
+SOURCE cbtdiscover.cpp
+SOURCE crsbtdevice.cpp
+SOURCE cbtdevicecontainer.cpp
+SOURCE rsutils.cpp
+SOURCE cprintjob.cpp
+SOURCE main.cpp
+SOURCE cbttimer.cpp
+SOURCE cbtsoapcodec.cpp
+SOURCE cxmlhandler.cpp
+SOURCE cbtprintercontroller.cpp
+SOURCE cbtobjectserver.cpp
+SOURCE cbtsdpadvertiser.cpp
+SOURCE cbtdprserviceadvertiser.cpp
+SOURCE cbtjobchannel.cpp
+SOURCE cbtstatuschannel.cpp
+SOURCE cbtchannelbase.cpp
+SOURCE cbtonquery.cpp
+SOURCE cbtpasswordquery.cpp
+
+START RESOURCE ../data/01007779.rss
+TARGET btprotocol.rsc
+END
+
+START RESOURCE ../data/btprotocol.rss
+HEADER
+TARGET btprotocol.rsc
+TARGETPATH resource/imageprintdata/protocols
+END
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY fbscli.lib
+LIBRARY bluetooth.lib
+LIBRARY esock.lib
+LIBRARY irobex.lib
+LIBRARY estor.lib
+LIBRARY sdpdatabase.lib
+LIBRARY btdevice.lib
+LIBRARY sdpagent.lib
+LIBRARY btextnotifiers.lib
+LIBRARY efsrv.lib
+LIBRARY charconv.lib
+LIBRARY bafl.lib
+LIBRARY hal.lib
+LIBRARY platformenv.lib
+LIBRARY estlib.lib
+LIBRARY ecom.lib
+LIBRARY xhtmlfilecomposer.lib
+LIBRARY centralrepository.lib
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/btprotocolconsts.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,186 @@
+/*
+* 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:
+*
+*/
+
+
+
+#ifndef BTPROTOCOLCONSTS_H
+#define BTPROTOCOLCONSTS_H
+
+#include <btsdp.h>
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// Obex header HI values from http://www.it.lut.fi/~doc/bluetooth/OBEX12.pdf
+//
+////////////////////////////////////////////////////////////////////////////////////////
+const TUint KBtObexHeaderHiCount = 0xC0; //Number of objects (used by Connect)
+const TUint KBtObexHeaderHiName = 0x01; //name of the object (often a file name)
+const TUint KBtObexHeaderHiType = 0x42; //type of object - e.g. text, html, binary, manufacturer specific
+const TUint KBtObexHeaderHiLength = 0xC3; //the length of the object in bytes
+const TUint KBtObexHeaderHiTimeIso = 0x44; //date/time stamp – ISO 8601 version - preferred
+const TUint KBtObexHeaderHiTime4B = 0xC4; //date/time stamp – 4 byte version (for compatibility only)
+const TUint KBtObexHeaderHiDescription = 0x05; //text description of the object
+const TUint KBtObexHeaderHiTarget = 0x46; //name of service that operation is targeted to
+const TUint KBtObexHeaderHiHTTP = 0x47; //an HTTP 1.x header
+const TUint KBtObexHeaderHiBody = 0x48; //a chunk of the object body.
+const TUint KBtObexHeaderHiEnd = 0x49; //of Body
+const TUint KBtObexHeaderHiWho = 0x4A; //identifies the OBEX application, used to tell if talking to a peer
+const TUint KBtObexHeaderHiConnectionId = 0xCB; //an identifier used for OBEX connection multiplexing
+const TUint KBtObexHeaderHiAppParameters = 0x4C; //extended application request & response information
+const TUint KBtObexHeaderHiAuthChallenge = 0x4D; //authentication digest-challenge
+const TUint KBtObexHeaderHiAuthResponse = 0x4E; //authentication digest-response
+const TUint KBtObexHeaderHiObjectClass = 0x4F; //OBEX Object class of object
+// Reserved = 0x10 to 0x2F //this range includes all combinations of the upper 2 bits
+// User Defined = 0x30 to 0x3F //this range includes all combinations of the upper 2 bits
+
+// Obex tag values
+const TUint KBtObexTagOffset = 0x01;
+const TUint KBtObexTagCount = 0x02;
+const TUint KBtObexTagJobId = 0x03;
+const TUint KBtObexTagSize = 0x04;
+
+// Obex tag lengths in bytes
+const TUint KBtDataLength4 = 0x04; //Length of I4 = 4 bytes integer
+const TUint KBtTripletLength = 6; //Length of tag + length + data = 1 + 1 + 4
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// Mime types
+//
+////////////////////////////////////////////////////////////////////////////////////////
+_LIT8(KBtMimeTypeSoap, "x-obex/bt-SOAP");
+_LIT8(KBtMimeTypeXhtml, "application/vnd.pwg-xhtml-print+xml\0"); //"application/xhtml+xml");
+_LIT8(KBtMimeTypeReferenced, "x-obex/referencedobject");
+_LIT8(KBtMimeTypeJpeg, "image/jpeg");
+_LIT8(KBtMimeAnyImg, "image/*" );
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// Obex constants
+//
+// According to http://www.bluetooth.org/assigned-numbers/baseband.htm
+// these should be the correct numbers, however the Series 60
+// implementation of Bluetooth uses the numbers as below
+//
+////////////////////////////////////////////////////////////////////////////////////////
+//#define KBTMjrDevClassImaging 0x6
+//#define KBTMinDevClassPrinter 0x80
+//#define KBTMjrSvcClassRendering 0x20
+//#define KBTMjrSvcClassObjectTransfer 0x80
+
+/** If the Major Device Class includes Imaging, the discovered Bluetooth device MAY be a BPP printer. */
+#define KBTMjrDevClassImaging 0x600
+/** If the Minor Device Class includes Printing, the discovered Bluetooth device is LIKELY a BPP printer. */
+#define KBTMinDevClassPrinter 0x20
+/** If the Major Service Class does not include Rendering, the discovered Bluetooth device is NOT a BPP printer. */
+#define KBTMjrSvcClassRendering 0x200000
+/** If the Major Service Class includes ObjectTransfer, the discovered Bluetooth device is NOT a BPP printer. */
+#define KBTMjrSvcClassObjectTransfer 0x800000
+
+/** Nokia 6600: If the Major Device Class includes Imaging, the discovered Bluetooth device MAY be a BPP printer. */
+#define KBTMjrDevClassImaging_V2 0x600
+/** Nokia 6600: If the Minor Device Class includes Printing, the discovered Bluetooth device is LIKELY a BPP printer. */
+#define KBTMinDevClassPrinter_V2 0x80
+/** Nokia 6600: If the Major Service Class does not include Rendering, the discovered Bluetooth device is NOT a BPP printer. */
+#define KBTMjrSvcClassRendering_V2 0x40000
+/** Nokia 6600: If the Major Service Class does not includes ObjectTransfer, the discovered Bluetooth device is NOT a BPP printer. */
+#define KBTMjrSvcClassObjectTransfer_V2 0x100000
+
+/** If the Major Device Class includes Computer, the discovered Bluetooth device MAY support Object Transfer. */
+#define KBTMjrDevClassComputer 0x100
+/** The device is a Desktop Computer. */
+#define KBTMinDevClassDesktop 0x4
+/** The device is a Server Computer. */
+#define KBTMinDevClassServer 0x8
+/** The device is a Laptop Computer. */
+#define KBTMinDevClassLaptop 0xC
+
+
+// According to https://www.bluetooth.org/foundry/assignnumb/document/service_discovery
+/** UID for OBEX Object Push service in a Bluetooth device SDP query. Required for OPP. */
+#define KBTSDPOBEXObjectPush 0x1105
+/** UID for the BPP Direct Printing service in a Bluetooth device SDP query. Required for BPP. */
+#define KBTSDPDirectPrinting 0x1118
+/** UID for the BPP Reference Printing service in a Bluetooth device SDP query. Required for BPP. */
+#define KBTSDPReferencePrinting 0x1119
+/** UID for the BPP Direct Printing Reference Objects service in a Bluetooth device SDP advertise. Required for BPP. */
+#define KBTSDPDPROService 0x1120
+/** UID for the BPP Printing Status service in a Bluetooth device SDP advertise. Required for BPP. */
+#define KBTSDPPrintingStatus 0x1123
+/** UID for L2CAP in a Bluetooth device SDP query. Required for BPP. */
+#define KBTSDPL2CAP 0x0100
+/** UID for RFCOMM in a Bluetooth device SDP query. Required for BPP. */
+#define KBTSDPRFCOMM 0x0003
+/** UID for Object Exchange in a Bluetooth device SDP query. Required for BPP. */
+#define KBTSDPObex 0x0008
+
+// Additions to universal attributes in btsdp.h
+static const TSdpAttributeID KSdpAttrIdAdditionalProtocolDescriptorLists = 0x000D;
+static const TSdpAttributeID KSdpAttrIdDocFormatsSupported = 0x0350;
+static const TSdpAttributeID KSdpAttrIdModelID = 0x0358;
+static const TSdpAttributeID KSdpAttrIdMaxWidth = 0x0362;
+static const TSdpAttributeID KSdpAttrIdMaxLen = 0x0364;
+static const TSdpAttributeID KSdpAttrIdAllDone = 0xFFFFFF;
+// own constants for UID bitmask
+static const TUint KBtMaskRFCOMM = 0;
+static const TUint KBtMaskL2CAP = 1;
+static const TUint KBtMaskObex = 2;
+static const TUint KBtMaskObjectPush = 4;
+static const TUint KBtMaskDirectPrinting = 8;
+static const TUint KBtMaskPrintingStatus = 16;
+static const TUint KBtMaskROService = 32;
+
+static const TUint KBtMaskObexLevel = KBtMaskRFCOMM | KBtMaskL2CAP | KBtMaskObex;
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// Obex server constants
+//
+////////////////////////////////////////////////////////////////////////////////////////
+const TUint KRfcommChannel = 1;
+const TUint KServiceClass = 0x01007779; // Own UID
+
+_LIT( KServiceName,"DirectPrintingReferenceObjectsService" );
+_LIT( KServiceDescription,"Direct Printing Reference Objects Service" );
+
+// Used by ObexFileServerImpl.h
+const TInt KSimultainousSocketsOpen = 8;
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// Misc
+//
+////////////////////////////////////////////////////////////////////////////////////////
+const TInt KPendingLimit = 6; // 6 x 5 sec = 30 sec total to wait answer to request from printer
+const TInt KOppPendingLimit = 24; // 24 X 5 sec = 120 sec total to wait opp printing.
+// to get local BT name from central repository
+const TUid KCRUidBluetoothLocalNameSettings = {0x10204DAC};
+const TUint32 KBTLocalName = 0x00000001;
+
+/** XHTML file name*/
+_LIT(KXHTMLFileName, "c:\\system\\data\\xhtml\\Bt_Print_%d.xhtml");
+_LIT8(KXHTMLFileName8, "c:\\system\\data\\xhtml\\Bt_Print_%d.xhtml");
+
+/* Time out value for OBEX commands = 20 second */
+const TInt KObexCmdTimeOut = 20000000;
+
+#endif // BTPROTOCOLCONSTS_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtchannelbase.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,272 @@
+/*
+* 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: Defines the CBtChannelBase class.
+*
+*/
+
+
+#ifndef CBTCHANNELBASE_H
+#define CBTCHANNELBASE_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32math.h>
+#include <obexbase.h>
+#include <btnotif.h>
+#include <avkon.hrh>
+
+#include "crsbtdiscoverengine.h"
+#include "tprintcapability.h"
+#include "mbtpcobserver.h"
+#include "cbtobjectserver.h"
+#include "cprintjob.h"
+#include "mconfirmationnotify.h"
+#include "cbtpasswordquery.h"
+
+class CBtSoapCodec;
+class CObexBufObject;
+class CObexClient;
+class CObexFileObject;
+
+/**
+* @class CBtChannelBase
+* @brief A base class to implement CObexClient use.
+*
+* This class implements the common methods used for connecting and
+* communicating with device via CObexClient using either BPP job based
+* printing or OPP simple push.
+*/
+NONSHARABLE_CLASS(CBtChannelBase) : public CActive, public MObexAuthChallengeHandler, public MConfirmationNotify
+ {
+ public:
+
+ /** ~CBtChannelBase
+ * @brief Destructor.
+ */
+ virtual ~CBtChannelBase();
+
+ /** StartL
+ * @brief Synchronized method to start communication with device.
+ * Method clears former connections and connects to the device given.
+ * @param aDevice Device to connect
+ */
+ virtual void StartL( CRsBtDevice& aDevice );
+
+ /** Stop
+ * @brief Clears connection.
+ * Device is disconnected and the channel (CObexClient) is deleted.
+ */
+ virtual void Stop();
+
+ /** IsConnected
+ * @brief Checks wether the channel is connected or not.
+ * @return ETrue if connected, EFalse otherway.
+ */
+ virtual TBool IsConnected();
+
+ /** Disconnect
+ * @brief Method to disconnect channel.
+ */
+ virtual void Disconnect();
+
+ /** FinishPrinting
+ * @brief Finishes all printing operations started and stops the connection.
+ */
+ virtual void FinishPrinting();
+
+ /** SetDevice
+ * @brief Sets the default device.
+ * @param aDevice Device to set as default
+ */
+ void SetDevice( CRsBtDevice& aDevice );
+
+ /** Device
+ * @brief Gets the default device.
+ * @return Reference to default device.
+ */
+ const CRsBtDevice& Device() const;
+
+ /** JobId
+ * @brief Gets the default job id.
+ * @param aId Job id to set as default.
+ */
+ void SetJobId( TInt aId );
+
+ /** JobId
+ * @brief Gets the default job id.
+ * @return Default job id.
+ */
+ TInt JobId() const;
+
+ public:
+ /** GetUserPasswordL
+ * @brief Gets the Obex password.
+ * @return Contain the Realm specified by the unit forcing the Authentication.
+ */
+ virtual void GetUserPasswordL( const TDesC &aRealm );
+
+ void PasswordQueryCompleteL ( TObexPasskeyBuf aResultPckg );
+
+ protected:
+
+ /** CBtChannelBase
+ * @brief C++ constructor
+ * @param Observer to call back about received feed back or occured errors.
+ */
+ CBtChannelBase(MBtPCObserver& aObs);
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ */
+ void ConstructL();
+
+ // ===============================
+ // From CActive.
+ // ===============================
+ virtual void DoCancel();
+ virtual TInt RunError(TInt aError) = 0;
+
+ /** ConnectL
+ * @brief Pure virtual method for CObexClient connection.
+ */
+ virtual void ConnectL() = 0;
+
+ /** TControlState
+ * @brief Operation states in derived classes.
+ */
+ enum TControlState
+ {
+ EStateNone = 0,
+
+ EStateConnecting,
+ EStateDisconnecting,
+ EStateGettingCapabilities,
+ EStateGettingPrinterState,
+ EStateCreatingJob,
+
+ EStateCancellingJob,
+ EStateSendingDocument,
+ EStateSendingXhtml,
+ EStateSendingOPP,
+ EStateGettingJobAttributes,
+
+ EStateGetEvent,
+ EStateGettingEvent,
+ EStateFinish
+ };
+
+
+ /** GetSoapResponseL
+ * @brief Gets Soap response and parses the action name
+ * @return Soap action ID (TBtSoapActions)
+ */
+ virtual TInt GetSoapResponseL();
+
+ /** SendSoapRequestL
+ * @brief Operates Soap Action
+ */
+ virtual void SendSoapRequestL(const TInt aRequest, const TInt aJobId = KErrNotFound);
+ /// @brief Overwrites SendSoapRequestL
+ virtual void SendSoapRequestL(const TInt aRequest, TRequestStatus& aStatus,
+ const TInt aJobId = KErrNotFound);
+
+ /** CompleteRequest
+ * @brief Completes pending request
+ */
+ void CompleteRequest(TControlState aStateCompleted, TInt aError = KErrNone);
+
+ /** Activate
+ * @brief Activates object if not already active
+ */
+ virtual void Activate();
+
+ /** ClearConnection
+ * @brief Disconnects and deletes the connection.
+ * In case of pending request, calls Abort for CObexClient.
+ */
+ virtual void ClearConnection();
+
+ /** WaitL
+ * @brief Sets the object to wait request to complete if not already waiting.
+ */
+ void WaitL();
+
+ /** StopWaiting
+ * @brief Stops the object waiting request to complete if waiting.
+ */
+ void StopWaiting();
+
+ /** DeleteChannel
+ * @brief Deletes the channel and initializes it.
+ */
+ void DeleteChannel();
+
+ protected:
+
+ /** @var MBtPCObserver& iObs
+ * Observer to call back about received feed back or occured errors. */
+ MBtPCObserver& iObs;
+
+ /** @var TControlState iState
+ * Internal container for current operation state. */
+ TControlState iState;
+
+ /** @var TInt iJobId
+ * Current job id. */
+ TInt iJobId;
+
+ /** @var CObexClient* iChannel
+ * Channel to communicate with device over bluetooth. */
+ CObexClient* iChannel;
+
+ /** @var CBtSoapCodec* iSoapCodec
+ * Helper class to codec and manage SOAP messages. */
+ CBtSoapCodec* iSoapCodec;
+
+ /** @var CObexBufObject* iObexBufObject
+ * OBEX data object, type of 'buffer'. */
+ CObexBufObject* iObexBufObject;
+
+ /** @var CObexNullObject* iObexNullObject
+ * Empty OBEX object for connecting. */
+ CObexNullObject* iObexNullObject;
+
+ /** @var CBufBase* iObexBody
+ * Body of the OBEX data object. */
+ CBufBase* iObexBody;
+
+ /** @var CRsBtDevice* iDevice
+ * The device to communicate with. */
+ CRsBtDevice* iDevice;
+
+ /** @var CActiveSchedulerWait* iWait
+ * Active scheduler wait object for nested scheduler loops. */
+ CActiveSchedulerWait* iWait;
+
+ /** @var TInt iResponseError
+ * Member to maintain errors occured during phases of synchronized calls. */
+ TInt iResponseError;
+
+ /** @var TBool iStop
+ * Flag to indicate the processing shall or is about to stop. */
+ TBool iStop;
+
+ CBtPasswordQuery* iPasswordQuery;
+
+ TBTObexPasskey iPckg; // Input parameters
+ };
+
+#endif // CBTCHANNELBASE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtdevicecontainer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,78 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTDEVICECONTAINER_H
+#define CBTDEVICECONTAINER_H
+
+#include <e32base.h>
+#include <s32strm.h>
+#include <f32file.h>
+
+class CRsBtDevice;
+
+/**
+ * \brief Brief Description
+ *
+ * Detailed Description
+ */
+NONSHARABLE_CLASS(CBtDeviceContainer) : public CBase
+ {
+ public:
+ void StoreL();
+ void RestoreL();
+ void AppendL( CRsBtDevice* aDevice );
+ TInt Delete( const TInt aDeviceId ); // returns the position in array or KErrNotFound
+ TInt Delete( const CRsBtDevice &aDevice ); // returns the position in array or KErrNotFound
+ TInt Find( const CRsBtDevice &aDevice, TInt aInitIndex = -1 ) const;
+ TInt Find( const TInt aDeviceId, TInt aInitIndex = -1 ) const;
+ TInt Count() const;
+ CRsBtDevice* At(TInt aPosition) const;
+ static CBtDeviceContainer* NewL();
+ ~CBtDeviceContainer();
+ void Reset();
+
+ private:
+
+ enum
+ {
+ ETimeLastUsed = 1,
+ ETimeDiscovered = 2,
+ EUsed = 4,
+ ENotUsed = 8
+ };
+
+ TInt FindOldest(TUint aFlags) const;
+ void ExternalizeL(RWriteStream& aStream) const;
+ void InternalizeL(RReadStream& aStream);
+ void ConstructL();
+ CBtDeviceContainer();
+ TInt GetAvailableId( const CRsBtDevice& aDevice );
+ TBool IsIdAvailable( TInt aId ) const;
+
+ private:
+
+ TInt iVersion;
+ RPointerArray<CRsBtDevice> iDeviceArray;
+ TFileName iDataFolder;
+ TInt iCurrentId;
+ RFs iFs;
+ };
+
+#endif // CBTDEVICECONTAINER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtdiscover.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,163 @@
+/*
+* 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 CBtDiscover class definition. Bluetooth device discovery and SDP.
+*
+*/
+
+
+#ifndef CBTDISCOVER_H
+#define CBTDISCOVER_H
+
+#include <btextnotifiers.h>
+#include <btmanclient.h>
+#include <obex.h>
+#include <btsdp.h>
+
+#include "e32base.h"
+#include "tprinter.h"
+#include "btprotocolconsts.h"
+
+/**
+ * \brief Implements Bluetooth device discovery and SDP.
+ *
+ * Implements Bluetooth device discovery and Service Discovery Protocol (SDP).
+ * Uses the low-level Symbian interfaces for doing a Bluetooth device discovery,
+ * allowing for more flexibility with the user interface. Results of the device discovery and
+ * SDP request are stored in private variables until extracted by CRsBTDiscoverEngine
+ * which owns the only instance of this class, and directs the asynchronous functionality.
+ * \sa CRsBtDiscoverEngine
+ */
+NONSHARABLE_CLASS(CBtDiscover) : public CBase, public MSdpAgentNotifier
+ {
+ public:
+
+ static CBtDiscover* NewL();
+
+ virtual ~CBtDiscover();
+
+ void Start(TRequestStatus& aStatus);
+ void Stop();
+ void Reset();
+
+ TBool IsDoingSDP() const;
+ TBool IsFindingDevices() const;
+ TBool IsBPPSupported() const;
+ TBool IsOPPSupported() const;
+
+ void StopSDP();
+
+ void GetNextDevice(TRequestStatus &aStatus);
+ void GetSupportedServicesL(TRequestStatus &aStatus, TUint32 aServiceMask = -1);
+
+ TBool SupportsContentType(const TDesC &aContType) const;
+ void SetContentTypesL(const TPtrC8 &aString);
+
+ void SetPrinterModelL(const TPtrC8 &aString);
+ const TDesC& GetPrinterModel() const;
+
+ void SetNameRecord(TNameRecord aNameRecord);
+ TNameRecord GetNameRecord() const;
+
+ const TDesC& GetDeviceName() const;
+ TBTDeviceClass GetDeviceClass() const;
+
+ TInt GetBPPPort() const;
+ void SetBPPPort(TInt aPort);
+ TInt GetSTSPort() const;
+ void SetSTSPort(TInt aPort);
+ TInt GetOPPPort() const;
+ void SetOPPPort(TInt aPort);
+
+ void SetVendor( TPrinter::TPrinterVendor aVendor );
+ TPrinter::TPrinterVendor GetVendor() const;
+
+ public: // From MSdpAgentNotifier
+
+ void AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError);
+ void NextRecordRequestComplete(TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount);
+ void AttributeRequestResult(TSdpServRecordHandle aHandle, TSdpAttributeID aAttrID, CSdpAttrValue* aAttrValue);
+
+ private:
+ CBtDiscover();
+ void ConstructL();
+
+ void StartSDPL();
+ void AttributeRequestResultL( TSdpAttributeID aAttrID, CSdpAttrValue* aValue );
+ void GetNextAttributeL(TSdpServRecordHandle aHandle);
+
+ public:
+ TSdpAttributeID iCurrentSDPAttrID;
+ TUint iCurrentServiceUUID;
+ TBool iFoundSTS;
+ TBool iWantedService;
+
+ private:
+ // internal flags
+ // operation flags
+ TBool iDoingSDP;
+ TBool iFindingDevices;
+
+ CSdpAgent* iAgent;
+
+ TRequestStatus *iRequestStatus;
+
+ CSdpSearchPattern* iSdpSearchPattern;
+ CSdpAttrIdMatchList* iMatchList;
+
+ HBufC* iContentTypes;
+
+ RSocketServ iSocketServ;
+ RHostResolver iHostResolver;
+
+ // device data
+ TNameEntry iNameEntry;
+ TInquirySockAddr iSockAddr;
+ HBufC* iPrinterModel;
+ TPrinter::TPrinterVendor iVendor;
+ TInt iBPPPort;
+ TInt iSTSPort;
+ TInt iOPPPort;
+ };
+
+
+/**
+ * \brief Enumerate the values in a SDP response attribute list.
+ *
+ * Used to parse attributes from the structured data returned by a Bluetooth
+ * Service Discovery Protocol request.
+ */
+class CBTAttribValVisitor : public CBase, public MSdpAttributeValueVisitor
+ {
+ public:
+ static CBTAttribValVisitor* NewLC( CBtDiscover& aDiscover );
+ ~CBTAttribValVisitor();
+
+ public: // from MSdpAttributeValueVisitor
+ void VisitAttributeValueL(CSdpAttrValue& aValue, TSdpElementType aType);
+ void StartListL(CSdpAttrValueList& aList);
+ void EndListL();
+
+ private:
+ CBTAttribValVisitor( CBtDiscover& aDiscover );
+ void CheckUuid( const TUUID& aUuid );
+ void CheckUint( const TUint& aValue );
+ void CheckVendor( const TDesC8& aVendor );
+
+ private:
+ CBtDiscover& iDiscover;
+ };
+
+#endif // CBTDISCOVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtdprserviceadvertiser.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,116 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTDPRSERVICEADVERTISER_H
+#define CBTDPRSERVICEADVERTISER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <btsdp.h>
+#include <btmanclient.h>
+
+#include "cbtsdpadvertiser.h"
+
+// CLASS DECLARATIONS
+/**
+* CBtDprServiceAdvertiser
+* Advertises the Direct Printing Referenced Object OBEX service using the SDP database.
+*/
+NONSHARABLE_CLASS(CBtDprServiceAdvertiser) : public CBtSdpAdvertiser
+ {
+ public: //Constructors and destructor
+
+ /**
+ * NewL()
+ * Create a CObjectExchangeServiceAdvertiser object
+ * @return a pointer to the created instance of
+ * CObjectExchangeServiceAdvertiser
+ */
+ static CBtDprServiceAdvertiser* NewL();
+
+ /**
+ * NewLC()
+ * Create a CObjectExchangeServiceAdvertiser object
+ * @return a pointer to the created instance of
+ * CObjectExchangeServiceAdvertiser
+ */
+ static CBtDprServiceAdvertiser* NewLC();
+
+ /**
+ * ~CObjectExchangeServiceAdvertiser()
+ * Destroy the object and release all memory objects
+ */
+ virtual ~CBtDprServiceAdvertiser();
+
+ protected: // from CBTServiceAdvertiser
+
+ /**
+ * BuildProtocolDescriptionL()
+ * Builds the protocol description
+ * @param aProtocolDescriptor the protocol descriptor
+ * @param aPort the service port
+ */
+ void BuildProtocolDescriptionL( CSdpAttrValueDES*
+ aProtocolDescriptor, TInt aPort );
+
+ /**
+ * ServiceClass()
+ * @return the service class
+ */
+ TUint ServiceClass();
+
+ /**
+ * ServiceName()
+ * @return the service name
+ */
+ const TDesC& ServiceName();
+
+ /**
+ * ServiceDescription()
+ * @return the service description
+ */
+ const TDesC& ServiceDescription();
+
+ private: // Constructors
+
+ /**
+ * CObjectExchangeServiceAdvertiser()
+ * Constructs this object
+ */
+ CBtDprServiceAdvertiser();
+
+ /**
+ * ConstructL()
+ * Perform the second phase construction of a
+ * CObjectExchangeServiceAdvertiser object
+ */
+ void ConstructL();
+
+ private: // Data
+
+ /**
+ * iserviceDescription,
+ * Owned by CObjectExchangeServiceAdvertiser.
+ */
+ HBufC* iServiceDescription;
+
+ };
+
+#endif // CBTDPRSERVICEADVERTISER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtjobchannel.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,189 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTJOBCHANNEL_H
+#define CBTJOBCHANNEL_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32math.h>
+
+#include "tprintcapability.h"
+#include "cbtchannelbase.h"
+#include "cprintjob.h"
+
+class CBtStatusChannel;
+class CObexFileObject;
+
+const TInt KProgressUpdateInterval = 1000000;
+
+/**
+* @class CBtJobChannel
+* @brief
+*
+*/
+NONSHARABLE_CLASS(CBtJobChannel) : public CBtChannelBase, public MBtTimerObserver
+ {
+ public:
+
+ /** NewL
+ * @brief Creates a new instance of XHTML file composer.
+ * @return Pointer to the instance.
+ */
+ static CBtJobChannel* NewL(MBtPCObserver& aObs);
+
+ /** NewLC
+ * @brief Creates a new instance of XHTML file composer and leaves it in the cleanup stack.
+ * @return Pointer to the instance.
+ */
+ static CBtJobChannel* NewLC(MBtPCObserver& aObs);
+
+ /** ~CBtJobChannel
+ * @brief Destructor.
+ */
+ IMPORT_C ~CBtJobChannel();
+
+ /** GetCapabilitiesL
+ * @brief Method to get printer capabilities.
+ *
+ * Actually this method gets printer attributes, but this is synchronous
+ * method to get only capabilities, not all capabilities.
+ */
+ void GetCapabilitiesL(CRsBtDevice& aDevice);
+
+ /** CreateJob
+ * @brief
+ */
+ void CreateJobL(CPrintJob& aJob);
+
+ TInt GetPercentSent();
+
+ /** GetJobAttributes
+ * @brief
+ */
+ void GetPrinterStateL();
+
+ /** GetJobAttributes
+ * @brief
+ */
+ void GetJobAttributesL(TInt aJobId);
+
+ /**
+ * Cancel a specified print job. Leaves if printer is invalid.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID of cancelled job.
+ */
+ void CancelJobL(TInt aJobId );
+
+ /**
+ * Cancel a specified print job. Leaves if printer is invalid.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID of cancelled job.
+ */
+ void GetEventL(TInt aJobId);
+
+ /** FinishPrinting
+ * @brief Finish all printing operations started
+ */
+
+ public: // from MBtTimerObserver
+ void HandleTimeoutL();
+
+ protected:
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ */
+ void ConstructL();
+
+ virtual void RunL();
+ virtual void DoCancel();
+ virtual TInt RunError(TInt aError);
+
+ private:
+
+ /** CBtJobChannel
+ * @brief C++ constructor
+ */
+ CBtJobChannel(MBtPCObserver& aObs);
+
+ void ConnectL();
+ void ClearConnection();
+ void CleanXhtmlDirL();
+
+ TInt CreateJobResponseL();
+ TInt GetPrinterStateResponseL();
+ TInt GetPrinterCapabilitiesResponseL();
+ TInt GetJobAttributesResponseL();
+ TInt CancelJobResponseL();
+ TInt GetEventResponseL();
+
+ void SendOPPL();
+ void SendXhtmlDocumentL();
+
+ void DoLeaveL(TInt aError);
+
+ /*
+ * Removes timeout from OBEX commands.
+ * */
+ void RemoveObexCmdTimeOut();
+
+ /*
+ * Callback function of CPeriodic.
+ * */
+ static TInt CheckProgress( TAny *aObj );
+
+ /*
+ * Calculates and returns size of current print job.
+ * */
+ TInt CBtJobChannel::CalculateJobSizeL();
+
+ /*
+ * Updates progress bar.
+ * */
+ void UpdateProgress();
+
+
+ private:
+
+ TFileName8 iJobFile;
+ TInt iJobFileNum;
+ RArray<CImageInfo> iImageList;
+ TInt iImageCount;
+ TInt iFileObjectSize;
+
+ CObexFileObject* iObexFileObject;
+
+ TInt iPercents;
+
+ CBtTimer* iTimer;
+ CBtStatusChannel* iStatusChannel;
+
+ // Periodic timer to update image sending progress.
+ CPeriodic *iUpdateProgress;
+
+ TInt iJobSize; // Size of printing job.
+ TInt iProgressOfFullImages; // Size of full images this far.
+ };
+
+#endif // CBTJOBCHANNEL_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtobjectserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,408 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTOBJECTSERVER_H
+#define CBTOBJECTSERVER_H
+
+#include <coecntrl.h>
+#include <obexserver.h>
+#include <bttypes.h>
+#include <obexobjects.h>
+
+#include "cxhtmlfilecomposer.h"
+#include "btprotocolconsts.h"
+#include "cbtdprserviceadvertiser.h"
+
+
+/**
+* MBtObjectServerObserver
+*
+* @brief Interface to observe bluetooth object server's state
+*/
+class MBtObjectServerObserver
+{
+ public:
+ enum TStatusMessages
+ {
+ KObjectServerPackageSent = 10, ///@brief a requested chunk of data sent
+ KObjectServerFileSent, ///@brief a requested file sent
+ KObjectServerAllFilesSent, ///@brief not used... cannot know when done!
+ KObjectServerStopped, ///@brief server stopped
+ KObjectServerStarted, ///@brief server started
+ KObjectServerBTDeviceMismatch, ///@brief remote device isn't correct
+ KObjectServerConnected, ///@brief remote device connected
+ KObjectServerDisconnected, ///@brief remote device disconnected
+ KObjectServerTransportUp, ///@brief transportation up with remote device
+ KObjectServerTransportDown, ///@brief transportation down with remote device
+ KObjectServerError ///@brief Error indication for any occured error
+ };
+
+ public:
+
+ /**
+ * OperationStatus
+ *
+ * A callback function to observe bluetooth object server's state
+ * @param aStatus TStatusMessages status or error code occured
+ * @param aInfo Explaining information of the status
+ */
+ virtual void HandleObjectServerEvent(TInt aStatus, TInt aInfo = 0) = 0;
+};
+/*!
+ @class CBtObjectServer
+
+ @discussion An instance of the Obex File Server object for the obexfileserver
+ example application
+ */
+NONSHARABLE_CLASS(CBtObjectServer) : public CBase, public MObexServerNotify
+{
+ public:
+
+ /**
+ * NewL()
+ * Construct a CBtObjectServer
+ * @param aDevice Device (printer) which should be contacted over Bluetooth
+ * @param aImgArray Images that will be sent over OBEX (if printer asks them)
+ * @return a pointer to the created instance of CBtObjectServer
+ */
+ static CBtObjectServer* NewL(const TBTDevAddr& aDeviceAddress, RArray<CImageInfo> &aImgArray, MBtObjectServerObserver& aObs);
+
+ /**
+ * NewLC()
+ * Construct a CBtObjectServer
+ * @param aDevice Device which should be contacted over Bluetooth
+ * @param aImgArray Images that will be sent over OBEX (if printer asks them)
+ * @return a pointer to the created instance of CBtObjectServer
+ */
+ static CBtObjectServer* NewLC(const TBTDevAddr& aDeviceAddress, RArray<CImageInfo> &aImgArray, MBtObjectServerObserver& aObs);
+
+ /**
+ * ~CBtObjectServer()
+ * Destructor for the class
+ */
+ ~CBtObjectServer();
+
+ /**
+ * CreateObexObject()
+ * For creating an OBEX object that will be send through bluetooth
+ */
+ CObexBufObject* CreateObexObjectL(const TDesC& aUri);
+
+ /**
+ * StartL()
+ * Starts the server
+ */
+ void StartL();
+
+ /**
+ * Stop()
+ * Stops the server
+ */
+ void Stop();
+
+ /**
+ * Cancel()
+ * For stopping server action nicely - will continue to send the current file to
+ * the BT device
+ */
+ void Cancel();
+
+
+ /**
+ * IsConnected()
+ * @return ETrue if the server is connected.
+ */
+ TBool IsConnected();
+
+ /**
+ * IsTransporting()
+ * @return ETrue if the transport connection is up.
+ */
+ TBool IsTransporting();
+
+ /**
+ * IsSendingData()
+ * @return ETrue if the server is sending data to a Bluetooth device
+ */
+ TBool IsSendingData();
+
+ /**
+ * IsFinished()
+ * @return ETrue if the server is finished and can be deleted
+ */
+ TBool IsFinished();
+
+ protected:
+
+ /**
+ * ConstructL()
+ * Method that constucts the classes possibly leaving parts
+ */
+ void ConstructL( RArray<CImageInfo> &aImgArray );
+
+
+ private:
+
+ /**
+ * CBtObjectServer()
+ * @param aDevice Device (printer) which should be contacted over Bluetooth
+ * @param aImgArray Images that will be sent over OBEX (if printer asks them)
+ * Private constructor
+ */
+ CBtObjectServer( const TBTDevAddr& aDeviceAddress, MBtObjectServerObserver& aObs );
+
+ /**
+ * InitialiseServerL
+ * Initialises the server
+ */
+ void InitialiseServerL();
+
+ /**
+ * InitTransferData
+ * Initialises the data used to transfer and process a file
+ */
+ void InitTransferData();
+
+ /**
+ * InitHeaderVariables
+ * Initialises the requested header data members
+ */
+ void InitHeaderVariables();
+
+ TBool AllowConnection();
+
+ /**
+ * HandleGetRequestL
+ * Method to go through to trap leaves for GetRequestIndication
+ */
+ CObexBufObject* HandleGetRequestL( CObexBaseObject* aRequestedObject );
+
+ void GetAppHeaderL(CObexBaseObject* aRequestedObject);
+ void GetDataSequenceL(const TFileName& aFileName, TInt& aFileSize);
+ void SetCompleted();
+
+ /**
+ * SetSecurityWithChannelL
+ * Sets the security on the channel port
+ * And returns the channel available.
+ * @param aAuthentication is authentication used
+ * @param aEncryption is encryption used
+ * @param aAuthorisation is authorisation used
+ * @param aDenied is denied used
+ * @return an available channel
+ */
+ TInt SetSecurityWithChannelL ( TBool aAuthentication,
+ TBool aEncryption,
+ TBool aAuthorisation,
+ TBool aDenied );
+ private:
+
+ /**
+ * Following private methods implement the MObexServerNotify class
+ * - these methods (together with CObexServer) implement the observer
+ * for the OBEX data handling
+ * - Methods are called every time server receives something over the bluetooth
+ */
+
+ /**
+ * ErrorIndication
+ * Receive error indication
+ * @param aError the error code
+ */
+ void ErrorIndication( TInt aError );
+
+ /**
+ * TransportUpIndication
+ * Called when the underlying socket transport connection is made from
+ * a remote client to the server
+ */
+ void TransportUpIndication();
+
+ /**
+ * TransportDownIndication
+ * Transport connection is dropped
+ */
+ void TransportDownIndication();
+
+ /**
+ * ObexConnectIndication
+ * Invoked when an OBEX connection is made from a remote client
+ * @param aRemoteInfo connection information supplied by
+ * the remote machine
+ * @param aInfo holds further information about the
+ * requested connection
+ * @return system wide error code
+ */
+ TInt ObexConnectIndication( const TObexConnectInfo& aRemoteInfo,
+ const TDesC8& aInfo );
+
+ /**
+ * ObexDisconnectIndication
+ * OBEX server has been disconnected
+ * @param aInfo contains information about the disconnection
+ */
+ void ObexDisconnectIndication( const TDesC8& aInfo );
+
+ /**
+ * PutRequestIndication
+ * @return the CObexBufObject in which to store
+ * the transferred object
+ */
+ CObexBufObject* PutRequestIndication();
+
+ /**
+ * PutPacketIndication
+ * @return system wide error code
+ */
+ TInt PutPacketIndication();
+
+ /**
+ * PutCompleteIndication
+ * @return system wide error code
+ */
+ TInt PutCompleteIndication();
+
+ /**
+ * GetRequestIndication
+ * Called when a full get request has been received from the client
+ * @param aRequestedObject holds details about the requested object
+ * @return the CObexBufObject in which return to the client
+ */
+ CObexBufObject* GetRequestIndication( CObexBaseObject*
+ aRequestedObject );
+
+ /**
+ * GetPacketIndication
+ * @return system wide error code
+ */
+ TInt GetPacketIndication();
+
+ /**
+ * GetCompleteIndication
+ * @return system wide error code
+ */
+ TInt GetCompleteIndication();
+
+ /**
+ * SetPathIndication
+ * @param aPathInfo the information received in a SETPATH command
+ * @return system wide error code
+ */
+ TInt SetPathIndication( const CObex::TSetPathInfo& aPathInfo,
+ const TDesC8& aInfo );
+
+ /**
+ * AbortIndication
+ * Server has been aborted
+ */
+ void AbortIndication();
+
+ /**
+ * End of the Obex Observer methods
+ *
+ */
+
+ private:
+
+ /**
+ * State of the server
+ * Owned by CBtObjectServer
+ */
+ enum TServerState
+ {
+ EStateDisconnected = 0,
+ EStateConnected,
+ EStateStop
+ };
+
+ /**
+ * Current operation of the server
+ * Owned by CBtObjectServer
+ */
+ enum TServerOperation
+ {
+ ETerminating = 0,
+ ESending,
+ EIdle
+ };
+
+ /**
+ * The bluetooth device where the images will be sent
+ * Owned by CBtObjectServer
+ */
+ const TBTDevAddr& iAllowedAddress;
+
+ /**
+ * The bluetooth device requested the data
+ * Owned by CBtObjectServer
+ */
+ TBTDevAddr iRemoteAddress;
+
+ /**
+ * The images that will be printed if printer asks for them
+ * Owned by CBtObjectServer
+ */
+ RArray<CImageInfo> iImgArray;
+
+ MBtObjectServerObserver& iObs;
+
+ /**
+ * iObexServer manages the OBEX client connection
+ * Owned by CBtObjectServer
+ */
+ CObexServer* iObexServer;
+
+ /**
+ * iObexBufData the raw data that has been transferred
+ * Owned by CBtObjectServer
+ */
+ CBufFlat* iObexBody;
+
+ /**
+ * iCurrObject the OBEX object that has been transferred
+ * Owned by CBtObjectServer
+ */
+ CObexBufObject* iObexBufObject;
+
+ /**
+ * iAdvertiser used to advertise this service
+ * Owned by CBtObjectServer
+ */
+ CBtDprServiceAdvertiser* iAdvertiser;
+
+ /**
+ * Current operation
+ */
+ TServerOperation iOperation;
+
+ RFs iFs;
+
+ TBool iStarted;
+ TBool iConnected;
+ TBool iTransportUp;
+
+ TUint iOffset;
+ TInt iCount;
+ TInt iSize;
+ TInt iProgress; // proggress in percents of currently printed file
+
+};
+
+#endif // CBTOBJECTSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtonquery.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,103 @@
+/*
+* 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 CBtOnQuery class definition. This Implementation is used to avoid
+* User::WaitForRequest() function and ViewServer 11 panic when BT naming query is activated.
+*
+*/
+
+
+#ifndef BTONQUERY_H
+#define BTONQUERY_H
+
+#include <e32base.h>
+
+class MBTOnNotify;
+
+class CBtOnQuery : public CActive
+ {
+ public: // construction / destruction
+
+ /**
+ * NewL()
+ * Create a CBtOnQuery object
+ * @param aNotify notifier to the calling object
+ * @return a pointer to the created instance of CBtOnQuery
+ */
+ static CBtOnQuery* NewL( MBTOnNotify& aNotify );
+
+ /**
+ * NewLC()
+ * Create a CBtOnQuery object
+ * @param aNotify notifier to the calling object
+ * @return a pointer to the created instance of CBtOnQuery
+ */
+ static CBtOnQuery* NewLC( MBTOnNotify& aNotify );
+
+ /**
+ * ~CBtOnQuery()
+ * Destroy the object and release all memory objects
+ */
+ ~CBtOnQuery();
+
+ public: // new functions
+
+ /**
+ * IsBluetoothOn()
+ * Starts this Active object
+ */
+ void IsBluetoothOn();
+
+ protected: // from CActive
+
+ /**
+ * RunL()
+ * Respond to an event
+ */
+ void RunL();
+
+ /**
+ * RunError()
+ * Handles errors which is throwed by RunL() function
+ */
+ void RunError();
+
+ /**
+ * DoCancel
+ * Cancel any outstanding requests
+ */
+ void DoCancel();
+
+ protected: // construction
+
+ /**
+ * CBtOnQuery()
+ * @param aNotify notifier to the calling object
+ */
+ CBtOnQuery( MBTOnNotify& aNotify );
+
+ /**
+ * ConstructL()
+ * Standard second phase construction
+ */
+ void ConstructL();
+
+ private: // data
+ MBTOnNotify &iNotify;
+ RNotifier iNotif;
+ TPckgBuf<TBool> iResultPckg;
+ };
+
+#endif // BTONQUERY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtpasswordquery.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,68 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTPASSWORDQUERY_H
+#define CBTPASSWORDQUERY_H
+
+#include <e32base.h>
+#include <e32std.h>
+#include <btnotif.h>
+
+#include "mconfirmationnotify.h"
+
+class CBtPasswordQuery : public CActive
+{
+public:
+
+ ~CBtPasswordQuery();
+
+ static CBtPasswordQuery* NewL( MConfirmationNotify& aNotify );
+
+ static CBtPasswordQuery* NewLC( MConfirmationNotify& aNotify );
+
+ void StartActiveObjectL ();
+
+protected: // from CActive
+
+ void RunL();
+
+ void RunError();
+
+ void DoCancel();
+
+protected: // construction
+
+ CBtPasswordQuery(MConfirmationNotify& aNotify);
+
+ void ConstructL();
+
+private:
+
+ MConfirmationNotify& iNotify;
+
+ TBTObexPasskey iPckg; // Input parameters
+
+ TObexPasskeyBuf iResultPckg; // Response
+
+ RNotifier iNotifier;
+
+};
+
+#endif // CBTPASSWORDQUERY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtprintercontroller.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,201 @@
+/*
+* 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: Defines the CBtPrinterController class.
+*
+*/
+
+
+#ifndef CBTPRINTERCONTROLLER_H
+#define CBTPRINTERCONTROLLER_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32math.h>
+
+#include "crsbtdiscoverengine.h"
+#include "tprintcapability.h"
+#include "mbtpcobserver.h"
+#include "cbtobjectserver.h"
+#include "cprintjob.h"
+#include "cbtonquery.h"
+#include "mbtonnotify.h"
+
+class CBtStatusChannel;
+class CBtJobChannel;
+class CBtSoapCodec;
+class CObexBufObject;
+class CObexClient;
+class CObexFileObject;
+
+NONSHARABLE_CLASS( CBtPrinterController ) : public CBase,
+ public MBtDiscoveryObserver,
+ public MBtObjectServerObserver,
+ public MBTOnNotify
+ {
+ public:
+
+ /** NewL
+ * @brief Creates a new instance of XHTML file composer.
+ * @return Pointer to the instance.
+ */
+ static CBtPrinterController* NewL(MBtPCObserver& aObs);
+
+ /** NewLC
+ * @brief Creates a new instance of XHTML file composer and leaves it in the cleanup stack.
+ * @return Pointer to the instance.
+ */
+ static CBtPrinterController* NewLC(MBtPCObserver& aObs);
+
+ void DeviceDiscovered();
+ void DeviceDisappeared();
+
+ /** ~CBtPrinterController
+ * @brief Destructor.
+ */
+ IMPORT_C ~CBtPrinterController();
+
+ TInt GetPercentSent();
+ void CancelDiscovery();
+ void Stop();
+ TBool IsConnected();
+
+ /** GetCapabilitiesL
+ * @brief Method to get printer capabilities.
+ *
+ * Actually this method gets printer attributes, but this is synchronous
+ * method to get only capabilities, not all capabilities.
+ */
+ void GetCapabilitiesL(CRsBtDevice& aDevice);
+
+ /** GetPrinterStateL
+ * @brief
+ */
+ void GetPrinterStateL(CRsBtDevice& aDevice);
+
+ /** CreateJob
+ * @brief
+ */
+ void CreateJobL(CRsBtDevice& aDevice, CPrintJob& aJob);
+
+ /** GetJobAttributes
+ * @brief
+ */
+ void GetJobAttributesL(CRsBtDevice& aDevice, TInt aJobId);
+
+ /**
+ * Cancel a specified print job. Leaves if printer is invalid.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID of cancelled job.
+ */
+ void CancelJobL( CRsBtDevice& aDevice, TInt aJobId );
+
+ /** GetEventL
+ * @brief
+ */
+ void GetEventL(TInt aJobId);
+
+ /** StartDiscoveryL
+ * @brief Starts discovering devices
+ */
+ void StartDiscoveryL(TUint aProtocol);
+
+ /** FinishPrinting
+ * @brief Finish all printing operations started
+ */
+ void FinishPrinting();
+
+ public: // From MRsBtDiscoverEngineObserver
+
+ /**
+ * @brief Get asynchronous notifications of Bluetooth device discovery or Service Discovery Protocol events.
+ *
+ * Possible values for aEvent are of type MRsBtDiscoverEngineObserver::TEvent:
+ * enum TEvent
+ * {
+ * EFoundBtPrinter,
+ * ERemoveBtPrinter,
+ * EDoneFindingPrinters,
+ * EErrorDuringDiscover,
+ * EErrorFindingDevice,
+ * EErrorVerifyingBt
+ * };
+ *
+ * @param aEvent Event that occurred, of type MRsBtDiscoverEngineObserver::TEvent.
+ * @param aErrorCode If the event is an error, error code is sent here.
+ */
+ void HandleDiscoveryEvent(TInt aEvent, TInt aErrorCode);
+
+ public: // MBtObexServerObserver
+
+ void HandleObjectServerEvent(TInt aStatus, TInt aInfo = 0);
+
+ public: // MBTOnNotify
+
+ void BTOnCompleteL( TBool aResult );
+
+ protected:
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ */
+ void ConstructL();
+
+ private:
+
+ /** CBtPrinterController
+ * @brief C++ constructor
+ */
+ CBtPrinterController(MBtPCObserver& aObs);
+
+ void InitJobVariables();
+
+ /** ConnectedL
+ * @brief Creates obex connection to the aBtDevice in the iClient
+ */
+ void ClearConnections();
+ void EstablishObjectChannelL( CRsBtDevice& aDevice );
+
+ private:
+
+ // @var iFinish
+ TBool iFinish;
+
+ RArray<CImageInfo> iImageList;
+ TInt iJobId;
+
+ MBtPCObserver& iObs;
+
+ CBtJobChannel* iJobChannel;
+ CBtObjectServer* iObjectChannel;
+
+ CRsBtDiscoverEngine* iBtDiscoverEngine;
+
+ CRsBtDevice* iDevice;
+
+ TInt iPercents;
+ TInt iImageCount;
+ TInt iSentImages;
+ TInt iServerError;
+
+ CBtOnQuery* iQuery;
+ TUint iProtocol;
+
+
+ };
+
+#endif // CBTPRINTERCONTROLLER_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtprintingdevice.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,248 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTPRINTINGDEVICE_H
+#define CBTPRINTINGDEVICE_H
+
+#include "mprotprintingdevice.h"
+#include "mbtpcobserver.h"
+#include "imageprint.h"
+#include "btprotocolconsts.h"
+#include "crsbtdiscoverengine.h"
+#include "crsbtdevice.h"
+#include "cbtprintercontroller.h"
+#include "cprintjob.h"
+
+static const TUid KBtProtocolUid = { 0x01007779 };
+
+/**
+ * @brief CBtPrintingDevice implements MProtPrintingDevice. This makes the class the "published" class of the DLL it is in.
+ */
+class CBtPrintingDevice : public CActive, public MProtPrintingDevice, public MBtPCObserver
+ {
+ public:
+
+ static MProtPrintingDevice* NewL();
+
+ // Default constructor and destructor.
+ CBtPrintingDevice();
+ ~CBtPrintingDevice();
+
+ public: // From MProtPrintingDevice
+
+ // General.
+ void ConstructL(const TDesC& aDLLPath);
+ TVersion Version();
+ TUint SupportedProtocols();
+ // Discovery.
+ void StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocols = 0);
+ TInt RemoveCachedDeviceL(TInt aDeviceID);
+ void CancelDiscovery(TBool aDoCallBack = ETrue);
+ // Print.
+ TInt CreatePrintJobL(TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver);
+
+ /**
+ * @brief Submit a job previously created with CreatePrintJobL()
+ */
+ void SubmitPrintJobL();
+
+ /**
+ * @brief Cancels and ongoing print job.
+ *
+ * @return KErrNone if successful, KErrInvalidSequence if no printing job was previously submitted.
+ */
+ TInt CancelPrintJob();
+ TInt ContinuePrintJobL();
+ TInt GetNumPrintPages();
+ TInt GetPrintJobStatus();
+ TInt GetPrinterStatus(TInt aDeviceID);
+ // Capabilities.
+ TInt GetDeviceCapabilityIDsL(TInt aDeviceID, RArray<TInt>& aCapabilityIDs);
+ TInt GetDeviceCapabilityL(TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability);
+ TInt GetJobSetting(TInt aCapabilityID, TInt& aValue);
+
+ /**
+ * @brief Sets the value of a single capability.
+ *
+ * Sets the value of a single capability. The value is passed as a TInt.
+ * For Float capabilities it is the numerator.
+ *
+ * Changes in certain capability values can affect other capabilities,
+ * such as a change in paper size changes the available templates.
+ * When this occurs, the affected capabilities are returned in the
+ * aAffectedCapability field. If there are any, the client should get
+ * these capabilities again.
+ *
+ * @param[in] aCapabilityID Id of the capability to be setted.
+ * @param[in] aValue Value to set the capability to.
+ * @param[out] aAffectedCapability 0=None, else CapabilityID
+ *
+ * @return KErrNone if successful, KErrInvalidSequence if job is not active,
+ * KErrInvalidData if setting request is invalid (either capability ID or value).
+ * Otherwise another of the system-wide error codes.
+ */
+ TInt SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability);
+
+ // Preview.
+ TInt GetNumPreviewPages();
+
+ /**
+ * @brief Creates a CFbsBitmap object and fills it with the preview bitmap.
+ *
+ * @param[in] aTemplateID Layout Capability ID of the icon desired.
+ * @param[out] aFsBitmapHandle
+ *
+ * @return KErrNone, or another of the system-wide error codes.
+ */
+ TInt GetJobTemplateIconL(TInt aTemplateID, TInt& aFsBitmapHandle);
+
+ /**
+ * Creates a preview image in a CFbsBitmap object. PreviewImageEvent() is called on the PrintEventObserver.
+ *
+ * @param aPageNumber Currently unused
+ *
+ * @return KErrNone if successful, KErrInvalidData if the Preview Image could not be loaded, or another of the system-wide error codes.
+ */
+ TInt CreatePreviewImage(TInt aPageNumber);
+
+ void RegisterIdleObserver(MProtIdleObserver * /*aObserver*/) {};
+
+ void SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr );
+
+ void CreateJobResponse( TInt aJobId, TInt aErrorCode );
+
+ void CancelJobResponse(TInt aErrorCode );
+
+ void GetPrinterStateResponse(TInt aState,
+ TInt aStateReasons,
+ TInt aOperationStatus, TInt aDeviceId);
+
+ void GetEventResponse(TInt aJobId,
+ TInt aJobState,
+ TInt aPrinterState,
+ TInt aStateReasons,
+ TInt aOperationStatus);
+
+ void GetJobAttributesResponse( TInt aJobState,
+ const TDesC8& aJobName,
+ const TDesC8& aOriginator,
+ TInt aSheetsCompleted,
+ TInt aPendingJobs,
+ TInt aErrorCode );
+
+ void DeviceDiscovered( CRsBtDevice& aDevice );
+ void DeviceDisappeared( CRsBtDevice& aDevice );
+ void DiscoveryError(TInt aError);
+
+ /*
+ * Updates OPP printing progress bar.
+ * */
+ void OPPSendProgress( TInt aProgress );
+
+ public: //own
+ static TBool HandleTimeout(TAny *aWho);
+
+ private:
+
+ virtual void RunL();
+ virtual void DoCancel();
+ virtual TInt RunError(TInt aError);
+
+ void GetUsedDevicesL();
+
+ void InitJobL(CRsBtDevice *aPrinter, RPointerArray<TDesC>& aImages);
+
+ TBool InformObserver(TInt aUsedProtocol);
+
+ void GetCapabilities(CRsBtDevice& aPrinter, TBool aForcedGet = EFalse);
+ void GetDefaultCapabilities(RArray<TPrintCapability>& aCapabilities);
+
+ void FoundDeviceL(CRsBtDevice& aDevice);
+ void UpdateCacheList();
+
+ TBool DoHandleTimeout();
+
+ void ResetTimer();
+ void StartTimer(TTimeIntervalMicroSeconds32 aDelay,
+ TTimeIntervalMicroSeconds32 anInterval,
+ TCallBack aCallBack);
+
+ CRsBtDevice* FindDevice(TInt aPrinterID);
+
+ TInt AddBtDeviceL(CRsBtDevice& aDevice);
+
+ void FinishPrinting(TInt aErrorCode);
+
+ void ManagePrintingState(TInt aJobId, TInt aJobState, TInt aPrinterState,
+ TInt aStateReasons, TInt aOperationStatus);
+
+ void GetJobAttributesL();
+ void GetPrinterStateL();
+ void CancelJobL();
+ void Deactivate();
+ // updates the printing proggress if increased and resets the pending counter if so.
+ TInt UpdateProggress();
+ void GetLocalBTNameL(TDes8& aName);
+ void OPPJobRollBack();
+
+ private:
+
+ enum TDeviceState
+ {
+ ENone,
+ EReady,
+ EGetPrinterState,
+ EGetJobAttributes,
+ EFinish,
+ EDiscovering,
+ EJobProgress,
+ ECancelJob
+ };
+
+ /// State operating.
+ TDeviceState iState;
+
+ /// Print job object.
+ CPrintJob* iPrintingJob;
+
+ CBtPrinterController* iPrinterController;
+ CBtDeviceContainer* iDeviceContainer;
+
+ /// Requested Protocols for Discovery
+ TUint iRequestedProtocols;
+
+ /// Print error.
+ TInt iPrintError;
+ /// Print error message code.
+ TInt iPrintErrorMsgCode;
+
+ TUint iPendingCount;
+
+ CPeriodic* iPrinterTimer;
+
+ TInt iProggress;
+
+ // used BlueTooth profile
+ TUint iUsedBtProfile;
+
+
+ };
+
+#endif // CBTPRINTINGDEVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtsdpadvertiser.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,134 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTSDPADVERTISER_H
+#define CBTSDPADVERTISER_H
+
+#include <e32base.h>
+#include <btsdp.h>
+#include <btmanclient.h>
+
+/**
+* CBtSdpAdvertiser
+* Base class for advertising service in the SDP database.
+*/
+NONSHARABLE_CLASS( CBtSdpAdvertiser ) : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * ~CBtSdpAdvertiser()
+ * Destroy the object, close all open handles
+ * and remove the advertised service.
+ */
+ virtual ~CBtSdpAdvertiser();
+
+ /**
+ * StartAdvertisingL()
+ * Start the advertising of this service
+ * @param aPort the port being used by the service
+ */
+ void StartAdvertisingL( TInt aPort );
+
+ /**
+ * StopAdvertisingL()
+ * Stop advertising this service. Remove the record
+ * from the sdp database
+ */
+ void StopAdvertisingL();
+
+ /**
+ * IsAdvertising()
+ * Does the SDP database contain a record for this service
+ * @return ETrue whether the service is being advertised
+ */
+ TBool IsAdvertising();
+
+ /**
+ * UpdateAvailabilityL()
+ * Update the service availability field of the service record
+ * @param aIsAvailable ETrue is the service is not busy.
+ */
+ void UpdateAvailabilityL( TBool aIsAvailable );
+
+ protected: // Constructor
+
+ /**
+ * CBtSdpAdvertiser()
+ * Construct this object
+ */
+ CBtSdpAdvertiser();
+
+ /**
+ * BuildProtocolDescriptionL()
+ * Builds the protocol description
+ * @param aProtocolDescriptor the protocol descriptor
+ * @param aPort the service port
+ */
+ virtual void BuildProtocolDescriptionL(
+ CSdpAttrValueDES* aProtocolDescriptor, TInt aPort ) = 0;
+
+ /**
+ * ServiceClass()
+ * @return the service class
+ */
+ virtual TUint ServiceClass() = 0;
+
+ /**
+ * ServiceName()
+ * @return the service name
+ */
+ virtual const TDesC& ServiceName() = 0;
+
+ /**
+ * ServiceDescription()
+ * @return the service description
+ */
+ virtual const TDesC& ServiceDescription() = 0;
+
+ private:
+
+ /**
+ * ConnectL
+ * Connect to the SDP database
+ */
+ void ConnectL();
+
+ private: //data
+
+ /** iSdpSession a handle to the SDP session */
+ RSdp iSdpSession;
+
+ /** iSdpDatabase a connection to the SDP database */
+ RSdpDatabase iSdpDatabase;
+
+ /**iRecord the record handle of the service
+ record for this server
+ */
+ TSdpServRecordHandle iRecord;
+
+ /**iRecordState the current record state - change number */
+ TInt iRecordState;
+
+ /** iIsConnected has a connection been made to the SDP Database */
+ TBool iIsConnected;
+ };
+
+#endif // CBTSDPADVERTISER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtsoapcodec.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,347 @@
+/*
+* 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: Defines the CBtSoapCodec class to create and read SOAP-encoded messages.
+*
+*/
+
+
+#ifndef CBTSOAPCODEC_H
+#define CBTSOAPCODEC_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32math.h>
+
+#include "cxmlhandler.h"
+#include "tprintcapability.h"
+#include "btprotocolconsts.h"
+
+/** @name Constants */
+/** Template file to use to create the XML soap-encoded messages */
+ _LIT( KBtXmlTemplate, "z:\\resource\\imageprintdata\\protocols\\btxmltemplate.txt" );
+
+
+/** general tags */
+_LIT8(KBtEnvelopeStartTag, "<s:Envelope");
+_LIT8(KBtEnvelopeEndTag, "</s:Envelope>");
+_LIT8(KBtBodyStartTag, "<s:Body>");
+_LIT8(KBtBodyEndTag, "</s:Body>");
+
+_LIT8(KBtAction, "[Action]");
+_LIT8(KBtActionData, "[ActionData]");
+_LIT8(KBtBytesInBody, "[BytesInBody]");
+
+/** Create job tags */
+_LIT8(KBtCreateJobStart, "[CreateJobStart]");
+_LIT8(KBtCreateJobEnd, "[CreateJobEnd]");
+
+/** Get printer attributes tags */
+_LIT8(KBtGetPrinterAttributesAllStart, "[GetPrinterAttributesAllStart]");
+_LIT8(KBtGetPrinterAttributesAllEnd, "[GetPrinterAttributesAllEnd]");
+_LIT8(KBtGetPrinterAttributesStart, "[GetPrinterAttributesStart]");
+_LIT8(KBtGetPrinterAttributesEnd, "[GetPrinterAttributesEnd]");
+_LIT8(KBtGetPrinterCapabilitiesStart, "[GetPrinterCapabilitiesStart]");
+_LIT8(KBtGetPrinterCapabilitiesEnd, "[GetPrinterCapabilitiesEnd]");
+_LIT8(KBtGetPrinterStateStart, "[GetPrinterStateStart]");
+_LIT8(KBtGetPrinterStateEnd, "[GetPrinterStateEnd]");
+
+
+/** Get printer attributes tags */
+_LIT8(KBtGetJobAttributesStart, "[GetJobAttributesStart]");
+_LIT8(KBtGetJobAttributesEnd, "[GetJobAttributesEnd]");
+
+/** Get margins tags */
+_LIT8(KBtGetMarginsStart, "[GetMarginsStart]");
+_LIT8(KBtGetMarginsEnd, "[GetMarginsEnd]");
+_LIT8(KBtMediaSizeData, "[MediaSizeData]");
+_LIT8(KBtMediaTypeData, "[MediaTypeData]");
+
+/** Job related */
+_LIT8(KBtJobIdStart, "[JobIdStart]");
+_LIT8(KBtJobIdEnd, "[JobIdEnd]");
+
+/** Actions */
+enum TBtSoapActions
+{
+ EBtUnknownAction = -1,
+ EBtCreateJob,
+ EBtCreateJobResponse,
+ EBtGetPrinterAttributes,
+ EBtGetPrinterAttributesResponse,
+ EBtGetJobAttributes,
+ EBtGetJobAttributesResponse,
+ EBtCancelJob,
+ EBtCancelJobResponse,
+ EBtGetEvent,
+ EBtGetEventResponse,
+ EBtGetMargins,
+ EBtGetMarginsResponse,
+ // Not actual actions but identifiers as sub for EBtGetPrinterAttributes
+ EBtGetPrinterCapabilities,
+ EBtGetPrinterState
+};
+
+_LIT8(KBtCreateJob, "CreateJob");
+_LIT8(KBtCreateJobResponse, "CreateJobResponse");
+_LIT8(KBtGetPrinterAttributes, "GetPrinterAttributes");
+_LIT8(KBtGetPrinterAttributesResponse, "GetPrinterAttributesResponse");
+_LIT8(KBtGetJobAttributes, "GetJobAttributes");
+_LIT8(KBtGetJobAttributesResponse, "GetJobAttributesResponse");
+_LIT8(KBtCancelJob, "CancelJob");
+_LIT8(KBtCancelJobResponse, "CancelJobResponse");
+_LIT8(KBtGetEvent, "GetEvent");
+_LIT8(KBtGetEventResponse, "GetEventResponse");
+_LIT8(KBtGetMargins, "GetMargins");
+_LIT8(KBtGetMarginsResponse, "GetMarginsResponse");
+
+_LIT8(KBtNumberUpSupported, "NumberUpSupported");
+_LIT8(KBtMediaTypesSupported, "MediaTypesSupported");
+_LIT8(KBtMediaSizesSupported, "MediaSizesSupported");
+_LIT8(KBtPrintQualitySupported, "PrintQualitySupported");
+_LIT8(KBtMediaLoaded, "MediaLoaded");
+_LIT8(KBtLoadedMediumDetails, "LoadedMediumDetails");
+
+/** Attributes */
+_LIT8(KBtOperationStatus, "OperationStatus");
+_LIT8(KBtJobId, "JobId");
+_LIT8(KBtJobName, "JobName");
+_LIT8(KBtJobState, "JobState");
+_LIT8(KBtJobOriginatingUserName, "JobOriginatingUserName");
+_LIT8(KBtJobMediaSheetsCompleted, "JobMediaSheetsCompleted");
+_LIT8(KBtJobPending, "NumberOfInterveningJobs");
+
+_LIT8(KBtPrinterName, "PrinterName");
+_LIT8(KBtPrinterState, "PrinterState");
+_LIT8(KBtPrinterStateReasons, "PrinterStateReasons");
+
+_LIT8(KBtDocumentFormat, "DocumentFormat");
+_LIT8(KBtCopies, "Copies");
+_LIT8(KBtSides, "Sides");
+_LIT8(KBtNumberUp, "NumberUp");
+_LIT8(KBtOrientationRequest, "OrientationRequest");
+_LIT8(KBtMediaSize, "MediaSize");
+_LIT8(KBtMediaType, "MediaType");
+_LIT8(KBtPrintQuality, "PrintQuality");
+_LIT8(KBtLoadedMediumSize, "LoadedMediumSize");
+_LIT8(KBtLoadedMediumType, "LoadedMediumType");
+
+_LIT8(KBtStartTag, "<%S>");
+_LIT8(KBtEndTag, "</%S>");
+_LIT8(KBtValueTemplate, "[%S]");
+
+static const TInt KAttrStrLen = 0x100;
+typedef TBuf8<KAttrStrLen> TBtAttrString8;
+typedef TBuf8<KDefaultRealWidth> TBtIntString8;
+
+/**
+* @class CBtSoapCodec
+* @brief Class to create and read SOAP-encoded messages.
+*
+* Class defines methods to encode and decode BPP actions to SOAP-encoded messages.
+* @n
+* @b Usage:
+* @n
+* @b Creating a message:
+* <OL>
+* 1. Create an instance of the class
+* 2. Create an encoded message by CreateSoapL
+* </OL>
+* @n
+* After a message is created, it must be added in OBEX message body.
+* @n
+* @b Reading a message:
+* After a OBEX message is received, a body from it can be given to
+* CBtSoapCodec to decode the SOAP-encoded message.
+* <OL>
+* 1. Decode and the message by ReadSoapL
+* 2. Get the attributes(s) of the message by GetAttributeL
+* </OL>
+*
+*/
+NONSHARABLE_CLASS( CBtSoapCodec ) : public CBase
+ {
+ public:
+
+ /** NewL
+ * @brief Creates a new instance of SOAP codec class.
+ * @return Pointer to the instance.
+ */
+ static CBtSoapCodec* NewL();
+
+ /** NewLC
+ * @brief Creates a new instance of SOAP codec class and leaves it in the cleanup stack.
+ * @return Pointer to the instance.
+ */
+ static CBtSoapCodec* NewLC();
+
+ /** ~CBtSoapCodec
+ * @brief Destructor.
+ */
+ ~CBtSoapCodec();
+
+
+ /** Reset
+ * @brief Resets the member variables.
+ */
+ void Reset();
+
+ /** CreateSoapL
+ * @brief Creates the SOAP-encoded message.
+ * According to the action parameter given, the method reads
+ * the xml template for a named action from file @ref KBtXmlTemplate
+ * and decodes it with the data concerning.
+ * @param aAction Name of the action for the message to create.
+ * @param aJobId Jod identifier for the actions required.
+ * NOTE: for CreateJob operation the job id is the cumulative number
+ * of the created jobs during the session.
+ * @return Pointer to the SOAP-encoded message for the action
+ */
+ TPtrC8 CreateSoapL(const TInt aAction, const TInt aJobId = KErrNotFound);
+
+ /** SoapAction
+ * @brief Returns for the action of the SOAP-encoded message
+ * @return TBtSoapActions type action identifier
+ */
+ TInt SoapAction();
+
+ /** ReadSoapL
+ * @brief Reads the SOAP-encoded message.
+ * The message is read and the class is initialized with the data of the message.
+ * @param aAction Returns the name of the action of the SOAP-encoded data
+ * @param aSoapBuffer The buffer to read
+ */
+ void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer);
+
+ /** @overload void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer) */
+ void ReadSoapL(TInt& aAction, const CBufBase& aSoapBuffer);
+
+ /** @overload void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer) */
+ void ReadSoapL(const TDesC8& aSoapBuffer);
+
+ /** @overload void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer) */
+ void ReadSoapL(const CBufBase& aSoapBuffer);
+
+ public:
+ void CreateJobResponseL(TInt& aJobId, TInt& aErrorCode);
+
+ void GetPrinterAttributesResponseL(TInt& aState, TInt& aStateReasons,
+ RArray<TPrintCapability>& aCapabilities,
+ TInt& aOperationStatus);
+
+ void GetPrinterStateResponseL(TInt& aState, TInt& aStateReasons, TInt& aOperationStatus);
+
+ void GetPrinterCapabilitiesResponseL(RArray<TPrintCapability>& aCapabilities,
+ TInt& aOperationStatus);
+
+ void GetJobAttributesResponseL(const TInt aJobId,
+ TInt& aJobState,
+ TBtAttrString8& aJobName,
+ TBtAttrString8& aOriginator,
+ TInt& aSheetsCompleted,
+ TInt& aPendingJobs,
+ TInt& aOperationStatus );
+
+ void CancelJobResponseL(const TInt aJobId, TInt& aOperationStatus);
+
+ void GetEventResponseL(const TInt aJobId,
+ TInt& aJobState,
+ TInt& aPrinterState,
+ TInt& aStateReasons,
+ TInt& aOperationStatus);
+ TInt OperationStatusL();
+
+ public:
+ /** GetAttributeL
+ * @brief Reads the requested attributes's value.
+ * @param aName Name of the attribute
+ * @param aValue Returns the value of the attribute
+ * @param aError Returns the code for the occurred error or KErrNone
+ */
+ void GetAttributeL(const TDesC8& aName, TDes8& aValue, TInt& aError);
+
+ void GetAttributeListL(const TDesC8& aName, CDesC8ArrayFlat& aList, TInt& aError);
+
+ public:
+ /** TestMeL - Static test method
+ * @brief Static method to test this class' public interface.
+ */
+ static void TestMeL();
+ static TPtrC8 CreateJobResponseTestSoap();
+ static TPtrC8 CancelJobResponseTestSoap();
+ static TPtrC8 GetPrinterAttributesResponseTestSoap();
+ static TPtrC8 GetJobAttributesResponseTestSoap();
+ static TPtrC8 GetEventsResponseTestSoap();
+ static TPtrC8 GetMarginsResponseTestSoap();
+
+ protected:
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ */
+ void ConstructL();
+
+ private:
+
+ /** CBtSoapCodec
+ * @brief C++ constructor
+ */
+ CBtSoapCodec();
+
+ /** CreateSoapTemplateL
+ * @brief Constructs a correct type message template.
+ * According to the given parameters method composes a template
+ * for the message with general headers and action specific data block.
+ * @param aStartTag Start tag for the action
+ * @param aEndTag End tag for the action
+ */
+ void CreateSoapTemplateL(const TDesC8& aStartTag, const TDesC8& aEndTag);
+
+ /** CreateJobSoapL
+ * @brief Composes the CreateJob action specific data in template.
+ */
+ void CreateJobSoapL(const TInt aJobId);
+
+ /** GetPrinterAttributesSoapL
+ * @brief Composes the GetPrinterAttributes action specific data in template.
+ */
+ void GetPrinterAttributesSoapL();
+ void GetCapabilitiesSoapL();
+ void GetPrinterStateSoapL();
+
+ void GetJobAttributesSoapL(const TDesC8& aJobId);
+ void CancelJobSoapL(const TDesC8& aJobId);
+ void GetEventSoapL(const TDesC8& aJobId);
+ void GetMarginsSoapL();
+
+ TPrintCapability ParseLayoutL();
+ TPrintCapability ParseQualityL();
+ TPrintCapability ParsePaperSizeL();
+ void ParseDefaultSizeL(TPrintCapability& aSize, TInt& aPos);
+ TInt ValuePosition(TPrintCapability aCapab, TInt aValue);
+
+ private:
+
+ /** @var HBufC8* iActionBuffer
+ * Buffer to store the action data */
+ HBufC8* iActionBuffer;
+
+ /** @var CXmlHandler* iXmlHandler
+ * XML handler */
+ CXmlHandler* iXmlHandler;
+
+ };
+
+#endif // CBTSOAPCODEC_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtstatuschannel.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,114 @@
+/*
+* 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: Defines the CBtStatusChannel class.
+*
+*/
+
+
+#ifndef CBTSTATUSCHANNEL_H
+#define CBTSTATUSCHANNEL_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32math.h>
+#include <obex.h>
+
+#include "crsbtdiscoverengine.h"
+#include "tprintcapability.h"
+#include "cbtchannelbase.h"
+#include "mbtpcobserver.h"
+#include "cbtobjectserver.h"
+#include "cprintjob.h"
+
+/**
+* @class CBtStatusChannel
+* @brief
+*
+*/
+NONSHARABLE_CLASS( CBtStatusChannel ) : public CBtChannelBase
+ {
+ public:
+
+ /** NewL
+ * @brief Creates a new instance of XHTML file composer.
+ * @return Pointer to the instance.
+ */
+ static CBtStatusChannel* NewL(MBtPCObserver& aObs);
+
+ /** NewLC
+ * @brief Creates a new instance of XHTML file composer and leaves it in the cleanup stack.
+ * @return Pointer to the instance.
+ */
+ static CBtStatusChannel* NewLC(MBtPCObserver& aObs);
+
+ /** ~CBtStatusChannel
+ * @brief Destructor.
+ */
+ ~CBtStatusChannel();
+
+ /** GetPrinterAttributesL
+ * @brief
+ */
+ TInt GetPrinterStateL();
+
+ /** GetJobAttributes
+ * @brief
+ */
+ TInt GetJobAttributesL(TInt aJobId);
+
+ /**
+ * Cancel a specified print job. Leaves if printer is invalid.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID of cancelled job.
+ */
+ void GetEventL(TInt aJobId);
+
+ protected:
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ */
+ void ConstructL();
+
+ void RunL();
+ virtual void DoCancel();
+ TInt RunError(TInt aError);
+
+ private:
+
+ /** CBtStatusChannel
+ * @brief C++ constructor
+ */
+ CBtStatusChannel(MBtPCObserver& aObs);
+
+ void GetPrinterStateResponseL();
+ void GetJobAttributesResponseL();
+ void CancelJobResponseL();
+ void GetEventResponseL();
+
+ /** ConnectL
+ * @brief Creates obex connection to the aBtDevice in the iClient
+ */
+ void ConnectL();
+
+ void DoLeaveL(TInt aError);
+
+ private:
+
+ };
+
+#endif // CBTSTATUSCHANNEL_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbttimer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,65 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBTTIMER_H
+#define CBTTIMER_H
+
+#include <e32base.h>
+
+namespace
+ {
+ // 0,1 second for AOs to finish their RunL methods
+ const TUint KPrintingErrorDelay = 100000;
+
+ // 60 seconds for discovery
+ const TUint KDiscoveryDelay = 60000000;
+
+ // 5 seconds for data sending percents
+ const TUint KSentPercentsDelay = 3000000;
+
+ // 5 seconds for data sending percents
+ const TUint KPrinterResponseTimeout = 5000000;
+
+ }
+
+class MBtTimerObserver
+ {
+ public:
+ virtual void HandleTimeoutL() = 0;
+ };
+
+class CBtTimer : public CTimer
+ {
+ public:
+ static CBtTimer* NewL( MBtTimerObserver& aObserver );
+ ~CBtTimer();
+ void Start(TUint aDelay);
+
+ private:
+ CBtTimer( MBtTimerObserver& aObserver );
+ void ConstructL();
+ void RunL();
+
+ private:
+ MBtTimerObserver& iObserver;
+ };
+
+
+#endif // CBTTIMER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cprintjob.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,213 @@
+/*
+* 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 CPrintJob class definition and the PJS enum.
+*
+*/
+
+
+#ifndef CPRINTJOB_H
+#define CPRINTJOB_H
+
+#include <e32base.h>
+
+#include "cxhtmlfilecomposer.h"
+#include "crsbtdevice.h"
+
+#define KMaxIdLength 10
+
+
+class TPrintSetting
+{
+ public:
+ TInt iCapability;
+ TInt iValue;
+};
+
+NONSHARABLE_CLASS( CPrintJob ): public CBase
+{
+ public:
+ /// Possible states of a print job.
+ enum TJobState
+ {
+ EStateNone,
+ EStateCreated,
+ EStateSubmitted,
+ EStateSending,
+ EStatePrinting,
+ EStateCancel
+ };
+
+ public:
+ /*
+ * @function NewL
+ * @description Constructs the CPrintJob object.
+ * NOTE: The ownership of aFileFactory does not change here!
+ * @param aPrinter Selected printer for the job
+ * @param aImages Array of images to be printed
+ * @param aFileFactory Pointer to XHTML-print file factory
+ * @param aUserName User name got from central repository
+ */
+ static CPrintJob* NewL(CRsBtDevice* aDevice, RArray<TFileName>& aImages, const TDesC8& aUserName);
+
+ /*
+ * @function Destructor
+ * @description Destroys the object and frees the memory allocated by this object
+ */
+ ~CPrintJob();
+
+ /*
+ * @function SetJobId
+ * @description Initializes the job id
+ * @param TDesC& aId
+ */
+ void SetJobId(const TInt aId);
+
+ /*
+ * @function JobId
+ * @description Returns the job id as TInt
+ * @return Job id
+ */
+ TInt JobId();
+
+ /*
+ * @function GetJobName
+ * @description Returns the file path
+ * @param TDes8&
+ */
+ void GetJobName(TDes8& aJobName);
+
+ /*
+ * @function ImageCount
+ * @description Returns the number of images in job.
+ * @return TInt
+ */
+ TInt ImageCount();
+
+ /*
+ * @function Images
+ * @description Returns job's images as CImageInfo
+ * @param RArray<CImageInfo> Output parameter
+ */
+ void Images(RArray<CImageInfo>& aImages);
+
+ /*
+ * @function PrinterId
+ * @description Returns the printer id
+ * @param TInt
+ */
+ TInt PrinterId();
+
+ /*
+ * @function Device
+ * @description Returns the printer id
+ * @param TInt
+ */
+ CRsBtDevice* Device();
+
+ /*
+ * @function GetUserName
+ * @description Returns the user name
+ * @param TPtrC8&
+ */
+ void GetUserName(TPtrC8& aDocFormat);
+
+ /*
+ * @function SetNumsOfCopies
+ * @description Sets the number of copies for certain image.
+ * @param TInt aCapabilityId
+ * @param TInt aValue
+ * @return TInt System wide error code
+ */
+ TInt SetNumsOfCopies( const RArray<TInt>& aNumsOfCopies);
+
+ /*
+ * @function XhtmlPrintFile
+ * @description Returns the file path of generated XHTML-Print file
+ * @param TDes8&
+ */
+ void GetPrintFileL(TDes8& aPrintFile);
+
+ /*
+ * @function Sheets
+ * @description Returns the total number of sheets the job requires
+ * @return TInt
+ */
+ TInt Sheets();
+
+ /*
+ * @function JobState
+ * @description Returns the job state
+ * @return TJobState
+ */
+ TJobState JobState();
+
+ /*
+ * @function UpdateJobState
+ * @description Updates the job state
+ */
+ void UpdateJobState(const TJobState aState);
+
+ /*
+ * @function GetPrintSetting
+ * @description Gets print settings
+ */
+ TInt GetPrintSetting(TInt aCapabilityID, TInt& aValue);
+ TInt SetPrintSetting(TInt aCapabilityID, TInt aValue);
+
+
+ protected:
+ /*
+ * @function ConstructL
+ * @description Construction's second phase
+ * @param aPriner Selected printer for the job
+ * @param aImages Array of images to be printed
+ */
+ void ConstructL(RArray<TFileName>& aImages, const TDesC8& aUserName);
+
+ private:
+
+ /*
+ * @function CPrintJob
+ * @description C++ constructor
+ * @param aPrinterId Id of the printer to be used for this job.
+ *
+ */
+ CPrintJob(CRsBtDevice* aDevice);
+
+ private:
+
+ //@var iJobId Id for printing job received from printer control point
+ TInt iJobId;
+
+ //@var iDeviceId Defines the printer to be used.
+ TInt iDeviceId;
+
+ CRsBtDevice* iDevice;
+
+ //@var iUserName Name of the user
+ TFileName8 iUserName;
+
+ //@var iImages Job's images
+ RArray<CImageInfo> iImages;
+
+ //@var iSheets Number of sheets to print
+ TInt iSheets;
+
+ TJobState iJobState;
+
+};
+
+#endif // CPRINTJOB_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/crsbtdevice.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,149 @@
+/*
+* 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 CRsBtDevice class definition.
+*
+*/
+
+
+#ifndef CRSBTDEVICE_H
+#define CRSBTDEVICE_H
+
+#include <e32base.h>
+#include <bt_sock.h>
+#include <btdevice.h>
+
+#include "tprinter.h"
+#include "btprotocolconsts.h"
+#include "tprintcapability.h"
+
+/**
+ * @brief Stores information on Bluetooth device.
+ *
+ * Contains information related to a Bluetooth device, such as a printer. This includes Bluetooth
+ * information like device ID and device class, BPP and OPP information like port (channel), number of prints made,
+ * and time stamps of discovery and last use.
+ */
+NONSHARABLE_CLASS( CRsBtDevice ): public CBase
+ {
+ public:
+ TBool UpdateDeviceL(CRsBtDevice &aDevice);
+ TBool UpdateDeviceAndBPPL(CRsBtDevice& aDevice);
+ TBool UpdateAllL(CRsBtDevice &aDevice);
+ TBool UpdateUsedL(CRsBtDevice &aDevice);
+
+ void SetDisappeared(TBool aDisappeared);
+ TBool IsDisappeared() const;
+
+ void SetSupportedProtocols(TUint aSupportedProtocols);
+ TUint SupportedProtocols() const;
+
+ void SetBPPPort(TUint aPort);
+ TUint BPPPort() const;
+
+ void SetSTSPort(TUint aPort);
+ TUint STSPort() const;
+
+ void SetOPPPort(TUint aPort);
+ TUint OPPPort() const;
+
+ void SetTimeLastUsed(TTime aTime);
+ TTime TimeLastUsed() const;
+
+ void SetTimeDiscovered(TTime aTime);
+ TTime TimeDiscovered() const;
+
+ const TBTDevAddr& BDAddr() const;
+ TBTDeviceClass DeviceClass() const;
+
+ TBool Equals( const CRsBtDevice &aDevice ) const;
+ CRsBtDevice* CopyL();
+ CRsBtDevice* CopyL(CRsBtDevice& aSource);
+
+ static CRsBtDevice* NewLC(const CRsBtDevice &a);
+ static CRsBtDevice* NewLC(const TNameRecord &aName);
+ static CRsBtDevice* NewLC();
+ static CRsBtDevice* NewL(const CRsBtDevice &a);
+ static CRsBtDevice* NewL(const TNameRecord &aName);
+ static CRsBtDevice* NewL();
+
+ virtual ~CRsBtDevice();
+
+ void ExternalizeL(RWriteStream& aStream) const;
+ void InternalizeL(RReadStream& aStream);
+
+ const TDesC& FriendlyName() const;
+
+ void SetPrinterModelL(const TDesC& aModelName);
+ const TDesC& GetPrinterModel() const;
+
+ void SetJustFound(TBool aJustFound);
+ TBool IsJustFound() const;
+
+ TInt DeviceId() const;
+ void SetDeviceId(TInt aNewId);
+
+ void SetVendor( TPrinter::TPrinterVendor aVendor );
+ TPrinter::TPrinterVendor Vendor() const;
+
+ void AddCapability(TPrintCapability& aCapability);
+ void GetCapabilityIDs(RArray<TInt>& aCapabilityIDs );
+ TInt GetCapability(const TInt aCapabilityID, TPrintCapability& aCapability);
+ TInt SetDefaultCapability(TInt aCapabilityID, TInt aValue);
+ TInt CapabilityCount() const;
+
+ TPrinter ToTPrinter();
+ TBool IsUsed() const;
+ void SetUsed(TBool aUsed);
+
+ TInt UsedProtocol() const;
+ TInt ComposeUsedProtocol(TInt aRequestedProtocols);
+ void SetUsedProtocol(TInt aProtocol);
+
+ private:
+ CRsBtDevice();
+ // copy constructor
+ CRsBtDevice(const CRsBtDevice &a);
+
+ void ConstructL(const TNameRecord &aName);
+ void ConstructL(const CRsBtDevice &a);
+ void ConstructL();
+ void Init();
+ void ExternalizeCapabilitiesL(RWriteStream& aStream) const;
+ void InternalizeCapabilitiesL(RReadStream& aStream);
+
+ private:
+ TTime iTimeLastUsed;
+ TTime iTimeDiscovered;
+ TUint iBPPPort;
+ TUint iSTSPort;
+ TUint iOPPPort;
+ TUint iSupportedProtocols;
+ TPrinter::TPrinterVendor iVendor;
+ CBTDevice* iDevice;
+ HBufC *iPrinterModel;
+ TBool iJustFound;
+ TInt iInternalDeviceId;
+
+ TBool iUsed;
+ TBool iDisappeared;
+
+ TInt iUsedProtocol;
+ RArray<TPrintCapability> iCapabilities;
+
+
+ };
+
+#endif // CRSBTDEVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/crsbtdiscoverengine.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,131 @@
+/*
+* 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 CRsBtDiscoverEngine class definition and its observer
+* definition (MBtDiscoveryObserver).
+*
+*/
+
+
+#ifndef CRSBTDISCOVERENGINE_H
+#define CRSBTDISCOVERENGINE_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <bttypes.h>
+
+#include "imageprint.h"
+#include "cbttimer.h"
+
+class CBtDiscover;
+class CRsBtDevice;
+class CBtDeviceContainer;
+
+#define KMaxDaysForCachedDevice 30
+
+
+/**
+ * \brief Observer interface for device discovery or SDP events.
+ *
+ * The class which owns the CRsBtDiscoverEngine object implements this interface to get
+ * asynchronous notifications of Bluetooth device discovery or Service Discovery Protocol
+ * events.
+ */
+class MBtDiscoveryObserver
+ {
+ public:
+ // the values in this enum are subject to change as need crops up
+ // the granularity of feedback should be enough to meet UI needs
+
+ enum TEvent
+ {
+ EFoundBtPrinter,
+ ERemoveBtPrinter,
+ EDoneFindingPrinters,
+ EErrorDuringDiscover,
+ EErrorFindingDevice,
+ EErrorVerifyingBt
+ };
+ public:
+ virtual void HandleDiscoveryEvent(TInt aEvent,TInt aErrorCode)=0;
+ };
+
+/**
+ * \brief Brief Description
+ *
+ * Detailed Description
+ */
+NONSHARABLE_CLASS( CRsBtDiscoverEngine ): public CActive, public MBtTimerObserver
+ {
+ public:
+ CRsBtDevice& GetDevice();
+ ~CRsBtDiscoverEngine();
+
+ static CRsBtDiscoverEngine* NewL(MBtDiscoveryObserver& aObs);
+ void Start(TUint aRequestedProtocols);
+ void Stop();
+
+ protected: // from CActive
+ void DoCancel();
+ void RunL();
+ TInt RunError(TInt aError);
+
+ protected: // from MBtTimerObserver
+ void HandleTimeoutL();
+
+ private:
+
+ CRsBtDiscoverEngine(MBtDiscoveryObserver& aObs);
+ void ConstructL();
+
+ void StartDiscovery();
+ void ContinueDiscovery();
+
+ TBool ComposeDeviceL();
+ void ResetDevice();
+
+ TBool CheckBtDevice();
+
+ void ServiceDiscoveryL();
+ void StopServiceDiscovery();
+
+ private:
+
+ enum TState
+ {
+ EFindingDevices,
+ EGettingServices,
+ EDelayFindDevices
+ };
+
+ private:
+
+ /// State we are currently on ESendingCached, EFindingDevices, ERemovingStale, EVerifyServices, EDelayFindDevices.
+ TState iState;
+ /// This Object implements the Bluetooth Discovery system calls.
+ CBtDiscover *iDiscover;
+ /// Discovery Events observer.
+ MBtDiscoveryObserver& iObserver;
+ /// Indicates the position of the current device.
+ CRsBtDevice* iDevice;
+
+ RArray<TBTDevAddr> iFoundBeforeArray;
+ RTimer iDelayFindDevices;
+ /// Bitmask of the protocols requested for printing.
+ TUint iRequestedProtocols;
+ CBtTimer* iTimeout;
+ };
+
+#endif // CRSBTDISCOVERENGINE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cxmlhandler.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,185 @@
+/*
+* 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: Handler for XML file modify. Defines the class to store and modify XML data.
+*
+*/
+
+
+#ifndef CXMLHANDLER_H
+#define CXMLHANDLER_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <badesca.h>
+
+/** general tags */
+_LIT8(KBtLessThan, "<");
+_LIT8(KBtGreaterThan, ">");
+_LIT8(KBtLessThanSlash,"</");
+_LIT8(KBtSlash, "/");
+_LIT8(KEof, "EOF");
+
+/** Maximum size of template file */
+const TInt KBtMaxFileSize = 2048;
+
+/**
+* @class CXmlHandler
+* @brief Class to store and modify XML data.
+* @n
+* @b Usage:
+* <OL>
+* @li Create an instance of class
+* @li Initialize class with a data buffer by InitFromBufferL or with a file name by InitFromFileL
+* @li Get/replace/remove parts of initialized data
+* </OL>
+*/
+NONSHARABLE_CLASS( CXmlHandler ): public CBase
+ {
+ public:
+
+ /** NewL
+ * @brief Creates a new instance of XML handler.
+ * @return Pointer to the instance.
+ */
+ static CXmlHandler* NewL();
+
+ /** NewLC
+ * @brief Creates a new instance of XML handler and leaves it in the cleanup stack.
+ * @return Pointer to the instance.
+ */
+ static CXmlHandler* NewLC();
+
+ static TPtrC8 ParseValue(const TDesC8 &aData, const TDesC8 &aStart, const TDesC8 &aEnd, TInt& aOffset);
+ static void ParseValueListL(const TDesC8 &aData, const TDesC8 &aStart, const TDesC8 &aEnd, CDesC8ArrayFlat& aList);
+
+ /** ~CXmlHandler
+ * @brief Destructor.
+ */
+ ~CXmlHandler();
+
+
+ /** Reset
+ * @brief Resets the member variables.
+ */
+ void Reset();
+
+ /** InitFromFileL
+ * @brief Reads the named template file for handling it.
+ * @param aFile Name of the file to read for handle
+ * @param aId Identifier for the data stored in class
+ */
+ void InitFromFileL(const TDesC& aFile, const TInt aId = KErrNotFound);
+
+ /** InitFromBufferL
+ * @brief Initialises the data to handle with given buffer.
+ * @param aBuffer The buffer to handle
+ * @param aId Identifier for the data stored in class
+ */
+ void InitFromBufferL(const TDesC8& aBuffer, const TInt aId = KErrNotFound);
+
+
+ /** ComposeDataL
+ * @brief Replaces the template with string value in stored data
+ * @param aStr String to convert for
+ * @param aTag Template to replace
+ */
+ void ComposeDataL(const TDesC8& aData, const TDesC8& aTag);
+
+ /** @overload void ComposeDataL(const TDesC8& aData, const TDesC8& aTag) */
+ void ComposeDataL(const TInt aValue, const TDesC8& aTag);
+
+ /** InsertDataL
+ * @brief Inserts data in the buffer
+ * @param aStr String to convert for
+ * @param aTag Template to replace
+ */
+ void InsertDataL(const TDesC8& aData, const TInt aOffset);
+
+ /** GetDataL
+ * @brief Returns the data between given start and end descriptors.
+ * NOTE: The start and end descriptors are @e not returned.
+ * @param aStart Start tag for data to find.
+ * @param aEnd End tag for data to find.
+ * @param aOffset Returns offset for the data start. KErrNotFound indicates the data not found.
+ */
+ TPtrC8 GetDataL(const TDesC8& aStart, const TDesC8& aEnd, TInt& aOffset);
+
+ /** FinalizeBufferL
+ * @brief Trims the member buffer tail. Replacing the template strings from
+ * the buffer makes the data length in the buffer vary and generates
+ * rubbish in the end of buffer.
+ * @param aTag End tag to delete all after it.
+ * @return Pointer to the stored data.
+ */
+ TPtrC8 FinalizeBufferL(const TDesC8& aTag);
+
+ /** DeleteBufferData
+ * @brief Deletes the data from the buffer.
+ * @param aOffset Data offset to start delete
+ * @param aLength Length of the data to delete
+ */
+ void DeleteBufferData(TInt aOffset, TInt aLength);
+
+ /** BufferId
+ * @brief Returns the identifier of the stored data.
+ * @return Identifier of the stored data
+ */
+ TInt BufferId();
+
+ /** Buffer
+ * @brief Returns the pointer to the stored data.
+ * @return Pointer to the stored data
+ */
+ TPtrC8 Buffer();
+
+ void GetDataListL(const TDesC8 &aStart, const TDesC8 &aEnd, CDesC8ArrayFlat& aList);
+
+ protected:
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ */
+ void ConstructL();
+
+ private:
+
+ /** CXmlHandler
+ * @brief C++ constructor
+ */
+ CXmlHandler();
+
+ /** ReadFileL
+ * @brief Reads the file in iDataBuf
+ */
+ void ReadFileL(const TDesC& aFile);
+
+ private:
+
+ /** @var HBufC8* iDataBuf
+ * Buffer to store the data initialized */
+ HBufC8* iDataBuf;
+
+ /** @var TInt iBufferId
+ * Identifier for the stored data. Initialized as KErrNotFound. */
+ TInt iBufferId;
+
+ /** @var RFs iFs
+ * File server session */
+ RFs iFs;
+
+ };
+
+#endif // CXMLHANDLER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/mbtonnotify.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef BTONNOTIFY_H
+#define BTONNOTIFY_H
+
+#include <e32std.h>
+
+class MBTOnNotify
+ {
+ public:
+ virtual void BTOnCompleteL( TBool aResult ) = 0;
+ };
+
+#endif // BTONNOTIFY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/mbtpcobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,128 @@
+/*
+* 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: Declares the MBtPCObserver interface class
+*
+*/
+
+
+#ifndef MBTPCOBSERVER_H
+#define MBTPCOBSERVER_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+class CRsBtDevice;
+class TPrintCapability;
+
+
+// CLASS DECLARATION
+
+/**
+* @brief A virtual MBtPCObserver class.
+*
+* @since Series60 3.1
+*/
+class MBtPCObserver
+ {
+ public: // New interface functions
+
+ /**
+ * CreateJobResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void CreateJobResponse( TInt aJobId, TInt aErrorCode ) = 0;
+
+ /**
+ * CancelJobResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void CancelJobResponse( TInt aErrorCode ) = 0;
+
+ /**
+ * GetPrinterAttributesResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ *
+ virtual void GetPrinterAttributesResponse( TInt aState, TInt aStateReasons,
+ RArray<TPrintCapability>& aCapabilities,
+ TInt aOperationStatus, TInt aDeviceId) = 0;
+
+ **
+ * GetPrinterAttributesResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetPrinterStateResponse( TInt aState, TInt aStateReasons,
+ TInt aOperationStatus, TInt aDeviceId) = 0;
+
+ /**
+ * GetJobAttributesResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetJobAttributesResponse( TInt aJobState,
+ const TDesC8& aJobName,
+ const TDesC8& aOriginator,
+ TInt aSheetsCompleted,
+ TInt aPendingJobs,
+ TInt aOperationStatus ) = 0;
+
+ /**
+ * GetEventResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetEventResponse(TInt aJobId,
+ TInt aJobState,
+ TInt aPrinterState,
+ TInt aStateReasons,
+ TInt aOperationStatus) = 0;
+ /**
+ * DeviceDiscoveredL callback function
+ * @since Series60 3.1
+ * @param aDevice the device discovered
+ */
+ virtual void DeviceDiscovered( CRsBtDevice& aDevice ) = 0;
+
+ /**
+ * DeviceDisappeared callback function
+ * @since Series60 3.1
+ * @param aDevice the device disappeared
+ */
+ virtual void DeviceDisappeared( CRsBtDevice& aDevice ) = 0;
+
+ /**
+ * DiscoveryError callback function
+ * @since Series60 3.1
+ * @param aError error occured during discovery on cancel discovery operation
+ */
+ virtual void DiscoveryError(TInt aError) = 0;
+
+ /*
+ * Updates progress bar.
+ * */
+ virtual void OPPSendProgress( TInt aProgress ) = 0;
+ };
+
+#endif // MBTPCOBSERVER_H
+
+// End Of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/mconfirmationnotify.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,33 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MCONFIRMATIONNOTIFY_H
+#define MCONFIRMATIONNOTIFY_H
+
+#include <e32std.h>
+#include <btnotif.h>
+
+class MConfirmationNotify
+ {
+ public:
+ virtual void PasswordQueryCompleteL (TObexPasskeyBuf aResultPckg) = 0;
+ };
+
+#endif // MCONFIRMATIONNOTIFY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/rsutils.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,67 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef RSUTILS_H
+#define RSUTILS_H
+
+#include <e32std.h>
+#include <f32file.h>
+
+#include "mbtonnotify.h"
+
+class CObexBaseObject;
+
+/**
+* \brief Useful utilities
+*
+* The RsUtils class contains static utility functions useful to the whole application
+* such as descriptor manipulations.
+*/
+class RsUtils
+ {
+ public:
+
+ static TBool IsBluetoothOn(); // Check comments .cpp file
+ static HBufC16* MakeXHTMLSafeL(const TDesC16& aString);
+ static HBufC8* ConvertToUtf8SafeLC(const TDesC16& aUnicode);
+ static void CleanFileName(const TDesC &aOldFname, TDes& aNewFname);
+ static void FindWidthHeightForPrinting(TInt &aWidth, TInt &aHeight, const TInt aMaxWidth, const TInt aMaxHeight);
+ static HBufC8* ConvertFromUnicodeToUtf8LC(const TDesC16& aUnicode);
+ static TBool PathIsInRom(const TFileName &aFileName);
+ static TFileName PathNotRom(const TFileName &aFileName);
+ static TFileName FileName( const TFileName& aFullName );
+ static TBool FileExists(const TDesC& aFileName, RFs& aFs);
+ static TInt FileSize(const TDesC& aFileName, TInt& aSize, RFs& aFs);
+ static TLanguage GetPhoneLanguage();
+ static TInt CreateDataFolder( RFs& aSession, TDes& aPath, TDriveNumber aDrive = EDriveC );
+ static TInt ValidateCacheFile( RFs& aSession, const TDesC& aFileName,
+ TTimeIntervalMinutes aValidPeriod, TBool& aDeleted );
+ static HBufC* ConcatenateStringsLC(const TDesC& aDes1, const TDesC& aDes2);
+ static HBufC* ConcatenateStringsLC(const TDesC& aDes1, const TDesC& aDes2, const TDesC& aDes3);
+ static void LogL( const CBufBase& aBuffer );
+ static void LogL( CObexBaseObject& aBuffer );
+ static void LogL( const TDesC8& aBuffer );
+ static void LogL( const TDesC16& aBuffer );
+ static void LogFileL( const TFileName& aName );
+ static void GetLocalBTNameL(TDes8& aName);
+
+ };
+
+#endif // RSUTILS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/tbtmapper.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,318 @@
+/*
+* 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 TBtMapper class definition.
+*
+*/
+
+
+#ifndef TBTMAPPER_H
+#define TBTMAPPER_H
+
+#include <e32base.h>
+#include <libc/stdlib.h>
+
+#include "printmessagecodes.h"
+#include "printcapabilitycodes.h"
+
+enum TBtPrintState
+{
+ EBtStateUnknown = 0, //@brief job state not known
+ EBtStateIdle, //@brief printer state idle
+ EBtStateProcessing, //@brief printer processing
+ EBtStateStopped, //@brief printer or job state stopped
+ EBtStatePrinting, //@brief printing job
+ EBtStateWaiting, //@brief job is waiting
+ EBtStateCompleted, //@brief job ready
+ EBtStateAborted, //@brief job aborted for some error
+ EBtStateCancelled, //@brief job cancelled
+ EBtStateSending //@brief sending job. Internal state to indicate the data is about transmissed.
+};
+
+_LIT8(KBtStateUnknown, "unknown");
+_LIT8(KBtStateIdle, "idle");
+_LIT8(KBtStateProcessing, "processing");
+_LIT8(KBtStateStopped, "stopped");
+_LIT8(KBtStatePrinting, "printing");
+_LIT8(KBtStateWaiting, "waiting");
+_LIT8(KBtStateCompleted, "completed");
+_LIT8(KBtStateAborted, "aborted");
+_LIT8(KBtStateCancelled, "cancelled");
+
+_LIT8(KPrintReasonNone, "none");
+_LIT8(KPrintReasonAttentionRequired, "attention-required");
+_LIT8(KPrintReasonMediaJam, "media-jam");
+_LIT8(KPrintReasonPaused, "paused");
+_LIT8(KPrintReasonDoorOpen, "door-open");
+_LIT8(KPrintReasonMediaLow, "media-low");
+_LIT8(KPrintReasonMediaEmpty, "media-empty");
+_LIT8(KPrintReasonOutputAreaAlmostFull, "output-area-almost-full");
+_LIT8(KPrintReasonOutputAreaFull, "output-area-full");
+_LIT8(KPrintReasonMarkerSupplyLow, "marker-supply-low");
+_LIT8(KPrintReasonMarkerSupplyEmpty, "marker-supply-empty");
+_LIT8(KPrintReasonMarkerFailure, "marker-failure");
+_LIT8(KPrintReasonMediaChangeRequest, "media-change-request");
+_LIT8(KPrintReasonVendorDefined, "vendor-defined");
+_LIT8(KPrintReasonHwError, "hardware-error");
+_LIT8(KPrintReasonUriNotFound, "external-access-uri-not-found");
+_LIT8(KPrintReasonObjectFailure, "external-access-object-failure");
+_LIT8(KPrintReasonFormatError, "external-access-doc-format-error");
+_LIT8(KPrintReasonHttpError, "external-access-http-error");
+_LIT8(KPrintReasonCopies, "copies");
+_LIT8(KPrintReasonSides, "sides");
+_LIT8(KPrintReasonNumberUp, "number-up");
+_LIT8(KPrintReasonOrientationRequested, "orientation-requested");
+_LIT8(KPrintReasonMediaSize, "media-size");
+_LIT8(KPrintReasonMediaType, "media-type");
+_LIT8(KPrintReasonPrintQuality, "print-quality");
+_LIT8(KPrintReasonTextLayout, "text-layout");
+_LIT8(KPrintReasonImageLayout, "image-layout");
+_LIT8(KPrintReasonImageOrientation, "image-orientation");
+_LIT8(KPrintReasonPdlFidelity, "pdl-fidelity");
+_LIT8(KPrintReasonFontFamily, "font-family");
+_LIT8(KPrintReasonFontSize, "font-size");
+
+
+// Paper size
+// According to the "ftp://ftp.pwg.org/pub/pwg/standards/pwg5101.1.pdf",
+// only the size of paper is defined
+_LIT8(KPaperSizeMax, "custom_max_"); //custom_max_[nn]x[nn][mm|in]
+_LIT8(KPaperSizeMin, "custom_min_"); //custom_min_[nn]x[nn][mm|in]
+_LIT8(KPaperSizeA6, "_105x148mm"); //iso_a6_105x148mm
+_LIT8(KPaperSizeA4, "_210x297mm"); //iso_a4_210x297mm
+_LIT8(KPaperSize5x7, "_5x7in"); //na_5x7_5x7in
+_LIT8(KPaperSize4x6, "_4x6in"); //na_index-4x6_4x6in
+_LIT8(KPaperSizeLetter, "_8.5x11in"); //na_letter_8.5x11in
+
+// Quality
+_LIT8(KQualityDraft, "draft");
+_LIT8(KQualityNormal, "normal");
+_LIT8(KQualityHigh, "high");
+
+_LIT8(KHexPrefix, "0x");
+
+/**
+ * @brief A printer abstraction.
+ *
+ * Class representing the basic properties of a printing device.
+ * Published as part of the ImagePrint Server API.
+ */
+class TBtMapper
+ {
+ public:
+
+ inline static TInt32 HexToInt(const TDesC8& aString)
+ {
+ TInt len(0);
+ if( KErrNotFound < aString.Find(KHexPrefix()))
+ len = KHexPrefix().Length();
+
+ TPtrC8 str = aString.Right(aString.Length()-len);
+
+ TLex8 lex(str);
+ TUint32 val = KErrNotFound;
+ lex.Val(val, EHex);
+ LOG82("[TBtMapper::OperationStatus]\t %S: %d", &aString, val);
+ return val;
+ }
+
+ inline static TInt32 HexToInt(const TDesC& aString)
+ {
+ TBuf8<0x100> str;
+ str.Copy(aString);
+ return HexToInt(str);
+ }
+
+ inline static TInt32 Int(const TDesC8& aString)
+ {
+ TLex8 lex(aString);
+ TInt32 value = KErrNotFound;
+ lex.Val(value);
+ return value;
+ }
+
+ inline static TInt32 Int(const TDesC& aString)
+ {
+ TLex lex(aString);
+ TInt32 value = KErrNotFound;
+ lex.Val(value);
+ return value;
+ }
+
+ inline static TUint32 Uint(const TDesC8& aString)
+ {
+ TUint32 value = Int(aString);
+ return value;
+ }
+
+ inline static TUint32 Uint(const TDesC& aString)
+ {
+ TUint32 value = Int(aString);
+ return value;
+ }
+
+ inline static TInt State(const TDesC8& aStrState)
+ {
+ if(0 == aStrState.Compare(KBtStateUnknown)) //job
+ return EBtStateUnknown;
+ if(0 == aStrState.Compare(KBtStateIdle)) // printer
+ return EBtStateIdle;
+ if(0 == aStrState.Compare(KBtStateProcessing)) // printer
+ return EBtStateProcessing;
+ if(0 == aStrState.Compare(KBtStateStopped)) //job, printer
+ return EBtStateStopped;
+ if(0 == aStrState.Compare(KBtStatePrinting)) //job
+ return EBtStatePrinting;
+ if(0 == aStrState.Compare(KBtStateWaiting)) //job
+ return EBtStateWaiting;
+ if(0 == aStrState.Compare(KBtStateCompleted)) //job
+ return EBtStateCompleted;
+ if(0 == aStrState.Compare(KBtStateAborted)) //job
+ return EBtStateAborted;
+ if(0 == aStrState.Compare(KBtStateCancelled)) //job
+ return EBtStateCancelled;
+
+ return EBtStateUnknown;
+ }
+
+ inline static TInt PrintError(const TDesC8& aCode)
+ {
+ if(0 == aCode.Compare(KPrintReasonNone))
+ return ENoMessage;
+ if(0 == aCode.Compare(KPrintReasonAttentionRequired))
+ return EPrintReasonAttentionRequired;
+ if(0 == aCode.Compare(KPrintReasonMediaJam))
+ return EPbStatusErrorReasonPaperJam;
+ if(0 == aCode.Compare(KPrintReasonPaused))
+ return EPrintReasonPaused;
+ if(0 == aCode.Compare(KPrintReasonDoorOpen))
+ return EPbStatusErrorReasonHardwareCoverOpen;
+ if(0 == aCode.Compare(KPrintReasonMediaLow))
+ return EPbStatusErrorReasonPaperNearlyEmpty;
+ if(0 == aCode.Compare(KPrintReasonMediaEmpty))
+ return EPbStatusErrorReasonPaperEmpty;
+ if(0 == aCode.Compare(KPrintReasonOutputAreaAlmostFull))
+ return EPrintReasonOutputAreaAlmostFull;
+ if(0 == aCode.Compare(KPrintReasonOutputAreaFull))
+ return EPrintReasonOutputAreaFull;
+ if(0 == aCode.Compare(KPrintReasonMarkerSupplyLow))
+ return EPrintReasonMarkerSupplyLow;
+ if(0 == aCode.Compare(KPrintReasonMarkerSupplyEmpty))
+ return EPrintReasonMarkerSupplyEmpty;
+ if(0 == aCode.Compare(KPrintReasonMarkerFailure))
+ return EPrintReasonMarkerFailure;
+ if(0 == aCode.Compare(KPrintReasonMediaChangeRequest))
+ return EPbStatusErrorReasonPaperMedia;
+ if(0 == aCode.Compare(KPrintReasonVendorDefined))
+ return EPbCheckPrinter;
+
+ return EPbCheckPrinter;
+ };
+
+ inline static TInt HttpError(TInt /*aCode*/)
+ {
+ return EPbCheckPrinter;
+ };
+
+ inline static TInt OperationStatus(const TDesC8& aCode)
+ {
+ return HexToInt(aCode);
+ }
+
+ inline static void Layout(const TDesC8& aCode, RArray<TInt>& aArray)
+ {
+ TInt layout;
+ switch(Int(aCode))
+ {
+ case 16:
+ layout = EPrintCapabLayout16Up;
+ aArray.Append(layout);
+ case 12:
+ layout = EPrintCapabLayout12Up;
+ aArray.Append(layout);
+ case 9:
+ layout = EPrintCapabLayout9Up;
+ aArray.Append(layout);
+ case 6:
+ layout = EPrintCapabLayout6Up;
+ aArray.Append(layout);
+ case 4:
+ layout = EPrintCapabLayout4Up;
+ aArray.Append(layout);
+ case 2:
+ layout = EPrintCapabLayout2Up;
+ aArray.Append(layout);
+ case 1:
+ layout = EPrintCapabLayout1UpBorder;
+ aArray.Append(layout);
+ default:
+ layout = EPrintCapabLayout1UpBorderless;
+ aArray.Append(layout);
+ break;
+
+ }
+ };
+
+ inline static TInt Size(const TDesC8& aCode)
+ {
+ if(0 <= aCode.Find(KPaperSize4x6))
+ return EPrintCapabPaperSize4x6;//default
+ if(0 <= aCode.Find(KPaperSizeA4))
+ return EPrintCapabPaperSizeA4;
+ if(0 <= aCode.Find(KPaperSizeA6))
+ return EPrintCapabPaperSizeA6;
+ if(0 <= aCode.Find(KPaperSize5x7))
+ return EPrintCapabPaperSize5x7;
+ if(0 <= aCode.Find(KPaperSizeLetter))
+ return EPrintCapabPaperSizeLetter;
+ return KErrNotSupported;
+ };
+
+ inline static TInt Quality(const TDesC8& aCode)
+ {
+ if(0 <= aCode.Find(KQualityDraft))
+ return EPrintCapabQualityDraft;
+ if(0 <= aCode.Find(KQualityNormal))
+ return EPrintCapabQualityNormal;
+ if(0 <= aCode.Find(KQualityHigh))
+ return EPrintCapabQualityFine;
+ return EPrintCapabQualityDefault;
+ };
+
+ inline static TInt TripletValue(const TDesC8& aParams, TInt& aPos, TUint& aTag)
+ {
+ // get tag
+ aTag = aParams[aPos];
+ ++aPos;
+
+ //get len
+ TInt len = aParams[aPos];
+ ++aPos;
+
+ TInt value = 0;
+ TInt shift = (len-1)*8;
+ while(0 <= shift)
+ {
+ value |= (aParams[aPos] << shift);
+ ++aPos;
+ shift -= 8;
+ }
+
+ return value;
+ };
+
+ };
+
+#endif // TBTMAPPER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtchannelbase.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,543 @@
+/*
+* 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: Defines the CBtChannelBase class.
+*
+*/
+
+
+#include <obex.h>
+
+#include "crsbtdevice.h"
+#include "cbtchannelbase.h"
+#include "cbtsoapcodec.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "cbtdiscover.h"
+#include "printmessagecodes.h"
+#include "rsutils.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::CBtChannelBase
+//
+//--------------------------------------------------------------------------------------------
+CBtChannelBase::CBtChannelBase(MBtPCObserver& aObs):
+ CActive(CActive::EPriorityStandard),
+ iObs( aObs ),
+ iState( EStateNone ),
+ iJobId( KErrNotFound ),
+ iChannel( NULL ),
+ iSoapCodec( NULL ),
+ iObexBufObject( NULL ),
+ iObexNullObject( NULL ),
+ iObexBody( NULL ),
+ iDevice( NULL ),
+ iWait( NULL ),
+ iResponseError(KErrNone),
+ iStop(EFalse)
+{
+ LOG("[CBtChannelBase::CBtChannelBase]\t");
+ CActiveScheduler::Add(this);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::~CBtChannelBase
+//
+//--------------------------------------------------------------------------------------------
+CBtChannelBase::~CBtChannelBase()
+{
+ LOG("[CBtChannelBase::~CBtChannelBase]\t");
+
+ if(iWait)
+ {
+ StopWaiting();
+ delete iWait;
+ }
+
+ ClearConnection();
+
+ if(iSoapCodec)
+ delete iSoapCodec;
+
+ if(iObexNullObject)
+ delete iObexNullObject;
+
+ if(iObexBufObject)
+ delete iObexBufObject;
+
+ if(iObexBody)
+ delete iObexBody;
+
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+ if (iPasswordQuery)
+ {
+ delete iPasswordQuery;
+ iPasswordQuery = NULL;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::ConstructL()
+{
+ LOG("[CBtChannelBase::ConstructL]\t begin");
+
+ iWait = new (ELeave) CActiveSchedulerWait;
+
+ LOG("[CBtChannelBase::ConstructL]\t iSoapCodec");
+ iSoapCodec = CBtSoapCodec::NewL();
+
+ // Create obex objects here: do not NEVER delete them but in destructor
+ iObexBody = CBufFlat::NewL(8);
+ iObexBufObject = CObexBufObject::NewL(iObexBody);
+ iObexNullObject = CObexNullObject::NewL();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::SetDevice
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::SetJobId( TInt aId )
+{
+ iJobId = aId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::Device
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtChannelBase::JobId() const
+{
+ return iJobId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::SetDevice
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::SetDevice( CRsBtDevice& aDevice )
+{
+ iDevice = &aDevice;
+ LOG1("[CBtChannelBase::SetDevice]\t iDevice %d", iDevice);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::Device
+//
+//--------------------------------------------------------------------------------------------
+const CRsBtDevice& CBtChannelBase::Device() const
+{
+ return *iDevice;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::StartL
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::StartL( CRsBtDevice& aDevice )
+{
+ LOG1("[CBtChannelBase::StartL]\t state %d", iState);
+
+ User::LeaveIfNull(&aDevice);
+
+ Stop();
+
+ iStop = EFalse;
+
+ TBool btOn = RsUtils::IsBluetoothOn();
+ LOG1("[CBtChannelBase::StartL]\t btOn: %d", btOn);
+ if( !btOn )
+ User::Leave( EObexConnectError );
+
+ SetDevice( aDevice );
+ iState = EStateNone;
+ ConnectL();
+ WaitL();
+
+ LOG("[CBtChannelBase::StartL]\t out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::Stop
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::Stop()
+{
+ LOG("[CBtChannelBase::Stop]\t");
+
+ iStop = ETrue;
+
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ else
+ StopWaiting();
+
+ ClearConnection();
+ LOG("[CBtChannelBase::Stop]\t out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::DoCancel
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::DoCancel()
+{
+ LOG("[CBtChannelBase::DoCancel]\t");
+
+ StopWaiting();
+
+ LOG1("[CBtChannelBase::DoCancel]\t iChannel %d", iChannel);
+ if(iChannel)
+ {
+ LOG1("[CBtChannelBase::DoCancel]\t iStatus.Int(): 0x%X", iStatus.Int());
+ if(KRequestPending == iStatus.Int())
+ {
+ DeleteChannel();
+ }
+ }
+
+ LOG1("[CBtChannelBase::DoCancel]\t out iStatus 0x%X", iStatus.Int());
+}
+
+//------------------------------
+// InCalls
+//------------------------------
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::IsConnected
+//
+//--------------------------------------------------------------------------------------------
+TBool CBtChannelBase::IsConnected()
+{
+ TBool connected = EFalse;
+
+ if(iChannel && iChannel->IsConnected())
+ {
+ connected = ETrue;
+ }
+
+ LOG2("[CBtChannelBase::IsConnected]\t iChannel: %d, connected: %d", iChannel, connected);
+
+ return connected;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::Disconnect
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::Disconnect()
+{
+ TBool conn = IsConnected();
+ LOG1("[CBtChannelBase::Disconnect]\t IsConnected(): %d", conn);
+
+ if( conn )
+ {
+ if(IsActive())
+ {
+ LOG("[CBtChannelBase::Disconnect]\t iChannel abort");
+ iChannel->Abort();
+ }
+ else
+ {
+ LOG("[CBtChannelBase::Disconnect]\t iChannel disconnect");
+ iState = EStateDisconnecting;
+ iChannel->Disconnect(iStatus);
+ Activate();
+ }
+ iStop = ETrue;
+ }
+ else
+ {
+ DeleteChannel();
+ iState = EStateNone;
+ }
+
+ LOG1("[CBtChannelBase::Disconnect]\t out. iState: %d", iState);
+ return;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::FinishPrinting
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::FinishPrinting()
+{
+ LOG("[CBtChannelBase::FinishPrintingL]\t begin");
+
+ // Already finishing
+ if(EStateFinish == iState)
+ {
+ LOG("[CBtChannelBase::FinishPrintingL]\t already finishing");
+ return;
+ }
+
+ iState = EStateDisconnecting;
+
+ LOG1("[CBtChannelBase::FinishPrintingL]\t IsActive() %d", IsActive());
+ if(IsActive())
+ {
+ //return: the iState causes disconnection printing when RunL called.
+ return;
+ }
+
+ IsConnected();
+ Disconnect();
+
+ LOG("[CBtChannelBase::FinishPrintingL]\t end");
+ return;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::SendSoapRequestL
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::SendSoapRequestL(const TInt aRequest, const TInt aJobId)
+{
+ SendSoapRequestL(aRequest, iStatus, aJobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::SendSoapRequestL
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::SendSoapRequestL(const TInt aRequest,
+ TRequestStatus& aStatus,
+ const TInt aJobId)
+{
+ LOG1("[CBtChannelBase::SendSoapRequestL]\t begin for %d", aRequest);
+ User::LeaveIfNull(iChannel);
+ User::LeaveIfNull(iObexBufObject); // panics if iObexBody == NULL
+
+ /* Create soap from file */
+ if(!iSoapCodec)
+ {
+ iSoapCodec = CBtSoapCodec::NewL();
+ }
+ TPtrC8 soap = iSoapCodec->CreateSoapL(aRequest, aJobId);
+
+ LOG2("[CBtChannelBase::SendSoapRequestL]\t Soap created for %d. len: %d",aRequest, soap.Length());
+
+ iObexBufObject->Reset();
+
+ iObexBody->InsertL(0, soap);
+ LOG1("[CBtChannelBase::SendSoapRequestL]\t data size %d", iObexBody->Size());
+
+ iObexBufObject->SetTypeL(KBtMimeTypeSoap());
+
+ LOG("[CBtChannelBase::SendSoapRequestL]\t Issuing get.");
+ iChannel->Get(*iObexBufObject, aStatus);
+
+ Activate();
+ LOG("[CBtChannelBase::SendSoapRequestL]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::GetSoapResponseL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtChannelBase::GetSoapResponseL()
+{
+ LOG("[CBtChannelBase::GetSoapResponseL]\t");
+
+ if( 0 >= iObexBody->Size() )
+ User::Leave(KErrInvalidData);
+
+ LOG("[CBtChannelBase::GetSoapResponseL]\t Data in obex body.");
+ LOG1("[CBtChannelBase::GetSoapResponseL]\t iDevice: %d", iDevice);
+ TInt action = EBtUnknownAction;
+
+ //give obexbody to parser
+ if(!iSoapCodec)
+ {
+ iSoapCodec = CBtSoapCodec::NewL();
+ }
+
+ //read
+ iSoapCodec->ReadSoapL(action, *iObexBody);
+ LOG1("[CBtChannelBase::GetSoapResponseL]\t soap read. Action %d", action);
+
+ // Reset object: data is stored in iSoapCodec.
+ // NOTE: reset resets also iObexBody
+ iObexBufObject->Reset();
+
+ LOG("[CBtChannelBase::GetSoapResponseL]\t done");
+ return action;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::Activate
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::Activate()
+{
+ // If already active do not activate again
+ LOG2("[CBtChannelBase::Activate]\t for %d, IsActive %d",iState, IsActive());
+ if( IsActive() )
+ return;
+
+ SetActive();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::CompleteRequest
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::CompleteRequest(TControlState aStateCompleted, TInt aError)
+{
+ LOG2("[CBtChannelBase::CompleteRequest]\t aStateCompleted %d, aError %d",aStateCompleted, aError);
+ iState = aStateCompleted;
+
+ LOG2("[CBtChannelBase::CompleteRequest]\t IsActive() %d, iStatus %d", IsActive(), iStatus.Int());
+ if(IsActive() && KRequestPending == iStatus.Int())
+ {
+ TRequestStatus* statusPtr = &iStatus;
+ User::RequestComplete(statusPtr, aError);
+ }
+ if(EStateNone != aStateCompleted)
+ {
+ Activate();
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::StartWaiting
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::WaitL()
+{
+ if( !(iWait->IsStarted()) && KRequestPending == iStatus.Int())
+ {
+ LOG("[CBtChannelBase::WaitL]\t");
+ iWait->Start();
+
+ LOG2("[CBtChannelBase::WaitL]\t Continue, iStatus: %d at iState: %d", iStatus.Int(), iState);
+ LOG1("[CBtChannelBase::WaitL]\t iStop: %d",iStop);
+ if(KErrNone != iStatus.Int() && KRequestPending != iStatus.Int() && !iStop)
+ User::Leave(iStatus.Int());
+ LOG("[CBtChannelBase::WaitL]\t out");
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::StopWaiting
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::StopWaiting()
+{
+ if( (iWait->IsStarted()) )
+ {
+ LOG("[CBtChannelBase::StopWaiting]\t");
+ iWait->AsyncStop();
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::ClearConnection
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::ClearConnection()
+{
+ LOG1("[CBtChannelBase::ClearConnection]\t iState %d", iState);
+
+ Cancel();
+
+ iObexBufObject->Reset();
+ iObexNullObject->Reset();
+ iDevice = NULL;
+
+ if(iChannel)
+ {
+ LOG("[CBtChannelBase::ClearConnection]\t iChannel clear");
+ //Sends the abort operation to receiver and completes request with KErrAbort
+ Disconnect();
+ }
+ LOG("[CBtChannelBase::ClearConnection]\t out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::DeleteChannel
+//
+//--------------------------------------------------------------------------------------------
+void CBtChannelBase::DeleteChannel()
+{
+ LOG1("[CBtChannelBase::DeleteChannel]\t iChannel %d delete", iChannel);
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+ iStop = EFalse;
+
+ LOG1("[CBtChannelBase::DeleteChannel]\t iChannel %d out", iChannel);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtChannelBase::GetUserPasswordL
+//
+//--------------------------------------------------------------------------------------------
+
+void CBtChannelBase::GetUserPasswordL( const TDesC &aRealm )
+{
+ LOG("[CBtChannelBase::GetUserPasswordL begin]\t");
+
+ iPasswordQuery = CBtPasswordQuery::NewL( *this );
+
+ iPasswordQuery->StartActiveObjectL();
+
+ LOG("[CBtChannelBase::GetUserPasswordL end]\t");
+}
+
+void CBtChannelBase::PasswordQueryCompleteL ( TObexPasskeyBuf aResultPckg )
+ {
+ iPckg = aResultPckg();
+
+ TBuf<256> data;
+ data.Copy(iPckg);
+
+ // Send user password
+ iChannel->UserPasswordL(data);
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdevicecontainer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,404 @@
+/*
+* 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:
+*
+*/
+
+
+// EXTERNAL INCLUDES
+#include <s32file.h>
+
+#include "cbtdevicecontainer.h"
+#include "crsbtdevice.h"
+#include "rsutils.h"
+#include "mprotprintingdevice.h"
+#include "clog.h"
+
+// CONSTANTS
+namespace
+ {
+ /// File name where the BT devices will be stored, for future sessions.
+ _LIT(KUsedDevicesFile,"btdevices.dat");
+ /// Maximum number of Bluetooth devices to be stored.
+ const TInt KUsedDevicesMax = 150;
+ /// Version of the file where the BT devices will be stored.
+ const TInt KUsedDevicesVersion = 5;
+ }
+
+
+
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+CBtDeviceContainer* CBtDeviceContainer::NewL()
+ {
+ CBtDeviceContainer* self = new (ELeave) CBtDeviceContainer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CBtDeviceContainer::ConstructL()
+ {
+ User::LeaveIfError( iFs.Connect());
+ TInt err = RsUtils::CreateDataFolder( iFs, iDataFolder );
+ LOG1("[CBtDeviceContainer::ConstructL]\t err: %d", err );
+ iDataFolder = RsUtils::PathNotRom( iDataFolder );
+ iFs.SetSessionPath( iDataFolder );
+ LOG1("CBtDeviceContainer::ConstructL iDataFolder: %S", &iDataFolder );
+ }
+
+CBtDeviceContainer::CBtDeviceContainer() : iVersion(KUsedDevicesVersion)
+ {
+ }
+
+CBtDeviceContainer::~CBtDeviceContainer()
+ {
+ LOG("CBtDeviceContainer::~CBtDeviceContainer begin");
+ iDeviceArray.ResetAndDestroy();
+ iDeviceArray.Close();
+ iFs.Close();
+ LOG("CBtDeviceContainer::~CBtDeviceContainer end");
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::StoreL
+//
+//--------------------------------------------------------------------------------------------
+void CBtDeviceContainer::StoreL()
+{
+ LOG("[CBtDeviceContainer::StoreL]\t begin");
+
+ TFileName fileName( iDataFolder );
+ fileName.Append( KUsedDevicesFile );
+ LOG1("CBtDeviceContainer::StoreL fileName 1: %S", &fileName);
+
+ RFileWriteStream outstream;
+ TFileName tempFileName;
+
+ User::LeaveIfError( outstream.Temp( iFs, iDataFolder, tempFileName, EFileWrite ) );
+ LOG1("[CBtDeviceContainer::StoreL]\t tempFileName: %S", &tempFileName);
+
+ CleanupClosePushL( outstream );
+ ExternalizeL( outstream );
+ // makes sure all data is written from the buffer to file, before calling close.
+ outstream.CommitL();
+ CleanupStack::PopAndDestroy(); // outstream
+
+ if( RsUtils::FileExists( fileName, iFs ) )
+ User::LeaveIfError( iFs.Delete( fileName ) );
+ User::LeaveIfError( iFs.Rename( tempFileName, fileName ) );
+
+ LOG("[CBtDeviceContainer::StoreL]\t end");
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::RestoreL
+//
+//--------------------------------------------------------------------------------------------
+void CBtDeviceContainer::RestoreL()
+{
+ TFileName fileName( iDataFolder );
+ fileName.Append( KUsedDevicesFile );
+
+ RFileReadStream instream;
+ CleanupClosePushL( instream );
+
+ User::LeaveIfError( instream.Open( iFs, fileName, EFileRead ) );
+ InternalizeL(instream);
+
+ CleanupStack::PopAndDestroy(); // instream
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::ExternalizeL
+//
+//--------------------------------------------------------------------------------------------
+void CBtDeviceContainer::ExternalizeL(RWriteStream& aStream) const
+ {
+ TInt count = 0;
+ for( TInt i = 0; i < iDeviceArray.Count(); i++ )
+ {
+ if(iDeviceArray[i]->IsUsed())
+ {
+ ++count;
+ }
+ }
+ LOG1("[CBtDeviceContainer::ExternalizeL]\t count: %d", count);
+ if(0 == count)
+ {
+ return;
+ }
+
+ aStream.WriteInt32L(iVersion);
+ aStream.WriteInt32L(iCurrentId);
+ aStream.WriteInt32L(count);
+ for( TInt i = 0; i < iDeviceArray.Count(); i++ )
+ {
+ if(iDeviceArray[i]->IsUsed())
+ {
+ aStream << *(iDeviceArray[i]);
+ }
+ }
+ LOG("CBtDeviceContainer::ExternalizeL end");
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::InternalizeL
+//
+//--------------------------------------------------------------------------------------------
+void CBtDeviceContainer::InternalizeL(RReadStream& aStream)
+{
+ TInt version = aStream.ReadInt32L();
+ if (version != KUsedDevicesVersion)
+ {
+ return;
+ }
+ iVersion = version;
+
+ iCurrentId = aStream.ReadInt32L();
+ TInt count = aStream.ReadInt32L();
+ for (TInt i = 0; i < count; i++)
+ {
+ CRsBtDevice* tmpDevice = CRsBtDevice::NewLC();
+
+ tmpDevice->InternalizeL(aStream);
+
+ tmpDevice->SetUsed(ETrue);
+ tmpDevice->SetJustFound(EFalse);
+ User::LeaveIfError( iDeviceArray.Append( tmpDevice ) );
+ CleanupStack::Pop(); // tmpDevice
+ }
+}
+
+CRsBtDevice* CBtDeviceContainer::At(TInt aPosition) const
+ {
+ if( aPosition >= 0 && aPosition < iDeviceArray.Count() )
+ {
+ return iDeviceArray[aPosition];
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+
+TInt CBtDeviceContainer::Count() const
+ {
+ return iDeviceArray.Count();
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::Find
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtDeviceContainer::Find( const CRsBtDevice &aDevice, TInt aInitIndex) const
+{
+ TInt nCnt;
+ CRsBtDevice *cmpDev;
+
+ for (nCnt = aInitIndex+1; nCnt < iDeviceArray.Count(); nCnt++)
+ {
+ cmpDev = iDeviceArray[nCnt];
+ if (cmpDev->Equals(aDevice))
+ {
+ return nCnt;
+ }
+ }
+
+ return KErrNotFound;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::Find
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtDeviceContainer::Find( const TInt aDeviceId, TInt aInitIndex) const
+{
+ for (TInt i = aInitIndex+1; i < iDeviceArray.Count(); i++)
+ {
+ if (iDeviceArray[i]->DeviceId() == aDeviceId)
+ {
+ return i;
+ }
+ }
+ return KErrNotFound;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::Delete
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtDeviceContainer::Delete( const TInt aDeviceId )
+{
+ TInt pos = Find(aDeviceId);
+ if(KErrNotFound != pos)
+ {
+ iDeviceArray[pos]->SetUsed(EFalse);
+ }
+ return pos;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::Delete
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtDeviceContainer::Delete( const CRsBtDevice &aDevice )
+{
+ TInt pos = Find(aDevice);
+ if(KErrNotFound != pos)
+ {
+ iDeviceArray[pos]->SetUsed(EFalse);
+ }
+ return pos;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtDeviceContainer::AppendL
+//
+//--------------------------------------------------------------------------------------------
+void CBtDeviceContainer::AppendL( CRsBtDevice* aDevice )
+{
+ LOG1("[CBtDeviceContainer::AppendL]\t %S", &(aDevice->FriendlyName()));
+
+ if( iDeviceArray.Count() == KUsedDevicesMax )
+ {
+ TInt nOldest = FindOldest(ENotUsed | ETimeLastUsed);
+ CRsBtDevice* device = iDeviceArray[nOldest];
+ iDeviceArray.Remove(nOldest);
+ delete device;
+ }
+
+ if( aDevice->DeviceId() <= 0 )
+ {
+ aDevice->SetDeviceId( GetAvailableId( *aDevice ) );
+ }
+ iDeviceArray.AppendL( aDevice );
+}
+
+TInt CBtDeviceContainer::FindOldest(TUint aFlags) const
+ {
+ TInt oldest=-1;
+ TTime timeOldest, timeCmp;
+ CRsBtDevice *cmpDev;
+ TBool bSavedCheck;
+
+ timeOldest.UniversalTime();
+ for (TInt i=0; i < iDeviceArray.Count(); ++i)
+ {
+ cmpDev = iDeviceArray[i];
+ if ((aFlags & EUsed) && (aFlags & ENotUsed))
+ {
+ bSavedCheck = ETrue;
+ }
+ else if (aFlags & ESaved)
+ {
+ bSavedCheck = cmpDev->IsUsed();
+ }
+ else if (aFlags & ENotUsed)
+ {
+ bSavedCheck = !(cmpDev->IsUsed());
+ }
+ else
+ {
+ bSavedCheck = ETrue;
+ }
+
+ if (bSavedCheck)
+ {
+ if (aFlags & ETimeLastUsed)
+ {
+ timeCmp = cmpDev->TimeLastUsed();
+ }
+ else if (aFlags & ETimeDiscovered)
+ {
+ timeCmp = cmpDev->TimeDiscovered();
+ }
+ else
+ {
+ // Error, but shouldn't get here if program does the right thing
+ return -1;
+ }
+
+ if (timeCmp < timeOldest)
+ {
+ oldest = i;
+ timeOldest = timeCmp;
+ }
+ }
+ }
+
+ return oldest;
+ }
+
+TInt CBtDeviceContainer::GetAvailableId( const CRsBtDevice& aDevice )
+{
+ LOG("CBtDeviceContainer::GetAvailableId begin");
+ const TBTDevAddr& btAddr = aDevice.BDAddr();
+ TInt id( 0 );
+ TInt intSize = sizeof(TInt);
+ LOG1("CBtDeviceContainer::GetAvailableId intSize: %d", intSize);
+ for( TInt i = ( KBTDevAddrSize - 1 ), s = 0; i >= 0 && s < intSize; i--, s++ )
+ {
+ const TUint8& element = btAddr[i];
+ TInt temp( element );
+ temp <<= ( s * 8 );
+ id |= temp;
+ }
+
+ id &= DEVICE_ID_FIELD_MASK;
+ LOG1("[CBtDeviceContainer::GetAvailableId]\t id after masking: %d", id);
+
+ while( !IsIdAvailable( id ) )
+ {
+ id++;
+ }
+
+ iCurrentId = id;
+ LOG1("[CBtDeviceContainer::GetAvailableId]\t return: %d", iCurrentId);
+ return iCurrentId;
+}
+
+
+TBool CBtDeviceContainer::IsIdAvailable( TInt aId ) const
+{
+ TBool result( ETrue );
+ for( TInt x = 0; x < iDeviceArray.Count() && result; ++x )
+ {
+ if ( aId == iDeviceArray[x]->DeviceId() )
+ {
+ result = EFalse;
+ }
+ }
+ return result;
+}
+
+void CBtDeviceContainer::Reset()
+ {
+ iDeviceArray.ResetAndDestroy();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdiscover.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,895 @@
+/*
+* 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 CBtDiscover class definition. Bluetooth device discovery and SDP.
+*
+*/
+
+
+#include "cbtdiscover.h"
+#include "clog.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+/**
+ * @brief Instantiate new CBtDiscover object.
+ */
+CBtDiscover* CBtDiscover::NewL()
+ {
+ CBtDiscover* self = new (ELeave) CBtDiscover();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+
+/**
+ * @brief Two phase construction.
+ */
+void CBtDiscover::ConstructL()
+ {
+ iSdpSearchPattern = CSdpSearchPattern::NewL();
+ iMatchList = CSdpAttrIdMatchList::NewL();
+ }
+
+/**
+ * @brief Constructor.
+ */
+CBtDiscover::CBtDiscover() :
+ iCurrentSDPAttrID(0),
+ iCurrentServiceUUID(0),
+ iFoundSTS(EFalse),
+ iWantedService(ETrue),
+ iDoingSDP(EFalse),
+ iFindingDevices(EFalse),
+ iAgent(NULL),
+ iRequestStatus(NULL),
+ iSdpSearchPattern(NULL),
+ iMatchList(NULL),
+ iContentTypes(NULL),
+ iPrinterModel(NULL),
+ iBPPPort(0),
+ iSTSPort(0),
+ iOPPPort(0)
+ {
+ }
+
+/**
+ * @brief Destructor.
+ */
+CBtDiscover::~CBtDiscover()
+ {
+ LOG("CBtDiscover::~CBtDiscover begin");
+ Stop();
+ if(iSdpSearchPattern)
+ delete iSdpSearchPattern;
+ if(iMatchList)
+ delete iMatchList;
+ if(iContentTypes)
+ delete iContentTypes;
+ if(iPrinterModel)
+ delete iPrinterModel;
+ if(iAgent)
+ delete iAgent;
+ LOG("CBtDiscover::~CBtDiscover end");
+ }
+
+/**
+ * @brief Destructor.
+ */
+void CBtDiscover::Reset()
+ {
+ LOG("CBtDiscover::Reset begin");
+
+ StopSDP(); // resets also public member variables and iDoingSDP flag
+
+ iBPPPort = 0;
+ iSTSPort = 0;
+ iOPPPort = 0;
+
+ if(iPrinterModel)
+ delete iPrinterModel;
+ iPrinterModel = NULL;
+
+ if(iSdpSearchPattern)
+ iSdpSearchPattern->Reset();
+
+ // No can do if remove fails -> ignore leave
+ if(iMatchList)
+ TRAP_IGNORE( iMatchList->RemoveL(TAttrRange(0x0000, 0xFFFF)) );
+
+ if(iContentTypes)
+ delete iContentTypes;
+ iContentTypes = NULL;
+
+
+ if( iRequestStatus )
+ {
+ if(KRequestPending == iRequestStatus->Int())
+ User::RequestComplete(iRequestStatus, KErrNone);
+ }
+ iRequestStatus = NULL;
+
+ LOG("CBtDiscover::Reset end");
+ }
+
+/**
+ * @brief Starts the asynchronous search for Bluetooth devices.
+ *
+ * Starts the asynchronous search for Bluetooth devices. The Active Object containing
+ * this object, CRsBtDiscoverEngine, is notified after the first device is found.
+ * @param aStatus Status variable from CRsBtDiscoverEngine, receives notification when asynchronous call completes.
+ */
+void CBtDiscover::Start(TRequestStatus &aStatus)
+ {
+ LOG("[CBtDiscover::Start]\t begin");
+ aStatus = KErrNotSupported;
+
+ TInt err = iSocketServ.Connect();
+ LOG1("[CBtDiscover::Start]\t iSocketServ.Connect() err: %d", err);
+ if( KErrNone == err )
+ {
+ err = iHostResolver.Open( iSocketServ, KBTAddrFamily, KBTLinkManager );
+ LOG1("[CBtDiscover::Start]\t iHostResolver.Open() err: %d", err);
+ }
+
+ if( KErrNone == err )
+ {
+ iFindingDevices = ETrue;
+ iSockAddr.SetIAC( KGIAC );
+ iSockAddr.SetAction( KHostResInquiry | KHostResName | KHostResIgnoreCache );
+ iHostResolver.GetByAddress( iSockAddr, iNameEntry, aStatus );
+ }
+ else
+ {
+ iFindingDevices = EFalse;
+ iSocketServ.Close();
+ iHostResolver.Close();
+ }
+
+ LOG("[CBtDiscover::Start]\t end");
+ }
+
+/**
+ * @brief Continues the asynchronous search for Bluetooth devices.
+ *
+ * Continues the asynchronous search for Bluetooth devices. The Active Object containing
+ * this object, CRsBtDiscoverEngine, is notified after the next device is found.
+ * @param aStatus Status variable from CRsBtDiscoverEngine, receives notification when asynchronous call completes.
+ */
+void CBtDiscover::GetNextDevice(TRequestStatus &aStatus)
+ {
+ LOG("[CBtDiscover::GetNextDevice]\t");
+ iHostResolver.Next(iNameEntry, aStatus);
+ }
+
+/**
+ * @brief Stop the asynchronous search for Bluetooth devices.
+ */
+void CBtDiscover::Stop()
+ {
+ LOG1("[CBtDiscover::Stop]\t begin with iFindingDevices: %d", iFindingDevices);
+
+ if(iFindingDevices)
+ iHostResolver.Cancel();
+ iFindingDevices = EFalse;
+
+ Reset();
+
+ iHostResolver.Close();
+ iSocketServ.Close();
+
+ LOG("[CBtDiscover::Stop]\t end");
+ }
+
+/**
+ * @brief Is an asynchronous search for Bluetooth devices in progress?
+ * @return True, a search is in progress, or False, no search is in progress
+ */
+TBool CBtDiscover::IsFindingDevices() const
+ {
+ return iFindingDevices;
+ }
+
+/**
+ * @brief Get the last Bluetooth device found by the search.
+ * @return The last Bluetooth device found by the search.
+ */
+TNameRecord CBtDiscover::GetNameRecord() const
+ {
+ return iNameEntry();
+ }
+
+/**
+ * @brief Store Bluetooth device information, in preparation for doing an SDP query.
+ */
+void CBtDiscover::SetNameRecord(TNameRecord aNameRecord)
+ {
+ TNameEntry nameEntry(aNameRecord);
+ iNameEntry = nameEntry;
+ }
+
+/**
+ * @brief Starts the asynchronous request for the SDP record.
+ *
+ * Starts the asynchronous request for the SDP record from a Bluetooth device.
+ * Specifically the device is tested for the BPP and OPP services.
+ * @param aStatus Status variable from CRsBtDiscoverEngine, receives notification when asynchronous call completes.
+ * @param aServiceMask Bitmask to require (only) certain services. All marked by default.
+ */
+void CBtDiscover::GetSupportedServicesL(TRequestStatus &aStatus, TUint32 aServiceMask)
+ {
+ LOG("[CBtDiscover::GetSupportedServicesL]\t begin");
+
+ Reset();
+ iRequestStatus = &aStatus;
+ *iRequestStatus = KRequestPending;
+
+ iMatchList->RemoveL(TAttrRange(0x0000, 0xFFFF));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdServiceClassIDList));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdProtocolDescriptorList));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdAdditionalProtocolDescriptorLists));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdDocFormatsSupported));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdModelID));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdMaxWidth));
+ iMatchList->AddL(TAttrRange(KSdpAttrIdMaxLen));
+
+ iSdpSearchPattern->Reset();
+
+ if(KBtMaskObjectPush & aServiceMask)
+ iSdpSearchPattern->AddL(KBTSDPOBEXObjectPush); // 0x1105
+ if(KBtMaskDirectPrinting & aServiceMask)
+ iSdpSearchPattern->AddL(KBTSDPDirectPrinting); // 0x1118
+ if(KBtMaskPrintingStatus & aServiceMask)
+ iSdpSearchPattern->AddL(KBTSDPPrintingStatus); // 0x1123
+ if(KBtMaskL2CAP & aServiceMask)
+ iSdpSearchPattern->AddL(KBTSDPL2CAP);
+ if(KBtMaskRFCOMM & aServiceMask)
+ iSdpSearchPattern->AddL(KBTSDPRFCOMM);
+ if(KBtMaskObex & aServiceMask)
+ iSdpSearchPattern->AddL(KBTSDPObex);
+
+ StartSDPL();
+
+ LOG("[CBtDiscover::GetSupportedServicesL]\t end");
+ }
+
+/**
+ * @brief Initiate the SDP request started in VerifyServiceSupportL.
+ */
+void CBtDiscover::StartSDPL()
+ {
+ StopSDP();
+ TBTDevAddr btAddr = ((TInquirySockAddr)iNameEntry().iAddr).BTAddr();
+ iAgent = CSdpAgent::NewL(*this, btAddr);
+ iAgent->SetRecordFilterL(*iSdpSearchPattern);
+ iAgent->SetAttributePredictorListL(*iMatchList);
+ iAgent->NextRecordRequestL();
+ iDoingSDP = ETrue;
+ }
+
+/**
+ * @brief Stop the asynchronous request for the SDP record from a Bluetooth device.
+ */
+void CBtDiscover::StopSDP()
+ {
+ LOG1("[CBtDiscover::StopSDP] begin with iAgent address: %d", TInt(iAgent));
+ iDoingSDP = EFalse;
+
+ iCurrentSDPAttrID = 0;
+ iCurrentServiceUUID = 0;
+ iFoundSTS = EFalse;
+ iWantedService = ETrue;
+
+ if( iAgent )
+ {
+ iAgent->Cancel();
+ delete iAgent;
+ iAgent = NULL;
+ }
+ LOG("[CBtDiscover::StopSDP] end");
+ }
+
+/**
+ * @brief Is an asynchronous request for the SDP record in progress?.
+ *
+ * Is an asynchronous request for the SDP record from a Bluetooth device in progress?
+ * @return True, a request is in progress, or False, no request is in progress
+ */
+TBool CBtDiscover::IsDoingSDP() const
+ {
+ return iDoingSDP;
+ }
+
+/**
+ * The CSdpAgent object calls this to notify that the attributes from an SDP record are ready for parsing.
+ * @param aAttrValue Structured attribute(s) of SDP record, parsed with TBTAttribValVisitor
+ */
+void CBtDiscover::AttributeRequestResult(TSdpServRecordHandle /*aHandle*/, TSdpAttributeID aAttrID, CSdpAttrValue *aAttrValue)
+ {
+ TRAPD( err, AttributeRequestResultL( aAttrID, aAttrValue ) );
+ if(KErrNone != err)
+ LOG1("[CBtDiscover::AttributeRequestResult]\t AttributeRequestResultL leaves with: %d", err);
+ }
+
+void CBtDiscover::AttributeRequestResultL( TSdpAttributeID aAttrID, CSdpAttrValue* aValue )
+ {
+ LOG1("[CBtDiscover::AttributeRequestResultL]\t *** Device: %S: ", &GetDeviceName() );
+ LOG2("CBtDiscover::AttributeRequestResultL aAttrID: %d, aValue->Type(): %d", aAttrID, aValue->Type());
+
+ iCurrentSDPAttrID = aAttrID;
+ CBTAttribValVisitor* valVisitor = NULL;
+
+ switch( aAttrID )
+ {
+ case KSdpAttrIdServiceClassIDList:
+ iCurrentServiceUUID = 0; // reset
+ case KSdpAttrIdProtocolDescriptorList:
+ case KSdpAttrIdAdditionalProtocolDescriptorLists:
+ case KSdpAttrIdDocFormatsSupported:
+ case KSdpAttrIdModelID:
+ case KSdpAttrIdMaxWidth:
+ case KSdpAttrIdMaxLen:
+ valVisitor = CBTAttribValVisitor::NewLC( *this );
+ aValue->AcceptVisitorL( *valVisitor ); // goes in CBTAttribValVisitor::VisitAttributeValueL
+ CleanupStack::PopAndDestroy( valVisitor );
+ break;
+ default:
+ break;
+ }
+
+ delete aValue;
+
+ LOG("CBtDiscover::AttributeRequestResultL end");
+ }
+
+
+/**
+ * The CSdpAgent object calls this to notify that the SDP record request has been completed.
+ */
+void CBtDiscover::NextRecordRequestComplete(TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount)
+ {
+ LOG1("CBtDiscover::NextRecordRequestComplete aError: %d", aError);
+ LOG1("CBtDiscover::NextRecordRequestComplete aHandle: %d", aHandle);
+ LOG1("CBtDiscover::NextRecordRequestComplete aTotalRecordsCount: %d", aTotalRecordsCount);
+ TInt err( aError );
+
+ if( KErrNone == aError && aTotalRecordsCount > 0)
+ {
+ TRAP( err, iAgent->AttributeRequestL( aHandle, KSdpAttrIdServiceClassIDList ) );
+ LOG1("CBtDiscover::NextRecordRequestComplete err: %d", err);
+ }
+
+ if( KErrNone != err || !aTotalRecordsCount )
+ {
+ if( KErrEof == err || !aTotalRecordsCount )
+ {
+ err = KErrNone;
+ }
+ StopSDP();
+ LOG("CBtDiscover::NextRecordRequestComplete User::RequestComplete");
+ User::RequestComplete( iRequestStatus, err );
+ }
+
+ // reset
+ iCurrentServiceUUID = 0;
+ iWantedService = ETrue;
+ iCurrentSDPAttrID = 0;
+ LOG("CBtDiscover::NextRecordRequestComplete end");
+ }
+
+/**
+ * The CSdpAgent object calls this to notify that the current SDP record has no more attributes.
+ * @param aError Standard Symbian error code, KErrNone indicates success.
+ */
+void CBtDiscover::AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError)
+{
+ LOG("[CBtDiscover::AttributeRequestComplete]\t Begin.");
+ if( KErrNone != aError || !iWantedService || 0 == iCurrentSDPAttrID)
+ {
+ LOG1("[CBtDiscover::AttributeRequestComplete]\t err: %d", aError);
+ iCurrentSDPAttrID = 0;
+ LOG("[CBtDiscover::AttributeRequestComplete]\t Not wanted service. Get next record.");
+ TRAPD( err, iAgent->NextRecordRequestL() );
+ if(KErrNone != err)
+ {
+ NextRecordRequestComplete(err, aHandle, 0);
+ }
+ }
+ else
+ {
+ LOG("[CBtDiscover::AttributeRequestComplete]\t Wanted service. Get next attribute.");
+ TRAPD( err, GetNextAttributeL(aHandle) );
+ if( KErrNone != err )
+ LOG1("[CBtDiscover::AttributeRequestComplete]\t err: %d", err);
+ }
+ iCurrentSDPAttrID = 0;
+ LOG("[CBtDiscover::AttributeRequestComplete]\t End.");
+}
+
+/**
+ * @brief Get BPP port.
+ * @return Port (i.e. Bluetooth channel) of the BPP service on the printer. Returns -1 if port is unknown.
+ */
+TInt CBtDiscover::GetBPPPort() const
+ {
+ return iBPPPort;
+ }
+
+/**
+ * @brief Get Status port.
+ * @return Port (i.e. Bluetooth channel) of the status service on the printer. Returns -1 if port is unknown.
+ */
+TInt CBtDiscover::GetSTSPort() const
+ {
+ return iSTSPort;
+ }
+
+/**
+ * @brief Get OPP port.
+ * @return Port (i.e. Bluetooth channel) of the OPP service on the printer. Returns -1 if port is unknown.
+ */
+TInt CBtDiscover::GetOPPPort() const
+ {
+ return iOPPPort;
+ }
+
+/**
+ * @brief Set the BPP Port.
+ *
+ * Called from TBTAttribValVisitor to set the Port (i.e. Bluetooth channel).
+ * Also used to indicate that the BPP service was successfully detected in the SDP response.
+ */
+void CBtDiscover::SetBPPPort(TInt aPort)
+ {
+ LOG1("CBtDiscover::SetBPPPort aPort: %d", aPort);
+ iBPPPort = aPort;
+ }
+
+/**
+ * @brief Set the Status Port.
+ *
+ * Called from TBTAttribValVisitor to set the Port (i.e. Bluetooth channel).
+ * Also used to indicate that the Status service was successfully detected in the SDP response.
+ */
+void CBtDiscover::SetSTSPort(TInt aPort)
+ {
+ LOG1("CBtDiscover::SetSTSPort aPort: %d", aPort);
+ iSTSPort = aPort;
+ }
+/**
+ * @brief Set the OPP Port.
+ *
+ * Called from TBTAttribValVisitor to set the Port (i.e. Bluetooth channel).
+ * Also used to indicate that the OPP service was successfully detected in the SDP response.
+ */
+void CBtDiscover::SetOPPPort(TInt aPort)
+ {
+ LOG1("CBtDiscover::SetOPPPort aPort: %d", aPort);
+ iOPPPort = aPort;
+ }
+
+/**
+ * @brief Bluetooth device supports BPP?.
+ *
+ * Does the SDP response for the current Bluetooth device indicate that BPP is supported?
+ * Checks to make sure that a Port (i.e. Bluetooth channel) for the BPP service was determined,
+ * AND that the device supports the Mime/Multiplex document type.
+ * @return True, BPP is supported, or False, BPP is not supported
+ */
+TBool CBtDiscover::IsBPPSupported() const
+ {
+ _LIT(KMimeXhtmlType, "application/vnd.pwg-xhtml-print+xml");
+ _LIT(KMimeMultiplexType, "application/vnd.pwg-multiplexed");
+ LOG1("CBtDiscover::IsBPPSupported iBPPPort: %d", iBPPPort);
+ return ( iBPPPort && (SupportsContentType( KMimeMultiplexType ) || SupportsContentType( KMimeXhtmlType )) );
+ }
+
+/**
+ * @brief Bluetooth device supports OPP?.
+ *
+ * Does the SDP response for the current Bluetooth device indicate that OPP is supported?
+ * @return True if OPP is supported. False if OPP is not supported.
+ */
+TBool CBtDiscover::IsOPPSupported() const
+ {
+ LOG1("CBtDiscover::IsOPPSupported iOPPPort: %d", iOPPPort);
+ if(iOPPPort)
+ return ETrue;
+ else
+ return iOPPPort;
+ }
+
+/**
+ * @brief Obtain Bluetooth device class.
+ *
+ * @return Bluetooth device class. Used by CRsBtDiscoverEngine to do the first check
+ * whether the current Bluetooth device is likely to support BPP or OPP.
+ * @sa KBTMinDevClassPrinter
+ */
+TBTDeviceClass CBtDiscover::GetDeviceClass() const
+ {
+ TInquirySockAddr sockAddr = (TInquirySockAddr)iNameEntry().iAddr;
+ TBTDeviceClass devClass(sockAddr.MajorServiceClass(),
+ sockAddr.MajorClassOfDevice(),
+ sockAddr.MinorClassOfDevice());
+
+ return devClass;
+ }
+
+/**
+ * @brief Obtain Bluetooth device name.
+ *
+ * @return Friendly name of current Bluetooth device.
+ */
+const TDesC& CBtDiscover::GetDeviceName() const
+ {
+ return iNameEntry().iName;
+ }
+
+/**
+ * @brief Sets supported content types.
+ *
+ * Called from TBTAttribValVisitor to set the supported content types.
+ * @param aString String of comma separated mime-types.
+ */
+void CBtDiscover::SetContentTypesL(const TPtrC8 &aString)
+ {
+#ifdef _DEBUG
+
+ LOG1("CBtDiscover::SetContentTypesL %d", aString.Length());
+
+ TInt start = 0;
+ TInt end = aString.Locate(',');
+ TPtrC8 ptr;
+ while(end > 0 && start <= aString.Length())
+ {
+ ptr.Set(aString.Mid(start, end));
+ LOG81("[CBtDiscover::SetContentTypesL]\t ptr: \"%S\"", &ptr);
+ ++end;
+ start += end;
+ if(start > aString.Length())
+ break;
+
+ TPtrC8 left = aString.Mid(start);
+ end = left.Locate(',');
+ if(KErrNotFound == end)
+ end = aString.Length() - start;
+ }
+
+#endif
+ delete iContentTypes;
+ iContentTypes = NULL;
+ iContentTypes = HBufC::NewL(aString.Length());
+ TPtr bufPtr(iContentTypes->Des());
+ bufPtr.Copy(aString);
+ }
+
+/**
+ * @brief Ask if device supports a content type.
+ *
+ * Searches the string of supported content types found in the SDP record of the current Bluetooth device.
+ *
+ * @param aContType Mime-type to search for.
+ *
+ * @return True, if the passed in content type was found, False, if it was not found
+ */
+TBool CBtDiscover::SupportsContentType(const TDesC &aContType) const
+ {
+ LOG1("CBtDiscover::SupportsContentType aContType: %S", &aContType);
+ TPtr bufPtr(iContentTypes->Des());
+
+ if( bufPtr.Length() == 0 )
+ {
+ LOG("CBtDiscover::SupportsContentType length == 0");
+ return EFalse;
+ }
+
+ if( bufPtr.Find(aContType) == KErrNotFound )
+ {
+ LOG("CBtDiscover::SupportsContentType Find == KErrNotFound");
+ return EFalse;
+ }
+ else
+ {
+ LOG("CBtDiscover::SupportsContentType Found");
+ return ETrue;
+ }
+ }
+
+/**
+ * @brief Called from TBTAttribValVisitor to set the printer model.
+ * @param aString String of semi-colon separated printer details.
+ */
+void CBtDiscover::SetPrinterModelL(const TPtrC8 &aString)
+ {
+ LOG81("CBtDiscover::SetPrinterModelL aString: %S", &aString);
+
+ if(iPrinterModel)
+ delete iPrinterModel;
+ iPrinterModel = NULL;
+
+ _LIT8(KModelString, ";MDL:");
+ TInt pos = aString.Find( KModelString );
+ LOG1("[CBtDiscover::SetPrinterModelL]\t pos: %d", pos);
+ if( pos != KErrNotFound )
+ {
+ TPtrC8 tmpStr = aString.Right(aString.Length() - pos - 5);
+ pos = tmpStr.Locate(';');
+ if( pos != KErrNotFound )
+ {
+ iPrinterModel = HBufC::NewL(pos);
+ iPrinterModel->Des().Copy(tmpStr.Left(pos));
+ }
+ }
+
+ LOG("CBtDiscover::SetPrinterModelL end");
+ }
+
+/**
+ * @brief Obtain Printer Model.
+ *
+ * Gets a TDesC& to the printer model previously set with SetPrinterModelL(),
+ * or KNullDesC if no printer model has been set.
+ *
+ * @return String with the printer model.
+ */
+const TDesC& CBtDiscover::GetPrinterModel() const
+ {
+ if (iPrinterModel)
+ return *iPrinterModel;
+ else
+ return KNullDesC;
+ }
+
+void CBtDiscover::SetVendor( TPrinter::TPrinterVendor aVendor )
+ {
+ LOG1("CBtDiscover::SetVendor aVendor: %d", aVendor);
+ iVendor = aVendor;
+ }
+
+TPrinter::TPrinterVendor CBtDiscover::GetVendor() const
+ {
+ LOG1("CBtDiscover::GetVendor return: %d", iVendor);
+ return iVendor;
+ }
+
+void CBtDiscover::GetNextAttributeL(TSdpServRecordHandle aHandle)
+ {
+ LOG1("[CBtDiscover::GetNextAttributeL]\t iCurrentSDPAttrID: 0x%X", iCurrentSDPAttrID);
+
+ TSdpAttributeID nextId;
+
+ switch( iCurrentSDPAttrID )
+ {
+ case KSdpAttrIdServiceClassIDList:
+ nextId = KSdpAttrIdProtocolDescriptorList;
+ break;
+ case KSdpAttrIdProtocolDescriptorList:
+ nextId = KSdpAttrIdAdditionalProtocolDescriptorLists;
+ break;
+ case KSdpAttrIdAdditionalProtocolDescriptorLists:
+ nextId = KSdpAttrIdDocFormatsSupported;
+ break;
+ case KSdpAttrIdDocFormatsSupported:
+ nextId = KSdpAttrIdModelID;
+ break;
+ case KSdpAttrIdModelID:
+ nextId = KSdpAttrIdMaxWidth;
+ break;
+ case KSdpAttrIdMaxWidth:
+ nextId = KSdpAttrIdMaxLen;
+ break;
+ default:
+ // all interested attributes received, at tleast asked
+ //Request 0xFFFFFF to indicate all done
+ nextId = KSdpAttrIdAllDone;
+ break;
+ }
+
+ iAgent->AttributeRequestL( aHandle, nextId );
+
+ LOG1("[CBtDiscover::GetNextAttributeL]\t end. nextId: 0x%X", nextId);
+ }
+
+
+
+/************************************************************************/
+/* visitor */
+/************************************************************************/
+
+CBTAttribValVisitor* CBTAttribValVisitor::NewLC( CBtDiscover& aDiscover )
+ {
+ CBTAttribValVisitor* obj = new (ELeave) CBTAttribValVisitor( aDiscover );
+ CleanupStack::PushL( obj );
+ return obj;
+ }
+
+/**
+ * @param aDiscover Stores a pointer to the CBtDiscover object, in order to call
+ * CBtDiscover::SetPort and CBtDiscover::SetContentTypes once those attributes have been
+ * found.
+ */
+CBTAttribValVisitor::CBTAttribValVisitor(CBtDiscover& aDiscover) : iDiscover(aDiscover)
+ {
+ }
+
+/**
+ * @brief Called for each of the individual attributes in the SDP record being parsed.
+ * @param aValue Value of the attribute.
+ * @param aType Type of the attribute.
+ */
+void CBTAttribValVisitor::VisitAttributeValueL(CSdpAttrValue& aValue, TSdpElementType aType)
+ {
+ LOG1("[CBTAttribValVisitor::VisitAttributeValueL]\t Begin. aType: %d", aType);
+
+ switch ( aType )
+ {
+ case ETypeUUID:
+ CheckUuid(aValue.UUID());
+ break;
+ case ETypeUint:
+ CheckUint(aValue.Uint());
+ break;
+ case ETypeString:
+ switch (iDiscover.iCurrentSDPAttrID)
+ {
+ case KSdpAttrIdDocFormatsSupported:
+ iDiscover.SetContentTypesL(aValue.Des());
+ break;
+ case KSdpAttrIdModelID:
+ CheckVendor( aValue.Des() );
+ iDiscover.SetPrinterModelL(aValue.Des());
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+/**
+ * @brief Indicates the beginning of an attribute list in the SDP record.
+ */
+void CBTAttribValVisitor::StartListL(CSdpAttrValueList& /*aList*/)
+ {
+ LOG("CBTAttribValVisitor::StartListL");
+ }
+
+/**
+ * @brief Indicates the end of an attribute list in the SDP record.
+ */
+void CBTAttribValVisitor::EndListL()
+ {
+ LOG("CBTAttribValVisitor::EndListL");
+ }
+
+CBTAttribValVisitor::~CBTAttribValVisitor()
+ {
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CheckUuid
+//
+//--------------------------------------------------------------------------------------------
+void CBTAttribValVisitor::CheckUuid( const TUUID& aUuid )
+{
+ LOG("[CBTAttribValVisitor::CheckUuid]\t begin");
+
+ // We're interested only about UUIDs received at KSdpAttrIdServiceClassIDList
+ if (KSdpAttrIdServiceClassIDList != iDiscover.iCurrentSDPAttrID)
+ {
+ LOG1("[CBTAttribValVisitor::CheckUuid]\t Wrong attribute ID: 0x%X",iDiscover.iCurrentSDPAttrID);
+ return;
+ }
+
+#ifdef _DEBUG
+ TBuf<20> uidstr;
+ _LIT(KUidForm, "0x%02X%02X%02X%02X");
+ uidstr.Format(KUidForm, aUuid[0], aUuid[1], aUuid[2], aUuid[3]);
+ LOG1("[CBTAttribValVisitor::CheckUuid]\t ETypeUUID: %S", &uidstr);
+#endif
+
+ TUUID uidOpp(KBTSDPOBEXObjectPush);
+ TUUID uidBpp(KBTSDPDirectPrinting);
+ TUUID uidSts(KBTSDPPrintingStatus);
+
+ if(aUuid == uidOpp)
+ iDiscover.iCurrentServiceUUID = KBTSDPOBEXObjectPush;
+ if(aUuid == uidBpp)
+ iDiscover.iCurrentServiceUUID = KBTSDPDirectPrinting;
+ if(aUuid == uidSts)
+ iDiscover.iFoundSTS = ETrue;
+
+ LOG("[CBTAttribValVisitor::CheckUuid]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CheckUint
+//
+//--------------------------------------------------------------------------------------------
+void CBTAttribValVisitor::CheckUint( const TUint& aValue )
+{
+ LOG("[CBTAttribValVisitor::CheckUint]\t begin");
+
+ switch(iDiscover.iCurrentSDPAttrID)
+ {
+ case KSdpAttrIdProtocolDescriptorList:
+ if (KBTSDPDirectPrinting == iDiscover.iCurrentServiceUUID)
+ {
+ LOG1("[CBTAttribValVisitor::CheckUint]\t iDiscover->SetBPPPort(%d)", aValue);
+ iDiscover.SetBPPPort(aValue);
+ }
+ if (KBTSDPOBEXObjectPush == iDiscover.iCurrentServiceUUID)
+ {
+ LOG1("[CBTAttribValVisitor::CheckUint]\t iDiscover->SetOPPPort(%d)", aValue);
+ iDiscover.SetOPPPort(aValue);
+ }
+ break;
+ case KSdpAttrIdAdditionalProtocolDescriptorLists:
+ if(iDiscover.iFoundSTS )
+ {
+ LOG1("[CBTAttribValVisitor::CheckUint]\t iDiscover->SetSTSPort(%d)", aValue);
+ iDiscover.SetSTSPort(aValue);
+ iDiscover.iFoundSTS = EFalse;
+ }
+ break;
+ case KSdpAttrIdMaxWidth:
+ LOG1("[CBTAttribValVisitor::CheckUint]\t KSdpAttrIdMaxWidth: %d", aValue);
+ break;
+ case KSdpAttrIdMaxLen:
+ LOG1("[CBTAttribValVisitor::CheckUint]\t KSdpAttrIdMaxLen: %d", aValue);
+ break;
+ default:
+ break;
+ }
+
+ LOG("[CBTAttribValVisitor::CheckUint]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CheckVendor
+//
+//--------------------------------------------------------------------------------------------
+void CBTAttribValVisitor::CheckVendor( const TDesC8& aVendor )
+ {
+ LOG("[CBTAttribValVisitor::CheckVendor]\t Begin");
+ iDiscover.SetVendor( TPrinter::EVendorNone );
+ // At the moment this functionality is not used, but no Vendor is set.
+ HBufC8* vendorName = aVendor.Alloc();
+ if( vendorName )
+ {
+ LOG81("[CBTAttribValVisitor::CheckVendor]\t vendorName: %S", vendorName);
+ TPtr8 ptr = vendorName->Des();
+ ptr.LowerCase();
+ _LIT8( KHp, "mfg:hp;" );
+
+ TInt res = vendorName->Find( KHp );
+ LOG1("[CBTAttribValVisitor::CheckVendor]\t res: %d", res);
+
+ if( res != KErrNotFound )
+ iDiscover.SetVendor( TPrinter::EVendorHp );
+ }
+ delete vendorName;
+ LOG("[CBTAttribValVisitor::CheckVendor]\t End");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdprserviceadvertiser.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,151 @@
+/*
+* 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:
+*
+*/
+
+
+#include <bt_sock.h>
+
+#include "cbtdprserviceadvertiser.h"
+#include "btprotocolconsts.h"
+#include "cbtdiscover.h"
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::NewL()
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBtDprServiceAdvertiser* CBtDprServiceAdvertiser::NewL()
+ {
+ CBtDprServiceAdvertiser* self =
+ CBtDprServiceAdvertiser::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::NewLC()
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBtDprServiceAdvertiser* CBtDprServiceAdvertiser::NewLC()
+ {
+ CBtDprServiceAdvertiser* self = new (
+ ELeave ) CBtDprServiceAdvertiser();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ----------------------------------------------------------------------------
+//
+void CBtDprServiceAdvertiser::ConstructL()
+ {
+ iServiceDescription = KServiceDescription().AllocL();
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::CBtDprServiceAdvertiser()
+// Constructor.
+// ----------------------------------------------------------------------------
+//
+CBtDprServiceAdvertiser::CBtDprServiceAdvertiser()
+ {
+ // no implementation required
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::~CBtDprServiceAdvertiser()
+// Destructor.
+// ----------------------------------------------------------------------------
+//
+CBtDprServiceAdvertiser::~CBtDprServiceAdvertiser()
+ {
+
+ // Delete private member
+ delete iServiceDescription;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::BuildProtocolDescriptionL()
+// Builds the protocol description.
+// ----------------------------------------------------------------------------
+//
+void CBtDprServiceAdvertiser
+::BuildProtocolDescriptionL( CSdpAttrValueDES* aProtocolDescriptor,
+ TInt aPort )
+ {
+ TBuf8<1> channel;
+ channel.Append( ( TChar )aPort );
+
+ aProtocolDescriptor
+ ->StartListL() // List of protocols required for this method
+ ->BuildDESL()
+ ->StartListL() // Details of lowest level protocol
+ ->BuildUUIDL( KL2CAP )
+ ->EndListL()
+
+ ->BuildDESL()
+ ->StartListL()
+ ->BuildUUIDL( KRFCOMM )
+ ->BuildUintL( channel )
+ ->EndListL()
+
+ ->BuildDESL()
+ ->StartListL()
+ ->BuildUUIDL( KBTSDPObex )
+ ->EndListL()
+
+ ->BuildDESL()
+ ->StartListL()
+ ->BuildUUIDL( KBTSDPDPROService )
+ ->EndListL()
+ ->EndListL();
+
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::ServiceName()
+// ----------------------------------------------------------------------------
+//
+const TDesC& CBtDprServiceAdvertiser::ServiceName()
+ {
+ return KServiceName;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::ServiceDescription()
+// ----------------------------------------------------------------------------
+//
+const TDesC& CBtDprServiceAdvertiser::ServiceDescription()
+ {
+ return *iServiceDescription;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtDprServiceAdvertiser::ServiceClass()
+// ----------------------------------------------------------------------------
+//
+TUint CBtDprServiceAdvertiser::ServiceClass()
+ {
+ return KServiceClass;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtjobchannel.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,1040 @@
+/*
+* 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:
+*
+*/
+
+
+/**
+ * @file CBtJobChannel.h
+ * @brief Defines the CBtJobChannel class.
+ */
+
+#include <obex.h>
+
+#include "crsbtdevice.h"
+#include "cbtjobchannel.h"
+#include "cbtsoapcodec.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "cbtdiscover.h"
+#include "printmessagecodes.h"
+#include "cbtstatuschannel.h"
+#include "rsutils.h"
+#include "cbttimer.h"
+#include "btprotocolconsts.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::NewL
+//
+//--------------------------------------------------------------------------------------------
+CBtJobChannel* CBtJobChannel::NewL(MBtPCObserver& aObs)
+{
+ CBtJobChannel *self = NewLC(aObs);
+ CleanupStack::Pop(); // self
+
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CBtJobChannel* CBtJobChannel::NewLC(MBtPCObserver& aObs)
+{
+ CBtJobChannel *self = new (ELeave) CBtJobChannel(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CBtJobChannel
+//
+//--------------------------------------------------------------------------------------------
+CBtJobChannel::CBtJobChannel(MBtPCObserver& aObs):
+ CBtChannelBase(aObs),
+ iJobFile(KNullDesC8()),
+ iJobFileNum(0),
+ iImageCount(0),
+ iFileObjectSize(0),
+ iObexFileObject(NULL),
+ iPercents(0),
+ iTimer(NULL),
+ iStatusChannel(NULL)
+{
+ LOG("[CBtJobChannel::CBtJobChannel]\t");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::~CBtJobChannel
+//
+//--------------------------------------------------------------------------------------------
+CBtJobChannel::~CBtJobChannel()
+{
+ LOG("[CBtJobChannel::~CBtJobChannel]\t");
+ Stop();
+
+ // ignore leave: if cleaning fails, no can do.
+ TRAP_IGNORE(CleanXhtmlDirL())
+
+ if(iObexFileObject)
+ delete iObexFileObject;
+
+ if(iTimer)
+ delete iTimer;
+
+ if(iStatusChannel)
+ {
+ delete iStatusChannel;
+ iStatusChannel = NULL;
+ }
+
+ // deleting iChannel here because review-x report error.
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+
+ iImageList.Reset();
+ iImageList.Close();
+
+ if (iUpdateProgress)
+ {
+ delete iUpdateProgress;
+ iUpdateProgress = NULL;
+ }
+
+ LOG("[CBtJobChannel::~CBtJobChannel]\t out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::ConstructL()
+{
+ LOG("[CBtJobChannel::ConstructL]\t begin");
+
+ CBtChannelBase::ConstructL();
+
+ iObexFileObject = CObexFileObject::NewL();
+ iStatusChannel = CBtStatusChannel::NewL(iObs);
+
+ iState = EStateNone;
+ iPercents = 0;
+ iImageCount = 0;
+
+ // Create periodic timer to update progress of printing.
+ iUpdateProgress = CPeriodic::NewL( CActive::EPriorityStandard );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::RunL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::RunL()
+{
+ LOG2("[CBtJobChannel::RunL]\t BEGIN iStatus %d at state %d", iStatus.Int(), iState);
+
+ //Finish if required
+ if( EStateFinish == iState )
+ {
+ ClearConnection();
+ return;
+ }
+
+ // leave if "not allowed" error
+ DoLeaveL( iStatus.Int() );
+
+ switch( iState )
+ {
+ case EStateConnecting:
+ RemoveObexCmdTimeOut();
+ iObexNullObject->Reset();
+ LOG("[CBtJobChannel::RunL]\t EStateConnecting");
+ StopWaiting();
+ break;
+ case EStateDisconnecting:
+ StopWaiting();
+ // Go to disconnection again in case it is not finished yet...
+ Disconnect();
+ break;
+ case EStateGettingCapabilities:
+ GetSoapResponseL();
+ GetPrinterCapabilitiesResponseL();
+
+ StopWaiting();
+
+ iState = EStateNone;
+ break;
+ case EStateGettingPrinterState:
+ GetSoapResponseL();
+ GetPrinterStateResponseL();
+
+ iState = EStateNone;
+ break;
+ case EStateCreatingJob:
+ {
+ GetSoapResponseL();
+ TInt res = CreateJobResponseL();
+ StopWaiting();
+ // No reason to send doc in error case
+ if(KErrNone == res)
+ {
+ LOG("[CBtJobChannel::RunL]\t CreateJobResponseL() returns %d");
+ SendXhtmlDocumentL();
+ }
+ }
+ break;
+ case EStateCancellingJob:
+ GetSoapResponseL();
+ CancelJobResponseL();
+
+ iDevice = NULL;
+ iState = EStateNone;
+ break;
+ case EStateGettingJobAttributes:
+ GetSoapResponseL();
+ GetJobAttributesResponseL();
+
+ iState = EStateNone;
+ break;
+ case EStateSendingXhtml:
+ iState = EStateNone;
+ iObexBufObject->Reset();
+ iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, iStatus.Int());
+ break;
+ case EStateSendingOPP:
+ SendOPPL();
+ break;
+ default:
+ break;
+ }
+ LOG("[CBtJobChannel::RunL]\t out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::RunError
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::RunError(TInt aError)
+ {
+ LOG1("[CBtJobChannel::RunError]\t state %d", iState);
+ LOG2("[CBtJobChannel::RunError]\t error %d, iStatus %d", aError, iStatus.Int() );
+
+ TInt id = KErrNotFound;
+
+ StopWaiting();
+
+ switch ( iState )
+ {
+ case EStateGettingPrinterState:
+ if(iDevice)
+ id = iDevice->DeviceId();
+
+ iState = EStateFinish;
+ iObs.GetPrinterStateResponse(EBtStateIdle, ENoMessage, aError, id);
+ break;
+ case EStateCreatingJob:
+ iState = EStateFinish;
+ iObs.CreateJobResponse(KErrNotFound, aError);
+ break;
+ case EStateCancellingJob:
+ iState = EStateFinish;
+ iObs.CancelJobResponse(aError);
+ break;
+ case EStateGettingJobAttributes:
+ iState = EStateFinish;
+ iObs.GetJobAttributesResponse(iJobId, KNullDesC8(), KNullDesC8(), KErrNotFound, KErrNotFound, aError);
+ break;
+ case EStateSendingXhtml:
+ case EStateSendingOPP:
+ default:
+ iState = EStateFinish;
+ iObs.GetEventResponse(KErrNotFound, KErrNotFound, KErrNotFound, KErrNotFound, aError);
+ LOG("[CBtJobChannel::RunError]\t GetEventResponse sent" );
+ break;
+ }
+
+ iResponseError = aError;
+ return KErrNone; // othervise error returns to CActive: that's what we don't want.
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::DoCancel
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::DoCancel()
+{
+ LOG2("[CBtJobChannel::DoCancel]\t at state %d, iStatus 0x%X", iState, iStatus.Int());
+
+ StopWaiting();
+
+ iState = EStateNone;
+
+ CBtChannelBase::DoCancel();
+ iStatusChannel->Cancel();
+ LOG1("[CBtJobChannel::DoCancel]\t out iStatus 0x%X", iStatus.Int());
+}
+
+//------------------------------
+// InCalls
+//------------------------------
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::HandleTimeoutL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::HandleTimeoutL()
+{
+ LOG1("[CBtJobChannel::HandleTimeoutL]\t at state %d", iState);
+
+ if(EStateSendingOPP != iState)
+ return;
+
+ TInt state(EBtStateSending);
+ if( 100 == iPercents )
+ {
+ state = EBtStateCompleted;
+ }
+ else if(iTimer)
+ iTimer->Start(KSentPercentsDelay);
+
+ iObs.GetEventResponse(iJobId, state, EBtStatePrinting, KErrNone, KErrNone);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetPercentSent
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::GetPercentSent()
+{
+ LOG1("[CBtJobChannel::GetPercentSent]\t at state %d", iState);
+
+ iPercents = 100;
+
+ if(EStateSendingOPP == iState)
+ {
+ // Store current bytes sent.
+ TReal32 bytesSent = iObexFileObject->BytesSent();
+
+ TInt temp = iProgressOfFullImages - iFileObjectSize;
+ iPercents = ( 100 * ( ( temp + bytesSent ) / iJobSize) );
+
+ LOG2("[CBtJobChannel::GetPercentSent]\t iJobId %d, iImageCount: %d", iJobId, iImageCount);
+ LOG2("[CBtJobChannel::GetPercentSent]\t BytesSent %d, iFileObjectSize %d", iObexFileObject->BytesSent(), iFileObjectSize);
+ }
+
+ LOG1("[CBtJobChannel::GetPercentSent]\t at state %d", iPercents);
+ return iPercents;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CreateJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::CreateJobL(CPrintJob& aJob)
+ {
+ LOG("[CBtJobChannel::CreateJob]\t begin");
+
+ if(!IsConnected())
+ User::Leave( KErrDisconnected );
+
+ Cancel();
+
+ iProgressOfFullImages = 0;
+
+ ++iJobFileNum;
+ iJobFile.Format(KXHTMLFileName8(), iJobFileNum);
+ aJob.GetPrintFileL(iJobFile);
+
+ iImageList.Reset();
+ aJob.Images(iImageList);
+
+ iJobSize = CalculateJobSizeL();
+
+ iImageCount = iImageList.Count();
+ LOG1("[CBtJobChannel::CreateJob]\t iImageList.Count(): %d", iImageList.Count());
+
+ iJobId = KErrNotFound;
+ iResponseError = KErrNone;
+
+ LOG1("[CBtJobChannel::CreateJob]\t aDevice.UsedProtocol() %d", iDevice->UsedProtocol());
+ if(KImagePrint_PrinterProtocol_BPP == iDevice->UsedProtocol())
+ {
+ iState = EStateCreatingJob;
+ SendSoapRequestL(EBtCreateJob, iJobFileNum);
+ // do asynchronously to indicate to start the object server
+ WaitL();
+ }
+ else
+ {
+ iState = EStateSendingOPP;
+ iJobId = 1;
+ SendOPPL();
+ Activate();
+ }
+
+ LOG1("[CBtJobChannel::CreateJob]\t Request sent. iResponseError: %d", iResponseError);
+ if( KErrNone != iResponseError )
+ {
+ User::Leave( iResponseError );
+ }
+ LOG("[CBtJobChannel::CreateJob]\t out");
+ }
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetCapabilitiesL
+//
+// Fully independent and synchronous method. Does not require any existing
+// connections and all connections will be deleted after execution.
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::GetCapabilitiesL(CRsBtDevice& aDevice)
+{
+ LOG("[CBtJobChannel::GetCapabilitiesL]\t");
+ Cancel();
+
+ if( KImagePrint_PrinterProtocol_BPP != aDevice.UsedProtocol() )
+ User::Leave(KErrNotSupported);
+
+ if( !RsUtils::IsBluetoothOn() )
+ User::Leave(KErrCancel);
+
+ CRsBtDevice* tmpDevice = iDevice;
+ iDevice = &aDevice;
+ TBool connected = IsConnected();
+ iResponseError = KErrNone;
+
+ ConnectL();
+ WaitL();
+
+ LOG1("[CBtJobChannel::GetCapabilitiesL]\t ConnectL done: %d", IsConnected());
+
+ iState = EStateGettingCapabilities;
+ SendSoapRequestL(EBtGetPrinterAttributes);
+ LOG1("[CBtJobChannel::GetCapabilitiesL]\t SendSoapRequestL done: %d", IsConnected());
+
+ WaitL();
+
+ if(!connected)
+ {
+ ClearConnection();
+ }
+ iDevice = tmpDevice;
+ tmpDevice = NULL;
+
+ LOG("[CBtJobChannel::GetCapabilitiesL]\t OUT");
+ User::LeaveIfError(iResponseError);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetPrinterStateL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::GetPrinterStateL()
+{
+ LOG1("[CBtJobChannel::GetPrinterStateL]\t begin for protocol %d", iDevice->UsedProtocol());
+ if(KImagePrint_PrinterProtocol_BPP != iDevice->UsedProtocol())
+ {
+ iObs.GetPrinterStateResponse(EBtStatePrinting, ENoMessage, KErrNone, iDevice->DeviceId());
+ return;
+ }
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ iStatusChannel->StartL(*iDevice);
+ iStatusChannel->GetPrinterStateL();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetJobAttributesL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::GetJobAttributesL(TInt aJobId)
+{
+ LOG("[CBtJobChannel::GetJobAttributesL]\t begin");
+
+ if(!iDevice)
+ {
+ User::Leave(KErrDisconnected);
+ }
+
+ LOG1("[CBtJobChannel::GetJobAttributesL]\t begin for protocol %d", iDevice->UsedProtocol());
+ if(KImagePrint_PrinterProtocol_BPP != iDevice->UsedProtocol())
+ {
+ TInt state(EBtStateSending), completed(0);
+ if(100 == iPercents)
+ {
+ state = EBtStateCompleted;
+ completed = iImageCount;
+ }
+
+ iObs.GetJobAttributesResponse(state, KNullDesC8(), KNullDesC8(), completed, 0, KErrNone);
+ return;
+ }
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ LOG("[CBtJobChannel::GetJobAttributesL]\t start status channel if required");
+ if(!iStatusChannel->IsConnected())
+ iStatusChannel->StartL(*iDevice);
+
+ LOG1("[CBtJobChannel::GetJobAttributesL]\t iStatusChannel->GetJobAttributesL(%d)", iJobId);
+ iStatusChannel->GetJobAttributesL(aJobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetEventL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::GetEventL(TInt aJobId)
+{
+ LOG("[CBtJobChannel::GetJobAttributesL]\t begin");
+ if(KImagePrint_PrinterProtocol_BPP != iDevice->UsedProtocol())
+ {
+ TInt state(EBtStateSending);
+ if(100 == iPercents)
+ {
+ state = EBtStateCompleted;
+ }
+
+ iObs.GetEventResponse(iJobId, state, EBtStatePrinting, KErrNone, KErrNone);
+ return;
+ }
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ iStatusChannel->StartL(*iDevice);
+ iStatusChannel->GetEventL(aJobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CancelJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::CancelJobL(TInt aJobId)
+{
+ LOG("[CBtJobChannel::CancelJob(TInt)]\t begin");
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ Cancel();
+
+ iJobId = aJobId;
+
+ iState = EStateCancellingJob;
+ SendSoapRequestL(EBtCancelJob, iJobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::SendOPPL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::SendOPPL()
+ {
+ LOG("[CBtJobChannel::SendOPPL]\t begin");
+ TInt tmpNumberOfCopies(0);
+ // Delete file object
+ iObexFileObject->Reset();
+
+ if(iTimer)
+ iTimer->Cancel();
+
+ // all sent
+ if(0 >= iImageList.Count())
+ {
+ LOG1("[CBtJobChannel::SendOPPL]\t Finishing... iImageList.Count(): %d", iImageList.Count());
+
+ iJobFile.Zero();
+ iImageList.Reset();
+
+ iState = EStateNone;
+
+ ClearConnection();
+
+ iObs.GetEventResponse(iJobId, EBtStateCompleted, EBtStateIdle, KErrNone, KErrNone);
+ iJobId = KErrNotFound;
+
+ if(iTimer)
+ delete iTimer;
+ iTimer = NULL;
+
+ return;
+ }
+
+ LOG2("[CBtJobChannel::SendOPPL]\t iChannel: %d, iChannel->IsConnected(): %d", iChannel, iChannel->IsConnected());
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ iState = EStateSendingOPP;
+
+ TFileName fn;
+ iImageList[0].GetFilePathL(fn);
+ tmpNumberOfCopies = iImageList[0].Copies();
+
+ LOG1("[CBtJobChannel::SendOPPL]\t init file object with \"%S\"", &fn);
+ iObexFileObject->InitFromFileL(fn);
+ // check that does user wants print more than one copy of the currently printing picture.
+ if(tmpNumberOfCopies > 1)
+ {
+ tmpNumberOfCopies--;
+ iImageList[0].SetCopies(tmpNumberOfCopies);
+ }
+ else
+ {
+ iImageList.Remove(0);
+ }
+
+ LOG81("[CBtJobChannel::SendOPPL]\t set type \"%S\"...", &KBtMimeTypeJpeg());
+ iObexFileObject->SetTypeL(KBtMimeTypeJpeg());
+
+ LOG1("[CBtJobChannel::SendOPPL]\t ...and name \"%S\"", &fn);
+ iObexFileObject->SetNameL(fn);
+
+ iFileObjectSize = iObexFileObject->Length();
+
+ if(!iTimer)
+ iTimer = CBtTimer::NewL(*this);
+
+ iTimer->Start(KSentPercentsDelay);
+
+ LOG("[CBtJobChannel::SendOPPL]\t put");
+ iChannel->Put(*iObexFileObject, iStatus);
+
+ iProgressOfFullImages = iProgressOfFullImages + iFileObjectSize;
+
+ if (iUpdateProgress)
+ {
+ iUpdateProgress->Cancel();
+ }
+
+ // Start periodic timer to track data transfer process.
+ // Event interval is setup to 1 second.
+ iUpdateProgress->Start(5000, KProgressUpdateInterval, TCallBack( CheckProgress, this ));
+
+ iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, KErrNone, KErrNone);
+
+ Activate();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CheckProgress
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::CheckProgress( TAny *aObj )
+ {
+ CBtJobChannel* obj = (CBtJobChannel*)aObj;
+ obj->UpdateProgress();
+ return 1;
+ }
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::UpdateProgress
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::UpdateProgress()
+ {
+ TInt percentBuffer = GetPercentSent();
+
+ // If all data has been sent, it's OK to stop timer
+ if ( percentBuffer == 100 )
+ {
+ iUpdateProgress->Cancel();
+ }
+
+ // Update progress bar using MBtPCObserver.
+ iObs.OPPSendProgress(percentBuffer);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::SendXhtmlDocumentL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::SendXhtmlDocumentL()
+ {
+ LOG("[CBtJobChannel::SendXhtmlDocumentL]\t begin");
+
+ if( !iDevice || !iChannel || !iChannel->IsConnected() )
+ User::Leave( EObexConnectError );
+
+ iState = EStateSendingXhtml;
+
+ TFileName fn;
+ fn.Copy( iJobFile );
+
+ iObexFileObject->Reset();
+
+ LOG("[CBtJobChannel::SendXhtmlDocumentL]\t fill in iObexBufObject");
+ iObexFileObject->InitFromFileL( fn );
+
+ TBuf8<50> mime;
+ mime.Copy( KBtMimeTypeXhtml() );
+ mime.ZeroTerminate();
+ iObexFileObject->SetTypeL( mime );
+
+ // name initialized automatically...
+
+ // Job ID (application parameters)
+ TUint32 jobId = iJobId;
+ TBuf8<20> triplet;
+
+ triplet.Zero();
+ triplet.Append((TChar)KBtObexTagJobId);
+ triplet.Append((TChar)KBtDataLength4);
+ //append value
+ triplet.Append((TChar) ((jobId & 0xFF000000) >> 24) );
+ triplet.Append((TChar) ((jobId & 0xFF0000) >> 16) );
+ triplet.Append((TChar) ((jobId & 0xFF00) >> 8) );
+ triplet.Append((TChar) (jobId & 0xFF) );
+ triplet.ZeroTerminate();
+
+#ifdef _DEBUG
+ const TUint8* aPtr = triplet.Ptr();
+ _LIT(KBTHexFormatString,"%02x");
+ TBuf<50> line;
+ for (TInt j=0; j<triplet.Length(); j++)
+ line.AppendFormat(KBTHexFormatString,aPtr[j]);
+ LOG1("[CBtJobChannel::SendXhtmlDocumentL]\t line: %S", &line);
+#endif
+
+ iObexFileObject->SetAppParamL(triplet);
+
+ LOG("[CBtJobChannel::SendXhtmlDocumentL]\t putting...");
+
+ iChannel->Put(*iObexFileObject, iStatus);
+
+ Activate();
+ LOG("[CBtJobChannel::SendXhtmlDocumentL]\t end");
+}
+
+//------------------------------
+// Responses
+//------------------------------
+TInt CBtJobChannel::CreateJobResponseL()
+{
+ LOG("[CBtJobChannel::CreateJobResponseL]\t ");
+ User::LeaveIfNull(iSoapCodec);
+
+ iJobId = KErrNotFound;
+ TInt err = KErrGeneral;
+
+ iSoapCodec->CreateJobResponseL(iJobId, err);
+ iResponseError = err;
+
+ iObs.CreateJobResponse(iJobId, err);
+ LOG("[CBtJobChannel::CreateJobResponseL]\t out");
+ return err;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetPrinterStateResponseL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::GetPrinterStateResponseL()
+{
+ LOG("[CBtJobChannel::GetPrinterStateResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+
+ TInt state = EBtStateUnknown;
+ TInt reasons = EPbCheckPrinter;
+ TInt opStatus = KErrGeneral;
+
+ iSoapCodec->GetPrinterStateResponseL(state, reasons, opStatus);
+ iObs.GetPrinterStateResponse(state, reasons, opStatus, iDevice->DeviceId());
+
+ LOG("[CBtJobChannel::GetPrinterAttributesResponseL]\t out");
+ return opStatus;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetPrinterCapabilitiesResponseL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::GetPrinterCapabilitiesResponseL()
+{
+ LOG("[CBtJobChannel::GetPrinterCapabilitiesResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+
+ RArray<TPrintCapability> capab;
+ CleanupClosePushL(capab);
+ TInt opStatus = KErrGeneral;
+
+ iSoapCodec->GetPrinterCapabilitiesResponseL(capab, opStatus);
+
+ if(iDevice)
+ {
+ for(TInt i = 0; i < capab.Count(); ++i)
+ {
+ iDevice->AddCapability(capab[i]);
+ }
+ LOG("[CBtJobChannel::GetPrinterCapabilitiesResponseL]\t returning to iObs...");
+ }
+ else
+ {
+ opStatus = KErrNotFound;
+ }
+
+ CleanupStack::PopAndDestroy(&capab);
+ LOG("[CBtJobChannel::GetPrinterCapabilitiesResponseL]\t out");
+ return opStatus;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::GetJobAttributesResponseL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::GetJobAttributesResponseL()
+{
+ LOG("[CBtJobChannel::GetJobAttributesResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+
+ TInt state, sheets, pendingJobs, opStatus;
+ TBtAttrString8 jobName;
+ TBtAttrString8 originator;
+
+ iSoapCodec->GetJobAttributesResponseL( iJobId, state, jobName, originator,sheets, pendingJobs, opStatus);
+ iObs.GetJobAttributesResponse(state, jobName, originator,sheets, pendingJobs, opStatus);
+
+ return opStatus;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CancelJobResponseL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::CancelJobResponseL()
+{
+ LOG("[CBtJobChannel::CancelJobResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+
+ TInt err = KErrNotFound;
+ iSoapCodec->CancelJobResponseL(iJobId, err);
+
+ LOG1("[CBtJobChannel::CancelJobResponseL]\t err %d", err);
+ iObs.CancelJobResponse(err);
+
+ return err;
+}
+
+///////////////////////////////
+// Private
+///////////////////////////////
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::ConnectL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::ConnectL()
+ {
+ LOG("[CBtJobChannel::ConnectL]\t");
+
+ User::LeaveIfNull( iDevice );
+
+ if( IsConnected() )
+ {
+ LOG1("[CBtJobChannel::ConnectL]\t return isConnected: %d", IsConnected());
+ return;
+ }
+
+ // delete old if exists
+ if ( iChannel )
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+
+ iState = EStateConnecting;
+
+ // set common parts of protocol info
+ TObexBluetoothProtocolInfo protocolInfo;
+ protocolInfo.iTransport.Copy( KRFCOMMDesC );
+ protocolInfo.iAddr.SetBTAddr( iDevice->BDAddr() );//Address of server bt device
+
+ // connect profile specifically
+ LOG1("[CBtJobChannel::ConnectL]\t aDevice.UsedProtocol(): %d", iDevice->UsedProtocol());
+ if( KImagePrint_PrinterProtocol_BPP == iDevice->UsedProtocol() )
+ {
+ LOG("[CBtJobChannel::ConnectL]\t connect BPP");
+ protocolInfo.iAddr.SetPort( iDevice->BPPPort() );//Service channel of server rfcomm
+
+ TUUID uuid( KBTSDPDirectPrinting );
+ iObexNullObject->Reset();
+ iObexNullObject->SetTargetL( uuid.Des() );
+
+ // create channel
+ iChannel = CObexClient::NewL( protocolInfo );
+ iChannel->SetCallBack( *this );
+ iChannel->Connect( *iObexNullObject, iStatus );
+ }
+ else
+ {
+ LOG("[CBtJobChannel::ConnectL]\t connect OPP");
+ protocolInfo.iAddr.SetPort(iDevice->OPPPort());
+
+ // create channel
+ iChannel = CObexClient::NewL( protocolInfo );
+ iChannel->SetCallBack(*this);
+ iChannel->SetCommandTimeOut(KObexCmdTimeOut);
+ iChannel->Connect(iStatus);
+ }
+
+ Activate();
+
+ LOG("[CBtJobChannel::ConnectL]\t out.");
+ return;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::IsError
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::DoLeaveL(TInt aError)
+{
+ LOG2("[CBtJobChannel::DoLeaveL]\t aError %d at state %d", aError, iState);
+
+ if(KErrNone == aError)
+ return;
+
+ if(EStateDisconnecting == iState)
+ return;
+
+ // obex connection objects returns 'KErrCompletion' at destructor. Ignore.
+ if(KErrCompletion == aError)
+ return;
+
+ LOG("[CBtJobChannel::DoLeaveL]\t Leave");
+ User::Leave(aError);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::ClearConnection
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::ClearConnection()
+{
+ LOG1("[CBtJobChannel::ClearConnection]\t iState %d", iState);
+
+ if(iStatusChannel)
+ {
+ LOG("[CBtJobChannel::ClearConnections]\t **** iStatusChannel stop");
+ iStatusChannel->Stop();
+ }
+
+ CBtChannelBase::ClearConnection();
+
+ iObexFileObject->Reset();
+
+ iState = EStateNone;
+
+ iUpdateProgress->Cancel();
+
+ iImageCount = 0;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CleanXhtmlDirL
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::CleanXhtmlDirL()
+{
+ LOG1("[CBtJobChannel::CleanXhtmlDirL]\t iJobFileNum %d", iJobFileNum);
+
+ RFs fs;
+ CleanupClosePushL(fs);
+ User::LeaveIfError(fs.Connect());
+
+ CFileMan* fm = CFileMan::NewL(fs);
+ CleanupStack::PushL(fm);
+
+ while(0 < iJobFileNum)
+ {
+ TFileName fn;
+ fn.Format(KXHTMLFileName, iJobFileNum);
+ TInt err = fm->Delete(fn);
+ LOG2("[CBtJobChannel::CleanXhtmlDirL]\t delete file %S, err %d", &fn, err);
+ --iJobFileNum;
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); // fm, fs
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::RemoveObexCmdTimeOut
+//
+//--------------------------------------------------------------------------------------------
+void CBtJobChannel::RemoveObexCmdTimeOut()
+{
+ iChannel->SetCommandTimeOut(0);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtJobChannel::CalculateJobSizeL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtJobChannel::CalculateJobSizeL()
+ {
+
+ TInt imgCount= iImageList.Count();
+ TInt size = 0;
+
+ for (TInt i = 0; i<imgCount; i++)
+ {
+ TFileName fn;
+ iImageList[i].GetFilePathL(fn);
+ iObexFileObject->InitFromFileL(fn);
+ TInt tempSize = iObexFileObject->Length();
+ iObexFileObject->Reset();
+ size = size + tempSize;
+ }
+ return size;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtobjectserver.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,950 @@
+/*
+* 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:
+*
+*/
+
+
+#include <avkon.hrh>
+#include <aknnotewrappers.h>
+
+#include "cbtprintingdevice.h"
+#include "cbtobjectserver.h"
+#include "btprotocolconsts.h"
+#include "clog.h"
+#include "printmessagecodes.h"
+#include "tbtmapper.h"
+#include "xhtmlfilecomposerconst.h"
+#include "rsutils.h"
+
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::NewL()
+// Creates a new instance of the class
+// ----------------------------------------------------------------------------
+
+CBtObjectServer* CBtObjectServer::NewL(const TBTDevAddr& aDeviceAddress,
+ RArray<CImageInfo> &aImgArray,
+ MBtObjectServerObserver &aObs)
+{
+
+ CBtObjectServer* self = CBtObjectServer::NewLC( aDeviceAddress, aImgArray, aObs );
+ CleanupStack::Pop( self );
+ return self;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::NewLC()
+// Creates a new instance of the class
+// ----------------------------------------------------------------------------
+
+CBtObjectServer* CBtObjectServer::NewLC(const TBTDevAddr& aDeviceAddress,
+ RArray<CImageInfo> &aImgArray,
+ MBtObjectServerObserver &aObs)
+{
+
+ CBtObjectServer* self = new ( ELeave ) CBtObjectServer( aDeviceAddress, aObs );
+ CleanupStack::PushL( self );
+ self->ConstructL(aImgArray);
+ return self;
+
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::CBtObjectServer
+// The actual constructor of the class
+// ----------------------------------------------------------------------------
+
+CBtObjectServer::CBtObjectServer(const TBTDevAddr& aDeviceAddress, MBtObjectServerObserver& aObs )
+: iAllowedAddress ( aDeviceAddress ),
+ iObs ( aObs ),
+ iStarted(EFalse),
+ iConnected(EFalse),
+ iTransportUp(EFalse)
+{
+ LOG("CBtObjectServer::CBtObjectServer]\t default constructor");
+
+ iImgArray.Reset();
+ iImgArray.Close();
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::~CBtObjectServer()
+// Destructor.
+// ----------------------------------------------------------------------------
+//
+CBtObjectServer::~CBtObjectServer()
+{
+ LOG("CBtObjectServer::~CBtObjectServer]\t");
+
+ iStarted = EFalse;
+ iOperation = EIdle;
+
+ if ( iObexServer && iObexServer->IsStarted() )
+ {
+ iObexServer->Stop();
+ }
+
+ iFs.Close();
+
+ if (iObexServer)
+ delete iObexServer;
+ iObexServer = NULL;
+
+ if(iObexBufObject)
+ delete iObexBufObject;
+ iObexBufObject = NULL;
+
+ // This must be deleted after the iObexBufObject who uses it.
+ if (iObexBody)
+ delete iObexBody;
+ iObexBody = NULL;
+
+ if(iAdvertiser)
+ delete iAdvertiser;
+ iAdvertiser = NULL;
+
+ iImgArray.Close();
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::Cancel()
+// Sends current file to the server and then stops the server
+// ----------------------------------------------------------------------------
+void CBtObjectServer::Cancel()
+{
+ LOG("[CBtObjectServer::Cancel]\t");
+
+ if (!IsSendingData())
+ {
+ LOG("[CBtObjectServer::Cancel]\t - not sending data - stopping server now! \n");
+ Stop();
+ }
+ else
+ {
+ iOperation = EIdle;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::ConstructL()
+// Constucts everything that can leave in the class
+// ----------------------------------------------------------------------------
+void CBtObjectServer::ConstructL(RArray<CImageInfo> &aImgArray)
+{
+ LOG("[CBtObjectServer::ConstructL]\t");
+
+ LOG1("[CBtObjectServer::ConstructL]\t aImgArray.Count(): %d", aImgArray.Count());
+ for(TInt i = 0; i < aImgArray.Count(); ++i)
+ {
+ iImgArray.Append(aImgArray[i]);
+
+/* For debug
+#ifdef ENABLE_LOGGING
+ TFileName8 uri;
+ aImgArray[i].GetUri(uri);
+ TFileName8 log;
+ CImageInfo::UriLog(uri, log);
+ LOG1("[CBtObjectServer::ConstructL]\t uri: %d", log);
+#endif // ENABLE_LOGGING
+*/
+ }
+
+ iAdvertiser = CBtDprServiceAdvertiser::NewL();
+
+ // create OBEX object to receive obex transfer. 8 for reserving data in 8 bytes segments
+ iObexBody = CBufFlat::NewL( 8 );
+
+ User::LeaveIfError(iFs.Connect());
+
+ InitTransferData();
+ iRemoteAddress.Reset();
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::Stop()
+// Disconnects the server.
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::Stop()
+{
+ LOG("[CBtObjectServer::Stop]\t");
+
+ // already stopping
+ if(!iStarted)
+ return;
+
+ iOperation = ETerminating;
+
+ LOG("[CBtObjectServer::Stop]\t cont...");
+ iRemoteAddress.Reset();
+
+ //cannot delete here. Stop called from iObexServer Callback function.
+ if ( iObexServer && iObexServer->IsStarted())
+ {
+ LOG("[CBtObjectServer::Stop]\t stopping iObexServer...");
+ iObexServer->Stop();
+ }
+
+ // Trap this: if it fails, we cannot do anything.
+ TInt leave; // for remove compiling warnings
+ TRAP(leave, iAdvertiser->StopAdvertisingL());
+ LOG1("[CBtObjectServer::Stop]\t iAdvertiser->StopAdvertising() leaves with %d", leave);
+
+ LOG1("[CBtObjectServer::Stop]\t iObexServer: %d", iObexServer);
+
+ iOperation = EIdle;
+ iStarted = EFalse;
+ iConnected = EFalse;
+ iTransportUp = EFalse;
+
+ /* Sending 'stopped' status */
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerStopped);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::StartL()
+// Starts the server.
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::StartL()
+{
+ LOG("[CBtObjectServer::StartL]\t");
+
+ TBool btOn = RsUtils::IsBluetoothOn();
+ LOG1("[CBtObjectServer::StartL]\t btOn: %d", btOn);
+ if( !btOn )
+ User::Leave(KErrCancel);
+
+ TRAPD( err, InitialiseServerL() );
+ LOG1("CBtObjectServer::StartL]\t InitialiseServerL leaves with %d", err);
+
+ if ( err != KErrNone )
+ {
+ Stop();
+ User::Leave(err);
+ }
+
+ iStarted = ETrue;
+
+ /* Send 'server started' status */
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerStarted);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::InitialiseServerL()
+// Initialises the server.
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::InitialiseServerL()
+{
+ LOG("CBtObjectServer::InitialiseServerL]\t");
+
+ if ( iObexServer )
+ {
+ ASSERT( IsConnected() ); // server already running
+ return;
+ }
+
+ LOG("[CBtObjectServer::InitialiseServerL]\t - getting channel");
+
+ // Set the Socket's security with parameters,
+ // Authentication, Encryption, Authorisation and Denied
+ // Method also return the channel available to listen to.
+ TInt channel = SetSecurityWithChannelL( EFalse, EFalse, EFalse, EFalse );
+
+ // start the OBEX server
+ TObexBluetoothProtocolInfo obexProtocolInfo;
+
+ LOG1("[CBtObjectServer::InitialiseServerL]\t setting %S ", &KRFCOMMDesC);
+ obexProtocolInfo.iTransport.Copy( KRFCOMMDesC() );
+
+ LOG1("[CBtObjectServer::InitialiseServerL]\t setting port %d", channel);
+ obexProtocolInfo.iAddr.SetPort( channel );
+
+ LOG("[CBtObjectServer::InitialiseServerL]\t CObexServer::NewL()");
+ if(iObexServer)
+ {
+ delete iObexServer;
+ iObexServer = NULL;
+ }
+ iObexServer = CObexServer::NewL( obexProtocolInfo );
+
+ LOG("[CBtObjectServer::InitialiseServerL]\t iObexServer->Start()");
+ User::LeaveIfError(iObexServer->Start( this ) );
+
+ TUUID who(KBTSDPDPROService);
+ User::LeaveIfError(iObexServer->SetLocalWho(who.LongForm()));
+
+ // advertise this service
+ LOG("[CBtObjectServer::InitialiseServerL]\t iAdvertiser->StartAdvertisingL()");
+ iAdvertiser->StartAdvertisingL( channel );
+ LOG("[CBtObjectServer::InitialiseServerL]\t iAdvertiser->UpdateAvailabilityL()");
+ iAdvertiser->UpdateAvailabilityL( ETrue );
+
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::InitTransferData()
+// Initialises the variables needed for progressing and processing the printing
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::InitTransferData()
+{
+ LOG("CBtObjectServer::InitTransferData]\t");
+
+ InitHeaderVariables();
+ iProgress = 0;
+
+ // delete this to be ready to send NULL object.
+ if(iObexBufObject)
+ delete iObexBufObject;
+ iObexBufObject = NULL;
+
+ // no need to delete. Reset is enough.
+ iObexBody->Reset();
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::InitHeaderVariables()
+// Initialises the variables needed for progressing and processing the printing
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::InitHeaderVariables()
+{
+ LOG("CBtObjectServer::InitHeaderVariables]\t");
+
+ iOffset = 0;
+ iCount = 0; // KErrNotFound indicates "the rest"
+ iSize = KErrNotFound;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::SetSecurityWithChannelL()
+// Sets the security on the channel port and returns the available port.
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::SetSecurityWithChannelL( TBool aAuthentication,
+ TBool aEncryption,
+ TBool aAuthorisation,
+ TBool aDenied )
+
+{
+
+ LOG("CBtObjectServer::SetSecurityWithChannelL]\t");
+
+ // Local variable to channel to listen to.
+ TInt channel;
+
+ RSocketServ socketServer;
+
+ // Connect to SocetServer
+ LOG("[CBtObjectServer::SetSecurityWithChannelL]\t - connecting to socketServer");
+ User::LeaveIfError( socketServer.Connect() );
+ CleanupClosePushL( socketServer );
+
+ RSocket socket;
+
+ // Open the Socket connection
+ LOG("[CBtObjectServer::SetSecurityWithChannelL]\t - opening a socket");
+ User::LeaveIfError( socket.Open( socketServer, KRFCOMMDesC() ) );
+ CleanupClosePushL( socket );
+
+ // Retreive to one channel that is available.
+ LOG("[CBtObjectServer::SetSecurityWithChannelL]\t - get one channel");
+ User::LeaveIfError( socket.GetOpt( KRFCOMMGetAvailableServerChannel,KSolBtRFCOMM, channel ) );
+
+ // Set the Socket's Port.
+ TBTSockAddr sockaddr;
+ sockaddr.SetPort( channel );
+
+ LOG("[CBtObjectServer::SetSecurityWithChannelL]\t - setting security settings");
+
+ // Set the security according to.
+ TBTServiceSecurity serviceSecurity;
+
+ serviceSecurity.SetUid ( KBtProtocolUid ); // UID for _this_ security service; internal inside the phone
+ serviceSecurity.SetAuthentication ( aAuthentication );
+ serviceSecurity.SetEncryption ( aEncryption );
+ serviceSecurity.SetAuthorisation ( aAuthorisation );
+ serviceSecurity.SetDenied( aDenied );
+
+ // Attach the security settings.
+ sockaddr.SetSecurity(serviceSecurity);
+
+ LOG("[CBtObjectServer::SetSecurityWithChannelL]\t - binding socket to a address");
+
+ // Bind and start listeing the port with security set,
+ User::LeaveIfError(socket.Bind(sockaddr));
+ User::LeaveIfError(socket.Listen(KSimultainousSocketsOpen ) );
+
+ // now close the socket and the socket server
+ CleanupStack::PopAndDestroy(2); // socket, socketServer
+
+ LOG("[CBtObjectServer::SetSecurityWithChannelL]\t - returning");
+
+ return channel;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::IsConnected()
+// Results true if the server is connected.
+// ----------------------------------------------------------------------------
+//
+TBool CBtObjectServer::IsConnected()
+{
+ LOG1("CBtObjectServer::IsConnected]\t %d", iConnected);
+ return iConnected;
+}
+
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::IsTransporting()
+// Results true if the transport connection is up.
+// ----------------------------------------------------------------------------
+//
+TBool CBtObjectServer::IsTransporting()
+{
+ LOG1("CBtObjectServer::IsTransporting]\t %d", iTransportUp);
+ return iTransportUp;
+}
+// ----------------------------------------------------------------------------
+// IsSendingData()
+// @return ETrue if the server is sending data to a Bluetooth device
+// ----------------------------------------------------------------------------
+TBool CBtObjectServer::IsSendingData()
+{
+ LOG("CBtObjectServer::IsSendingData]\t");
+
+ if(ESending == iOperation)
+ return ETrue;
+
+ return EFalse;
+}
+
+// ----------------------------------------------------------------------------
+// IsSendingData()
+// @return ETrue if the server is finished and can be deleted
+// ----------------------------------------------------------------------------
+TBool CBtObjectServer::IsFinished()
+{
+ LOG("CBtObjectServer::IsFinished]\t");
+
+ if(ESending != iOperation)
+ return ETrue;
+
+ return EFalse;
+}
+
+/*****************************************************************************/
+/* Following methods implement the Obex Observer callbacks in this class */
+/*****************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::ErrorIndication()
+// Receive error indication.
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::ErrorIndication( TInt aError )
+{
+ LOG2("CBtObjectServer::ErrorIndication]\t iOperation: %d, aError: %d", iOperation, aError);
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerError, aError);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::TransportUpIndication()
+// Called when the underlying socket transport connection is made from
+// a remote client to the server
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::TransportUpIndication()
+{
+ LOG1("CBtObjectServer::TransportUpIndication]\t iOperation: %d", iOperation);
+
+ iTransportUp = ETrue;
+
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerTransportUp);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::TransportDownIndication()
+// Transport connection is dropped.
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::TransportDownIndication()
+{
+ LOG1("[CBtObjectServer::TransportDownIndication]\t iOperation: %d", iOperation);
+
+ iTransportUp = EFalse;
+
+ if(ETerminating != iOperation)
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerTransportDown);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::ObexConnectIndication()
+// Invoked when an OBEX connection is made from a remote client.
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::ObexConnectIndication(
+ const TObexConnectInfo& /*aRemoteInfo*/, const TDesC8& /*aInfo*/ )
+{
+ LOG("CBtObjectServer::ObexConnectIndication]\t");
+
+ TInt message = KErrAccessDenied;
+
+ /* Check the address of the remote device */
+ if(AllowConnection())
+ {
+ message = KErrNone;
+ iConnected = ETrue;
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerConnected);
+ }
+
+ LOG1("CBtObjectServer::ObexConnectIndication]\t returns %d", message);
+ return message;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::ObexDisconnectIndication()
+// OBEX server has been disconnected.
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::ObexDisconnectIndication( const TDesC8& /*aInfo*/ )
+{
+ LOG("CBtObjectServer::ObexDisconnectIndication]\t");
+
+ if(ETerminating != iOperation)
+ {
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerDisconnected);
+ }
+ iConnected = EFalse;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::PutRequestIndication()
+// ----------------------------------------------------------------------------
+//
+CObexBufObject* CBtObjectServer::PutRequestIndication()
+{
+ LOG("CBtObjectServer::PutRequestIndication]\t");
+
+ /* This is the object where server receives the client request over OBEX */
+ return iObexBufObject;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::PutPacketIndication()
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::PutPacketIndication()
+{
+ LOG("CBtObjectServer::PutPacketIndication]\t");
+
+ return KErrNone;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::PutCompleteIndication()
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::PutCompleteIndication()
+{
+ LOG("CBtObjectServer::PutCompleteIndication]\t");
+
+ return KErrNone;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::GetRequestIndication()
+// Called when a full get request has been received from the client.
+// ----------------------------------------------------------------------------
+//
+CObexBufObject* CBtObjectServer::GetRequestIndication( CObexBaseObject* aRequestedObject )
+{
+ LOG("[CBtObjectServer::GetRequestIndication]\t");
+
+ CObexBufObject* object = NULL;
+
+ /* Check if connection allowed for the remote device */
+ if(AllowConnection())
+ {
+ iOperation = ESending;
+ TRAPD(leave, object = HandleGetRequestL(aRequestedObject));
+ if(KErrNone != leave)
+ LOG1("[CBtObjectServer::GetRequestIndication]\t HandleGetRequestL leaves with %d", leave );
+
+ // Stop advertising if still advertisig...
+ TRAP(leave, iAdvertiser->StopAdvertisingL());
+ if(KErrNone != leave)
+ LOG1("[CBtObjectServer::GetRequestIndication]\t StopAdvertisingL leaves with %d", leave);
+ }
+
+ LOG1("[CBtObjectServer::GetRequestIndication]\t return object pointer %d", object );
+ return object;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::GetPacketIndication()
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::GetPacketIndication()
+{
+ LOG("[CBtObjectServer::GetPacketIndication]\t");
+
+ /* Setting that we are now sending data */
+ iOperation = ESending;
+
+ return KErrNone;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::GetCompleteIndication()
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::GetCompleteIndication()
+{
+ LOG("[CBtObjectServer::GetCompleteIndication]\t");
+
+ if(iProgress >= 100)
+ // Sending status that the whole file sent to BT-device
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerFileSent, iProgress);
+ else
+ // Sending status that one package sent to BT-device
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerPackageSent, iProgress);
+
+ // We are finished for one package - init
+ SetCompleted();
+
+ return KErrNone;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::SetPathIndication()
+// ----------------------------------------------------------------------------
+//
+TInt CBtObjectServer::SetPathIndication( const CObex::TSetPathInfo& /*aPathInfo*/,
+ const TDesC8& /*aInfo*/ )
+{
+ LOG("CBtObjectServer::SetPathIndication]\t");
+ return KErrNone;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::AbortIndication()
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::AbortIndication()
+{
+ LOG("CBtObjectServer::AbortIndication]\t");
+
+ SetCompleted();
+
+ /* Sending status that one file sent to BT-device */
+ iObs.HandleObjectServerEvent(KErrAbort);
+
+}
+
+/*****************************************************************************/
+/* Own privates */
+/*****************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::AllowConnection()
+// Checks if the connection should allow.
+// ----------------------------------------------------------------------------
+//
+TBool CBtObjectServer::AllowConnection()
+{
+ LOG("CBtObjectServer::AllowConnection]\t");
+
+ // Return immediatedly if addresses macth
+ if( iRemoteAddress != 0 && iRemoteAddress == iAllowedAddress)
+ return ETrue;
+
+ TBool allow = EFalse;
+
+ if( iRemoteAddress == 0 )
+ {
+ /* Getting address of the remote device */
+ TBTSockAddr remoteAddress;
+ iObexServer->RemoteAddr(remoteAddress);
+
+ /* Getting the actual bluetooth address */
+ iRemoteAddress = remoteAddress.BTAddr();
+
+ /* Comparing the two bluetooth device addresses */
+ allow = (iRemoteAddress == iAllowedAddress);
+
+#ifdef _DEBUG
+
+ TBuf<100> origName;
+ iAllowedAddress.GetReadable(origName);
+ TBuf<100> remoteName;
+ iRemoteAddress.GetReadable(remoteName);
+
+ LOG1("[CBtObjectServer::AllowConnection]\t btAddressOrig: %S", &origName);
+ LOG1("[CBtObjectServer::AllowConnection]\t btAddressRemote: %S", &remoteName);
+#endif
+ }
+
+
+ if (!allow)
+ {
+ LOG("[CBtObjectServer::AllowConnection]\t BT addresses DON'T match!");
+ iObs.HandleObjectServerEvent(MBtObjectServerObserver::KObjectServerBTDeviceMismatch);
+ }
+ else
+ {
+ LOG("[CBtObjectServer::AllowConnection]\t BT addresses match!");
+ }
+
+ return allow;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::HandleGetRequestL()
+// Called when a full get request has been received from the client.
+// ----------------------------------------------------------------------------
+//
+CObexBufObject* CBtObjectServer::HandleGetRequestL( CObexBaseObject* aRequestedObject )
+{
+ User::LeaveIfNull(aRequestedObject);
+
+ TFileName name(aRequestedObject->Name());
+
+ TFileName log;
+ CImageInfo::UriLog(name, log);
+ LOG1("[CBtObjectServer::HandleGetRequestL]\t file requested: \"%S\"", &log);
+
+ /* get application parameters header */
+ GetAppHeaderL(aRequestedObject);
+
+ //Append obex header start in uri
+ _LIT(KObex, "obex:");
+ _LIT(KSlash, "/");
+ TFileName scheme(KObex());
+ // Note here: the correct format would be uuid.LongForm(),
+ // but in currently supported services it is not required.
+ scheme.AppendNum(KBTSDPDPROService, EHex);
+ scheme.Append(KSlash());
+
+ TInt pos = name.Find(scheme);
+ if(KErrNotFound == pos)
+ name.Insert(0, scheme);
+
+ return CreateObexObjectL(name);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::GetAppHeaderL()
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::GetAppHeaderL(CObexBaseObject* aRequestedObject)
+{
+ LOG("CBtObjectServer::GetAppHeaderL]\t");
+
+ /* get header parameters */
+ InitHeaderVariables();
+
+ TInt indx = 0; // grows cumulatively during GetTriplet
+ TInt tmp = 0;
+
+ // offset
+ TUint tag = 0;
+ TInt len = KBtTripletLength;
+ HBufC8* params = (aRequestedObject->AppParam()).AllocLC();
+
+ if(len <= params->Des().Length())
+ {
+ tmp = TBtMapper::TripletValue(params->Des(), indx, tag);
+ }
+ if(KBtObexTagOffset == tag)
+ iOffset = tmp;
+
+ LOG1("CBtObjectServer::GetAppHeaderL]\t offset: %d", iOffset);
+
+ // count
+ tag = 0;
+ len += KBtTripletLength;
+ if(len <= params->Des().Length())
+ {
+ tmp = TBtMapper::TripletValue(params->Des(), indx, tag);
+ }
+ if(KBtObexTagCount == tag)
+ iCount = tmp;
+
+ LOG1("CBtObjectServer::GetAppHeaderL]\t count: %d", iCount);
+
+ // size
+ tag = 0;
+ len += KBtTripletLength;
+ if(len <= params->Des().Length())
+ {
+ tmp = TBtMapper::TripletValue(params->Des(), indx, tag);
+ }
+ if(KBtObexTagSize == tag)
+ iSize = tmp;
+
+ LOG1("CBtObjectServer::GetAppHeaderL]\t size: %d", iSize);
+
+ CleanupStack::PopAndDestroy(params);
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer
+//
+// ----------------------------------------------------------------------------
+CObexBufObject* CBtObjectServer::CreateObexObjectL(const TDesC& aUri)
+{
+ TFileName log;
+ CImageInfo::UriLog(aUri, log);
+ LOG1("[CBtObjectServer::CreateObexObjectL]\t file requested: \"%S\"", &log);
+
+ if(iObexBufObject)
+ delete iObexBufObject;
+ iObexBufObject = NULL;
+
+ TInt size = KErrNotFound;
+
+ for(TInt i = 0; i < iImgArray.Count(); ++i)
+ {
+ if(iImgArray[i].CompareUri(aUri))
+ {
+ TFileName file;
+ iImgArray[i].GetFilePathL(file);
+ LOG1("[CBtObjectServer::CreateObexObject]\t file = \"%S\"", &file );
+
+ GetDataSequenceL(file, size);
+ LOG2("[CBtObjectServer::CreateObexObject]\t data len: %d, file size: %d", iObexBody->Size(), size);
+ if(iObexBody)
+ iObexBufObject = CObexBufObject::NewL(iObexBody);
+
+ break;
+ }
+ }
+ if(!iObexBufObject)
+ {
+ LOG1("[CBtObjectServer::CreateObexObject]\t return NULL: %d", iObexBufObject);
+ return iObexBufObject;
+ }
+
+ // Fill headers
+ // File size (application parameters)
+
+ TBuf8<20> triplet;
+
+ triplet.Zero();
+ triplet.Append((TChar)KBtObexTagSize);
+ triplet.Append((TChar)KBtDataLength4);
+ //append value
+ triplet.Append((TChar) ((size & 0xFF000000) >> 24) );
+ triplet.Append((TChar) ((size & 0xFF0000) >> 16) );
+ triplet.Append((TChar) ((size & 0xFF00) >> 8) );
+ triplet.Append((TChar) (size & 0xFF) );
+ triplet.ZeroTerminate();
+
+ iObexBufObject->SetAppParamL(triplet);
+
+ return iObexBufObject;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::GetDataSequenceL()
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::GetDataSequenceL(const TFileName& aFileName, TInt& aFileSize)
+{
+ //LOG1("[CBtObjectServer::GetDataSequenceL]\t for file \"%S\"", aFileName);
+
+ RFile file;
+ CleanupClosePushL(file);
+ TInt err = file.Open(iFs, aFileName, EFileRead|EFileShareReadersOnly);
+ if(KErrNone != err)
+ User::LeaveIfError(file.Open(iFs, aFileName, EFileRead|EFileShareAny));
+
+ // Get file size
+ aFileSize = KErrNotFound;
+ file.Size(aFileSize);
+
+ if(!iObexBody)
+ {
+ iObexBody = static_cast<CBufFlat*>(User::LeaveIfNull(CBufFlat::NewL(8)));
+ }
+ iObexBody->Reset();
+
+ // if iCount is zero, return empty body...
+ if(0 == iCount)
+ return;
+
+ // count to send
+ TInt len = iCount;
+
+ // ...if iCount is -1, return the rest of the file
+ // (http://www.bluetooth.com/NR/rdonlyres/276DE16A-BDB9-48BF-8123-AF01E3730E5F/925/BPP_SPEC_V10.pdf)
+ if(KErrNotFound == len)
+ {
+ len = aFileSize - iOffset;
+ }
+ //LOG2("[CBtObjectServer::GetDataSequenceL]\t iOffset: %d, len: %d", iOffset, len);
+
+ HBufC8* data = static_cast<HBufC8*>(User::LeaveIfNull(HBufC8::NewLC(len)));
+ TPtr8 dataPtr( data->Des() );
+
+ dataPtr.Zero();
+ User::LeaveIfError( file.Read(iOffset, dataPtr, len) );
+ //LOG1("[CBtObjectServer::GetDataSequenceL]\t read data->Des().Length(): %d", data->Des().Length());
+
+ iObexBody->InsertL(0, data->Des());
+
+ CleanupStack::PopAndDestroy(2); // data, file
+
+ //count proggress of this file
+ if(!iOffset)
+ iProgress = iOffset;
+ else
+ iProgress = (((iOffset << 8) / aFileSize) * 100) >> 8;
+
+ LOG1("[CBtObjectServer::GetDataSequenceL]\t Progress: %d", iProgress);
+ return;
+}
+
+// ----------------------------------------------------------------------------
+// CBtObjectServer::SetCompleted()
+// ----------------------------------------------------------------------------
+//
+void CBtObjectServer::SetCompleted()
+{
+ // method to indicate a package is sent
+ LOG("[CBtObjectServer::SetCompleted]\t");
+
+ // init requested parameters
+ InitTransferData();
+
+ /* If the user of the server called Cancel() */
+ if(ETerminating == iOperation)
+ {
+ LOG("[CBtObjectServer::SetCompleted]\t to stop...");
+ Stop();
+ }
+ else
+ {
+ LOG("[CBtObjectServer::SetCompleted]\t package sent...");
+ iOperation = EIdle;
+ }
+
+ return;
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtonquery.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,146 @@
+/*
+* 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 CBtOnQuery class definition. This Implementation is used to avoid
+* User::WaitForRequest() function and ViewServer 11 panic when BT naming query is activated.
+*
+*/
+
+
+#include <e32base.h>
+#include <btnotifierapi.h>
+
+#include "cbtonquery.h"
+#include "mbtonnotify.h"
+#include "clog.h"
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CObjectExchangeClient::NewL()
+// Symbian two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBtOnQuery* CBtOnQuery::NewL( MBTOnNotify& aNotify )
+ {
+ CBtOnQuery* self = CBtOnQuery::NewLC( aNotify );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::NewLC()
+// Symbian two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBtOnQuery* CBtOnQuery::NewLC( MBTOnNotify& aNotify )
+ {
+ CBtOnQuery* self;
+ self = new ( ELeave ) CBtOnQuery( aNotify );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::CBtOnQuery()
+// Constructor.
+// ----------------------------------------------------------------------------
+//
+CBtOnQuery::CBtOnQuery( MBTOnNotify& aNotify ) : CActive( CActive::EPriorityLow ),
+ iNotify( aNotify )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::~CBtOnQuery()
+// Destructor.
+// ----------------------------------------------------------------------------
+//
+CBtOnQuery::~CBtOnQuery()
+ {
+ Cancel();
+ }
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::ConstructL()
+// Perform second phase construction of this object.
+// ----------------------------------------------------------------------------
+//
+void CBtOnQuery::ConstructL()
+ {
+ iResultPckg = EFalse;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::IsBluetoothOn()
+// Starts Notifier to ask user to BT activation.
+// ----------------------------------------------------------------------------
+//
+void CBtOnQuery::IsBluetoothOn()
+ {
+ LOG("CBtOnQuery::IsBluetoothOn, start");
+ TPckgBuf<TBool> pckg( ETrue ); // Input parameter
+
+ if( iNotif.Connect() == KErrNone )
+ {
+ LOG("CBtOnQuery::IsBluetoothOn() iNotif.Connect() == KErrNone");
+ iNotif.StartNotifierAndGetResponse( iStatus, KPowerModeSettingNotifierUid, pckg, iResultPckg );
+ LOG1("CBtOnQuery::IsBluetoothOn %d", iResultPckg());
+ }
+
+ SetActive();
+ LOG("CBtOnQuery::IsBluetoothOn, end");
+ }
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::IsBluetoothOn()
+// Respond to an event.
+// ----------------------------------------------------------------------------
+//
+void CBtOnQuery::RunL()
+ {
+ LOG1("CBtOnQuery::RunL() %d", iStatus.Int());
+ if( iStatus.Int() == KErrNone || iStatus.Int() == KErrCancel || iStatus.Int() == KErrGeneral )
+ {
+ iNotif.CancelNotifier( KPowerModeSettingNotifierUid );
+ iNotif.Close();
+ LOG1("CBtOnQuery::RunL() %d", iResultPckg());
+ iNotify.BTOnCompleteL( iResultPckg() ); // iResultPckg contains user answer
+ }
+ LOG("CBtOnQuery::RunL() End"); // Activate BT -> iResultPckg = ETrue
+ } // No BT Activation -> iResultPckg EFalse)
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::RunError()
+// Handles errors which is throwed by RunL() function.
+// ----------------------------------------------------------------------------
+//
+void CBtOnQuery::RunError()
+ {
+ // No implementation required
+ }
+
+// ----------------------------------------------------------------------------
+// CBtOnQuery::RunError()
+// Cancel any outstanding requests.
+// ----------------------------------------------------------------------------
+//
+void CBtOnQuery::DoCancel()
+ {
+ // No implementation required
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtpasswordquery.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,108 @@
+/*
+* 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:
+*
+*/
+
+
+#include <avkon.hrh>
+
+#include "cbtpasswordquery.h"
+
+CBtPasswordQuery::CBtPasswordQuery( MConfirmationNotify& aNotify ) : CActive( CActive::EPriorityStandard),
+ iNotify (aNotify)
+ {
+ CActiveScheduler::Add( this );
+ }
+
+CBtPasswordQuery::~CBtPasswordQuery()
+ {
+ Cancel();
+ iNotifier.Close();
+ }
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CBtPasswordQuery::NewL()
+// Symbian two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBtPasswordQuery* CBtPasswordQuery::NewL( MConfirmationNotify& aNotify )
+ {
+ CBtPasswordQuery* self = CBtPasswordQuery::NewLC( aNotify );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtPasswordQuery::NewLC()
+// Symbian two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBtPasswordQuery* CBtPasswordQuery::NewLC( MConfirmationNotify& aNotify )
+ {
+ CBtPasswordQuery* self;
+ self = new ( ELeave ) CBtPasswordQuery( aNotify );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CBtPasswordQuery::ConstructL()
+// Perform second phase construction of this object.
+// ----------------------------------------------------------------------------
+//
+void CBtPasswordQuery::ConstructL()
+ {
+
+ }
+
+void CBtPasswordQuery::StartActiveObjectL()
+ {
+
+ //RNotifier notifier;
+ User::LeaveIfError(iNotifier.Connect());
+
+ // start asynchronic notifier -> prompt user passsword
+ iNotifier.StartNotifierAndGetResponse(iStatus, KBTObexPasskeyQueryNotifierUid, iPckg, iResultPckg);
+
+ // Start active object and set iStatus = KRequestPending
+ SetActive();
+ }
+
+void CBtPasswordQuery::RunL()
+ {
+ if( iStatus.Int() == KErrNone || iStatus.Int() == KErrCancel)
+ {
+ iNotifier.CancelNotifier( KPowerModeSettingNotifierUid );
+ // close connection to the notify server
+ iNotifier.Close();
+ iNotify.PasswordQueryCompleteL( iResultPckg );
+ }
+ }
+
+void CBtPasswordQuery::RunError()
+ {
+
+ }
+
+void CBtPasswordQuery::DoCancel()
+ {
+ iNotifier.CancelNotifier( KPowerModeSettingNotifierUid );
+
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,574 @@
+/*
+* 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: Defines the CBtPrinterController class.
+*
+*/
+
+
+#include <obex.h>
+
+#include "crsbtdevice.h"
+#include "cbtprintercontroller.h"
+#include "cbtsoapcodec.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "cbtdiscover.h"
+#include "printmessagecodes.h"
+#include "cbtstatuschannel.h"
+#include "cbtjobchannel.h"
+#include "rsutils.h"
+#include "btnotifierapi.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::NewL
+//
+//--------------------------------------------------------------------------------------------
+CBtPrinterController* CBtPrinterController::NewL(MBtPCObserver& aObs)
+{
+ CBtPrinterController *self = NewLC(aObs);
+ CleanupStack::Pop(); // self
+
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CBtPrinterController* CBtPrinterController::NewLC(MBtPCObserver& aObs)
+{
+ CBtPrinterController *self = new (ELeave) CBtPrinterController(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CBtPrinterController
+//
+//--------------------------------------------------------------------------------------------
+CBtPrinterController::CBtPrinterController(MBtPCObserver& aObs):
+ iObs( aObs ),
+ iJobChannel(NULL),
+ iObjectChannel(NULL)
+{
+ LOG("[CBtPrinterController::CBtPrinterController]\t");
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::~CBtPrinterController
+//
+//--------------------------------------------------------------------------------------------
+CBtPrinterController::~CBtPrinterController()
+{
+ LOG("[CBtPrinterController::~CBtPrinterController]\t");
+
+ ClearConnections();
+
+ if(iBtDiscoverEngine)
+ {
+ delete iBtDiscoverEngine;
+ iBtDiscoverEngine = NULL;
+ }
+
+ if(iObjectChannel)
+ {
+ delete iObjectChannel;
+ iObjectChannel = NULL;
+ }
+
+ if(iJobChannel)
+ {
+ delete iJobChannel;
+ iJobChannel = NULL;
+ }
+
+ delete iQuery;
+
+ iImageList.Reset();
+ iImageList.Close();
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::ConstructL()
+{
+ LOG("[CBtPrinterController::ConstructL]\t begin");
+ iJobId = KErrNotFound;
+
+ iBtDiscoverEngine = CRsBtDiscoverEngine::NewL(*this);
+
+ LOG("[CBtPrinterController::ConstructL]\t channels");
+ iObjectChannel = NULL;
+ iJobChannel = CBtJobChannel::NewL(iObs);
+
+ iQuery = NULL;
+ iProtocol = 0;
+
+ InitJobVariables();
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrinterController::GetPercentSent()
+{
+ LOG("[CBtPrinterController::GetPercentSent]\t");
+
+ return iPercents;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::Stop
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::Stop()
+{
+ LOG("[CBtPrinterController::Stop]\t");
+
+ iJobChannel->Cancel();
+
+ ClearConnections();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::IsConnected
+//
+//--------------------------------------------------------------------------------------------
+TBool CBtPrinterController::IsConnected()
+{
+ LOG("[CBtPrinterController::IsConnected]\t");
+ TBool connected = EFalse;
+
+ if(iJobChannel && iJobChannel->IsConnected())
+ {
+ connected = ETrue;
+ LOG1("[CBtPrinterController::IsConnected]\t iJobChannel->IsConnected() %d", connected);
+ }
+
+ if(iObjectChannel && iObjectChannel->IsConnected())
+ {
+ connected = ETrue;
+ LOG1("[CBtPrinterController::IsConnected]\t iObjectChannel->IsConnected() %d", connected);
+ }
+
+ LOG1("[CBtPrinterController::IsConnected]\t return %d",connected);
+ return connected;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::FinishPrinting
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::FinishPrinting()
+{
+ LOG("[CBtPrinterController::FinishPrintingL]\t begin");
+
+ // Already finishing
+ if(iFinish)
+ {
+ LOG("[CBtPrinterController::FinishPrintingL]\t already finishing");
+ return;
+ }
+
+ iFinish = ETrue;
+
+ Stop();
+
+ LOG("[CBtPrinterController::FinishPrintingL]\t end");
+ return;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::StartDiscoveryL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::StartDiscoveryL( TUint aProtocol)
+{
+ LOG1("[CBtPrinterController::StartDiscoveryL]\t aProtocol: %d", aProtocol);
+
+ iProtocol = aProtocol;
+ iQuery = CBtOnQuery::NewL( *this );
+ iQuery->IsBluetoothOn();
+
+ LOG("CBtPrinterController::StartDiscoveryL end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CancelDiscoveryL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::CancelDiscovery()
+{
+ LOG("[CBtPrinterController::CancelDiscovery]\t begin");
+ iBtDiscoverEngine->Stop();
+
+ LOG1( "[CBtPrinterController::CancelDiscovery]\t iBtDiscoverEngine->IsActive() = %d", iBtDiscoverEngine->IsActive() );
+
+ Stop();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::GetCapabilitiesL
+//
+// Fully independent and synchronous method. Does not require any existing
+// connections and all connections will be deleted after execution.
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::GetCapabilitiesL(CRsBtDevice& aDevice)
+{
+ LOG("[CBtPrinterController::GetCapabilitiesL]\t");
+ iJobChannel->Cancel();
+ iJobChannel->GetCapabilitiesL(aDevice);
+ LOG("[CBtPrinterController::GetCapabilitiesL]\t out");
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CreateJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::CreateJobL(CRsBtDevice& aDevice, CPrintJob& aJob)
+{
+ LOG("[CBtPrinterController::CreateJobL]\t begin");
+
+ iJobChannel->Cancel();
+
+ iImageList.Reset();
+ aJob.Images(iImageList);
+ iImageCount = iImageList.Count();
+ LOG1("[CBtPrinterController::CreateJobL]\t iImageList.Count(): %d", iImageList.Count());
+ if(0 == iImageCount)
+ User::Leave(KErrInvalidData);
+
+ iJobId = KErrNotFound;
+
+ iJobChannel->StartL(aDevice);
+
+ iJobChannel->CreateJobL(aJob);
+ LOG("[CBtPrinterController::CreateJobL]\t CreateJobL done");
+
+ LOG1("[CBtPrinterController::CreateJobL]\t aDevice.UsedProtocol() %d", aDevice.UsedProtocol());
+ if(KImagePrint_PrinterProtocol_BPP == aDevice.UsedProtocol())
+ {
+ LOG("[CBtPrinterController::CreateJobL]\t before establishing");
+ EstablishObjectChannelL( aDevice );
+ }
+ else
+ {
+ iJobId = 1;
+ }
+
+ LOG("[CBtPrinterController::CreateJobL]\t out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::GetPrinterStateL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::GetPrinterStateL(CRsBtDevice& aDevice)
+{
+ LOG("[CBtPrinterController::GetPrinterStateL]\t begin");
+ iJobChannel->Cancel();
+
+ if(!iJobChannel->IsConnected())
+ {
+ iJobChannel->StartL(aDevice);
+ }
+
+ iJobChannel->GetPrinterStateL();
+
+ LOG("[CBtPrinterController::GetPrinterStateL]\t OUT");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::GetJobAttributesL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::GetJobAttributesL(CRsBtDevice& aDevice, TInt aJobId)
+{
+ LOG("[CBtPrinterController::GetJobAttributesL]\t begin");
+
+ if(!iJobChannel || !iJobChannel->IsConnected())
+ {
+ LOG("[CBtPrinterController::GetJobAttributesL]\t User::Leave(KErrInvalidSequence);");
+ User::Leave(KErrInvalidSequence);
+ }
+
+ LOG("[CBtPrinterController::GetJobAttributesL]\t iJobId = aJobId;");
+ iJobId = aJobId;
+
+ LOG("[CBtPrinterController::GetJobAttributesL]\t iJobChannel->GetJobAttributesL(aJobId);");
+ iJobChannel->GetJobAttributesL(aJobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::CancelJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::CancelJobL(CRsBtDevice& aDevice, TInt aJobId)
+{
+ LOG("[CBtPrinterController::CancelJob(TInt)]\t begin");
+
+ if(!iJobChannel || !iJobChannel->IsConnected())
+ User::Leave(KErrInvalidSequence);
+
+ iJobChannel->Cancel();
+
+ iJobId = aJobId;
+
+ iJobChannel->CancelJobL(iJobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::GetEventL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::GetEventL(TInt aJobId)
+{
+ LOG("[CBtPrinterController::GetEvent]\t begin");
+ iJobId = aJobId;
+
+ if(!iJobChannel || !iJobChannel->IsConnected())
+ User::Leave(KErrInvalidSequence);
+
+ iJobChannel->GetEventL(aJobId);
+}
+
+//----------------------------------
+
+///////////////////////////////
+// Private
+///////////////////////////////
+// From MRsBtDiscoverEngineObserver.
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::HandleDiscoveryEvent
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::HandleDiscoveryEvent(TInt aEvent, TInt aErrorCode)
+{
+ LOG2("[CBtPrinterController::HandleDiscoveryEvent]\t aEvent: %d, aErrorCode: %d", aEvent, aErrorCode);
+
+ switch ( aEvent )
+ {
+ case MBtDiscoveryObserver::EFoundBtPrinter:
+ LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t EFoundBtPrinter");
+ iObs.DeviceDiscovered(iBtDiscoverEngine->GetDevice());
+ break;
+ case MBtDiscoveryObserver::ERemoveBtPrinter:
+ LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t ERemoveBtPrinter");
+ iObs.DeviceDisappeared(iBtDiscoverEngine->GetDevice());
+ break;
+ case MBtDiscoveryObserver::EDoneFindingPrinters:
+ LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t EDoneFindingPrinters");
+ iObs.DiscoveryError(KErrNone);
+ break;
+ case MBtDiscoveryObserver::EErrorDuringDiscover:
+ LOG("[CBtPrinterController::HandleBtDiscoverEngineEventL]\t EErrorDuringDiscover");
+ iObs.DiscoveryError(aErrorCode);
+ break;
+ default:
+ break;
+ }
+}
+
+// From MBtObjectServerObserver
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::HandleObjectServerEvent
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::HandleObjectServerEvent(TInt aStatus, TInt aInfo)
+{
+ LOG2("[CBtPrinterController::OperationStatus]\t aStatus: %d, aInfo: %d", aStatus, aInfo);
+
+ switch( aStatus )
+ {
+ case KObjectServerStopped:
+ LOG("[CBtPrinterController::OperationStatus]\t iObjectChannel stopped");
+ iServerError = KErrNone;
+ break;
+ case KObjectServerStarted:
+ LOG("[CBtPrinterController::OperationStatus]\t KObjectServerStarted");
+ iServerError = KErrNone;
+ iPercents = 0;
+ iSentImages = 0;
+ break;
+ case KObjectServerAllFilesSent: // not used!
+ iServerError = KErrNone;
+ break;
+ case KObjectServerPackageSent:
+ iServerError = KErrNone;
+ iPercents = 100 * ((iSentImages * 100) + aInfo) / (iImageCount * 100);
+ LOG2("[CBtPrinterController::OperationStatus]\t iPercents %d, aInfo %d", iPercents, aInfo);
+ iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, KErrNone);
+ break;
+ case KObjectServerFileSent:
+ LOG("[CBtPrinterController::OperationStatus]\t KObjectServerOneFileSent");
+ iServerError = KErrNone;
+
+ iPercents = 100 * ((iSentImages * 100) + aInfo) / (iImageCount * 100);
+
+ ++iSentImages;
+ LOG2("[CBtPrinterController::OperationStatus]\t sent images: %d/%d", iSentImages, iImageCount);
+ if(iSentImages == iImageCount)
+ {
+ iObs.GetEventResponse(iJobId, EBtStatePrinting, EBtStatePrinting, ENoMessage, KErrNone);
+ }
+ else
+ {
+ iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, KErrNone);
+ }
+ break;
+ case KErrNone:
+ break;
+ case KObjectServerBTDeviceMismatch:
+ LOG("[CBtPrinterController::OperationStatus]\t KObjectServerBTDeviceMismatch");
+ break;
+ case KObjectServerTransportUp:
+ LOG("[CBtPrinterController::OperationStatus]\t KObjectServerTransportUp");
+ iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, KErrNone);
+ case KObjectServerConnected:
+ iServerError = KErrNone;
+ break;
+ case KObjectServerError:
+ LOG1("[CBtPrinterController::OperationStatus]\t KObjectServerError: %d", aInfo);
+ iServerError = aInfo;
+ //break here: other messages takes care of correct actions
+ break;
+ case KObjectServerDisconnected:
+ LOG1("[CBtPrinterController::OperationStatus]\t disconnected, iServerError %d", iServerError);
+ case KObjectServerTransportDown:
+ LOG1("[CBtPrinterController::OperationStatus]\t transport down. iServerError %d", iServerError);
+ if(KErrNone != iServerError)
+ iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, iServerError, KErrDisconnected);
+ iServerError = KErrNone;
+ break;
+ default:
+ LOG("[CBtPrinterController::OperationStatus]\t default...");
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::InitSyncVariables
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::InitJobVariables()
+{
+ iPercents = 0;
+ iImageCount = 0;
+ iServerError = KErrNone;
+ iFinish = EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::ClearConnections
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::ClearConnections()
+{
+ LOG("[CBtPrinterController::ClearConnections]\t ");
+
+ if(iBtDiscoverEngine)
+ iBtDiscoverEngine->Cancel();
+
+ if(iObjectChannel)
+ {
+ iObjectChannel->Stop();
+ LOG("[CBtPrinterController::ClearConnections]\t **** iObjectChannel stop");
+ }
+
+ if(iJobChannel)
+ {
+ LOG("[CBtPrinterController::ClearConnections]\t **** iJobChannel stop");
+ iJobChannel->Disconnect();
+ }
+
+ InitJobVariables();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::EstablishObjectChannelL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::EstablishObjectChannelL( CRsBtDevice& aDevice )
+{
+ if( 0 == iImageList.Count())
+ User::Leave(KErrInvalidSequence);
+
+ LOG("[CBtPrinterController::EstablishObjectChannelL]\t create iObjectChannel");
+ if(iObjectChannel)
+ {
+ delete iObjectChannel;
+ iObjectChannel = NULL;
+ }
+ iObjectChannel = CBtObjectServer::NewL( aDevice.BDAddr(), iImageList, *this );
+ iObjectChannel->StartL();
+
+ iImageList.Reset();
+
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrinterController::BTOnCompleteL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrinterController::BTOnCompleteL( TBool aResult )
+ {
+ LOG("[CBtPrinterController::BTOnComplete] begin \t ");
+
+ if( !aResult )
+ {
+ LOG("[CBtPrinterController::BTOnComplete]\t cancelling discovery, bt is not activated \t ");
+ CancelDiscovery();
+ iObs.DiscoveryError( ENoConnection );
+ }
+
+
+ iBtDiscoverEngine->Start( iProtocol );
+
+ LOG("[CBtPrinterController::BTOnComplete] end \t ");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintingdevice.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,1664 @@
+/*
+* 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:
+*
+*/
+
+
+// EXTERNAL INCLUDES
+#include <e32std.h>
+#include <barsc.h>
+#include <btprotocol.rsg>
+#include <fbs.h>
+
+#include "cbtprintingdevice.h"
+#include "printcapabilitycodes.h"
+#include "printmessagecodes.h"
+#include "rsutils.h"
+#include "crsbtdevice.h"
+#include "cbtdevicecontainer.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "crsbtdiscoverengine.h"
+
+
+// CONSTANTS
+namespace
+ {
+ /// Bluetooth BPP/OPP Version Major.
+ const static TInt KBtVersionMajor = 3;
+ /// Bluetooth BPP/OPP Version Minor.
+ const static TInt KBtVersionMinor = 0;
+ /// Bluetooth BPP/OPP Version Build.
+ const static TInt KBtVersionBuild = 1;
+ }
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::NewL
+//
+//--------------------------------------------------------------------------------------------
+MProtPrintingDevice* CBtPrintingDevice::NewL()
+{
+ return new (ELeave) CBtPrintingDevice();
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CBtPrintingDevice
+//
+//--------------------------------------------------------------------------------------------
+CBtPrintingDevice::CBtPrintingDevice() :
+ CActive(CActive::EPriorityStandard),
+ iState( ENone ),
+ iPrintingJob( NULL ),
+ iPrinterController( NULL ),
+ iDeviceContainer( NULL ),
+ iRequestedProtocols( 0 ),
+ iPrintError( KErrNone ),
+ iPrintErrorMsgCode( 0 ),
+ iPendingCount(KPendingLimit),
+ iPrinterTimer( NULL ),
+ iProggress( 0 )
+{
+ iDiscoveryObserver = NULL;
+ iPrintEventObserver = NULL;
+ CActiveScheduler::Add(this);
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::ConstructL(const TDesC& /*aDLLPath*/)
+{
+ LOG("CBtPrintingDevice ****************************************************");
+ LOG("[CBtPrintingDevice::ConstructL]\t begin");
+
+ iPrinterController = CBtPrinterController::NewL(*this);
+ iDeviceContainer = CBtDeviceContainer::NewL();
+ iPrinterTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+ LOG("CBtPrintingDevice::ConstructL end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::~CBtPrintingDevice
+//
+//--------------------------------------------------------------------------------------------
+CBtPrintingDevice::~CBtPrintingDevice()
+{
+ LOG("CBtPrintingDevice::~CBtPrintingDevice begin");
+
+ Deactivate();
+
+ if(iPrinterTimer)
+ {
+ if(iPrinterTimer->IsActive())
+ iPrinterTimer->Cancel();
+ delete iPrinterTimer;
+ }
+
+ if(iPrinterController)
+ {
+ iPrinterController->Stop();
+ delete iPrinterController;
+ }
+
+ if(iPrintingJob)
+ delete iPrintingJob;
+
+ if(iDeviceContainer)
+ delete iDeviceContainer;
+
+ REComSession::DestroyedImplementation( iDtor_ID_Key );
+
+ LOG("CBtPrintingDevice::~CBtPrintingDevice end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::RunL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::RunL()
+{
+ LOG1("[CBtPrintingDevice::RunL]\t iStatus: %d", iStatus.Int());
+
+ if(KErrNone != iStatus.Int())
+ {
+ User::Leave(iStatus.Int());
+ }
+
+ switch( iState )
+ {
+ case EFinish:
+ FinishPrinting(iStatus.Int());
+ break;
+ case EGetJobAttributes:
+ GetJobAttributesL();
+ break;
+ case EGetPrinterState:
+ GetPrinterStateL();
+ break;
+ default:
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::RunError
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::RunError(TInt aError)
+{
+ LOG2("[CBtPrintingDevice::RunError]\t iStatus: %d, aError: %d", iStatus.Int(), aError);
+
+ FinishPrinting(aError);
+
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::DoCancel
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::DoCancel()
+{
+ LOG1("[CBtPrintingDevice::DoCancel]\t iStatus: %d", iStatus.Int());
+ ResetTimer();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::Deactivate
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::Deactivate()
+{
+ LOG2("[CBtPrintingDevice::Deactivate]\t iStatus: %d iState %d", iStatus.Int(), iState);
+ ResetTimer();
+ Cancel();
+ iStatus = KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::Version
+//
+//--------------------------------------------------------------------------------------------
+TVersion CBtPrintingDevice::Version()
+{
+ return TVersion(KBtVersionMajor, KBtVersionMinor, KBtVersionBuild);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::SupportedProtocols
+//
+//--------------------------------------------------------------------------------------------
+TUint CBtPrintingDevice::SupportedProtocols()
+{
+ return KImagePrint_PrinterProtocol_BPP |
+ KImagePrint_PrinterProtocol_OPP_Printer |
+ KImagePrint_PrinterProtocol_OPP_PC;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::DiscoveryError
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::DiscoveryError(TInt aError)
+{
+ LOG1("[CBtPrintingDevice::DiscoveryError]\t aError: %d", aError);
+ if(0 < iDeviceContainer->Count())
+ {
+ iState = EReady;
+ }
+ else
+ {
+ iState = ENone;
+ }
+
+ iPrinterController->CancelDiscovery();
+ Deactivate();
+
+ if( iDiscoveryObserver )
+ {
+ if(KErrNone == aError)// discovery finished, update not-found cached devices
+ UpdateCacheList();
+
+ //We're not interested if the call back leaves
+ TRAP_IGNORE(iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, aError));
+ }
+
+ LOG("[CBtPrintingDevice::DiscoveryError]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::StartDiscoveryL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocol)
+{
+ LOG1("[CBtPrintingDevice::StartDiscoveryL]\t aProtocol: %d", aProtocol);
+ iDiscoveryObserver = &aObserver;
+
+ // already discovering
+ if(EDiscovering == iState)
+ return;
+
+ if((aProtocol & SupportedProtocols()))
+ {
+ iRequestedProtocols = aProtocol;
+ iDeviceContainer->Reset();
+ iPrinterController->Stop();
+
+ // If GetUsedDevicesL fails, no can do. Just continue.
+ LOG("[CBtPrintingDevice::StartDiscoveryL]\t Get used devices");
+ TInt leave;
+ TRAP(leave, GetUsedDevicesL() );
+ LOG1("[CBtPrintingDevice::StartDiscoveryL]\t Get used devices leaves with %d", leave);
+
+ LOG("[CBtPrintingDevice::StartDiscoveryL]\t Calling iPrinterController");
+ iPrinterController->StartDiscoveryL(aProtocol);
+
+ iState = EDiscovering;
+ }
+ else
+ {
+ LOG("CBtPrintingDevice::StartDiscoveryL NO protocol match, ending discovery...");
+ if( iDiscoveryObserver )
+ {
+ //We're not interested if the call back leaves
+ TRAP_IGNORE(iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrNone));
+ }
+ }
+ LOG("[CBtPrintingDevice::StartDiscoveryL]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::RemoveCachedDeviceL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::RemoveCachedDeviceL(TInt aDeviceID)
+{
+ LOG1("CBtPrintingDevice::RemoveCachedDeviceL aDeviceID: %d", aDeviceID);
+
+ TInt err = KErrNone;
+ CRsBtDevice* device = FindDevice(aDeviceID);
+ if( device )
+ {
+ device->SetUsed(EFalse);
+ iDeviceContainer->StoreL();
+ }
+ else
+ {
+ err = KErrInvalidData;
+ }
+
+ LOG1("CBtPrintingDevice::RemoveCachedDeviceL end with: %d", err);
+ return err;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::UpdateCacheListL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::UpdateCacheList()
+{
+ LOG("[CBtPrintingDevice::UpdateCacheList]\t");
+
+ for(TInt i = 0; i < iDeviceContainer->Count(); ++i)
+ {
+ CRsBtDevice* device = iDeviceContainer->At(i);
+ if(device && !device->IsJustFound())
+ DeviceDisappeared(*device);
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CancelDiscovery
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::CancelDiscovery(TBool aDoCallBack)
+{
+ LOG1("[CBtPrintingDevice::CancelDiscovery]\t aDoCallBack: %d", aDoCallBack);
+ if(0 < iDeviceContainer->Count())
+ {
+ iState = EReady;
+ }
+ else
+ {
+ iState = ENone;
+ }
+ iPrinterController->CancelDiscovery();
+ Deactivate();
+
+ if( aDoCallBack && iDiscoveryObserver )
+ {
+ //We're not interested if the call back leaves
+ TRAP_IGNORE(iDiscoveryObserver->DiscoveryStatusL(EDiscoveryCancelling, KErrNone));
+ }
+ LOG("[CBtPrintingDevice::CancelDiscovery]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CreatePrintJobL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::CreatePrintJobL(TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver)
+{
+ LOG("[CBtPrintingDevice::CreatePrintJobL]\t begin");
+ LOG2("[CBtPrintingDevice::CreatePrintJobL]\t aDeviceID: %d, aImages.Count(): %d", aDeviceID, aImages.Count());
+
+ iPrintEventObserver = &aObserver;
+
+ CRsBtDevice *printer = FindDevice( aDeviceID );
+
+ if( printer == NULL )
+ {
+ LOG("CBtPrintingDevice::CreatePrintJobL no device found, returning error");
+ return KErrInvalidData;
+ }
+ if(iPrintingJob &&
+ (CPrintJob::EStateSubmitted == iPrintingJob->JobState() ||
+ CPrintJob::EStateSending == iPrintingJob->JobState() ||
+ CPrintJob::EStatePrinting == iPrintingJob->JobState()) )
+ {
+ LOG("[CBtPrintingDevice::CreatePrintJobL]\t Printing job already");
+ return KErrInvalidSequence;
+ }
+
+ iPendingCount = 0;
+
+ GetCapabilities(*printer);
+
+ InitJobL(printer, aImages);
+
+ LOG("[CBtPrintingDevice::CreatePrintJobL]\t job created");
+
+ iPrintingJob->UpdateJobState(CPrintJob::EStateCreated);
+
+ LOG1("[CBtPrintingDevice::CreatePrintJobL]\t end - status: %d", iState);
+
+ return KErrNone;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::SubmitPrintJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::SubmitPrintJobL()
+{
+ LOG("[CBtPrintingDevice::SubmitPrintJobL] begin");
+
+ TInt err = KErrInvalidSequence;
+ if( iPrintingJob && iPrintingJob->JobState() == CPrintJob::EStateCreated )
+ {
+ // We try to find the Device specified in our list.
+ CRsBtDevice* device = static_cast<CRsBtDevice*>(User::LeaveIfNull(
+ FindDevice(iPrintingJob->PrinterId())));
+
+ LOG1("[CBtPrintingDevice::SubmitPrintJobL] iPrintingJob.iPrinterID: %d", iPrintingJob->PrinterId() );
+ // save used bluetooth profile
+ iUsedBtProfile = device->UsedProtocol();
+ if( !(device->UsedProtocol() & SupportedProtocols()) )
+ {
+ LOG("[CBtPrintingDevice::SubmitPrintJobL]\t can't select a protocol");
+ err = KErrInvalidData;
+ }
+ else
+ {
+ LOG1("[CBtPrintingDevice::SubmitPrintJobL]\t Submitting to printer \"%S\"", &(device->FriendlyName()));
+ iState = EJobProgress;
+
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+ iPendingCount = 0;
+ iProggress = 0;
+
+ TRAP(err, iPrinterController->CreateJobL(*device, *iPrintingJob) );
+ LOG1("[CBtPrintingDevice::SubmitPrintJobL]\t CreateJobL leaves with %d", err);
+ if(KErrNone == err)
+ {
+ device->SetUsed(ETrue);
+ iDeviceContainer->StoreL();
+
+ if( iPrintingJob->JobState() != CPrintJob::EStateSending &&
+ iPrintingJob->JobState() != CPrintJob::EStatePrinting )
+ {
+ iPrintingJob->UpdateJobState(CPrintJob::EStateSubmitted);
+ }
+
+ }
+ else
+ {
+ CreateJobResponse(KErrNotFound, err);
+ }
+ }
+ }
+ else
+ LOG("[CBtPrintingDevice::SubmitPrintJobL]\t ***Invalid Sequence***. Job state wrong or job not created");
+
+ if(KErrNone != err)
+ {
+ LOG1("[CBtPrintingDevice::SubmitPrintJobL]\t return error %d", err);
+ if (iPrintEventObserver)
+ iPrintEventObserver->PrintJobErrorEvent(err);
+ else
+ User::Leave(err);
+ }
+ LOG("[CBtPrintingDevice::SubmitPrintJobL] end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CancelPrintJob
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::CancelPrintJob()
+{
+ LOG("[CBtPrintingDevice::CancelPrintJob]\t begin");
+ TInt retVal( KErrInvalidSequence );
+
+ LOG1("[CBtPrintingDevice::CancelPrintJob]\t iPrintingJob: %d", iPrintingJob);
+
+ if(iPrintingJob)
+ {
+ retVal = KErrNone;
+
+ LOG1("[CBtPrintingDevice::CancelPrintJob]\t iPrintingJob->JobState(): %d", iPrintingJob->JobState());
+ if(iPrintingJob->JobState() == CPrintJob::EStateCancel)
+ {
+ LOG("[CBtPrintingDevice::CancelPrintJob]\t Already cancelling. Return.");
+ retVal = KErrCancel;
+ }
+ else if( iPrintingJob->JobState() == CPrintJob::EStateSubmitted ||
+ iPrintingJob->JobState() == CPrintJob::EStateSending ||
+ iPrintingJob->JobState() == CPrintJob::EStatePrinting )
+ {
+ // cancel job
+ TInt leave; // for remove compiling errors
+ TRAP(leave, CancelJobL());
+ if( leave == KErrDisconnected )
+ {
+ LOG("[CBtPrintingDevice::CancelPrintJob]\t calling OPPJobRollBack...");
+ OPPJobRollBack();
+ }
+ LOG1("[CBtPrintingDevice::CancelPrintJob]\t CancelJobL() leaves with %d.", leave);
+ }
+ else
+ {
+ LOG1("[CBtPrintingDevice::CancelPrintJob]\t No print job, just cancel all (forced stop) if connections exist: %d", iPrinterController->IsConnected());
+ FinishPrinting( KErrInvalidSequence );
+
+ }
+ }
+
+ if( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobProgressEvent( EDone, iPrinterController->GetPercentSent(), ECancelling );
+ }
+
+ LOG1("CBtPrintingDevice::CancelPrintJob end with: %d", retVal);
+ return retVal;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::OPPJobRollBack
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::OPPJobRollBack()
+{
+ LOG("[CBtPrintingDevice::OPPJobRollBack ]\t begin");
+
+ Cancel();
+ TInt err = KErrNone;
+ iState = EFinish;
+ TRequestStatus* tmpStatus = &iStatus;
+ User::RequestComplete( tmpStatus, err );
+ SetActive();
+
+ LOG("[CBtPrintingDevice::OPPJobRollBack ]\t end");
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::ContinuePrintJobL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::ContinuePrintJobL()
+{
+ LOG1("CBtPrintingDevice::ContinuePrintJobL returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetNumPrintPages
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetNumPrintPages()
+{
+ LOG("[CBtPrintingDevice::GetNumPrintPages]\t");
+
+ if( iPrintingJob )
+ return iPrintingJob->Sheets();
+ else
+ return KErrInvalidSequence;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetPrintJobStatus
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetPrintJobStatus()
+{
+ LOG1("CBtPrintingDevice::GetPrintJobStatus returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetPrinterStatus
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetPrinterStatus(TInt /*aDeviceID*/)
+{
+ LOG1("CBtPrintingDevice::GetPrinterStatus returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetDeviceCapabilityIDsL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetDeviceCapabilityIDsL(TInt aDeviceID, RArray<TInt>& aCapabilityIDs)
+{
+ LOG1("[CBtPrintingDevice::GetDeviceCapabilityIDsL]\t begins with aDeviceID: %d", aDeviceID);
+
+ TInt err = KErrNone;
+ aCapabilityIDs.Reset();
+
+ CRsBtDevice *printer = FindDevice( aDeviceID );
+ if( printer == NULL )
+ {
+ LOG("[CBtPrintingDevice::GetDeviceCapabilityIDsL]\t no device found, returning error");
+ return KErrInvalidData;
+ }
+
+ GetCapabilities(*printer);
+
+ printer->GetCapabilityIDs(aCapabilityIDs);
+
+ LOG1("[CBtPrintingDevice::GetDeviceCapabilityIDsL]\t ends with err: %d", err);
+ return err;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetDeviceCapabilityL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetDeviceCapabilityL(TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability)
+{
+ LOG1("CBtPrintingDevice::GetDeviceCapabilityL begins with aDeviceID: %d", aDeviceID);
+ LOG1("CBtPrintingDevice::GetDeviceCapabilityL begins with aCapabilityID: %d", aCapabilityID);
+
+ TInt err = KErrNone;
+
+ CRsBtDevice* printer = FindDevice(aDeviceID);
+ if( printer )
+ {
+ printer->GetCapability(aCapabilityID, aCapability);
+ }
+ else
+ {
+ err = KErrInvalidData;
+ }
+ LOG1("CBtPrintingDevice::GetDeviceCapabilityL ends with err: %d", err);
+ return err;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetJobSetting
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetJobSetting(TInt aCapabilityID, TInt& aValue)
+{
+ LOG1("CBtPrintingDevice::GetJobSetting begins with aCapabilityID: %d", aCapabilityID);
+
+ TInt res = KErrInvalidSequence;
+ aValue = KErrNotFound;
+
+ if(iPrintingJob)
+ res = iPrintingJob->GetPrintSetting(aCapabilityID, aValue);
+
+ return res;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::SetJobSettingL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
+ {
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t begins with aCapabilityID: %d", aCapabilityID);
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t begins with aValue: %d", aValue);
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t begins with aAffectedCapability: %d", aAffectedCapability);
+
+ if( !iPrintingJob || iPrintingJob->JobState() == CPrintJob::EStateNone )
+ {
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t iPrintingJob: %d || job state == EJobStateNone; return KErrInvalidSequence", iPrintingJob);
+ return KErrInvalidSequence;
+ }
+
+ aAffectedCapability = 0;
+
+ // Get the Target printer and capability
+ CRsBtDevice* printer = FindDevice( iPrintingJob->PrinterId() );
+ if( printer == NULL )
+ {
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t printer == NULL; return %d", KErrInvalidData);
+ return KErrInvalidData;
+ }
+
+ TInt res = printer->SetDefaultCapability(aCapabilityID, aValue);
+ if(KErrNone == res)
+ {
+ iPrintingJob->SetPrintSetting(aCapabilityID, aValue);
+ aAffectedCapability = aCapabilityID;
+ TRAPD(err, iDeviceContainer->StoreL());
+ if(KErrNone != err)
+ {
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t Storing fails: %d", err);
+ }
+ }
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t ends. aAffectedCapability: %d", aAffectedCapability);
+ return res;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetNumPreviewPages
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetNumPreviewPages()
+{
+ LOG1("CBtPrintingDevice::GetNumPreviewPages ends with: %d", 1);
+ return 1;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetJobTemplateIconL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::GetJobTemplateIconL(TInt /*aTemplateID*/, TInt& /*aFsBitmapHandle*/)
+{
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CreatePreviewImage
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::CreatePreviewImage(TInt /*aPageNumber*/)
+{
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CreateJobResponse
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::CreateJobResponse( TInt aJobId, TInt aErrorCode )
+{
+ LOG2("[CBtPrintingDevice::CreateJobResponse]\t iState: %d, Error: %d", iState, aErrorCode);
+
+ ResetTimer();
+
+ if (ECancelJob == iState)
+ {
+ LOG2("[CBtPrintingDevice::CreateJobResponse]\t wrong sequence: iState: %d, iPrintingJob->JobState(): %d", iState, iPrintingJob->JobState());
+ return;
+ }
+
+ if(KErrNone != aErrorCode)
+ {
+ LOG1("[CBtPrintingDevice::CreateJobResponse]\t error occured: %d. Finish.", aErrorCode);
+ ManagePrintingState(KErrNotFound, EBtStateAborted, EBtStateIdle, KErrNone, aErrorCode);
+ return;
+ }
+
+ iPrintingJob->SetJobId(aJobId);
+
+ iState = EJobProgress;
+
+ LOG( "[CBtPrintingDevice]\t ******");
+ LOG1("[CBtPrintingDevice]\t -Printing started with job id: * %2d", aJobId);
+ LOG( "[CBtPrintingDevice]\t ******");
+
+ // Printing started - restart timer
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CancelJobResponse
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::CancelJobResponse(TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::CancelJobResponse]\t Error: %d", aErrorCode);
+ ManagePrintingState(iPrintingJob->JobId(), EBtStateCancelled, EBtStateIdle, KErrNone, aErrorCode);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetPrinterStateResponse
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetPrinterStateResponse(TInt aState, TInt aStateReasons,
+ TInt aOperationStatus, TInt aDeviceId)
+{
+ LOG2("[CBtPrintingDevice::GetPrinterStateResponse]\t iState: %d, Error: %d", iState, aOperationStatus);
+
+ if(EGetPrinterState != iState)
+ return;
+
+ Deactivate();
+
+ CRsBtDevice* printer = FindDevice( aDeviceId );
+ if(!printer)
+ {
+ LOG("[CBtPrintingDevice::GetPrinterStateResponse]\t panic PANIC panic: printer not found");
+ return;
+ }
+
+ LOG2("[CBtPrintingDevice::GetPrinterStateResponse] Printer state: %d - %d", aState, aOperationStatus);
+ if(KErrNone != aOperationStatus)
+ {
+ // handle operation status in ManagePrintingState as a printer state
+ aState = EBtStateStopped;
+ aStateReasons = aOperationStatus;
+ }
+
+ if(EBtStateStopped == aState)
+ {
+ ManagePrintingState(KErrNotFound, EBtStateUnknown, aState, aStateReasons, aOperationStatus);
+ return;
+ }
+ else if (EBtStateIdle == aState)
+ {
+ // maybe we cannot touch to iState: it maybe set to somethin on purpose...
+ //iState = EReady;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetEventResponse
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetEventResponse(TInt aJobId, TInt aJobState, TInt aPrinterState,
+ TInt aStateReasons, TInt aOperationStatus)
+{
+ LOG("[CBtPrintingDevice::GetEventResponse]\t");
+
+ ManagePrintingState(aJobId, aJobState, aPrinterState, aStateReasons, aOperationStatus);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetJobAttributesResponse
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetJobAttributesResponse( TInt aJobState,
+ const TDesC8& aJobName,
+ const TDesC8& /*aOriginator*/,
+ TInt aSheetsCompleted,
+ TInt aPendingJobs,
+ TInt aOperationStatus )
+{
+
+ LOG1("[CBtPrintingDevice::GetJobAttributesResponse]\t iState: %d", iState);
+ LOG2("[CBtPrintingDevice::GetJobAttributesResponse]\t aOperationStatus: %d / 0x%X", aOperationStatus, aOperationStatus);
+ LOG2("[CBtPrintingDevice::GetJobAttributesResponse]\t aJobState: %d aSheetsCompleted: %d", aJobState, aSheetsCompleted);
+ LOG82("[CBtPrintingDevice::GetJobAttributesResponse]\t aPendingJobs: %d aJobName: %S", aPendingJobs, &aJobName);
+
+ if(EFinish == iState)
+ {
+ LOG("[CBtPrintingDevice::GetJobAttributesResponse]\t Finishing... return.");
+ return;
+ }
+
+ if(KErrNone == aOperationStatus)
+ {
+ LOG("[CBtPrintingDevice::GetJobAttributesResponse]\t aOperationStatus OK");
+
+ if(0 < aPendingJobs)
+ {
+ LOG1("[CBtPrintingDevice::GetJobAttributesResponse]\t pending: %d", aPendingJobs);
+ aJobState = EBtStateWaiting;
+ }
+ else if(iPrintingJob->Sheets() == aSheetsCompleted)
+ {
+ LOG("[CBtPrintingDevice::GetJobAttributesResponse]\t Job Completed.");
+ aJobState = EBtStateCompleted;
+
+ if(CPrintJob::EStateCancel == iPrintingJob->JobState())
+ iPrintingJob->UpdateJobState(CPrintJob::EStatePrinting);
+ }
+ else if(KPendingLimit == iPendingCount)
+ {
+ LOG1("[CBtPrintingDevice::GetJobAttributesResponse]\t timeout. pending too long: %d", iPendingCount);
+ aOperationStatus = EPbCheckPrinter;
+ }
+ else if (aJobState == EBtStateStopped || aJobState == EBtStateAborted || aJobState == EBtStateUnknown || aJobState == EBtStateWaiting || aJobState == EBtStateCompleted)
+ {
+ Deactivate();
+
+ LOG1("[CBtPrintingDevice::GetJobAttributesResponse]\t aJobState NOK: %d. Get printer attributes", aJobState);
+ TRequestStatus* tmpStatus = &iStatus;
+ iState = EGetPrinterState;
+ User::RequestComplete(tmpStatus, KErrNone);
+
+ SetActive();
+ return;
+ }
+ else
+ {
+ iState = EGetJobAttributes;
+ aJobState = EBtStatePrinting;
+ }
+ }
+
+ ManagePrintingState(iPrintingJob->JobId(), aJobState, EBtStatePrinting, ENoMessage, aOperationStatus);
+
+ return;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::FindDevice
+//
+//--------------------------------------------------------------------------------------------
+CRsBtDevice* CBtPrintingDevice::FindDevice(TInt aDeviceID)
+{
+ LOG1("[CBtPrintingDevice::FindDevice] begins with aDeviceID: %d", aDeviceID);
+ TInt pos = iDeviceContainer->Find(aDeviceID);
+ if(KErrNotFound != pos)
+ {
+ return iDeviceContainer->At(pos);
+ }
+ LOG("[CBtPrintingDevice::FindDevice] device NOT found");
+ return NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::SetNumsOfCopiesL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr )
+ {
+ LOG1("[CBtPrintingDevice::SetNumsOfCopiesL]\t iPrintingJob->JobState(): %d", iPrintingJob->JobState());
+
+ if( !iPrintingJob || iPrintingJob->JobState() != CPrintJob::EStateCreated )
+ {
+ aErr = KErrInvalidSequence;
+ return;
+ }
+
+ LOG2("[CBtPrintingDevice::SetNumsOfCopiesL]\t ImageCount(): %d, copies count: %d ",
+ iPrintingJob->ImageCount(), aNumsOfCopies.Count());
+ if( iPrintingJob->ImageCount() != aNumsOfCopies.Count() )
+ {
+ aErr = KErrInvalidData;
+ return;
+ }
+
+ aErr = iPrintingJob->SetNumsOfCopies(aNumsOfCopies);
+ LOG1("CBtPrintingDevice::SetNumsOfCopiesL aErr: %d", aErr);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::InitJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::InitJobL(CRsBtDevice *aPrinter, RPointerArray<TDesC>& aImages)
+{
+ LOG("[CBtPrintingDevice::InitJobL]");
+
+ if (iPrintingJob)
+ {
+ delete iPrintingJob;
+ iPrintingJob = NULL;
+ }
+
+ // Change format of file list
+ RArray<TFileName> imageList;
+ CleanupClosePushL(imageList);
+ for (TInt i=0; i < aImages.Count(); i++)
+ {
+ LOG1("[InitJobL]\t %S", aImages[i]);
+ imageList.Append( *(aImages[i]) );
+ }
+
+ // Get local BT name
+ TBuf8<0x100> name;
+ GetLocalBTNameL(name);
+
+ // Create job object
+ iPrintingJob = CPrintJob::NewL(aPrinter, imageList, name);
+ CleanupStack::PopAndDestroy(&imageList);
+
+ RArray<TInt> capabIDs;
+ CleanupClosePushL(capabIDs);
+ aPrinter ->GetCapabilityIDs(capabIDs);
+
+ for(TInt i = 0; i < capabIDs.Count(); ++i)
+ {
+ TPrintCapability capab;
+ aPrinter->GetCapability(capabIDs[i], capab);
+ iPrintingJob->SetPrintSetting(capabIDs[i], capab.iDefaultValue);
+ }
+ CleanupStack::PopAndDestroy(&capabIDs);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetCapabilities
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetCapabilities(CRsBtDevice& aPrinter, TBool aForcedGet)
+ {
+ // gets printer capabilities. If cannot get, sets defaults.
+ LOG1("[CBtPrintingDevice::GetCapabilities] already found %d", aPrinter.CapabilityCount());
+
+ // Capabilities already got
+ if (0 < aPrinter.CapabilityCount() && !aForcedGet )
+ return;
+
+ TDeviceState tmpState = iState;
+ iPendingCount = 0;
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+
+ /*Get printer's capabilities*/
+ TRAPD(leave, iPrinterController->GetCapabilitiesL(aPrinter) );
+ LOG1("[CBtPrintingDevice::GetCapabilities] GetCapabilitiesL leaves with %d", leave);
+
+ if ( ( leave == KErrNotFound && aPrinter.UsedProtocol() == KImagePrint_PrinterProtocol_BPP ) ||
+ ( leave == KErrArgument && aPrinter.UsedProtocol() == KImagePrint_PrinterProtocol_BPP ) )
+ {
+ LOG( "Capabilities not received from BPP Printer - Thus Force OPP ON to avoid problems ");
+ LOG( "This case indicates that there is possible problem in the BPP printer. ");
+ aPrinter.SetUsedProtocol( KImagePrint_PrinterProtocol_OPP_Printer );
+ aPrinter.SetSupportedProtocols( KImagePrint_PrinterProtocol_OPP_Printer );
+ iUsedBtProfile = KImagePrint_PrinterProtocol_OPP_Printer;
+ leave = KErrNone;
+ }
+ ResetTimer();
+ iPendingCount = 0;
+ iState = tmpState;
+
+ if(KErrNone != leave)
+ {
+ // cleanup connections
+ Cancel();
+ iPrinterController->Stop();
+
+ RArray<TPrintCapability> c;
+ GetDefaultCapabilities(c);
+ for (TInt i = 0; i < c.Count(); ++i)
+ {
+ aPrinter.AddCapability(c[i]);
+ }
+ c.Close();
+ }
+ else
+ {
+ // store connected printer
+ aPrinter.SetUsed(ETrue);
+ // If this fails, no can do. Continue.
+ TRAP_IGNORE( iDeviceContainer->StoreL() );
+ }
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetDefaultCapabilities
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetDefaultCapabilities(RArray<TPrintCapability>& aCapabilities)
+{
+ // Layout
+ TPrintCapability layout;
+ layout.iCapabilityID = EPrintCapabLayout;
+ layout.iType = TPrintCapability::Enum;
+ layout.iDefaultValue = EPrintCapabLayout1Up;
+ layout.iLow = 0;
+ layout.iHigh = 0;
+ layout.iEnumCodes[0] = layout.iDefaultValue;
+ layout.iEnumCount = 1;
+
+ // Quality
+ TPrintCapability quality;
+ quality.iCapabilityID = EPrintCapabQuality;
+ quality.iType = TPrintCapability::Enum;
+ quality.iDefaultValue = EPrintCapabQualityDefault;
+ quality.iLow = 0;
+ quality.iHigh = 0;
+ quality.iEnumCodes[0] = quality.iDefaultValue;
+ quality.iEnumCount = 1;
+
+ // Paper size
+ TPrintCapability paper;
+ paper.iCapabilityID = EPrintCapabPaperSize;
+ paper.iType = TPrintCapability::Enum;
+ paper.iDefaultValue = EPrintCapabPaperSizeAuto;
+ paper.iLow = 0;
+ paper.iHigh = 0;
+ paper.iEnumCodes[0] = paper.iDefaultValue;
+ paper.iEnumCount = 1;
+
+ aCapabilities.Append(layout);
+ aCapabilities.Append(quality);
+ aCapabilities.Append(paper);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::FoundDevice
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::FoundDeviceL(CRsBtDevice& aDevice)
+{
+ LOG2("[CBtPrintingDevice::FoundDeviceL]\t protocol: %d, DeviceId: %d", aDevice.UsedProtocol(), aDevice.DeviceId());
+
+ TBool inform = EFalse;
+
+ if( aDevice.UsedProtocol() == KImagePrint_PrinterProtocol_BPP )
+ {
+ inform = ETrue;
+ }
+ else if( aDevice.UsedProtocol() == KImagePrint_PrinterProtocol_OPP_Printer )
+ {
+ inform = ETrue;
+ }
+ else if( aDevice.UsedProtocol() == KImagePrint_PrinterProtocol_OPP_PC )
+ {
+ inform = ETrue;
+ }
+ else
+ {
+ // avoid lint error
+ inform = EFalse;
+ }
+
+
+ if( iDiscoveryObserver && inform)
+ {
+ TPrinter printer = aDevice.ToTPrinter();
+ iDiscoveryObserver->FoundDeviceL( printer );
+ LOG("[CBtPrintingDevice::FoundDeviceL] observer informed");
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::AddBtDeviceL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::AddBtDeviceL(CRsBtDevice& aDevice)
+{
+
+ LOG("[CBtPrintingDevice::AddBtDeviceL]\t");
+
+ CRsBtDevice* device = NULL;
+
+ TInt pos = iDeviceContainer->Find(aDevice);
+ LOG1("[CBtPrintingDevice::AddBtDeviceL]\t pos: %d", pos);
+ if(KErrNotFound != pos)
+ {
+ LOG("[CBtPrintingDevice::AddBtDeviceL]\t device exists");
+ device = iDeviceContainer->At(pos);
+ // create TPrinter of old device for informing of update
+ TPrinter oldPrinter = device->ToTPrinter();
+
+ // update existing
+ TBool modified = device->UpdateUsedL(aDevice);
+ device->SetJustFound(ETrue);
+
+ // Be sure the if updated device is updated in observer
+ if( iDiscoveryObserver && modified)
+ {
+ iDiscoveryObserver->RemoveDeviceL( oldPrinter );
+ LOG1("[CBtPrintingDevice::FoundDeviceL] observer informed: remove \"%S\"", &oldPrinter.iDisplayName);
+ TPrinter printer = device->ToTPrinter();
+ iDiscoveryObserver->FoundDeviceL( printer );
+ LOG1("[CBtPrintingDevice::FoundDeviceL] observer informed: found \"%S\"", &printer.iDisplayName);
+ }
+
+ return KErrNone;
+ }
+
+ device = CRsBtDevice::NewL(aDevice);
+ LOG1("[CBtPrintingDevice::AddBtDeviceL]\t newDevice address: %d", (TInt)device);
+
+ device->SetUsed(EFalse);
+ device->SetDisappeared(EFalse);
+ device->ComposeUsedProtocol(iRequestedProtocols);
+
+ LOG1("[CBtPrintingDevice::AddBtDeviceL]\t usedProtocol: %d", device->UsedProtocol());
+
+ iDeviceContainer->AppendL(device);
+
+ LOG("[CBtPrintingDevice::AddBtDeviceL]\t preparing info for observer");
+
+ FoundDeviceL( *device );
+ return KErrNone;
+}
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetUsedDevicesL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetUsedDevicesL()
+{
+ LOG("[CBtPrintingDevice::GetUsedDevicesL]\t");
+ iDeviceContainer->RestoreL();
+
+ LOG1("[CBtPrintingDevice::GetUsedDevicesL]\t found %d devices.", iDeviceContainer->Count());
+ for(TInt i = 0; i < iDeviceContainer->Count(); ++i)
+ {
+ iDeviceContainer->At(i)->ComposeUsedProtocol(iRequestedProtocols);
+ FoundDeviceL( *(iDeviceContainer->At(i)) );
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::FinishPrinting
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::FinishPrinting(TInt aErrorCode)
+{
+ LOG("[CBtPrintingDevice::FinishPrinting]\t ");
+
+ iState = EFinish;
+
+ LOG("[CBtPrintingDevice::FinishPrinting]\t -Reset timer");
+ Deactivate();
+
+ LOG("[CBtPrintingDevice::FinishPrinting]\t -Init ids");
+ iPendingCount = KPendingLimit;
+
+ // if error occures when geting capabilities, the job not created yet.
+ if(iPrintingJob)
+ {
+ //Cancel job. if leaves, there is no chance to cancel the job -> continue
+ //else return, the timeout or cancel job response will complete finish
+ TRAPD(leave, CancelJobL());
+ if(KErrNone != leave)
+ LOG1("[CBtPrintingDevice::FinishPrinting]\t -CancelJobL() leaves with %d", leave);
+ else
+ return;
+
+ iPrintingJob->UpdateJobState(CPrintJob::EStateCreated);
+ }
+
+ LOG1("[CBtPrintingDevice::FinishPrinting]\t FinishPrinting: state=%d", iState);
+
+ // Inform controller
+ iPrinterController->FinishPrinting();
+
+ if(KErrNone != aErrorCode)
+ {
+ if (iPrintEventObserver)
+ iPrintEventObserver->PrintJobErrorEvent(aErrorCode);
+ }
+
+ iState = EReady;
+ LOG("[CBtPrintingDevice::FinishPrinting]\t -out");
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::DeviceDiscovered
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::DeviceDiscovered( CRsBtDevice& aDevice )
+{
+ LOG("[CBtPrintingDevice::DeviceDiscovered]\t");
+ TInt err; // for remove compiling errors
+ TRAP(err, AddBtDeviceL(aDevice));
+ LOG1("[CBtPrintingDevice::DeviceDiscovered]\t Device added with leave: %d", err);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::DeviceDisappeared
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::DeviceDisappeared( CRsBtDevice& aDevice )
+{
+ LOG("[CBtPrintingDevice::DeviceDisappeared]\t");
+
+ CRsBtDevice* device = FindDevice(aDevice.DeviceId());
+ if(!device)
+ {
+ LOG("[CBtPrintingDevice::DeviceDisappeared]\t Device not found. Return.");
+ return;
+ }
+
+ TPrinter printer = device->ToTPrinter();
+ LOG1("[CBtPrintingDevice::DeviceDisappeared]\t printer.iDisplayName: %S", &(printer.iDisplayName));
+ device->SetDisappeared(ETrue);
+
+ // Ignore leave; the call back
+ TRAP_IGNORE(iDiscoveryObserver->RemoveDeviceL(printer));
+
+ LOG("[CBtPrintingDevice::DeviceDisappeared]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::ResetTimer
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::ResetTimer()
+{
+ LOG("[CBtPrintingDevice::ResetTimer]\t");
+
+ if(iPrinterTimer)
+ {
+ if(iPrinterTimer->IsActive())
+ iPrinterTimer->Cancel();
+ }
+ iPendingCount = 0;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::StartTimer
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::StartTimer(TTimeIntervalMicroSeconds32 aDelay,
+ TTimeIntervalMicroSeconds32 anInterval,
+ TCallBack aCallBack)
+{
+ LOG("[CBtPrintingDevice::StartTimer]\t");
+
+ ResetTimer();
+
+ iPrinterTimer->Start(aDelay, anInterval, aCallBack);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::ConnectionTimeout
+//
+//--------------------------------------------------------------------------------------------
+TBool CBtPrintingDevice::HandleTimeout(TAny *aWho)
+{
+ CBtPrintingDevice *cbTarget = static_cast<CBtPrintingDevice*>(aWho);
+ return cbTarget->DoHandleTimeout();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::DoConnectionTimeout
+//
+//--------------------------------------------------------------------------------------------
+TBool CBtPrintingDevice::DoHandleTimeout()
+{
+ LOG1("[CBtPrintingDevice::DoHandleTimeout]\t iState: %d", iState);
+
+ TInt err = KErrTimedOut;
+ if(iUsedBtProfile != KImagePrint_PrinterProtocol_OPP_Printer)
+ {
+ if(KPendingLimit > iPendingCount)
+ {
+ ++iPendingCount;
+ LOG1("[CBtPrintingDevice::DoHandleTimeout]\t pending: %d", iPendingCount);
+
+ //Continue waiting...
+ return ETrue;
+ }
+
+ // when timeout occures during printing, try anyway get printer state
+ if(KPendingLimit == iPendingCount && EJobProgress == iState)
+ {
+ err = KErrNone;
+ iState = EGetJobAttributes;
+ --iPendingCount;
+ }
+ }
+ else
+ {
+
+ if(KOppPendingLimit > iPendingCount)
+ {
+ ++iPendingCount;
+ LOG1("[CBtPrintingDevice::DoHandleTimeout]\t opp print pending: %d", iPendingCount);
+
+ //Continue waiting...
+ return ETrue;
+ }
+
+ // when timeout occures during printing, try anyway get printer state
+ if(KOppPendingLimit == iPendingCount && EJobProgress == iState)
+ {
+ err = KErrNone;
+ iState = EFinish;
+ --iPendingCount;
+ }
+ }
+
+ Cancel();
+
+ TRequestStatus* tmpStatus = &iStatus;
+ User::RequestComplete(tmpStatus, err);
+ SetActive();
+
+ return EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::ManagePrintingState
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::ManagePrintingState(TInt aJobId, TInt aJobState, TInt aPrinterState,
+ TInt aStateReasons, TInt aOperationStatus)
+{
+ LOG1("[CBtPrintingDevice::ManagePrintingState]\t begin: iState: %d", iState);
+ LOG2("[CBtPrintingDevice::ManagePrintingState]\t aOperationStatus: %d / 0x%X", aOperationStatus, aOperationStatus);
+ LOG2("[CBtPrintingDevice::ManagePrintingState]\t jobId: %d state: %d", aJobId, aJobState);
+ LOG2("[CBtPrintingDevice::ManagePrintingState]\t aPrinterState: %d aStateReasons: %d", aPrinterState, aStateReasons);
+
+ // already stopping, cancelling or idle... No reason to continue
+ if( EFinish == iState || EReady == iState )
+ return;
+
+ Deactivate();
+ TInt percents = 0;
+
+ // Always inform anyway. No matter the state.
+ // First the error cases:
+ TInt err = KErrNone;
+
+ // Set tmpState
+ TDeviceState tmpState = EFinish;
+
+ if(KErrNone != aOperationStatus)
+ {
+ // if cancelling, ignore errors
+ if(ECancelJob == iState && KErrDisconnected == aOperationStatus)
+ return;
+
+ err = aOperationStatus;
+ }
+ else if(EBtStateStopped == aPrinterState)
+ {
+ LOG("[CBtPrintingDevice::ManagePrintingState] Printer state stopped.");
+ if(iPrintEventObserver)
+ iPrintEventObserver->PrinterStatusEvent(aStateReasons, KErrNone);
+
+ // Mustn't give error here:
+ // inform via PrinterStatusEvent not at FinishPrinting via PrintJobErrorEvent
+ err = KErrNone;
+ }
+ else
+ {
+ switch (aJobState)
+ {
+ case EBtStateUnknown:
+ case EBtStateStopped:
+ case EBtStateAborted:
+ err = aStateReasons;
+ break;
+ case EBtStateWaiting:
+ LOG("[CBtPrintingDevice::ManagePrintingState]\t Waiting. Cancel.");
+ // Don't care if cancel fails: no can do anyway.
+ CancelPrintJob();
+ err = EPbStatusErrorReasonHardwarePrinterBusy;
+ break;
+ case EBtStateCompleted:
+ LOG("[CBtPrintingDevice::ManagePrintingState]\t Completed.");
+ LOG1("[CBtPrintingDevice::ManagePrintingState]\t iPrinting->JobState: %d", iPrintingJob->JobState());
+
+ if(CPrintJob::EStatePrinting == iPrintingJob->JobState() ||
+ CPrintJob::EStateSending == iPrintingJob->JobState())
+ {
+ if(iPrintEventObserver)
+ iPrintEventObserver->PrintJobProgressEvent(EDone, 100, ENoMessage);
+ }
+
+ else
+ {
+ err = EObexSendError;
+ }
+
+ iPrintingJob->UpdateJobState(CPrintJob::EStateCreated);
+ break;
+ case EBtStateCancelled:
+ LOG("[CBtPrintingDevice::ManagePrintingState]\t Cancelled");
+
+ // If Bt print is cancelled by Image Print, show error "Check status of Printer"
+ err = EPbStatusErrorReasonNoReason;
+ break;
+ // continue cases
+ case EBtStatePrinting:
+ iPrintingJob->UpdateJobState(CPrintJob::EStatePrinting);
+ percents = UpdateProggress();
+ LOG1("[CBtPrintingDevice::ManagePrintingState]\t Printing proggress %d", percents);
+
+ if(iPrintEventObserver)
+ iPrintEventObserver->PrintJobProgressEvent(EActive, percents, EPrinting);
+
+ tmpState = EGetJobAttributes;
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+ break;
+ case EBtStateSending:
+ iPrintingJob->UpdateJobState(CPrintJob::EStateSending);
+ percents = UpdateProggress();
+ LOG1("[CBtPrintingDevice::ManagePrintingState]\t Sending proggress %d", percents);
+
+ if(iPrintEventObserver)
+ iPrintEventObserver->PrintJobProgressEvent(EActive, percents, ECopying);
+
+ tmpState = EJobProgress;
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+ return;
+ default:
+ tmpState = iState;
+ break;
+ }
+ }
+
+ iPrintError = err;
+
+ TRequestStatus* tmpStatus = &iStatus;
+ iState = tmpState;
+ User::RequestComplete(tmpStatus, err);
+
+ SetActive();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetJobAttributesL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetJobAttributesL()
+{
+ LOG1("[CBtPrintingDevice::GetJobAttributesL]\t begin: iState: %d", iState);
+
+ CRsBtDevice* printer = static_cast<CRsBtDevice*>(User::LeaveIfNull(
+ FindDevice(iPrintingJob->PrinterId())));
+
+ iPrinterController->GetJobAttributesL(*printer, iPrintingJob->JobId());
+ iState = EGetJobAttributes;
+
+ LOG("[CBtPrintingDevice::GetJobAttributesL]\t out");
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetPrinterAttributesL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetPrinterStateL()
+{
+ LOG1("[CBtPrintingDevice::GetPrinterAttributesL]\t begin: iState: %d", iState);
+
+ CRsBtDevice* printer = static_cast<CRsBtDevice*>(User::LeaveIfNull(
+ FindDevice(iPrintingJob->PrinterId())));
+
+ iPrinterController->GetPrinterStateL(*printer);
+ iState = EGetPrinterState;
+
+ LOG("[CBtPrintingDevice::GetPrinterAttributesL]\t out");
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CancelJobL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::CancelJobL()
+{
+ LOG1("[CBtPrintingDevice::CancelJobL]\t begin at iPrintingJob->JobState(): %d", iPrintingJob->JobState());
+
+ // If not submitted, return
+ if( !iPrintingJob ||
+ (CPrintJob::EStateSubmitted != iPrintingJob->JobState() &&
+ CPrintJob::EStateSending != iPrintingJob->JobState() &&
+ CPrintJob::EStatePrinting != iPrintingJob->JobState()) )
+ User::Leave(KErrInvalidSequence);
+
+ CRsBtDevice* printer = static_cast<CRsBtDevice*>(User::LeaveIfNull(
+ FindDevice(iPrintingJob->PrinterId())));
+
+ iPrintingJob->UpdateJobState(CPrintJob::EStateCancel);
+
+ iPrinterController->CancelJobL(*printer, iPrintingJob->JobId());
+ iState = ECancelJob;
+
+ TRequestStatus* tmpStatus = &iStatus;
+ User::RequestComplete(tmpStatus, KErrNone);
+ SetActive();
+
+ LOG("[CBtPrintingDevice::CancelJobL]\t out");
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(HandleTimeout, this) );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::CheckProggress
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtPrintingDevice::UpdateProggress()
+{
+ TInt percents = iPrinterController->GetPercentSent();
+
+ if(iProggress != percents && 0 != percents)
+ {
+ iProggress = percents;
+ iPendingCount = 0;
+ }
+
+ // don't return 100% until the job is reported to be completed.
+ // that way also the physical printing is included in percents.
+ if(95 < iProggress)
+ return 95;
+ else
+ return iProggress;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::GetLocalBTNameL
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::GetLocalBTNameL(TDes8& aName)
+{
+ RsUtils::GetLocalBTNameL(aName);
+ LOG81("[CBtPrintingDevice::GetLocalBTNameL]\t GetLocalBTNameL(%S)", &aName);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtPrintingDevice::OPPSendProgress
+//
+//--------------------------------------------------------------------------------------------
+void CBtPrintingDevice::OPPSendProgress( TInt aProgress )
+ {
+ if(iPrintEventObserver)
+ {
+ // If sendind is finished ( Bytes sent == Job size) it's OK to remove progress bar.
+ if (aProgress == 100)
+ {
+ iPrintEventObserver->PrintJobProgressEvent(EDone, 100, ENoMessage);
+ }
+ else
+ {
+ // If sending is in progress update progress bar.
+ iPrintEventObserver->PrintJobProgressEvent(EActive, aProgress, EPrinting);
+ }
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtsdpadvertiser.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* 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:
+*
+*/
+
+
+#include <bt_sock.h>
+#include <StringLoader.h>
+
+#include "cbtsdpadvertiser.h"
+#include "clog.h"
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::CBtSdpAdvertiser()
+// Constructor.
+// ----------------------------------------------------------------------------
+//
+CBtSdpAdvertiser::CBtSdpAdvertiser()
+: iRecord( 0 ),
+ iIsConnected( EFalse )
+ {
+ // no implementation required
+ }
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::~CBtSdpAdvertiser()
+// Destructor.
+// ----------------------------------------------------------------------------
+//
+CBtSdpAdvertiser::~CBtSdpAdvertiser()
+ {
+ // If this fails there is nothing to do.
+ TRAPD( err,StopAdvertisingL() );
+ if ( err != KErrNone )
+ {
+ LOG1("[CBtSdpAdvertiser::~CBtSdpAdvertiser]\t StopAdvertisingL leaves with: %d", err);
+ }
+ iSdpDatabase.Close();
+ iSdpSession.Close();
+
+ LOG("[CBtSdpAdvertiser::~CBtSdpAdvertiser]\t done");
+ }
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::ConnectL()
+// Connect to the SDP database.
+// ----------------------------------------------------------------------------
+//
+void CBtSdpAdvertiser::ConnectL()
+ {
+ if ( !iIsConnected )
+ {
+ User::LeaveIfError( iSdpSession.Connect() );
+ User::LeaveIfError( iSdpDatabase.Open( iSdpSession ) );
+ iIsConnected = ETrue;
+ }
+ LOG1("[CBtSdpAdvertiser::ConnectL]\t iIsConnected: %d", iIsConnected);
+ }
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::StartAdvertisingL()
+// Start the advertising of this service.
+// ----------------------------------------------------------------------------
+//
+void CBtSdpAdvertiser::StartAdvertisingL( TInt aPort )
+ {
+ // could be advertising on a different port
+ StopAdvertisingL();
+
+ if ( !iIsConnected )
+ {
+ ConnectL();
+ }
+ iSdpDatabase.CreateServiceRecordL( ServiceClass(), iRecord );
+
+ LOG1("[CBtSdpAdvertiser::StartAdvertisingL]\t iRecord: %d", iRecord);
+
+ // add a Protocol to the record
+ CSdpAttrValueDES* vProtocolDescriptor = CSdpAttrValueDES::NewDESL( NULL );
+ CleanupStack::PushL( vProtocolDescriptor );
+
+ BuildProtocolDescriptionL( vProtocolDescriptor,aPort );
+
+ iSdpDatabase.UpdateAttributeL( iRecord, KSdpAttrIdProtocolDescriptorList,
+ *vProtocolDescriptor );
+
+ CleanupStack::PopAndDestroy( vProtocolDescriptor );
+
+ // Add a name to the record
+ iSdpDatabase.UpdateAttributeL( iRecord,
+ KSdpAttrIdBasePrimaryLanguage +
+ KSdpAttrIdOffsetServiceName,
+ ServiceName() );
+
+ // Add a description to the record
+ iSdpDatabase.UpdateAttributeL( iRecord,
+ KSdpAttrIdBasePrimaryLanguage +
+ KSdpAttrIdOffsetServiceDescription,
+ ServiceDescription() );
+
+ LOG("[CBtSdpAdvertiser::StartAdvertisingL]\t end");
+ }
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::UpdateAvailabilityL()
+// Update the service availability field of the service record.
+// ----------------------------------------------------------------------------
+//
+void CBtSdpAdvertiser::UpdateAvailabilityL( TBool aIsAvailable )
+ {
+ LOG("[CBtSdpAdvertiser::UpdateAvailabilityL]\t ");
+ TUint state;
+ if ( aIsAvailable )
+ {
+ state = 0xFF; // Fully unused
+ }
+ else
+ {
+ state = 0x00; // Fully used -> can't connect
+ }
+
+ // Update the availibility attribute field
+ iSdpDatabase.UpdateAttributeL( iRecord,
+ KSdpAttrIdServiceAvailability, state );
+
+
+ // Mark the record as changed - by increasing its state number (version)
+ iSdpDatabase.UpdateAttributeL( iRecord,
+ KSdpAttrIdServiceRecordState, ++iRecordState );
+
+ LOG("[CBtSdpAdvertiser::UpdateAvailabilityL]\t end");
+ }
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::StopAdvertisingL()
+// Stop advertising this service. Remove the record from the sdp database.
+// ----------------------------------------------------------------------------
+//
+void CBtSdpAdvertiser::StopAdvertisingL()
+ {
+ if ( IsAdvertising() )
+ {
+ iSdpDatabase.DeleteRecordL( iRecord );
+ iRecord = 0;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CBtSdpAdvertiser::IsAdvertising()
+// Does the SDP database contain a record for this service.
+// ----------------------------------------------------------------------------
+//
+TBool CBtSdpAdvertiser::IsAdvertising()
+ {
+ LOG1("[CBtSdpAdvertiser::IsAdvertising]\t %d", iRecord != 0);
+ return iRecord != 0;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtsoapcodec.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,1377 @@
+/*
+* 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: Defines the CBtSoapCodec class to create and read SOAP-encoded messages.
+*
+*/
+
+
+#include "cxmlhandler.h"
+#include "cbtsoapcodec.h"
+#include "imageprint.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "rsutils.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::NewL
+//
+//--------------------------------------------------------------------------------------------
+CBtSoapCodec* CBtSoapCodec::NewL()
+ {
+ CBtSoapCodec *self = NewLC();
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CBtSoapCodec* CBtSoapCodec::NewLC()
+ {
+ CBtSoapCodec *self = new (ELeave) CBtSoapCodec();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::~CBtSoapCodec
+//
+//--------------------------------------------------------------------------------------------
+CBtSoapCodec::~CBtSoapCodec()
+{
+ if(iXmlHandler)
+ delete iXmlHandler;
+ iXmlHandler = NULL;
+
+ if(iActionBuffer)
+ delete iActionBuffer;
+ iActionBuffer = NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::ConstructL()
+{
+ LOG("[CBtSoapCodec::ConstructL]\t");
+ iXmlHandler = CXmlHandler::NewL();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::Reset
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::Reset()
+{
+ LOG("[CBtSoapCodec::Reset]\t");
+
+ if(iXmlHandler)
+ delete iXmlHandler;
+ iXmlHandler = NULL;
+
+ if(iActionBuffer)
+ delete iActionBuffer;
+ iActionBuffer = NULL;
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CreateSoapL
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CBtSoapCodec::CreateSoapL(const TInt aAction, const TInt aJobId)
+{
+ LOG1("[CBtSoapCodec::CreateSoapL]\t action: %d", aAction);
+ // Open the template file and read it into buffer
+
+ TPtrC8 soap(KNullDesC8);
+ TBtIntString8 jobId;
+ jobId.AppendNum(aJobId);
+
+ if(iActionBuffer)
+ delete iActionBuffer;
+ iActionBuffer = NULL;
+
+ switch(aAction)
+ {
+ case EBtCreateJob:
+ CreateJobSoapL(aJobId);
+ break;
+ case EBtGetPrinterAttributes:
+ GetPrinterAttributesSoapL();
+ break;
+ case EBtGetPrinterState:
+ GetPrinterStateSoapL();
+ break;
+ case EBtGetPrinterCapabilities:
+ GetCapabilitiesSoapL();
+ break;
+ case EBtCancelJob:
+ CancelJobSoapL(jobId);
+ break;
+ case EBtGetJobAttributes:
+ GetJobAttributesSoapL(jobId);
+ break;
+ case EBtGetEvent:
+ GetEventSoapL(jobId);
+ break;
+ default:
+ break;
+ }
+
+ TInt offset;
+ TPtrC8 ptr = iXmlHandler->GetDataL(KBtBodyStartTag, KBtBodyEndTag, offset);
+ iXmlHandler->ComposeDataL(ptr.Length(), KBtBytesInBody());
+
+ return iXmlHandler->FinalizeBufferL(KBtEnvelopeEndTag());
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ReadSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::ReadSoapL(const TDesC8& aSoapBuffer)
+{
+ LOG("[CBtSoapCodec::ReadSoapL(TDesC8&)]\t ");
+ // Open the template file and read it into buffer
+
+ TInt action = 0;
+ ReadSoapL(action, aSoapBuffer);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ReadSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::ReadSoapL(const CBufBase& aSoapBuffer)
+{
+ LOG("[CBtSoapCodec::ReadSoapL(CBufBase&)]\t ");
+ // Open the template file and read it into buffer
+
+ TInt action = 0;
+ ReadSoapL(action, aSoapBuffer);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ReadSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::ReadSoapL(TInt& aAction, const CBufBase& aSoapBuffer)
+{
+ LOG("[CBtSoapCodec::ReadSoapL(TInt&, CBufBase&)]\t ");
+ // Open the template file and read it into buffer
+
+ if(iActionBuffer)
+ delete iActionBuffer;
+ iActionBuffer = NULL;
+
+ iActionBuffer = static_cast<HBufC8*>(User::LeaveIfNull(HBufC8::NewL(aSoapBuffer.Size())));
+ TPtr8 ptr = iActionBuffer->Des();
+ aSoapBuffer.Read(0, ptr, aSoapBuffer.Size());
+
+ ReadSoapL(aAction, iActionBuffer->Des());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ReadSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer)
+{
+ LOG("[CBtSoapCodec::ReadSoapL(TInt&, TDesC8&)]\t ");
+ // Open the template file and read it into buffer
+
+#ifdef _DEBUG
+ TInt len = aSoapBuffer.Length() < 50 ? aSoapBuffer.Length() : 50;
+ TPtrC8 p = aSoapBuffer.Mid(0, len);
+
+#endif
+
+ if(!iXmlHandler)
+ iXmlHandler = CXmlHandler::NewL();
+ iXmlHandler->InitFromBufferL(aSoapBuffer);
+
+ if(iActionBuffer)
+ delete iActionBuffer;
+ iActionBuffer = NULL;
+
+ TInt offset = 0;
+
+ TPtrC8 ptr = iXmlHandler->GetDataL(KBtBodyStartTag, KBtBodyEndTag, offset);
+
+ iActionBuffer = static_cast<HBufC8*>(User::LeaveIfNull(ptr.AllocL()));
+
+ aAction = SoapAction();
+
+ iXmlHandler->Reset();
+ iXmlHandler->InitFromBufferL(iActionBuffer->Des(), aAction);
+}
+
+//------------------------------
+// Responses
+//------------------------------
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CreateJobResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::CreateJobResponseL(TInt& aJobId, TInt& aErrorCode)
+{
+ LOG("[CBtSoapCodec::CreateJobResponseL]\t ");
+
+ if(EBtCreateJobResponse != SoapAction())
+ {
+ User::Leave(KErrInvalidSequence);
+ }
+
+ TBtIntString8 jobId;
+ jobId.Zero();
+ TInt status = OperationStatusL();
+
+ aErrorCode = KErrNotFound;
+ GetAttributeL(KBtJobId(), jobId, aErrorCode);
+ LOG82("[CBtSoapCodec::CreateJobResponseL]\t %S: %S",&KBtJobId(), &jobId);
+ LOG2("[CBtSoapCodec::CreateJobResponseL]\t opStatus: %d, err %d",status, aErrorCode);
+ if(aErrorCode == KErrNone)
+ aErrorCode = status;
+
+ aJobId = TBtMapper::Int(jobId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetPrinterAttributesResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetPrinterAttributesResponseL(TInt& aState, TInt& aStateReasons,
+ RArray<TPrintCapability>& aCapabilities,
+ TInt& aOperationStatus)
+{
+ LOG("[CBtSoapCodec::GetPrinterAttributesResponseL]\t");
+
+ // same operationStatus got twce but no matter.
+ GetPrinterStateResponseL(aState, aStateReasons, aOperationStatus);
+ GetPrinterCapabilitiesResponseL(aCapabilities, aOperationStatus);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetPrinterStateResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetPrinterStateResponseL(TInt& aState, TInt& aStateReasons, TInt& aOperationStatus)
+{
+ LOG("[CBtSoapCodec::GetPrinterStateResponseL]\t");
+
+ if(EBtGetPrinterAttributesResponse != SoapAction())
+ {
+ User::Leave(KErrInvalidSequence);
+ }
+
+ aState = EBtStateUnknown;
+ aStateReasons = EPbCheckPrinter;
+ aOperationStatus = OperationStatusL();
+
+ /*get attribute*/
+ TBtAttrString8 value(KNullDesC8());
+
+ /* Get printer status and reason */
+ TInt err = KErrNotFound;
+ GetAttributeL(KBtPrinterState(), value, err);
+ LOG82("[CBtSoapCodec::GetPrinterStateResponseL]\t ** %S: %S",&KBtPrinterState(), &value);
+ if(KErrNone == err)
+ {
+ aState = TBtMapper::State(value);
+ GetAttributeL(KBtPrinterStateReasons(), value, err);
+ LOG82("[CBtSoapCodec::GetPrinterStateResponseL]\t ** %S: %S",&KBtPrinterStateReasons(), &value);
+ if(KErrNone == err)
+ {
+ aStateReasons = TBtMapper::PrintError(value);
+ }
+ }
+}
+
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetCapabilitiesResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetPrinterCapabilitiesResponseL(RArray<TPrintCapability>& aCapabilities,
+ TInt& aOperationStatus)
+{
+ LOG("[CBtSoapCodec::GetPrinterCapabilitiesResponseL]\t");
+
+ if(EBtGetPrinterAttributesResponse != SoapAction())
+ {
+ User::Leave(KErrInvalidSequence);
+ }
+
+ aOperationStatus = OperationStatusL();
+ aCapabilities.Reset();
+
+ aCapabilities.Append(ParseLayoutL());
+ aCapabilities.Append(ParseQualityL());
+ aCapabilities.Append(ParsePaperSizeL());
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetJobAttributesResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetJobAttributesResponseL(const TInt aJobId, TInt& aJobState, TBtAttrString8& aJobName,
+ TBtAttrString8& aOriginator, TInt& aSheetsCompleted,
+ TInt& aPendingJobs, TInt& aErrorCode )
+
+{
+ LOG("[CBtSoapCodec::GetJobAttributesResponseL]\t");
+ if(EBtGetJobAttributesResponse != SoapAction())
+ {
+ User::Leave(KErrInvalidSequence);
+ }
+
+ aJobState = EBtStateUnknown;
+ aJobName = KNullDesC8();
+ aOriginator = KNullDesC8();
+ aSheetsCompleted = KErrNotFound;
+ aPendingJobs = KErrNotFound;
+ aErrorCode = KErrNotFound;
+
+ TBtAttrString8 value(KNullDesC8());
+ TInt status = OperationStatusL();
+
+ GetAttributeL(KBtJobId(), value, aErrorCode);
+ LOG82("[CBtSoapCodec::GetJobAttributesResponseL]\t %S: %S",&KBtJobId(), &value);
+ LOG2("[CBtSoapCodec::GetJobAttributesResponseL]\t opStatus: %d, err %d",status, aErrorCode);
+ if(aErrorCode == KErrNone)
+ {
+ if( TBtMapper::Int(value) != aJobId)
+ aErrorCode = KErrArgument;
+ else
+ aErrorCode = status;
+ }
+
+ // then just get the rest of the arguments. Success or fails, just continue.
+ GetAttributeL(KBtJobState(), value, status);
+ if(KErrNone == status)
+ aJobState = TBtMapper::State(value);
+ else
+ {
+ LOG82("[CBtSoapCodec::GetJobAttributesResponseL]\t %S: %S",&KBtJobState(), &value);
+ LOG1("[CBtSoapCodec::GetJobAttributesResponseL]\t err %d",status);
+ }
+
+ GetAttributeL(KBtJobMediaSheetsCompleted(), value, status);
+ if(KErrNone == status)
+ aSheetsCompleted = TBtMapper::Int(value);
+ else
+ {
+ LOG82("[CBtSoapCodec::GetJobAttributesResponseL]\t %S: %S",&KBtJobMediaSheetsCompleted(), &value);
+ LOG1("[CBtSoapCodec::GetJobAttributesResponseL]\t err %d",status);
+ }
+
+ GetAttributeL(KBtJobPending(), value, status);
+ if(KErrNone == status)
+ aPendingJobs = TBtMapper::Int(value);
+ else
+ {
+ LOG82("[CBtSoapCodec::GetJobAttributesResponseL]\t %S: %S",&KBtJobPending(), &value);
+ LOG1("[CBtSoapCodec::GetJobAttributesResponseL]\t err %d",status);
+ }
+
+ GetAttributeL(KBtJobName(), aJobName, status);
+ if(KErrNone != status)
+ {
+ LOG82("[CBtSoapCodec::GetJobAttributesResponseL]\t %S: %S",&KBtJobName(), &aJobName);
+ LOG1("[CBtSoapCodec::GetJobAttributesResponseL]\t err %d",status);
+ }
+
+ GetAttributeL(KBtJobOriginatingUserName(), aOriginator, status);
+ if(KErrNone != status)
+ {
+ LOG82("[CBtSoapCodec::GetJobAttributesResponseL]\t %S: %S",&KBtJobOriginatingUserName(), &aOriginator);
+ LOG1("[CBtSoapCodec::GetJobAttributesResponseL]\t err %d",status);
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CancelJobResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::CancelJobResponseL(const TInt aJobId, TInt& aErrorCode)
+{
+ LOG("[CBtSoapCodec::CancelJobResponseL]\t");
+ TBtIntString8 jobId;
+ jobId.Append(aJobId);
+
+ if(EBtCancelJobResponse != SoapAction())
+ {
+ User::Leave(KErrInvalidSequence);
+ }
+
+ TBuf8<KDefaultRealWidth> respJobId;
+ TInt status = OperationStatusL();
+
+ aErrorCode = KErrNotFound;
+ GetAttributeL(KBtJobId(), respJobId, aErrorCode);
+ LOG82("[CBtSoapCodec::CancelJobResponseL]\t %S: %S",&KBtJobId(), &respJobId);
+ LOG2("[CBtSoapCodec::CancelJobResponseL]\t opStatus: %d, err %d",status, aErrorCode);
+ if(aErrorCode == KErrNone)
+ {
+ if(TBtMapper::Int(respJobId) != aJobId)
+ aErrorCode = KErrArgument;
+ else
+ aErrorCode = status;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetEventResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetEventResponseL(const TInt aJobId,
+ TInt& aJobState,
+ TInt& aPrinterState,
+ TInt& aStateReasons,
+ TInt& aErrorCode)
+{
+ LOG("[CBtSoapCodec::GetEventResponseL]\t");
+ if(EBtGetEventResponse != SoapAction())
+ {
+ User::Leave(KErrInvalidSequence);
+ }
+
+ aJobState = EBtStateUnknown;
+ aPrinterState = KErrNotFound;
+ aStateReasons = KErrNotFound;
+ aErrorCode = KErrNotSupported;
+
+ TBtAttrString8 value(KNullDesC8());
+ TInt status = OperationStatusL();
+
+ GetAttributeL(KBtJobId(), value, aErrorCode);
+ LOG82("[CBtSoapCodec::GetEventResponseL]\t %S: %S",&KBtJobId(), &value);
+ LOG2("[CBtSoapCodec::GetEventResponseL]\t opStatus: %d, err %d",status, aErrorCode);
+ if(aErrorCode == KErrNone)
+ {
+ if(TBtMapper::Int(value) != aJobId)
+ aErrorCode = KErrArgument;
+ else
+ aErrorCode = status;
+ }
+
+ // then just get the rest of the arguments. Success or fails, just continue.
+ GetAttributeL(KBtJobState(), value, status);
+ LOG82("[CBtSoapCodec::GetEventResponseL]\t %S: %S",&KBtJobState(), &value);
+ LOG1("[CBtSoapCodec::GetEventResponseL]\t err %d",status);
+ if(KErrNone == status)
+ aJobState = TBtMapper::Int(value);
+
+ GetAttributeL(KBtPrinterState(), value, status);
+ LOG82("[CBtSoapCodec::GetEventResponseL]\t %S: %S",&KBtPrinterState(), &value);
+ LOG1("[CBtSoapCodec::GetEventResponseL]\t err %d",status);
+ if(KErrNone == status)
+ aPrinterState = TBtMapper::Int(value);
+
+ GetAttributeL(KBtPrinterStateReasons(), value, status);
+ LOG82("[CBtSoapCodec::GetEventResponseL]\t %S: %S",&KBtPrinterStateReasons(), &value);
+ LOG1("[CBtSoapCodec::GetEventResponseL]\t err %d",status);
+ if(KErrNone == status)
+ aStateReasons = TBtMapper::Int(value);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::OperationStatusL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtSoapCodec::OperationStatusL()
+{
+ LOG("[CBtSoapCodec::GetOperationStatus]\t");
+
+ /* Get operation status. If NOK or not found, no reason to continue */
+ TBtAttrString8 value(KNullDesC8());
+ TInt status = KErrNotFound;
+
+ GetAttributeL(KBtOperationStatus(), value, status);
+ LOG82("[CBtSoapCodec::GetOperationStatus]\t %S: %S",&KBtOperationStatus(), &value);
+
+ status = TBtMapper::OperationStatus(value);
+
+ LOG1("[CBtSoapCodec::GetOperationStatus]\t return status %d",status);
+ return status;
+}
+
+//------------------------------
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetAttributeL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetAttributeL(const TDesC8& aName, TDes8& aValue, TInt& aError)
+{
+ LOG("[CBtSoapCodec::GetAttributeL()]\t ");
+
+ if(KErrNotFound == iXmlHandler->BufferId())
+ User::Leave(KErrInvalidSequence);
+
+ aError = KErrNotFound;
+
+ TBtAttrString8 startTag;
+ TBtAttrString8 endTag;
+
+ startTag.Format(KBtStartTag(), &aName);
+ endTag.Format(KBtEndTag(), &aName);
+
+ TInt offset = KErrNotFound;
+ TPtrC8 ptr = iXmlHandler->GetDataL(startTag, endTag, offset);
+
+ if(0 < ptr.Length())
+ {
+ aError = KErrNone;
+ aValue.Copy(ptr);
+ }
+ LOG("[CBtSoapCodec::GetAttributeL]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetAttributeListL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetAttributeListL(const TDesC8& aName, CDesC8ArrayFlat& aList, TInt& aError)
+{
+ LOG("[CBtSoapCodec::GetAttributeL()]\t ");
+
+ if(KErrNotFound == iXmlHandler->BufferId())
+ User::Leave(KErrInvalidSequence);
+
+ aError = KErrNotFound;
+ aList.Reset();
+
+ // Read the list of tag aName
+ TInt offset = KErrNotFound;
+ HBufC8* listData = HBufC8::NewLC(iXmlHandler->Buffer().Length());
+ TPtr8 dataPtr = listData->Des();
+ GetAttributeL(aName, dataPtr, offset);
+ if(0 >= dataPtr.Length())
+ {
+ aError = KErrNotFound;
+ CleanupStack::PopAndDestroy(listData);
+ return;
+ }
+
+ CXmlHandler* tmpHandler = CXmlHandler::NewLC();
+ tmpHandler->InitFromBufferL(dataPtr);
+
+ // Now find the first tag data to identify the tag of the entry in the list
+ TPtrC8 newNamePtr = tmpHandler->GetDataL(KBtLessThan(), KBtGreaterThan(), offset);
+
+ TBtAttrString8 startTag;
+ TBtAttrString8 endTag;
+
+ startTag.Format(KBtStartTag(), &newNamePtr);
+ endTag.Format(KBtEndTag(), &newNamePtr);
+
+ tmpHandler->GetDataListL(startTag, endTag, aList);
+ CleanupStack::PopAndDestroy(2); //listData, tmpHandler
+
+ if(0 < aList.Count())
+ {
+ aError = KErrNone;
+ }
+}
+
+
+// PRIVATE
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CreateSoapTemplateL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::CreateSoapTemplateL(const TDesC8& aStartTag, const TDesC8& aEndTag)
+{
+ LOG("[CBtSoapCodec::CreateSoapTemplateL]\t");
+
+ // Open the template file and read it into buffer
+ iXmlHandler->Reset();
+ iXmlHandler->InitFromFileL(KBtXmlTemplate());
+
+ // Separate the template element from the template buffer
+ if(iActionBuffer)
+ delete iActionBuffer;
+ iActionBuffer = NULL;
+
+ TInt offset = 0;
+
+ TPtrC8 ptr = iXmlHandler->GetDataL(aStartTag, aEndTag, offset);
+
+ iActionBuffer = static_cast<HBufC8*>(User::LeaveIfNull(ptr.AllocL()));
+
+ iXmlHandler->DeleteBufferData(offset, iActionBuffer->Length()+aStartTag.Length()+aEndTag.Length());
+ iXmlHandler->ComposeDataL(iActionBuffer->Des(), KBtActionData());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CreateJobSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::CreateJobSoapL(const TInt aJobId)
+{
+ LOG("[CBtSoapCodec::CreateJobSoapL]\t");
+ CreateSoapTemplateL(KBtCreateJobStart(), KBtCreateJobEnd());
+
+ TBuf8<KMaxFileName> filename;
+ filename.Format(KXHTMLFileName8(), aJobId);
+
+ TBtAttrString8 nameTempl, userNameTempl;
+ nameTempl.Format(KBtValueTemplate(), &KBtJobName());
+ userNameTempl.Format(KBtValueTemplate(), &KBtJobOriginatingUserName());
+ nameTempl.Format(KBtValueTemplate(), &KBtJobName());
+
+ iXmlHandler->ComposeDataL(KBtCreateJob(), KBtAction());
+ iXmlHandler->ComposeDataL(filename, nameTempl);
+
+ TBuf8<0x100> name;
+ RsUtils::GetLocalBTNameL(name);
+ iXmlHandler->ComposeDataL(name, userNameTempl);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetCapabilitiesSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetCapabilitiesSoapL()
+{
+ LOG("[CBtSoapCodec::GetCapabilitiesSoapL]\t");
+ CreateSoapTemplateL(KBtGetPrinterCapabilitiesStart(), KBtGetPrinterCapabilitiesEnd());
+
+ iXmlHandler->ComposeDataL(KBtGetPrinterAttributes(), KBtAction());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetPrinterStateSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetPrinterStateSoapL()
+{
+ LOG("[CBtSoapCodec::GetPrinterStateSoapL]\t");
+ CreateSoapTemplateL(KBtGetPrinterStateStart(), KBtGetPrinterStateEnd());
+
+ iXmlHandler->ComposeDataL(KBtGetPrinterAttributes(), KBtAction());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetPrinterAttributesSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetPrinterAttributesSoapL()
+{
+ LOG("[CBtSoapCodec::GetPrinterAttributesSoapL]\t");
+ CreateSoapTemplateL(KBtGetPrinterAttributesAllStart(), KBtGetPrinterAttributesAllEnd());
+
+ iXmlHandler->ComposeDataL(KBtGetPrinterAttributes(), KBtAction());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetJobAttributesSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetJobAttributesSoapL(const TDesC8& aJobId)
+{
+ LOG("[CBtSoapCodec::GetJobAttributesSoapL]\t");
+ CreateSoapTemplateL(KBtJobIdStart(), KBtJobIdEnd());
+
+ iXmlHandler->ComposeDataL(KBtGetJobAttributes(), KBtAction());
+
+ TBtAttrString8 templ;
+ templ.Format(KBtValueTemplate(), &KBtJobId());
+
+ iXmlHandler->ComposeDataL(aJobId, templ);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CancelJobSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::CancelJobSoapL(const TDesC8& aJobId)
+{
+ LOG("[CBtSoapCodec::CancelJobSoapL]\t");
+ CreateSoapTemplateL(KBtJobIdStart(), KBtJobIdEnd());
+
+ iXmlHandler->ComposeDataL(KBtCancelJob(), KBtAction());
+
+ TBtAttrString8 templ;
+ templ.Format(KBtValueTemplate(), &KBtJobId());
+
+ iXmlHandler->ComposeDataL(aJobId, templ);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetEventSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetEventSoapL(const TDesC8& aJobId)
+{
+ LOG("[CBtSoapCodec::GetEventSoapL]\t");
+ CreateSoapTemplateL(KBtJobIdStart(), KBtJobIdEnd());
+
+ iXmlHandler->ComposeDataL(KBtGetEvent(), KBtAction());
+
+ TBtAttrString8 templ;
+ templ.Format(KBtValueTemplate(), &KBtJobId());
+
+ iXmlHandler->ComposeDataL(aJobId, templ);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::GetMarginsSoapL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::GetMarginsSoapL()
+{
+ LOG("[CBtSoapCodec::GetMarginsSoapL]\t NOT SUPPORTED -> leave");
+ User::Leave(KErrNotSupported);
+
+ CreateSoapTemplateL(KBtGetMarginsStart(), KBtGetMarginsEnd());
+
+ iXmlHandler->ComposeDataL(KBtGetMargins(), KBtAction());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::SoapAction
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtSoapCodec::SoapAction()
+{
+ LOG1("[CBtSoapCodec::SoapAction()]\t iActionBuffer: %d", iActionBuffer);
+ if(!iActionBuffer || 0 >= iActionBuffer->Length())
+ return EBtUnknownAction;
+
+ TInt len = iActionBuffer->Length() < 50 ? iActionBuffer->Length() : 50;
+ TPtrC8 ptr = iActionBuffer->Mid(0, len);
+ LOG81("[CBtSoapCodec::SoapAction()]\t ptr: \"%S\"", &ptr);
+
+ /* read action name - the order in list below matters:
+ be aware the substrings (as CreateJob is for CreateJobResponse) aren't found!*/
+ if(KErrNotFound < ptr.Find(KBtCreateJobResponse()))
+ {
+ return EBtCreateJobResponse;
+ }
+ else if(KErrNotFound < ptr.Find(KBtCreateJob()))
+ {
+ return EBtCreateJob;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetPrinterAttributesResponse()))
+ {
+ return EBtGetPrinterAttributesResponse;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetPrinterAttributes()))
+ {
+ return EBtGetPrinterAttributes;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetJobAttributesResponse()))
+ {
+ return EBtGetJobAttributesResponse;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetJobAttributes()))
+ {
+ return EBtGetJobAttributes;
+ }
+ else if(KErrNotFound < ptr.Find(KBtCancelJobResponse()))
+ {
+ return EBtCancelJobResponse;
+ }
+ else if(KErrNotFound < ptr.Find(KBtCancelJob()))
+ {
+ return EBtCancelJob;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetEventResponse()))
+ {
+ return EBtGetEventResponse;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetEvent()))
+ {
+ return EBtGetEvent;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetMarginsResponse()))
+ {
+ return EBtGetMarginsResponse;
+ }
+ else if(KErrNotFound < ptr.Find(KBtGetMargins()))
+ {
+ return EBtGetMargins;
+ }
+
+ return EBtUnknownAction;
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::CBtSoapCodec
+//
+//--------------------------------------------------------------------------------------------
+CBtSoapCodec::CBtSoapCodec()
+{
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ParseLayout
+//
+//--------------------------------------------------------------------------------------------
+TPrintCapability CBtSoapCodec::ParseLayoutL()
+{
+ LOG("[CBtSoapCodec::ParseLayout]\t");
+
+ TPrintCapability layout;
+ layout.iCapabilityID = EPrintCapabLayout;
+ layout.iType = TPrintCapability::Enum;
+ layout.iLow = 0;
+ layout.iHigh = 0;
+ layout.iEnumCount = 0;
+
+ /* Get layout(s) */
+ TBtAttrString8 value(KNullDesC8());
+ TInt err = KErrNotFound;
+ GetAttributeL(KBtNumberUpSupported(), value, err);
+ LOG82("[CBtSoapCodec::ParseLayout]\t %S: %S",&KBtNumberUpSupported(), &value);
+ LOG1("[CBtSoapCodec::ParseLayout]\t error: %d",err);
+ if(KErrNone != err)
+ {
+ layout.iEnumCodes[0] = EPrintCapabLayout1UpBorderless;
+ layout.iEnumCount = 1;
+ }
+ else
+ {
+ LOG("[CBtSoapCodec::ParseLayout]\t get layout values...");
+ RArray<TInt> arr;
+ TBtMapper::Layout(value, arr);
+ LOG1("[CBtSoapCodec::ParseLayout]\t layout count: %d", arr.Count());
+ for(TInt i = 0; i < arr.Count(); ++i)
+ {
+ LOG2("[CBtSoapCodec::ParseLayout]\t arr[%d]: %d", i, arr[i]);
+ layout.iEnumCodes[i] = arr[i];
+ }
+ layout.iEnumCount = arr.Count();
+ arr.Close();
+ }
+
+ RArray<TInt> tmpArr;
+ tmpArr.Append(EPrintCapabLayout1UpBorderless);
+ tmpArr.Append(EPrintCapabLayout1UpBorder);
+ tmpArr.Append(EPrintCapabLayout2Up);
+ tmpArr.Append(EPrintCapabLayout4Up);
+ tmpArr.Append(EPrintCapabLayout6Up);
+ tmpArr.Append(EPrintCapabLayout9Up);
+ tmpArr.Append(EPrintCapabLayout12Up);
+ tmpArr.Append(EPrintCapabLayout16Up);
+
+ for(TInt i = 0; i < tmpArr.Count(); ++i)
+ {
+ TInt ix = ValuePosition(layout, tmpArr[i]);
+ if(KErrNotFound == ix)
+ {
+ layout.iEnumCodes[layout.iEnumCount] = tmpArr[i];
+ ++layout.iEnumCount;
+ }
+ }
+ tmpArr.Close();
+
+ layout.iDefaultValue = layout.iEnumCodes[0];
+
+ TInt ix = ValuePosition(layout, EPrintCapabLayout1UpBorderless);
+ if(KErrNotFound < ix)
+ layout.iDefaultValue = layout.iEnumCodes[ix];
+
+ LOG1("[CBtSoapCodec::ParseLayout]\t return default: %d", layout.iDefaultValue);
+ return layout;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ParseQuality
+//
+//--------------------------------------------------------------------------------------------
+TPrintCapability CBtSoapCodec::ParseQualityL()
+{
+ LOG("[CBtSoapCodec::ParseQuality]\t");
+
+ TPrintCapability quality;
+ quality.iCapabilityID = EPrintCapabQuality;
+ quality.iType = TPrintCapability::Enum;
+ quality.iLow = 0;
+ quality.iHigh = 0;
+ quality.iDefaultValue = EPrintCapabQualityDefault;
+ quality.iEnumCodes[0] = EPrintCapabQualityDefault;
+ quality.iEnumCount = 1;
+
+ /* Get quality(s) */
+ CDesC8ArrayFlat *qualities = new (ELeave) CDesC8ArrayFlat(10);
+ CleanupStack::PushL(qualities);
+
+ TInt err = KErrNotFound;
+ GetAttributeListL(KBtPrintQualitySupported(), *qualities, err);
+ LOG82("[CBtSoapCodec::ParseQuality]\t %S: count: %d",&KBtPrintQualitySupported(), qualities->MdcaCount());
+ if(KErrNone != err)
+ {
+ LOG1("[CBtSoapCodec::ParseQuality]\t return with error %d",err);
+ return quality;
+ }
+
+ for(TInt i = 0; i < qualities->MdcaCount(); ++i)
+ {
+ TInt tmp = TBtMapper::Quality( qualities->MdcaPoint(i) );
+ LOG2("[CBtSoapCodec::ParseQuality]\t qualities[%2d]: %d",i, tmp);
+ if(KErrNotSupported != tmp)
+ {
+ quality.iEnumCodes[quality.iEnumCount] = tmp;
+ ++quality.iEnumCount;
+ }
+ if(KMaxEnumAmount < quality.iEnumCount)
+ {
+ LOG1("[CBtSoapCodec::ParseQuality]\t max enum count reached: %d",quality.iEnumCount);
+ --quality.iEnumCount;
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy(qualities);
+
+ LOG1("[CBtSoapCodec::ParseQuality]\t return default: %d", quality.iDefaultValue);
+ return quality;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ParsePaperSize
+//
+//--------------------------------------------------------------------------------------------
+TPrintCapability CBtSoapCodec::ParsePaperSizeL()
+{
+ LOG("[CBtSoapCodec::ParsePaperSize]\t");
+
+ TPrintCapability size;
+ size.iCapabilityID = EPrintCapabPaperSize;
+ size.iType = TPrintCapability::Enum;
+ size.iLow = 0;
+ size.iHigh = 0;
+ size.iDefaultValue = EPrintCapabPaperSize4x6;
+
+ /* Get size(s) */
+ CDesC8ArrayFlat *sizes = new (ELeave) CDesC8ArrayFlat(10);
+ CleanupStack::PushL(sizes);
+
+ TInt err = KErrNotFound;
+ GetAttributeListL(KBtMediaSizesSupported(), *sizes, err);
+ LOG82("[CBtSoapCodec::ParsePaperSize]\t %S: count %d",&KBtMediaSizesSupported(), sizes->MdcaCount());
+ if(KErrNone != err)
+ {
+ size.iEnumCodes[0] = size.iDefaultValue;
+ size.iEnumCount = 1;
+ return size;
+ }
+
+ TInt enumPos = 0;
+ for(TInt i = 0; i < sizes->MdcaCount(); ++i)
+ {
+// LOG82("[CBtSoapCodec::ParsePaperSize]\t sizes[%2d]: %S",i, &sizes[i]);
+ TInt tmp = TBtMapper::Size(sizes->MdcaPoint(i));
+ if(KErrNotSupported != tmp)
+ {
+ LOG2("[CBtSoapCodec::ParsePaperSize]\t sizes[%2d]: %d",i, tmp);
+ size.iEnumCodes[enumPos] = tmp;
+ size.iEnumCount = ++enumPos;
+ }
+ if(KMaxEnumAmount < enumPos)
+ {
+ LOG1("[CBtSoapCodec::ParsePaperSize]\t max enum count reached: %d",enumPos);
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy(sizes);
+
+ // Get default value from loaded media
+ ParseDefaultSizeL(size, enumPos);
+
+ // Sort the paper sizes in order 'smallest to biggest'
+ RArray<TInt> tmpArr;
+ tmpArr.Append(EPrintCapabPaperSizeAuto);
+ tmpArr.Append(EPrintCapabPaperSize4x6);
+ tmpArr.Append(EPrintCapabPaperSize5x7);
+ tmpArr.Append(EPrintCapabPaperSizeA6);
+ tmpArr.Append(EPrintCapabPaperSizeA4);
+ tmpArr.Append(EPrintCapabPaperSizeLetter);
+
+ for(TInt s = 0; s < tmpArr.Count(); ++s)
+ {
+ TInt ix = ValuePosition(size,tmpArr[s]);
+ if(KErrNotFound == ix)
+ tmpArr.Remove(s);
+ }
+
+ // Move back to enum array
+ for(TInt s2 = 0; s2 < tmpArr.Count(); ++s2)
+ {
+ size.iEnumCodes[s2] = tmpArr[s2];
+ }
+ tmpArr.Close();
+
+#ifdef ENABLE_LOGGING
+ _LIT(KTab, "|");
+ TFileName tmp(KTab);
+
+ for(TInt l = 0; l < size.iEnumCount; ++l)
+ {
+ tmp.AppendNum(size.iEnumCodes[l]);
+ tmp.Append(KTab);
+ }
+ LOG1("[CBtSoapCodec::ParsePaperSizeL]\t order: %S", &tmp);
+#endif
+
+ return size;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ParseDefaultSizeL
+//
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::ParseDefaultSizeL(TPrintCapability& aSize, TInt& aPos)
+{
+ LOG("[CBtSoapCodec::ParseDefaultSizeL]\t");
+
+ //reserve more space for this: there are several long text lines
+ TBuf8<KAttrStrLen*10> value(KNullDesC8());
+ TInt err = KErrNotFound;
+
+ GetAttributeL(KBtMediaLoaded(), value, err);
+
+#ifdef ENABLE_LOGGING
+ TInt len = value.Length() < 50 ? value.Length() : 50;
+ TPtrC8 p = value.Mid(0, len);
+ LOG82("[CBtSoapCodec::ParseDefaultValues]\t %S: ptr: \"%S\"",&KBtMediaLoaded(), &p);
+#endif
+
+ if(KErrNone != err)
+ {
+ LOG82("[CBtSoapCodec::ParseDefaultSizeL]\t %S not found. Error: %d. Return.",&KBtMediaLoaded(), err);
+ return;
+ }
+
+ CXmlHandler* tmpHandler = CXmlHandler::NewLC();
+ tmpHandler->InitFromBufferL(value);
+ TBtAttrString8 start;
+ TBtAttrString8 end;
+ start.Format(KBtStartTag(), &KBtLoadedMediumSize());
+ end.Format(KBtEndTag(), &KBtLoadedMediumSize());
+
+ TPtrC8 defValue = tmpHandler->GetDataL(start, end, err);
+ TInt tmpDefault = TBtMapper::Size(defValue);
+
+ CleanupStack::PopAndDestroy(tmpHandler);
+
+ if(KErrNotSupported != tmpDefault)
+ {
+ aSize.iDefaultValue = tmpDefault;
+ }
+
+ // Check the default value exists...
+ for(TInt i = 0; i < aSize.iEnumCount; ++i)
+ {
+ if(aSize.iDefaultValue == aSize.iEnumCodes[i])
+ {
+ return;
+ }
+ }
+
+ // ...if not, append it.
+ if(KMaxEnumAmount < aPos)
+ {
+ --aPos;
+ }
+ aSize.iEnumCodes[aPos] = aSize.iDefaultValue;
+ aSize.iEnumCount = ++aPos;
+
+ LOG1("[CBtSoapCodec::ParseDefaultSizeL]\t return default: %d", aSize.iDefaultValue);
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtSoapCodec::ValuePosition
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtSoapCodec::ValuePosition(TPrintCapability aCapab, TInt aValue)
+{
+ TInt pos = KErrNotFound;
+ for(TInt i = 0; i < aCapab.iEnumCount; ++i)
+ if(aValue == aCapab.iEnumCodes[i])
+ pos = i;
+
+ return pos;
+}
+
+////// TEST METHODS ///////////
+//--------------------------------------------------------------------------------------------
+void CBtSoapCodec::TestMeL()
+{
+
+ _LIT8(KSepar, "\n-------------------------\n");
+ _LIT8(KKErrNotFound, "KErrNotFound");
+ _LIT8(KLF, "\n%d\n");
+
+ RFs fs;
+ CleanupClosePushL(fs);
+ User::LeaveIfError(fs.Connect());
+
+ /*create*/
+ CBtSoapCodec* codec = CBtSoapCodec::NewL();
+ TPtrC8 ptr = codec->CreateSoapL(EBtGetPrinterAttributes);
+
+ _LIT(KTstFile, "c:\\data\\tst.txt");
+ RFile f;
+ CleanupClosePushL(f);
+ f.Replace(fs,KTstFile, EFileWrite);
+ f.Write(ptr);
+ f.Write(KSepar());
+
+ /*read*/
+ TInt act;
+ CBufFlat* data = CBufFlat::NewL(8);
+ data->InsertL(0, GetPrinterAttributesResponseTestSoap());
+
+ codec->ReadSoapL(act, *data);
+
+ /*get attribute*/
+ TBtAttrString8 val, errStr;
+ _LIT8(KPrinterState, "PrinterState");
+ _LIT8(KPrinterStateReasons, "PrinterStateReasons");
+ TInt err = KErrNoMemory;
+
+ codec->GetAttributeL(KPrinterState(), val, err);
+ TInt s;
+ errStr.Format(KLF(), err);
+ f.Size(s);
+ f.Write(s+1, KPrinterState);
+ f.Write(errStr);
+ f.Write(val);
+ f.Write(KSepar());
+
+ codec->GetAttributeL(KPrinterStateReasons(), val, err);
+ errStr.Format(KLF(), err);
+ f.Size(s);
+ f.Write(s+1, KPrinterStateReasons);
+ f.Write(errStr);
+ f.Write(val);
+ f.Write(KSepar());
+
+ codec->GetAttributeL(KKErrNotFound(), val, err);
+ errStr.Format(KLF(), err);
+ f.Size(s);
+ f.Write(s+1, KKErrNotFound);
+ f.Write(errStr);
+ f.Write(val);
+ f.Write(KSepar());
+
+ CleanupStack::PopAndDestroy(2); // f, fs
+
+}
+
+
+TPtrC8 CBtSoapCodec::CreateJobResponseTestSoap()
+{
+ _LIT8(KTestSoap, "CONTENT-LENGTH:200\nCONTENT-TYPE:text/xml; charset=\"utf-8\""
+ "<s:Envelope\nxmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>"
+ "<u:CreateJobResponse xmlns:u=\"urn:schemas-bluetooth-org:service:Printer:1\">"
+ "<JobId>12345</JobId>"
+ "<OperationStatus>0x0001</OperationStatus>"
+ "</u:CreateJobResponse>"
+ "</s:Body>"
+ "</s:Envelope>");
+
+ TPtrC8 response = KTestSoap();
+ return response;
+}
+TPtrC8 CBtSoapCodec::CancelJobResponseTestSoap()
+{
+ _LIT8(KTestSoap, "CONTENT-LENGTH:200\nCONTENT-TYPE:text/xml; charset=\"utf-8\""
+ "<s:Envelope\nxmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>"
+ "<u:CancelJobResponse xmlns:u=\"urn:schemas-bluetooth-org:service:Printer:1\">"
+ "<JobId>12345</JobId>"
+ "<OperationStatus>0x0406</OperationStatus>"
+ "</u:CancelJobResponse>"
+ "</s:Body>"
+ "</s:Envelope>");
+
+ TPtrC8 response = KTestSoap();
+ return response;
+}
+TPtrC8 CBtSoapCodec::GetPrinterAttributesResponseTestSoap()
+{
+ _LIT8(KTestSoap, "CONTENT-LENGTH:200\nCONTENT-TYPE:text/xml; charset=\"utf-8\""
+ "<s:Envelope\nxmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>"
+ "<u:GetPrinterAttributesResponse xmlns:u=\"urn:schemas-bluetooth-org:service:Printer:1\">"
+ "<PrinterName>MyPrinter</PrinterName>"
+ "<PrinterLocation>MyLocation</PrinterLocation>"
+ "<PrinterState>idle</PrinterState>"
+ "<PrinterStateReasons>none</PrinterStateReasons>"
+ "<PrinterGeneralCurrentOperator></PrinterGeneralCurrentOperator>"
+ "<DocumentFormatsSupported>"
+ "<DocumentFormat> application/vnd.pwg-xhtml-print+xml:0.95 </DocumentFormat>"
+ "<DocumentFormat> application/vnd.hp-PCL:5E</DocumentFormat>"
+ "<DocumentFormat> text/plain</DocumentFormat>"
+ "<DocumentFormat> application/PostScript:3</DocumentFormat>"
+ "</DocumentFormatsSupported>"
+ "<ImageFormatsSupported>"
+ "<ImageFormat>image/jpeg</ImageFormat>"
+ "<ImageFormat>image/gif</ImageFormat>"
+ "</ImageFormatsSupported>"
+ "<ColorSupported>true</ColorSupported>"
+ "<MaxCopiesSupported>1</MaxCopiesSupported>"
+ "<SidesSupported>"
+ "<Sides> one-sided</Sides>"
+ "<Sides> two-sided-long-edge</Sides>"
+ "<Sides> two-sided-short-edge</Sides>"
+ "</SidesSupported>"
+ "<NumberUpSupported>4</NumberUpSupported>"
+ "<OrientationsSupported>"
+ "<Orientation>portrait</Orientation>"
+ "<Orientation>landscape</Orientation>"
+ "</OrientationsSupported>"
+ "<MediaSizesSupported>"
+ "<MediaSize>iso_a4_210x297mm</MediaSize>"
+ "<MediaSize>iso_a3_297x420mm</MediaSize>"
+ "</MediaSizesSupported>"
+ "<MediaTypesSupported>"
+ "<MediaType>stationery</MediaType>"
+ "<MediaType>photographic</MediaType>"
+ "<MediaType>cardstock</MediaType>"
+ "</MediaTypesSupported>"
+ "<MediaLoaded>"
+ "<LoadedMediumDetails>"
+ "<LoadedMediumSize> iso_a4_210x297mm</LoadedMediumSize>"
+ "<LoadedMediumType>stationery</LoadedMediumType>"
+ "</LoadedMediumDetails>"
+ "<LoadedMediumDetails>"
+ "<LoadedMediumSize> iso_a4_210x297mm</LoadedMediumSize>"
+ "<LoadedMediumType>photographic</LoadedMediumType>"
+ "</LoadedMediumDetails>"
+ "</MediaLoaded>"
+ "<PrintQualitySupported>"
+ "<PrintQuality>draft</PrintQuality>"
+ "<PrintQuality>normal</PrintQuality>"
+ "<PrintQuality>fine</PrintQuality>"
+ "</PrintQualitySupported>"
+ "<QueuedJobCount>1</QueuedJobCount>"
+ "<OperationStatus>0x0000</OperationStatus>"
+ "</u:GetPrinterAttributesResponse></s:Body></s:Envelope>");
+
+ TPtrC8 response = KTestSoap();
+ return response;
+}
+TPtrC8 CBtSoapCodec::GetJobAttributesResponseTestSoap()
+{
+ _LIT8(KTestSoap, "CONTENT-LENGTH:200\nCONTENT-TYPE:text/xml; charset=\"utf-8\""
+ "<s:Envelope\nxmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>"
+ "<u:GetJobAttributesResponse xmlns:u=\"urn:schemas-bluetooth-org:service:Printer:1\">"
+ "<JobId>12345</JobId>"
+ "<JobState>printing</JobState>"
+ "<JobName>MyExpenseReport</JobName>"
+ "<JobOriginatingUserName>mailto:MyEmail</JobOriginatingUserName>"
+ "<JobMediaSheetsCompleted>2</JobMediaSheetsCompleted>"
+ "<NumberOfInterveningJobs>0</NumberOfInterveningJobs>"
+ "<OperationStatus>0x0000</OperationStatus>"
+ "</u:GetJobAttributesResponse>"
+ "</s:Body>"
+ "</s:Envelope>");
+
+ TPtrC8 response = KTestSoap();
+ return response;
+}
+TPtrC8 CBtSoapCodec::GetEventsResponseTestSoap()
+{
+ _LIT8(KTestSoap, "CONTENT-LENGTH:200\nCONTENT-TYPE:text/xml; charset=\"utf-8\""
+ "<s:Envelope\nxmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>"
+ "<u:GetEventResponse xmlns:u=\"urn:schemas-bluetooth-org:service:Printer:1\">"
+ "<JobId>12345</JobId>"
+ "<JobState>stopped</JobState>"
+ "<PrinterState>stopped</PrinterState>"
+ "<PrinterStateReasons>media-empty</PrinterStateReasons>"
+ "<OperationStatus>0x0000</OperationStatus>"
+ "</u:GetEventResponse>"
+ "</s:Body>"
+ "</s:Envelope>");
+
+ TPtrC8 response = KTestSoap();
+ return response;
+}
+TPtrC8 CBtSoapCodec::GetMarginsResponseTestSoap()
+{
+ _LIT8(KTestSoap, "CONTENT-LENGTH:200\nCONTENT-TYPE:text/xml; charset=\"utf-8\""
+ "<s:Envelope\nxmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\""
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>"
+ "<u:GetMarginsResponse xmlns:u=\"urn:schemas-bluetooth-org:service:Printer:1\">"
+ " <Margins>.25in,.25in,0in,.25in</Margins>"
+ " <OperationStatus>0x0000</OperationStatus>"
+ "</u:GetMarginsResponse>"
+ "</s:Body>"
+ "</s:Envelope>");
+
+ TPtrC8 response = KTestSoap();
+ return response;
+}
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtstatuschannel.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,465 @@
+/*
+* 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: Defines the CBtStatusChannel class.
+*
+*/
+
+
+#include <obex.h>
+
+#include "crsbtdevice.h"
+#include "cbtstatuschannel.h"
+#include "cbtsoapcodec.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "cbtdiscover.h"
+#include "printmessagecodes.h"
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::NewL
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel* CBtStatusChannel::NewL(MBtPCObserver& aObs)
+{
+ CBtStatusChannel *self = NewLC(aObs);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel* CBtStatusChannel::NewLC(MBtPCObserver& aObs)
+{
+ CBtStatusChannel *self = new (ELeave) CBtStatusChannel(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::CBtStatusChannel
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel::CBtStatusChannel(MBtPCObserver& aObs):
+ CBtChannelBase( aObs )
+{
+ LOG("[CBtStatusChannel::CBtStatusChannel]\t");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::~CBtStatusChannel
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel::~CBtStatusChannel()
+{
+ LOG("[CBtStatusChannel::~CBtStatusChannel]\t");
+ Cancel();
+ ClearConnection();
+
+ // iChannel have to delete here or otherwise Review-x report critical error.
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::ConstructL()
+{
+ LOG("[CBtStatusChannel::ConstructL]\t begin");
+ CBtChannelBase::ConstructL();
+ LOG("[CBtStatusChannel::ConstructL]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::RunL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::RunL()
+{
+ LOG2("[CBtStatusChannel::RunL]\t BEGIN iStatus %d at state %d", iStatus.Int(), iState);
+
+ //Finish if required
+ if( EStateFinish == iState )
+ {
+ Disconnect();
+ return;
+ }
+
+ DoLeaveL( iStatus.Int() );
+
+ switch( iState )
+ {
+ case EStateConnecting:
+ iObexNullObject->Reset();
+ StopWaiting();
+ break;
+ case EStateDisconnecting:
+ Disconnect();
+ StopWaiting();
+ break;
+ case EStateGettingPrinterState:
+ GetSoapResponseL();
+ GetPrinterStateResponseL();
+ iState = EStateNone;
+ break;
+ case EStateCancellingJob:
+ GetSoapResponseL();
+ CancelJobResponseL();
+ iDevice = NULL;
+ iState = EStateNone;
+ break;
+ case EStateGettingJobAttributes:
+ GetSoapResponseL();
+ GetJobAttributesResponseL();
+ break;
+ case EStateNone:
+ User::Leave( KErrCancel );
+ break;
+ case EStateGetEvent:
+ iState = EStateGettingEvent;
+ SendSoapRequestL(EBtGetEvent, iJobId);
+ WaitL();
+ break;
+ case EStateGettingEvent:
+ GetSoapResponseL();
+ GetEventResponseL();
+ StopWaiting();
+ break;
+ default:
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::RunError
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtStatusChannel::RunError(TInt aError)
+{
+ LOG1("[CBtStatusChannel::RunError]\t state %d", iState);
+ LOG2("[CBtStatusChannel::RunError]\t error %d, iStatus %d", aError, iStatus.Int() );
+
+ TInt id = KErrNotFound;
+
+ StopWaiting();
+
+ switch( iState )
+ {
+ case EStateGettingPrinterState:
+ if(iDevice)
+ id = iDevice->DeviceId();
+
+ iState = EStateFinish;
+ iObs.GetPrinterStateResponse(EBtStateIdle, ENoMessage, aError, id);
+ break;
+ case EStateCancellingJob:
+ iState = EStateFinish;
+ iObs.CancelJobResponse(aError);
+ break;
+ case EStateGettingJobAttributes:
+ iState = EStateFinish;
+ iObs.GetJobAttributesResponse(EBtStateUnknown, KNullDesC8(), KNullDesC8(), KErrNotFound, KErrNotFound, aError);
+ break;
+ case EStateGetEvent:
+ case EStateGettingEvent:
+ iObs.GetEventResponse(iJobId, EBtStateUnknown, EBtStateIdle, KErrNone, aError);
+ break;
+ default:
+ iState = EStateFinish;
+ iObs.GetEventResponse(KErrNotFound, KErrNotFound, KErrNotFound, KErrNotFound, aError);
+ LOG("[CBtPrinterController::RunError]\t GetEventResponse sent" );
+ break;
+ }
+ iResponseError = aError;
+ return KErrNone; // othervise error returns to CActive: that's what we don't want.
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::DoCancel
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::DoCancel()
+{
+ LOG2("[CBtStatusChannel::DoCancel]\t at state %d, iStatus 0x%X", iState, iStatus.Int());
+
+ StopWaiting();
+
+ iState = EStateNone;
+
+ CBtChannelBase::DoCancel();
+ LOG1("[CBtStatusChannel::DoCancel]\t out iStatus 0x%X", iStatus.Int());
+}
+
+//------------------------------
+// InCalls
+//------------------------------
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetPrinterAttributesL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtStatusChannel::GetPrinterStateL()
+{
+ LOG("[CBtStatusChannel::GetPrinterStateL]\t begin");
+ if(iStop)
+ return KErrNone;
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ Cancel();
+
+ iState = EStateGettingPrinterState;
+ SendSoapRequestL(EBtGetPrinterState);
+
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetJobAttributesL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtStatusChannel::GetJobAttributesL(TInt aJobId)
+{
+ LOG1("[CBtStatusChannel::GetJobAttributesL]\t begin with id %d", aJobId);
+ if(iStop)
+ return KErrNone;
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ if( KErrNotFound == aJobId)
+ User::Leave(KErrInvalidData);
+
+ LOG1("[CBtStatusChannel::GetJobAttributesL]\t wait connection? %d", iStatus.Int());
+ WaitL();
+
+ iJobId = aJobId;
+ LOG1("[CBtStatusChannel::GetJobAttributesL]\t iJobId %d", iJobId);
+
+ iState = EStateGettingJobAttributes;
+ SendSoapRequestL(EBtGetJobAttributes, iJobId);
+
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetEventL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetEventL(TInt aJobId)
+{
+ LOG("[CBtStatusChannel::GetEvent]\t begin");
+ if(iStop)
+ return;
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ if( 0 > aJobId)
+ User::Leave(KErrInvalidData);
+
+ if(EStateGetEvent == iState || EStateGettingEvent == iState)
+ return;
+
+ Cancel();
+
+ iJobId = aJobId;
+
+ iState = EStateGetEvent;
+ Activate();
+}
+
+//----------------------------------
+
+//------------------------------
+// Responses
+//------------------------------
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetPrinterStateResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetPrinterStateResponseL()
+{
+ LOG("[CBtStatusChannel::GetPrinterStateResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt state = EBtStateUnknown;
+ TInt reasons = EPbCheckPrinter;
+ TInt opStatus = KErrGeneral;
+
+ iSoapCodec->GetPrinterStateResponseL(state, reasons, opStatus);
+
+ TInt id = KErrNotFound;
+ if(iDevice)
+ id = iDevice->DeviceId();
+
+ iObs.GetPrinterStateResponse(state, reasons, opStatus, id);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetJobAttributesResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetJobAttributesResponseL()
+{
+ LOG("[CBtStatusChannel::GetJobAttributesResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt jobState = EBtStateUnknown;
+ TBtAttrString8 jobName(KNullDesC8());
+ TBtAttrString8 originator(KNullDesC8());
+ TInt sheetsCompleted = KErrNotFound;
+ TInt pendingJobs = KErrNotFound;
+ TInt opStatus = KErrNotSupported;
+
+ iSoapCodec->GetJobAttributesResponseL(iJobId, jobState, jobName, originator,
+ sheetsCompleted, pendingJobs, opStatus);
+
+ iObs.GetJobAttributesResponse(jobState, jobName, originator,
+ sheetsCompleted, pendingJobs, opStatus);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::CancelJobResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::CancelJobResponseL()
+{
+ LOG("[CBtStatusChannel::CancelJobResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt err = KErrNotFound;
+ iSoapCodec->CancelJobResponseL(iJobId, err);
+
+ LOG1("[CBtStatusChannel::CancelJobResponseL]\t err %d", err);
+ iObs.CancelJobResponse(err);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetEventResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetEventResponseL()
+{
+ LOG("[CBtStatusChannel::GetEventResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt jobState, printerState, stateReasons, operationStatus;
+
+ iSoapCodec->GetEventResponseL(iJobId, jobState, printerState, stateReasons, operationStatus);
+ iObs.GetEventResponse(iJobId, jobState, printerState, stateReasons, operationStatus);
+}
+///////////////////////////////
+// Private
+///////////////////////////////
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::ConnectL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::ConnectL()
+{
+ LOG2("[CBtStatusChannel::ConnectL]\t isConnected: %d, iDevice %d", IsConnected(), iDevice);
+
+ User::LeaveIfNull(iDevice);
+
+ LOG1("[CBtStatusChannel::ConnectedL]\t aDevice.UsedProtocols(): %d", iDevice->UsedProtocol());
+ if( !(KImagePrint_PrinterProtocol_BPP & iDevice->UsedProtocol()) )
+ User::Leave(KErrNotSupported);
+
+ if(IsConnected())
+ {
+ LOG1("[CBtStatusChannel::ConnectL]\t isConnected: %d", IsConnected());
+ return;
+ }
+
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+
+ TObexBluetoothProtocolInfo protocolInfo;
+ protocolInfo.iTransport.Copy( KRFCOMMDesC );
+ protocolInfo.iAddr.SetBTAddr(iDevice->BDAddr() );//Address of server bt device
+ protocolInfo.iAddr.SetPort(iDevice->STSPort() );//Service channel of server rfcomm
+
+ TUUID uuid(KBTSDPPrintingStatus);
+ iObexNullObject->Reset();
+ iObexNullObject->SetTargetL(uuid.Des());
+
+ // create channel
+ iChannel = CObexClient::NewL( protocolInfo );
+ iChannel->SetCallBack(*this);
+ iChannel->Connect(*iObexNullObject, iStatus);
+
+ iState = EStateConnecting;
+ Activate();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::DoLeaveL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::DoLeaveL(TInt aError)
+{
+ LOG2("[CBtStatusChannel::DoLeaveL]\t aError %d at state %d", aError, iState);
+
+ if(KErrNone == aError)
+ return;
+
+ if(EStateDisconnecting == iState)
+ return;
+
+ if(KErrCancel == aError)
+ return;
+
+ if(KErrCompletion == aError)
+ return;
+
+ LOG("[CBtStatusChannel::DoLeaveL]\t Leave");
+ User::Leave(aError);
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbttimer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,65 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cbttimer.h"
+#include "clog.h"
+
+// CONSTANTS
+
+CBtTimer* CBtTimer::NewL( MBtTimerObserver& aObserver )
+ {
+ CBtTimer* obj = new (ELeave) CBtTimer( aObserver );
+ CleanupStack::PushL( obj ) ;
+ obj->ConstructL();
+ CleanupStack::Pop(); // obj
+ return obj;
+ }
+
+CBtTimer::~CBtTimer()
+ {
+ }
+
+CBtTimer::CBtTimer( MBtTimerObserver& aObserver ) :
+ CTimer( -1 ),
+ iObserver( aObserver )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+void CBtTimer::ConstructL()
+ {
+ CTimer::ConstructL();
+ }
+
+void CBtTimer::Start(TUint aDelay)
+ {
+ LOG1("[CBtTimer::Start] timeout %d", aDelay);
+ After( KDiscoveryDelay );
+ }
+
+void CBtTimer::RunL()
+ {
+ LOG2("[CBtTimer::RunL] iStatus.Int(): %d/0x%X", iStatus.Int(),iStatus.Int());
+ if( iStatus.Int() == KErrNone )
+ {
+ iObserver.HandleTimeoutL();
+ }
+ LOG("CBtTimer::RunL end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cprintjob.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,443 @@
+/*
+* 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 CPrintJob class definition and the PJS enum.
+*
+*/
+
+
+#include <e32std.h>
+#include <pathinfo.h>
+#include <driveinfo.h>
+
+#include "cprintjob.h"
+#include "printcapabilitycodes.h"
+#include "imageprint.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "btprotocolconsts.h"
+
+
+
+
+// Public functions
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::NewL
+//
+//--------------------------------------------------------------------------------------------
+CPrintJob* CPrintJob::NewL(CRsBtDevice* aDevice, RArray<TFileName>& aImages,
+ const TDesC8& aUserName)
+{
+ CPrintJob* self = new (ELeave) CPrintJob(aDevice);
+ CleanupStack::PushL(self);
+ self->ConstructL(aImages, aUserName);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::~CPrintJob
+//
+//--------------------------------------------------------------------------------------------
+CPrintJob::~CPrintJob()
+{
+ iImages.Reset();
+ iImages.Close();
+ iDevice = NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::SetJobId
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::SetJobId(const TInt aId)
+{
+ iJobId = aId;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::GetJobId
+//
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::JobId()
+{
+ return iJobId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::GetJobName
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::GetJobName(TDes8& aJobName)
+{
+ // Return the name of first image
+ if (iImages.Count() > 0)
+ {
+ iImages[0].GetFilePath(aJobName);
+ }
+ else
+ {
+ aJobName.Append(KNullDesC8());
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::ImageCount
+//
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::ImageCount()
+{
+ return iImages.Count();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::Images
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::Images(RArray<CImageInfo>& aImages)
+{
+ for (TInt i=0; i < iImages.Count(); i++)
+ {
+ aImages.Append(iImages[i]);
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::PrinterId
+//
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::PrinterId()
+{
+ if(Device())
+ return Device()->DeviceId();
+
+ return KErrNotFound;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::GetUserName
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::GetUserName(TPtrC8& aUserName)
+{
+ aUserName.Set(iUserName);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::GetUserName
+//
+//--------------------------------------------------------------------------------------------
+CRsBtDevice* CPrintJob::Device()
+{
+ if(iDevice)
+ return iDevice;
+ else
+ return NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::SetNumsOfCopies
+//
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::SetNumsOfCopies( const RArray<TInt>& aNumsOfCopies)
+{
+ TInt err = KErrNone;
+
+ for(TInt arrayIx = 0, imgIx = 0; arrayIx < aNumsOfCopies.Count(); ++arrayIx)
+ {
+ if(iImages[imgIx].Index() < aNumsOfCopies.Count())
+ {
+ TInt copies = aNumsOfCopies[iImages[imgIx].Index()];
+ if(0 < copies)
+ iImages[imgIx].SetCopies(copies);
+ ++imgIx;
+ }
+ else
+ err = KErrCorrupt;
+ }
+ return err;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::GetPrintFileL
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::GetPrintFileL(TDes8& aPrintFile)
+{
+ LOG("[CPrintJob::GetPrintFileL]\t begin");
+
+ TInt layout;
+ TInt paper;
+ TInt quality;
+
+ GetPrintSetting(EPrintCapabLayout, layout);
+ GetPrintSetting(EPrintCapabPaperSize, paper);
+ GetPrintSetting(EPrintCapabQuality, quality);
+
+ TFileName tmpFile;
+ tmpFile.Copy(aPrintFile);
+
+ CXhtmlFileComposer* fileComposer = CXhtmlFileComposer::NewLC(KNullDesC());
+
+ LOG("[CPrintJob::GetPrintFileL]\t create file");
+ fileComposer->CreateXhtmlFileL( iImages, layout, paper, quality, tmpFile, iSheets );
+
+ CleanupStack::PopAndDestroy(fileComposer);
+ aPrintFile.Copy(tmpFile);
+
+ LOG("[CPrintJob::GetPrintFileL]\t file created");
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::Sheets
+//
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::Sheets()
+{
+ if(0 == iSheets)
+ {
+ TInt layout;
+ TInt layoutNbr = 1;
+ TInt imageNbr = 0;
+
+ // We don't care about return value here: if GetPrintSetting
+ // fails, we can anyway tell there will be at least an image/page
+ GetPrintSetting(EPrintCapabLayout, layout);
+
+ switch( layout )
+ {
+ case EPrintCapabLayout1Up:
+ case EPrintCapabLayout1UpBorderless:
+ case EPrintCapabLayout1UpBorder:
+ layoutNbr = 1;
+ break;
+ case EPrintCapabLayout2Up:
+ layoutNbr = 2;
+ break;
+ case EPrintCapabLayout4Up:
+ layoutNbr = 4;
+ break;
+ case EPrintCapabLayout6Up:
+ layoutNbr = 6;
+ break;
+ case EPrintCapabLayout9Up:
+ layoutNbr = 9;
+ break;
+ case EPrintCapabLayout12Up:
+ layoutNbr = 12;
+ break;
+ case EPrintCapabLayout16Up:
+ layoutNbr = 16;
+ break;
+ default:
+ break;
+ }
+
+ for (TInt i = 0; i<iImages.Count(); ++i)
+ {
+ imageNbr += iImages[i].Copies();
+ }
+
+ iSheets = imageNbr / layoutNbr;
+ if(0 < imageNbr % layoutNbr)
+ {
+ ++iSheets;
+ }
+ }
+ LOG1("[CPrintJob::Sheets]\t iSheets = %d", iSheets);
+ return iSheets;
+}
+
+// Protected functions
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::ConstructL(RArray<TFileName>& aImages, const TDesC8& aUserName)
+{
+ if (aImages.Count() < 1)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ _LIT(KObex, "obex:");
+ _LIT(KMmc, "\\mmc");
+ _LIT(KLocal, "\\media");
+ _LIT(KSlash, "/");
+ _LIT(KBackSlash, "\\");
+
+ // Initialize iImages array
+ for (TInt i=0 ; i<aImages.Count(); i++)
+ {
+ // Skip empty strings
+ if (aImages[i].Length() < 1)
+ {
+ continue;
+ }
+
+ aImages[i].LowerCase();
+
+ CImageInfo imageInfo;
+ imageInfo.SetId(KErrNotFound);
+ imageInfo.SetIndex(i);
+ imageInfo.SetCopies(1);
+
+ // Image file path
+ imageInfo.SetFilePathL(aImages[i]);
+
+ // Parse obex "uri"
+ TFileName tmpUri;
+
+ TParse parse;
+ parse.Set(aImages[i], NULL, NULL);
+
+ // Get drive id and root path when multiple drive is enabled.
+ TInt driveId;
+ TFileName localRoot;
+ User::LeaveIfError(DriveInfo::GetDefaultDrive(DriveInfo::EDefaultPhoneMemory, driveId));
+ User::LeaveIfError(PathInfo::GetRootPath(localRoot, driveId));
+
+ localRoot.LowerCase();
+
+ tmpUri.Copy(KObex());
+ // Note here: the correct format would be uuid.LongForm(),
+ // but in currently supported services it is not required.
+ tmpUri.AppendNum(KBTSDPDPROService, EHex);
+
+ TFileName drive = parse.Drive();
+
+ TInt pos = localRoot.Find(drive);
+ if(KErrNotFound < pos)
+ {
+ tmpUri.Append(KLocal());
+ }
+ else
+ {
+ tmpUri.Append(KMmc());
+ }
+ tmpUri.Append(parse.Path());
+ tmpUri.Append(parse.NameAndExt());
+
+ pos = tmpUri.Find(KBackSlash());
+ while(KErrNotFound != pos)
+ {
+ tmpUri.Replace(pos, KBackSlash().Length(), KSlash());
+ pos = tmpUri.Find(KBackSlash());
+ }
+
+ LOG1("[CPrintJob::ConstructL]\t tmpUri: \"%S\"", &tmpUri);
+ imageInfo.SetUriL(tmpUri);
+// LOG82("[CPrintJob::ConstructL]\t iFilePath: \"%S\", iUri: \"%S\"", &imageInfo.iFilePath, &imageInfo.iUri);
+
+ iImages.Append(imageInfo);
+ }
+
+ iUserName.Copy(aUserName);
+ iSheets = 0;
+}
+
+
+// Private functions
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::CPrintJob
+//
+//--------------------------------------------------------------------------------------------
+CPrintJob::CPrintJob(CRsBtDevice* aDevice) :
+ iJobId(KErrNotFound),
+ iDeviceId(KErrNotFound),
+ iDevice(aDevice),
+ iUserName(KNullDesC8()),
+ iSheets(0),
+ iJobState(CPrintJob::EStateNone)
+{
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::UpdateJobState
+//
+//--------------------------------------------------------------------------------------------
+void CPrintJob::UpdateJobState(const TJobState aState)
+{
+ iJobState = aState;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrintJob::JobState
+//
+//--------------------------------------------------------------------------------------------
+CPrintJob::TJobState CPrintJob::JobState()
+{
+ return iJobState;
+}
+
+//--------------------------------------------------------------------------------------------
+// CPrintJob::GetPrintSetting
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::GetPrintSetting(TInt aCapabilityID, TInt& aValue)
+{
+ if(Device())
+ {
+ for(TInt i = 0; i < Device()->CapabilityCount(); ++i)
+ {
+ TPrintCapability c;
+ if(KErrNone == Device()->GetCapability(aCapabilityID, c) )
+ {
+ aValue = c.iDefaultValue;
+ LOG2("[CPrintJob::GetPrintSetting]\t %d = %d", aCapabilityID, aValue);
+ return KErrNone;
+ }
+ }
+ }
+
+ aValue = KErrNotFound;
+
+ LOG("[CPrintJob::GetPrintSetting]\t out: KErrInvalidData");
+ return KErrInvalidData;
+}
+
+//--------------------------------------------------------------------------------------------
+// CPrintJob::SetPrintSetting
+//--------------------------------------------------------------------------------------------
+TInt CPrintJob::SetPrintSetting(TInt aCapabilityID, TInt aValue)
+{
+ LOG2("[CPrintJob::SetPrintSetting]\t %d = %d", aCapabilityID, aValue);
+
+ if(Device())
+ return Device()->SetDefaultCapability(aCapabilityID, aValue);
+
+ LOG("[CPrintJob::GetPrintSetting]\t out: KErrInvalidData");
+ return KErrInvalidSequence;
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/crsbtdevice.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,879 @@
+/*
+* 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 CRsBtDevice class definition.
+ *
+*/
+
+
+#include "crsbtdevice.h"
+#include "clog.h"
+#include "imageprint.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CRsBtDevice::CRsBtDevice()
+ {
+ }
+
+CRsBtDevice::~CRsBtDevice()
+ {
+ LOG("CRsBtDevice::~CRsBtDevice begin");
+ delete iPrinterModel;
+ delete iDevice;
+
+ iCapabilities.Close();
+ LOG("CRsBtDevice::~CRsBtDevice end");
+ }
+
+CRsBtDevice* CRsBtDevice::NewL(const TNameRecord &aName)
+ {
+ CRsBtDevice* self = CRsBtDevice::NewLC(aName);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CRsBtDevice* CRsBtDevice::NewL()
+ {
+ CRsBtDevice* self = CRsBtDevice::NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CRsBtDevice* CRsBtDevice::NewLC(const TNameRecord &aName)
+ {
+ CRsBtDevice* self = new (ELeave) CRsBtDevice();
+ CleanupStack::PushL(self);
+ self->ConstructL(aName);
+ return self;
+ }
+
+CRsBtDevice* CRsBtDevice::NewLC()
+ {
+ CRsBtDevice* self = new (ELeave) CRsBtDevice();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CRsBtDevice* CRsBtDevice::NewLC(const CRsBtDevice &a)
+ {
+ CRsBtDevice* self = new (ELeave) CRsBtDevice();
+ CleanupStack::PushL(self);
+ self->ConstructL(a);
+ return self;
+ }
+
+CRsBtDevice* CRsBtDevice::NewL(const CRsBtDevice &a)
+ {
+ CRsBtDevice* self = CRsBtDevice::NewLC(a);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CRsBtDevice::ConstructL(const TNameRecord &aName)
+ {
+ LOG1("CRsBtDevice::ConstructL aName.iName: %S", &(aName.iName));
+ TInquirySockAddr sockAddr = (TInquirySockAddr)aName.iAddr;
+
+ TBTDeviceClass devClass(sockAddr.MajorServiceClass(),
+ sockAddr.MajorClassOfDevice(),
+ sockAddr.MinorClassOfDevice());
+
+ iDevice = CBTDevice::NewL(sockAddr.BTAddr());
+
+ iDevice->SetDeviceClass(devClass);
+ iDevice->SetFriendlyNameL(aName.iName);
+
+ Init();
+
+ LOG("CRsBtDevice::ConstructL end");
+ }
+
+void CRsBtDevice::ConstructL()
+ {
+ iDevice = CBTDevice::NewL();
+ Init();
+ }
+
+void CRsBtDevice::ConstructL(const CRsBtDevice &a)
+ {
+ iDevice = CBTDevice::NewL();
+ if(a.iDevice)
+ iDevice->UpdateL(*(a.iDevice));
+
+ iBPPPort = a.iBPPPort;
+ iSTSPort = a.iSTSPort;
+ iOPPPort = a.iOPPPort;
+ iSupportedProtocols = a.iSupportedProtocols;
+ iVendor = a.iVendor;
+ iJustFound = a.iJustFound;
+ iTimeDiscovered = a.iTimeDiscovered;
+ iTimeLastUsed = a.iTimeLastUsed;
+
+ iUsed = a.iUsed;
+
+ iPrinterModel = NULL;
+ if(a.iPrinterModel)
+ iPrinterModel = a.iPrinterModel->AllocL();
+
+ iInternalDeviceId = a.iInternalDeviceId;
+ iDisappeared = a.iDisappeared;
+ iUsedProtocol = a.iUsedProtocol;
+
+ iCapabilities.Reset();
+ for(TInt i = 0; i < a.iCapabilities.Count(); ++i)
+ {
+
+ TPrintCapability capab;
+ capab.iCapabilityID = a.iCapabilities[i].iCapabilityID;
+ capab.iType = a.iCapabilities[i].iType;
+ capab.iLow = a.iCapabilities[i].iLow;
+ capab.iHigh = a.iCapabilities[i].iHigh;
+ capab.iDefaultValue = a.iCapabilities[i].iDefaultValue;
+ capab.iEnumCount = a.iCapabilities[i].iEnumCount;
+
+ for(TInt j = 0; j < a.iCapabilities[i].iEnumCount; ++j)
+ {
+ capab.iEnumCodes[j] = a.iCapabilities[i].iEnumCodes[j];
+ }
+
+ AddCapability(capab);
+ }
+ }
+
+void CRsBtDevice::Init()
+ {
+ iBPPPort = 0;
+ iSTSPort = 0;
+ iOPPPort = 0;
+ iSupportedProtocols = 0;
+ iVendor = TPrinter::EVendorNone;
+ iJustFound = EFalse;
+ iTimeDiscovered.UniversalTime();
+ iTimeLastUsed.UniversalTime();
+ iPrinterModel = NULL;
+
+ iInternalDeviceId = KErrNotFound;
+ iDisappeared = ETrue;
+ iUsedProtocol = 0;
+
+ iCapabilities.Reset();
+ iUsed = EFalse;
+ }
+
+/**
+ * Standard method to allow object to be streamed out to a file.
+ * @param aStream Stream that object will be written to, should have already been opened.
+ */
+void CRsBtDevice::ExternalizeL(RWriteStream& aStream) const
+ {
+ LOG("[CRsBtDevice::ExternalizeL]\t Begin");
+
+ aStream.WriteInt32L(iInternalDeviceId);
+ aStream.WriteUint32L(iBPPPort);
+ aStream.WriteUint32L(iSTSPort);
+ aStream.WriteUint32L(iOPPPort);
+ aStream.WriteInt32L(iSupportedProtocols);
+ aStream.WriteUint32L(Vendor());
+
+ TUint32 temp = iTimeLastUsed.Int64();
+ aStream.WriteUint32L( temp );
+ temp = iTimeLastUsed.Int64() >> 32;
+ aStream.WriteUint32L( temp );
+ temp = iTimeDiscovered.Int64();
+ aStream.WriteUint32L( temp );
+ temp = iTimeDiscovered.Int64() >> 32;
+ aStream.WriteUint32L( temp );
+
+
+ aStream.WriteInt32L(iPrinterModel->Des().MaxLength());
+ aStream << *iPrinterModel;
+
+ ExternalizeCapabilitiesL(aStream);
+
+ aStream << *iDevice;
+
+ LOG("[CRsBtDevice::ExternalizeL]\t end");
+ }
+
+void CRsBtDevice::ExternalizeCapabilitiesL(RWriteStream& aStream) const
+ {
+ LOG("CRsBtDevice::ExternalizeCapabilitiesL begin");
+
+ aStream.WriteInt32L(iCapabilities.Count());
+ for(TInt i = 0; i < iCapabilities.Count(); ++i)
+ {
+ aStream.WriteInt32L(iCapabilities[i].iCapabilityID);
+ aStream.WriteInt32L(iCapabilities[i].iType);
+ aStream.WriteInt32L(iCapabilities[i].iDefaultValue);
+ aStream.WriteInt32L(iCapabilities[i].iLow);
+ aStream.WriteInt32L(iCapabilities[i].iHigh);
+ aStream.WriteInt32L(iCapabilities[i].iEnumCount);
+ for(TInt j = 0; j < KMaxEnumAmount; ++j)
+ {
+ aStream.WriteInt32L(iCapabilities[i].iEnumCodes[j]);
+ }
+ }
+ }
+
+
+/**
+ * Standard method to allow object to be streamed in from a file.
+ * @param aStream Stream that object will be read from, should have already been opened.
+ */
+void CRsBtDevice::InternalizeL(RReadStream& aStream)
+ {
+ LOG("[CRsBtDevice::InternalizeL]\t Begin");
+
+ TUint timeLastHigh, timeLastLow, timeDiscHigh, timeDiscLow;
+ TInt maxlen;
+
+ iInternalDeviceId = aStream.ReadInt32L();
+ iBPPPort = aStream.ReadUint32L();
+ iSTSPort = aStream.ReadUint32L();
+ iOPPPort = aStream.ReadUint32L();
+
+ iSupportedProtocols = aStream.ReadInt32L();
+ SetVendor(static_cast<TPrinter::TPrinterVendor>( aStream.ReadUint32L() ));
+
+ timeLastLow = aStream.ReadUint32L();
+ timeLastHigh = aStream.ReadUint32L();
+ timeDiscLow = aStream.ReadUint32L();
+ timeDiscHigh = aStream.ReadUint32L();
+
+ TInt64 temp;
+ temp = timeLastHigh;
+ temp = temp << 32;
+ iTimeLastUsed = temp | timeLastLow;
+ temp = timeDiscHigh;
+ temp = temp << 32;
+ iTimeDiscovered = temp | timeDiscLow;
+
+ delete iPrinterModel;
+ iPrinterModel = NULL;
+ maxlen = aStream.ReadInt32L();
+ iPrinterModel = HBufC::NewL(aStream,maxlen);
+
+ InternalizeCapabilitiesL(aStream);
+
+ iDevice->InternalizeL(aStream);
+ iUsed = ETrue;
+
+ LOG1("[CRsBtDevice::InternalizeL]\t End for: %S", &FriendlyName());
+ }
+
+void CRsBtDevice::InternalizeCapabilitiesL(RReadStream& aStream)
+ {
+ LOG("[CRsBtDevice::InternalizeCapabilitiesL]\t begin");
+
+ iCapabilities.Reset();
+
+ TInt count = aStream.ReadInt32L();
+ for(TInt i = 0; i < count; ++i)
+ {
+ TPrintCapability capability;
+ capability.iCapabilityID = aStream.ReadInt32L();
+ capability.iType = (TPrintCapability::ECapType)aStream.ReadInt32L();
+ capability.iDefaultValue = aStream.ReadInt32L();
+ capability.iLow = aStream.ReadInt32L();
+ capability.iHigh = aStream.ReadInt32L();
+ capability.iEnumCount = aStream.ReadInt32L();
+ for(TInt j = 0; j < KMaxEnumAmount; ++j)
+ {
+ capability.iEnumCodes[j] = aStream.ReadInt32L();
+ }
+ iCapabilities.Append(capability);
+ }
+ }
+
+
+/**
+ * Create a copy of the current object.
+ * \returns A pointer to the new object, the caller takes ownership of the object.
+ */
+CRsBtDevice* CRsBtDevice::CopyL()
+ {
+ CRsBtDevice* newDevice = NewLC();
+ newDevice->UpdateAllL(*this);
+ CleanupStack::Pop(); // newDevice
+ return newDevice;
+ }
+
+/**
+ * Create a copy of the current object.
+ * \returns A pointer to the new object, the caller takes ownership of the object.
+ */
+CRsBtDevice* CRsBtDevice::CopyL(CRsBtDevice& aSource)
+ {
+ CRsBtDevice* newDevice = NewLC();
+ newDevice->UpdateAllL(aSource);
+ CleanupStack::Pop(); // newDevice
+ return newDevice;
+ }
+
+/**
+ * \returns Address of descriptor containing the Bluetooth friendly name of the device.
+ */
+const TDesC& CRsBtDevice::FriendlyName() const
+ {
+ return iDevice->FriendlyName();
+ }
+
+/**
+ * Stores the BPP port (channel).
+ * @param aPort BPP port (channel) as unsigned integer. If CRsBtDevice::SetBPPPort is not called, initialized as 0.
+ */
+void CRsBtDevice::SetBPPPort(TUint aPort)
+ {
+ iBPPPort = aPort;
+ }
+
+/**
+ * Stores the status port (channel).
+ * @param aPort Status port (channel) as unsigned integer. If CRsBtDevice::SetSTSPort is not called, initialized as 0.
+ */
+void CRsBtDevice::SetSTSPort(TUint aPort)
+ {
+ iSTSPort = aPort;
+ }
+
+/**
+ * Stores the OPP port (channel).
+ * @param aPort OPP port (channel) as unsigned integer. If CRsBtDevice::SetOPPPort is not called, initialized as 0.
+ */
+void CRsBtDevice::SetOPPPort(TUint aPort)
+ {
+ iOPPPort = aPort;
+ }
+
+
+/**
+ * Stores the protocols that this device support.
+ * @param aSupportedProtocols The Supported Protocols by this device
+ */
+void CRsBtDevice::SetSupportedProtocols(TUint aSupportedProtocols)
+ {
+ iSupportedProtocols = aSupportedProtocols;
+ }
+
+/**
+ * Obtain the supported protocols by this device
+ * \returns The supported protocols by this device TUint @sa KImagePrint_PrinterProtocol_BPP @sa KImagePrint_PrinterProtocol_OPP_Printer @sa KImagePrint_PrinterProtocol_OPP_PC
+ */
+TUint CRsBtDevice::SupportedProtocols() const
+ {
+ return iSupportedProtocols;
+ }
+
+/**
+ * Compares the Bluetooth device address of this Bluetooth device to the address of the passed in device.
+ * @param aDevice Bluetooth device to compare this object to.
+ * \returns True, Bluetooth device addresses are identical, False, Bluetooth device addresses as not identical.
+ */
+TBool CRsBtDevice::Equals( const CRsBtDevice &aDevice ) const
+ {
+ return (aDevice.iDevice->BDAddr() == iDevice->BDAddr());
+ }
+
+/**
+ * \returns Bluetooth device address.
+ */
+const TBTDevAddr& CRsBtDevice::BDAddr() const
+ {
+ return iDevice->BDAddr();
+ }
+
+/**
+ * \returns BPP port (channel) as an unsigned integer. If CRsBtDevice::SetBPPPort is not called, initialized as 0.
+ */
+TUint CRsBtDevice::BPPPort() const
+ {
+ return iBPPPort;
+ }
+
+/**
+ * \returns status port (channel) as an unsigned integer. If CRsBtDevice::SetSTSPort is not called, initialized as 0.
+ */
+TUint CRsBtDevice::STSPort() const
+ {
+ return iSTSPort;
+ }
+
+/**
+ * \returns OPP port (channel) as an unsigned integer. If CRsBtDevice::SetOPPPort is not called, initialized as 0.
+ */
+TUint CRsBtDevice::OPPPort() const
+ {
+ return iOPPPort;
+ }
+
+void CRsBtDevice::SetDisappeared(TBool aDisappeared)
+ {
+ iDisappeared = aDisappeared;
+ }
+
+TBool CRsBtDevice::IsDisappeared() const
+ {
+ return iDisappeared;
+ }
+
+/**
+ * First calls CRsBtDevice::UpdateDeviceAndBPP, then updates any remaining data from the current device,
+ * includes whether device is saved in the device cache, the number of prints, and time stamps of
+ * discovery and when last used.
+ * @param aDevice Device whose data will be used to update current device.
+ * \returns True, data of the current device was updated, False, nothing changed.
+ */
+TBool CRsBtDevice::UpdateAllL(CRsBtDevice &aDevice)
+ {
+ TBool modified = EFalse;
+
+ modified = UpdateDeviceAndBPPL(aDevice);
+
+ if (iTimeDiscovered != aDevice.iTimeDiscovered)
+ {
+ iTimeDiscovered = aDevice.iTimeDiscovered;
+ modified = ETrue;
+ }
+
+ if (iTimeLastUsed != aDevice.iTimeLastUsed)
+ {
+ iTimeLastUsed = aDevice.iTimeLastUsed;
+ modified = ETrue;
+ }
+
+ return modified;
+ }
+
+/**
+ * First calls CRsBtDevice::UpdateDevice, then updates the current devices BPP/OPP data,
+ * includes BPP/OPP supported information and BPP/OPP port.
+ * @param aDevice Device whose data will be used to update current device.
+ * \returns True, data of the current device was updated, False, nothing changed.
+ */
+TBool CRsBtDevice::UpdateDeviceAndBPPL(CRsBtDevice &aDevice)
+ {
+ TBool modified = EFalse;
+
+ modified = UpdateDeviceL(aDevice);
+
+ if ((iSupportedProtocols & aDevice.SupportedProtocols()) != iSupportedProtocols)
+ {
+ iSupportedProtocols = aDevice.SupportedProtocols();
+ modified = ETrue;
+ }
+
+ if (iBPPPort != aDevice.BPPPort())
+ {
+ iBPPPort = aDevice.BPPPort();
+ modified = ETrue;
+ }
+
+ if (iSTSPort != aDevice.STSPort())
+ {
+ iSTSPort = aDevice.STSPort();
+ modified = ETrue;
+ }
+
+ if (iOPPPort != aDevice.OPPPort())
+ {
+ iOPPPort = aDevice.OPPPort();
+ modified = ETrue;
+ }
+
+ return modified;
+ }
+
+/**
+ * Update the current devices Bluetooth device data, includes device address, friendly name and device class.
+ * @param aDevice Device whose data will be used to update current device.
+ * \returns True, data of the current device was updated, False, nothing changed.
+ */
+TBool CRsBtDevice::UpdateDeviceL(CRsBtDevice &aDevice)
+ {
+ TBool modified = EFalse;
+
+ if( iDevice->BDAddr() != aDevice.iDevice->BDAddr() ||
+ iDevice->FriendlyName() != aDevice.iDevice->FriendlyName() ||
+ ! (DeviceClass() == aDevice.DeviceClass()) )
+ {
+ iDevice->UpdateL(*(aDevice.iDevice));
+ modified = ETrue;
+ }
+
+ if( iPrinterModel )
+ {
+ delete iPrinterModel;
+ iPrinterModel = NULL;
+ modified = ETrue;
+ }
+ if( aDevice.iPrinterModel )
+ {
+ iPrinterModel = aDevice.iPrinterModel->AllocL();
+ modified = ETrue;
+ }
+ if( Vendor() != aDevice.Vendor() )
+ {
+ SetVendor(aDevice.Vendor());
+ modified = ETrue;
+ }
+
+ return modified;
+ }
+
+/**
+ * First calls CRsBtDevice::UpdateDeviceAndBPP, then updates any remaining data from the current device,
+ * includes whether device is saved in the device cache, the number of prints, and time stamps of
+ * discovery and when last used.
+ * @param aDevice Device whose data will be used to update current device.
+ * \returns True, data of the current device was updated, False, nothing changed.
+ */
+TBool CRsBtDevice::UpdateUsedL(CRsBtDevice &aDevice)
+ {
+ TBool modified = EFalse;
+
+ modified = UpdateDeviceAndBPPL(aDevice);
+
+ if (iTimeDiscovered != aDevice.TimeDiscovered())
+ {
+ iTimeDiscovered = aDevice.TimeDiscovered();
+ modified = ETrue;
+ }
+
+ if (iTimeLastUsed != aDevice.TimeLastUsed())
+ {
+ iTimeLastUsed = aDevice.TimeLastUsed();
+ modified = ETrue;
+ }
+
+ if ( !iDisappeared )
+ {
+ iDisappeared = ETrue;
+ modified = ETrue;
+ }
+
+ if (iUsedProtocol != (iUsedProtocol & aDevice.SupportedProtocols()) )
+ {
+ iUsedProtocol = aDevice.UsedProtocol();
+ modified = ETrue;
+ }
+
+ return modified;
+ }
+
+
+/**
+ * \returns The time stamp of when the device was last used.
+ */
+TTime CRsBtDevice::TimeLastUsed() const
+ {
+ return iTimeLastUsed;
+ }
+
+void CRsBtDevice::SetTimeLastUsed(TTime aTime)
+ {
+ iTimeLastUsed = aTime;
+ }
+
+/**
+ * \returns The time stamp of when the device was first discovered.
+ */
+TTime CRsBtDevice::TimeDiscovered() const
+ {
+ return iTimeDiscovered;
+ }
+
+void CRsBtDevice::SetTimeDiscovered(TTime aTime)
+ {
+ iTimeDiscovered = aTime;
+ }
+
+/**
+ * \returns The Bluetooth device class.
+ */
+TBTDeviceClass CRsBtDevice::DeviceClass() const
+{
+return iDevice->DeviceClass();
+}
+
+void CRsBtDevice::SetPrinterModelL(const TDesC& aModelName)
+ {
+ LOG1("CRsBtDevice::SetPrinterModelL aModelName: %S", &aModelName);
+ HBufC* temp = aModelName.AllocL();
+ TPtr ptr = temp->Des();
+ ptr.UpperCase();
+ delete iPrinterModel;
+ iPrinterModel = temp;
+ LOG("CRsBtDevice::SetPrinterModelL end");
+ }
+
+const TDesC& CRsBtDevice::GetPrinterModel() const
+ {
+ return *iPrinterModel;
+ }
+
+// This is not stored in the cache!
+void CRsBtDevice::SetJustFound(TBool aJustFound)
+ {
+ iJustFound = aJustFound;
+ }
+
+// This is not stored in the cache!
+TBool CRsBtDevice::IsJustFound() const
+ {
+ return iJustFound;
+ }
+
+TInt CRsBtDevice::DeviceId() const
+ {
+ return iInternalDeviceId;
+ }
+
+void CRsBtDevice::SetDeviceId(TInt aNewId)
+ {
+ iInternalDeviceId = aNewId;
+ }
+
+void CRsBtDevice::SetVendor( TPrinter::TPrinterVendor aVendor )
+ {
+ LOG1("CRsBtDevice::SetVendor aVendor: %d", aVendor);
+ iVendor = aVendor;
+
+ LOG("CRsBtDevice::SetVendor end");
+ }
+
+TPrinter::TPrinterVendor CRsBtDevice::Vendor() const
+ {
+ return iVendor;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::Used
+// -----------------------------------------------------------------------------
+TBool CRsBtDevice::IsUsed() const
+ {
+ return iUsed;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::SetUsed
+// -----------------------------------------------------------------------------
+void CRsBtDevice::SetUsed(TBool aUsed)
+ {
+ iUsed = aUsed;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::GetUsedProtocol
+// -----------------------------------------------------------------------------
+//
+TInt CRsBtDevice::UsedProtocol() const
+ {
+ return iUsedProtocol;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::SetUsedProtocol
+// -----------------------------------------------------------------------------
+//
+TInt CRsBtDevice::ComposeUsedProtocol(TInt aRequestedProtocols)
+ {
+ LOG2("CRsBtDevice::ComposeUsedProtocol]\t iRequestedProtocols: %d, supported: %d",
+ aRequestedProtocols, SupportedProtocols());
+
+ if ((aRequestedProtocols & KImagePrint_PrinterProtocol_BPP) && (SupportedProtocols() & KImagePrint_PrinterProtocol_BPP))
+ {
+ SetUsedProtocol(KImagePrint_PrinterProtocol_BPP);
+ }
+ else if ((aRequestedProtocols & KImagePrint_PrinterProtocol_OPP_Printer) && (SupportedProtocols() & KImagePrint_PrinterProtocol_OPP_Printer))
+ {
+ SetUsedProtocol(KImagePrint_PrinterProtocol_OPP_Printer);
+ }
+ else if ((aRequestedProtocols & KImagePrint_PrinterProtocol_OPP_PC) && (SupportedProtocols() & KImagePrint_PrinterProtocol_OPP_PC))
+ {
+ SetUsedProtocol(KImagePrint_PrinterProtocol_OPP_PC);
+ }
+ else
+ {
+ // This shouldn't happen at all, we have an error in the code
+ LOG("[CRsBtDevice::ComposeUsedProtocol]\t ERROR! Protocol Mismatch.");
+ SetUsedProtocol(0);
+ }
+ return UsedProtocol();
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::SetUsedProtocol
+// -----------------------------------------------------------------------------
+//
+void CRsBtDevice::SetUsedProtocol(TInt aUsedProtocol)
+ {
+ iUsedProtocol = aUsedProtocol;
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::GetCapabilityIDs
+// -----------------------------------------------------------------------------
+//
+void CRsBtDevice::GetCapabilityIDs(RArray<TInt>& aCapabilityIDs )
+ {
+ LOG1("[CBtPrintingDevice::GetCapabilityIDs]\t iCapabilities.Count(): %d", iCapabilities.Count());
+ for (TInt i=0; i < iCapabilities.Count(); i++)
+ {
+ aCapabilityIDs.Append(iCapabilities[i].iCapabilityID);
+ LOG2("[CBtPrintingDevice::GetCapabilityIDs]\t iCapabilities[%d]: %d", i, iCapabilities[i].iCapabilityID);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRsBtDevice::GetCapability
+// -----------------------------------------------------------------------------
+//
+TInt CRsBtDevice::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;
+ }
+
+//--------------------------------------------------------------------------------------------
+// CRsBtDevice::SetDefaultCapability
+//--------------------------------------------------------------------------------------------
+TInt CRsBtDevice::SetDefaultCapability(TInt aCapabilityID, TInt aValue)
+ {
+ LOG2("[CBtPrintingDevice::SetDefaultCapability]\t capab: %d, value: %d", aCapabilityID, aValue);
+
+ // Check Validity against the target capability ranges
+ for (TInt c=0; c<iCapabilities.Count(); ++c)
+ {
+ if (iCapabilities[c].iCapabilityID == aCapabilityID)
+ {
+ if ((iCapabilities[c].iType == TPrintCapability::Int) ||
+ (iCapabilities[c].iType == TPrintCapability::Float))
+ {
+ if (((aValue < iCapabilities[c].iLow) && (iCapabilities[c].iLow != -1)) ||
+ ((aValue > iCapabilities[c].iHigh) && (iCapabilities[c].iHigh != -1)))
+ {
+ LOG1("[CBtPrintingDevice::SetJobSettingL]\t capability ranges error; return %d", KErrInvalidData);
+ return KErrInvalidData;
+ }
+ else
+ {
+ iCapabilities[c].iDefaultValue = aValue;
+ LOG1("[CBtPrintingDevice::SetDefaultCapability]\t %d matches", iCapabilities[c].iType);
+ return KErrNone;
+ }
+
+ }
+ else // enum
+ {
+ for (TInt e = 0; e < iCapabilities[c].iEnumCount; ++e)
+ {
+ if (aValue == iCapabilities[c].iEnumCodes[e])
+ {
+ iCapabilities[c].iDefaultValue = aValue;
+ LOG("[CBtPrintingDevice::SetDefaultCapability]\t enum matches");
+ return KErrNone;
+ }
+ }
+ }
+ }
+ }
+ LOG("[CBtPrintingDevice::SetDefaultCapability]\t capab/value doesn't match");
+ return KErrInvalidData;
+ }
+
+//--------------------------------------------------------------------------------------------
+// CRsBtDevice::AddCapability
+//--------------------------------------------------------------------------------------------
+void CRsBtDevice::AddCapability(TPrintCapability& aCapability)
+ {
+ LOG1("[CBtPrintingDevice::AddCapability]\t %d", aCapability.iCapabilityID);
+
+ for (TInt i=0; i < iCapabilities.Count(); i++)
+ {
+ if (aCapability.iCapabilityID == iCapabilities[i].iCapabilityID)
+ {
+ iCapabilities[i] = aCapability;
+ return;
+ }
+ }
+
+ iCapabilities.Append(aCapability);
+ }
+
+//--------------------------------------------------------------------------------------------
+// CRsBtDevice::CapabilityIDCount
+//--------------------------------------------------------------------------------------------
+TInt CRsBtDevice::CapabilityCount() const
+ {
+ return iCapabilities.Count();
+ }
+
+//--------------------------------------------------------------------------------------------
+// CRsBtDevice::GetPrinter
+//--------------------------------------------------------------------------------------------
+TPrinter CRsBtDevice::ToTPrinter()
+ {
+ LOG("[CRsBtDevice::GetTPrinter]\t");
+
+ TPrinter printer;
+ printer.iDisplayName = FriendlyName();
+ if(0 == printer.iDisplayName.Length())
+ {
+ TBuf<20> tmpName;
+ tmpName.AppendNum(DeviceId());
+ printer.iDisplayName = tmpName;
+ }
+ printer.iPrinterID = DeviceId();
+ printer.iProtocol = UsedProtocol();
+ printer.iVendor = Vendor();
+
+
+ // Set properties
+ printer.iProperties = 0;
+ if(IsUsed())
+ {
+ printer.iProperties |= TPrinter::Cached;
+ }
+ if(KImagePrint_PrinterProtocol_BPP == printer.iProtocol)
+ {
+ printer.iProperties |= TPrinter::SupportsPreview;
+ }
+
+ return printer;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/crsbtdiscoverengine.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,550 @@
+/*
+* 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 CRsBtDiscoverEngine class definition and its observer
+* definition (MBtDiscoveryObserver).
+*
+*/
+
+
+#include "crsbtdiscoverengine.h"
+#include "cbtdiscover.h"
+#include "crsbtdevice.h"
+#include "rsutils.h"
+#include "cbtdevicecontainer.h"
+#include "btprotocolconsts.h"
+#include "clog.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+CRsBtDiscoverEngine* CRsBtDiscoverEngine::NewL(MBtDiscoveryObserver& aObs)
+{
+ CRsBtDiscoverEngine* self = new (ELeave) CRsBtDiscoverEngine(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+}
+
+
+CRsBtDiscoverEngine::CRsBtDiscoverEngine(MBtDiscoveryObserver& aObs)
+ : CActive(CActive::EPriorityStandard),
+ iState(EFindingDevices),
+ iObserver(aObs),
+ iDevice(NULL),
+ iRequestedProtocols(0)
+{
+ CActiveScheduler::Add(this);
+}
+
+/**
+ * @brief Second phase constructor.
+ *
+ * @param aFolderToUser Folder where the device cache will be read/stored.
+ */
+void CRsBtDiscoverEngine::ConstructL()
+ {
+ iDiscover = CBtDiscover::NewL();
+ iDelayFindDevices.CreateLocal();
+ iTimeout = CBtTimer::NewL( *this );
+ }
+
+/**
+ * @brief Destructor.
+ */
+CRsBtDiscoverEngine::~CRsBtDiscoverEngine()
+ {
+ LOG("CRsBtDiscoverEngine::~CRsBtDiscoverEngine begin");
+ Cancel();
+ delete iDiscover;
+ ResetDevice();
+ iFoundBeforeArray.Close();
+ iDelayFindDevices.Close();
+ delete iTimeout;
+ LOG("CRsBtDiscoverEngine::~CRsBtDiscoverEngine end");
+ }
+
+/**
+ * @brief Cancels asynchronous tasks of this active object. Terminates the Device and Service Discovery.
+ */
+void CRsBtDiscoverEngine::DoCancel()
+ {
+ LOG("CRsBtDiscoverEngine::DoCancel begin");
+ ResetDevice();
+ iTimeout->Cancel();
+ iDiscover->Stop();
+ iDiscover->StopSDP();
+ iDelayFindDevices.Cancel();
+ iFoundBeforeArray.Reset();
+ LOG("CRsBtDiscoverEngine::DoCancel end");
+ }
+
+/**
+ * @brief Called by the Active Scheduler when an asynchronous call finish.
+ */
+void CRsBtDiscoverEngine::RunL()
+ {
+ LOG1("CRsBtDiscoverEngine::RunL iStatus.Int(): %d", iStatus.Int());
+ LOG1("CRsBtDiscoverEngine::RunL iState: %d", iState);
+
+ iTimeout->Cancel();
+
+ if( iStatus != KErrNone )
+ {
+ switch( iState )
+ {
+ case EDelayFindDevices:
+ LOG1("[CRsBtDiscoverEngine::RunL]\t Try to find again... (error %d)", iStatus.Int());
+ break;
+ case EFindingDevices:
+ if( iStatus == (KHCIErrorBase - ECommandDisallowed) )
+ {
+ LOG("[CRsBtDiscoverEngine::RunL]\t Retry discovery");
+ iState = EDelayFindDevices;
+ iDelayFindDevices.Cancel();
+ iDelayFindDevices.After(iStatus,500000);
+ SetActive();
+ break;
+ }
+ else if (iStatus == KErrHostResNoMoreResults)
+ {
+ LOG("[CRsBtDiscoverEngine::RunL]\t No more devices, all found.");
+ ResetDevice();
+ //Make call to callback function informing that all is done
+ iObserver.HandleDiscoveryEvent(MBtDiscoveryObserver::EDoneFindingPrinters, KErrNone);
+ break;
+ }
+ default:
+ LOG1("[CRsBtDiscoverEngine::RunL]\t Leave error %d", iStatus.Int());
+ User::Leave(iStatus.Int());
+ break;
+ }
+ }
+ else
+ {
+ switch( iState )
+ {
+ case EFindingDevices:
+ if( CheckBtDevice() )
+ {
+ TNameRecord name = iDiscover->GetNameRecord();
+ TBTDevAddr addr = ((TBTSockAddr)name.iAddr).BTAddr();
+ TInt nPos = iFoundBeforeArray.Find( addr );
+
+ if( nPos == KErrNotFound )
+ {
+ // found new printer, add to list and check service capabilities
+ User::LeaveIfError( iFoundBeforeArray.Append( addr ) );
+ ServiceDiscoveryL();
+ break;
+ }
+ }
+ ContinueDiscovery();
+ break;
+ case EGettingServices:
+ if( ComposeDeviceL() )
+ {
+ LOG1("CRsBtDiscoverEngine::RunL wanted device: %S", &(iDiscover->GetDeviceName()));
+ //Make call to callback function informing that new device has been found.
+ iObserver.HandleDiscoveryEvent(MBtDiscoveryObserver::EFoundBtPrinter, iStatus.Int());
+ }
+ //And search for more devices
+ ContinueDiscovery();
+ break;
+
+ case EDelayFindDevices:
+ StartDiscovery();
+ break;
+ default:
+ break;
+ }
+ }
+
+ LOG("CRsBtDiscoverEngine::RunL end");
+ }
+
+TInt CRsBtDiscoverEngine::RunError(TInt aError)
+ {
+ LOG1("CRsBtDiscoverEngine::RunError aError: %d", aError);
+ Stop();
+
+ //Make call to callback function informing that there was an error.
+ iObserver.HandleDiscoveryEvent(MBtDiscoveryObserver::EErrorDuringDiscover,iStatus.Int());
+ LOG("CRsBtDiscoverEngine::RunError end");
+ return KErrNone;
+ }
+
+/**
+ * @brief Starts the asynchronous discovery of devices.
+ *
+ * Starts the asynchronous discovery of devices, it will first report
+ * the devices that are stored on the cache from a previous run.
+ * If no devices were returned from the cache, it will start the
+ * Bluetooth discovery process inmediatly.
+ *
+ * @param aRequestedProtocols The requested protocols.
+ */
+void CRsBtDiscoverEngine::Start(TUint aRequestedProtocols)
+ {
+ LOG1("[CRsBtDiscoverEngine::StartL]\t aRequestedProtocols: %d", aRequestedProtocols);
+ iRequestedProtocols = aRequestedProtocols;
+ iFoundBeforeArray.Reset();
+
+ if(!iDiscover->IsFindingDevices() && !iDiscover->IsDoingSDP())
+ {
+ LOG("[CRsBtDiscoverEngine::StartL]\t inside IF clause");
+ Cancel();
+ ResetDevice();
+
+ StartDiscovery();
+ }
+
+ LOG("[CRsBtDiscoverEngine::StartL]\t exit");
+ }
+
+/**
+ * @brief Stops the asynchronous discovery of devices.
+ *
+ * Starts the asynchronous discovery of devices, it will first report
+ * the devices that are stored on the cache from a previous run.
+ * If no devices were returned from the cache, it will start the
+ * Bluetooth discovery process inmediatly.
+ *
+ * @param aRequestedProtocols The requested protocols.
+ */
+void CRsBtDiscoverEngine::Stop()
+ {
+ LOG("[CRsBtDiscoverEngine::Stop]\t");
+
+ if(IsActive())
+ Cancel();
+ else
+ DoCancel();
+
+ LOG("[CRsBtDiscoverEngine::Stop]\t exit");
+ }
+
+/**
+ * @brief Start the asynchronous Bluetooth discovery process.
+ *
+ * This function calls the method CBtDiscover::FindDevicesL() which
+ * will cause RunL() with status EFindingDevices to be called when a
+ * device is discovered. All bluetooth devices will be find, and RunL()
+ * will determine if it might be a device that we can use.
+ *
+ * @sa FindMoreDevices()
+ */
+void CRsBtDiscoverEngine::StartDiscovery()
+ {
+ LOG("[CRsBtDiscoverEngine::StartDiscovery]\t begin");
+ iState = EFindingDevices;
+ iDiscover->Start( iStatus );
+
+ LOG1( "[CRsBtDiscoverEngine::StartDiscovery]\t iStatus.Int(): 0x%X", iStatus.Int() );
+ if( iStatus == KErrNotSupported )
+ {
+ // cleanup if error
+ iDiscover->Stop();
+ TRequestStatus *tmpStat = &iStatus;
+ User::RequestComplete(tmpStat, KErrHostResNoMoreResults);
+ }
+ else
+ {
+ iTimeout->Cancel();
+ iTimeout->Start(KDiscoveryDelay);
+ }
+ SetActive();
+ LOG("[CRsBtDiscoverEngine::StartDiscovery]\t end");
+ }
+
+/**
+ * @brief Find the next device.
+ *
+ * It the current state is ESendingCached this will call
+ * ReportCachedDeviceL() again to fetch the next cached device.
+ *
+ * If the state is ERemovingStale it will call
+ * RemoveStalePrintersL() again to remove the next stale device.
+ *
+ * Otherwise, it will call CBtDiscover::FindMoreDevices() to
+ * discover another device.
+ */
+void CRsBtDiscoverEngine::ContinueDiscovery()
+ {
+ LOG1("[CRsBtDiscoverEngine::ContinueDiscoveryL]\t begin iState: %d", iState);
+
+ Cancel();
+
+ iState = EFindingDevices;
+ iDiscover->GetNextDevice(iStatus);
+ iTimeout->Cancel();
+ iTimeout->Start(KDiscoveryDelay);
+ SetActive();
+
+ }
+
+void CRsBtDiscoverEngine::HandleTimeoutL()
+ {
+ LOG("[CRsBtDiscoverEngine::HandleTimeoutL]\t begin");
+
+ Stop();
+ if (iState == EGettingServices && IsActive())
+ {
+ LOG("[CRsBtDiscoverEngine::StopServiceDiscovery]\t complete iStatus IS IT OK???");
+ TRequestStatus *tmpStat = &iStatus;
+ User::RequestComplete(tmpStat, KErrNone);
+ }
+ iObserver.HandleDiscoveryEvent(MBtDiscoveryObserver::EDoneFindingPrinters, KErrNone);
+
+ LOG("[CRsBtDiscoverEngine::HandleTimeoutL]\t end");
+ }
+
+/**
+ * @brief Determine if the BT Device could be a device we need.
+ *
+ * When any BT Device is discovered RunL() will be called, and it
+ * will use this function to do a first check on the device to see
+ * if it is a device that we could use, or if it is a device that
+ * is totally unrelated to printing and we can ignore rigth away.
+ *
+ * Currently we are checking if the device is either a Rendering
+ * device or a Computer device. If it is a computer it should support
+ * Object Transfers to be useful.
+ *
+ * With this first check we can't be 100% sure if this is a device
+ * that we can use. If it is a potentially useful device we will need
+ * to do a Service Discovery (SDP) check later.
+ *
+ * @return ETrue if this is an appropiate BT Device, EFalse if this device must be ignored.
+ *
+ * @sa ServiceDiscoveryL()
+ */
+TBool CRsBtDiscoverEngine::CheckBtDevice()
+ {
+ // Algorithm to understand Device / Service Class bits
+
+ //1. Are "Rendering"0x40000 and "Object Transfer"0x100000 bits set in the Major Service
+ // Class field? If not, check if it is a Computer and Supports Object Transfer.
+ //2. If it is a Rendering device and the Major Device Class is "Imaging"0x600, is the "Printer"0x80 bit set in
+ // the Minor Device Class field? If not, ignore this Bluetooth device.
+ //3. If the device was a Computer and it supports Object Transfer, check that
+ // the MinorDeviceClass Field is any of Desktop | Laptop | Server.
+
+ // http://www.bluetooth.org/assigned-numbers/baseband.htm
+ // http://www.bluetooth.org/assigned-numbers/sdp.htm
+
+ TUint32 devClass = iDiscover->GetDeviceClass().DeviceClass();
+ LOG1("[CRsBtDiscoverEngine::CheckBtDevice]\t devClass: %d", devClass);
+
+ TBool potentialDevice = EFalse;
+
+ if( !(devClass & KBTMjrSvcClassObjectTransfer_V2) )
+ {
+ LOG("[CRsBtDiscoverEngine::CheckBtDevice]\t !KBTMjrSvcClassObjectTransfer_V2 -> return");
+ return potentialDevice;
+ }
+
+ if (devClass & KBTMjrSvcClassRendering_V2)
+ {
+ if( (devClass & KBTMjrDevClassImaging_V2) && !(devClass & KBTMinDevClassPrinter_V2) )
+ {
+ // Other imaging device
+ LOG("[CRsBtDiscoverEngine::CheckBtDevice]\t other imaging device");
+ potentialDevice = EFalse;
+ }
+ else
+ {
+ // Possibly a BPP printer,
+ LOG("[CRsBtDiscoverEngine::CheckBtDevice]\t KBTMjrSvcClassRendering_V2 and KBTMjrSvcClassObjectTransfer_V2");
+ potentialDevice = ETrue;
+ }
+ }
+ else if(devClass & KBTMjrDevClassComputer)
+ {
+ // Note: If it is a Rendering Device, it could support BPP or OPP or both. So we will need to do a SDP to know.
+ // On the other hand, if the Device is of Class Computer, we can check here if we want the device or not
+ // by checking if iRequestedProtocols contains KImagePrint_PrinterProtocol_OPP_PC. If not, then we don't want
+ // any Computer Devices.
+
+
+ if ( (iRequestedProtocols & KImagePrint_PrinterProtocol_OPP_PC) &&
+ ( (devClass & KBTMinDevClassDesktop) ||
+ (devClass & KBTMinDevClassServer) ||
+ (devClass & KBTMinDevClassLaptop) ) )
+ {
+ LOG("[CRsBtDiscoverEngine::CheckBtDevice] OPP Computers were requested and this is a computer");
+ potentialDevice = ETrue;
+ }
+ }
+
+ LOG1("[CRsBtDiscoverEngine::CheckBtDevice]\t potentialDevice: %d", potentialDevice);
+ return potentialDevice;
+ }
+
+/**
+ * @brief Start SDP (Service Discovery Protocol) on a device.
+ *
+ * Start SDP (Service Discovery Protocol) on a device to make sure that
+ * it supports the services needed by this system. The Services that
+ * we are looking for are DirectPrinting (BPP) and OBEX Object Push (OPP).
+ *
+ * This method will only call CBtDiscover::VerifyServiceSupportL() which
+ * is an asynchronous call. RunL() will be called back when the results are
+ * ready.
+ */
+void CRsBtDiscoverEngine::ServiceDiscoveryL()
+ {
+ iDiscover->GetSupportedServicesL(iStatus, KBtMaskObexLevel);
+ iState = EGettingServices;
+ SetActive();
+ }
+
+void CRsBtDiscoverEngine::StopServiceDiscovery()
+{
+ LOG1("[CRsBtDiscoverEngine::StopServiceDiscovery]\t iState %d",iState);
+ if (iState == EGettingServices && IsActive())
+ {
+ LOG("[CRsBtDiscoverEngine::StopServiceDiscovery]\t complete iStatus IS IT OK???");
+ TRequestStatus *tmpStat = &iStatus;
+ User::RequestComplete(tmpStat, KErrNone);
+ }
+ iDiscover->StopSDP();
+}
+
+/**
+ * @brief Compose the device.
+ *
+ * When a Service Discovery has finished, we need to see
+ * if the services that we want were found on the device.
+ * This function will also tell if this device supports a
+ * protocol that was requested.
+ *
+ * If a device was determined to support BPP and/or OPP it
+ * supports a protocol this library can manage.
+ *
+ * For example:
+ * If the libray is requesting devices that support
+ * the protocol KImagePrint_PrinterProtocol_OPP_Printer and the
+ * current device supports only KImagePrint_PrinterProtocol_BPP
+ * then this device will be handled because this library
+ * can manage BPP Printers. But this device will not be used because
+ * the library is currently requesting only the OPP_Printer protocol.
+ * In this case ComposeDeviceL() will return EFalse, indicating that
+ * we won't use this device.
+ *
+ * @return ETrue if this is a device that we can use, EFalse if this device cannot be used.
+ */
+TBool CRsBtDiscoverEngine::ComposeDeviceL()
+ {
+ LOG("[CRsBtDiscoverEngine::ComposeDeviceL]\t begin");
+
+ TBool wantedDevice( EFalse );
+ TNameRecord name = iDiscover->GetNameRecord();
+ ResetDevice();
+ CRsBtDevice *device = CRsBtDevice::NewLC( name );
+
+ TUint supportedProtocols( 0 );
+ if( iDiscover->IsBPPSupported() )
+ {
+ LOG("[CRsBtDiscoverEngine::ComposeDeviceL]\t BPP supported");
+ // We indicate that this device does support this protocol
+ supportedProtocols = KImagePrint_PrinterProtocol_BPP;
+ // But we still need to see if that protocol was requested.
+ if( iRequestedProtocols & KImagePrint_PrinterProtocol_BPP )
+ {
+ device->SetBPPPort( iDiscover->GetBPPPort() );
+ device->SetSTSPort( iDiscover->GetSTSPort() );
+ wantedDevice = ETrue;
+ }
+ }
+
+ if( iDiscover->IsOPPSupported() )
+ {
+ // It must be either a Computer or a Printer, but NOT both!
+ TBTDeviceClass deviceClass = device->DeviceClass();
+
+ if( deviceClass.DeviceClass() & KBTMjrDevClassComputer )
+ {
+ LOG("[CRsBtDiscoverEngine::ComposeDeviceL]\t OPP computer");
+ supportedProtocols |= KImagePrint_PrinterProtocol_OPP_PC;
+ if( iRequestedProtocols & KImagePrint_PrinterProtocol_OPP_PC )
+ {
+ device->SetOPPPort(iDiscover->GetOPPPort());
+ wantedDevice = ETrue;
+ }
+ }
+ else
+ {
+ LOG("[CRsBtDiscoverEngine::ComposeDeviceL]\t OPP printer(?)");
+ supportedProtocols |= KImagePrint_PrinterProtocol_OPP_Printer;
+ if( iRequestedProtocols & KImagePrint_PrinterProtocol_OPP_Printer )
+ {
+ device->SetOPPPort(iDiscover->GetOPPPort());
+ wantedDevice = ETrue;
+ }
+ }
+ }
+
+ // Store if wanted device
+ if( wantedDevice )
+ {
+ LOG1("[CRsBtDiscoverEngine::ComposeDeviceL]\t iRequestedProtocols: %d", iRequestedProtocols);
+ LOG1("[CRsBtDiscoverEngine::ComposeDeviceL]\t supportedProtocols: %d", supportedProtocols);
+ device->SetSupportedProtocols(supportedProtocols);
+ device->SetPrinterModelL(iDiscover->GetPrinterModel());
+ device->SetVendor(iDiscover->GetVendor());
+ device->SetJustFound(ETrue);
+
+ iDevice = device;
+ CleanupStack::Pop(device);
+ device = NULL;
+ LOG1("[CRsBtDiscoverEngine::ComposeDeviceL]\t iDevice: %d", iDevice);
+ }
+ else
+ {
+ LOG("[CRsBtDiscoverEngine::ComposeDeviceL]\t NOT wanted device, don't store");
+ CleanupStack::PopAndDestroy(device);
+ }
+
+ // We have now added this device to the cache, along with the protocols
+ // that it supports. However we wont report it if it does not support
+ // the specific protocol that was requested.
+
+ LOG1("[CRsBtDiscoverEngine::ComposeDeviceL]\t end with: %d", wantedDevice);
+ return wantedDevice;
+ }
+
+/**
+ * @brief Obtain the current device.
+ *
+ * @param[out] aSequence Will obtain the position the current device.
+ *
+ * @return A reference to the current CRsBtDevice.
+ */
+CRsBtDevice& CRsBtDiscoverEngine::GetDevice()
+ {
+ return *iDevice;
+ }
+
+void CRsBtDiscoverEngine::ResetDevice()
+{
+ if(iDevice)
+ {
+ delete iDevice;
+ iDevice = NULL;
+ }
+}
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cxmlhandler.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,361 @@
+/*
+* 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: Handler for XML file modify. Defines the class to store and modify XML data.
+*
+*/
+
+
+#ifdef _DEBUG
+#include <driveinfo.h>
+#include <pathinfo.h>
+#endif
+
+#include "cxmlhandler.h"
+#include "clog.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::NewL
+//
+//--------------------------------------------------------------------------------------------
+CXmlHandler* CXmlHandler::NewL()
+ {
+ CXmlHandler *self = NewLC();
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CXmlHandler* CXmlHandler::NewLC()
+ {
+ CXmlHandler *self = new (ELeave) CXmlHandler();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::~CXmlHandler
+//
+//--------------------------------------------------------------------------------------------
+CXmlHandler::~CXmlHandler()
+{
+ if(iDataBuf)
+ delete iDataBuf;
+ iDataBuf = NULL;
+
+ Reset();
+
+ iFs.Close();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::ConstructL()
+{
+ LOG("[CXmlHandler::ConstructL]\t");
+ User::LeaveIfError( iFs.Connect() );
+ Reset();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::InitFromFileL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::InitFromFileL(const TDesC& aFile, const TInt aId)
+{
+ LOG("[CXmlHandler::InitFromFileL]\t");
+ Reset();
+
+ ReadFileL(aFile);
+ iBufferId = aId;
+
+ LOG("[CXmlHandler::InitFromFileL]\t Done.");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::InitFromBufferL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::InitFromBufferL(const TDesC8& aBuffer, const TInt aId)
+{
+ LOG("[CXmlHandler::InitFromBufferL]\t");
+
+ Reset();
+
+ if(0 >= aBuffer.Length())
+ {
+ User::Leave(KErrArgument);
+ }
+
+ iDataBuf = static_cast<HBufC8*>(User::LeaveIfNull(aBuffer.AllocL()));
+ iBufferId = aId;
+
+ LOG("[CXmlHandler::InitFromBufferL]\t Done.");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::Reset
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::Reset()
+{
+ LOG("[CXmlHandler::Reset]\t");
+
+ if(iDataBuf)
+ delete iDataBuf;
+ iDataBuf = NULL;
+
+ iBufferId = KErrNotFound;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::Reset
+//
+//--------------------------------------------------------------------------------------------
+TInt CXmlHandler::BufferId()
+{
+ return iBufferId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::Reset
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CXmlHandler::Buffer()
+{
+ if(iDataBuf)
+ return iDataBuf->Des();
+
+ return KNullDesC8();
+}
+
+// PRIVATE
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::CXmlHandler
+//
+//--------------------------------------------------------------------------------------------
+CXmlHandler::CXmlHandler()
+{
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::FinalizeBufferL
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CXmlHandler::FinalizeBufferL(const TDesC8& aTag)
+{
+ LOG("[CXmlHandler]\t FinalizeBufferL");
+
+ User::LeaveIfNull(iDataBuf);
+
+ // Cut the template to the end tag
+ TInt pos = iDataBuf->Find(aTag);
+ if(KErrNotFound == pos)
+ User::Leave(KErrCorrupt);
+
+ TInt dataLen = pos + aTag.Length();
+ TPtrC8 tail = iDataBuf->Left(dataLen);
+
+ return tail;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::DeleteBufferData
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::DeleteBufferData(TInt aOffset, TInt aLength)
+{
+ iDataBuf->Des().Delete(aOffset, aLength);
+
+}
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::ReadL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::ReadFileL(const TDesC& aFileName)
+{
+ LOG("[CXmlHandler]\t ReadFileL");
+ // Open the template file and read it into buffer
+ RFile templateFile;
+ CleanupClosePushL(templateFile);
+
+ User::LeaveIfError( templateFile.Open( iFs, aFileName, EFileRead) );
+
+ TInt fileSize = 0;
+ TInt err = templateFile.Size(fileSize);
+ if(KErrNone != err)
+ fileSize = KBtMaxFileSize;
+
+ iDataBuf = HBufC8::NewL(fileSize);
+ TPtr8 bufferPtr( iDataBuf->Des() );
+
+ bufferPtr.Zero();
+ templateFile.Read(bufferPtr);
+
+ CleanupStack::PopAndDestroy(&templateFile);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::GetDataL
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CXmlHandler::GetDataL(const TDesC8 &aStart, const TDesC8 &aEnd, TInt& aOffset)
+{
+ User::LeaveIfNull(iDataBuf);
+ return ParseValue(iDataBuf->Des(), aStart, aEnd, aOffset);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::GetDataListL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::GetDataListL(const TDesC8 &aStart, const TDesC8 &aEnd, CDesC8ArrayFlat& aList)
+{
+ User::LeaveIfNull(iDataBuf);
+ ParseValueListL(iDataBuf->Des(), aStart, aEnd, aList);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::ParseValue
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CXmlHandler::ParseValue(const TDesC8 &aData, const TDesC8 &aStart, const TDesC8 &aEnd, TInt& aOffset)
+{
+// LOG82("[CXmlHandler::ParseValue]\t s: %S, e: %S", &aStart, &aEnd);
+ aOffset = aData.Find(aStart);
+ if(0 > aOffset)
+ {
+ return KNullDesC8();
+ }
+
+ TInt end = aData.Find(aEnd);
+ TInt len = end-aOffset-aStart.Length();
+ if(0 >= len)
+ {
+ aOffset = end;
+ return KNullDesC8();
+ }
+
+ return aData.Mid(aOffset+aStart.Length(), len);
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::ParseValueList
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::ParseValueListL(const TDesC8 &aData, const TDesC8 &aStart, const TDesC8 &aEnd, CDesC8ArrayFlat& aList)
+{
+ LOG("[CXmlHandler::ParseValueListL]\t ");
+ TPtrC8 tmpPtr = aData;
+
+ TInt offset = tmpPtr.Find(aStart);
+ while(offset != KErrNotFound)
+ {
+ TInt end = tmpPtr.Find(aEnd);
+ if(0 > end)
+ {
+ return;
+ }
+ TPtrC8 valuePtr = tmpPtr.Mid(offset+aStart.Length(), end-offset-aStart.Length());
+
+ HBufC8* listEntry = valuePtr.AllocLC();
+ aList.AppendL(listEntry->Des());
+ CleanupStack::PopAndDestroy(); // listEntry
+
+ tmpPtr.Set( tmpPtr.Right(tmpPtr.Length()-(end+aEnd.Length()) ) );
+ offset = tmpPtr.Find(aStart);
+
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::ComposeDataL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::ComposeDataL(const TInt aValue, const TDesC8 &aTag)
+{
+ TBuf8<KDefaultRealWidth> valueStr;
+ valueStr.Zero();
+ valueStr.AppendNum(aValue);
+
+ ComposeDataL(valueStr, aTag);
+}
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::ComposeDataL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::ComposeDataL(const TDesC8 &aData, const TDesC8 &aTag)
+{
+ User::LeaveIfNull(iDataBuf);
+
+ TInt pos = iDataBuf->Find(aTag);
+ if(KErrNotFound == pos)
+ User::Leave(KErrCorrupt);
+
+ while(KErrNotFound != pos)
+ {
+ TInt requiredSize = iDataBuf->Des().Length() + aData.Length();
+ if(iDataBuf->Des().MaxLength() < requiredSize)
+ {
+ iDataBuf = iDataBuf->ReAllocL(requiredSize);
+ }
+ iDataBuf->Des().Replace(pos, aTag.Length(), aData);
+ pos = iDataBuf->Find(aTag);
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXmlHandler::InsertDataL
+//
+//--------------------------------------------------------------------------------------------
+void CXmlHandler::InsertDataL(const TDesC8 &aData, const TInt aOffset)
+{
+ TInt requiredSize = iDataBuf->Des().Length() + aData.Length();
+ if(iDataBuf->Des().MaxLength() < requiredSize)
+ {
+ iDataBuf = iDataBuf->ReAllocL(requiredSize);
+ }
+ iDataBuf->Des().Insert(aOffset, aData);
+}
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/main.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,40 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "cbtprintingdevice.h"
+
+// Entry point to the application DLL
+
+// Map the interface UIDs to implementation factory functions
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( 0x10208A21, CBtPrintingDevice::NewL )
+ };
+
+// Exported proxy for instantiation method resolution
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/rsutils.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,645 @@
+/*
+* 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:
+*
+*/
+
+
+// EXTERNAL INCLUDES
+#include <s32file.h>
+#include <charconv.h>
+#include <bautils.h>
+#include <pathinfo.h>
+#include <utf.h>
+#include <obexbaseobject.h>
+#include <centralrepository.h>
+#include <driveinfo.h>
+
+#include "rsutils.h"
+#include "btprotocolconsts.h"
+#include "cbtonquery.h"
+#include "clog.h"
+
+namespace
+ {
+ const TInt KSegBufChunkSize=2048;
+#ifdef ENABLE_LOGGING // for removing compile warnings
+ const TInt KLogBufferSize = 50;
+#endif
+ }
+
+
+
+LOCAL_C TInt SearchAndReplace(TDes &aString, const TDesC &aSearch, const TDesC &aReplace)
+{
+ TInt nPos, nLengthLeft;
+
+ nLengthLeft = aString.MaxLength() - aString.Length();
+
+ nPos = aString.Find(aSearch);
+ while (nPos != KErrNotFound)
+ {
+ if ((nLengthLeft - (aReplace.Length() - aSearch.Length())) < 0)
+ {
+ return KErrGeneral;
+ }
+ aString.Replace (nPos, aSearch.Length(), aReplace);
+ nLengthLeft = aString.MaxLength() - aString.Length();
+ nPos = aString.Find(aSearch);
+ }
+ return KErrNone;
+}
+
+LOCAL_C void SearchAndReplaceL(CBufBase& aString, TDesC8& aSearch, TDesC8& aReplace)
+{
+ TInt nExtraLength = 0;
+ TInt nLength = aString.Size();
+ TInt nTempPos = 0;
+
+ HBufC8* buf = HBufC8::NewLC(nLength);
+ TPtr8 ptr(buf->Des());
+ aString.Read(0, ptr, nLength);
+
+ TInt nPos = 0;
+ while (nPos < nLength)
+ {
+ nTempPos = ptr.Mid(nPos).Find(aSearch);
+ if (nTempPos == KErrNotFound)
+ break;
+ nPos += nTempPos;
+ aString.Delete(nPos+nExtraLength, aSearch.Length());
+ aString.InsertL(nPos+nExtraLength, aReplace);
+ nExtraLength += aReplace.Length()-aSearch.Length();
+ nPos++;
+ }
+
+ CleanupStack::PopAndDestroy(buf);
+}
+
+LOCAL_C void SearchAndReplace(TDes &aString, TChar aChar, TChar aReplace)
+{
+ TBuf<1> aSrc1, aRep2;
+ aSrc1.Append(aChar);
+ aRep2.Append(aReplace);
+
+ SearchAndReplace(aString, aSrc1, aRep2);
+}
+
+void RsUtils::CleanFileName(const TDesC &aOldFname, TDes& aNewFname)
+{
+LOG1("RsUtils::CleanFileName aOldFname: %S", &aOldFname);
+ TInt nLen;
+
+ const TUint colon=TChar(':');
+
+ if (aOldFname.Length() == 0 || aNewFname.Length() == 0)
+ return;
+
+ nLen = aOldFname.Length();
+ if(nLen > 3 && aOldFname[1] == colon)
+ {
+ // strip off c:\ at the front
+ aNewFname = aOldFname.Right(nLen-3);
+ }
+ else
+ aNewFname=aOldFname;
+
+ // Change \ into /
+ SearchAndReplace (aNewFname, '\\', '/');
+ LOG1("RsUtils::CleanFileName aNewFname: %S", &aNewFname);
+}
+
+
+LOCAL_C void ConvertFrom8To16Bit(const TDesC8& aSrc, TDes8& aDest)
+{
+ const TInt srcLen = aSrc.Length();
+ const TInt destMaxLen = aDest.MaxSize();
+
+ if (srcLen*2 > destMaxLen)
+ return;
+
+ aDest.SetLength(srcLen*2);
+ aDest.FillZ();
+ for (TInt i = 0; i < srcLen; i++)
+ {
+ aDest[2*i] = aSrc[i];
+ aDest[2*i+1] = 0x00;
+ }
+}
+
+HBufC16* RsUtils::MakeXHTMLSafeL(const TDesC16& aString)
+{
+ // Change XHTML special characters to their printable equivalents
+ CBufSeg* seg=CBufSeg::NewL(KSegBufChunkSize);
+ CleanupStack::PushL(seg);
+
+ seg->InsertL(0, &aString[0], aString.Length()*2);
+
+ TBuf8<16> src;
+ TBuf8<18> rep;
+
+ _LIT8(KAmpersand, "&");
+ ConvertFrom8To16Bit(KAmpersand, rep);
+ ConvertFrom8To16Bit(_L8("&"), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ _LIT8(KLessthan, "<");
+ ConvertFrom8To16Bit(KLessthan, rep);
+ ConvertFrom8To16Bit(_L8("<"), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ _LIT8(KGreaterthan, ">");
+ ConvertFrom8To16Bit(KGreaterthan, rep);
+ ConvertFrom8To16Bit(_L8(">"), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ _LIT8(KApostrophe, "'");
+ ConvertFrom8To16Bit(KApostrophe, rep);
+ ConvertFrom8To16Bit(_L8("\'"), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ _LIT8(KDoubleQuote, """);
+ ConvertFrom8To16Bit(KDoubleQuote, rep);
+ ConvertFrom8To16Bit(_L8("\""), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ // Replace the many types of newlines with the XHTML break sequence
+ _LIT8(KTokenNewLine8,"<br/>");
+ ConvertFrom8To16Bit(KTokenNewLine8, rep);
+
+ ConvertFrom8To16Bit(_L8("\r\n"), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ ConvertFrom8To16Bit(_L8("\n"), src);
+ SearchAndReplaceL(*seg, src, rep);
+
+ TUint16 newLine=0x2029;
+ src.Copy(((TUint8*)&newLine),2);
+ SearchAndReplaceL(*seg, src, rep);
+
+ newLine=0x2028;
+ src.Copy(((TUint8*)&newLine),2);
+ SearchAndReplaceL(*seg, src, rep);
+
+
+ TInt len = seg->Size()/2;
+ HBufC16* retBuf = HBufC16::NewL(len);
+ TPtr16 ptr16(retBuf->Des());
+ ptr16.SetLength(len);
+ seg->Read(0, &ptr16[0], len*2);
+
+ CleanupStack::PopAndDestroy(seg);
+
+ return retBuf;
+
+}
+
+
+HBufC8* RsUtils::ConvertFromUnicodeToUtf8LC(const TDesC16& aUnicode)
+{
+ CBufSeg* seg=CBufSeg::NewL(KSegBufChunkSize);
+ CleanupStack::PushL(seg);
+
+ const TInt KNumCharConvert = 30;
+
+ HBufC8* buf = HBufC8::NewLC(KNumCharConvert*10);
+ TPtr8 ptr(buf->Des());
+
+ TInt nInsertPos = 0;
+ TInt nSrcPos = 0;
+ TInt nLength = KNumCharConvert;
+ TInt nSrcLength = aUnicode.Length();
+ TInt nUnconvCharsLeft = 0;
+
+ //start loop
+ while (nSrcPos < nSrcLength)
+ {
+ ptr.SetLength(0);
+ nLength = Min(KNumCharConvert, nSrcLength-nSrcPos);
+
+ //convert to utf8
+ nUnconvCharsLeft = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr, aUnicode.Mid(nSrcPos, nLength));
+
+ //append converted text to a buffer
+ seg->InsertL(nInsertPos, ptr);
+
+ nInsertPos += ptr.Length();
+ nSrcPos += (nLength-nUnconvCharsLeft);
+ }
+ CleanupStack::PopAndDestroy(buf);
+
+ //copy converted data to a buffer to return
+ nLength = seg->Size();
+ HBufC8* retBuf = HBufC8::NewL(nLength);
+ TPtr8 ptrRet(retBuf->Des());
+ seg->Read(0, ptrRet, nLength);
+ *retBuf=ptrRet;
+
+ CleanupStack::PopAndDestroy(seg);
+
+ CleanupStack::PushL(retBuf);
+ return retBuf;
+}
+
+// correct order one...
+HBufC8* RsUtils::ConvertToUtf8SafeLC(const TDesC16& aUnicode)
+{
+ if (!aUnicode.Length())
+ {
+ HBufC8* buf = HBufC8::NewLC(1);
+ return buf;
+ }
+
+ HBufC16* buf1 = MakeXHTMLSafeL(aUnicode);
+ CleanupStack::PushL(buf1);
+ HBufC8* retBuf = ConvertFromUnicodeToUtf8LC(*buf1);
+
+ CleanupStack::Pop(retBuf);
+ CleanupStack::PopAndDestroy(buf1);
+ CleanupStack::PushL(retBuf);
+ return retBuf;
+}
+
+
+void RsUtils::FindWidthHeightForPrinting(TInt &aWidth, TInt &aHeight, const TInt aMaxWidth, const TInt aMaxHeight)
+{
+ if (aWidth*aMaxHeight == aHeight*aMaxWidth)
+ {
+ aWidth = aMaxWidth;
+ aHeight = aMaxHeight;
+ }
+ else if (aWidth*aMaxHeight > aHeight*aMaxWidth)
+ {
+ aHeight = (aMaxWidth*aHeight)/aWidth;
+ aWidth = aMaxWidth;
+ }
+ else
+ {
+ aWidth = (aMaxHeight*aWidth)/aHeight;
+ aHeight = aMaxHeight;
+ }
+}
+
+
+
+
+// All the helper functions
+
+
+// returns the file name
+
+TFileName RsUtils::FileName( const TFileName& aFullName )
+ {
+ TParse parse;
+ parse.Set(aFullName, NULL, NULL);
+ return parse.NameAndExt();
+ }
+
+
+/** Test whether a path points to ROM. The file does not need to exist
+ */
+TBool RsUtils::PathIsInRom(const TFileName &aFileName)
+ {
+ LOG("RsUtils::PathIsInRom begin");
+ TParsePtrC parseSource( aFileName );
+ TInt driveId;
+ TFileName path;
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRom, driveId );
+ PathInfo::GetFullPath( path, driveId, PathInfo::ERomRootPath );
+ TParsePtrC parseRom( path );
+
+ TBool res = ( parseSource.Drive().CompareF( parseRom.Drive() ) == 0 ) ? ETrue : EFalse;
+ LOG1("RsUtils::PathIsInRom res: %d", res);
+ return res;
+ }
+
+/** Returns a fullname with a drive not in rom
+ */
+TFileName RsUtils::PathNotRom(const TFileName &aFileName)
+ {
+ LOG1("RsUtils::PathNotRom aFileName: %S", &aFileName);
+
+ if( PathIsInRom( aFileName ) )
+ {
+ LOG("RsUtils::PathNotRom file in rom");
+ TParse parse;
+
+ TInt driveId;
+ TFileName path;
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory, driveId );
+ PathInfo::GetRootPath( path, driveId );
+ TParsePtrC parsePhoneDrive( path );
+
+ TFileName drive = parsePhoneDrive.Drive();
+ parse.Set(drive, &aFileName, NULL);
+ return parse.FullName();
+ }
+ else
+ {
+ LOG("RsUtils::PathNotRom file NOT in rom");
+ return aFileName;
+ }
+ }
+
+
+
+TBool RsUtils::FileExists(const TDesC& aFileName, RFs& aFs)
+{
+ return (BaflUtils::FileExists(aFs, aFileName));
+}
+
+TInt RsUtils::FileSize(const TDesC& aFileName, TInt& aSize, RFs& aFs)
+{
+ TEntry theFile;
+ TInt error = aFs.Entry(aFileName, theFile);
+ aSize = theFile.iSize;
+ return error;
+}
+
+
+
+HBufC* RsUtils::ConcatenateStringsLC(const TDesC& aDes1, const TDesC& aDes2)
+{
+ const TInt newLen=aDes1.Length()+aDes2.Length();
+ HBufC* newBuf=HBufC::NewLC(newLen);
+ *newBuf=aDes1;
+ TPtr newPtr(newBuf->Des());
+ newPtr.Append(aDes2);
+ *newBuf=newPtr;
+ return newBuf;
+}
+
+HBufC* RsUtils::ConcatenateStringsLC(const TDesC& aDes1, const TDesC& aDes2, const TDesC& aDes3)
+{
+ HBufC* twoSt=ConcatenateStringsLC(aDes1,aDes2);
+ HBufC* allThree=ConcatenateStringsLC(*twoSt,aDes3);
+ CleanupStack::Pop(allThree);
+ CleanupStack::PopAndDestroy(twoSt);
+ CleanupStack::PushL(allThree);
+ return allThree;
+}
+
+
+// WARNING: This function uses User::WaitForRequest,
+// so check carefully where to use it to avoid View Server 11 panic
+TBool RsUtils::IsBluetoothOn()
+ {
+ const TUid KPowerModeSettingNotifierUid = {0x100059E2}; // Notifier id for BT power mode setting
+ TPckgBuf<TBool> pckg( ETrue ); // Input parameter
+ TPckgBuf<TBool> resultPckg( EFalse ); // Output parameter
+ RNotifier notif;
+ if( notif.Connect() == KErrNone )
+ {
+ TRequestStatus stat;
+ notif.StartNotifierAndGetResponse(stat, KPowerModeSettingNotifierUid, pckg, resultPckg);
+ User::WaitForRequest(stat);
+ notif.CancelNotifier(KPowerModeSettingNotifierUid);
+ notif.Close();
+ }
+ return resultPckg();
+ }
+
+TLanguage RsUtils::GetPhoneLanguage()
+{
+ return User::Language();
+}
+
+
+TInt RsUtils::CreateDataFolder( RFs& aSession, TDes& aPath, TDriveNumber aDrive )
+ {
+ LOG1("RsUtils::CreateDataFolder aDrive: %d", aDrive);
+ _LIT( KColon, ":" );
+ TChar drive;
+ TInt err = aSession.DriveToChar( aDrive, drive );
+ if( !err )
+ {
+ err = aSession.CreatePrivatePath( aDrive );
+ if( !err )
+ {
+ TFileName path;
+ aSession.PrivatePath( path );
+ aPath.Zero();
+ aPath.Append( drive );
+ aPath.Append( KColon );
+ aPath.Append( path );
+ }
+ }
+ LOG1("RsUtils::CreateDataFolder end with aPath: %S", &aPath);
+ LOG1("RsUtils::CreateDataFolder end with err: %d", err);
+ return err;
+ }
+
+
+TInt RsUtils::ValidateCacheFile( RFs& aSession, const TDesC& aFileName,
+ TTimeIntervalMinutes aValidPeriod, TBool& aDeleted )
+ {
+ aDeleted = EFalse;
+ TEntry entry;
+ TInt err = aSession.Entry( aFileName, entry );
+
+ if( !err )
+ {
+ TTime now;
+ now.UniversalTime();
+ now -= aValidPeriod;
+ if( entry.iModified < now )
+ {
+ // cache file was not used for a aValidPeriod period of time; delete it
+ err = aSession.Delete( aFileName );
+ if( !err ) aDeleted = ETrue;
+ }
+ }
+ LOG1("RsUtils::ValidateCacheFile aDeleted: %d", aDeleted);
+ LOG1("RsUtils::ValidateCacheFile err: %d", err);
+ return err;
+ }
+
+void RsUtils::LogL( const CBufBase& aBuffer )
+ {
+ #ifdef ENABLE_LOGGING
+ #define _BUFBASE_LOGGING_
+ #ifdef _BUFBASE_LOGGING_
+ LOG("BUFBASE LOG BEGIN");
+ HBufC8* buffer=HBufC8::NewLC(KLogBufferSize);
+ TPtr8 bufferPtr(buffer->Des());
+ TInt sizeleft=aBuffer.Size();
+ TInt amountToRead=KLogBufferSize;
+ TInt location=0;
+ while(sizeleft>0)
+ {
+ if(sizeleft<KLogBufferSize)
+ amountToRead=sizeleft;
+ aBuffer.Read(location,bufferPtr,amountToRead);
+ LogL( *buffer );
+ sizeleft-=amountToRead;
+ location+=amountToRead;
+ }
+ CleanupStack::PopAndDestroy(); // buffer
+ LOG("BUFBASE LOG END");
+ #endif // _BUFBASE_LOGGING_
+ #endif // ENABLE_LOGGING
+ }
+
+void RsUtils::LogL( CObexBaseObject& aBuffer )
+ {
+ #ifdef ENABLE_LOGGING
+ //#define _OBEXBASE_LOGGING_
+ #ifdef _OBEXBASE_LOGGING_
+ LOG("OBEXBASE LOG BEGIN");
+ LOG1("CObexBaseObject::Name length: %d", aBuffer.Name().Length());
+ LogL(aBuffer.Name());
+ LOG1("CObexBaseObject::Type length: %d", aBuffer.Type().Length());
+ LogL(aBuffer.Type());
+ LOG1("CObexBaseObject::Length: %d", aBuffer.Length());
+ LOG1("CObexBaseObject::Description length: %d", aBuffer.Description().Length());
+ LogL(aBuffer.Description());
+ LOG1("CObexBaseObject::Target length: %d", aBuffer.Target().Length());
+ LogL(aBuffer.Target());
+ const RPointerArray<HBufC8>* http = aBuffer.Http();
+ if( http )
+ {
+ LOG1("http->Count: %d", http->Count());
+ for( TInt i = 0; i < http->Count(); i++ )
+ {
+ LOG1("i: %d", i);
+ LogL(*((*http)[i]));
+ }
+ }
+ LOG1("CObexBaseObject::AppParam length: %d", aBuffer.AppParam().Length());
+ LogL(aBuffer.AppParam());
+
+
+ LOG("OBEXBASE LOG END");
+ #endif // _OBEXBASE_LOGGING_
+ #endif // ENABLE_LOGGING
+ }
+
+void RsUtils::LogL( const TDesC8& aBuffer )
+ {
+ #ifdef ENABLE_LOGGING
+ HBufC16* bufC16 = HBufC16::NewLC( aBuffer.Length() );
+ TPtr16 ptr16 = bufC16->Des();
+ ptr16.Copy( aBuffer );
+ LogL( *bufC16 );
+ CleanupStack::PopAndDestroy(); // bufC16
+ #endif // ENABLE_LOGGING
+ }
+
+void RsUtils::LogL( const TDesC16& aBuffer )
+ {
+ #ifdef ENABLE_LOGGING
+ TInt sizeleft = aBuffer.Length();
+ TInt amountToRead = KLogBufferSize;
+ TInt location = 0;
+ while( sizeleft > 0 )
+ {
+ if( sizeleft < KLogBufferSize )
+ amountToRead = sizeleft;
+ HBufC16* buffer = aBuffer.Mid( location, amountToRead ).AllocL();
+ _LIT( KFormattedString, "ACHTUNG!!! FORMATTED STRING ACHTUNG!!!" );
+ _LIT( KFormatMark, "%" );
+ if( buffer->Find( KFormatMark ) != KErrNotFound )
+ {
+ delete buffer;
+ buffer = NULL;
+ buffer = KFormattedString().AllocL();
+ }
+ LOG1("%S", buffer);
+ delete buffer;
+ buffer = NULL;
+ sizeleft -= amountToRead;
+ location += amountToRead;
+ }
+ #endif // ENABLE_LOGGING
+ }
+
+void RsUtils::LogFileL( const TFileName& aName )
+ {
+ #ifdef ENABLE_LOGGING
+ //#define _FILE_LOGGING_
+ #ifdef _FILE_LOGGING_
+ LOG("FILE LOG BEGIN");
+
+ RFile file;
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+ User::LeaveIfError( file.Open( fs, aName, EFileStream|EFileRead|EFileShareAny ) );
+ CleanupClosePushL( file );
+ TInt fileSize;
+ User::LeaveIfError( file.Size( fileSize ) );
+ HBufC8* buffer=HBufC8::NewLC( KLogBufferSize );
+ TPtr8 bufferPtr( buffer->Des() );
+ TInt sizeleft = fileSize;
+ TInt amountToRead = KLogBufferSize;
+ TInt location = 0;
+ while( sizeleft > 0 )
+ {
+ if( sizeleft < KLogBufferSize )
+ amountToRead = sizeleft;
+
+ User::LeaveIfError( file.Read( location, bufferPtr, amountToRead ) );
+ LogL( *buffer );
+ sizeleft -= amountToRead;
+ location += amountToRead;
+ }
+ CleanupStack::PopAndDestroy( 3 ); // buffer, file, fs
+
+ LOG("FILE LOG END");
+ #endif // _FILE_LOGGING_
+ #endif // ENABLE_LOGGING
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// RsUtils::GetLocalBTNameL
+//
+//--------------------------------------------------------------------------------------------
+void RsUtils::GetLocalBTNameL(TDes8& aName)
+ {
+ LOG("[RsUtils::GetLocalBTNameL] BEGIN");
+ RSocketServ socketServ;
+ User::LeaveIfError( socketServ.Connect() );
+ TProtocolDesc pInfo;
+ TBuf<0x100> name;
+ TInt error = KErrNone;
+
+ _LIT( BTLinkManager, "BTLinkManager" );
+ error = socketServ.FindProtocol( BTLinkManager(), pInfo );
+ LOG1("[RsUtils::GetLocalBTNameL] socketServ.FindProtocol ends with: %d", error );
+ if( KErrNone == error )
+ {
+ RHostResolver hostResolver;
+ error = hostResolver.Open( socketServ, pInfo.iAddrFamily, pInfo.iProtocol );
+ LOG1("[RsUtils::GetLocalBTNameL] hostResolver.Open ends with: %d", error );
+ if( KErrNone == error )
+ {
+ hostResolver.GetHostName( name );
+ hostResolver.Close();
+ }
+ aName.Copy( name );
+ }
+ if ( error != KErrNone )
+ {
+ aName.Zero();
+ // KServiceClass == own ID
+ aName.AppendNum(KServiceClass, EHex);
+ }
+ socketServ.Close();
+ LOG82("[CBtPrintingDevice::GetLocalBTNameL]\t GetLocalBTNameL(%S) %d", &aName, error);
+ LOG("[RsUtils::GetLocalBTNameL] END");
+
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/bwins/dpofprotdllu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/data/01007781.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* 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:
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+// Declares info for DPOF
+RESOURCE REGISTRY_INFO theInfo
+ {
+ // UID for the DLL
+ dll_uid = 0x01007781;
+ // Declare array of interface info
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ // UID of interface that is implemented
+ interface_uid = 0x10208A1E;
+ implementations =
+ {
+ // Info for DPOF
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = 0x10208A20;
+ version_no = 1;
+ display_name = "DPOF";
+ default_data = "DPOF";
+ opaque_data = "";
+ }
+ };
+ }
+ };
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/data/dpof.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,85 @@
+/*
+* 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:
+*
+*/
+
+
+#include <eikon.rh>
+#include <imageprintapp.loc>
+
+#include "imageprint.rh"
+#include "printcapabilitycodes.h"
+#include "imageprintvariant.h"
+
+STRUCT STRING
+ {
+ LTEXT text;
+ }
+
+RESOURCE STRING r_qtn_print_dpof_confirmation_dialog {text=qtn_print_dpof_confirmation_dialog;}
+
+
+enum PrinterClass // should come from ImgPrintKonst.h
+{
+ EDefault = 0,
+ EBigAdaptive = 1,
+ ESmallAdaptive = 2,
+ EDesk = 3,
+ ELinked = 99
+};
+
+RESOURCE RS_CAPABILITIES dpof_Capabilities
+{
+
+ capabilities =
+ {
+ RS_CAPABILITY
+ {
+ printerclass=EDefault;
+ capabilityid=EPrintCapabPaperSize;
+ type=1;
+ defaultvalue=EPrintCapabPaperSizeAuto;
+ low=1;
+ high=400;
+ enumcodes={
+ EPrintCapabPaperSizeAuto,0
+ };
+ linkid=0;
+ printerclass=EDefault;
+ },
+ RS_CAPABILITY
+ {
+ printerclass=EDefault;
+ capabilityid=EPrintCapabLayout;
+ type=1;
+ defaultvalue=EPrintCapabLayout1UpMedium;
+ low=0;
+ high=0;
+ enumcodes={
+ EPrintCapabLayout1UpMedium,0
+ ,EPrintCapabLayout2Up,0
+ ,EPrintCapabLayout4Up,0
+ ,EPrintCapabLayout6Up,0
+ ,EPrintCapabLayout9Up,0
+ ,EPrintCapabLayout12Up,0
+#ifdef IMG_PRINT_DYNAMIC_PRINT_SETTINGS
+ ,EPrintCapabLayout16Up,0
+#endif
+ };
+ linkid=0;
+ }
+ };
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/eabi/dpofprotdllu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,21 @@
+EXPORTS
+ _Z24ImplementationGroupProxyRi @ 1 NONAME
+ _ZTI12CFileManager @ 2 NONAME ; #<TI>#
+ _ZTI13CRsDpofEngine @ 3 NONAME ; #<TI>#
+ _ZTI15CCapabilityInfo @ 4 NONAME ; #<TI>#
+ _ZTI15CPrinterElement @ 5 NONAME ; #<TI>#
+ _ZTI16CCapabilityArray @ 6 NONAME ; #<TI>#
+ _ZTI18CConfirmationQuery @ 7 NONAME ; #<TI>#
+ _ZTI19CDPOFPrintingDevice @ 8 NONAME ; #<TI>#
+ _ZTI20CPrinterCapabilities @ 9 NONAME ; #<TI>#
+ _ZTI9CPrintJob @ 10 NONAME ; #<TI>#
+ _ZTV12CFileManager @ 11 NONAME ; #<VT>#
+ _ZTV13CRsDpofEngine @ 12 NONAME ; #<VT>#
+ _ZTV15CCapabilityInfo @ 13 NONAME ; #<VT>#
+ _ZTV15CPrinterElement @ 14 NONAME ; #<VT>#
+ _ZTV16CCapabilityArray @ 15 NONAME ; #<VT>#
+ _ZTV18CConfirmationQuery @ 16 NONAME ; #<VT>#
+ _ZTV19CDPOFPrintingDevice @ 17 NONAME ; #<VT>#
+ _ZTV20CPrinterCapabilities @ 18 NONAME ; #<VT>#
+ _ZTV9CPrintJob @ 19 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_EXPORTS
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_MMPFILES
+dpofprotdll.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/group/dpofprotdll.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../../../inc/logdef.h"
+
+deffile dpofprotdll.def
+
+TARGET dpofprotdll.dll
+TARGETTYPE PLUGIN
+CAPABILITY CAP_ECOM_PLUGIN
+
+UID 0x10009D8D 0x01007781
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE . ../inc ../src
+USERINCLUDE ../../../ImagePrintLibrary/inc
+USERINCLUDE ../../../ImagePrintServer/inc
+USERINCLUDE ../../../inc
+USERINCLUDE ../../../../inc
+USERINCLUDE ../../../../clog/inc
+
+SOURCEPATH ../src
+
+SOURCE cdpofprintingdevice.cpp
+SOURCE crsdpofengine.cpp
+SOURCE rsutils.cpp
+SOURCE cprintjob.cpp
+SOURCE cprinterelement.cpp
+SOURCE ccapabilityinfo.cpp
+SOURCE ccapabilityarray.cpp
+SOURCE cprintercapabilities.cpp
+SOURCE main.cpp
+SOURCE cfilemanager.cpp
+SOURCE cconfirmationquery.cpp
+
+START RESOURCE ../data/01007781.rss
+TARGET dpofprotdll.rsc
+END
+
+START RESOURCE ../data/dpof.rss
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+HEADER
+TARGETPATH resource/imageprintdata/protocols
+END
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY fbscli.lib
+LIBRARY estor.lib
+LIBRARY bafl.lib
+LIBRARY ecom.lib
+LIBRARY efsrv.lib
+LIBRARY platformenv.lib
+LIBRARY sysutil.lib
+LIBRARY commonengine.lib
+LIBRARY aknnotify.lib
+LIBRARY eiksrv.lib
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/ccapabilityarray.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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 CCapabilityArray class definition.
+*
+*/
+
+
+#ifndef CCAPABILITYARRAY_H
+#define CCAPABILITYARRAY_H
+
+#include <e32base.h>
+#include <barsread.h>
+
+#include "ccapabilityinfo.h"
+
+/**
+ * @brief Class that stores an array of CCapabilityInfo objects.
+ *
+ * class CCapabilityArray - Holds instances of all the capabilities for a particular
+ * transport type (protocol). This array is populated during the constructor of the protocol object.
+ * One array for each transport type.
+ */
+class CCapabilityArray : public CBase
+ {
+ public:
+ static CCapabilityArray* NewL(TResourceReader& aReader);
+ ~CCapabilityArray();
+ TInt Count() const;
+ CCapabilityInfo* operator[](TInt aIndex) const;
+ CCapabilityInfo* LinkedCapability(TInt aLink) const;
+
+ private:
+ void ConstructL(TResourceReader& aReader);
+ void AddDataL(TResourceReader& aReader);
+
+ private:
+ RPointerArray<CCapabilityInfo> iDataArray;
+ };
+
+#endif // CCAPABILITYARRAY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/ccapabilityinfo.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,63 @@
+/*
+* 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 CCapabilityInfo class definition.
+*
+*/
+
+
+#ifndef CCAPABILITYINFO_H
+#define CCAPABILITYINFO_H
+
+#include <e32base.h>
+#include <barsread.h>
+
+#include "tprintcapability.h"
+
+/**
+ * @brief Class that stores a printer's capability information, which is obtained from a resource file.
+ *
+ * class CCapabilityInfo - Holds all of the information about a Capability. Each capability
+ * described in the resource file will have a single instance of the CCapabilityInfo created for it.
+ * This class also includes the current setting, which is only used if the capability is
+ * actually in use by the current print job.
+ */
+class CCapabilityInfo : public CBase
+ {
+ public:
+
+ static CCapabilityInfo* NewLC(TResourceReader& aReader);
+ ~CCapabilityInfo();
+
+ TPrintCapability& Capability();
+ TInt SetCurrentValue( TInt aValue );
+ TInt PrinterClass() const;
+ TInt LinkID() const;
+ TInt CurrentValue() const;
+ TInt ValueLink( TInt aValue );
+ CCapabilityInfo* CopyL() const;
+
+ private:
+ void ConstructL(TResourceReader& aReader);
+
+ private:
+ TPrintCapability iCapability;
+ RArray<TInt> iLinks;
+ TInt iLinkID;
+ TInt iPrinterClass;
+ TInt iCurrentValue;
+ };
+
+#endif // CCAPABILITYINFO_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cconfirmationquery.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2004-2008 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:
+*
+*/
+
+
+#ifndef CCONFIRMATIONQUERY_H
+#define CCONFIRMATIONQUERY_H
+
+#include <e32base.h>
+#include <e32std.h>
+
+#include "mconfirmationnotify.h"
+
+class CConfirmationQuery : public CActive
+{
+public:
+
+ ~CConfirmationQuery();
+
+ static CConfirmationQuery* NewL( MConfirmationNotify& aNotify );
+
+ static CConfirmationQuery* NewLC( MConfirmationNotify& aNotify );
+
+ void CConfirmationQuery::StartWaitingAnswer( );
+
+protected: // from CActive
+
+ void RunL();
+
+ void RunError();
+
+ void DoCancel();
+
+protected: // construction
+
+ CConfirmationQuery(MConfirmationNotify& aNotify);
+
+ void ConstructL();
+
+private:
+
+ MConfirmationNotify& iNotify;
+ TBool iCancelledByUser;
+};
+
+
+#endif // CCONFIRMATIONQUERY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cdpofprintingdevice.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,147 @@
+/*
+* 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 CDPOFPrintingDevice class definition.
+*
+*/
+
+
+#ifndef CDPOFPRINTINGDEVICE_H
+#define CDPOFPRINTINGDEVICE_H
+
+#include <fbs.h>
+#include <AknGlobalConfirmationQuery.h>
+#include <data_caging_path_literals.hrh>
+
+#include "mprotprintingdevice.h"
+#include "crsdpofengine.h"
+#include "tmapping.h"
+#include "cconfirmationquery.h"
+#include "mconfirmationnotify.h"
+
+// FORWARD DECLARATIONS
+class CPrinterCapabilities;
+class CPrinterElement;
+class CCapabilityArray;
+class CPrintJob;
+class TSetting;
+
+
+/**
+ * @brief CDPOFPrintingDevice implements MProtPrintingDevice. This makes the class the "published" class of the DLL it is in.
+ */
+class CDPOFPrintingDevice : public CActive, public MProtPrintingDevice, public MDpofEngineObserver, public MConfirmationNotify
+ {
+ public:
+ static MProtPrintingDevice* NewL();
+
+ // Default constructor and destructor.
+ CDPOFPrintingDevice();
+ ~CDPOFPrintingDevice();
+
+ public: // From MProtPrintingDevice
+
+ // General.
+ void ConstructL(const TDesC& aDLLPath);
+ TVersion Version();
+ TUint SupportedProtocols();
+ // Discovery.
+ void StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocols = 0);
+ TInt RemoveCachedDeviceL(TInt aDeviceID);
+ void CancelDiscovery(TBool aDoCallBack = ETrue);
+ // Print.
+ TInt CreatePrintJobL(TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver);
+ void SubmitPrintJobL();
+ TInt CancelPrintJob();
+ TInt ContinuePrintJobL();
+ TInt GetNumPrintPages();
+ TInt GetPrintJobStatus();
+ TInt GetPrinterStatus(TInt aDeviceID);
+ // Capabilities.
+ TInt GetDeviceCapabilityIDsL(TInt aDeviceID, RArray<TInt>& aCapabilityIDs);
+ TInt GetDeviceCapabilityL(TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability);
+ TInt GetJobSetting(TInt aCapabilityID, TInt& aValue);
+ TInt SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability);
+ // Preview.
+ TInt GetNumPreviewPages();
+ TInt GetJobTemplateIconL(TInt aTemplateID, TInt& aFsBitmapHandle);
+ TInt CreatePreviewImage(TInt aPageNumber);
+
+ void RegisterIdleObserver(MProtIdleObserver * /*aObserver*/) {};
+
+ public: // MBTOnNotify
+ void BTOnCompleteL( TBool aResult );
+ void ConfirmationQueryCompleteL ( TInt aError );
+
+ void OverwriteExistingJobL ();
+
+
+ void SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr );
+
+ public: // From MDpofEngineObserver
+
+ void HandleDpofEngineEventL(const TInt aStatus, const TInt aRetCode);
+
+ protected: // From CActive
+
+ void DoCancel();
+ void RunL();
+
+ private:
+ // Utils.
+ // Capabilities Section.
+ CCapabilityArray* LoadCapabilityL(RResourceFile& aResFile, TInt aCapID);
+ CPrinterElement* FindDeviceL(TInt aPrinterID);
+ TBool FindSetting(TInt aCapabilityID, TSetting& aSetting);
+ TInt AddReadyRequestAndSetActive( TInt aRequest );
+ TInt CheckReadyRequestAndSetActive();
+ // Set MMC printer
+ void SetMMCPrinterL();
+
+ // Confirmation to override existing autoprint file
+ void ShowConfirmationQueryL();
+
+ private: // data
+
+ /// Protocol Capabilities.
+ CCapabilityArray* iCapabilities;
+ /// Array to save all the devices discovered.
+ RPointerArray<CPrinterElement> iDeviceList;
+ /// Print job object.
+ CPrintJob* iPrintJob;
+
+ /// DPOF Engine.
+ CRsDpofEngine *iDPOF;
+
+ /// Array to save all the icon / template pairs supported by a protocol.
+ RArray<TMapping> iMappingArray;
+
+ /// Print error.
+ TInt iPrintError;
+ /// Print error message code.
+ TInt iPrintErrorMsgCode;
+
+ RArray<TInt> iReadyRequests;
+
+ TBool iCancelledByUser;
+
+ CConfirmationQuery* iConfirmationQuery;
+
+ CAknGlobalConfirmationQuery* iPQ;
+
+ HBufC* iQuestion;
+ };
+
+#endif // CDPOFPRINTINGDEVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cfilemanager.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,80 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CFILEMANAGER_H
+#define CFILEMANAGER_H
+
+#include <e32base.h>
+#include <f32file.h>
+
+class CFileManager : public CActive
+ {
+ public:
+
+ static CFileManager* NewL( RFs& aFs );
+ ~CFileManager();
+
+ public:
+
+ TInt Copy( const TDesC& aFile, const TDesC& aDir, TRequestStatus& aStatus );
+ void CancelCopy();
+ TInt RmDir( const TDesC& aDir, TRequestStatus& aStatus );
+ void CancelRmDir();
+
+ private:
+
+ CFileManager( RFs& aFs );
+ void ConstructL();
+
+ protected: // from CActive
+
+ void DoCancel();
+ void RunL();
+ TInt RunError( TInt aError );
+
+ private:
+
+ void CloseCopy();
+ void InitCopyL( const TDesC& aFile, const TDesC& aDir );
+
+ private:
+
+ enum TOperation
+ {
+ EFileManCopy = 0,
+ EBufferCopy,
+ ERemoveDir
+ };
+
+ private: // data
+
+ RFs& iFs;
+ CFileMan* iFileMan;
+ TOperation iOperation;
+ TRequestStatus* iCallerStatus;
+ RFile iSource;
+ RFile iDest;
+ HBufC8* iBuffer;
+ TInt iBytesLeft;
+ TInt iBytesNum;
+ };
+
+
+#endif // CFILEMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cprintercapabilities.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* 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 CPrinterCapabilities class definition.
+*
+*/
+
+
+#ifndef CPRINTERCAPABILITIES_H
+#define CPRINTERCAPABILITIES_H
+
+#include <e32base.h>
+#include <barsread.h>
+
+#include "ccapabilityarray.h"
+
+/**
+ * @brief Class that stores a printer class capabilities in full detail.
+ *
+ * class PrinterCapabilities - An array which holds pointers to capabilities that
+ * exist in the CapabilitiesArray(s). Each printer that is found will have it's own
+ * PrinterCapabilities object, and when the PrinterCapability functions are called from
+ * the ClientAPI, the data is obtained directly from this PrinterCapabilities class.
+ * Different printers may refer back to the same object from the capabilities Array.
+ * When the PrinterCapabilities object is created, it will contain the default
+ * capabilities and current settings. If the printer is selected for the print job,
+ * the settings and configuration may change to reflect the current print job settings.
+ *
+ * BUILDING PRINTER CAPABILITIES
+ * Each resource contains a printerclass field, which identifies which class of printer this
+ * capability is defined for. When a printer is discovered and a new PrinterCapabilities
+ * object is created, the CapabilitiyArray is searched for capabilites with that class to
+ * add. This occurs in the BuildCCapabilityArray function.
+ *
+ * While a resource file can have the same capabilitiy defined multiple times for multiple
+ * PrinterClasses, A PrinterClass can have a capability defined only once for the class.
+ * One of the classes is "ELinked". Capabilities of this class are dependent upon the current
+ * value of other capabilities and can be linked into one or more other PrinterCapability arrays.
+ * Each enumerated value in the resource is a value pair, with the second number being a link code.
+ * If non-zero, then the resource with right LinkID is also added to the PrinterCapabilites.
+ * When SetCurrentCapability is called and a current value is changed, the linked capability must
+ * also be checked to see if it is changed.
+ *
+ * Note that setting the current value can only occur for the current print job, but when it does
+ * the capabilities for a particular printer can actually change during the life of the job,
+ * requiring the application to get the printer capabilities multiple times.
+ * Notes on implementation Limitations:
+ *
+ * The current implementation uses one and only one CapabilitiesInfo object for
+ * each capabiltiy described in the resource file. All references to the capability
+ * refer back to this object. This is fine as long as there is only one print job.
+ * When we have multiple print jobs, this will not work for two reasons.
+ *
+ * 1 - There could be multiple current settings fora particular capability.
+ *
+ * 2 - Different jobs could configure linked capabilities for a printer.
+ */
+class CPrinterCapabilities : public CBase
+ {
+ public:
+ static CPrinterCapabilities* NewL(CCapabilityArray* aSourceArray, TInt aPrinterClass);
+ ~CPrinterCapabilities();
+ TInt Count() const;
+ void GetIDs(RArray<TInt>& aCapabilityIDs) const;
+ TInt GetCapability(TInt aCapabilityID, TPrintCapability& aCapability) const;
+ TInt SetCurrentValueL(TInt aCapabilityID, TInt aValue);
+ TBool GetCurrentValue(TInt aCapabilityID, TInt &aCapabilityValue) const;
+
+ private:
+ CPrinterCapabilities(CCapabilityArray* aSourceArray, TInt aPrinterClass);
+ void ConstructL();
+ void BuildCapabilityArrayL();
+
+ private:
+ TInt iPrinterClass;
+ RPointerArray<CCapabilityInfo> iPrinterDataArray;
+ CCapabilityArray* iSourceArray;
+ };
+
+#endif // CPRINTERCAPABILITIES_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cprinterelement.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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 CPrinterElement class definition and the Transport enum.
+*
+*/
+
+
+#ifndef CPRINTERELEMENT_H
+#define CPRINTERELEMENT_H
+
+#include <e32base.h>
+
+#include "tprinter.h"
+#include "cprintercapabilities.h"
+
+/// Possible transports for a print job.
+enum Transport
+ {
+ BPPTrans,
+ DPOFTrans
+ };
+
+class CPrinterElement : public CBase
+ {
+ public:
+ ~CPrinterElement();
+ static CPrinterElement* NewLC();
+
+ private:
+ CPrinterElement();
+
+ public:
+ Transport iTransport;
+ TPrinter iPrinter;
+ TInt iTransportData;
+ TInt iPrinterClass;
+ CPrinterCapabilities* iPrinterCapabilities;
+ };
+
+#endif // CPRINTERELEMENT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cprintjob.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* 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 CPrintJob class definition and the PJS enum.
+*
+*/
+
+
+#ifndef CPRINTJOB_H
+#define CPRINTJOB_H
+
+#include <e32base.h>
+
+#include "tsetting.h"
+
+/// Possible states of a print job.
+enum PJS
+ {
+ PJSNone,
+ PJSCreated,
+ PJSSubmitted
+ };
+
+class CPrintJob : public CBase
+ {
+ public:
+ CPrintJob();
+ ~CPrintJob();
+ PJS iState;
+ TInt iPrinterID;
+ TInt iTransport;
+ RPointerArray<HBufC> iImages;
+ RArray<TSetting> iSettings;
+ };
+
+#endif // CPRINTJOB_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/crsdpofengine.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,136 @@
+/*
+* 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 CRsDpofEngine & TRsPhoneImage class definitions and
+* the MDpofEngineObserver interface definition.
+*
+*/
+
+
+#ifndef CRSDPOFENGINE_H
+#define CRSDPOFENGINE_H
+
+#include <e32base.h>
+#include <f32file.h>
+
+class CFileManager;
+
+/// Possible DPOF status.
+enum TRsDpofPrintStatus
+ {
+ ECopyImageFiles,
+ EDeleteDirectory,
+ EDPOFGenerate,
+ EJobCompleted,
+ EJobCancelled,
+ EJobError
+ };
+
+class MDpofEngineObserver
+ {
+ public:
+ virtual void HandleDpofEngineEventL(const TInt aStatus, const TInt aRetCode)=0;
+ };
+
+class TRsPhoneImage
+ {
+ public:
+ TInt iIndex;
+ TBool iCopied;
+ };
+
+
+/**
+ * \brief Brief Description
+ *
+ * Detailed Description
+ */
+class CRsDpofEngine : public CActive
+ {
+ public:
+
+ enum TRsDpofImageLayout
+ {
+ EOnePerPageSmall = 0,
+ EOnePerPageMedium,
+ EOnePerPageLarge,
+ EOnePerPage4x6,
+ ETwoPerPage,
+ EFourPerPage,
+ ESixPerPage,
+ ENinePerPage,
+ ETwelvePerPage,
+ ESixteenPerPage
+ };
+
+
+ static CRsDpofEngine* NewL(MDpofEngineObserver& aObs);
+ ~CRsDpofEngine();
+
+ void SetImageFileNamesL(const RPointerArray<HBufC>& aImageList);
+ void SetImageLayout(TRsDpofImageLayout aImageLayout);
+ TInt PrintL();
+ TInt GetPrintPercentage();
+ void Stop();
+ void StartDiscovery(TRequestStatus& aStatus);
+ TBool WasCancelled() const;
+ TBool HasMmc() const;
+ TBool AutoPrintFileExists();
+ void SetMMCPathL();
+
+ void SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies );
+
+ protected: /// From CActive
+
+ void DoCancel();
+ void RunL();
+
+ private:
+
+ void ConstructL();
+ CRsDpofEngine(MDpofEngineObserver& aObs);
+ TInt WriteSpecificSizeFileL();
+ TInt WriteMultipleFileL();
+ TInt PrepareFilenamesL();
+ void CreateDpofFileL();
+ TInt CleanupTempImages();
+ TInt CopyPhoneImagesToMMC();
+ TRsPhoneImage* GetNextImageInfoForCopy();
+ static TInt CreateDpofFileCbL(TAny *aObj);
+ void DoCreateDpofFileL();
+
+ private:
+
+ HBufC* iMmcDrive;
+ TBool iHasMmc;
+ RPointerArray<HBufC> iFileNames;
+ TInt iImageLayout;
+ HBufC* iAutoPrintFile;
+ HBufC* iTempFolder;
+ MDpofEngineObserver& iObs;
+ TRsDpofPrintStatus iStep;
+ RFs iFs;
+ RArray<TRsPhoneImage> iPhoneImageArray;
+ TRsPhoneImage* iCurrentPhoneImage;
+ CFileManager* iFileManager;
+ TFileName iTempFile;
+ TBool iShouldCancel;
+ CPeriodic* iDpofPeriodic;
+ TInt iPhoneImgsSize;
+
+ RArray<TInt> iNumsOfCopies;
+ };
+
+#endif // CRSDPOFENGINE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/imgprintkonst.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* 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 PrintSessionStatus and PrinterClass enumerations,
+* as well as some constants.
+*
+*/
+
+
+#ifndef IMGPRINTKONST_H
+#define IMGPRINTKONST_H
+
+/// Status available for the PrintSession.
+/// @deprecated The PrintSession class was removed completely. If no one else uses this, this will be left out in future versions.
+enum PrintSessionStatus
+ {
+ EStatusNone = 0,
+ EPrinterDiscovered,
+ ERemovePrinter,
+ EDiscoveryDone,
+ EPrintJobProgress,
+ EPrintError,
+ EPrintJobDone,
+ EPreviewImage,
+ EServerError,
+ ECancelJob,
+ ECancelDiscovery,
+
+ ELast
+
+ };
+
+/// Printer classes' available.
+enum PrinterClass
+ {
+ EDefault = 0,
+ EBigAdaptive = 1,
+ ESmallAdaptive = 2,
+ EDesk = 3,
+ ELinked = 99
+ };
+
+#endif // IMGPRINTKONST_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/mconfirmationnotify.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MCONFIRMATIONNOTIFY_H
+#define MCONFIRMATIONNOTIFY_H
+
+#include <e32std.h>
+
+class MConfirmationNotify
+ {
+ public:
+ virtual void ConfirmationQueryCompleteL (TInt aError) = 0;
+ };
+
+#endif // MCONFIRMATIONNOTIFY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/rsconstants.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* 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: File contains defines, and literal strings of global scope.
+*
+*/
+
+
+#ifndef RSCONSTANTS_H
+#define RSCONSTANTS_H
+
+#include <e32std.h>
+
+const TInt KMaxPrintedPathLength=16;
+const TInt KMinWidthOrHeight=200;
+const TInt KStickersHelpPage = 1;
+const TInt KImagesHelpPage = 2;
+
+
+// log to file of heap useage
+//#define _HEAP_LOGGING_ 1
+
+// file logging EX-cluding mimeout.txt
+//#define _LOGGING_ 1
+
+// Out of memory tests when generating XHtml and sending
+//#define __OOM_TEST_SENDING__ 1
+
+// Allows debugging of the mime package and print job on the emulator with no bluetooth present.
+//#define __PRINT_TO_FILE__ 1
+
+// mimeout.txt logging
+//#define _MIMEOUT_LOGGING_ 1
+
+#ifdef __PRINT_TO_FILE__
+#ifndef _MIMEOUT_LOGGING_
+#define _MIMEOUT_LOGGING_ 1
+#endif
+#endif // __PRINT_TO_FILE__
+
+/// Extension for temporary files.
+_LIT(KTmpExtension, ".tmp");
+
+#endif // RSCONSTANTS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/rsutils.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* 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 RsUtils class definitions.
+*
+*/
+
+
+#ifndef RSUTILS_H
+#define RSUTILS_H
+
+#include <e32std.h>
+#include <f32file.h>
+
+/**
+* The RsUtils class contains static utility functions useful to the whole application
+* such as descriptor manipulations.
+*/
+class RsUtils
+ {
+ public:
+
+ static TBool FileExists( const TDesC& aFileName, RFs& aFs );
+ static TBool PathExists( const TDesC& aFilePath, RFs& aFs );
+ static TInt DriveFreeSpace( TChar aDrive, RFs& aFs, TUint32& aSpace );
+ static TInt CumulativeFileSize( const TDesC& aFileName, RFs& aFs, TInt& aCumulativeSize );
+ static TBool FileInDir( const TDesC& aFileName, const TDesC& aDirName );
+ static TBool FileOnDrive( TChar aDrive, const TDesC& aFileName );
+ };
+
+#endif // RSUTILS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/tmapping.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,38 @@
+/*
+* 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 TMapping class definition.
+*
+*/
+
+
+#ifndef TMAPPING_H
+#define TMAPPING_H
+
+#include <e32base.h>
+
+class TMapping
+ {
+ public:
+ TMapping(TInt aX, TInt aY)
+ {
+ iImagesPerPage = aX;
+ iCode = aY;
+ }
+ TInt iCode;
+ TInt iImagesPerPage;
+ };
+
+#endif // TMAPPING_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/tsetting.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,33 @@
+/*
+* 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 TSetting class definition.
+*
+*/
+
+
+#ifndef TSETTING_H
+#define TSETTING_H
+
+#include <e32base.h>
+
+class TSetting
+ {
+ public:
+ TInt iCapabilityID;
+ TInt iValue;
+ };
+
+#endif // TSETTING_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/ccapabilityarray.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,80 @@
+/*
+* 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 CCapabilityArray class definition.
+*
+*/
+
+
+#include "ccapabilityarray.h"
+
+//**********************************************************************
+// CCapabilityArray
+//**********************************************************************
+CCapabilityArray* CCapabilityArray::NewL(TResourceReader& aReader)
+ {
+ CCapabilityArray* self=new (ELeave) CCapabilityArray;
+ CleanupStack::PushL(self);
+ self->ConstructL(aReader);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+CCapabilityArray::~CCapabilityArray()
+ {
+ iDataArray.ResetAndDestroy();
+ iDataArray.Close();
+ }
+
+void CCapabilityArray::ConstructL( TResourceReader& aReader )
+ {
+ AddDataL( aReader );
+ }
+
+void CCapabilityArray::AddDataL(TResourceReader& aReader)
+ {
+ TInt count = aReader.ReadInt16();
+ for( TInt i = 0; i < count; i++ )
+ {
+ CCapabilityInfo* info = CCapabilityInfo::NewLC( aReader );
+ iDataArray.AppendL( info );
+ CleanupStack::Pop( info );
+ }
+ }
+
+CCapabilityInfo* CCapabilityArray::operator[]( TInt aIndex ) const
+ {
+ return iDataArray[aIndex];
+ }
+
+CCapabilityInfo* CCapabilityArray::LinkedCapability( TInt aLink ) const
+ {
+ CCapabilityInfo* capInfo = NULL;
+ for( TInt i = 0; i < iDataArray.Count() && !capInfo; i++ )
+ {
+ if( iDataArray[i]->LinkID() == aLink )
+ {
+ capInfo = iDataArray[i];
+ }
+ }
+
+ return capInfo;
+ }
+
+TInt CCapabilityArray::Count() const
+ {
+ return iDataArray.Count();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/ccapabilityinfo.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,143 @@
+/*
+* 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 CCapabilityInfo class definition.
+*
+*/
+
+
+#include "ccapabilityinfo.h"
+
+//**********************************************************************
+// CCapabilityInfo
+//**********************************************************************
+void CCapabilityInfo::ConstructL(TResourceReader& aReader)
+ {
+ iPrinterClass = aReader.ReadInt32();
+ iCapability.iCapabilityID = aReader.ReadInt32();
+ iCapability.iType = (TPrintCapability::ECapType)aReader.ReadInt32();
+ iCapability.iDefaultValue = aReader.ReadInt32();
+ iCapability.iLow = aReader.ReadInt32();
+ iCapability.iHigh = aReader.ReadInt32();
+
+ TInt count = aReader.ReadInt16()/2;
+ iCapability.iEnumCount = count;
+
+ for( TInt i = 0; i < count ; i++ )
+ {
+ TInt value = aReader.ReadInt32();
+ iCapability.iEnumCodes[i] = value;
+ value = aReader.ReadInt32();
+ iLinks.Append(value);
+ }
+ iLinkID = aReader.ReadInt32();
+ iCurrentValue = 0;
+ }
+
+
+CCapabilityInfo* CCapabilityInfo::NewLC(TResourceReader& aReader)
+ {
+ CCapabilityInfo* self=new (ELeave) CCapabilityInfo;
+ CleanupStack::PushL(self);
+ self->ConstructL(aReader);
+ return self;
+ }
+
+CCapabilityInfo::~CCapabilityInfo()
+ {
+ iLinks.Close();
+ }
+
+TInt CCapabilityInfo::SetCurrentValue( TInt aValue )
+ // returns the link number from the resource file
+ {
+ if( aValue == iCurrentValue )
+ return 0;
+
+ iCurrentValue = aValue;
+ if( iCapability.iType == TPrintCapability::Enum ) // links are only on Enums.
+ {
+ for( TInt i = 0 ; i < iCapability.iEnumCount; i++ )
+ {
+ if( iCapability.iEnumCodes[i] == aValue )
+ {
+ return iLinks[i];
+ }
+ }
+ }
+ return 0;
+ }
+
+TInt CCapabilityInfo::ValueLink( TInt aValue )
+ {
+ if( iCapability.iType == TPrintCapability::Enum ) // links are only on Enums.
+ {
+ for( TInt i = 0; i < iCapability.iEnumCount; i++ )
+ {
+ if( iCapability.iEnumCodes[i] == aValue )
+ {
+ return iLinks[i];
+ }
+ }
+ }
+ return 0;
+ }
+
+CCapabilityInfo* CCapabilityInfo::CopyL() const
+ {
+ CCapabilityInfo *workCap = new (ELeave) CCapabilityInfo;
+ CleanupStack::PushL(workCap);
+
+ workCap->iPrinterClass = iPrinterClass;
+ workCap->iCapability.iCapabilityID = iCapability.iCapabilityID;
+ workCap->iCapability.iType = iCapability.iType;
+ workCap->iCapability.iDefaultValue = iCapability.iDefaultValue;
+ workCap->iCapability.iLow = iCapability.iLow;
+ workCap->iCapability.iHigh = iCapability.iHigh;
+ workCap->iCapability.iEnumCount = iCapability.iEnumCount;
+
+ for( TInt i = 0; i < iCapability.iEnumCount; i++ )
+ {
+ workCap->iCapability.iEnumCodes[i] = iCapability.iEnumCodes[i];
+ workCap->iLinks.AppendL( iLinks[i] );
+ }
+
+ workCap->iLinkID = iLinkID;
+ workCap->iCurrentValue = iCurrentValue;
+
+ CleanupStack::Pop(workCap);
+ return workCap;
+ }
+
+
+TInt CCapabilityInfo::CurrentValue() const
+ {
+ return iCurrentValue;
+ }
+
+TInt CCapabilityInfo::LinkID() const
+ {
+ return iLinkID;
+ }
+
+TInt CCapabilityInfo::PrinterClass() const
+ {
+ return iPrinterClass;
+ }
+
+TPrintCapability& CCapabilityInfo::Capability()
+ {
+ return iCapability;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cconfirmationquery.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2004-2008 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:
+ *
+*/
+
+
+#include <avkon.hrh>
+
+#include "clog.h"
+#include "cconfirmationquery.h"
+
+CConfirmationQuery::CConfirmationQuery( MConfirmationNotify& aNotify ) : CActive( CActive::EPriorityStandard),
+iNotify (aNotify)
+ {
+ CActiveScheduler::Add( this );
+ }
+
+CConfirmationQuery::~CConfirmationQuery()
+ {
+ Cancel();
+ }
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CConfirmationQuery::NewL()
+// Symbian two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CConfirmationQuery* CConfirmationQuery::NewL( MConfirmationNotify& aNotify )
+ {
+ CConfirmationQuery* self = CConfirmationQuery::NewLC( aNotify );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CConfirmationQuery::NewLC()
+// Symbian two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CConfirmationQuery* CConfirmationQuery::NewLC( MConfirmationNotify& aNotify )
+ {
+ CConfirmationQuery* self;
+ self = new ( ELeave ) CConfirmationQuery( aNotify );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CConfirmationQuery::ConstructL()
+// Perform second phase construction of this object.
+// ----------------------------------------------------------------------------
+//
+void CConfirmationQuery::ConstructL()
+ {
+
+ }
+
+void CConfirmationQuery::StartWaitingAnswer( )
+ {
+ // Start active object and set iStatus = KRequestPending
+ SetActive();
+ }
+
+void CConfirmationQuery::RunL()
+ {
+ LOG1("[CConfirmationQuery::RunL]\t iStatus: %d", iStatus.Int());
+ if (iStatus == KErrNone || iStatus == KErrCancel || iStatus == EAknSoftkeyYes || iStatus == EAknSoftkeyNo )
+ {
+ iNotify.ConfirmationQueryCompleteL(iStatus.Int());
+ }
+ LOG("[CConfirmationQueryCConfirmationQuery::RunL]\t out");
+ }
+
+void CConfirmationQuery::RunError()
+ {
+
+ }
+
+void CConfirmationQuery::DoCancel()
+ {
+
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cdpofprintingdevice.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,969 @@
+/*
+* 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 CDPOFPrintingDevice class definition.
+*
+*/
+
+
+#include <e32std.h>
+#include <barsc.h>
+#include <dpof.rsg>
+#include <bautils.h>
+
+#include "cdpofprintingdevice.h"
+#include "cconfirmationquery.h"
+#include "cprintercapabilities.h"
+#include "cprinterelement.h"
+#include "imgprintkonst.h"
+#include "tsetting.h"
+#include "rsutils.h"
+#include "printcapabilitycodes.h"
+#include "printmessagecodes.h"
+#include "imageprint.h"
+#include "clog.h"
+#include "cprintjob.h"
+
+// CONSTANTS
+namespace
+ {
+ /// DPOF Version Major.
+ const TInt KDPOFVersionMajor = 0;
+ /// DPOF Version Minor.
+ const TInt KDPOFVersionMinor = 0;
+ /// DPOF Version Build.
+ const TInt KDPOFVersionBuild = 1;
+
+ _LIT( KResourceFileName, "imageprintdata\\protocols\\dpof.rsc" );
+
+ const TInt KMmcPrinterId = 1;
+ _LIT( KMmcPrinterName, "Memory Card" );
+ }
+
+
+MProtPrintingDevice* CDPOFPrintingDevice::NewL()
+ {
+ return new (ELeave) CDPOFPrintingDevice();
+ }
+
+
+CDPOFPrintingDevice::CDPOFPrintingDevice() : CActive( CActive::EPriorityStandard ),
+ iPrintError( KErrNone ),
+ iPrintErrorMsgCode( 0 )
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CDPOFPrintingDevice::ConstructL(const TDesC& /*aDLLPath*/)
+ {
+ LOG("CDPOFPrintingDevice::ConstructL begin");
+
+ iCancelledByUser = EFalse;
+
+ iPrintJob = new (ELeave) CPrintJob();
+
+ iMappingArray.AppendL(TMapping(1,EPrintCapabLayout1UpMedium));
+ iMappingArray.AppendL(TMapping(2,EPrintCapabLayout2Up));
+ iMappingArray.AppendL(TMapping(4,EPrintCapabLayout4Up));
+ iMappingArray.AppendL(TMapping(6,EPrintCapabLayout6Up));
+ iMappingArray.AppendL(TMapping(9,EPrintCapabLayout9Up));
+ iMappingArray.AppendL(TMapping(12,EPrintCapabLayout12Up));
+ iMappingArray.AppendL(TMapping(16,EPrintCapabLayout16Up));
+
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+ // Loading nearest Loc File.
+
+ TFileName resourceFileName;
+ resourceFileName.Append( KDC_RESOURCE_FILES_DIR );
+ resourceFileName.Append( KResourceFileName );
+ BaflUtils::NearestLanguageFile( fs, resourceFileName );
+ RResourceFile resourceFile;
+ resourceFile.OpenL( fs, resourceFileName );
+
+ CleanupClosePushL( resourceFile );
+ iCapabilities = LoadCapabilityL( resourceFile, DPOF_CAPABILITIES );
+ CleanupStack::PopAndDestroy( 2 ); // resourceFile, fs
+
+ iDPOF = CRsDpofEngine::NewL( *this );
+
+ SetMMCPrinterL();
+
+ LOG("CDPOFPrintingDevice::ConstructL end");
+ }
+
+void CDPOFPrintingDevice::SetMMCPrinterL()
+ {
+ LOG("CDPOFPrintingDevice::SetMMCPrinterL begin");
+
+ // New implementation
+ LOG("CDPOFPrintingDevice::SetMMCPrinterL calling iDPOF->SetMMCPathL ...");
+ iDPOF->SetMMCPathL();
+
+ if( iDPOF->HasMmc() )
+ {
+ CPrinterElement* printElem = CPrinterElement::NewLC();
+ printElem->iPrinter.iDisplayName = KMmcPrinterName;
+ printElem->iPrinter.iPrinterID = KMmcPrinterId;
+ printElem->iPrinter.iProperties = TPrinter::SupportsPreview;
+ printElem->iPrinter.iProtocol = KImagePrint_PrinterProtocol_DPOF;
+ printElem->iTransport = DPOFTrans;
+ printElem->iPrinterClass = EDefault;
+ printElem->iPrinterCapabilities = CPrinterCapabilities::NewL( iCapabilities, printElem->iPrinterClass );
+ User::LeaveIfError( iDeviceList.Append( printElem ) );
+ CleanupStack::Pop( printElem );
+ printElem = NULL;
+ }
+
+ LOG("CDPOFPrintingDevice::SetMMCPrinterL end");
+ }
+
+
+CDPOFPrintingDevice::~CDPOFPrintingDevice()
+ {
+ LOG("CDPOFPrintingDevice::~CDPOFPrintingDevice begin");
+ Cancel();
+ delete iDPOF;
+ delete iCapabilities;
+ iDeviceList.ResetAndDestroy();
+ iDeviceList.Close();
+ iMappingArray.Close();
+ delete iPrintJob;
+ iReadyRequests.Close();
+ REComSession::DestroyedImplementation( iDtor_ID_Key );
+
+ if (iConfirmationQuery)
+ {
+ delete iConfirmationQuery;
+ iConfirmationQuery = NULL;
+ }
+
+ if (iPQ)
+ {
+ delete iPQ;
+ iPQ = NULL;
+ }
+
+ if (iQuestion)
+ {
+ delete iQuestion;
+ iQuestion = NULL;
+ }
+
+ LOG("CDPOFPrintingDevice::~CDPOFPrintingDevice end");
+ }
+
+
+TVersion CDPOFPrintingDevice::Version()
+ {
+ return TVersion(KDPOFVersionMajor, KDPOFVersionMinor, KDPOFVersionBuild);
+ }
+
+TUint CDPOFPrintingDevice::SupportedProtocols()
+ {
+ return KImagePrint_PrinterProtocol_DPOF;
+ }
+
+
+void CDPOFPrintingDevice::StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocol)
+ {
+ LOG1("CDPOFPrintingDevice::StartDiscoveryL aProtocol: %d", aProtocol);
+ iDiscoveryObserver = &aObserver;
+ Cancel();
+ if( aProtocol & KImagePrint_PrinterProtocol_DPOF )
+ {
+ LOG("CDPOFPrintingDevice::StartDiscoveryL protocol match, starting discovery...");
+ iDPOF->StartDiscovery( iStatus );
+ if( !IsActive() ) SetActive();
+ }
+ else
+ {
+ LOG("CDPOFPrintingDevice::StartDiscoveryL NO protocol match, ending discovery...");
+ AddReadyRequestAndSetActive( EDiscoveryDone );
+ }
+ LOG("CDPOFPrintingDevice::StartDiscoveryL end");
+ }
+
+
+TInt CDPOFPrintingDevice::RemoveCachedDeviceL( TInt aDeviceID )
+ {
+ LOG1("CDPOFPrintingDevice::RemoveCachedDeviceL aDeviceID: %d", aDeviceID);
+ CPrinterElement* targetPrinter = FindDeviceL( aDeviceID );
+ LOG1("CDPOFPrintingDevice::RemoveCachedDeviceL targetPrinter address: %d", (TInt)targetPrinter);
+ return ( targetPrinter ) ? KErrNone : KErrInvalidData;
+ }
+
+void CDPOFPrintingDevice::CancelDiscovery( TBool aDoCallBack )
+ {
+ LOG1("CDPOFPrintingDevice::CancelDiscovery aDoCallBack: %d", aDoCallBack);
+ if( aDoCallBack )
+ {
+ AddReadyRequestAndSetActive( ECancelDiscovery );
+ }
+ LOG("CDPOFPrintingDevice::CancelDiscovery end");
+ }
+
+
+TInt CDPOFPrintingDevice::CreatePrintJobL(TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver)
+ {
+ LOG1("CDPOFPrintingDevice::CreatePrintJobL aDeviceID: %d", aDeviceID);
+ LOG1("CDPOFPrintingDevice::CreatePrintJobL aImages.Count(): %d", aImages.Count());
+
+ iPrintEventObserver = &aObserver;
+ iPrintJob->iState = PJSNone; // Reset value until Job is fully setup in case of a leave.
+ CPrinterElement *TargetPrinter = FindDeviceL( aDeviceID );
+ if( TargetPrinter == NULL )
+ {
+ LOG("CDPOFPrintingDevice::CreatePrintJobL no device found, returning error");
+ return KErrInvalidData;
+ }
+
+ iPrintJob->iTransport = DPOFTrans;
+ iPrintJob->iPrinterID = aDeviceID;
+ TInt NumImages = aImages.Count();
+ iPrintJob->iImages.ResetAndDestroy();
+ for (TInt i = 0 ; i < NumImages; i++)
+ {
+ HBufC* Image = aImages[i]->AllocLC();
+ User::LeaveIfError( iPrintJob->iImages.Append( Image ) );
+ CleanupStack::Pop(Image);
+ }
+ LOG("CDPOFPrintingDevice::CreatePrintJobL image names copied");
+
+ // Now we can access the capabilities and fill in the printer settings.
+ RArray<TInt> CapabilityIDs;
+ CleanupClosePushL( CapabilityIDs );
+ GetDeviceCapabilityIDsL( aDeviceID, CapabilityIDs );
+ LOG1("CDPOFPrintingDevice::CreatePrintJobL capability ids count: %d", CapabilityIDs.Count());
+
+ iPrintJob->iSettings.Reset();
+ for (TInt i = 0; i < CapabilityIDs.Count(); i++)
+ {
+ TPrintCapability capability;
+ GetDeviceCapabilityL(aDeviceID, CapabilityIDs[i], capability);
+ TInt nCurrentValue;
+ TBool bHasValue = TargetPrinter->iPrinterCapabilities->GetCurrentValue(CapabilityIDs[i], nCurrentValue);
+ TSetting Setting;
+ Setting.iCapabilityID = capability.iCapabilityID;
+ if (bHasValue)
+ Setting.iValue = nCurrentValue;
+ else
+ Setting.iValue = capability.iDefaultValue;
+
+ User::LeaveIfError(iPrintJob->iSettings.Append(Setting));
+ }
+ LOG("CDPOFPrintingDevice::CreatePrintJobL capabilities copied");
+
+ CleanupStack::PopAndDestroy(); // CapabilityIDs
+
+ iPrintJob->iState = PJSCreated;
+ LOG("CDPOFPrintingDevice::CreatePrintJobL end");
+ return KErrNone;
+ }
+
+
+void CDPOFPrintingDevice::SubmitPrintJobL()
+ {
+ LOG("CDPOFPrintingDevice::SubmitPrintJobL begin");
+
+ if( iDPOF->AutoPrintFileExists() )
+ {
+ ShowConfirmationQueryL();
+ }
+ else
+ {
+ OverwriteExistingJobL ();
+ }
+
+ LOG("CDPOFPrintingDevice::SubmitPrintJobL end");
+ }
+
+void CDPOFPrintingDevice::ShowConfirmationQueryL()
+ {
+ LOG("CDPOFPrintingDevice::ShowConfirmationQueryL begin");
+
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+ TFileName resourceFileName;
+ resourceFileName.Append ( KDC_RESOURCE_FILES_DIR );
+ resourceFileName.Append ( KResourceFileName );
+ BaflUtils::NearestLanguageFile( fs, resourceFileName );
+ RResourceFile resFile;
+ resFile.OpenL( fs, resourceFileName );
+ CleanupClosePushL( resFile );
+ HBufC8 *resBuffer = resFile.AllocReadLC( R_QTN_PRINT_DPOF_CONFIRMATION_DIALOG );
+ TResourceReader reader;
+ reader.SetBuffer( resBuffer );
+ TPtrC ptrQuestion = reader.ReadTPtrC();
+ iQuestion = ptrQuestion.AllocL();
+ CleanupStack::PopAndDestroy( 3 ); // resBuffer, resFile, fs
+
+ iPQ = CAknGlobalConfirmationQuery::NewL();
+
+ iConfirmationQuery = CConfirmationQuery::NewL( *this );
+
+ iConfirmationQuery->StartWaitingAnswer( );
+
+ iPQ->ShowConfirmationQueryL( iConfirmationQuery->iStatus, *iQuestion, R_AVKON_SOFTKEYS_YES_NO );
+
+ LOG("CDPOFPrintingDevice::ShowConfirmationQueryL end");
+ }
+
+
+TInt CDPOFPrintingDevice::CancelPrintJob()
+ {
+ LOG1("CDPOFPrintingDevice::CancelPrintJob begin with job state: %d", iPrintJob->iState);
+ TInt retVal(KErrNone);
+
+ if( iPrintJob->iState == PJSSubmitted )
+ {
+ LOG("CDPOFPrintingDevice::CancelPrintJob calling iDPOF->Stop()");
+ iDPOF->Stop();
+ iPrintJob->iState = PJSCreated;
+ AddReadyRequestAndSetActive( EPrintJobDone );
+ }
+ else
+ {
+ retVal = KErrInvalidSequence;
+ }
+
+ LOG1("CDPOFPrintingDevice::CancelPrintJob end with code: %d", retVal);
+ return retVal;
+ }
+
+TInt CDPOFPrintingDevice::ContinuePrintJobL()
+ {
+ LOG1("CDPOFPrintingDevice::ContinuePrintJobL returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+ }
+
+TInt CDPOFPrintingDevice::GetNumPrintPages()
+ {
+ LOG1("CDPOFPrintingDevice::GetNumPrintPages begin with job state: %d", iPrintJob->iState);
+ if( iPrintJob->iState == PJSNone )
+ {
+ LOG("CDPOFPrintingDevice::GetNumPrintPages job state == PJSNone, ending with 0");
+ return 0;
+ }
+
+
+ TInt ImagesPerPage = 1;
+ TInt NumPrintPages;
+ TInt NumImages = iPrintJob->iImages.Count();
+
+ // Get Num images per page from the mapping table.
+ TSetting Setting;
+ FindSetting(EPrintCapabLayout, Setting);
+
+ for (TInt j = 0; j < iMappingArray.Count(); j++)
+ {
+ if (iMappingArray[j].iCode == Setting.iValue)
+ {
+ ImagesPerPage = iMappingArray[j].iImagesPerPage;
+ break;
+ }
+ }
+
+ if( ImagesPerPage == 0 ) // Stickers, Uses only one image, and populates a single page
+ NumPrintPages = 1;
+ else
+ NumPrintPages = (NumImages + ImagesPerPage - 1) / ImagesPerPage;
+
+ LOG1("CDPOFPrintingDevice::GetNumPrintPages returns: %d", NumPrintPages);
+ return NumPrintPages;
+ }
+
+TInt CDPOFPrintingDevice::GetPrintJobStatus()
+ {
+ LOG1("CDPOFPrintingDevice::GetPrintJobStatus returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+ }
+
+TInt CDPOFPrintingDevice::GetPrinterStatus(TInt /*aDeviceID*/)
+ {
+ LOG1("CDPOFPrintingDevice::GetPrinterStatus returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+ }
+
+TInt CDPOFPrintingDevice::GetDeviceCapabilityIDsL(TInt aDeviceID, RArray<TInt>& aCapabilityIDs)
+ {
+ LOG1("CDPOFPrintingDevice::GetDeviceCapabilityIDsL begins with aDeviceID: %d", aDeviceID);
+ TInt err(KErrNone);
+ aCapabilityIDs.Reset();
+ CPrinterElement* TargetPrinter = FindDeviceL(aDeviceID);
+ if( TargetPrinter )
+ {
+ TargetPrinter->iPrinterCapabilities->GetIDs(aCapabilityIDs);
+ }
+ else
+ {
+ err = KErrInvalidData;
+ }
+ LOG1("CDPOFPrintingDevice::GetDeviceCapabilityIDsL ends with err: %d", err);
+ return err;
+ }
+
+TInt CDPOFPrintingDevice::GetDeviceCapabilityL(TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability)
+ {
+ LOG1("CDPOFPrintingDevice::GetDeviceCapabilityL begins with aDeviceID: %d", aDeviceID);
+ LOG1("CDPOFPrintingDevice::GetDeviceCapabilityL begins with aCapabilityID: %d", aCapabilityID);
+ TInt err(KErrNone);
+ CPrinterElement* TargetPrinter = FindDeviceL(aDeviceID);
+ if( TargetPrinter )
+ {
+ TargetPrinter->iPrinterCapabilities->GetCapability(aCapabilityID, aCapability);
+ }
+ else
+ {
+ err = KErrInvalidData;
+ }
+ LOG1("CDPOFPrintingDevice::GetDeviceCapabilityL ends with err: %d", err);
+ return err;
+ }
+
+TInt CDPOFPrintingDevice::GetJobSetting(TInt aCapabilityID, TInt& aValue)
+ {
+ LOG1("CDPOFPrintingDevice::GetJobSetting begins with aCapabilityID: %d", aCapabilityID);
+ TInt err(KErrNone);
+ if( iPrintJob->iState == PJSNone )
+ {
+ err = KErrInvalidSequence;
+ }
+ else
+ {
+ TSetting Setting;
+ if( FindSetting(aCapabilityID, Setting) )
+ {
+ aValue = Setting.iValue;
+ }
+ else
+ {
+ err = KErrInvalidData;
+ }
+ }
+ LOG1("CDPOFPrintingDevice::GetJobSetting ends with err: %d", err);
+ return err;
+ }
+
+TInt CDPOFPrintingDevice::SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
+ {
+ LOG1("CDPOFPrintingDevice::SetJobSettingL begins with aCapabilityID: %d", aCapabilityID);
+ LOG1("CDPOFPrintingDevice::SetJobSettingL begins with aValue: %d", aValue);
+ LOG1("CDPOFPrintingDevice::SetJobSettingL begins with aAffectedCapability: %d", aAffectedCapability);
+
+ if( iPrintJob->iState == PJSNone )
+ {
+ LOG("CDPOFPrintingDevice::SetJobSettingL job state == PJSNone");
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with: %d", KErrInvalidSequence);
+ return KErrInvalidSequence;
+ }
+
+ aAffectedCapability = 0;
+ TSetting Setting;
+ if( FindSetting(aCapabilityID, Setting) == EFalse )
+ {
+ LOG("CDPOFPrintingDevice::SetJobSettingL FindSetting == EFalse");
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with: %d", KErrInvalidData);
+ return KErrInvalidData;
+ }
+
+ // Get the Target printer and capability
+ TPrintCapability TargetCapability;
+ CPrinterElement* TargetPrinter = FindDeviceL( iPrintJob->iPrinterID );
+ if( TargetPrinter == NULL )
+ {
+ LOG("CDPOFPrintingDevice::SetJobSettingL TargetPrinter == NULL");
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with: %d", KErrInvalidData);
+ return KErrInvalidData;
+ }
+
+ TargetPrinter->iPrinterCapabilities->GetCapability(aCapabilityID, TargetCapability);
+
+ // Check Validity against the target capability ranges
+ if ((TargetCapability.iType == TPrintCapability::Int) ||
+ (TargetCapability.iType == TPrintCapability::Float))
+ {
+ if (((aValue < TargetCapability.iLow) && (TargetCapability.iLow != -1)) ||
+ ((aValue > TargetCapability.iHigh) && (TargetCapability.iHigh != -1)))
+ {
+ LOG("CDPOFPrintingDevice::SetJobSettingL capability ranges error");
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with: %d", KErrInvalidData);
+ return KErrInvalidData;
+ }
+
+ }
+ else // enum
+ {
+ TBool Valid = EFalse;
+ for (TInt i = 0; i < TargetCapability.iEnumCount; i++)
+ {
+ if (aValue == TargetCapability.iEnumCodes[i])
+ {
+ Valid = ETrue;
+ break;
+ }
+ }
+ if (!Valid)
+ {
+ LOG("CDPOFPrintingDevice::SetJobSettingL !Valid");
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with: %d", KErrInvalidData);
+ return KErrInvalidData;
+ }
+ }
+
+ for (TInt i = 0; i < iPrintJob->iSettings.Count(); i++)
+ {
+ if (aCapabilityID == iPrintJob->iSettings[i].iCapabilityID)
+ {
+ iPrintJob->iSettings[i].iValue = aValue;
+ break;
+ }
+ }
+
+ aAffectedCapability = TargetPrinter->iPrinterCapabilities->SetCurrentValueL(aCapabilityID, aValue);
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with aAffectedCapability: %d", aAffectedCapability);
+ LOG1("CDPOFPrintingDevice::SetJobSettingL ends with code: %d", KErrNone);
+ return KErrNone;
+ }
+
+
+TInt CDPOFPrintingDevice::GetNumPreviewPages()
+ {
+ LOG1("CDPOFPrintingDevice::GetNumPreviewPages ends with: %d", 1);
+ return 1;
+ }
+
+TInt CDPOFPrintingDevice::GetJobTemplateIconL( TInt /*aTemplateID*/, TInt& /*aFsBitmapHandle*/ )
+ {
+ return KErrNone;
+ }
+
+
+TInt CDPOFPrintingDevice::CreatePreviewImage(TInt /*aPageNumber*/)
+ {
+ return KErrNone;
+ }
+
+
+void CDPOFPrintingDevice::HandleDpofEngineEventL(const TInt aStatus, const TInt aRetCode)
+ {
+ LOG1("CDPOFPrintingDevice::HandleDpofEngineEventL begins with aStatus: %d", aStatus);
+ LOG1("CDPOFPrintingDevice::HandleDpofEngineEventL begins with aRetCode: %d", aRetCode);
+
+ iPrintError = aRetCode;
+ iPrintErrorMsgCode = 0;
+
+ if( (aRetCode != KErrNone) && !(aRetCode==KErrCancel && aStatus==EJobCancelled) )
+ {
+ AddReadyRequestAndSetActive( EPrintError );
+ }
+ else
+ {
+ switch(aStatus)
+ {
+ case EDeleteDirectory:
+ case ECopyImageFiles:
+ case EDPOFGenerate:
+ AddReadyRequestAndSetActive( EPrintJobProgress );
+ break;
+ case EJobError:
+ AddReadyRequestAndSetActive( EPrintError );
+ break;
+ case EJobCompleted:
+ case EJobCancelled:
+ AddReadyRequestAndSetActive( EPrintJobDone );
+ break;
+ default:
+ break;
+ }
+ }
+ LOG("CDPOFPrintingDevice::HandleDpofEngineEventL end");
+ }
+
+void CDPOFPrintingDevice::DoCancel()
+ {
+ }
+
+void CDPOFPrintingDevice::RunL()
+ {
+ LOG1("CDPOFPrintingDevice::RunL begins with iStatus.Int: %d", iStatus.Int());
+ PrintSessionStatus PEStatus = (PrintSessionStatus)iStatus.Int();
+
+ switch ( PEStatus )
+ {
+ case KErrNone:
+ break;
+ case EPrinterDiscovered:
+ {
+ TPrinter foundPrinter;
+ foundPrinter.iDisplayName = KMmcPrinterName;
+ foundPrinter.iPrinterID = KMmcPrinterId;
+ foundPrinter.iProperties = TPrinter::SupportsPreview;
+ foundPrinter.iProtocol = KImagePrint_PrinterProtocol_DPOF;
+ foundPrinter.iVendor = TPrinter::EVendorNone;
+
+ LOG("CDPOFPrintingDevice::RunL printer discovered, informing observer");
+ if( iDiscoveryObserver )
+ {
+ iDiscoveryObserver->FoundDeviceL( foundPrinter );
+ }
+ AddReadyRequestAndSetActive( EDiscoveryDone );
+ break;
+ }
+ case EDiscoveryDone:
+ {
+ LOG("CDPOFPrintingDevice::RunL discovery done, informing observer");
+ if( iDiscoveryObserver )
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrNone, 0);
+ }
+ break;
+ }
+ case ECancelDiscovery:
+ {
+ LOG("CDPOFPrintingDevice::RunL discovery cancelled, informing observer");
+ if( iDiscoveryObserver )
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrCancel, 0);
+ }
+ break;
+ }
+ case EPrintError:
+ {
+ LOG("CDPOFPrintingDevice::RunL print error, informing observer");
+ LOG1("CDPOFPrintingDevice::RunL print error iPrintError: %d", iPrintError);
+ LOG1("CDPOFPrintingDevice::RunL print error iPrintErrorMsgCode: %d", iPrintErrorMsgCode);
+ if( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobErrorEvent( iPrintError, iPrintErrorMsgCode );
+ }
+ iPrintJob->iState = PJSCreated;
+ break;
+ }
+ case EPrintJobProgress:
+ {
+ LOG("CDPOFPrintingDevice::RunL job progress, informing observer");
+ if( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobProgressEvent(EActive, iDPOF->GetPrintPercentage(), ECopying);
+ }
+ break;
+ }
+ case EPrintJobDone:
+ {
+ iPrintJob->iState = PJSCreated; // go back to created so it can be re-submitted
+ if( iPrintEventObserver )
+ {
+ LOG1("CDPOFPrintingDevice::RunL job done percentage: %d", iDPOF->GetPrintPercentage());
+
+ if (iDPOF->WasCancelled() )
+ {
+ LOG("CDPOFPrintingDevice::RunL job cancelled");
+ iPrintEventObserver->PrintJobProgressEvent(EDone, iDPOF->GetPrintPercentage(), ECancelling);
+ }
+ else
+ {
+ LOG("CDPOFPrintingDevice::RunL job done");
+ iPrintEventObserver->PrintJobProgressEvent(EDone, 100, ENoMessage);
+ }
+ }
+ break;
+ }
+
+ default:
+ {
+ LOG("CDPOFPrintingDevice::RunL default, informing observer");
+ if( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobErrorEvent(KErrGeneral, 0);
+ }
+ iPrintJob->iState = PJSCreated;
+ break;
+ }
+ }
+
+ CheckReadyRequestAndSetActive();
+ LOG("CDPOFPrintingDevice::RunL end");
+ }
+
+
+CCapabilityArray* CDPOFPrintingDevice::LoadCapabilityL(RResourceFile& aResFile, TInt aCapID)
+ {
+ LOG1("CDPOFPrintingDevice::LoadCapabilityL begins with capID: %d", aCapID);
+ HBufC8* res = aResFile.AllocReadLC(aCapID);
+ TResourceReader theReader;
+ theReader.SetBuffer( res );
+ CCapabilityArray *capabilities = CCapabilityArray::NewL( theReader );
+ CleanupStack::PopAndDestroy(); // res
+ LOG("CDPOFPrintingDevice::LoadCapabilityL end");
+ return capabilities;
+ }
+
+
+CPrinterElement* CDPOFPrintingDevice::FindDeviceL(TInt aDeviceID)
+ {
+ LOG1("CDPOFPrintingDevice::FindDeviceL begins with aDeviceID: %d", aDeviceID);
+ // Add this here to fix problem
+ // if application is started without MMC and then user insert MMC in the phone ->cannot find MMC
+ if( iDeviceList.Count() == 0 )
+ {
+ SetMMCPrinterL();
+ }
+ for( TInt i = 0; i < iDeviceList.Count(); i++ )
+ {
+ if(iDeviceList[i]->iPrinter.iPrinterID == aDeviceID )
+ {
+ LOG("CDPOFPrintingDevice::FindDeviceL device found");
+ return iDeviceList[i];
+ }
+ }
+ LOG("CDPOFPrintingDevice::FindDeviceL device NOT found");
+ return NULL;
+ }
+
+TBool CDPOFPrintingDevice::FindSetting(TInt aCapabilityID, TSetting& aSetting)
+ {
+ LOG1("CDPOFPrintingDevice::FindSetting begins with aCapabilityID: %d", aCapabilityID);
+ for(TInt i = 0; i < iPrintJob->iSettings.Count(); i++)
+ {
+ if (aCapabilityID == iPrintJob->iSettings[i].iCapabilityID)
+ {
+ aSetting = iPrintJob->iSettings[i];
+ LOG("CDPOFPrintingDevice::FindSetting setting found");
+ return ETrue;
+ }
+ }
+ LOG("CDPOFPrintingDevice::FindSetting setting NOT found");
+ return EFalse;
+ }
+/*
+TInt CDPOFPrintingDevice::AddReadyRequestAndSetActive( TInt aRequest )
+ {
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive aRequest: %d", aRequest);
+ TInt err = iReadyRequests.Append( aRequest );
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive err: %d", err);
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive iReadyRequests.Count(): %d", iReadyRequests.Count());
+ if( !err )
+ {
+ TInt request = iReadyRequests[0];
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive request: %d", request);
+ iReadyRequests.Remove( 0 );
+ iStatus = KRequestPending;
+ TRequestStatus* TempTRS = &iStatus;
+ if( !IsActive() ) SetActive();
+ User::RequestComplete( TempTRS, request );
+ }
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive return: %d", err);
+ return err;
+ }
+
+TInt CDPOFPrintingDevice::CheckReadyRequestAndSetActive()
+ {
+ LOG("CDPOFPrintingDevice::CheckReadyRequestAndSetActive begin");
+ TInt count = iReadyRequests.Count();
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive count: %d", count);
+ TInt err( KErrNotFound );
+ if( count )
+ {
+ TInt request = iReadyRequests[0];
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive request: %d", request);
+ iReadyRequests.Remove( 0 );
+ iStatus = KRequestPending;
+ TRequestStatus* TempTRS = &iStatus;
+ if( !IsActive() ) SetActive();
+ User::RequestComplete( TempTRS, request );
+ err = KErrNone;
+ }
+ LOG1("CDPOFPrintingDevice::CheckReadyRequestAndSetActive return: %d", err);
+ return err;
+ }
+*/
+
+TInt CDPOFPrintingDevice::AddReadyRequestAndSetActive( TInt aRequest )
+ {
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive aRequest: %d", aRequest);
+ TInt err = iReadyRequests.Append( aRequest );
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive err: %d", err);
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive iReadyRequests.Count(): %d", iReadyRequests.Count());
+ if( !err )
+ {
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive IsActive(): %d", IsActive());
+ if( !IsActive() )
+ {
+ TInt request = iReadyRequests[0];
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive request: %d", request);
+ iReadyRequests.Remove( 0 );
+ iStatus = KRequestPending;
+ TRequestStatus* TempTRS = &iStatus;
+ SetActive();
+ User::RequestComplete( TempTRS, request );
+ }
+ }
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive return: %d", err);
+ return err;
+ }
+
+TInt CDPOFPrintingDevice::CheckReadyRequestAndSetActive()
+ {
+ LOG("CDPOFPrintingDevice::CheckReadyRequestAndSetActive begin");
+ TInt count = iReadyRequests.Count();
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive count: %d", count);
+ TInt err( KErrNotFound );
+ if( count )
+ {
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive IsActive(): %d", IsActive());
+ if( !IsActive() )
+ {
+ TInt request = iReadyRequests[0];
+ LOG1("CDPOFPrintingDevice::AddRequestAndSetActive request: %d", request);
+ iReadyRequests.Remove( 0 );
+ iStatus = KRequestPending;
+ TRequestStatus* TempTRS = &iStatus;
+ SetActive();
+ User::RequestComplete( TempTRS, request );
+ err = KErrNone;
+ }
+ }
+ LOG1("CDPOFPrintingDevice::CheckReadyRequestAndSetActive return: %d", err);
+ return err;
+ }
+
+void CDPOFPrintingDevice::ConfirmationQueryCompleteL ( TInt aError )
+ {
+ TBool answer = ( aError == EAknSoftkeyYes );
+ if( answer )
+ {
+ iCancelledByUser = EFalse; // user want to write file
+ OverwriteExistingJobL ();
+ }
+ else
+ {
+ iCancelledByUser = ETrue;
+ }
+
+ if( iDPOF->AutoPrintFileExists() )
+ {
+ if( iCancelledByUser )
+ {
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ECancellingNoMessage );
+ LOG("CDPOFPrintingDevice::SubmitPrintJobL end");
+ return;
+ }
+ }
+ }
+
+void CDPOFPrintingDevice::OverwriteExistingJobL ()
+ {
+ iPrintError = KErrNone;
+ iPrintErrorMsgCode = 0;
+
+ CRsDpofEngine::TRsDpofImageLayout layout;
+ iDPOF->SetImageFileNamesL(iPrintJob->iImages);
+ TSetting layoutSetting;
+ FindSetting(EPrintCapabLayout, layoutSetting);
+ LOG1("CDPOFPrintingDevice::OverwriteExistingJobL layoutSetting.iValue: %d", layoutSetting.iValue);
+ switch(layoutSetting.iValue)
+ {
+ case EPrintCapabLayout1UpSmall:
+ layout = CRsDpofEngine::EOnePerPageSmall;
+ break;
+ case EPrintCapabLayout1UpMedium:
+ case EPrintCapabLayout1UpLarge:
+ layout = CRsDpofEngine::EOnePerPageLarge;
+ break;
+ case EPrintCapabLayout2Up:
+ layout = CRsDpofEngine::ETwoPerPage;
+ break;
+ case EPrintCapabLayout4Up:
+ layout = CRsDpofEngine::EFourPerPage;
+ break;
+ case EPrintCapabLayout6Up:
+ layout = CRsDpofEngine::ESixPerPage;
+ break;
+ case EPrintCapabLayout9Up:
+ layout = CRsDpofEngine::ENinePerPage;
+ break;
+ case EPrintCapabLayout12Up:
+ layout = CRsDpofEngine::ETwelvePerPage;
+ break;
+ case EPrintCapabLayout16Up:
+ layout = CRsDpofEngine::ESixteenPerPage;
+ break;
+ default:
+ layout = CRsDpofEngine::EOnePerPageMedium;
+ break;
+ }
+
+ iDPOF->SetImageLayout(layout);
+ LOG1("CDPOFPrintingDevice::OverwriteExistingJobL 1 iStatus.Int(): %d", iStatus.Int());
+ TInt err = iDPOF->PrintL();
+ LOG1("CDPOFPrintingDevice::OverwriteExistingJobL iDPOF->PrintL() error: %d", err);
+ LOG1("CDPOFPrintingDevice::OverwriteExistingJobL 2 iStatus.Int(): %d", iStatus.Int());
+
+ if( err )
+ {
+ iPrintError = err;
+ iPrintErrorMsgCode = ENoMessage;
+ AddReadyRequestAndSetActive( EPrintError );
+ }
+ else
+ {
+ LOG("CDPOFPrintingDevice::OverwriteExistingJobL job submitted");
+ iPrintJob->iState = PJSSubmitted;
+ if(!IsActive()) SetActive();
+ }
+ }
+
+
+void CDPOFPrintingDevice::SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr )
+ {
+ LOG("CDPOFPrintingDevice::SetNumsOfCopiesL begin");
+ LOG1("CDPOFPrintingDevice::SetNumsOfCopiesL iPrintJob->iState: %d", iPrintJob->iState);
+ TInt err( KErrNone );
+ if( iPrintJob->iState != PJSCreated )
+ {
+ err = KErrInvalidSequence;
+ }
+ if( !err )
+ {
+ LOG1("CDPOFPrintingDevice::SetNumsOfCopiesL iPrintJob->iImages.Count(): %d", iPrintJob->iImages.Count());
+ LOG1("CDPOFPrintingDevice::SetNumsOfCopiesL aNumsOfCopies.Count(): %d", aNumsOfCopies.Count());
+ if( iPrintJob->iImages.Count() != aNumsOfCopies.Count() )
+ {
+ err = KErrInvalidData;
+ }
+ }
+ if( !err )
+ {
+ TInt count = aNumsOfCopies.Count();
+ for( TInt i = 0; i < count && !err; i++ )
+ {
+ LOG1("CDPOFPrintingDevice::SetNumsOfCopiesL i: %d", i);
+ LOG1("CDPOFPrintingDevice::SetNumsOfCopiesL aNumsOfCopies[i]: %d", aNumsOfCopies[i]);
+ if( aNumsOfCopies[i] <= 0 )
+ {
+ err = KErrInvalidData;
+ }
+ }
+ }
+ if( !err )
+ {
+ iDPOF->SetNumsOfCopiesL( aNumsOfCopies );
+ }
+ aErr = err;
+ LOG1("CDPOFPrintingDevice::SetNumsOfCopiesL aErr: %d", aErr);
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cfilemanager.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,256 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cfilemanager.h"
+#include "rsutils.h"
+#include "clog.h"
+
+// CONSTANTS
+namespace
+ {
+ const TInt KBufferSize = 1000;
+ }
+
+#define USE_CFILEMAN_FIRST
+
+CFileManager* CFileManager::NewL( RFs& aFs )
+ {
+ CFileManager* self = new ( ELeave ) CFileManager( aFs );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CFileManager::CFileManager( RFs& aFs ) : CActive( CActive::EPriorityHigh ),
+ iFs( aFs ),
+ iBuffer( NULL )
+
+ {
+ CActiveScheduler::Add( this );
+ }
+
+CFileManager::~CFileManager()
+ {
+ Cancel();
+ CloseCopy();
+ if(iBuffer)
+ {
+ delete iBuffer;
+ iBuffer = NULL;
+ }
+ delete iFileMan;
+ }
+
+void CFileManager::ConstructL()
+ {
+ iFileMan = CFileMan::NewL( iFs );
+ }
+
+
+TInt CFileManager::Copy( const TDesC& aFile, const TDesC& aDir, TRequestStatus& aStatus )
+ {
+ LOG( "CFileManager::Copy begin" );
+ Cancel();
+ CloseCopy();
+ iCallerStatus = &aStatus;
+ TInt err( KErrNone );
+#ifdef USE_CFILEMAN_FIRST
+ // check if file is used by another application
+ err = iSource.Open( iFs, aFile, EFileRead | EFileShareReadersOnly );
+ LOG1("CFileManager::Copy check err: %d", err);
+ iSource.Close();
+ if( !err )
+ {
+ err = iFileMan->Copy( aFile, aDir, CFileMan::EOverWrite, iStatus );
+ LOG1("CFileManager::Copy iFileMan->Copy err: %d", err);
+ if( !err )
+ {
+ iOperation = EFileManCopy;
+ SetActive();
+ }
+ }
+ else
+#endif
+ {
+ iOperation = EBufferCopy;
+ TRAP( err, InitCopyL( aFile, aDir ) );
+ LOG1( "CFileManager::Copy InitCopyL err: %d", err );
+ if( err )
+ {
+ CloseCopy();
+ }
+ else
+ {
+ TPtr8 ptr = iBuffer->Des();
+ LOG1( "CFileManager::Copy iBytesNum: %d", iBytesNum );
+ iSource.Read( ptr, iBytesNum, iStatus );
+ LOG( "CFileManager::Copy call to SetActive()" );
+ SetActive();
+ }
+ }
+ LOG1( "CFileManager::Copy end with: %d", err );
+ return err;
+ }
+
+
+void CFileManager::DoCancel()
+ {
+ LOG( "CFileManager::DoCancel begin" );
+ CloseCopy();
+ LOG( "CFileManager::DoCancel end" );
+ }
+
+void CFileManager::RunL()
+ {
+ LOG1( "CFileManager::RunL iStatus: %d", iStatus.Int() );
+ LOG1( "CFileManager::RunL iOperation: %d", iOperation );
+
+ if( iStatus == KErrNone )
+ {
+ switch( iOperation )
+ {
+ case ERemoveDir:
+ {
+ LOG( "CFileManager::RunL directory removed" );
+ User::RequestComplete( iCallerStatus, iStatus.Int() );
+ }
+ break;
+ case EFileManCopy:
+ {
+ LOG( "CFileManager::RunL file copied" );
+ User::RequestComplete( iCallerStatus, iStatus.Int() );
+ }
+ break;
+ case EBufferCopy:
+ {
+ TPtr8 ptr = iBuffer->Des();
+ LOG( "CFileManager::RunL call to RFile::Write()" );
+ User::LeaveIfError( iDest.Write( ptr, iBytesNum ) );
+ iBytesLeft -= iBytesNum;
+ if( iBytesLeft )
+ {
+ iBytesNum = ( KBufferSize < iBytesLeft ) ? KBufferSize : iBytesLeft;
+ LOG1( "CFileManager::RunL iBytesLeft: %d", iBytesLeft );
+ iSource.Read( ptr, iBytesNum, iStatus );
+ SetActive();
+ }
+ else
+ {
+ User::LeaveIfError( iDest.Flush() );
+ CloseCopy();
+ LOG( "CFileManager::RunL file copied" );
+ User::RequestComplete( iCallerStatus, iStatus.Int() );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ CloseCopy();
+ User::RequestComplete( iCallerStatus, iStatus.Int() );
+ }
+ }
+
+TInt CFileManager::RunError( TInt aError )
+ {
+ LOG1( "CFileManager::RunError aError: %d", aError );
+ return KErrNone;
+ }
+
+void CFileManager::CloseCopy()
+ {
+ LOG( "CFileManager::CloseCopy begin" );
+ iSource.Close();
+ iDest.Close();
+ delete iBuffer;
+ iBuffer = NULL;
+ iBytesLeft = 0;
+ iBytesNum = 0;
+ LOG( "CFileManager::CloseCopy end" );
+ }
+
+void CFileManager::InitCopyL( const TDesC& aFile, const TDesC& aDir )
+ {
+ LOG( "CFileManager::InitCopyL begin" );
+ TInt err = iSource.Open( iFs, aFile, EFileRead | EFileShareReadersOnly );
+ LOG1("CFileManager::InitCopyL file.Open (shareread mode): %d", err);
+ if ( err != KErrNone )
+ {
+ err = iSource.Open( iFs, aFile, EFileRead | EFileShareAny );
+ LOG1("CFileManager::InitCopyL file.Open (shareany mode): %d", err);
+ }
+ User::LeaveIfError( err );
+
+ TParsePtrC parse( aFile );
+ TFileName writeFileName( aDir );
+ writeFileName.Append( parse.NameAndExt() );
+ User::LeaveIfError( iDest.Replace( iFs, writeFileName, EFileWrite ) );
+ iBuffer = HBufC8::NewL( KBufferSize );
+ User::LeaveIfError( iSource.Size( iBytesLeft ) );
+ LOG1( "CFileManager::InitCopyL file size: %d", iBytesLeft );
+ iBytesNum = ( KBufferSize < iBytesLeft ) ? KBufferSize : iBytesLeft;
+ LOG( "CFileManager::InitCopyL end" );
+ }
+
+void CFileManager::CancelCopy()
+ {
+ LOG("CFileManager::CancelCopy begin");
+ if( IsActive() )
+ {
+ Cancel();
+ User::RequestComplete( iCallerStatus, KErrCancel );
+ }
+ LOG("CFileManager::CancelCopy end");
+ }
+
+void CFileManager::CancelRmDir()
+ {
+ LOG("CFileManager::CancelRmDir begin");
+ if( IsActive() )
+ {
+ Cancel();
+ User::RequestComplete( iCallerStatus, KErrCancel );
+ }
+ LOG("CFileManager::CancelRmDir end");
+ }
+
+TInt CFileManager::RmDir( const TDesC& aDir, TRequestStatus& aStatus )
+ {
+ LOG1("CFileManager::RmDir aDir: %S", &aDir);
+ TInt err( KErrNone );
+ Cancel();
+ iCallerStatus = &aStatus;
+ if( RsUtils::PathExists( aDir, iFs ) )
+ {
+ err = iFileMan->RmDir( aDir, iStatus );
+ iOperation = ERemoveDir;
+ if( !err ) SetActive();
+ }
+ else
+ {
+ User::RequestComplete( iCallerStatus, KErrNone );
+ }
+ LOG1("CFileManager::RmDir return: %d", err);
+ return err;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cprintercapabilities.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,175 @@
+/*
+* 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 CPrinterCapabilities class definition.
+*
+*/
+
+
+#include "cprintercapabilities.h"
+#include "imageprint.h"
+
+//**********************************************************************
+// CPrinterCapabilities
+//**********************************************************************
+
+CPrinterCapabilities::CPrinterCapabilities(CCapabilityArray* aSourceArray, TInt aPrinterClass)
+ {
+ iSourceArray = aSourceArray;
+ iPrinterClass = aPrinterClass;
+ }
+
+CPrinterCapabilities::~CPrinterCapabilities()
+ {
+ iPrinterDataArray.ResetAndDestroy();
+ iPrinterDataArray.Close();
+ }
+
+CPrinterCapabilities* CPrinterCapabilities::NewL(CCapabilityArray* aSourceArray, TInt aPrinterClass)
+ {
+ CPrinterCapabilities* self=new (ELeave) CPrinterCapabilities(aSourceArray,aPrinterClass);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CPrinterCapabilities::ConstructL()
+ {
+ BuildCapabilityArrayL();
+ }
+
+void CPrinterCapabilities::BuildCapabilityArrayL()
+ {
+ CCapabilityInfo* capInfo;
+ CCapabilityInfo* workCap;
+ TInt count = iSourceArray->Count();
+
+ for( TInt i = 0; i < count; i++ )
+ {
+ capInfo = (*iSourceArray)[i];
+ if( capInfo->PrinterClass() == iPrinterClass )
+ {
+ workCap = capInfo->CopyL();
+ CleanupStack::PushL( workCap );
+ iPrinterDataArray.AppendL( workCap );
+ CleanupStack::Pop(); // workCap
+ TInt link = workCap->SetCurrentValue( workCap->Capability().iDefaultValue );
+ if( link )
+ {
+ workCap = iSourceArray->LinkedCapability( link )->CopyL();
+ CleanupStack::PushL( workCap );
+ iPrinterDataArray.AppendL( workCap );
+ CleanupStack::Pop(); // workCap
+ }
+ }
+ }
+ }
+
+void CPrinterCapabilities::GetIDs( RArray<TInt>& aCapabilityIDs ) const
+ {
+ for( TInt nCnt = 0; nCnt < iPrinterDataArray.Count(); nCnt++ )
+ {
+ aCapabilityIDs.Append( iPrinterDataArray[nCnt]->Capability().iCapabilityID );
+ }
+ }
+
+TInt CPrinterCapabilities::GetCapability( TInt aCapabilityID, TPrintCapability& aCapability ) const
+ {
+ TInt err( KErrInvalidData );
+ for( TInt nCnt = 0; nCnt < iPrinterDataArray.Count() && err; nCnt++ )
+ {
+ if( iPrinterDataArray[nCnt]->Capability().iCapabilityID == aCapabilityID )
+ {
+ aCapability = iPrinterDataArray[nCnt]->Capability();
+ err = KErrNone;
+ }
+ }
+ return err;
+ }
+
+TInt CPrinterCapabilities::SetCurrentValueL( TInt aCapabilityID, TInt aValue )
+ // returns any affected capability ID
+ {
+ // locate the capability
+ CCapabilityInfo* capInfo = NULL;
+ for( TInt nCnt = 0; nCnt < iPrinterDataArray.Count() && !capInfo; nCnt++ )
+ {
+ if( iPrinterDataArray[nCnt]->Capability().iCapabilityID == aCapabilityID )
+ {
+ capInfo = iPrinterDataArray[nCnt];
+ }
+ }
+
+ TInt affectedCapability( 0 );
+
+ if( capInfo && aValue != capInfo->CurrentValue() )
+ {
+ // has changed
+ TInt currentLink = capInfo->ValueLink( capInfo->CurrentValue() );
+ TInt newLink = capInfo->SetCurrentValue( aValue );
+
+ if( newLink != currentLink )
+ {
+ // Find and Delete the old link
+ for( TInt nCnt = 0; nCnt < iPrinterDataArray.Count(); nCnt++ )
+ {
+ if( iPrinterDataArray[nCnt]->LinkID() == currentLink )
+ {
+ CCapabilityInfo *tmpCap;
+ tmpCap = iPrinterDataArray[nCnt];
+ iPrinterDataArray.Remove(nCnt);
+ delete tmpCap;
+ break;
+ }
+ }
+
+ // add the new link
+ if( newLink )
+ {
+ capInfo = iSourceArray->LinkedCapability( newLink );
+ affectedCapability = capInfo->Capability().iCapabilityID;
+ CCapabilityInfo* tmpCap = capInfo->CopyL();
+ CleanupStack::PushL( tmpCap );
+ iPrinterDataArray.AppendL( tmpCap );
+ CleanupStack::Pop(); // tmpCap
+ }
+ }
+ }
+
+ return affectedCapability;
+ }
+
+TBool CPrinterCapabilities::GetCurrentValue( TInt aCapabilityID, TInt &aCapabilityValue ) const
+ {
+ TBool result( EFalse );
+
+ for( TInt nCnt = 0; nCnt < iPrinterDataArray.Count() && !result; nCnt++ )
+ {
+ if( iPrinterDataArray[nCnt]->Capability().iCapabilityID == aCapabilityID )
+ {
+ aCapabilityValue = iPrinterDataArray[nCnt]->CurrentValue();
+ result = ETrue;
+ }
+ }
+
+ return result;
+ }
+
+
+TInt CPrinterCapabilities::Count() const
+ {
+ return iPrinterDataArray.Count();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cprinterelement.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,42 @@
+/*
+* 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 CPrinterElement class definition and the Transport enum.
+*
+*/
+
+
+#include <e32std.h>
+
+#include "cprinterelement.h"
+
+//**********************************************************************
+// CPrinterElement
+//**********************************************************************
+CPrinterElement::CPrinterElement()
+ {
+ }
+
+CPrinterElement* CPrinterElement::NewLC()
+ {
+ CPrinterElement* self = new (ELeave) CPrinterElement();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CPrinterElement::~CPrinterElement()
+ {
+ delete iPrinterCapabilities;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cprintjob.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* 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 CPrintJob class definition and the PJS enum.
+*
+*/
+
+
+#include <e32std.h>
+
+#include "cprintjob.h"
+
+//**********************************************************************
+// CPrintJob
+//**********************************************************************
+CPrintJob::CPrintJob() : iState( PJSNone )
+ {
+ }
+
+CPrintJob::~CPrintJob()
+ {
+ iImages.ResetAndDestroy();
+ iImages.Close();
+ iSettings.Close();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/crsdpofengine.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,759 @@
+/*
+* 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 CRsDpofEngine & TRsPhoneImage class definitions and
+* the MDpofEngineObserver interface definition.
+*
+*/
+
+
+#include <e32std.h>
+#include <s32file.h>
+#include <pathinfo.h>
+#include <sysutil.h>
+#include <driveinfo.h>
+
+#include "crsdpofengine.h"
+#include "rsutils.h"
+#include "imgprintkonst.h"
+#include "clog.h"
+#include "cfilemanager.h"
+
+// CONSTANTS
+namespace
+ {
+ _LIT(KBackslash, "\\");
+ const TInt KCopyPercentage = 90;
+ const TInt KAutoPrintFileAddon=2048;
+
+ _LIT(KDpofAutoPrintFilename, "\\MISC\\AUTPRINT.MRK");
+ _LIT(KDpofAutoPrintTempFolder, "\\DPOF\\");
+ _LIT8(KDoubleQuote, "\"");
+
+ _LIT8(KCrLf, "\r\n");
+ _LIT8(KDpofHeader, "[HDR]\r\nGEN REV = 01.10\r\nGEN CRT = \"ImagePrint\" -02.10\r\nGEN DTM = ");
+ _LIT8(KDpofJobAndPid, "[JOB]\r\nPRT PID = ");
+ _LIT8(KDpofPrtTypSizeSmall, "PRT TYP = SIZ -03\r\n");
+ _LIT8(KDpofPrtTypSizeMedium, "PRT TYP = STD\r\n");
+ _LIT8(KDpofPrtTypSizeLarge, "PRT TYP = SIZ -05\r\n");
+ _LIT8(KDpofPrtTypSize4x6, "PRT TYP = STD\r\n");
+ _LIT8(KDpofPrtTypSize2pp, "PRT TYP = MUL -02\r\n");
+ _LIT8(KDpofPrtTypSize4pp, "PRT TYP = MUL -04\r\n");
+ _LIT8(KDpofPrtTypSize6pp, "PRT TYP = MUL -06\r\n");
+ _LIT8(KDpofPrtTypSize9pp, "PRT TYP = MUL -09\r\n");
+ _LIT8(KDpofPrtTypSize12pp, "PRT TYP = MUL -12\r\n");
+ _LIT8(KDpofPrtTypSize16pp, "PRT TYP = MUL -16\r\n");
+ _LIT8(KDpofPrtQtyAndImgFmt, "PRT QTY = 001\r\nIMG FMT = EXIF2 -J\r\n");
+ _LIT8(KDpofImgSrc, "IMG SRC = ");
+
+ _LIT8(KDateFormat,"%4d:%02d:%02d:%02d:%02d:%02d");
+ _LIT( KDotDot, ".." );
+ _LIT( KSlash, "/" );
+ const TInt KDpofDelay = 500000;
+ }
+
+
+
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+CRsDpofEngine* CRsDpofEngine::NewL(MDpofEngineObserver& aObs)
+ {
+ CRsDpofEngine* self = new (ELeave) CRsDpofEngine(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+void CRsDpofEngine::ConstructL()
+ {
+ LOG("CRsDpofEngine::ConstructL begin");
+ User::LeaveIfError( iFs.Connect() );
+ iFileManager = CFileManager::NewL( iFs );
+ LOG("CRsDpofEngine::ConstructL end");
+ }
+
+CRsDpofEngine::CRsDpofEngine(MDpofEngineObserver& aObs) :
+ CActive(CActive::EPriorityStandard),
+ iHasMmc(EFalse),
+ iImageLayout(0),
+ iObs(aObs),
+ iShouldCancel(EFalse)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CRsDpofEngine::~CRsDpofEngine()
+ {
+ Cancel();
+ if(iDpofPeriodic) iDpofPeriodic->Cancel();
+ delete iDpofPeriodic;
+ delete iMmcDrive;
+ delete iAutoPrintFile;
+ delete iTempFolder;
+ iFileNames.ResetAndDestroy();
+ iFileNames.Close();
+ iPhoneImageArray.Close();
+ delete iFileManager;
+ iFs.Close();
+ iNumsOfCopies.Close();
+ }
+
+void CRsDpofEngine::SetMMCPathL()
+ {
+ LOG("CRsDpofEngine::SetMMCPathL begin");
+
+ TFileName fileInfo;
+ TInt driveId;
+ TFileName path;
+ User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, driveId ) );
+ User::LeaveIfError( PathInfo::GetRootPath( path, driveId ) );
+ HBufC* mmcRoot = path.AllocLC();
+
+ LOG1("CRsDpofEngine::SetMMCPathL mmcRoot: %S", mmcRoot);
+ iHasMmc = ( mmcRoot && mmcRoot->Length() && RsUtils::PathExists( *mmcRoot, iFs ) );
+
+ if( iHasMmc )
+ {
+ LOG("CRsDpofEngine::SetMMCPathL MMC found");
+ iMmcDrive = mmcRoot->Left( 2 ).AllocL();
+ fileInfo.Copy( *iMmcDrive );
+ fileInfo.Append( KDpofAutoPrintFilename );
+ iAutoPrintFile = fileInfo.AllocL();
+ fileInfo.Copy( *iMmcDrive );
+ fileInfo.Append( KDpofAutoPrintTempFolder );
+ iTempFolder = fileInfo.AllocL();
+ }
+
+ CleanupStack::PopAndDestroy( mmcRoot );
+
+ LOG("CRsDpofEngine::SetMMCPathL end");
+ }
+TInt CRsDpofEngine::CleanupTempImages()
+ {
+ LOG("CRsDpofEngine::CleanupTempImages begin");
+ iStatus = KRequestPending;
+ TInt retVal = iFileManager->RmDir( *iTempFolder, iStatus );
+ if( !retVal && !IsActive() ) SetActive();
+ LOG1("CRsDpofEngine::CleanupTempImages reurn: %d", retVal);
+ return retVal;
+ }
+
+void CRsDpofEngine::SetImageFileNamesL(const RPointerArray<HBufC>& aImageList)
+ {
+ LOG("CRsDpofEngine::SetImageFileNamesL begin");
+ iFileNames.ResetAndDestroy();
+ for( TInt i = 0; i < aImageList.Count(); i++)
+ {
+ HBufC* fileName = aImageList[i]->AllocLC();
+ LOG1("CRsDpofEngine::SetImageFileNamesL file: %S", fileName);
+ User::LeaveIfError( iFileNames.Append( fileName ) );
+ CleanupStack::Pop( fileName );
+ }
+ LOG("CRsDpofEngine::SetImageFileNamesL end");
+ }
+
+void CRsDpofEngine::SetImageLayout(TRsDpofImageLayout aImageLayout)
+ {
+ iImageLayout = aImageLayout;
+ }
+
+
+TInt CRsDpofEngine::PrintL()
+ {
+ LOG("CRsDpofEngine::PrintL begin");
+ TInt retVal( KErrNone );
+ iPhoneImgsSize = 0;
+
+ iShouldCancel = EFalse;
+ iPhoneImageArray.Reset();
+
+ // Check if there are phone memory images, and add up their total space
+ LOG("CRsDpofEngine::PrintL checking phone memory images...");
+ for( TInt i = 0; i < iFileNames.Count() && !retVal; i++ )
+ {
+ if( !RsUtils::FileOnDrive( (*iMmcDrive)[0], *(iFileNames[i]) ) )
+ {
+ LOG1("CRsDpofEngine::PrintL phone memory image: %S", iFileNames[i]);
+ TRsPhoneImage phoneImage;
+ phoneImage.iIndex = i;
+ phoneImage.iCopied = EFalse;
+ iPhoneImageArray.AppendL( phoneImage );
+ retVal = RsUtils::CumulativeFileSize( *(iFileNames[i]), iFs, iPhoneImgsSize );
+ LOG1("CRsDpofEngine::PrintL error checking phone memory images: %d", retVal);
+ }
+ }
+ LOG("CRsDpofEngine::PrintL checking phone memory images end");
+ LOG1("CRsDpofEngine::PrintL checking phone memory images, size: %d", iPhoneImgsSize);
+
+ if( !retVal )
+ {
+ retVal = CleanupTempImages();
+ LOG1("CRsDpofEngine::PrintL error deleting temp folder: %d", retVal);
+ if( retVal == KErrNone )
+ {
+ iStep = EDeleteDirectory;
+ iObs.HandleDpofEngineEventL( EDeleteDirectory, retVal );
+ }
+ }
+
+ LOG1("CRsDpofEngine::PrintL return: %d", retVal);
+ return retVal;
+ }
+
+
+TInt CRsDpofEngine::PrepareFilenamesL()
+ {
+ LOG("CRsDpofEngine::PrepareFilenamesL begin");
+ TInt retVal( KErrNone );
+
+
+ // Walk through the list of files
+ // - replacing long names with short names
+ // - "\" with "/"
+ // - MMC drive "e:" with ".."
+
+ LOG1("CRsDpofEngine::PrepareFilenamesL iFileNames->Count(): %d", iFileNames.Count());
+ for( TInt i = 0; i < iFileNames.Count(); i++ )
+ {
+ LOG1("CRsDpofEngine::PrepareFilenamesL original: %S", iFileNames[i]);
+
+ TFileName shortFilename;
+ retVal = iFs.GetShortName( *(iFileNames[i]), shortFilename );
+ if( retVal != KErrNone )
+ {
+ LOG1("CRsDpofEngine::PrepareFilenamesL 1 error getting short name: %d", retVal);
+ return retVal;
+ }
+
+ TParse parse;
+ parse.Set( *(iFileNames[i]), NULL, NULL );
+ parse.Set( parse.DriveAndPath(), NULL, NULL );
+ while( !parse.IsRoot() )
+ {
+ TBuf<16> shortDir;
+ retVal = iFs.GetShortName( parse.DriveAndPath(), shortDir );
+ if( retVal != KErrNone )
+ {
+ LOG1("CRsDpofEngine::PrepareFilenamesL 2 error getting short name: %d", retVal);
+ return retVal;
+ }
+
+ shortFilename.Insert( 0, KSlash );
+ shortFilename.Insert( 0, shortDir );
+
+ parse.PopDir();
+ }
+ shortFilename.Insert( 0, KSlash );
+ shortFilename.Insert( 0, KDotDot );
+
+ delete iFileNames[i];
+ iFileNames[i] = NULL;
+ iFileNames[i] = shortFilename.AllocL();
+
+ LOG1("CRsDpofEngine::PrepareFilenamesL changed: %S", iFileNames[i]);
+ }
+
+ LOG1("CRsDpofEngine::PrepareFilenamesL end with: %d", retVal);
+ return retVal;
+ }
+
+TInt CRsDpofEngine::WriteSpecificSizeFileL()
+ {
+ LOG("CRsDpofEngine::WriteSpecificSizeFile begin");
+ // Creates the autoprint file for a Specific Size image print
+ RFile autoPFile;
+ TBuf8<256> tempDes;
+ TTime currTime;
+ TDateTime currDT;
+ currTime.HomeTime();
+ currDT = currTime.DateTime();
+
+ // Open the autoprint file
+ TInt retVal = autoPFile.Replace( iFs, *iAutoPrintFile, EFileWrite );
+ if( retVal != KErrNone )
+ {
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile error opening autoprint file: %d", retVal);
+ return retVal;
+ }
+
+ CleanupClosePushL(autoPFile);
+ RFileWriteStream writeStream(autoPFile);
+ CleanupClosePushL(writeStream);
+
+ // Write the common header information
+ LOG("CRsDpofEngine::WriteSpecificSizeFile Write the common header information");
+ writeStream.WriteL(KDpofHeader);
+ tempDes.Format(KDateFormat, currDT.Year(), (currDT.Month()+1), (currDT.Day()+1), currDT.Hour(), currDT.Minute(), currDT.Second());
+ writeStream.WriteL(tempDes);
+ writeStream.WriteL(KCrLf);
+
+ // For each image in the array
+ LOG("CRsDpofEngine::WriteSpecificSizeFile For each image in the array");
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile iFileNames->Count(): %d", iFileNames.Count());
+
+ TInt pid( 1 );
+
+
+ for( TInt i = 0; i < iFileNames.Count(); i++ )
+ {
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile i: %d", i);
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile iNumsOfCopies[i]: %d", iNumsOfCopies[i]);
+ for( TInt j = 0; j < iNumsOfCopies[i]; j++ )
+ {
+ pid += j;
+ // write a job section, followed by the PID
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile write a job section, followed by the PID: %d", pid);
+ writeStream.WriteL(KDpofJobAndPid);
+ tempDes.NumFixedWidth( pid, EDecimal, 3 );
+ writeStream.WriteL(tempDes);
+ writeStream.WriteL(KCrLf);
+
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile iImageLayout: %d", iImageLayout);
+ switch( iImageLayout )
+ {
+ case EOnePerPageSmall:
+ writeStream.WriteL(KDpofPrtTypSizeSmall);
+ break;
+ case EOnePerPageMedium:
+ writeStream.WriteL(KDpofPrtTypSizeMedium);
+ break;
+ case EOnePerPageLarge:
+ writeStream.WriteL(KDpofPrtTypSizeLarge);
+ break;
+ case EOnePerPage4x6:
+ writeStream.WriteL(KDpofPrtTypSize4x6);
+ break;
+ default:
+ break;
+ }
+
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile file: %S", iFileNames[i]);
+ writeStream.WriteL(KDpofPrtQtyAndImgFmt);
+ writeStream.WriteL(KDpofImgSrc);
+ writeStream.WriteL(KDoubleQuote);
+ tempDes.Copy(*(iFileNames[i]));
+ writeStream.WriteL(tempDes);
+ writeStream.WriteL(KDoubleQuote);
+ writeStream.WriteL(KCrLf);
+ }
+ }
+
+
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy(2); // writeStream, autoPFile
+
+ LOG1("CRsDpofEngine::WriteSpecificSizeFile end with: %d", retVal);
+ return retVal;
+ }
+
+TInt CRsDpofEngine::WriteMultipleFileL()
+ {
+ LOG("CRsDpofEngine::WriteMultipleFile begin");
+ // Creates the autoprint file for a Multiple image print
+ TInt retVal=KErrNone;
+ RFile autoPFile;
+ TBuf8<256> tempDes;
+ TTime currTime;
+ TDateTime currDT;
+ currTime.HomeTime();
+ currDT = currTime.DateTime();
+
+ // Open the autoprint file
+ retVal = autoPFile.Replace( iFs, *iAutoPrintFile, EFileWrite );
+ if( retVal != KErrNone )
+ {
+ LOG1("CRsDpofEngine::WriteMultipleFile error opening autoprint file: %d", retVal);
+ return retVal;
+ }
+
+ CleanupClosePushL(autoPFile);
+ RFileWriteStream writeStream(autoPFile);
+ CleanupClosePushL(writeStream);
+
+ // Write the common header information
+ LOG("CRsDpofEngine::WriteMultipleFile Write the common header information");
+ writeStream.WriteL(KDpofHeader);
+ tempDes.Format(KDateFormat, currDT.Year(), (currDT.Month()+1), (currDT.Day()+1), currDT.Hour(), currDT.Minute(), currDT.Second());
+ writeStream.WriteL(tempDes);
+ writeStream.WriteL(KCrLf);
+
+ // Start the job section, followed by the PID
+ LOG("CRsDpofEngine::WriteMultipleFile Start the job section, followed by the PID");
+ writeStream.WriteL(KDpofJobAndPid);
+ tempDes.NumFixedWidth(1, EDecimal, 3);
+ writeStream.WriteL(tempDes);
+ writeStream.WriteL(KCrLf);
+
+ LOG1("CRsDpofEngine::WriteMultipleFile iImageLayout: %d", iImageLayout);
+ switch (iImageLayout)
+ {
+ case ETwoPerPage:
+ writeStream.WriteL(KDpofPrtTypSize2pp);
+ break;
+ case EFourPerPage:
+ writeStream.WriteL(KDpofPrtTypSize4pp);
+ break;
+ case ESixPerPage:
+ writeStream.WriteL(KDpofPrtTypSize6pp);
+ break;
+ case ENinePerPage:
+ writeStream.WriteL(KDpofPrtTypSize9pp);
+ break;
+ case ETwelvePerPage:
+ writeStream.WriteL(KDpofPrtTypSize12pp);
+ break;
+ case ESixteenPerPage:
+ writeStream.WriteL(KDpofPrtTypSize16pp);
+ break;
+ default:
+ break;
+ }
+ writeStream.WriteL(KDpofPrtQtyAndImgFmt);
+
+ // For each image in the array
+ LOG("CRsDpofEngine::WriteMultipleFile For each image in the array");
+ LOG1("CRsDpofEngine::WriteMultipleFile iFileNames->Count(): %d", iFileNames.Count());
+
+
+ for( TInt i = 0; i < iFileNames.Count(); i++)
+ {
+ LOG1("CRsDpofEngine::WriteMultipleFile i: %d", i);
+ LOG1("CRsDpofEngine::WriteMultipleFile iNumsOfCopies[i]: %d", iNumsOfCopies[i]);
+ for( TInt j = 0; j < iNumsOfCopies[i]; j++ )
+ {
+ LOG1("CRsDpofEngine::WriteMultipleFile file: %S", iFileNames[i]);
+ // add it to the job section
+ writeStream.WriteL(KDpofImgSrc);
+ writeStream.WriteL(KDoubleQuote);
+ tempDes.Copy(*(iFileNames[i]));
+ writeStream.WriteL(tempDes);
+ writeStream.WriteL(KDoubleQuote);
+ writeStream.WriteL(KCrLf);
+ }
+ }
+
+
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy(2); // writeStream, autoPFile
+
+ LOG1("CRsDpofEngine::WriteMultipleFile end with: %d", retVal);
+ return retVal;
+ }
+
+void CRsDpofEngine::DoCancel()
+ {
+ LOG("CRsDpofEngine::DoCancel begin");
+ iShouldCancel = ETrue;
+ LOG("CRsDpofEngine::DoCancel end");
+ }
+
+void CRsDpofEngine::Stop()
+ {
+ LOG("CRsDpofEngine::Stop begin");
+ iShouldCancel = ETrue;
+ iFileManager->CancelCopy();
+ iFileManager->CancelRmDir();
+ LOG("CRsDpofEngine::Stop end");
+ }
+
+void CRsDpofEngine::RunL()
+ {
+ LOG1("CRsDpofEngine::RunL called with iStatus.Int(): %d", iStatus.Int());
+ TInt retVal( KErrNone );
+
+ if( iStatus.Int() != KErrNone )
+ {
+ LOG("CRsDpofEngine::RunL there was an error, so cleanup");
+ iObs.HandleDpofEngineEventL(iStep, iStatus.Int());
+ }
+ else
+ {
+ LOG1("CRsDpofEngine::RunL iStep: %d", iStep);
+ switch( iStep )
+ {
+ case ECopyImageFiles:
+ {
+ // change those filename array entries so that the filename is now correct
+ TParsePtrC parsePtr( *(iFileNames[iCurrentPhoneImage->iIndex]) );
+ iTempFile.Append( parsePtr.NameAndExt() );
+ delete iFileNames[iCurrentPhoneImage->iIndex];
+ iFileNames[iCurrentPhoneImage->iIndex] = NULL;
+ iFileNames[iCurrentPhoneImage->iIndex] = iTempFile.AllocL();
+ iCurrentPhoneImage->iCopied = ETrue;
+
+ retVal = CopyPhoneImagesToMMC();
+ LOG1("CRsDpofEngine::RunL CopyPhoneImagesToMMC returned: %d", retVal);
+ if( retVal == KErrNone )
+ {
+ iObs.HandleDpofEngineEventL(iStep, retVal);
+ }
+ else if( retVal == KErrCancel )
+ {
+ CreateDpofFileL();
+ }
+ else
+ {
+ iObs.HandleDpofEngineEventL( iStep, retVal );
+ }
+ }
+ break;
+ case EDeleteDirectory:
+ {
+ LOG1("CRsDpofEngine::RunL iPhoneImageArray.Count(): %d", iPhoneImageArray.Count());
+ if( iPhoneImageArray.Count() )
+ {
+ TUint32 size( 0 );
+ RsUtils::DriveFreeSpace( (*iMmcDrive)[0], iFs, size );
+
+ if( SysUtil::MMCSpaceBelowCriticalLevelL( &iFs, iPhoneImgsSize ) )
+ {
+ LOG("CRsDpofEngine::PrintL below MMC critical level");
+ retVal = KErrTooBig;
+ }
+ else if( size < ( iPhoneImgsSize + KAutoPrintFileAddon ) )
+ {
+ LOG("CRsDpofEngine::PrintL NO room on MMC for phone memory images");
+ retVal = KErrTooBig;
+ }
+ else
+ {
+ LOG("CRsDpofEngine::PrintL enough room on MMC for phone memory images");
+ if( !RsUtils::PathExists( *iTempFolder, iFs ) )
+ {
+ retVal = iFs.MkDir( *iTempFolder );
+ LOG1("CRsDpofEngine::PrintL error making temp folder: %d", retVal);
+ if( !retVal )
+ {
+ retVal = CopyPhoneImagesToMMC();
+ LOG1("CRsDpofEngine::PrintL error copying phone memory images: %d", retVal);
+ }
+ }
+ }
+
+ iObs.HandleDpofEngineEventL( ECopyImageFiles, retVal );
+ }
+ else
+ {
+ CreateDpofFileL();
+ iObs.HandleDpofEngineEventL( EDPOFGenerate, KErrNone );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ LOG("CRsDpofEngine::RunL end");
+ }
+
+
+TInt CRsDpofEngine::CopyPhoneImagesToMMC()
+ {
+ LOG("CRsDpofEngine::CopyPhoneImagesToMMC begin");
+ TInt retVal = KErrCancel;
+ iStep = ECopyImageFiles;
+ if( iShouldCancel )
+ {
+ LOG1("CRsDpofEngine::CopyPhoneImagesToMMC iShouldCancel== ETrue, end with: %d", retVal);
+ return retVal;
+ }
+
+ iCurrentPhoneImage = GetNextImageInfoForCopy();
+
+ if( iCurrentPhoneImage )
+ {
+ // copy phone mem images to MMC card temp dir
+ TTime theTime;
+ theTime.HomeTime();
+ iTempFile.Copy( *iTempFolder );
+ iTempFile.AppendNumUC( theTime.Int64(), EHex );
+ iTempFile.Append( KBackslash );
+ retVal = iFs.MkDir( iTempFile );
+ LOG1("CRsDpofEngine::CopyPhoneImagesToMMC error making directory: %d", retVal);
+ if( retVal == KErrNone )
+ {
+ retVal = iFileManager->Copy( *(iFileNames[iCurrentPhoneImage->iIndex]), iTempFile, iStatus );
+ LOG1("CRsDpofEngine::CopyPhoneImagesToMMC error copying: %d", retVal);
+ if( retVal == KErrNone )
+ {
+ iStatus = KRequestPending;
+ if( !IsActive() ) SetActive();
+ }
+ }
+ }
+
+ LOG1("CRsDpofEngine::CopyPhoneImagesToMMC end with: %d", retVal);
+ return retVal;
+ }
+
+TRsPhoneImage* CRsDpofEngine::GetNextImageInfoForCopy()
+ {
+ TRsPhoneImage* phoneImage = NULL;
+ for( TInt i = 0; i < iPhoneImageArray.Count() && !phoneImage; i++ )
+ {
+ if( iPhoneImageArray[i].iCopied == EFalse )
+ {
+ phoneImage = &( iPhoneImageArray[i] );
+ }
+ }
+ return phoneImage;
+ }
+
+
+TInt CRsDpofEngine::GetPrintPercentage()
+ {
+ LOG("CRsDpofEngine::GetPrintPercentage begin");
+ // compute the percentage of the printing job has been completed
+ TInt copied( 0 );
+ TInt count = iPhoneImageArray.Count();
+
+ // assumes that writing to autoprint file takes 10% of the work
+ for( TInt i = 0; i < count; i++ )
+ {
+ if( iPhoneImageArray[i].iCopied )
+ copied++;
+ }
+
+ TInt percentage = (copied == count) ? KCopyPercentage : ((copied*100)/count);
+ LOG1("CRsDpofEngine::GetPrintPercentage end with: %d", percentage);
+ return percentage;
+ }
+
+void CRsDpofEngine::CreateDpofFileL()
+ {
+ if(iDpofPeriodic) iDpofPeriodic->Cancel();
+ delete iDpofPeriodic;
+ iDpofPeriodic = NULL;
+ iDpofPeriodic = CPeriodic::NewL(CActive::EPriorityStandard);
+ iDpofPeriodic->Start(KDpofDelay,KDpofDelay,TCallBack(CreateDpofFileCbL,this));
+ }
+
+void CRsDpofEngine::StartDiscovery(TRequestStatus& aStatus)
+ {
+ LOG("CRsDpofEngine::StartDiscovery begin");
+ aStatus = KRequestPending;
+ TRequestStatus *status = &aStatus;
+ if( iHasMmc )
+ {
+ LOG1("CRsDpofEngine::StartDiscovery end with: %d", EPrinterDiscovered);
+ User::RequestComplete(status,EPrinterDiscovered);
+ }
+ else
+ {
+ LOG1("CRsDpofEngine::StartDiscovery end with: %d", EDiscoveryDone);
+ User::RequestComplete(status,EDiscoveryDone);
+ }
+ }
+
+
+TBool CRsDpofEngine::WasCancelled() const
+ {
+ return iShouldCancel;
+ }
+
+TBool CRsDpofEngine::AutoPrintFileExists()
+ {
+ return ( RsUtils::FileExists( *iAutoPrintFile, iFs ) );
+ }
+
+TInt CRsDpofEngine::CreateDpofFileCbL(TAny *aObj)
+ {
+ CRsDpofEngine* obj = static_cast<CRsDpofEngine*>(aObj);
+ if( obj->iDpofPeriodic ) obj->iDpofPeriodic->Cancel();
+ obj->DoCreateDpofFileL();
+ return EFalse;
+ }
+
+void CRsDpofEngine::DoCreateDpofFileL()
+ {
+ LOG("CRsDpofEngine::DoCreateDpofFileL begin");
+
+ TParsePtrC parse( *iAutoPrintFile );
+
+ // Delete existing autoprint file
+ if( RsUtils::FileExists( *iAutoPrintFile, iFs ) )
+ {
+ LOG("CRsDpofEngine::DoCreateDpofFileL deleting existing autoprint file...");
+ User::LeaveIfError( iFs.Delete( *iAutoPrintFile ) );
+ }
+ else
+ {
+ LOG("CRsDpofEngine::DoCreateDpofFileL making sure that the autoprint file folder exists...");
+ // Make sure that the autoprint file folder exists
+ if( !RsUtils::PathExists( parse.DriveAndPath(), iFs ) )
+ User::LeaveIfError( iFs.MkDir( parse.DriveAndPath() ) );
+ }
+
+ // Ready the array of filenames for DPOF generation
+ LOG("CRsDpofEngine::DoCreateDpofFileL preparing file names...");
+ PrepareFilenamesL();
+
+ TInt retVal=KErrNone;
+ // Generate autoprint file
+ LOG1("CRsDpofEngine::DoCreateDpofFileL printing layout: %d", iImageLayout);
+ switch( iImageLayout )
+ {
+ case EOnePerPageSmall:
+ case EOnePerPageMedium:
+ case EOnePerPageLarge:
+ case EOnePerPage4x6:
+ retVal = WriteSpecificSizeFileL();
+ break;
+ case ETwoPerPage:
+ case EFourPerPage:
+ case ESixPerPage:
+ case ENinePerPage:
+ case ETwelvePerPage:
+ case ESixteenPerPage:
+ retVal = WriteMultipleFileL();
+ break;
+ default:
+ // Should never be here
+ User::Leave(KErrGeneral);
+ break;
+ }
+
+ LOG1("CRsDpofEngine::DoCreateDpofFileL end with: %d", retVal);
+ if (retVal == KErrNone)
+ {
+ iObs.HandleDpofEngineEventL(EJobCompleted, KErrNone);
+ }
+ else
+ {
+ iObs.HandleDpofEngineEventL(EJobError, retVal);
+ }
+ }
+
+TBool CRsDpofEngine::HasMmc() const
+ {
+ return iHasMmc;
+ }
+
+
+void CRsDpofEngine::SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies )
+ {
+ LOG("CRsDpofEngine::SetNumsOfCopiesL begin");
+ iNumsOfCopies.Reset();
+ TInt count = aNumsOfCopies.Count();
+ for( TInt i = 0; i < count; i++ )
+ {
+ iNumsOfCopies.AppendL( aNumsOfCopies[i] );
+ }
+ LOG("CRsDpofEngine::SetNumsOfCopiesL end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/main.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "cdpofprintingdevice.h"
+
+// Entry point to the application DLL
+
+// Map the interface UIDs to implementation factory functions
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( 0x10208A20, CDPOFPrintingDevice::NewL )
+ };
+
+// Exported proxy for instantiation method resolution
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/rsutils.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,94 @@
+/*
+* 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 RsUtils class definitions.
+*
+*/
+
+
+#include <bautils.h>
+
+#include "rsutils.h"
+
+// CONSTANTS
+namespace
+ {
+ _LIT( KBackslash, "\\" );
+ _LIT( KMatchPattern, "*" );
+ }
+
+
+TBool RsUtils::FileExists(const TDesC& aFileName, RFs& aFs)
+ {
+ return ( BaflUtils::FileExists( aFs, aFileName ) );
+ }
+
+TBool RsUtils::PathExists(const TDesC& aFilePath, RFs& aFs)
+ {
+ if( aFilePath.Right( 1 ) == KBackslash )
+ {
+ return ( BaflUtils::PathExists( aFs, aFilePath ) );
+ }
+ else
+ {
+ TFileName filePath = aFilePath;
+ filePath.Append( KBackslash );
+ return ( BaflUtils::PathExists( aFs, filePath ) );
+ }
+ }
+
+TInt RsUtils::DriveFreeSpace( TChar aDrive, RFs& aFs, TUint32& aSpace )
+ {
+ TInt mmcDriveNum;
+ TInt err = aFs.CharToDrive( aDrive, mmcDriveNum );
+ if( !err )
+ {
+ TVolumeInfo volInfo;
+ err = aFs.Volume( volInfo, mmcDriveNum );
+ aSpace = volInfo.iFree;
+ }
+ return err;
+ }
+
+
+TInt RsUtils::CumulativeFileSize( const TDesC& aFileName, RFs& aFs, TInt& aCumulativeSize )
+ {
+ TEntry fileEntry;
+ TInt err = aFs.Entry( aFileName, fileEntry );
+ if( !err )
+ {
+ aCumulativeSize += fileEntry.iSize;
+ }
+ return err;
+ }
+
+TBool RsUtils::FileInDir( const TDesC& aFileName, const TDesC& aDirName )
+ {
+ TFileName dir = aDirName;
+ if( dir.Right( 1 ) != KBackslash )
+ {
+ dir.Append( KBackslash );
+ }
+ dir.Append( KMatchPattern );
+ TBool ret = ( aFileName.Match( dir ) == KErrNotFound ) ? EFalse : ETrue;
+ return ret;
+ }
+
+TBool RsUtils::FileOnDrive( TChar aDrive, const TDesC& aFileName )
+ {
+ TParsePtrC parse( aFileName );
+ TBool res = ( parse.Drive().LocateF( aDrive ) == KErrNotFound ) ? EFalse : ETrue;
+ return res;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/bwins/pdphotolibu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/data/01007783.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* 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:
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+// Declares info for Pict Bridge
+RESOURCE REGISTRY_INFO theInfo
+ {
+ // UID for the DLL
+ dll_uid = 0x01007783;
+ // Declare array of interface info
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ // UID of interface that is implemented
+ interface_uid = 0x10208A1E;
+ implementations =
+ {
+ // Info for Pict Bridge
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = 0x10208A22;
+ version_no = 1;
+ display_name = "PictBridge";
+ default_data = "PictBridge";
+ opaque_data = "";
+ }
+ };
+ }
+ };
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/eabi/pdphotolibu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,9 @@
+EXPORTS
+ _Z24ImplementationGroupProxyRi @ 1 NONAME
+ _ZTI10CPBConnect @ 2 NONAME ; #<TI>#
+ _ZTI17CPBPrintingDevice @ 3 NONAME ; #<TI>#
+ _ZTI8CPBEvent @ 4 NONAME ; #<TI>#
+ _ZTV10CPBConnect @ 5 NONAME ; #<VT>#
+ _ZTV17CPBPrintingDevice @ 6 NONAME ; #<VT>#
+ _ZTV8CPBEvent @ 7 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_EXPORTS
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_MMPFILES
+pdphotolib.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/group/pdphotolib.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,69 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+deffile pdphotolib.def
+
+TARGET pdphotolib.dll
+TARGETTYPE PLUGIN
+CAPABILITY CAP_ECOM_PLUGIN
+
+UID 0x10009D8D 0x01007783
+
+APP_LAYER_SYSTEMINCLUDE
+SYSTEMINCLUDE /epoc32/include/libc
+
+USERINCLUDE . ../inc ../src
+USERINCLUDE ../../../ImagePrintLibrary/inc
+USERINCLUDE ../../../ImagePrintServer/inc
+USERINCLUDE ../../../inc
+USERINCLUDE ../../../../ImagePrintUI/imageprintapp/inc
+USERINCLUDE ../../../../clog/inc
+
+SOURCEPATH ../src
+SOURCE cpbprintingdevice.cpp
+SOURCE cpbconnect.cpp
+SOURCE cpbevent.cpp
+SOURCE main.cpp
+
+
+START RESOURCE ../data/01007783.rss
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+TARGET pdphotolib.rsc
+END
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY ecom.lib
+LIBRARY pictbridge.lib
+LIBRARY efsrv.lib
+LIBRARY estor.lib
+LIBRARY usbwatcher.lib
+
+MACRO MCLF_OPERATION
+
+// End of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/cpbconnect.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* 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: Contains the CPBConnect class definition.
+*
+*/
+
+
+#ifndef CPBCONNECT_H
+#define CPBCONNECT_H
+
+class MPBObserver;
+class CPBEvent;
+class CDpsEngine;
+
+
+class CPBConnect : public CActive
+ {
+public:
+ static CPBConnect* NewL( CDpsEngine& aEngine, MPBObserver& aObserver );
+ CPBConnect( CDpsEngine& aEngine, MPBObserver& aObserver );
+ ~CPBConnect();
+ void ConstructL();
+
+
+protected: // from CActive
+ void RunL();
+ void DoCancel();
+
+private:
+ CDpsEngine& iDpsEngine;
+ MPBObserver& iObserver;
+ CPBEvent* iEvent;
+ };
+
+#endif // CPBCONNECT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/cpbevent.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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: Contains the CPBConnect class definition.
+*
+*/
+
+
+#ifndef CPBEVENT_H
+#define CPBEVENT_H
+
+#include <pictbridge.h>
+#include <dpsoperation.h>
+
+class MPBObserver;
+
+
+class CPBEvent : public CActive
+ {
+public:
+ static CPBEvent* NewL( CDpsEngine& aEngine, MPBObserver& aObserver );
+ CPBEvent( CDpsEngine& aEngine, MPBObserver& aObserver );
+ ~CPBEvent();
+ void ConstructL();
+ void Listen();
+
+protected: // from CActive
+ void RunL();
+ void DoCancel();
+
+private:
+ CDpsEngine& iDpsEngine;
+ MPBObserver& iObserver;
+ TDpsEvents iEvent;
+ };
+
+#endif // CPBEVENT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/cpbprintingdevice.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,149 @@
+/*
+* 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: Contains the CPBPrintingDevice class definition.
+*
+*/
+
+
+#ifndef CPBPRINTINGDEVICE_H
+#define CPBPRINTINGDEVICE_H
+
+#include <fbs.h>
+#include <e32hashtab.h>
+
+#include "mprotprintingdevice.h"
+#include "mpbobserver.h"
+#include "printmessagecodes.h"
+#include "printcapabilitycodes.h"
+
+class CDpsEngine;
+class CPBConnect;
+class RWriteStream;
+
+enum TPBProtocolState
+ {
+ EPBUninitialized = 0,
+ EPBDiscovery,
+ EPBReady,
+ EPBJobReady,
+ EPBSubmittingJob,
+ EPBPrinting,
+ EPBCancelling,
+ };
+
+enum TPBJobSettingIndex
+ {
+ EPBSettingPaperSize = 0,
+ EPBSettingQuality = 1,
+ EPBSettingLayout = 2
+ };
+
+/**
+ * @brief CPBPrintingDevice implements MProtPrintingDevice. This makes the class the "published" class of the DLL it is in.
+ */
+class CPBPrintingDevice : public CActive, public MProtPrintingDevice, public MPBObserver
+ {
+public:
+ static MProtPrintingDevice* NewL();
+
+ // Default constructor and destructor.
+ CPBPrintingDevice();
+ ~CPBPrintingDevice();
+
+public: // From MProtPrintingDevice
+
+ // General.
+ void ConstructL(const TDesC& aDLLPath);
+ TVersion Version();
+ TUint SupportedProtocols();
+ // Discovery.
+ void StartDiscoveryL( MProtDiscoveryObserver& aObserver, TUint aProtocols = 0 );
+ TInt RemoveCachedDeviceL( TInt aDeviceID );
+ void CancelDiscovery( TBool aDoCallBack = ETrue );
+ // Print.
+ TInt CreatePrintJobL( TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver );
+ void SubmitPrintJobL();
+ TInt CancelPrintJob();
+ TInt ContinuePrintJobL();
+ TInt GetNumPrintPages();
+ TInt GetPrintJobStatus();
+ TInt GetPrinterStatus( TInt aDeviceID );
+ // Capabilities.
+ TInt GetDeviceCapabilityIDsL( TInt aDeviceID, RArray<TInt>& aCapabilityIDs );
+ TInt GetDeviceCapabilityL( TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability );
+ TInt GetJobSetting( TInt aCapabilityID, TInt& aValue );
+ TInt SetJobSettingL( TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability );
+ // Preview.
+ TInt GetNumPreviewPages();
+ TInt GetJobTemplateIconL( TInt aTemplateID, TInt& aFsBitmapHandle );
+ TInt CreatePreviewImage( TInt aPageNumber );
+
+ void RegisterIdleObserver( MProtIdleObserver *aObserver );
+
+ void SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr );
+
+public: // from MPBObserver
+ void ConnectionNotifyL( TInt aStatus );
+ void JobNotify( const TDpsGetJobStatus& aStatus );
+ void PrinterNotify( const TDpsGetPrinterStatus& aStatus );
+
+protected: // from CActive
+ void DoCancel();
+ void RunL();
+ TInt RunError( TInt aError );
+
+private:
+ void HandlePapersizesResponseL( TPrintCapability& aCapability );
+ void HandleQualitiesResponseL( TPrintCapability& aCapability );
+ void HandleLayoutsResponseL( TPrintCapability& aCapability );
+ TInt GetPapersizeJobSetting( TInt& aValue );
+ TInt GetQualityJobSetting( TInt& aValue );
+ TInt GetLayoutJobSetting( TInt& aValue );
+ TPrintMessageCodes DpsJobError( const TDpsJobEndReason& aReason );
+ void HandlePaperError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr );
+ void HandleInkError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr );
+ void HandleHwError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr );
+ void HandleFileError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr );
+ TBool HasCapability( TPrintCapability& aCapability, TPrintCapabilityOptions aOption );
+ void SaveConfigInfoL();
+ void ReadConfigInfoL();
+ void ExternalizeL( RWriteStream& aStream ) const;
+
+private: // data
+ CDpsEngine* iDpsEngine;
+ CPBConnect* iConnect;
+ CActiveSchedulerWait iWait;
+ TBool iPrinterConnected;
+ TPBProtocolState iState;
+ MProtIdleObserver* iIdleObserver;
+ RHashMap<TInt, TInt> iCapToDps;
+ TDpsGetCapability iCap;
+ TDpsStartJob iStart;
+ TDpsAbortJob iAbort;
+ TDpsContinueJob iContinue;
+ TDpsGetPrinterStatus iPrinterS;
+ TDpsGetJobStatus iJobS;
+ TDpsConfigPrintService iConfigS;
+ HBufC* iCongFileName;
+ TPrinter iPrinter;
+ TUint iCancelRetry;
+ TInt iPrintingStateComplete;
+ TUint iUserSelectedPaperSize;
+ TBool iDisconnectPrinter;
+ TBool iNewJobOK;
+ };
+
+#endif // CPBPRINTINGDEVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/mpbobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,35 @@
+/*
+* 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: Contains the MPBObserver interface.
+*
+*/
+
+
+#ifndef MPBOBSERVER_H
+#define MPBOBSERVER_H
+
+#include <pictbridge.h>
+#include <dpsoperation.h>
+
+class MPBObserver
+ {
+public:
+ virtual void ConnectionNotifyL( TInt aStatus ) = 0;
+ virtual void JobNotify( const TDpsGetJobStatus& aStatus ) = 0;
+ virtual void PrinterNotify( const TDpsGetPrinterStatus& aStatus ) = 0;
+ };
+
+#endif // MPBOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/mpersonalitynotify.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPERSONALITYNOTIFY_H
+#define MPERSONALITYNOTIFY_H
+
+#include <e32std.h>
+
+class MPersonalityNotify
+ {
+ public:
+ virtual void PersonalityQueryCompleteL() = 0;
+ virtual void SetPreviousPersonalityCompleteL() = 0;
+
+ };
+
+#endif // MPERSONALITYNOTIFY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/cpbconnect.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,110 @@
+/*
+* 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: Contains the CPBConnect class definition.
+*
+*/
+
+
+#include <e32std.h>
+#include <pictbridge.h>
+
+#include "cpbconnect.h"
+#include "mpbobserver.h"
+#include "cpbevent.h"
+#include "clog.h"
+
+CPBConnect* CPBConnect::NewL( CDpsEngine& aEngine, MPBObserver& aObserver )
+ {
+ LOG("CPBConnect::NewL begin");
+ CPBConnect* self = new (ELeave) CPBConnect( aEngine, aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ LOG("CPBConnect::NewL end");
+ return self;
+ }
+
+CPBConnect::CPBConnect(CDpsEngine& aEngine, MPBObserver& aObserver) :
+CActive( CActive::EPriorityStandard ), iDpsEngine(aEngine), iObserver( aObserver )
+ {
+ LOG("CPBConnect::CPBConnect begin");
+ CActiveScheduler::Add( this );
+ LOG("CPBConnect::CPBConnect end");
+ }
+
+CPBConnect::~CPBConnect()
+ {
+ LOG("CPBConnect::~CPBConnect begin");
+ Cancel();
+ delete iEvent;
+ LOG("CPBConnect::~CPBConnect end");
+ }
+
+void CPBConnect::ConstructL()
+ {
+ LOG("CPBConnect::ConstructL begin");
+ iEvent = CPBEvent::NewL( iDpsEngine, iObserver );
+ iDpsEngine.SetPrintMode( iStatus );
+ SetActive();
+ LOG("CPBConnect::ConstructL end");
+ }
+
+
+void CPBConnect::RunL()
+ {
+ LOG1("CPBConnect::RunL begin, status %d", iStatus.Int() );
+ switch ( iStatus.Int() )
+ {
+ case CDpsEngine::ENotConnected:
+ iObserver.ConnectionNotifyL( iStatus.Int() );
+ iDpsEngine.ConnectStateNotify( iStatus );
+ SetActive();
+ break;
+ case CDpsEngine::EPrinterConnected:
+ iObserver.ConnectionNotifyL( iStatus.Int() );
+ iDpsEngine.ConnectStateNotify( iStatus );
+ SetActive();
+ iEvent->Listen();
+ break;
+ case CDpsEngine::EPrinterDisconnected:
+ iEvent->Cancel();
+ iObserver.ConnectionNotifyL( iStatus.Int() );
+ iDpsEngine.SetPrintMode( iStatus );
+ SetActive();
+ break;
+ case CDpsEngine::EOtherConnected:
+ iObserver.ConnectionNotifyL( iStatus.Int() );
+ iDpsEngine.ConnectStateNotify( iStatus );
+ SetActive();
+ break;
+ case CDpsEngine::EWrongPrintModeConnected:
+ iObserver.ConnectionNotifyL( iStatus.Int() );
+ iDpsEngine.ConnectStateNotify( iStatus );
+ SetActive();
+ iEvent->Listen();
+ break;
+ default:
+ break;
+ }
+ LOG("CPBConnect::RunL end");
+ }
+
+void CPBConnect::DoCancel()
+ {
+ LOG("CPBConnect::DoCancel begin");
+ iDpsEngine.CancelPrintMode();
+ LOG("CPBConnect::DoCancel end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/cpbevent.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,91 @@
+/*
+* 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: Contains the CPBConnect class definition.
+*
+*/
+
+
+#include <e32std.h>
+#include <pictbridge.h>
+
+#include "cpbevent.h"
+#include "mpbobserver.h"
+#include "clog.h"
+
+CPBEvent* CPBEvent::NewL( CDpsEngine& aEngine, MPBObserver& aObserver )
+ {
+ LOG("CPBEvent::NewL begin");
+ CPBEvent* self = new (ELeave) CPBEvent(aEngine, aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ LOG("CPBEvent::NewL end");
+ return self;
+ }
+
+CPBEvent::CPBEvent( CDpsEngine& aEngine, MPBObserver& aObserver) :
+CActive( CActive::EPriorityStandard ), iDpsEngine( aEngine ), iObserver( aObserver )
+ {
+ LOG("CPBEvent::CPBEvent begin");
+ CActiveScheduler::Add(this);
+ LOG("CPBEvent::CPBEvent end");
+ }
+
+CPBEvent::~CPBEvent()
+ {
+ LOG("CPBEvent::~CPBEvent begin");
+ Cancel();
+ LOG("CPBEvent::~CPBEvent end");
+ }
+
+void CPBEvent::ConstructL()
+ {
+ LOG("CPBEvent::ConstructL begin");
+ LOG("CPBEvent::ConstructL end");
+ }
+
+void CPBEvent::Listen()
+ {
+ LOG("CPBEvent::Listen begin");
+ if ( !IsActive() )
+ {
+ iDpsEngine.DpsEventNotify( iEvent, iStatus );
+ SetActive();
+ }
+ LOG("CPBEvent::Listen end");
+ }
+
+void CPBEvent::RunL()
+ {
+ LOG2("CPBEvent::RunL begin, status %d event %d", iStatus.Int(), iEvent.iEvent );
+ if (iEvent.iEvent == EDpsEvtNotifyJobStatus)
+ {
+ iObserver.JobNotify( iEvent.iJobEvent );
+ }
+ else if (iEvent.iEvent == EDpsEvtNotifyDeviceStatus)
+ {
+ iObserver.PrinterNotify( iEvent.iPrinterEvent );
+ }
+ Listen();
+ LOG("CPBEvent::RunL end");
+ }
+
+void CPBEvent::DoCancel()
+ {
+ LOG("CPBEvent::DoCancel begin");
+ iDpsEngine.CancelDpsEventNotify();
+ LOG("CPBEvent::DoCancel end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/cpbprintingdevice.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,1377 @@
+/*
+* 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: Contains the CPBPrintingDevice class definition.
+*
+*/
+
+
+#include <e32std.h>
+#include <pictbridge.h>
+#include <s32file.h>
+#include <f32file.h>
+
+#include "cpbprintingdevice.h"
+#include "printcapabilitycodes.h"
+#include "printmessagecodes.h"
+#include "imageprint.h"
+#include "cpbconnect.h"
+#include "clog.h"
+
+// CONSTANTS
+namespace
+ {
+ const TInt KPBVersionMajor = 0;
+ const TInt KPBVersionMinor = 0;
+ const TInt KPBVersionBuild = 1;
+ }
+
+const TInt KConfigLength = 16;
+const TInt KMaxRetry = 10;
+_LIT( KConfigInfoFile, "config.DPS");
+
+
+MProtPrintingDevice* CPBPrintingDevice::NewL()
+ {
+ return new (ELeave) CPBPrintingDevice();
+ }
+
+
+CPBPrintingDevice::CPBPrintingDevice() :
+CActive( CActive::EPriorityStandard ), iState(EPBUninitialized), iDisconnectPrinter(EFalse)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CPBPrintingDevice::ConstructL(const TDesC& /*aDLLPath*/)
+ {
+ LOG("CPBPrintingDevice::ConstructL begin");
+
+ iDpsEngine = CDpsEngine::GetEngineL();
+ iConnect = CPBConnect::NewL( *iDpsEngine, *this );
+
+ iCongFileName = HBufC::NewL( iDpsEngine->DpsFolder().Length() + KConfigLength );
+ TInt k = iDpsEngine->DpsFolder().Length() + KConfigLength;
+ iCongFileName->Des().Copy( iDpsEngine->DpsFolder() );
+ iCongFileName->Des().Append( KConfigInfoFile );
+
+ iCancelRetry = 0;
+
+ // for Cert software to indicate that printing state and idle state
+ iPrintingStateComplete = 0;
+
+ iUserSelectedPaperSize = EDpsPaperSizeDefault;
+ iNewJobOK = ETrue;
+
+ LOG("CPBPrintingDevice::ConstructL end");
+ }
+
+
+CPBPrintingDevice::~CPBPrintingDevice()
+ {
+ LOG("CPBPrintingDevice::~CPBPrintingDevice begin");
+ Cancel();
+ delete iConnect;
+ delete iCongFileName;
+ if ( iDpsEngine )
+ {
+ iDpsEngine->Delete();
+ }
+ REComSession::DestroyedImplementation( iDtor_ID_Key );
+ LOG("CPBPrintingDevice::~CPBPrintingDevice end");
+ }
+
+
+TVersion CPBPrintingDevice::Version()
+ {
+ return TVersion(KPBVersionMajor, KPBVersionMinor, KPBVersionBuild);
+ }
+
+TUint CPBPrintingDevice::SupportedProtocols()
+ {
+ return KImagePrint_PrinterProtocol_PictBridge;
+ }
+
+void CPBPrintingDevice::StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocol)
+ {
+ LOG1("CPBPrintingDevice::StartDiscoveryL aProtocol: %d", aProtocol);
+ iDiscoveryObserver = &aObserver;
+
+ if ( IsActive() )
+ {
+ LOG1("CPBPrintingDevice::StartDiscoveryL invalid state %d, cannot start discovery", iState);
+ iDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, KErrInvalidSequence, 0 );
+ return;
+ }
+
+ if ( !( aProtocol & KImagePrint_PrinterProtocol_PictBridge ) )
+ {
+ LOG("CPBPrintingDevice::StartDiscoveryL NO protocol match, ending discovery...");
+ iDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, KErrNotSupported, 0 );
+ return;
+ }
+
+ if ( !iPrinterConnected )
+ {
+ LOG("CPBPrintingDevice::StartDiscoveryL no printer connected, ending discovery");
+ iDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, KErrNone, 0 );
+ return;
+ }
+
+
+ // clear capability map
+ iCapToDps.Close();
+
+ iConfigS.iReqParam.Reset();
+ iDpsEngine->GetDpsConfigL( iConfigS.iReqParam );
+ iDpsEngine->DoDpsRequestL( &iConfigS, iStatus );
+ iState = EPBDiscovery;
+ SetActive();
+ LOG("CPBPrintingDevice::StartDiscoveryL setting state to Discovery");
+
+ LOG("CPBPrintingDevice::StartDiscoveryL end");
+ }
+
+
+TInt CPBPrintingDevice::RemoveCachedDeviceL( TInt aDeviceID )
+ {
+ LOG1("CPBPrintingDevice::RemoveCachedDeviceL, aDeviceID: %d", aDeviceID);
+ return KErrInvalidData;
+ }
+
+void CPBPrintingDevice::CancelDiscovery( TBool aDoCallBack )
+ {
+ LOG2("CPBPrintingDevice::CancelDiscovery aDoCallBack %d, iState %d", aDoCallBack, iState );
+ if ( iState == EPBDiscovery )
+ {
+ Cancel();
+ if ( aDoCallBack && iDiscoveryObserver )
+ {
+ //We're not interested if the call back leaves
+ TRAP_IGNORE( iDiscoveryObserver->DiscoveryStatusL( EDiscoveryCancelling, KErrNone, 0 ) );
+ //We're not interested if the call back leaves
+ TRAP_IGNORE( iDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, KErrNone, 0 ) );
+ }
+ iState = EPBUninitialized;
+ }
+ LOG("CPBPrintingDevice::CancelDiscovery end");
+ }
+
+
+TInt CPBPrintingDevice::CreatePrintJobL(TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver)
+ {
+ LOG2("CPBPrintingDevice::CreatePrintJobL begin, deviceid %d imagecount %d", aDeviceID, aImages.Count());
+ iPrintEventObserver = &aObserver;
+
+ if ( aDeviceID != 0 )
+ {
+ LOG("CPBPrintingDevice::CreatePrintJobL invalid device");
+ return KErrArgument;
+ }
+
+ if ( iState != EPBReady && iState != EPBJobReady )
+ {
+ LOG1("CPBPrintingDevice::CreatePrintJobL invalid state %d", iState);
+ if(iDisconnectPrinter) // If printer is disconnected then return KErrDisconnected.
+ return KErrDisconnected;
+ else
+ return KErrInvalidSequence;
+ }
+
+ iStart.iReqParam.Reset();
+
+ // these must be appended in same order as PBJobSettingIndex
+
+ TDpsArgsInt arg;
+ arg.iElement = EDpsArgPaperSize;
+ arg.iContent = EDpsPaperSizeDefault;
+ iStart.iReqParam.iJobConfig.Append(arg);
+
+ arg.iElement = EDpsArgQuality;
+ arg.iContent = EDpsPrintQualityDefault;
+ iStart.iReqParam.iJobConfig.Append(arg);
+
+ arg.iElement = EDpsArgLayout;
+ arg.iContent = EDpsLayoutDefault;
+ iStart.iReqParam.iJobConfig.Append(arg);
+
+ for ( TInt i = 0; i < aImages.Count(); ++i )
+ {
+ TDpsPrintInfo info;
+ info.Reset();
+ const TDesC& image = *aImages[i];
+ LOG1("CPBPrintingDevice::CreatePrintJobL image %S", &image);
+ info.iFile.Copy( image );
+ iStart.iReqParam.iPrintInfo.Append( info );
+ }
+
+ LOG("CPBPrintingDevice::CreatePrintJobL setting state to JobReady");
+ iState = EPBJobReady;
+
+ LOG("CPBPrintingDevice::CreatePrintJobL end");
+ return KErrNone;
+ }
+
+void CPBPrintingDevice::SubmitPrintJobL()
+ {
+ LOG("CPBPrintingDevice::SubmitPrintJobL begin");
+
+ // Checking that job is ready and printer has send aStatus.iRepParam.iNewJobOk
+ // Check PrinterNotify function
+ if ( iState == EPBJobReady && iNewJobOK )
+ {
+ iDpsEngine->DoDpsRequestL( &iStart, iStatus );
+ iState = EPBSubmittingJob;
+ SetActive();
+ LOG("CPBPrintingDevice::SubmitPrintJobL setting state to SubmittingJob");
+ }
+ else
+ {
+ LOG1("CPBPrintingDevice::SubmitPrintJobL invalid state %d", iState);
+ if( iDisconnectPrinter )
+ {
+ User::Leave( KErrDisconnected );
+ }
+ else
+ {
+ // Job or printer not ready, inform user
+ if( iPrintEventObserver )
+ {
+ LOG("CPBPrintingDevice::SubmitPrintJobL sending EPbStatusErrorReasonHardwarePrinterBusy message to UI");
+ iPrintEventObserver->PrinterStatusEvent( EPbStatusErrorReasonHardwarePrinterBusy );
+ }
+ else
+ {
+ LOG1("CPBPrintingDevice::SubmitPrintJobL invalid state %d", iState);
+ User::Leave( KErrInvalidSequence );
+ }
+ }
+
+ }
+
+ LOG("CPBPrintingDevice::SubmitPrintJobL end");
+ }
+
+TInt CPBPrintingDevice::CancelPrintJob()
+ {
+ LOG("CPBPrintingDevice::CancelPrintJob begin");
+
+ if( iCancelRetry > KMaxRetry )
+ {
+ return KErrInUse;
+ }
+
+ if ( iState == EPBSubmittingJob || iState == EPBPrinting || iState == EPBCancelling )
+ {
+ Cancel();
+ iAbort.iReqParam.iAbortStyle = EDpsAbortStyleImmediately;
+ TRAPD( err, iDpsEngine->DoDpsRequestL( &iAbort, iStatus ) );
+ if ( err != KErrNone )
+ {
+ LOG1("CPBPrintingDevice::CancelPrintJob FATAL, DoDpsRequestL failed %d, setting state to Uninitialized", err);
+ iState = EPBUninitialized;
+ return KErrGeneral;
+ }
+ iState = EPBCancelling;
+ SetActive();
+ LOG("CPBPrintingDevice::CancelPrintJob setting state to Cancelling");
+ }
+ else if ( iState == EPBJobReady )
+ {
+ LOG("CPBPrintingDevice::CancelPrintJob state is JobReady so doing nothing");
+ return KErrNone;
+ }
+ else
+ {
+ LOG1("CPBPrintingDevice::CancelPrintJob invalid state %d", iState);
+ return KErrInvalidSequence;
+ }
+
+ LOG("CPBPrintingDevice::CancelPrintJob end");
+ return KErrNone;
+ }
+
+TInt CPBPrintingDevice::ContinuePrintJobL()
+ {
+ LOG1("CPBPrintingDevice::ContinuePrintJobL returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+ }
+
+TInt CPBPrintingDevice::GetNumPrintPages()
+ {
+ LOG("CPBPrintingDevice::GetNumPrintPages begin");
+
+ if ( iState != EPBJobReady && iState != EPBSubmittingJob && iState != EPBPrinting )
+ {
+ LOG1("CPBPrintingDevice::GetNumPrintPages invalid state %d, returning 0", iState);
+ return 0;
+ }
+
+ TInt imagesPerPage = 1;
+ TDpsArgsInt& config = iStart.iReqParam.iJobConfig[EPBSettingLayout];
+ switch ( config.iContent )
+ {
+ case EDpsLayout2Up:
+ imagesPerPage = 2;
+ break;
+ case EDpsLayout4Up:
+ imagesPerPage = 4;
+ break;
+ case EDpsLayout6Up:
+ imagesPerPage = 6;
+ break;
+ case EDpsLayout9Up:
+ imagesPerPage = 9;
+ break;
+ default:
+ break;
+ }
+
+ TInt numPrintPages = (iStart.iReqParam.iPrintInfo.Count() + imagesPerPage - 1) / imagesPerPage;
+ LOG1("CPBPrintingDevice::GetNumPrintPages end, result %d", numPrintPages);
+ return numPrintPages;
+ }
+
+TInt CPBPrintingDevice::GetPrintJobStatus()
+ {
+ LOG1("CPBPrintingDevice::GetPrintJobStatus returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+ }
+
+TInt CPBPrintingDevice::GetPrinterStatus(TInt /*aDeviceID*/)
+ {
+ LOG1("CPBPrintingDevice::GetPrinterStatus returns with: %d", KErrNotSupported);
+ return KErrNotSupported;
+ }
+
+TInt CPBPrintingDevice::GetDeviceCapabilityIDsL(TInt aDeviceID, RArray<TInt>& aCapabilityIDs)
+ {
+ LOG1("CPBPrintingDevice::GetDeviceCapabilityIDsL begins with aDeviceID: %d", aDeviceID);
+
+ if ( aDeviceID != 0 )
+ {
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL invalid device");
+ return KErrArgument;
+ }
+
+ if ( iState != EPBReady && iState != EPBJobReady )
+ {
+ LOG1("CPBPrintingDevice::GetDeviceCapabilityL invalid state %d", iState);
+ return KErrInvalidSequence;
+ }
+
+ aCapabilityIDs.Append( EPrintCapabLayout );
+ aCapabilityIDs.Append( EPrintCapabQuality );
+ aCapabilityIDs.Append( EPrintCapabPaperSize );
+
+ LOG("CPBPrintingDevice::GetDeviceCapabilityIDsL end");
+ return KErrNone;
+ }
+
+TInt CPBPrintingDevice::GetDeviceCapabilityL(TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability)
+ {
+ LOG2("CPBPrintingDevice::GetDeviceCapabilityL begins with aDeviceID %d, aCapabilityID %d", aDeviceID, aCapabilityID);
+
+ if ( aDeviceID != 0 )
+ {
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL invalid device");
+ return KErrArgument;
+ }
+
+ if ( iState != EPBReady && iState != EPBJobReady )
+ {
+ LOG1("CPBPrintingDevice::GetDeviceCapabilityL invalid state %d", iState);
+ return KErrInvalidSequence;
+ }
+
+ if ( aCapabilityID == EPrintCapabPaperSize )
+ {
+ // paper sizes
+ iCap.iRepParam.Reset();
+ iCap.iReqParam.iCap = EDpsArgPaperSizes;
+ iDpsEngine->DoDpsRequestL(&iCap, iStatus);
+ SetActive();
+ iWait.Start();
+ HandlePapersizesResponseL( aCapability );
+
+ if ( !aCapability.iEnumCount )
+ {
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL paper sizes not supported, set to default");
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSizeAuto;
+ iCapToDps.InsertL( EPrintCapabPaperSizeAuto, EDpsPaperSizeDefault );
+ }
+ }
+ else if ( aCapabilityID == EPrintCapabQuality )
+ {
+ // qualities
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL qualities");
+ iCap.iRepParam.Reset();
+ iCap.iReqParam.iCap = EDpsArgQualities;
+ iDpsEngine->DoDpsRequestL( &iCap, iStatus );
+ SetActive();
+ iWait.Start();
+ HandleQualitiesResponseL( aCapability );
+ }
+ else if ( aCapabilityID == EPrintCapabLayout )
+ {
+ // layouts
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL layouts");
+ iCap.iRepParam.Reset();
+ iCap.iReqParam.iCap = EDpsArgLayouts;
+ iCap.iReqParam.iAttribute = iUserSelectedPaperSize;
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL layouts dodpsrequest");
+ iDpsEngine->DoDpsRequestL(&iCap, iStatus);
+ SetActive();
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL layouts wait");
+ iWait.Start();
+ HandleLayoutsResponseL( aCapability );
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL invalid capabilityID");
+ return KErrArgument;
+ }
+
+ LOG1("CPBPrintingDevice::GetDeviceCapabilityL iCapToDps count %d", iCapToDps.Count());
+
+ LOG("CPBPrintingDevice::GetDeviceCapabilityL end");
+ return KErrNone;
+ }
+
+TInt CPBPrintingDevice::GetJobSetting(TInt aCapabilityID, TInt& aValue)
+ {
+ LOG1("CPBPrintingDevice::GetJobSetting begin, aCapabilityID %d", aCapabilityID);
+
+ TInt err = KErrNone;
+ if ( iState != EPBJobReady )
+ {
+ LOG1("CPBPrintingDevice::GetJobSetting invalid state %d", iState);
+ err = KErrInvalidSequence;
+ }
+ else if ( aCapabilityID == EPrintCapabPaperSize )
+ {
+ err = GetPapersizeJobSetting( aValue );
+ }
+ else if ( aCapabilityID == EPrintCapabQuality )
+ {
+ err = GetQualityJobSetting( aValue );
+ }
+ else if ( aCapabilityID == EPrintCapabLayout )
+ {
+ err = GetLayoutJobSetting( aValue );
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::GetJobSetting invalid capabilityID");
+ err = KErrArgument;
+ }
+
+ LOG2("CPBPrintingDevice::GetJobSetting end, return code %d value %d", err, aValue);
+ return err;
+ }
+
+TInt CPBPrintingDevice::SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
+ {
+ LOG2("CPBPrintingDevice::SetJobSettingL begin, aCapabilityID %d aValue %d", aCapabilityID, aValue);
+
+ aAffectedCapability = aCapabilityID;
+
+ RArray<TDpsArgsInt>& config = iStart.iReqParam.iJobConfig;
+ TInt err = KErrNone;
+ if ( iState != EPBJobReady )
+ {
+ LOG1("CPBPrintingDevice::SetJobSettingL invalid state %d", iState);
+ err = KErrInvalidSequence;
+ }
+ else if ( aCapabilityID == EPrintCapabPaperSize )
+ {
+ TInt* dpsValue = iCapToDps.Find( aValue );
+ if ( dpsValue )
+ {
+ config[EPBSettingPaperSize].iContent = *dpsValue;
+
+ // for CertSW: needs layouts for particular paper sizes
+ iUserSelectedPaperSize = config[EPBSettingPaperSize].iContent;
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::SetJobSettingL invalid value");
+ err = KErrInvalidData;
+ }
+ }
+ else if ( aCapabilityID == EPrintCapabQuality )
+ {
+ TInt* dpsValue = iCapToDps.Find( aValue );
+ if ( dpsValue )
+ {
+ config[EPBSettingQuality].iContent = *dpsValue;
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::SetJobSettingL invalid value");
+ err = KErrInvalidData;
+ }
+ }
+ else if ( aCapabilityID == EPrintCapabLayout )
+ {
+ TInt* dpsValue = iCapToDps.Find( aValue );
+ if ( dpsValue )
+ {
+ config[EPBSettingLayout].iContent = *dpsValue;
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::SetJobSettingL invalid value");
+ err = KErrInvalidData;
+ }
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::SetJobSettingL invalid capabilityID");
+ err = KErrArgument;
+ }
+
+ LOG1("CPBPrintingDevice::SetJobSettingL end, return code %d", err);
+ return err;
+ }
+
+
+TInt CPBPrintingDevice::GetNumPreviewPages()
+ {
+ LOG1("CPBPrintingDevice::GetNumPreviewPages ends with: %d", 1);
+ return 1;
+ }
+
+TInt CPBPrintingDevice::GetJobTemplateIconL( TInt /*aTemplateID*/, TInt& /*aFsBitmapHandle*/ )
+ {
+ return KErrNone;
+ }
+
+
+TInt CPBPrintingDevice::CreatePreviewImage(TInt /*aPageNumber*/)
+ {
+ return KErrNotSupported;
+ }
+
+void CPBPrintingDevice::RegisterIdleObserver( MProtIdleObserver *aObserver )
+ {
+ iIdleObserver = aObserver;
+ }
+
+void CPBPrintingDevice::DoCancel()
+ {
+ iDpsEngine->CancelDpsRequest();
+ if ( iWait.IsStarted() )
+ {
+ LOG("CPBPritingDevice::DoCancel() calling iWait.AsyncStop()");
+ iWait.AsyncStop();
+ }
+ }
+
+void CPBPrintingDevice::RunL()
+ {
+ LOG2("CPBPrintingDevice::RunL begin, status %d state %d", iStatus.Int(), iState);
+
+ if ( iWait.IsStarted() )
+ {
+ LOG("CPBPrintingDevice::RunL calling iWait.AsyncStop() and returning");
+ iWait.AsyncStop();
+ return;
+ }
+
+ if ( iStatus.Int() == KErrNone ) // everything ok
+ {
+ switch( iState )
+ {
+ case EPBDiscovery:
+ {
+ iPrinter.iPrinterID = 0;
+ iPrinter.iProtocol = KImagePrint_PrinterProtocol_PictBridge;
+ iPrinter.iProperties = 0;
+
+ if( iConfigS.iResult.iMajorCode == EDpsResultOk )
+ {
+ iPrinter.iVendor = TPrinter::EVendorNone;
+
+ HBufC* buf = HBufC::NewLC( iConfigS.iRepParam.iProductName.Length() );
+ TPtr p = buf->Des();
+ p.Copy( iConfigS.iRepParam.iProductName );
+ if ( p.Length() > 84 )
+ {
+ TPtrC p2 = p.Left( 84 );
+ iPrinter.iDisplayName = p2;
+ }
+ else
+ {
+ iPrinter.iDisplayName = p;
+ }
+
+ CleanupStack::PopAndDestroy( buf );
+ LOG1("CPBPrinterDevice::RunL config displayname %S", &iPrinter.iDisplayName);
+
+ // Config info have to be saved in file, because it can retrieved only once
+ // when cable is plugged in the device
+ SaveConfigInfoL();
+ }
+
+ if( iConfigS.iResult.iMajorCode == EDpsResultNotExecuted )
+ {
+ // Read info from file
+ ReadConfigInfoL();
+ }
+
+ iDiscoveryObserver->FoundDeviceL( iPrinter );
+ iDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, KErrNone, 0 );
+ iState = EPBReady;
+
+ // Close Dps request to avoid -14 error
+ iDpsEngine->CancelDpsRequest();
+ iDpsEngine->CancelDpsEventNotify();
+
+ LOG("CPBPrintingDevice::RunL setting state to Ready");
+ break;
+ }
+ case EPBSubmittingJob:
+ LOG2("CPBPrintingDevice::RunL submittingjob result major 0x%x minor 0x%x", iStart.iResult.iMajorCode, iStart.iResult.iMinorCode);
+ if ( iStart.iResult.iMajorCode == EDpsResultOk )
+ {
+ LOG("CPBPrintingDevice::RunL setting state to Printing");
+ iState = EPBPrinting;
+
+ // for Cert software remove dialog from UI
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ENoMessage );
+ }
+ else
+ {
+ LOG("CPBPrintingDevice::RunL error occurred, setting state to JobReady");
+ iState = EPBJobReady;
+ if ( iPrintEventObserver )
+ {
+ TPrintMessageCodes err = EPbStatusErrorReasonNoReason;
+ if ( iStart.iResult.iMajorCode == EDpsResultNotSupported &&
+ iStart.iResult.iMinorCode == EDpsResultMissingParam )
+ {
+ // image file is probably missing
+ err = EPbFileNotFound;
+ }
+ iPrintEventObserver->PrinterStatusEvent( err );
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ECancelling );
+ }
+ }
+ break;
+ case EPBCancelling:
+ LOG2("CPBPrintingDevice::RunL cancelling result major 0x%x minor 0x%x", iAbort.iResult.iMajorCode, iAbort.iResult.iMinorCode);
+
+ if( iAbort.iResult.iMajorCode == EDpsResultNotExecuted )
+ {
+ iCancelRetry++;
+ CancelPrintJob();
+ }
+
+ if( iAbort.iResult.iMajorCode == EDpsResultOk )
+ {
+ if ( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ECancelling );
+ }
+
+ LOG("CPBPrintingDevice::RunL setting state to JobReady");
+ iState = EPBJobReady;
+ iCancelRetry = 0;
+ }
+ break;
+ default:
+ LOG1("CPBPrintingDevice::RunL unrecognized state %d", iState);
+ break;
+ }
+ }
+ else // iStatus != KErrNone -> Handle error here
+ {
+ switch( iStatus.Int() )
+ {
+ case KErrTimedOut:
+ LOG( "CPBPrintingDevice::RunL KErrTimedOut" );
+ if ( iPrintEventObserver )
+ {
+ LOG("CPBPrintingDevice::Timeout, finish printing...");
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ECancelling );
+ }
+ break;
+ default:
+ // Handle error here.
+ LOG2( "CPBPrintingDevice::RunL error, status %d state %d", iStatus.Int(), iState );
+ break;
+ }
+ }
+
+ LOG("CPBPrintingDevice::RunL end");
+ }
+
+TInt CPBPrintingDevice::RunError( TInt aError )
+ {
+ LOG1("CPBPrintingDevice::RunError code %d", aError);
+ if ( iWait.IsStarted() )
+ {
+ LOG("CPBPrintingDevice::RunError calling iWait.AsyncStop()");
+ iWait.AsyncStop();
+ }
+ return KErrNone;
+ }
+
+
+void CPBPrintingDevice::SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr )
+ {
+ LOG("CPBPrintingDevice::SetNumsOfCopiesL begin");
+
+ if ( iState != EPBJobReady )
+ {
+ LOG1("CPBPrintingDevice::SetNumsOfCopiesL invalid state %d", iState);
+ aErr = KErrInvalidSequence;
+ }
+ else if ( aNumsOfCopies.Count() != iStart.iReqParam.iPrintInfo.Count() )
+ {
+ LOG2("CPBPrintingDevice::SetNumsOfCopiesL counts don't match, %d %d", aNumsOfCopies.Count(), iStart.iReqParam.iPrintInfo.Count());
+ aErr = KErrInvalidData;
+ }
+ else
+ {
+ for ( TInt i = 0; i < aNumsOfCopies.Count(); ++i )
+ {
+ iStart.iReqParam.iPrintInfo[i].iCopies = aNumsOfCopies[i];
+ }
+ aErr = KErrNone;
+ }
+
+ LOG("CPBPrintingDevice::SetNumsOfCopiesL end");
+ }
+
+
+void CPBPrintingDevice::ConnectionNotifyL( TInt aStatus )
+ {
+ LOG2("CPBPrintingDevice::ConnectionNotifyL begin, status %d iState %d", aStatus, iState);
+ switch ( aStatus )
+ {
+ case CDpsEngine::ENotConnected:
+ LOG("CPBPrintingDevice::ConnectionNotify not connected");
+ break;
+ case CDpsEngine::EPrinterConnected:
+ LOG("CPBPrintingDevice::ConnectionNotifyL printer connected");
+ iPrinterConnected = ETrue;
+ iDisconnectPrinter = EFalse;
+ if ( iIdleObserver )
+ {
+ LOG("CPBPrintingDevice::ConnectionNotifyL informing idle observer about connect");
+ TEvent event = { KImagePrint_PrinterProtocol_PictBridge, ENotSpecified, EConnect };
+ iIdleObserver->StatusEvent( event, KErrConnected, ENoMessage );
+ }
+ break;
+ case CDpsEngine::EPrinterDisconnected:
+ iPrinterConnected = EFalse;
+ iDisconnectPrinter = ETrue;
+ if ( iState != EPBUninitialized )
+ {
+ Cancel();
+ if ( iState == EPBDiscovery )
+ {
+ //We're not interested if the call back leaves
+ TRAP_IGNORE( iDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, KErrNone, 0 ) );
+ }
+ LOG("CPBPrintingDevice::ConnectionNotifyL printer disconnected, setting state to Uninitialized");
+ iState = EPBUninitialized;
+ }
+ if ( iIdleObserver )
+ {
+ LOG("CPBPrintingDevice::ConnectionNotifyL informing idle observer about disconnect");
+ TEvent event = { KImagePrint_PrinterProtocol_PictBridge, ENotSpecified, EDisconnect };
+ iIdleObserver->StatusEvent( event, KErrDisconnected, ENoMessage );
+ }
+ break;
+ case CDpsEngine::EOtherConnected:
+ LOG("CPBPrintingDevice::ConnectionNotify other connected");
+ break;
+ case CDpsEngine::EWrongPrintModeConnected:
+ LOG("CPBPrintingDevice::ConnectionNotify Other personality");
+ iPrinterConnected = ETrue;
+ iDisconnectPrinter = EFalse;
+ if ( iIdleObserver )
+ {
+ LOG("CPBPrintingDevice::ConnectionNotifyL informing idle observer about connect");
+ TEvent event = { KImagePrint_PrinterProtocol_PictBridge, ENotSpecified, EConnect };
+ iIdleObserver->StatusEvent( event, KErrConnected, ENoMessage );
+ }
+ break;
+ default:
+ LOG1("CPBPrintingDevice::ConnectionNotifyL unrecognized status %d", aStatus);
+ break;
+ }
+ LOG("CPBPrintingDevice::ConnectionNotifyL end");
+ }
+
+void CPBPrintingDevice::JobNotify( const TDpsGetJobStatus& aStatus )
+ {
+ LOG1("CPBPrintingDevice::JobNotify begin, state %d", iState);
+ LOG2("CPBPrintingDevice::JobNotify progress %d, prtPID %d", aStatus.iRepParam.iProgress, aStatus.iRepParam.iPrtPID);
+ LOG1("CPBPrintingDevice::JobNotify copyID %d", aStatus.iRepParam.iCopyID);
+ LOG2("CPBPrintingDevice::JobNotify filepath %S, images printed %d", &aStatus.iRepParam.iFilePath, aStatus.iRepParam.iImagesPrinted);
+
+ if ( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobProgressEvent( EActive, aStatus.iRepParam.iProgress, ENoMessage );
+ }
+
+ LOG("CPBPrintingDevice::JobNotify end");
+ }
+
+void CPBPrintingDevice::PrinterNotify( const TDpsGetPrinterStatus& aStatus )
+ {
+ LOG1("CPBPrintingDevice::PrinterNotify begin, state %d", iState );
+ LOG2("CPBPrintingDevice::PrinterNotify service status 0x%x, job status 0x%x", aStatus.iRepParam.iPrintStatus, aStatus.iRepParam.iJobStatus);
+ LOG2("CPBPrintingDevice::PrinterNotify error status 0x%x, job end reason 0x%x", aStatus.iRepParam.iErrorStatus, aStatus.iRepParam.iJobEndReason.iMajor);
+ LOG1("CPBPrintingDevice::PrinterNotify aStatus.iRepParam.iNewJobOk 0x%x,", aStatus.iRepParam.iNewJobOk);
+
+ // New job checking that job is ok and device status is ok.
+ iNewJobOK = aStatus.iRepParam.iNewJobOk;
+
+ TPBProtocolState oldState = iState;
+ if ( iState == EPBPrinting )
+ {
+ // for SWCert software to indicate that printing state has executed
+ iPrintingStateComplete = 1;
+
+ if ( aStatus.iRepParam.iJobStatus == EDpsJobStatusEndedOk )
+ {
+ LOG("CPBPrintingDevice::PrinterNotify job finished successfully, setting state to JobReady");
+ if ( iPrintEventObserver )
+ {
+ LOG("CPBPrintingDevice::PrinterNotify job finished iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ENoMessage );");
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ENoMessage );
+ }
+ iState = EPBJobReady;
+ }
+ else if ( aStatus.iRepParam.iJobStatus != EDpsJobStatusNotEnded )
+ {
+ LOG("CPBPrintingDevice::PrinterNotify job aborted, setting state to JobReady");
+ if ( iPrintEventObserver )
+ {
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ECancelling );
+ }
+ iState = EPBJobReady;
+ }
+ }
+
+ if ( iState == EPBJobReady )
+ {
+ // for Cert software: CertSW doesn't give any indication about aStatus.iRepParam.iJobStatus
+ // it only indicate printer state. We have to send message to UI to remove generig progress bar.
+ if ( aStatus.iRepParam.iPrintStatus == EDpsPrintServiceStatusIdle && iPrintingStateComplete )
+ {
+ // for Cert software to indicate that idle state has executed
+ iPrintingStateComplete = 0;
+
+ if ( iPrintEventObserver )
+ {
+ LOG("CPBPrintingDevice::PrinterNotify job finished iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ENoMessage );");
+
+ // for Cert software remove dialog from UI
+ iPrintEventObserver->PrintJobProgressEvent( EDone, 100, ENoMessage );
+ }
+ }
+ }
+
+ if ( !iPrintEventObserver )
+ {
+ LOG("CPBPrintingDevice::PrinterNotify no event observer, returning");
+ return;
+ }
+
+ TPrintMessageCodes err = DpsJobError( aStatus.iRepParam.iJobEndReason );
+ if ( err == ENoMessage && aStatus.iRepParam.iErrorStatus == EDpsErrorStatusFatal )
+ {
+ // Show fatal error
+ err = EPbStatusErrorReasonHardwareFatal;
+ }
+
+ if ( err == ENoMessage && aStatus.iRepParam.iErrorStatus == EDpsErrorStatusWarning )
+ {
+ // Show warning
+ err = EPbStatusErrorReasonWarning;
+ }
+
+ if ( err != ENoMessage )
+ {
+ if ( oldState == EPBPrinting )
+ {
+ LOG1("CPBPrintingDevice::PrinterNotify calling PrintJobErrorEvent with code %d", err);
+ iPrintEventObserver->PrintJobErrorEvent( err );
+ }
+ else
+ {
+ LOG1("CPBPrintingDevice::PrinterNotify calling PrinterStatusEvent with code %d", err);
+ iPrintEventObserver->PrinterStatusEvent( err );
+ }
+ }
+
+ LOG("CPBPrintingDevice::PrinterNotify end");
+ }
+
+void CPBPrintingDevice::HandlePapersizesResponseL( TPrintCapability& aCapability )
+ {
+ LOG2("CPBPrintingDevice::HandlePapersizesResponseL result major 0x%x minor 0x%x", iCap.iResult.iMajorCode, iCap.iResult.iMinorCode);
+ LOG2("CPBPrintingDevice::HandlePapersizesResponseL cap 0x%x count %d", iCap.iRepParam.iCap, iCap.iRepParam.iContent.Count());
+
+ aCapability.iCapabilityID = EPrintCapabPaperSize;
+ aCapability.iType = TPrintCapability::Int;
+ aCapability.iDefaultValue = EPrintCapabPaperSizeAuto;
+ aCapability.iEnumCount = 0;
+
+ if ( iCap.iResult.iMajorCode == EDpsResultOk )
+ {
+ for ( TInt i = 0; i < iCap.iRepParam.iContent.Count() && aCapability.iEnumCount < KMaxEnumAmount; ++i )
+ {
+ LOG1("CPBPrintingDevice::HandlePapersizesResponseL content 0x%x", iCap.iRepParam.iContent[i]);
+ switch ( iCap.iRepParam.iContent[i] )
+ {
+ case EDpsPaperSizeDefault:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSizeAuto;
+ iCapToDps.InsertL( EPrintCapabPaperSizeAuto, EDpsPaperSizeDefault );
+ break;
+ case EDpsPaperSizeLetter:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSizeLetter;
+ iCapToDps.InsertL( EPrintCapabPaperSizeLetter, EDpsPaperSizeLetter );
+ break;
+ case EDpsPaperSizeA4:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSizeA4;
+ iCapToDps.InsertL( EPrintCapabPaperSizeA4, EDpsPaperSizeA4 );
+ break;
+ case EDpsPaperSizeA6:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSizeA6;
+ iCapToDps.InsertL( EPrintCapabPaperSizeA6, EDpsPaperSizeA6 );
+ break;
+ case EDpsPaperSize4x6:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSize4x6;
+ iCapToDps.InsertL( EPrintCapabPaperSize4x6, EDpsPaperSize4x6 );
+ break;
+ case EDpsPaperSize2L:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabPaperSize5x7;
+ iCapToDps.InsertL( EPrintCapabPaperSize5x7, EDpsPaperSize2L );
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+
+void CPBPrintingDevice::HandleQualitiesResponseL( TPrintCapability& aCapability )
+ {
+ LOG2("CPBPrintingDevice::HandleQualitiesResponseL result major 0x%x minor 0x%x", iCap.iResult.iMajorCode, iCap.iResult.iMinorCode);
+ LOG2("CPBPrintingDevice::HandleQualitiesResponseL cap 0x%x count %d", iCap.iRepParam.iCap, iCap.iRepParam.iContent.Count());
+
+ aCapability.iCapabilityID = EPrintCapabQuality;
+ aCapability.iType = TPrintCapability::Int;
+ aCapability.iDefaultValue = EPrintCapabQualityDefault;
+ aCapability.iEnumCount = 0;
+
+ if ( iCap.iResult.iMajorCode == EDpsResultOk )
+ {
+ for ( TInt i = 0; i < iCap.iRepParam.iContent.Count() && aCapability.iEnumCount < KMaxEnumAmount; ++i )
+ {
+ LOG1("CPBPrintingDevice::HandleQualitiesResponseL content 0x%x", iCap.iRepParam.iContent[i]);
+ switch ( iCap.iRepParam.iContent[i] )
+ {
+ case EDpsPrintQualityDefault:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabQualityDefault;
+ iCapToDps.InsertL( EPrintCapabQualityDefault, EDpsPrintQualityDefault );
+ break;
+ case EDpsPrintQualityNormal:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabQualityNormal;
+ iCapToDps.InsertL( EPrintCapabQualityNormal, EDpsPrintQualityNormal );
+ break;
+ case EDpsPrintQualityDraft:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabQualityDraft;
+ iCapToDps.InsertL( EPrintCapabQualityDraft, EDpsPrintQualityDraft );
+ break;
+ case EDpsPrintQualityFine:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabQualityFine;
+ iCapToDps.InsertL( EPrintCapabQualityFine, EDpsPrintQualityFine );
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ if ( !aCapability.iEnumCount )
+ {
+ LOG("CPBPrintingDevice::HandleQualitiesResponseL not supported, set to default");
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabQualityDefault;
+ iCapToDps.InsertL( EPrintCapabQualityDefault, EDpsPrintQualityDefault );
+ }
+ }
+
+void CPBPrintingDevice::HandleLayoutsResponseL( TPrintCapability& aCapability )
+ {
+ LOG2("CPBPrintingDevice::HandleLayoutsResponseL result major 0x%x minor 0x%x", iCap.iResult.iMajorCode, iCap.iResult.iMinorCode);
+ LOG2("CPBPrintingDevice::HandleLayoutsResponseL cap 0x%x count %d", iCap.iRepParam.iCap, iCap.iRepParam.iContent.Count());
+
+ aCapability.iCapabilityID = EPrintCapabLayout;
+ aCapability.iType = TPrintCapability::Int;
+ aCapability.iDefaultValue = EPrintCapabLayout1Up;
+ aCapability.iEnumCount = 0;
+
+ if ( iCap.iResult.iMajorCode == EDpsResultOk )
+ {
+ for ( TInt i = 0; i < iCap.iRepParam.iContent.Count() && aCapability.iEnumCount < KMaxEnumAmount; ++i )
+ {
+ LOG1("CPBPrintingDevice::HandleLayoutsResponseL content 0x%x", iCap.iRepParam.iContent[i]);
+ switch ( iCap.iRepParam.iContent[i] )
+ {
+ case EDpsLayout1Up:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout1Up;
+ iCapToDps.InsertL( EPrintCapabLayout1Up, EDpsLayout1Up );
+ break;
+ case EDpsLayout2Up:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout2Up;
+ iCapToDps.InsertL( EPrintCapabLayout2Up, EDpsLayout2Up );
+ break;
+ case EDpsLayout4Up:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout4Up;
+ iCapToDps.InsertL( EPrintCapabLayout4Up, EDpsLayout4Up );
+ break;
+ case EDpsLayout6Up:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout6Up;
+ iCapToDps.InsertL( EPrintCapabLayout6Up, EDpsLayout6Up );
+ break;
+ case EDpsLayout9Up:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout9Up;
+ iCapToDps.InsertL( EPrintCapabLayout9Up, EDpsLayout9Up );
+ break;
+ // do not support this EDpsLayoutBorderless, set default value
+ case EDpsLayoutBorderless:
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout1UpBorderless;
+ iCapToDps.InsertL( EPrintCapabLayout1UpBorderless, EDpsLayoutDefault );
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ if ( !aCapability.iEnumCount )
+ {
+ LOG("CPBPrintingDevice::HandleLayoutsResponseL not supported, set to default");
+ aCapability.iEnumCodes[aCapability.iEnumCount++] = EPrintCapabLayout1Up;
+ iCapToDps.InsertL( EPrintCapabLayout1Up, EDpsLayoutDefault );
+ }
+ }
+
+TInt CPBPrintingDevice::GetPapersizeJobSetting( TInt& aValue )
+ {
+ LOG("CPBPrintingDevice::GetPapersizeJobSetting begin");
+
+ TDpsArgsInt& paper = iStart.iReqParam.iJobConfig[EPBSettingPaperSize];
+ switch ( paper.iContent )
+ {
+ case EDpsPaperSizeDefault:
+ aValue = EPrintCapabPaperSizeAuto;
+ return KErrNone;
+ case EDpsPaperSizeLetter:
+ aValue = EPrintCapabPaperSizeLetter;
+ return KErrNone;
+ case EDpsPaperSizeA4:
+ aValue = EPrintCapabPaperSizeA4;
+ return KErrNone;
+ case EDpsPaperSizeA6:
+ aValue = EPrintCapabPaperSizeA6;
+ return KErrNone;
+ case EDpsPaperSize4x6:
+ aValue = EPrintCapabPaperSize4x6;
+ return KErrNone;
+ case EDpsPaperSize2L:
+ aValue = EPrintCapabPaperSize5x7;
+ return KErrNone;
+ default:
+ LOG1("CPBPrintingDevice::GetPapersizeJobSetting unknown %x", paper.iContent);
+ break;
+ }
+
+ LOG("CPBPrintingDevice::GetPapersizeJobSetting end");
+ return KErrInvalidData;
+ }
+
+TInt CPBPrintingDevice::GetQualityJobSetting( TInt& aValue )
+ {
+ LOG("CPBPrintingDevice::GetQualityJobSetting begin");
+
+ TDpsArgsInt& config = iStart.iReqParam.iJobConfig[EPBSettingQuality];
+ switch ( config.iContent )
+ {
+ case EDpsPrintQualityDefault:
+ aValue = EPrintCapabQualityDefault;
+ return KErrNone;
+ case EDpsPrintQualityNormal:
+ aValue = EPrintCapabQualityNormal;
+ return KErrNone;
+ case EDpsPrintQualityDraft:
+ aValue = EPrintCapabQualityDraft;
+ return KErrNone;
+ case EDpsPrintQualityFine:
+ aValue = EPrintCapabQualityFine;
+ return KErrNone;
+ default:
+ LOG1("CPBPrintingDevice::GetQualityJobSetting unknown %x", config.iContent);
+ break;
+ }
+
+ LOG("CPBPrintingDevice::GetQualityJobSetting end");
+ return KErrInvalidData;
+ }
+
+TInt CPBPrintingDevice::GetLayoutJobSetting( TInt& aValue )
+ {
+ LOG("CPBPrintingDevice::GetLayoutJobSetting begin");
+
+ TDpsArgsInt& config = iStart.iReqParam.iJobConfig[EPBSettingLayout];
+ switch ( config.iContent )
+ {
+ case EDpsLayoutDefault:
+ // Not supported default value is EPrintCapabLayout1UpBorderless
+ // because other protocols use it too
+ // EPrintCapabLayout1UpBorderless is mapped with EDpsLayoutDefault
+ aValue = EPrintCapabLayout1UpBorderless;
+ case EDpsLayout1Up:
+ aValue = EPrintCapabLayout1Up;
+ return KErrNone;
+ case EDpsLayout2Up:
+ aValue = EPrintCapabLayout2Up;
+ return KErrNone;
+ case EDpsLayout4Up:
+ aValue = EPrintCapabLayout4Up;
+ return KErrNone;
+ case EDpsLayout6Up:
+ aValue = EPrintCapabLayout6Up;
+ return KErrNone;
+ case EDpsLayout9Up:
+ aValue = EPrintCapabLayout9Up;
+ return KErrNone;
+ case EDpsLayoutBorderless:
+ aValue = EPrintCapabLayout1UpBorderless;
+ return KErrNone;
+ default:
+ LOG1("CPBPrintingDevice::GetLayoutJobSetting unknown %x", config.iContent);
+ break;
+ }
+
+ LOG("CPBPrintingDevice::GetLayoutJobSetting end");
+ return KErrInvalidData;
+ }
+
+TPrintMessageCodes CPBPrintingDevice::DpsJobError( const TDpsJobEndReason& aReason )
+ {
+ TPrintMessageCodes err = ENoMessage;
+ switch ( aReason.iMajor )
+ {
+ case EDpsJobErrorPaper:
+ LOG1("CPBPrintingDevice::DpsJobError paper error 0x%x", aReason.iPaperMinor);
+ HandlePaperError( aReason, err );
+ break;
+ case EDpsJobErrorInk:
+ LOG1("CPBPrintingDevice::DpsJobError ink error 0x%x", aReason.iInkMinor);
+ HandleInkError( aReason, err );
+ break;
+ case EDpsJobErrorHardware:
+ LOG1("CPBPrintingDevice::DpsJobError hardware error 0x%x", aReason.iHardMinor);
+ HandleHwError( aReason, err );
+ break;
+ case EDpsJobErrorFile:
+ LOG1("CPBPrintingDevice::DpsJobError file error 0x%x", aReason.iFileMinor);
+ HandleFileError( aReason, err );
+ break;
+ default:
+ break;
+ }
+ return err;
+ }
+void CPBPrintingDevice::HandlePaperError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr )
+ {
+ switch ( aReason.iPaperMinor )
+ {
+ case EDpsPaperEmpty:
+ aErr = EPbStatusErrorReasonPaperEmpty;
+ break;
+ case EDpsPaperLoad:
+ aErr = EPbStatusErrorReasonPaperLoad;
+ break;
+ case EDpsPaperEject:
+ aErr = EPbStatusErrorReasonPaperEject;
+ break;
+ case EDpsPaperMedia:
+ aErr = EPbStatusErrorReasonPaperMedia;
+ break;
+ case EDpsPaperJam:
+ aErr = EPbStatusErrorReasonPaperJam;
+ break;
+ case EDpsPaperNearlyEmpty:
+ aErr = EPbStatusErrorReasonPaperNearlyEmpty;
+ break;
+ case EDpsPaperTypeSizeNoMatch:
+ aErr = EPbStatusErrorReasonPaperCombination;
+ break;
+ default:
+ aErr = EPbStatusErrorReasonPaper;
+ break;
+ }
+ }
+
+void CPBPrintingDevice::HandleInkError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr )
+ {
+ switch ( aReason.iInkMinor )
+ {
+ case EDpsInkEmpty:
+ aErr = EPbStatusErrorReasonInkEmpty;
+ break;
+ case EDpsInkLow:
+ aErr = EPbStatusErrorReasonInkLow;
+ break;
+ case EDpsInkWaste:
+ aErr = EPbStatusErrorReasonInkWaste;
+ break;
+ default:
+ aErr = EPbStatusErrorReasonInk;
+ break;
+ }
+ }
+
+void CPBPrintingDevice::HandleHwError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr )
+ {
+ switch ( aReason.iHardMinor )
+ {
+ case EDpsHardFatal:
+ aErr = EPbStatusErrorReasonHardwareFatal;
+ break;
+ case EDpsHardServiceCall:
+ aErr = EPbStatusErrorReasonHardwareServiceCall;
+ break;
+ case EDpsHardNotAvailable:
+ aErr = EPbStatusErrorReasonHardwarePrinterUnavailable;
+ break;
+ case EDpsHardBusy:
+ aErr = EPbStatusErrorReasonHardwarePrinterBusy;
+ break;
+ case EDpsHardLever:
+ aErr = EPbStatusErrorReasonHardwareLever;
+ break;
+ case EDpsHardCoverOpen:
+ aErr = EPbStatusErrorReasonHardwareCoverOpen;
+ break;
+ case EDpsHardNoMarkingHead:
+ aErr = EPbStatusErrorReasonHardwareNoMarkingAgent;
+ break;
+ case EDpsHardInkCoverOpen:
+ aErr = EPbStatusErrorReasonHardwareCoverOpen;
+ break;
+ case EDpsHardNoInkCartridge:
+ aErr = EPbStatusErrorReasonHardwareNoInkCartridge;
+ break;
+ default:
+ aErr = EPbStatusErrorReasonHardware;
+ break;
+ }
+ }
+
+void CPBPrintingDevice::HandleFileError ( const TDpsJobEndReason& aReason, TPrintMessageCodes& aErr )
+ {
+ switch ( aReason.iFileMinor )
+ {
+ case EDpsFilePrintInfo:
+ aErr = EPbStatusErrorReasonFilePrintInfo;
+ break;
+ case EDpsFileDecode:
+ aErr = EPbStatusErrorReasonFileFileDecode;
+ break;
+ default:
+ aErr = EPbStatusErrorReasonFile;
+ break;
+ }
+ }
+
+TBool CPBPrintingDevice::HasCapability( TPrintCapability& aCapability, TPrintCapabilityOptions aOption )
+ {
+ for ( TInt i = 0; i < aCapability.iEnumCount; ++i )
+ {
+ if ( aCapability.iEnumCodes[i] == aOption )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+void CPBPrintingDevice::SaveConfigInfoL()
+ {
+ LOG("CPBPrintingDevice::SaveConfigInfoL begin");
+
+ RFs rFs;
+ RFile file;
+
+ User::LeaveIfError( rFs.Connect() );
+ CleanupClosePushL( rFs );
+
+ User::LeaveIfError( file.Replace( rFs, iCongFileName->Des() ,EFileWrite ) ); // create the file for writing
+
+ RFileWriteStream stream( file );
+ CleanupClosePushL( stream );
+
+ ExternalizeL( stream );
+
+ CleanupStack::PopAndDestroy( &stream );
+ CleanupStack::PopAndDestroy( &rFs );
+
+ LOG("CPBPrintingDevice::SaveConfigInfoL end");
+ }
+
+void CPBPrintingDevice::ExternalizeL( RWriteStream& aStream ) const
+ {
+ LOG("CPBPrintingDevice::ExternalizeL begin");
+
+ aStream << iPrinter.iDisplayName;
+ aStream.WriteUint32L( iPrinter.iVendor );
+ aStream.CommitL();
+
+ LOG("CPBPrintingDevice::ExternalizeL end");
+ }
+
+void CPBPrintingDevice::ReadConfigInfoL()
+ {
+ LOG("CPBPrintingDevice::ReadConfigInfoL begin");
+
+ RFs rFs;
+ RFile file;
+
+ User::LeaveIfError( rFs.Connect() );
+ CleanupClosePushL( rFs );
+
+ User::LeaveIfError( file.Open( rFs, iCongFileName->Des() ,EFileRead ) );
+
+ RFileReadStream readStream( file );
+ CleanupClosePushL( readStream );
+
+ readStream >> iPrinter.iDisplayName;
+ iPrinter.iVendor = readStream.ReadUint32L();
+
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( &rFs );
+
+ LOG("CPBPrintingDevice::ReadConfigInfoL end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/main.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "cpbprintingdevice.h"
+
+// Entry point to the application DLL
+
+// Map the interface UIDs to implementation factory functions
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( 0x10208A22, CPBPrintingDevice::NewL )
+ };
+
+// Exported proxy for instantiation method resolution
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/rom/deviceprotocols.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,46 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef DEVICEPROTOCOLS_IBY
+#define DEVICEPROTOCOLS_IBY
+
+#include <imageprintdef.iby>
+
+#ifdef FF_IMAGEPRINT_BT_PROTOCOL
+IP_PLUGIN(btprotocol.dll,btprotocol.rsc)
+data=DATAZ_\resource\imageprintdata\protocols\btprotocol.rsc resource\imageprintdata\protocols\btprotocol.rsc
+DATA=DATAZ_\resource\imageprintdata\protocols\btxmltemplate.txt \resource\imageprintdata\protocols\btxmltemplate.txt
+#endif
+
+#ifdef FF_IMAGEPRINT_MEMORYCARD_PROTOCOL
+IP_PLUGIN(dpofprotdll.dll,dpofprotdll.rsc)
+#endif
+
+#ifdef FF_IMAGEPRINT_PICTBRIDGE_PROTOCOL
+IP_PLUGIN(pdphotolib.dll,pdphotolib.rsc)
+#endif
+
+#ifdef FF_IMAGEPRINT_UPNP_PROTOCOL
+IP_PLUGIN(upnpprotocol.dll, upnpprotocol.rsc)
+#endif
+
+file=ABI_DIR\IP_DIR\xhtmlfilecomposer.dll SHARED_LIB_DIR\xhtmlfilecomposer.dll
+DATA=DATAZ_\resource\imageprintdata\protocols\xhtmltempl\xhtmlfiletemplate.txt \resource\imageprintdata\protocols\xhtmltempl\xhtmlfiletemplate.txt
+
+#endif // DEVICEPROTOCOLS_IBY
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/bwins/upnpprotocolu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,18 @@
+EXPORTS
+ ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &)
+ ?CancelJobL@CPrinterControlPoint@@QAEXPAVCUpnpDevice@@ABVTDesC8@@@Z @ 2 NONAME ; void CPrinterControlPoint::CancelJobL(class CUpnpDevice *, class TDesC8 const &)
+ ?GetPrinterAttributesL@CPrinterControlPoint@@QAEXPAVCUpnpDevice@@@Z @ 3 NONAME ; void CPrinterControlPoint::GetPrinterAttributesL(class CUpnpDevice *)
+ ?GetJobAttributesL@CPrinterControlPoint@@QAEXPAVCUpnpDevice@@ABVTDesC8@@@Z @ 4 NONAME ; void CPrinterControlPoint::GetJobAttributesL(class CUpnpDevice *, class TDesC8 const &)
+ ?GetMediaListL@CPrinterControlPoint@@QAEXPAVCUpnpDevice@@ABVTDesC8@@1@Z @ 5 NONAME ; void CPrinterControlPoint::GetMediaListL(class CUpnpDevice *, class TDesC8 const &, class TDesC8 const &)
+ ?GetMarginsL@CPrinterControlPoint@@QAEXPAVCUpnpDevice@@ABVTDesC8@@1@Z @ 6 NONAME ; void CPrinterControlPoint::GetMarginsL(class CUpnpDevice *, class TDesC8 const &, class TDesC8 const &)
+ ?ActionResponseReceivedL@CPrinterControlPoint@@UAEXPAVCUpnpAction@@@Z @ 7 NONAME ; void CPrinterControlPoint::ActionResponseReceivedL(class CUpnpAction *)
+ ?CancelJobL@CPrinterControlPoint@@QAEXH@Z @ 8 NONAME ; void CPrinterControlPoint::CancelJobL(int)
+ ?HttpResponseReceivedL@CPrinterControlPoint@@UAEXPAVCUpnpHttpMessage@@@Z @ 9 NONAME ; void CPrinterControlPoint::HttpResponseReceivedL(class CUpnpHttpMessage *)
+ ?DeviceDisappearedL@CPrinterControlPoint@@UAEXPAVCUpnpDevice@@@Z @ 10 NONAME ; void CPrinterControlPoint::DeviceDisappearedL(class CUpnpDevice *)
+ ?CreateJobL@CPrinterControlPoint@@QAEHPAVCUpnpDevice@@ABVTDesC8@@11111111H@Z @ 11 NONAME ; int CPrinterControlPoint::CreateJobL(class CUpnpDevice *, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, class TDesC8 const &, int)
+ ?NewL@CPrinterControlPoint@@SAPAV1@AAVMPCPObserver@@@Z @ 12 NONAME ; class CPrinterControlPoint * CPrinterControlPoint::NewL(class MPCPObserver &)
+ ?PrintingFinishedL@CPrinterControlPoint@@QAEXPAVCUpnpDevice@@@Z @ 13 NONAME ; void CPrinterControlPoint::PrintingFinishedL(class CUpnpDevice *)
+ ?DeviceDiscoveredL@CPrinterControlPoint@@UAEXPAVCUpnpDevice@@@Z @ 14 NONAME ; void CPrinterControlPoint::DeviceDiscoveredL(class CUpnpDevice *)
+ ??1CPrinterControlPoint@@UAE@XZ @ 15 NONAME ; CPrinterControlPoint::~CPrinterControlPoint(void)
+ ?StateUpdatedL@CPrinterControlPoint@@UAEXPAVCUpnpService@@@Z @ 16 NONAME ; void CPrinterControlPoint::StateUpdatedL(class CUpnpService *)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/data/010208a27.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* 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:
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+// Declares info for UPnP implementation
+RESOURCE REGISTRY_INFO theInfo
+ {
+ // UID for the DLL
+ dll_uid = 0x10208A27;
+ // Declare array of interface info
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ // UID of interface that is implemented
+ interface_uid = 0x10208A1E;
+ implementations =
+ {
+ // Info for UPnP Protocol Module
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = 0x10208A28;
+ version_no = 1;
+ display_name = "UPnP";
+ default_data = "UPnP";
+ opaque_data = "";
+ }
+ };
+ }
+ };
+ }
Binary file ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/data/icon.bmp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/eabi/upnpprotocolu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,26 @@
+EXPORTS
+ _Z24ImplementationGroupProxyRi @ 1 NONAME
+ _ZN20CPrinterControlPoint10CancelJobLEP11CUpnpDeviceRK6TDesC8 @ 2 NONAME
+ _ZN20CPrinterControlPoint10CancelJobLEi @ 3 NONAME
+ _ZN20CPrinterControlPoint10CreateJobLEP11CUpnpDeviceRK6TDesC8S4_S4_S4_S4_S4_S4_S4_S4_i @ 4 NONAME
+ _ZN20CPrinterControlPoint11GetMarginsLEP11CUpnpDeviceRK6TDesC8S4_ @ 5 NONAME
+ _ZN20CPrinterControlPoint13GetMediaListLEP11CUpnpDeviceRK6TDesC8S4_ @ 6 NONAME
+ _ZN20CPrinterControlPoint13StateUpdatedLEP12CUpnpService @ 7 NONAME
+ _ZN20CPrinterControlPoint17DeviceDiscoveredLEP11CUpnpDevice @ 8 NONAME
+ _ZN20CPrinterControlPoint17GetJobAttributesLEP11CUpnpDeviceRK6TDesC8 @ 9 NONAME
+ _ZN20CPrinterControlPoint17PrintingFinishedLEP11CUpnpDevice @ 10 NONAME
+ _ZN20CPrinterControlPoint18DeviceDisappearedLEP11CUpnpDevice @ 11 NONAME
+ _ZN20CPrinterControlPoint21GetPrinterAttributesLEP11CUpnpDevice @ 12 NONAME
+ _ZN20CPrinterControlPoint21HttpResponseReceivedLEP16CUpnpHttpMessage @ 13 NONAME
+ _ZN20CPrinterControlPoint23ActionResponseReceivedLEP11CUpnpAction @ 14 NONAME
+ _ZN20CPrinterControlPoint4NewLER12MPCPObserver @ 15 NONAME
+ _ZN20CPrinterControlPointD0Ev @ 16 NONAME
+ _ZN20CPrinterControlPointD1Ev @ 17 NONAME
+ _ZN20CPrinterControlPointD2Ev @ 18 NONAME
+ _ZTI19CUPnPPrintingDevice @ 19 NONAME ; #<TI>#
+ _ZTI20CPrinterControlPoint @ 20 NONAME ; #<TI>#
+ _ZTI20CUPFileSharingActive @ 21 NONAME ; #<TI>#
+ _ZTV19CUPnPPrintingDevice @ 22 NONAME ; #<VT>#
+ _ZTV20CPrinterControlPoint @ 23 NONAME ; #<VT>#
+ _ZTV20CUPFileSharingActive @ 24 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+./upnpprotocol.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/group/upnpprotocol.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,98 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+deffile upnpprotocol.def
+
+APP_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE /epoc32/include/libc
+SYSTEMINCLUDE /epoc32/include/ecom
+
+// Target information
+TARGET upnpprotocol.dll
+TARGETTYPE PLUGIN
+
+UID 0x10009D8D 0x10208A27
+
+VENDORID VID_DEFAULT
+CAPABILITY CAP_ECOM_PLUGIN
+
+// Include paths
+USERINCLUDE ../inc
+USERINCLUDE ../../xhtmlfilecomposer/inc
+USERINCLUDE ../../../ImagePrintLibrary/inc
+USERINCLUDE ../../../ImagePrintServer/inc
+USERINCLUDE ../../../inc
+USERINCLUDE ../../../../clog/inc
+
+// Sources
+SOURCEPATH ../src
+SOURCE main.cpp
+SOURCE cupfilesharingactive.cpp
+SOURCE cupnpprintingdevice.cpp
+SOURCE cupprintercontainer.cpp
+SOURCE cupprinter.cpp
+SOURCE cupprintingjob.cpp
+SOURCE cupprintfactory.cpp
+SOURCE cupjobstate.cpp
+SOURCE cprintercontrolpoint.cpp
+SOURCE cjobstateevents.cpp
+
+// Resources
+START RESOURCE ../data/010208a27.rss
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+TARGET upnpprotocol.rsc
+END
+
+// Bitmap
+START BITMAP upnpicons.mbm
+TARGETPATH resource/imageprintdata/protocols
+HEADER
+SOURCEPATH ../data
+SOURCE c8 icon.bmp
+END
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY bafl.lib
+LIBRARY bitmaptransforms.lib
+LIBRARY charconv.lib
+LIBRARY upnpcontrolpointbase.lib
+LIBRARY ecom.lib
+LIBRARY efsrv.lib
+LIBRARY esock.lib
+LIBRARY euser.lib
+LIBRARY fbscli.lib
+LIBRARY insock.lib
+LIBRARY upnpipserversutils.lib
+LIBRARY upnpserviceframework.lib
+LIBRARY upnpavobjects.lib
+LIBRARY avmediaserverclient.lib
+LIBRARY xhtmlfilecomposer.lib
+LIBRARY inetprotutil.lib // for charconversion.
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cjobstateevents.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,108 @@
+/*
+* 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 CJobStateEvents class
+*
+*/
+
+
+#ifndef CJOBSTATEEVENTS_H
+#define CJOBSTATEEVENTS_H
+
+#include "upconsts.h"
+
+#define KUPnPMaxReasonLen 50
+typedef TBuf8<KDefaultRealWidth+KMaxName+KDefaultRealWidth+KMaxFileName+KUPnPMaxReasonLen> TUPnPVariable;
+
+/*
+* @class CJobStateEvents
+* @description This class contains the state variables related to the job that is active at printer.
+*/
+NONSHARABLE_CLASS(CJobStateEvents) : public CBase
+{
+ public:
+ enum TJobStateEvent
+ {
+ ENone = 0,
+ EPrinterState,
+ EPrinterStateReasons,
+ EJobIdList,
+ EJobEndState,
+ EJobMediaSheetsCompleted,
+ EContentCompleteList,
+ EJobAbortState
+ };
+
+ public:
+
+ static CJobStateEvents* NewL();
+
+ static CJobStateEvents* NewLC();
+
+ static CJobStateEvents* NewL(CJobStateEvents &a);
+
+ static CJobStateEvents* NewLC(CJobStateEvents &a);
+
+ static CJobStateEvents* NewL(
+ const TDesC8& aPrinterState, const TDesC8& aPrinterStateReasons, const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aContentCompleteList, const TDesC8& aJobAbortState);
+
+ static CJobStateEvents* NewLC(
+ const TDesC8& aPrinterState, const TDesC8& aPrinterStateReasons, const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aContentCompleteList, const TDesC8& aJobAbortState);
+
+ void ConstructL(
+ const TDesC8& aPrinterState, const TDesC8& aPrinterStateReasons, const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aContentCompleteList, const TDesC8& aJobAbortState);
+
+ void ConstructL(CJobStateEvents &a);
+
+ ~CJobStateEvents();
+
+ CJobStateEvents(const CJobStateEvents &a);
+
+ void Delete();
+
+ void InitL();
+
+ TBool ChangedEventL(const TDesC8 &aEvent, TJobStateEvent aEnum);
+
+ void ContentCompleteL ( const TDesC8 &aEvent, TBool& aChanged );
+
+ void JobAbortStateL ( const TDesC8 &aEvent, TBool& aChanged );
+
+ TBool operator==(const CJobStateEvents &a);
+
+ TBool operator!=(const CJobStateEvents &a);
+
+ protected:
+
+ CJobStateEvents();
+
+
+ public:
+ HBufC8* iPrinterState;
+ HBufC8* iPrinterStateReasons;
+ HBufC8* iJobIdList;
+ HBufC8* iJobEndState;
+ HBufC8* iJobMediaSheetsCompleted;
+ HBufC8* iContentCompleteList;
+ HBufC8* iJobAbortState;
+};
+
+#endif // CJOBSTATEEVENTS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cprintercontrolpoint.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,289 @@
+/*
+* 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 CPrinterControlPoint class
+*
+*/
+
+
+#ifndef CPRINTERCONTROLPOINT_H
+#define CPRINTERCONTROLPOINT_H
+
+#include <upnpcontrolpoint.h>
+
+#include "mpcpobserver.h"
+#include "cjobstateevents.h"
+#include "upconsts.h"
+
+class CUpnpDevice;
+class CUpnpAction;
+class CUpnpHttpMessage;
+
+enum TPrintService
+{
+ EServiceNone = 0,
+ EPrintBasic,
+ EPrintEnhanced
+};
+
+// CLASS DECLARATION
+
+/**
+* @brief Declares the CPrinterControlPoint
+*
+* Prior using the CPrinterControlPoint class, client application has to create
+* the network connection for the selected IAP. If connection is not up and
+* running, the CDispatcherEngine class construction will fail.
+*
+* The Printer Control Point starts XHTML folder sharing and printer search when it's constructed.
+*
+* See UPnP Print Design document for instuctions.
+*
+* @since Series60 2.0
+*/
+class CPrinterControlPoint : public CUpnpControlPoint//, public MUPnPSecurityObserver
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Create a CPrinterControlPoint object using two phase construction.
+ * @param aPCPObserver
+ * @param aFriendlyName Specifies the friendly name of the control point.
+ * @param aIapId IAP to use.
+ * @result pointer to created CPrinterControlPoint object.
+ */
+ IMPORT_C static CPrinterControlPoint* NewL( MPCPObserver& aPCPObserver);
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C ~CPrinterControlPoint();
+
+ public: // From MUPnPSecurityObserver
+ /**
+ * Function informs when file sharing is ready
+ * @since Series 60 3.0
+ */
+
+ public:
+
+ /**
+ * Create a print job to the printer. The XHTML-print files must be in folder defined by KUPnPDataPath.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aPrintFile XHTML-Print file's name WITHOUT path (NOTE: path for files defined in KUPnPDataPath)
+ * @param aCopies Number of copies of the document to be printed for the job.
+ * @param aSides Specifies how pages are to be imposed upon the sides of a selected medium for the job.
+ * @param aNumberUp Indicates the number of pages to impose upon a single side.
+ * @param aOrientationRequest Indicates the desired orientation for printed pages.
+ * @param aMediaSize Identifies the medium size name and dimensions.
+ * @param aMediaType Identtifies the medium type.
+ * @param aPrintQuality Specifies the print quality requested for the job.
+ * @param aPrintBasic Specifies the service to use for printing.
+ */
+ IMPORT_C TInt CreateJobL( CUpnpDevice* aPrinter,
+ const TDesC8& aPrintFile,
+ const TDesC8& aUserName,
+ const TDesC8& aCopies,
+ const TDesC8& aSides,
+ const TDesC8& aNumberUp,
+ const TDesC8& aOrientationRequest,
+ const TDesC8& aMediaSize,
+ const TDesC8& aMediaType,
+ const TDesC8& aPrintQuality,
+ TBool aPrintBasic = EFalse );
+
+ /**
+ * Cancel a specified print job. Leaves if printer is invalid.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID of cancelled job.
+ */
+ IMPORT_C void CancelJobL( CUpnpDevice* aPrinter, const TDesC8& aJobId );
+
+ /**
+ * Cancel a specified print job. Leaves if printer is invalid.
+ * @since Series60 3.0
+ * @param aSessionId Print job ID of cancelled job.
+ */
+ IMPORT_C void CancelJobL( const TInt aSessionId );
+
+ /**
+ * This function is used to query printer attributes.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ */
+ IMPORT_C void GetPrinterAttributesL( CUpnpDevice* aPrinter );
+
+ /**
+ * This function is used to query job attributes of specified print job.
+ * @since Series60 3.
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID.
+ */
+ IMPORT_C void GetJobAttributesL( CUpnpDevice* aPrinter, const TDesC8& aJobId );
+
+ /**
+ * This function is used to query margin information from printers supporting PrintEnhanced:1.
+ * If printer supports only PrintBasic:1, a function leaves with KErrNotSupported.
+ *
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aMediaSize
+ * @param aMediaType
+ */
+ IMPORT_C void GetMarginsL( CUpnpDevice* aPrinter, const TDesC8& aMediaSize, const TDesC8& aMediaType );
+
+ /**
+ * Allows a client to determine a valid combinations of MediaType and MediaSize that the printer supports.
+ * Action is supported only in PrintEnhanced:1.
+ * If printer supports only PrintBasic:1, a function leaves with KErrNotSupported.
+ *
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aMediaSize
+ * @param aMediaType
+ */
+ IMPORT_C void GetMediaListL( CUpnpDevice* aPrinter, const TDesC8& aMediaSize, const TDesC8& aMediaType );
+
+
+ /**
+ * Informs the control point that printing has finished and the event unsubscription can be done.
+ * @since Series60 3.
+ * @param aPrinter Printer to be used.
+ * @param aJobId Print job ID.
+ */
+ IMPORT_C void PrintingFinishedL( CUpnpDevice* aPrinter );
+
+
+ // From CControlPoint
+
+ /**
+ * StateUpdatedL
+ * @since Series60 3.0
+ * @param aService the service state updated
+ */
+ IMPORT_C void StateUpdatedL( CUpnpService* aService );
+
+ /**
+ * DeviceDiscoveredL
+ * @since Series60 3.0
+ * @param aDevice the device found
+ */
+ IMPORT_C void DeviceDiscoveredL( CUpnpDevice* aDevice );
+
+ /**
+ * DeviceDisappearedL
+ * @since Series60 3.0
+ * @param aDevice
+ */
+ IMPORT_C void DeviceDisappearedL( CUpnpDevice* aDevice );
+
+ /**
+ * ActionResponseReceivedL
+ * @since Series60 3.0
+ * @param aAction the action received
+ */
+ IMPORT_C void ActionResponseReceivedL( CUpnpAction* aAction );
+
+ /**
+ * HttpResponseReceivedL
+ * @since Series60 3.0
+ * @param aMessage the HTTP response message
+ */
+ IMPORT_C void HttpResponseReceivedL( CUpnpHttpMessage* aMessage );
+
+ private:
+
+ /**
+ * First phase of the two phased construction.
+ * @param aPCPObserver
+ * @param aFriendlyName Specifies the friendly name of the control point.
+ */
+ CPrinterControlPoint( MPCPObserver& aPCPOBserver );
+
+ /**
+ * Runs base classes ConstructL, starts XHTML folder sharing and starts
+ * printer search.
+ *
+ */
+ void ConstructL( );
+
+ /**
+ * Get service from specified device.
+ * @since Series60 3.0
+ * @param aPrinter Printer to be used.
+ * @param aService Service type
+ * @return Pointer to the resolved service
+ */
+ CUpnpService* GetServiceFromDevice( CUpnpDevice* aPrinter, TPrintService& aService );
+
+ /*
+ * Function for parsing remote host address from Data Sink URL
+ * @param aDataSinkUrl
+ * @return Address
+ */
+ const TPtrC8 DataSinkUrlAddress( const TDesC8& aDataSinkUrl );
+
+ /*
+ * Function for parsing path from Data Sink URL
+ * @param aDataSinkUrl
+ * @return Path
+ */
+ const TPtrC8 DataSinkUrlPath( const TDesC8& aDataSinkUrl );
+
+ /*
+ * Function for parsing port from Data Sink URL
+ * @param aDataSinkUrl
+ * @return Port number
+ */
+ TInt DataSinkUrlPort( const TDesC8& aDataSinkUrl );
+
+ /*
+ * Sends the CancelJob action to the printer
+ * @param aService Print service, from where the action will be created
+ * @param aJobId Id of the job to be cancelled
+ */
+ void DoCancelJobL(CUpnpService& aService, const TDesC8& aJobId);
+
+
+ /*
+ * Function for removing tags (if exists) from actions received from UPnP
+ * @param aString Descriptor to remove tags
+ * @return Pointer to the descriptor without tags
+ */
+ TPtrC8 RemoveTags( const TDesC8& aString);
+
+ /*
+ * Function for writing the log of job state events
+ * @param aService
+ */
+ void JobStateLog(CUpnpService* aService);
+
+
+ private: // Data
+
+ //@var iPCPObserver PCP observer for callbacks, not owned
+ MPCPObserver& iPCPObserver;
+
+ //@var iCancelledJobSIDs Contains session ids for jobs to be cancelled
+ RArray<TInt> iCancelledJobSIDs;
+
+ //@var iJobStateEvents Job state event maintainer
+ CJobStateEvents* iJobStateEvents;
+
+};
+
+#endif // CPRINTERCONTROLPOINT_H
+
+// End Of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupfilesharingactive.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,67 @@
+/*
+* 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 CUPFileSharingActive class
+*
+*/
+
+
+#ifndef CUPFILESHARINGACTIVE_H
+#define CUPFILESHARINGACTIVE_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+class CUpnpFileSharing;
+class CUpnpItem;
+
+class CUPFileSharingActive : public CActive
+{
+
+public:
+
+ static CUPFileSharingActive* NewL();
+
+ ~CUPFileSharingActive();
+
+private: // Constructors
+
+ CUPFileSharingActive();
+
+ void ConstructL();
+
+protected: // from CActive
+
+ void RunL();
+
+ void DoCancel();
+
+ TInt RunError( TInt aError );
+
+public: // New Functions
+
+ void ShareItemL( CUpnpItem& aItem );
+
+ void UnshareItemL( TInt aId );
+
+ void GetSharedItemL( TInt aId, CUpnpItem& aItem );
+
+private: // data
+
+ CUpnpFileSharing* iFileSharing;
+
+};
+
+#endif // CUPFILESHARINGACTIVE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupjobstate.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,362 @@
+/*
+* 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 CUPJobState class
+*
+*/
+
+
+#ifndef CUPJOBSTATE_H
+#define CUPJOBSTATE_H
+
+#include <e32base.h>
+
+#include "upconsts.h"
+
+/*
+* @class TUPJobEndState
+* @description This class contains the state variables related to the end / abort state
+* of the job that is active at printer.
+*/
+NONSHARABLE_CLASS(TUPJobEndState)
+{
+ public:
+ inline TUPJobEndState(){Init();}
+
+ inline void Init()
+ {
+ iId.Set(KNullDesC8());
+ iJobName.Set(KNullDesC8());
+ iOriginator.Set(KNullDesC8());
+ iSheets = KErrNotFound;
+ iState = EStateUnknown;
+ iReason = ENoMessage;
+ iAbortState = EFalse;
+ }
+
+ TPtrC8 iId;
+ TPtrC8 iJobName;
+ TPtrC8 iOriginator;
+ TInt iSheets;
+ TUPnPState iState;
+ TInt iReason;
+ TBool iAbortState;
+};
+
+/*
+* @class CUPJobState
+* @description This class collects and maintains the processing state of the job that is active at printer.
+*/
+NONSHARABLE_CLASS(CUPJobState) : public CBase
+{
+ public:
+
+ /*
+ * @function NewL
+ * @description A method to create a new object.
+ */
+ static CUPJobState* NewL();
+
+ /*
+ * @function NewLC
+ * @description A method to create a new object.
+ */
+ static CUPJobState* NewLC();
+
+ /*
+ * @function ~CUPJobState
+ * @description Destructor
+ */
+ ~CUPJobState();
+
+ /*
+ * @function Init
+ * @description Initializes private members
+ */
+ void Init();
+
+ /*
+ * @function State
+ * @description Returns the stored state of the job
+ * @return TUPnPState
+ */
+ TUPnPState State();
+
+ /*
+ * @function SetActiveId
+ * @description Sets the id for the active job at UPnPProtocol
+ * @return TUPnPState
+ */
+ void SetActiveId(const TDesC8& aId);
+
+ /*
+ * @function ActiveId
+ * @description Returns id of the job active at UPnPProtocol
+ * @return TUPnPState
+ */
+ TPtrC8 ActiveId();
+
+ /*
+ * @function SheetsCompleted
+ * @description Returns the number of printed sheets of the job
+ * @return TInt
+ */
+ TInt SheetsCompleted();
+
+ /*
+ * @function Reason
+ * @description Returns the reason code for the job state
+ * @return TInt
+ */
+ TInt Reason();
+
+ /*
+ * @function SetSheetsToPrint
+ * @description Sets the number of the sheets about to print
+ * @param TInt
+ */
+ void SetSheetsToPrint(TInt aSheets);
+
+ /*
+ * @function SheetsToPrint
+ * @description Returns the number of the sheets about to print
+ * @return TInt
+ */
+ TInt SheetsToPrint();
+
+ /*
+ * @function SetSheetsCompleted
+ * @description Returns and updates the job state according to the printed sheets
+ * @param TDesC8 Reference to the string value of printed sheets
+ */
+ void SetSheetsCompleted(const TDesC8& aSheetsCompleted);
+
+ /*
+ * @function Progress
+ * @description Returns progress percentage of the job
+ * @param TInt Number of the sheets sent to printer
+ * @return TInt
+ */
+ TInt Progress(TInt aSheets);
+
+ /*
+ * @function Progress
+ * @description Returns progress percentage of the job
+ * @return TInt
+ */
+ TInt Progress();
+
+ /*
+ * @function UpdateJobState
+ * @description Returns the state of the job after updated with given arguments
+ * @param TDesC8& Printer state
+ * @param TDesC8& Reason for the printer state
+ * @param TDesC8& List of job ids pending at the printer queue
+ * @param TDesC8& Id of the currently handled job in printer
+ * @param TDesC8& Number of the sheets completed at printer
+ * @return TUPnPState
+ */
+ TUPnPState UpdateJobState(const TDesC8& aPrinterState, const TDesC8& aReason, const TDesC8& aJobList, const TDesC8& aJobId, const TDesC8& aJobMediaSheetsCompleted);
+
+
+ /*
+ * @function GetErrorValue
+ * @description Maps the ImagePrint and device errors.
+ * @param TDesC8 Reference to device returned error code
+ * @return TInt Correspondent ImagePrint error code
+ */
+ TInt GetErrorValue(const TDesC8& aError);
+
+ /*
+ * @function PrinterStateUpdated
+ * @description Returns the state of the job after printer state updated
+ * @param TDesC8& New printer state
+ * @return TUPnPState
+ */
+ TUPnPState PrinterStateUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function PrinterStateReasonsUpdated
+ * @description Returns the state of the job after printer state reason updated
+ * @param TDesC8& Reason for the printer state
+ * @return TUPnPState
+ */
+ TUPnPState PrinterStateReasonsUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function JobIdListUpdated
+ * @description Returns the state of the job after job ID list updated
+ * @param TDesC8& List of job ids pending at the printer queue
+ * @return TUPnPState
+ */
+ TUPnPState JobIdListUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function JobEndStateUpdatedL
+ * @description Returns the state of the job after job end state updated
+ * @param TDesC8& The end state of last printed job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,<state>
+ * @return TUPnPState
+ */
+ TUPnPState JobEndStateUpdatedL( const TDesC8& aEvent );
+
+ /*
+ * @function JobMediaSheetsCompletedUpdated
+ * @description Returns the state of the job after media sheets completed list updated
+ * @param TDesC8& Number of the printed sheets
+ * @return TUPnPState
+ */
+ TUPnPState JobMediaSheetsCompletedUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function JobMediaSheetsCompletedUpdated
+ * @description Returns the state of the job after media sheets completed list updated
+ * @param TDesC8& ID of the current job
+ * @param TDesC8& Number of the printed sheets
+ * @return TUPnPState
+ */
+ TUPnPState JobMediaSheetsCompletedUpdated(const TDesC8& aId, const TDesC8& aEvent );
+
+ /*
+ * @function JobAbortStateUpdatedL
+ * @description Returns the state of the job after job abort state updated
+ * @param TDesC8& The abort state of last aborted job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,aborted,<reason>
+ * @return TUPnPState
+ */
+ TUPnPState JobAbortStateUpdatedL( const TDesC8& aEvent );
+
+ /*
+ * @function ContentCompleteListUpdated
+ * @description Returns the state of the job after content completed list updated
+ * @param TDesC8& Number of the sheets completedly received in printer
+ * @return TUPnPState
+ */
+ TUPnPState ContentCompleteListUpdated( const TDesC8& aEvent );
+
+
+ protected:
+
+ /*
+ * @function ConstructL
+ * @description Symbian second phase constructor
+ */
+ void ConstructL();
+
+ /*
+ * @function State
+ * @description updates job's state according to the given state.
+ * @param TUPnPState State enumeration value
+ * @return TUPnPState
+ */
+ TUPnPState State(TUPnPState aState);
+
+ /*
+ * @function SetState
+ * @description Updates the stored state of the job
+ * @param TUPnPState state to update with
+ */
+ void SetState(TUPnPState aState);
+
+ /*
+ * @function SetJobList
+ * @description Returns and updates the job state according to the list of the jobs pending in printer.
+ * @param TDesC8 Reference to list of jobs
+ * @return TUPnPState
+ */
+ TUPnPState SetJobList(const TDesC8& aJobIdList);
+
+ /*
+ * @function PendingJobId
+ * @description Returns the position of active job in job list.
+ * @param TDesC8 Reference to list of jobs
+ * @return TInt
+ */
+ TInt PendingJobId(const TDesC8& aJobIdList);
+
+ /*
+ * @function SetId
+ * @description Updates the printer returned job id if necessary.
+ * @param TDesC8 Reference to printer returned id
+ */
+ void SetId(const TDesC8& aId);
+
+ /*
+ * @function InitErrorValues
+ * @description Initializes the error values stored in map for device vs. ImagePrint errors
+ */
+ void InitErrorValues();
+
+ /*
+ * @function SetReason
+ * @description Sets the reason for job state.
+ * @param TInt Error value for the reason
+ */
+ void SetReason(TInt aReason);
+
+ /*
+ * @function ParseState
+ * @description Maps the states received from the device to state enumerations.
+ * @param TDesC8 Reference to state string
+ * @return TInt Corresponding state enumeration
+ */
+ TUPnPState ParseState(const TDesC8& aState);
+
+ /*
+ * @function ParseJobEndStateL
+ * @description Separates the elements of the job end and abort state for handling and returns
+ * KErrNotFound if the end state is not for the active job
+ * @param TDesC8& The end or abort state of last printed job. Formats:
+ * <id>,<name>,<originator>,<completed sheets>,<state>
+ * <id>,<name>,<originator>,<completed sheets>,abort,<reason>
+ * @return TInt KErrNotFound if the end state is not for the active job
+ */
+ TInt ParseJobEndStateL(const TDesC8& aJobEndState);
+
+ private:
+
+ /*
+ * @function CUPJobState
+ * @description Default constructor.
+ */
+ CUPJobState();
+
+ private:
+ // @var iActiveId Id of the active job interested
+ TBuf8<KMaxIdLength> iActiveId;
+
+ // @var iId Id of the job
+ TBuf8<KMaxIdLength> iId;
+
+ // @var iSheetsCompleted Number of the completed sheets for the job
+ TInt iSheetsCompleted;
+
+ // @var iReason Reason string of the state
+ TInt iReason;
+
+ // @var iState Overall state of the job
+ TUPnPState iState;
+
+ // @var iErrorValues Error values mapping array
+ RArray<TMapError> iErrorValues;
+
+ // @var iEndState job end state info container
+ TUPJobEndState iEndState;
+
+ // @var iSheetsToPrint Number of the pages to print
+ TInt iSheetsToPrint;
+
+};
+#endif // CUPJOBSTATE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cuplogger.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,196 @@
+/*
+* 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 logging macros and CUPLogger class
+*
+*/
+
+
+#ifndef CUPLOGGER_H
+#define CUPLOGGER_H
+
+#include "logdef.h"
+
+/**
+ * NOTE: Link to flogger.lib in MMP file. Use DEBUGLIBRARY -keyword to avoid
+ * warnings in release builds.
+ * Example: DEBUGLIBRARY flogger.lib
+ */
+
+/**
+ * Usage: LOG("[MODULE_NAME]\t Trace text here");
+ *
+ * Trace target can be changed below (file logging needs directory c:\logs\upnp)
+ * #define __FLOGGING -row uncommented (default) = File logging
+ * #define __CLOGGING -row uncommented = Console logging
+ */
+
+#ifdef ENABLE_LOGGING
+// Define one of these flags:
+// FLOGGING = File logging
+// CLOGGING = Console logging
+#define __FLOGGING__
+//#define __CLOGGING__
+#endif
+
+
+
+// Then actual definitions depending on the
+// flag values.
+
+#ifdef ENABLE_LOGGING
+
+ #include <e32std.h>
+ #include <f32file.h>
+
+
+ // Actual log file name
+ _LIT(KLogFile,"UALog.txt");
+
+ // Subdirectory under c:\logs -directory -- MUST EXIST.
+ _LIT(KLogDir, "upnp");
+
+ /// The format in which the time is formatted in log
+ _LIT( KLogTimeFormat, "%02d.%02d:%02d:%06d ");
+ _LIT8( KLogTimeFormat8, "%02d.%02d:%02d:%06d ");
+
+ /// The length of the string produced by KLogTimeFormat
+ const TInt KLogTimeFormatLength = 16;
+
+ /// How many characters a log line can contain
+ const TInt KLogLineLength = 256;
+
+
+ #include <f32file.h>
+ #include <flogger.h>
+
+
+ // Define the top level macros
+ #define LOGS(a1, a2) {\
+ TBuf<1000> log;\
+ log.Append(_L(a1));\
+ log.Append(a2);\
+ Print(log );}
+ #define LOG8S(a1, a2) {\
+ TBuf8<1000> log;\
+ log.Append(_L8(a1));\
+ log.Append(a2);\
+ Print8(log );}
+
+ #define LOG(a) {Print( _L(a) ) ;}
+ #define LOG1(s, v) {Print( _L(s), v );}
+ #define LOG2(s, v1, v2) {Print( _L(s), v1, v2 );}
+
+ #define LOG8(a) {Print8( _L(a) );}
+ #define LOG81(s, v) {Print8( _L8(s), v );}
+ #define LOG82(s, v1, v2) {Print8( _L8(s), v1, v2 );}
+
+ #ifdef __FLOGGING__
+
+ inline void Print( TRefByValue<const TDesC> aText, ... )
+ {
+ VA_LIST args;
+ VA_START( args, aText );
+
+ TBuf<256> buf;
+ buf.FormatList( aText, args );
+
+ RFileLogger logger;
+ TInt ret = logger.Connect();
+ if (ret==KErrNone)
+ {
+ logger.SetDateAndTime( EFalse,EFalse );
+ logger.CreateLog( KLogDir, KLogFile, EFileLoggingModeAppend );
+ TBuf<KLogTimeFormatLength> timeStamp;
+ TTime now;
+ now.HomeTime();
+ TDateTime dateTime;
+ dateTime = now.DateTime();
+ timeStamp.Format( KLogTimeFormat,
+ dateTime.Hour(), dateTime.Minute(),
+ dateTime.Second(), dateTime.MicroSecond() );
+ buf.Insert( 0, timeStamp );
+
+ logger.Write(buf);
+ }
+
+ logger.Close();
+ VA_END( args );
+ }
+
+ inline void Print8( TRefByValue<const TDesC8> aText, ... )
+ {
+ VA_LIST args;
+ VA_START( args, aText );
+
+ TBuf8<256> buf;
+ buf.FormatList( aText, args );
+
+ RFileLogger logger;
+ TInt ret = logger.Connect();
+ if (ret==KErrNone)
+ {
+ logger.SetDateAndTime( EFalse,EFalse );
+ logger.CreateLog( KLogDir, KLogFile, EFileLoggingModeAppend );
+ TBuf8<KLogTimeFormatLength> timeStamp;
+ TTime now;
+ now.HomeTime();
+ TDateTime dateTime;
+ dateTime = now.DateTime();
+ timeStamp.Format( KLogTimeFormat8,
+ dateTime.Hour(), dateTime.Minute(),
+ dateTime.Second(), dateTime.MicroSecond() );
+ buf.Insert( 0, timeStamp );
+
+ logger.Write(buf);
+ }
+
+ logger.Close();
+ VA_END( args );
+ }
+
+ #else
+ // Console Logging on
+ #define Print RDebug::Print
+
+ #define LOGS(a1, a2) {\
+ TBuf<1000> log;\
+ log.Append(_L(a1));\
+ log.Append(a2);\
+ Print(log );}
+
+ #define LOG8S(a1, a2) {\
+ TBuf8<1000> log;\
+ log.Append(_L8(a1));\
+ log.Append(a2);\
+ Print(log );}
+ #endif // __FLOGGING__
+
+#else
+
+ // DEBUG build is not on --> no logging at all
+ #define LOG(a)
+ #define LOG8S(a1, a2)
+
+ #define LOG1(s, v)
+ #define LOG2(s, v1, v2)
+
+ #define LOG8(a)
+ #define LOG81(s, v)
+ #define LOG82(s, v1, v2)
+
+#endif // ENABLE_LOGGING
+
+#endif // CUPLOGGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupnpprintingdevice.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,359 @@
+/*
+* 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 CUPnPPrintingDevice class
+*
+*/
+
+
+#ifndef CUPNPPRINTINGDEVICE_H
+#define CUPNPPRINTINGDEVICE_H
+
+#include <fbs.h>
+#include <upnpmediaserverclient.h>
+#include <upnpfilesharing.h>
+#include <data_caging_path_literals.hrh>
+
+#include "imageprint.h"
+#include "mprotprintingdevice.h"
+#include "cprintercontrolpoint.h"
+#include "printmessagecodes.h"
+#include "cupprintercontainer.h"
+#include "cuplogger.h"
+#include "upconsts.h"
+#include "cupprintingjob.h"
+
+_LIT8(KFriendlyName, "UPnPProtocol");
+
+/// @brief The timeout to wait for first devices to be discovered
+#define KPrinterDiscoveryTimeout TTimeIntervalMicroSeconds32(25000000)
+
+/// @brief The timeout to wait for responses during printing 60 seconds
+#define KPrinterResponseTimeout TTimeIntervalMicroSeconds32(60000000)
+//#define KPrinterResponseTimeout TTimeIntervalMicroSeconds32(30000000)
+
+/// @brief The timeout to wait for responses during printing
+#define KPrinterSubmitTimeout TTimeIntervalMicroSeconds32(15000000)
+
+// @brief The times the timer can expire while printing is processing
+#define KPendingLimit 5
+
+#define KVersionMajor 0
+#define KVersionMinor 0
+#define KVersionBuild 1
+
+
+enum TUPnPProtocolState
+{
+ EUPnPUninitialized=0,
+ EUPnPDiscovery,
+ EUPnPReady,
+ EUPnPJobReady,
+ EUPnPSubmittingJob,
+ EUPnPPrintingStarted,
+ EUPnPPrinting,
+ EUPnPPrintingReady,
+ EUPnPCancelling,
+ EUPnPCancellingDiscovery
+};
+
+/*
+* @class CUPnPPrintingDevice
+* @description Implements the MProtPrintingDevice and MPCPObserver interfaces
+* to integrate Image Print and UPnP stack.
+*
+*/
+class CUPnPPrintingDevice : public CBase, public MPCPObserver, public MProtPrintingDevice
+ {
+ public:
+
+ /*
+ * @function CUPnPPrintingDevice
+ * @description C++ constructor
+ */
+ CUPnPPrintingDevice();
+
+ /*
+ * @function NewProtocolL
+ * @description Called from Main.cpp to construct a new MProtPrintingDevice instance
+ */
+ static MProtPrintingDevice* NewL();
+
+ /*
+ * @function ~CUPnPPrintingDevice
+ * @description Destructor.
+ */
+ ~CUPnPPrintingDevice();
+
+ /*
+ * @function DiscoveryTimeoutCBL
+ * @description This static callback function is called by iPrinterTimer when the
+ * discovery timer event occurs.
+ * @param
+ * @return
+ */
+ static TBool DiscoveryTimeoutCBL(TAny *aWho);
+
+ /*
+ * @function StatusTimeoutCBL
+ * @description This static callback function is called by iPrinterTimer when the
+ * status timer event occurs.
+ * @param
+ * @return
+ */
+ static TBool StatusTimeoutCBL(TAny *aWho);
+
+ /*
+ * @function SubmitTimeoutCBL
+ * @description This static callback function is called by iPrinterTimer when the
+ * submit timer event occurs.
+ * @param TAny
+ * @return TInt
+ */
+ static TInt SubmitTimeoutCBL(TAny *aWho);
+
+
+
+
+ // ===============================
+ // From MProtPrintingDevice.
+ // ===============================
+ // General
+ virtual void ConstructL(const TDesC& aDLLPath);
+ virtual TVersion Version();
+ virtual TUint SupportedProtocols();
+ // Discovery.
+ virtual void StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocols = 0);
+ virtual TInt RemoveCachedDeviceL(TInt aDeviceID);
+ virtual void CancelDiscovery(TBool aDoCallBack = ETrue);
+ // Print.
+ virtual TInt CreatePrintJobL(TInt aDeviceID, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver);
+ virtual void SubmitPrintJobL();
+ virtual TInt CancelPrintJob();
+ virtual TInt ContinuePrintJobL();
+ virtual TInt GetNumPrintPages();
+ virtual TInt GetPrintJobStatus();
+ virtual TInt GetPrinterStatus(TInt aDeviceID);
+ // Capabilities.
+ virtual TInt GetDeviceCapabilityIDsL(TInt aDeviceID, RArray<TInt>& aCapabilityIDs);
+ virtual TInt GetDeviceCapabilityL(TInt aDeviceID, TInt aCapabilityID, TPrintCapability& aCapability);
+ virtual TInt GetJobSetting(TInt aCapabilityID, TInt& aValue);
+ virtual TInt SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability);
+ // Preview.
+ virtual TInt GetNumPreviewPages();
+ virtual TInt GetJobTemplateIconL(TInt aTemplateID, TInt& aFsBitmapHandle);
+ virtual TInt CreatePreviewImage(TInt aPageNumber);
+
+ virtual void RegisterIdleObserver(MProtIdleObserver* aObserver);
+
+ virtual void SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr );
+
+ // ===============================
+ // From MPCPObserver
+ // ===============================
+ virtual void CreateJobResponse( CUpnpAction* aAction, TInt aErrorCode );
+ virtual void CancelJobResponse( CUpnpAction* aAction, TInt aErrorCode );
+ virtual void GetPrinterAttributesResponse( CUpnpAction* aAction, TInt aErrorCode );
+ virtual void GetJobAttributesResponse( CUpnpAction* aAction, TInt aErrorCode );
+ virtual void GetMarginsResponse( CUpnpAction* aAction, TInt aErrorCode );
+ virtual void GetMediaListResponse( CUpnpAction* aAction, TInt aErrorCode );
+ virtual void StateUpdatedResponse( const TDesC8& aPrinterState,
+ const TDesC8& aPrinterStateReasons,
+ const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,
+ const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aJobAbortState,
+ const TDesC8& aContentCompleteList );
+ virtual void DeviceDiscoveredL( CUpnpDevice* aDevice );
+ virtual void DeviceDisappeared( CUpnpDevice* aDevice );
+ // state events
+ virtual void PrinterStateUpdated( const TDesC8& aEvent );
+ virtual void PrinterStateReasonsUpdated( const TDesC8& aEvent );
+ virtual void JobIdListUpdated( const TDesC8& aEvent );
+ virtual void JobEndStateUpdated( const TDesC8& aEvent );
+ virtual void JobMediaSheetsCompletedUpdated( const TDesC8& aEvent );
+ virtual void ContentCompleteListUpdated( const TDesC8& aEvent );
+ virtual void JobAbortStateUpdated( const TDesC8& aEvent );
+
+ protected:
+
+
+ private:
+
+ /*
+ * @function StartDiscoveryInternalL
+ * @description Non-leaving interface for MProtPrintingDevice method StartDiscoveryL
+ * for ImagePrint compliance. Informs observer about leaves by call back method.
+ * @param TInt protocol identifier bitmap
+ */
+ void StartDiscoveryInternalL(TUint aProtocol);
+
+ /*
+ * @function RestartControlPointL
+ * @description Restarts the printer control point
+ */
+ void RestartControlPointL();
+
+ /*
+ * @function SendPrinterListL
+ * @description Returns the device list to MProtDiscoveryObserver object
+ * @param TBool
+ */
+ void SendPrinterListL(TBool aSync = ETrue);
+
+ /*
+ * @function DoDiscoveryTimeoutL
+ * @description Ends the first device discovery session. This function is called
+ * by the static callback function DiscoveryTimeoutCBL.
+ * @param TBool aDoCallBack If ETrue then protocol client is notified.
+ * @return TBool
+ */
+ TBool DoDiscoveryTimeoutL(TBool aDoCallBack);
+
+ /*
+ * @function DoSubmitTimeoutL
+ * @description This function is executed after submit time out expires.
+ * @return TInt
+ */
+ void DoSubmitTimeoutL();
+
+ /*
+ * @function SubmitJobToPcpL
+ * @description Submits the printing job to PCP
+ * @param CDevice& Reference to the printer to be used in printing
+ * @param TInt The ID of the printer to be used in printing
+ */
+ void SubmitJobToPcpL(CUpnpDevice& aPrinter, TInt aPrinterID);
+
+ /*
+ * @function SubmitJobToPcpL
+ * @description Submits the printing job to PCP
+ * @param TInt The ID of the printer to be used in printing
+ */
+ void SubmitJobToPcpL(TInt aDeviceID);
+
+ /*
+ * @function DoStatusTimeoutL
+ * @description Handles time out event in printer communication.
+ * @return TBool
+ */
+ TBool DoStatusTimeoutL();
+
+ /*
+ * @function InitJobL
+ * @description Initializes the printing jobs to job container
+ * @param TInt Printer for printing jobs
+ * @param RPointerArray File paths for files to be printed
+ */
+ void InitJobL(TInt aDeviceId, RPointerArray<TDesC>& aImages);
+
+ /*
+ * @function StartPrintingL
+ * @description Sends the printing jobs to the UPnP Printer Control Point
+ */
+ void StartPrintingL();
+
+ /*
+ * @function DoCancelPrinting
+ * @description Cancels the ongoing printing job. Returns KErrInvalidSequence if state is not
+ * EUPnPSubmittingJob, EUPnPPrintingStarted or EUPnPPrinting.
+ * @return TInt System wide error code
+ */
+ TInt DoCancelPrinting();
+
+ /*
+ * @function UpdatePrintingStatus
+ * @description Updates the status of printing jobs and informs the printing observer about progress and events
+ * @param const TDesC8& aPrinterState
+ */
+ void UpdatePrintingStatus(const TUPnPState aJobState);
+
+
+ /*
+ * @function FinishPrinting
+ * @description Executes the basic operations to be done when printing is done.
+ */
+ void FinishPrinting();
+
+ /*
+ * @function FinishPrinting
+ * @description Overloads FinishPrinting and informs observer about occurred error.
+ * @param TInt Symbian wide error code
+ * @param TInt ImagePrint specific (error) message code
+ */
+ void FinishPrinting(TInt aErrorCode, TInt aErrorMessage);
+
+ /*
+ * @function ResetTimer
+ * @description Resets the timer and initializes timer related flags.
+ */
+ void ResetTimer();
+
+ /*
+ * @function StartTimer
+ * @description Starts the timer and resets it first.
+ * @param TTimeIntervalMicroSeconds32 Delay for the timer
+ * @param TTimeIntervalMicroSeconds32 Interval for timer to expire
+ * @param TCallBack Call back function when timer expires
+ */
+ void StartTimer(TTimeIntervalMicroSeconds32 aDelay,TTimeIntervalMicroSeconds32 anInterval,TCallBack aCallBack);
+
+ /*
+ * @function GetPrinter
+ * @description Returns a pointer to the current printer.
+ * @return CDevice* Current printer or NULL
+ */
+ CUpnpDevice* GetPrinter();
+
+ private:
+ // @var iPrinterControl Control point to UPnP
+ CPrinterControlPoint* iPrinterControl;
+
+ // @var iPrinterContainer Container for printers
+ CUPPrinterContainer* iPrinterContainer;
+
+ // @var iPrintingJob Printing job
+ CUPPrintingJob* iPrintingJob;
+
+ // @var iPrinterTimer Array of discovered printers
+ CPeriodic* iPrinterTimer;
+
+ // @var iPrintFactory XHTML-print file factory
+ CUPPrintFactory* iPrintFactory;
+
+ // @var iPrinterState State information of the object
+ TUPnPProtocolState iState;
+
+ // @var iPrintersFound Indicates if there are printers found
+ TBool iPrintersFound;
+
+ // @var iStatusTimeout This variable is set to ETrue when a status time out occurs
+ TBool iStatusTimeout;
+
+ // @var iFbsBitmap (Dummy) bitmap for icon template
+ CFbsBitmap* iFbsBitmap;
+
+ // @var iPendingCount Counter to avoid too long pending while printing
+ TInt iPendingCount;
+
+ // @var iFriendlyName In Home network configuration defined name for the device
+ TBuf8<256> iFriendlyName;
+
+ // @var iTriedReadCacheAndFail To check that never trying read cache file more than one time, if we don't have it.
+ TBool iTriedReadCacheAndFail;
+
+ };
+
+#endif // CUPNPPRINTINGDEVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprinter.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,200 @@
+/*
+* 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 CUPPrinter class
+*
+*/
+
+
+#ifndef CUPPRINTER_H
+#define CUPPRINTER_H
+
+#include <upnpservice.h>
+#include <upnpdevice.h>
+
+#include "upconsts.h"
+#include "tprinter.h"
+#include "imageprint.h"
+
+/*
+* @class CUPPrinter
+* @description This class maps the printers between protocol client and
+* UPnP printer control point.
+*/
+
+NONSHARABLE_CLASS(CUPPrinter) : public CBase
+ {
+ public:
+ /*
+ * @function NewL
+ * @description Constructs the CUPPrinter object
+ * @param CDevice*
+ * @param TInt Mapping id
+ */
+ static CUPPrinter* NewL(CUpnpDevice& aDevice, const TInt aId);
+
+ /*
+ * @function NewL
+ * @description Constructs the CUAPrinter object
+ * @param TInt Mapping id
+ * @param TDesC& UPnP UId
+ * @param TDesC& Display name of printer
+ */
+ static CUPPrinter* NewL(const TInt aId, const TDesC8& aUId, const TDesC8& aDisplayName, const TInt aVendor);
+
+
+ /*
+ * @function Destructor
+ * @description Destructor
+ */
+ ~CUPPrinter();
+
+
+ /*
+ * @function Device
+ * @description Returns a pointer to CDevice
+ * @return CDevice*
+ */
+ CUpnpDevice* Device();
+
+ /*
+ * @function ToTPrinter
+ * @description Returns the object as TPrinter
+ * @return TPrinter
+ */
+ TPrinter ToTPrinter();
+
+ /*
+ * @function Id
+ * @description Returns the id of the device.
+ * NOTE: This id maps the printer requests from protocol client
+ * to a correct UPnP printer control point's printer
+ */
+ TInt Id();
+
+ /*
+ * @function GetUId
+ * @description Returns the UPnP uid of the device.
+ */
+ void GetUId(TDesC& aUId);
+
+ /*
+ * @function IsDisappeared
+ * @description Returns ETrue if the printer is reported to be disappeared
+ * @return TBool
+ */
+ TBool IsDisappeared();
+
+ /*
+ * @function SetDisappeared
+ * @description Sets the iDisappeared value as ETrue. Called when the printer is reported to be disappeared.
+ * @param TBool
+ */
+ void SetDisappeared(TBool aDisappeared = ETrue);
+ /*
+ * @function UId
+ * @description Returns the printers UPnP UId
+ * @return TPtrC
+ */
+ TPtrC8 UId();
+
+ /*
+ * @function DisplayName
+ * @description Returns the printers display name
+ * @return TPtrC
+ */
+ TPtrC8 DisplayName();
+
+ /*
+ * @function SetDevice
+ * @description Sets the CDevice pointer. NOTE: The actual object is never owned by this class!
+ * @return CDevice*
+ */
+ void SetDevice(CUpnpDevice* aDevice);
+
+ /*
+ * @function SetCached
+ * @description Sets a flag if printer is cached in cache file or not
+ * @param TBool
+ */
+ void SetCached(TBool aCached);
+
+ /*
+ * @function Cached
+ * @description Returns a flag if printer is cached in cache file or not
+ * @return TBool
+ */
+ TBool Cached();
+
+ /*
+ * @function Vendor
+ * @description Returns an enum value TPrinterVendor
+ * @return TPrinterVendor
+ */
+ TPrinter::TPrinterVendor Vendor();
+
+ /*
+ * @function SetVendor
+ * @description Returns an enum value TPrinterVendor
+ * @return TPrinterVendor
+ */
+ void SetVendor(const TDesC8& aManufacturer);
+
+ protected:
+
+
+ private:
+ /*
+ * @function Constructor
+ * @description C++ constructor
+ */
+ CUPPrinter();
+
+ /*
+ * @function ConstructL
+ * @description Construction's second phase
+ * @param CDevice* Pointer to UPnP device
+ * @param TInt Mapping id
+ * @param TDesC8& UPnP UId
+ * @param TDesC8& Display name of printer
+ */
+ void ConstructL(CUpnpDevice* aDevice, const TInt aId, const TDesC8& aUId, const TDesC8& aDisplayName, const TInt aVendor);
+
+ private:
+
+ // @var iDevice Pointer to UPnP device object
+ CUpnpDevice* iDevice;
+
+ // @var iId Printer id for client apps
+ TInt iId;
+
+ // @var iUId Printer UPnP UId
+ HBufC8* iUId;
+
+ // @var iDisplayName Printer's display name (UPnP Friendly name)
+ HBufC8* iDisplayName;
+
+ // @var iDisappeared ETrue, when a disappearing notification is received for this printer
+ TBool iDisappeared;
+
+ // @var iCached ETrue, if printer is cached in cache file.
+ TBool iCached;
+
+ // @var iVendor TPrinter::TPrinterVendor value for defining vendor
+ TPrinter::TPrinterVendor iVendor;
+
+ };
+
+#endif // CUPPRINTER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprintercontainer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,277 @@
+/*
+* 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 CUPPrinterContainer class
+*
+*/
+
+
+#ifndef CUPPRINTERCONTAINER_H
+#define CUPPRINTERCONTAINER_H
+
+#include <upnpdevice.h>
+#include <f32file.h>
+
+#include "tprinter.h"
+#include "cupprinter.h"
+#include "imageprint.h"
+
+/*
+* @class CUPPrinterContainer
+* @description This class contains an array of discovered devices
+* and methods for handling it. It also converts CDevice objects to
+* TPrinter, where TPrinter's id is the index
+*/
+
+NONSHARABLE_CLASS(CUPPrinterContainer) : public CBase
+ {
+ public:
+ /*
+ * @function NewL
+ * @description Constructs the CUPPrinterContainer object
+ */
+ static CUPPrinterContainer* NewL();
+
+ /*
+ * @function Destructor
+ * @description Releases the resources allocated by this object
+ */
+ ~CUPPrinterContainer();
+
+ /*
+ * @function PrinterCount
+ * @description Returns the number of printers in iPrinters.
+ * @return TInt
+ */
+ TInt PrinterCount();
+
+ /*
+ * @function AddPrinterL
+ * @description Adds a device to the device array. Called when
+ * a device is discovered.
+ * @param CDevice*& Reference to the pointer of the device
+ * @param TInt& The new id will be set to this value
+ * @return TInt Printer id of the added device
+ */
+ void AddPrinterL(CUpnpDevice& aDevice, TInt& aId);
+
+ /*
+ * @function RemovePrinter
+ * @description Removes a printer from the array. Called when
+ * a device is disappeared.
+ * @param CDevice& aDevice
+ * @return TInt Symbian error code
+ */
+ TInt RemovePrinter(CUpnpDevice& aDevice);
+
+ /*
+ * @function RemovePrinter
+ * @description Removes a printer from the array. Called when
+ * a device is disappeared.
+ * @param TInt aIndex
+ * @return TInt Symbian error code
+ */
+ TInt RemovePrinter(TInt aIndex);
+
+ /*
+ * @function PrinterIndex
+ * @description Returns the index number of the device in discovered
+ * printers array. If printer is not found -1 is returned.
+ * This function compares the Uuid's of the CDevices.
+ * @param CDevice
+ * @return TInt
+ */
+ TInt PrinterIndex(CUpnpDevice& aDevice);
+
+ /*
+ * @function PrinterIndex
+ * @description Returns the index number of the device in discovered
+ * printers array. If printer is not found -1 is returned.
+ * This function searches for matching CUPPrinter id's.
+ * @param CDevice*
+ * @return TInt
+ */
+ TInt PrinterIndex(TInt aPrinterId);
+
+ /*
+ * @function PrinterDisappeared
+ * @description Sets a printer as disappeared in printer array.
+ * @param CDevice
+ */
+ void PrinterDisappeared(CUpnpDevice& aDevice);
+
+ /*
+ * @function SyncPrinterArray
+ * @description Removes disappeared devices from iPrinters array.
+ */
+ void SyncPrinterArray();
+
+ /*
+ * @function ReadCacheL
+ * @description Reads printer information from cache file into printer array
+ */
+ void ReadCacheL();
+
+ /*
+ * @function UpdateCacheL
+ * @description Updates the cache file with available printers
+ */
+ void UpdateCacheL();
+
+ /*
+ * @function CacheCurrentL
+ * @description Updates the current device in cache file
+ */
+ void CacheCurrentL();
+
+ /*
+ * @function RemoveCachedDeviceL
+ * @description Removes the given device in cache file
+ * @param TInt Id of the device to remove
+ */
+ TInt RemoveCachedDeviceL(TInt aDeviceID);
+
+ /*
+ * @function UpdateCacheL
+ * @description Updates the cache file with available printers
+ * @param TInt Id of the device to add in cache
+ */
+ void UpdateCacheL(TInt aDeviceID);
+
+ /*
+ * @function ToTPrinter
+ * @description Returns a printer object as TPrinter by index.
+ * @param CDevice*& aDevice
+ * @return TPrinter
+ */
+ TPrinter ToTPrinter(CUpnpDevice& aDevice);
+
+ /*
+ * @function ToTPrinter
+ * @description Returns a printer object as TPrinter by index.
+ * @param TInt aIndex
+ * @return TPrinter
+ */
+ TPrinter ToTPrinter(TInt aIndex);
+
+
+ /*
+ * @function GetDisappearedPrinters
+ * @description Initializes a pointer array with pointers to all disappeared printers
+ * @param RPointerArray Out param
+ */
+ void GetDisappearedPrinters(RPointerArray<CUPPrinter>& aArray);
+
+ /*
+ * @function Printer
+ * @description Returns a pointer to CUPPrinter in printer array.
+ * @param CDevice& aDevice
+ * @return CUPPrinter*
+ */
+ CUPPrinter* Printer(CUpnpDevice& aDevice);
+
+ /*
+ * @function Printer
+ * @description Returns a pointer to CUPPrinter in printer array.
+ * @param TInt aId
+ * @return CUPPrinter*
+ */
+ CUPPrinter* Printer(TInt aId);
+
+ protected:
+
+
+ private:
+ /*
+ * @function Constructor
+ * @description C++ constructor
+ */
+ CUPPrinterContainer();
+
+
+ /*
+ * @function ConstructL
+ * @description Construction's second phase
+ */
+ void ConstructL();
+
+ /*
+ * @function ToCDevice
+ * @description Returns a pointer to CUPPrinter's CDevice in printer array.
+ * @param TInt aIndex
+ * @return CDevice*
+ */
+ CUpnpDevice* ToCDevice(TInt aIndex);
+
+ /*
+ * @function GenerateId
+ * @description Generated an unique id number for a printer
+ * @return TInt Generated Id number
+ */
+ TInt GenerateId();
+
+ /*
+ * @function AddCachedPrinterL
+ * @description Adds a cached printer to printer array
+ * @param TInt aId
+ * @param TDesC& aUPnPUId
+ * @param TDesC& aDisplayName
+ */
+ void AddCachedPrinterL(TInt aId, TDesC8& aUPnPUId, TDesC8& aDisplayName, const TInt aVendor);
+
+ /*
+ * @function ReadCacheFileL
+ * @description Reads the cached printers in iCacheBuffer
+ * NOTE: Creates the iCacheBuffer
+ */
+ void ReadCacheFileL();
+
+ /*
+ * @function FindCachedPrinterL
+ * @description Returns requested printer data from the cache file and the start
+ * and end position of the printer data in file
+ * @param TInt ID of the printer to find
+ * @param TInt& Start position of the data in file
+ * @param TInt& End position of the data in file
+ * @return TPtrC8 Printer data in buffer pointer
+ */
+ TPtrC8 FindCachedPrinterL(TInt aId, TInt& aStartPos, TInt& aEndPos);
+
+ /*
+ * @function AddCachedPrinterL
+ * @description Adds a cached printer to printer array
+ * @param TInt aId
+ * @param TDesC& aUPnPUId
+ * @param TDesC& aDisplayName
+ */
+ CUPPrinter* PrinterByIndex(TInt aIndex);
+
+
+ private:
+ // @var iPrinterArray Discovered devices
+ RPointerArray<CUPPrinter> iPrinters;
+
+ // @var iFsSession File server session
+ RFs iFsSession;
+
+
+ //@var iIdCounter Temprary id generation solution
+ TInt iIdCounter;
+
+ //@var iCacheBuffer The content of the cached file.
+ HBufC8* iCacheBuffer;
+ };
+
+#endif // CUPPRINTERCONTAINER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprintfactory.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* 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
+*
+*/
+
+
+#ifndef CUPPRINTFACTORY_H
+#define CUPPRINTFACTORY_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <upnpdevice.h>
+
+#include "cxhtmlfilecomposer.h"
+#include "cimageinfo.h"
+#include "printcapabilitycodes.h"
+#include "tprintcapability.h"
+#include "upconsts.h"
+
+/*
+* @class CUPPrintFactory
+* @description This class maps the printers between protocol client and
+* UPnP printer control point.
+*/
+NONSHARABLE_CLASS(CUPPrintFactory) : public CBase
+ {
+ public:
+ /*
+ * @function NewL
+ * @description Constructs the object
+ */
+ static CUPPrintFactory* NewL();
+
+ /*
+ * @function Destructor
+ * @description Destructor
+ */
+ ~CUPPrintFactory();
+
+ /*
+ * @function CreateXhtmlFileL
+ * @description Creates XHTML-Print template folder for printing job.
+ * @param aJobURIs Arrays of images' HTTP addresses to be printed
+ * @param aLayout Defines the print layout
+ * @param aPaperSize Paper size
+ * @param aQuality Print quality
+ * @param aXhtmlPrintFile Output parameter, which contains the filepath of created template file
+ * @param TInt& Returns the number of pages to print
+ */
+ void CreateXhtmlFileL(const RArray<CImageInfo>& aJobURIs, const TInt aLayout,
+ const TInt aPaperSize, const TInt aQuality,
+ TDes& aXhtmlPrintFile, TInt& aPageCount);
+
+ /*
+ * @function DeleteXhtmlFilesL
+ * @description Deletes all XHTML-print files files
+ */
+ void DeleteXhtmlFilesL();
+
+ /*
+ * @function FileCount
+ * @description Returns the number of the files printed at this session.
+ * Number is same as in the latest filename.
+ * @return TInt
+ */
+ TInt FileCount();
+
+ /*
+ * @function GetCapabilityIDs
+ * @description Returns the capability IDs of supported capabilities
+ * @param aCapabilityIDs Output parameter
+ */
+ void GetCapabilityIDs(RArray<TInt>& aCapabilityIDs);
+
+ /*
+ * @function GetCapability
+ * @description Returns the default value of a capability
+ * @param aCapabilityID Id of the capability
+ * @param aCapability Output parameter
+ * @return System wide error code
+ */
+ TInt GetCapability(const TInt aCapabilityID, TPrintCapability& aCapability);
+
+ /*
+ * @function GetPrintSetting
+ * @description Returns the requested capability value.
+ * If capability id is invalid KErrArgument is returned.
+ * @param TInt aCapabilityID
+ * @param TInt aValue
+ * @return TInt Error code
+ */
+ TInt GetPrintSetting(TInt aCapabilityID, TInt& aCapability);
+
+ /*
+ * @function SetPrintSetting
+ * @description Changes the value of an existing print setting.
+ * If setting is not supported KErrNotSupported is returned.
+ * @param TInt aCapabilityId
+ * @param TInt aValue
+ * @return TInt System wide error code
+ */
+ TInt SetPrintSetting(TInt aCapabilityID, TInt aValue);
+
+ protected:
+
+
+ private:
+ /*
+ * @function Constructor
+ * @description C++ constructor
+ */
+ CUPPrintFactory();
+
+ /*
+ * @function ConstructL
+ * @description Construction's second phase
+ */
+ void ConstructL();
+
+ /*
+ * @function InitCapabilities
+ * @description Initializes the supported capabilities array
+ */
+ void InitCapabilities();
+
+ /*
+ * @function GetDefaultSettingsL
+ * @description Reads default printing settings from the file.
+ * @param TInt& returns layout value
+ * @param TInt& returns size value
+ * @param TInt& returns quality value
+ */
+ void GetDefaultSettingsL(TInt& aLayout, TInt& aSize, TInt& aQuality);
+
+ /*
+ * @function SetDefaultSettingsL
+ * @description Sets the currently stored default printing settings in file.
+ */
+ void SetDefaultSettingsL();
+
+ private:
+ //@var iFileCount Counter used in XHTML-print file naming
+ TInt iFileCount;
+
+ //@var iCapabilities Capabilities/ settings supported by XHTML-print file factory
+ RArray<TPrintCapability> iCapabilities;
+
+ //@var iFileSession File session for writing job settings in file.
+ RFs iFileSession;
+ };
+
+#endif // CUPPRINTFACTORY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprintingjob.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,359 @@
+/*
+* 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 CUPPrintingJob class
+*
+*/
+
+
+#ifndef CUPPRINTINGJOB_H
+#define CUPPRINTINGJOB_H
+
+#include <e32base.h>
+#include <upnpitem.h>
+#include <upnpmediaserverclient.h>
+
+#include "upconsts.h"
+#include "tprintcapability.h"
+#include "cupprintfactory.h"
+#include "cupjobstate.h"
+
+class CUPPrinter;
+class CUPFileSharingActive;
+
+enum TUpnpContainerType
+{
+ EImageAndVideo = 0
+};
+
+
+#define KMaxIdLength 10
+
+/*
+* @class CUPPrintingJob
+* @description This class contains the necessary printing
+* job information between UPnPStack and MProtPrintingDevice
+*/
+NONSHARABLE_CLASS(CUPPrintingJob) : public CBase
+ {
+ public:
+ /*
+ * @function NewL
+ * @description Constructs the CUPPrintingJob object.
+ * NOTE: The ownership of aFileFactory does not change here!
+ * @param aPrinter Selected printer for the job
+ * @param aImages Array of images to be printed
+ * @param aFileFactory Pointer to XHTML-print file factory
+ * @param aUserName User name got from central repository
+ */
+ static CUPPrintingJob* NewL(CUPPrinter* aPrinter, RArray<TFileName>& aImages, CUPPrintFactory* aFileFactory, const TDesC8& aUserName);
+
+ /*
+ * @function Destructor
+ * @description Destroys the object and frees the memory allocated by this object
+ */
+ ~CUPPrintingJob();
+
+ /*
+ * @function SetSessionId
+ * @description Initializes the session id used for printer communication with this job
+ * @param TInt aId
+ */
+ void SetSessionId(TInt aId);
+
+ /*
+ * @function SessionId
+ * @description Returns the session id
+ * @return TInt
+ */
+ TInt SessionId();
+
+ /*
+ * @function SetJobId
+ * @description Initializes the job id
+ * @param TDesC& aId
+ */
+ void SetJobId(const TDesC8& aId);
+
+ /*
+ * @function GetJobId
+ * @description Returns the job id as const TDes8&
+ * @param const TDes8&
+ */
+ void GetJobId(TDes8& aId);
+
+ /*
+ * @function GetJobName
+ * @description Returns the file path
+ * @param TDes8&
+ */
+ void GetJobName(TDes8& aJobName);
+
+ /*
+ * @function ImageCount
+ * @description Returns the number of images in job.
+ * @return TInt
+ */
+ TInt ImageCount();
+
+ /*
+ * @function Images
+ * @description Returns job's images as CImageInfo
+ * @param RArray<CImageInfo> Output parameter
+ */
+ void Images(RArray<CImageInfo>& aImages);
+
+ /*
+ * @function PrinterId
+ * @description Returns the printer id
+ * @param TInt
+ */
+ TInt PrinterId();
+
+ /*
+ * @function ShareFileL
+ * @description Shares the images via UPnP Media Server and destroys object CUPnPItem.
+ * @param CUPnPItem* UPnP Item to share
+ */
+ void ShareFileL(CUpnpItem* aItemToShare);
+
+ /*
+ * @function ShareImagesL
+ * @description Shares the images via UPnP Media Server
+ */
+ void ShareImagesL();
+
+ /*
+ * @function UnShareImages
+ * @description Removes the sharing of all images from UPnP Media Server
+ * @return TInt System wide error code
+ */
+ TInt UnShareImages();
+
+ /*
+ * @function UnShareImages
+ * @description Removes the sharing of file from UPnP Media Server
+ * @param TInt UPnP item ID
+ * @return TInt System wide error code
+ */
+ TInt UnShareFile(TInt aItemId);
+
+ /*
+ * @function GetUserName
+ * @description Returns the user name
+ * @param TPtrC8&
+ */
+ void GetUserName(TPtrC8& aDocFormat);
+
+ /*
+ * @function SetNumsOfCopies
+ * @description Sets the number of copies for certain image.
+ * @param TInt aCapabilityId
+ * @param TInt aValue
+ * @return TInt System wide error code
+ */
+ TInt SetNumsOfCopies( const RArray<TInt>& aNumsOfCopies);
+
+ /*
+ * @function XhtmlPrintFile
+ * @description Returns the file path of generated XHTML-Print file
+ * @param TDes8&
+ */
+ void GetPrintFileL(TDes8& aPrintFile);
+
+ /*
+ * @function Sheets
+ * @description Returns the total number of sheets the job requires
+ * @return TInt
+ */
+ TInt Sheets();
+
+ /*
+ * @function Progress
+ * @description Returns the progress percentage of the job
+ * @return TInt
+ */
+ TInt Progress();
+
+ /*
+ * @function JobState
+ * @description Returns the pointer to the job state maintainer
+ * @return CUPJobState
+ */
+ CUPJobState* JobState();
+
+ /*
+ * @function JobStateReason
+ * @description Returns the reason for the job's state
+ * @return TInt
+ */
+ TInt JobStateReason();
+
+ /**
+ * StateUpdatedResponse callback function DEPRECATED
+ * @since Series60 3.1
+ * @param TDesC8& New printer state
+ * @param TDesC8& Reason for the printer state
+ * @param TDesC8& List of job ids pending at the printer queue
+ * @param TDesC8& Current job ID
+ * @param TDesC8& Number of the printed sheets
+ */
+ TUPnPState UpdateJobState(const TDesC8& aPrinterState,
+ const TDesC8& aReason,
+ const TDesC8& aJobList,
+ const TDesC8& aJobId,
+ const TDesC8& aJobMediaSheetsCompleted);
+
+ /*
+ * @function PrinterStateUpdated
+ * @description Returns the state of the job after printer state updated
+ * @param TDesC8& New printer state
+ * @return TUPnPState
+ */
+ TUPnPState PrinterStateUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function PrinterStateReasonsUpdated
+ * @description Returns the state of the job after printer state reason updated
+ * @param TDesC8& Reason for the printer state
+ * @return TUPnPState
+ */
+ TUPnPState PrinterStateReasonsUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function JobIdListUpdated
+ * @description Returns the state of the job after job ID list updated
+ * @param TDesC8& List of job ids pending at the printer queue
+ * @return TUPnPState
+ */
+ TUPnPState JobIdListUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function JobEndStateUpdatedL
+ * @description Returns the state of the job after job end state updated
+ * @param TDesC8& The end state of last printed job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,<state>
+ * @return TUPnPState
+ */
+ TUPnPState JobEndStateUpdatedL( const TDesC8& aEvent );
+
+ /*
+ * @function JobMediaSheetsCompletedUpdated
+ * @description Returns the state of the job after media sheets completed list updated
+ * @param TDesC8& Number of the printed sheets
+ * @return TUPnPState
+ */
+ TUPnPState JobMediaSheetsCompletedUpdated( const TDesC8& aEvent );
+
+ /*
+ * @function JobMediaSheetsCompletedUpdated
+ * @description Returns the state of the job after media sheets completed list updated
+ * @param TDesC8& ID of the current job
+ * @param TDesC8& Number of the printed sheets
+ * @return TUPnPState
+ */
+ TUPnPState JobMediaSheetsCompletedUpdated(const TDesC8& aId, const TDesC8& aEvent );
+
+ /*
+ * @function JobAbortStateUpdatedL
+ * @description Returns the state of the job after job abort state updated
+ * @param TDesC8& The abort state of last aborted job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,aborted,<reason>
+ * @return TUPnPState
+ */
+ TUPnPState JobAbortStateUpdatedL( const TDesC8& aEvent );
+
+ /*
+ * @function ContentCompleteListUpdated
+ * @description Returns the state of the job after content completed list updated
+ * @param TDesC8& Number of the sheets completedly received in printer
+ * @return TUPnPState
+ */
+ TUPnPState ContentCompleteListUpdated( const TDesC8& aEvent );
+
+
+
+ protected:
+ /*
+ * @function ConstructL
+ * @description Construction's second phase
+ * @param aPriner Selected printer for the job
+ * @param aImages Array of images to be printed
+ */
+ void ConstructL(CUPPrinter* aPrinter, RArray<TFileName>& aImages, const TDesC8& aUserName);
+
+ private:
+
+ /*
+ * @function CUPPrintingJob
+ * @description C++ constructor
+ * @param aPrinterId Id of the printer to be used for this job.
+ *
+ */
+ CUPPrintingJob(CUPPrintFactory* aFileFactory);
+
+ /*
+ * @function UPnPItemLC
+ * @description Returns the image's UPnP item for file sharing
+ * @param TInt Index of the image, which UPnP item is requested
+ * @param TDesC8& Name of the file used as base for UPnPItem
+ * @param TInt On return contains the UPnP item ID
+ * @return CUPnPItem*
+ */
+ CUpnpItem* UPnPItemLC(TInt aItemId, const TDesC8& aFileName, const TDesC8& aObjectType, const TDesC8& aMimeType);
+
+ private:
+
+ //@var iSessionId Session id used in sending this job to printer
+ TInt iSessionId;
+
+ //@var iJobId Id for printing job received from printer control point
+ TBuf8<KMaxIdLength> iJobId;
+
+ //@var iPrinterId Defines the printer to be used. Has to be a valid index of CUAPrinterContainer.
+ TInt iPrinterId;
+
+ //@var iUserName Name of the user (phone model)
+ TPtrC8 iUserName;
+
+ //@var iImages Job's images
+ RArray<CImageInfo> iImages;
+
+ //@var iPrintFactory Object for creating XHTML-Print file
+ CUPPrintFactory* iPrintFactory;
+
+ //@var iJobState Object to maintain job's state
+ CUPJobState* iJobState;
+
+ //@var iSheets Number of sheets to print
+ TInt iSheets;
+
+ //@var iXhtmlFileShareId ID for sharing xhtml file
+ TInt iXhtmlFileShareId;
+
+ //@var iFileSharing File sharing resource
+ CUPFileSharingActive* iFileSharing;
+
+ //@var iMediaServerClient Media server to map the file sharing resource
+ RUpnpMediaServerClient iMediaServerClient;
+
+ //@var iiMediaServerAddress media server's ip and port address.
+ TFileName8 iMediaServerAddress;
+
+ //@var iOrgMediaServerStatus mediaserver's running status before we use it.
+ TInt iOrgMediaServerStatus;
+ };
+
+#endif // CUPPRINTINGJOB_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cuptimer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,132 @@
+/*
+* 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 CUPTimer class
+*
+*/
+
+
+#ifndef CUPTIMER_H
+#define CUPTIMER_H
+
+#include <e32base.h>
+
+class CUpnpItem;
+
+class MUPTimerObserver
+ {
+ public:
+
+ /**
+ * Method which is called when timer in CUPTimer expires
+ */
+ virtual void TimerExpiredL(CUpnpItem* aItemToShare) = 0;
+ };
+
+class CUPTimer : public CActive
+ {
+
+ public:
+
+ /**
+ * Static method for creating an instance
+ * @return CUPTimer object
+ */
+ static CUPTimer* NewL();
+
+ /**
+ * Static method for creating an instance
+ * @return CUPTimer object
+ */
+ static CUPTimer* NewLC();
+
+ /**
+ * Destructor
+ */
+ ~CUPTimer();
+
+ /**
+ * Method for seting the active object active
+ */
+ void SetActiveNow();
+
+ /**
+ * RunL
+ */
+ void RunL();
+
+ /**
+ * RunError
+ * @param aError Symbian error code which should indicate what happened
+ */
+ TInt RunError(TInt aError);
+
+ /**
+ * DoCancel
+ */
+ void DoCancel();
+
+ /**
+ * Method which will wait until given microseconds have passed and then call the given callback
+ * @param aObserver Observer class which called when timer expires
+ * @param aTimeOut Interval which waited before observer is called
+ * @param aStatus Request status object
+ */
+ void WaitUntilTimeExpired(MUPTimerObserver* aObserver,
+ TTimeIntervalMicroSeconds32 aTimeOut,
+ CUpnpItem* aItemToShare);//,
+ // TRequestStatus &aStatus);
+
+ /**
+ * CPeriodic timed out when this method is called
+ * @param aPtr Any pointer
+ * @return Error code
+ */
+ static TInt TimedOut(TAny* aPtr);
+
+ /**
+ * For canceling the request
+ */
+ void CancelTimer();
+
+private:
+
+ /**
+ * ConstructL
+ */
+ void ConstructL();
+
+ /**
+ * Private constructor
+ */
+ CUPTimer();
+
+private:
+
+ /**
+ * Pointer to a observer class
+ */
+ MUPTimerObserver* iObserver;
+
+ /**
+ * Instance of periodic timer
+ */
+ CPeriodic* iTimeOutTimer;
+
+ CUpnpItem* iItemToShare;
+
+ };
+
+#endif // CUPTIMER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/mpcpobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,178 @@
+/*
+* 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 the MPCPObserver interface class
+*
+*/
+
+
+#ifndef MPCPOBSERVER_H
+#define MPCPOBSERVER_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+class CUpnpAction;
+class CUpnpService;
+class CUpnpDevice;
+class CUpnpHttpMessage;
+
+/**
+* @brief A virtual MPCPObserver class.
+*
+* @since Series60 3.1
+*/
+class MPCPObserver
+ {
+ public: // New interface functions
+
+ /**
+ * CreateJobResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void CreateJobResponse( CUpnpAction* aAction, TInt aErrorCode ) = 0;
+
+ /**
+ * CancelJobResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void CancelJobResponse( CUpnpAction* aAction, TInt aErrorCode ) = 0;
+
+ /**
+ * GetPrinterAttributesResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetPrinterAttributesResponse( CUpnpAction* aAction, TInt aErrorCode ) = 0;
+
+ /**
+ * GetJobAttributesResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetJobAttributesResponse( CUpnpAction* aAction, TInt aErrorCode ) = 0;
+
+ /**
+ * GetMarginsResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetMarginsResponse( CUpnpAction* aAction, TInt aErrorCode ) = 0;
+
+ /**
+ * GetMediaListResponse callback function
+ * @since Series60 3.1
+ * @param aAction the action
+ * @param aErrorCode System wide error code
+ */
+ virtual void GetMediaListResponse( CUpnpAction* aAction, TInt aErrorCode ) = 0;
+
+
+ /**
+ * StateUpdatedResponse callback function
+ * @since Series60 3.1
+ * @param TDesC8& New printer state
+ * @param TDesC8& Reason for the printer state
+ * @param TDesC8& List of job ids pending at the printer queue
+ * @param TDesC8& The end state of last printed job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,<state>
+ * @param TDesC8& Number of the printed sheets
+ * @param TDesC8& The abort state of last aborted job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,aborted,<reason>
+ * @param TDesC8& Number of the sheets completedly received in printer
+ */
+ virtual void StateUpdatedResponse( const TDesC8& aPrinterState,
+ const TDesC8& aPrinterStateReasons,
+ const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,
+ const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aJobAbortState,
+ const TDesC8& aContentCompleteList ) = 0;
+
+ /**
+ * DeviceDiscoveredL callback function
+ * @since Series60 3.1
+ * @param aDevice the device discovered
+ */
+ virtual void DeviceDiscoveredL( CUpnpDevice* aDevice ) = 0;
+
+ /**
+ * DeviceDisappeared callback function
+ * @since Series60 3.1
+ * @param aDevice the device disappeared
+ */
+ virtual void DeviceDisappeared( CUpnpDevice* aDevice ) = 0;
+
+ /*
+ * @function PrinterStateUpdated
+ * @description Returns the state of the job after printer state updated
+ * @param TDesC8& New printer state
+ */
+ virtual void PrinterStateUpdated( const TDesC8& aEvent ) = 0;
+
+ /*
+ * @function PrinterStateReasonsUpdated
+ * @description Returns the state of the job after printer state reason updated
+ * @param TDesC8& Reason for the printer state
+ */
+ virtual void PrinterStateReasonsUpdated( const TDesC8& aEvent ) = 0;
+
+ /*
+ * @function JobIdListUpdated
+ * @description Returns the state of the job after job ID list updated
+ * @param TDesC8& List of job ids pending at the printer queue
+ */
+ virtual void JobIdListUpdated( const TDesC8& aEvent ) = 0;
+
+ /*
+ * @function JobEndStateUpdatedL
+ * @description Returns the state of the job after job end state updated
+ * @param TDesC8& The end state of last printed job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,<state>
+ */
+ virtual void JobEndStateUpdated( const TDesC8& aEvent ) = 0;
+
+ /*
+ * @function JobMediaSheetsCompletedUpdated
+ * @description Returns the state of the job after media sheets completed list updated
+ * @param TDesC8& Number of the printed sheets
+ */
+ virtual void JobMediaSheetsCompletedUpdated( const TDesC8& aEvent ) = 0;
+
+ /*
+ * @function JobAbortStateUpdatedL
+ * @description Returns the state of the job after job abort state updated
+ * @param TDesC8& The abort state of last aborted job. Format:
+ * <id>,<name>,<originator>,<completed sheets>,aborted,<reason>
+ */
+ virtual void JobAbortStateUpdated( const TDesC8& aEvent ) = 0;
+
+ /*
+ * @function ContentCompleteListUpdated
+ * @description Returns the state of the job after content completed list updated
+ * @param TDesC8& Number of the sheets completedly received in printer
+ */
+ virtual void ContentCompleteListUpdated( const TDesC8& aEvent ) = 0;
+
+ };
+
+#endif // MPCPOBSERVER_H
+
+// End Of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/upconsts.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,237 @@
+/*
+* 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: Common constants for UPnP printing
+*
+*/
+
+
+#ifndef UPCONSTS_H
+#define UPCONSTS_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+#include "printmessagecodes.h"
+
+// Debugging
+#define _DEBUG_OUT
+
+#define KUPnPIdBase 402216
+typedef TBuf8<KMaxFileName> TFileName8;
+
+// UPnP setting names
+_LIT8(KUPnPPrintQuality, "PrintQuality");
+_LIT8(KUPnPNumberUp, "NumberUp");
+_LIT8(KUPnPMediaSize, "MediaSize");
+
+// UPnP values
+_LIT8(KUPnPDeviceSetting, "device-setting");
+_LIT8(KUPnPOne, "1");
+#define KUPnPDeviceSettingStrLength 15
+
+// Actions
+_LIT8( KCancelJob, "CancelJob" );
+_LIT8( KCreateJob, "CreateJob" );
+_LIT8( KCreateJobV2, "CreateJobV2" );
+_LIT8( KCreateURIJob, "CreateURIJob" );
+_LIT8( KGetJobAttr, "GetJobAttributes" );
+_LIT8( KGetMargins, "GetMargins" );
+_LIT8( KGetMediaList, "GetMediaList" );
+_LIT8( KGetPrinterAttr, "GetPrinterAttributes" );
+_LIT8( KGetPrinterAttrV2, "GetPrinterAttributesV2" );
+
+// Arguments
+_LIT8( KJobId, "JobId" );
+_LIT8( KJobIdList, "JobIdList" );
+_LIT8( KJobName, "JobName" );
+_LIT8( KUserName, "JobOriginatingUserName" );
+_LIT8( KCopies, "Copies" );
+_LIT8( KSides, "Sides" );
+_LIT8( KNumberUp, "NumberUp" );
+_LIT8( KOrientationRequest, "OrientationRequested" );
+_LIT8( KSize, "MediaSize" );
+_LIT8( KType, "MediaType" );
+_LIT8( KQuality, "PrintQuality" );
+_LIT8( KDataSink, "DataSink");
+_LIT8( KCriticalAttributes, "CriticalAttributesList" );
+//_LIT8( KCriticalAttributes, "A_ARG_TYPE_CriticalAttribList" );
+_LIT8( KDocFormat, "DocumentFormat" );
+_LIT8( KSourceURI, "SourceURI" );
+_LIT8( KSheetsCompleted, "JobMediaSheetsCompleted" );
+_LIT8( KPrinterState, "PrinterState" );
+_LIT8( KPrinterStateReasons, "PrinterStateReasons" );
+_LIT8( KInternetConnectState, "InternetConnectState" );
+_LIT8( KJobAbortState, "JobAbortState" );
+_LIT8( KJobEndState, "JobEndState" );
+_LIT8( KContentCompleteList, "ContentCompleteList" );
+
+_LIT8( KPrintBasic, "PrintBasic:1" );
+_LIT8( KPrintEnhanced, "PrintEnhanced:1" );
+_LIT8( KJobIdErr, "-1");
+
+// Job state
+_LIT8(KUPnPJobStateSuccessful, "successful");
+_LIT8(KUPnPJobStateAborted, "aborted");
+_LIT8(KUPnPJobStateCanceled, "canceled");
+
+// Printer states
+_LIT8(KUPnPPrinterStateIdle, "idle");
+_LIT8(KUPnPPrinterStateProcessing, "processing" );
+_LIT8(KUPnPPrinterStateStopped, "stopped");
+
+enum TUPnPState
+{
+ EJobStateSuccessful = 0,
+ EJobStateAborted,
+ EJobStateCanceled,
+ EPrinterStateIdle,
+ EPrinterStateProcessing,
+ EPrinterStateStopped,
+ EStatePrinting,
+ EStateReady,
+ EStatePending,
+ EStateUnknown
+};
+
+//UPnP PrinterStateReasons
+_LIT8(KUPnPStateNone, "none");
+_LIT8(KUPnPStateAttentionRequired, "attention-required");
+_LIT8(KUPnPStateMediaJam, "media-jam");
+_LIT8(KUPnPStatePaused, "paused");
+_LIT8(KUPnPStateDoorOpen, "door-open");
+_LIT8(KUPnPStateMediaLow, "media-low");
+_LIT8(KUPnPStateMediaEmpty, "media-empty");
+_LIT8(KUPnPStateOutputAreaAlmostFull, "output-area-almost-full");
+_LIT8(KUPnPStateOutputAreaFull, "output-area-full");
+_LIT8(KUPnPStateMarkerSupplyLow, "marker-supply-low");
+_LIT8(KUPnPStateMarkerSupplyEmpty, "marker-supply-empty");
+_LIT8(KUPnPStateMarkerFailure, "marker-failure");
+_LIT8(KUPnPStateMediaChangeRequest, "media-change-request");
+_LIT8(KUPnPStateVendorDefined, "vendor-defined");
+_LIT8(KUPnPJobStateHwError, "hardware-error");
+_LIT8(KUPnPJobStateUriNotFound, "external-access-uri-not-found");
+_LIT8(KUPnPJobStateObjectFailure, "external-access-object-failure");
+_LIT8(KUPnPJobStateFormatError, "external-access-doc-format-error");
+_LIT8(KUPnPJobStateHttpError, "external-access-http-error");
+_LIT8(KUPnPJobStateCopies, "copies");
+_LIT8(KUPnPJobStateSides, "sides");
+_LIT8(KUPnPJobStateNumberUp, "number-up");
+_LIT8(KUPnPJobStateOrientationRequested,"orientation-requested");
+_LIT8(KUPnPJobStateMediaSize, "media-size");
+_LIT8(KUPnPJobStateMediaType, "media-type");
+_LIT8(KUPnPJobStatePrintQuality, "print-quality");
+_LIT8(KUPnPJobStateTextLayout, "text-layout");
+_LIT8(KUPnPJobStateImageLayout, "image-layout");
+_LIT8(KUPnPJobStateImageOrientation, "image-orientation");
+_LIT8(KUPnPJobStatePdlFidelity, "pdl-fidelity");
+_LIT8(KUPnPJobStateFontFamily, "font-family");
+_LIT8(KUPnPJobStateFontSize, "font-size");
+
+
+// Copies
+#define KMaxCopiesLength 3
+
+// Sides
+_LIT8(KUPnPOneSided, "one-sided");
+_LIT8(KUPnPTwoSidedLongEdge, "two-sided-long-edge");
+_LIT8(KUPnPTwoSidedShortEdge, "two-sided-short-edge");
+
+// Number up
+_LIT8(KUPnP1Up, "1");
+_LIT8(KUPnP2Up, "2");
+_LIT8(KUPnP4Up, "4");
+
+// Orientations
+_LIT8(KUPnPPortrait, "portrait");
+_LIT8(KUPnPLandscape, "landscape");
+_LIT8(KUPnPReversePortrait, "reverse-portrait");
+_LIT8(KUPnPReverseLandscape,"reverse-landscape");
+
+#define KUPnP270Deg 270;
+#define KUPnPZeroDeg 0;
+#define KUPnP90Deg 90;
+#define KUPnP180Deg 180;
+
+// Media sizes
+_LIT8(KUPnPNaLetterMediaSize, "na_letter_8.5x11in");
+_LIT8(KUPnPNaLegalMediaSize, "na_legal_8.5x14in");
+_LIT8(KUPnPIsoA4MediaSize, "iso_a4_210x297mm");
+_LIT8(KUPnPIsoC5MediaSize, "iso_c5_162x229mm");
+_LIT8(KUPnPIsoD1MediaSize, "iso_d1_110x220mm");
+_LIT8(KUPnPJisB4MediaSize, "jis_b4_257x364mm");
+_LIT8(KUPnPCustomXMmMediaSize, "custom_xxx_IIIxJJJmm");
+_LIT8(KUPnPCustomXInMediaSize, "custom_xxx_IIIxJJJin");
+_LIT8(KUPnPCustomMinMmMediaSize,"custom_min_xxx_IIIxJJJmm");
+_LIT8(KUPnPCustomMaxInMediaSize,"custom_max_xxx_IIIxJJJin");
+
+// Custom sizes
+_LIT8(KUPnPCustom4x6MediaSize, "custom_xxx_4x6in");
+
+// Media types
+_LIT8(KUPnPStationeryMediaType, "stationery");
+_LIT8(KUPnPStationeryInkjetMediaType, "stationery-inkjet");
+_LIT8(KUPnPTransparencyMediaType, "transparency");
+_LIT8(KUPnPEnvelopeMediaType, "envelope");
+_LIT8(KUPnPLabelsMediaType, "labels");
+_LIT8(KUPnPPhotographicMediaType, "photographic");
+_LIT8(KUPnPCardstockMediaType, "cardstock");
+
+// Print quality
+_LIT8(KUPnPNormalPrintQuality, "normal");
+_LIT8(KUPnPDraftPrintQuality, "draft");
+_LIT8(KUPnPHighPrintQuality, "high");
+
+// Misc
+_LIT8(KUPnPDocFormat, "application/xhtml-print");
+_LIT8(KUPnPUserName, "UPnP Print"); // Use instead the KUPnPAppFriendlyName name from central repository
+_LIT( KUPnPDataPath, "c:\\system\\data\\upnp\\" );
+_LIT( KUPnPXhtmlPath, "c:\\system\\data\\upnp\\xhtml\\" );
+_LIT8(KHttpPrefix, "http://");
+_LIT8(KUPnPLineFeed8, "\n");
+_LIT( KUPnPLineFeed, "\n");
+_LIT8(KUPnPComma, ",");
+_LIT8(KUPnPColon, ":");
+_LIT8(KUPnPSlash, "/");
+
+// Upnp item type
+_LIT8(KImageType, "object.item.imageItem");
+_LIT8(KTextType, "object.item.textItem");
+
+// Mime type
+_LIT8(KJpegMime, "image/jpeg");
+_LIT8(KHtmlMime, "text/html");
+
+#define KMaxIdLength 10
+
+// Print service
+_LIT8(KUPnPServicePrint, "urn:schemas-upnp-org:service:PrintBasic:1");
+
+/*
+* @class TMapError
+* @description This class contains the mapping for a single error
+ string / ImagePrint error code.
+*/
+class TMapError
+{
+ public:
+ // @var iErrorCode ImagePrint error codes
+ TPrintMessageCodes iErrorCode;
+
+ // @var iErrorString UPnP specific error string
+ TPtrC8 iErrorString;
+};
+
+#endif // UPCONSTS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cjobstateevents.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,399 @@
+/*
+* 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 CJobStateEvents class
+*
+*/
+
+
+#include <upnpcons.h>
+
+#include "cjobstateevents.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// Constructors
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::NewL
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents* CJobStateEvents::NewL()
+{
+ CJobStateEvents *self = NewLC();
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::NewLC
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents* CJobStateEvents::NewLC()
+{
+ CJobStateEvents *self = NewLC(
+ KNullDesC8(), KNullDesC8(), KNullDesC8(), KNullDesC8(),
+ KNullDesC8(), KNullDesC8(), KNullDesC8());
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::NewL
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents* CJobStateEvents::NewL(
+ const TDesC8& aPrinterState, const TDesC8& aPrinterStateReasons, const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aContentCompleteList, const TDesC8& aJobAbortState)
+{
+ CJobStateEvents *self = NewLC(
+ aPrinterState, aPrinterStateReasons, aJobIdList,aJobEndState,
+ aJobMediaSheetsCompleted, aContentCompleteList, aJobAbortState);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::NewLC
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents* CJobStateEvents::NewLC(
+ const TDesC8& aPrinterState, const TDesC8& aPrinterStateReasons, const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aContentCompleteList, const TDesC8& aJobAbortState)
+{
+ CJobStateEvents *self = new (ELeave) CJobStateEvents();
+ CleanupStack::PushL(self);
+ self->ConstructL(
+ aPrinterState, aPrinterStateReasons, aJobIdList,aJobEndState,
+ aJobMediaSheetsCompleted, aContentCompleteList, aJobAbortState);
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::NewL
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents* CJobStateEvents::NewL(CJobStateEvents &a)
+{
+ CJobStateEvents *self = NewLC(a);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::NewLC
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents* CJobStateEvents::NewLC(CJobStateEvents &a)
+{
+ CJobStateEvents *self = new (ELeave) CJobStateEvents();
+ CleanupStack::PushL(self);
+
+ User::LeaveIfNull( a.iPrinterState );
+ User::LeaveIfNull( a.iPrinterStateReasons );
+ User::LeaveIfNull( a.iJobIdList );
+ User::LeaveIfNull( a.iJobEndState );
+ User::LeaveIfNull( a.iJobMediaSheetsCompleted );
+ User::LeaveIfNull( a.iContentCompleteList );
+ User::LeaveIfNull( a.iJobAbortState );
+
+ self->ConstructL(
+ a.iPrinterState->Des(), a.iPrinterStateReasons->Des(), a.iJobIdList->Des(), a.iJobEndState->Des(),
+ a.iJobMediaSheetsCompleted->Des(), a.iContentCompleteList->Des(), a.iJobAbortState->Des());
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::ConstructL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+void CJobStateEvents::ConstructL(
+ const TDesC8& aPrinterState, const TDesC8& aPrinterStateReasons, const TDesC8& aJobIdList,
+ const TDesC8& aJobEndState,const TDesC8& aJobMediaSheetsCompleted,
+ const TDesC8& aContentCompleteList, const TDesC8& aJobAbortState)
+{
+ Delete();
+ iPrinterState = aPrinterState.AllocL();
+ iPrinterStateReasons = aPrinterStateReasons.AllocL();
+ iJobIdList = aJobIdList.AllocL();
+ iJobEndState = aJobEndState.AllocL();
+ iJobMediaSheetsCompleted = aJobMediaSheetsCompleted.AllocL();
+ iContentCompleteList = aContentCompleteList.AllocL();
+ iJobAbortState = aJobAbortState.AllocL();
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::ConstructL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+void CJobStateEvents::ConstructL(CJobStateEvents &a)
+{
+ ConstructL(
+ a.iPrinterState->Des(), a.iPrinterStateReasons->Des(), a.iJobIdList->Des(), a.iJobEndState->Des(),
+ a.iJobMediaSheetsCompleted->Des(), a.iContentCompleteList->Des(), a.iJobAbortState->Des());
+}
+
+// publics
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::ChangedEventL
+// -----------------------------------------------------------------------------
+//
+TBool CJobStateEvents::ChangedEventL(const TDesC8 &aEvent, TJobStateEvent aEnum)
+{
+ TBool changed(EFalse);
+
+ switch( aEnum )
+ {
+ case EPrinterState:
+ if(iPrinterState)
+ {
+ if(0 != aEvent.Compare(iPrinterState->Des()))
+ {
+ delete iPrinterState;
+ iPrinterState = NULL;
+ }
+ else break;
+ }
+ iPrinterState = aEvent.AllocL();
+ changed = ETrue;
+ break;
+ case EPrinterStateReasons:
+ if(iPrinterStateReasons)
+ {
+ if(0 != aEvent.Compare(iPrinterStateReasons->Des()))
+ {
+ delete iPrinterStateReasons;
+ iPrinterStateReasons = NULL;
+ }
+ else break;
+ }
+ iPrinterStateReasons = aEvent.AllocL();
+ changed = ETrue;
+ break;
+ case EJobIdList:
+ if(iJobIdList)
+ {
+ if(0 != aEvent.Compare(iJobIdList->Des()))
+ {
+ delete iJobIdList;
+ iJobIdList = NULL;
+ }
+ else break;
+ }
+ iJobIdList = aEvent.AllocL();
+ changed = ETrue;
+ break;
+ case EJobEndState:
+ if(iJobEndState)
+ {
+ if(0 != aEvent.Compare(iJobEndState->Des()))
+ {
+ delete iJobEndState;
+ iJobEndState = NULL;
+ }
+ else break;
+ }
+ iJobEndState = aEvent.AllocL();
+ changed = ETrue;
+ break;
+ case EJobMediaSheetsCompleted:
+ if(iJobMediaSheetsCompleted)
+ {
+ if(0 != aEvent.Compare(iJobMediaSheetsCompleted->Des()))
+ {
+ delete iJobMediaSheetsCompleted;
+ iJobMediaSheetsCompleted = NULL;
+ }
+ else break;
+ }
+ iJobMediaSheetsCompleted = aEvent.AllocL();
+ changed = ETrue;
+ break;
+ case EContentCompleteList:
+ ContentCompleteL( aEvent, changed );
+ break;
+ case EJobAbortState:
+ JobAbortStateL( aEvent, changed );
+ break;
+ default:
+ break;
+ }
+ return changed;
+}
+void CJobStateEvents::ContentCompleteL ( const TDesC8 &aEvent, TBool& aChanged )
+ {
+ if(iContentCompleteList)
+ {
+ if(0 != aEvent.Compare(iContentCompleteList->Des()))
+ {
+ delete iContentCompleteList;
+ iContentCompleteList = NULL;
+ }
+ else return;
+ }
+ iContentCompleteList = aEvent.AllocL();
+ aChanged = ETrue;
+
+ }
+
+void CJobStateEvents::JobAbortStateL ( const TDesC8 &aEvent, TBool& aChanged )
+ {
+ if(iJobAbortState)
+ {
+ if(0 != aEvent.Compare(iJobAbortState->Des()))
+ {
+ delete iJobAbortState;
+ iJobAbortState = NULL;
+ }
+ else return;
+ }
+ iJobAbortState = aEvent.AllocL();
+ aChanged = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::~CJobStateEvents
+// C++ destructor
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents::~CJobStateEvents()
+{
+ Delete();
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::Delete
+// -----------------------------------------------------------------------------
+//
+void CJobStateEvents::Delete()
+{
+ if(iPrinterState)
+ delete iPrinterState;
+ iPrinterState = NULL;
+
+ if(iPrinterStateReasons)
+ delete iPrinterStateReasons;
+ iPrinterStateReasons = NULL;
+
+ if(iJobIdList)
+ delete iJobIdList;
+ iJobIdList = NULL;
+
+ if(iJobEndState)
+ delete iJobEndState;
+ iJobEndState = NULL;
+
+ if(iJobMediaSheetsCompleted)
+ delete iJobMediaSheetsCompleted;
+ iJobMediaSheetsCompleted = NULL;
+
+ if(iContentCompleteList)
+ delete iContentCompleteList;
+ iContentCompleteList = NULL;
+
+ if(iJobAbortState)
+ delete iJobAbortState;
+ iJobAbortState = NULL;
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::InitL
+// -----------------------------------------------------------------------------
+//
+void CJobStateEvents::InitL()
+{
+ Delete();
+ iPrinterState = KNullDesC8().AllocL();
+ iPrinterStateReasons = KNullDesC8().AllocL();
+ iJobIdList = KNullDesC8().AllocL();
+ iJobEndState = KNullDesC8().AllocL();
+ iJobMediaSheetsCompleted = KNullDesC8().AllocL();
+ iContentCompleteList = KNullDesC8().AllocL();
+ iJobAbortState = KNullDesC8().AllocL();
+}
+
+// operators
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::operator==
+// -----------------------------------------------------------------------------
+//
+TBool CJobStateEvents::operator==(const CJobStateEvents& a)
+{
+ if ( iPrinterState && a.iPrinterState )
+ {
+ if(0 != a.iPrinterState->Compare(iPrinterState->Des()))
+ return EFalse;
+ }else return EFalse;
+ if( iPrinterStateReasons && a.iPrinterStateReasons )
+ {
+ if(0 != a.iPrinterStateReasons->Compare(iPrinterStateReasons->Des()))
+ return EFalse;
+ }
+ if( iJobIdList && a.iJobIdList )
+ {
+ if(0 != a.iJobIdList->Compare(iJobIdList->Des()))
+ return EFalse;
+ }else return EFalse;
+ if( iJobEndState && a.iJobEndState )
+ {
+ if(0 != a.iJobEndState->Compare(iJobEndState->Des()))
+ return EFalse;
+ }else return EFalse;
+ if( iJobMediaSheetsCompleted && a.iJobMediaSheetsCompleted )
+ {
+ if(0 != a.iJobMediaSheetsCompleted->Compare(iJobMediaSheetsCompleted->Des()))
+ return EFalse;
+ }else return EFalse;
+ if( iContentCompleteList && a.iContentCompleteList )
+ {
+ if(0 != a.iContentCompleteList->Compare(iContentCompleteList->Des()))
+ return EFalse;
+ }else return EFalse;
+ if( iJobAbortState && a.iJobAbortState )
+ {
+ if(0 != a.iJobAbortState->Compare(iJobAbortState->Des()))
+ return EFalse;
+ }else return EFalse;
+
+ return ETrue;
+}
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::operator!=
+// -----------------------------------------------------------------------------
+//
+TBool CJobStateEvents::operator!=(const CJobStateEvents& a)
+{
+ return *this == a ? EFalse : ETrue;
+}
+
+// protected
+
+// -----------------------------------------------------------------------------
+// CJobStateEvents::CJobStateEvents
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CJobStateEvents::CJobStateEvents()
+{
+}
+
+// End Of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cprintercontrolpoint.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,884 @@
+/*
+* 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 CPrinterControlPoint class
+*
+*/
+
+
+#include <f32file.h>
+#include <in_sock.h>
+#include <upnpservice.h>
+#include <upnpdevice.h>
+#include <upnpaction.h>
+#include <upnphttpmessagefactory.h>
+
+#include "cuplogger.h"
+#include "cprintercontrolpoint.h"
+#include "mpcpobserver.h"
+
+// CONSTANTS
+#define KMaxCancelReqs 100
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::NewL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPrinterControlPoint* CPrinterControlPoint::NewL(MPCPObserver& aPCPObserver)
+{
+ LOG("[CPrinterControlPoint] \tCPrinterControlPoint::NewL");
+ CPrinterControlPoint* self = new (ELeave) CPrinterControlPoint( aPCPObserver);
+ CleanupStack::PushL( self );
+ self -> ConstructL( );
+ CleanupStack::Pop( self );
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::CPrinterControlPoint
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CPrinterControlPoint::CPrinterControlPoint( MPCPObserver& aPCPObserver)
+ : CUpnpControlPoint(), iPCPObserver( aPCPObserver )
+{
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::ConstructL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+void CPrinterControlPoint::ConstructL()
+{
+ LOG("[CPrinterControlPoint] \tCPrinterControlPoint::ConstructL");
+ _LIT8( KPrinter, "Printer:1" );
+
+ // Base class ConstructL
+ CUpnpControlPoint::ConstructL( KPrinter());
+
+ // Share Xhtml folder (create if necessary)
+ RFs fsSession;
+ User::LeaveIfError( fsSession.Connect() );
+ CleanupClosePushL( fsSession );
+ TInt err = fsSession.MkDirAll( KUPnPXhtmlPath() );
+ if (err != KErrNone && err != KErrAlreadyExists)
+ {
+ User::Leave(err);
+ }
+ CleanupStack::PopAndDestroy(&fsSession);
+
+ iJobStateEvents = NULL;
+
+ // Start printer search
+ TPtrC8 device_ptr;
+ device_ptr.Set( KPrinterDevice );
+ SearchL( device_ptr );
+
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::~CPrinterControlPoint
+// C++ default destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPrinterControlPoint::~CPrinterControlPoint()
+{
+ LOG("[CPrinterControlPoint] \tCPrinterControlPoint::~CPrinterControlPoint()");
+ iCancelledJobSIDs.Close();
+
+ if(iJobStateEvents)
+ {
+ delete iJobStateEvents;
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::CreateJobL
+// Create printer job
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CPrinterControlPoint::CreateJobL( CUpnpDevice* aPrinter, const TDesC8& aPrintFile,
+ const TDesC8& aUserName, const TDesC8& aCopies, const TDesC8& aSides,
+ const TDesC8& aNumberUp, const TDesC8& aOrientationRequest, const TDesC8& aMediaSize,
+ const TDesC8& aMediaType, const TDesC8& aPrintQuality, TBool aPrintBasic )
+{
+ LOG("[CPrinterControlPoint] \tCPrinterControlPoint::CreateJobL");
+
+ if(!aPrinter)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ if(iJobStateEvents)
+ {
+ iJobStateEvents->InitL();
+ }
+ else
+ {
+ iJobStateEvents = CJobStateEvents::NewL();
+ }
+
+ // Set printer as authorized device
+ // - remove the previous printer address from allowed list
+ // - add the current printer address to allowed list
+
+ TBuf8<20> logStr;
+ CUpnpHttpMessage::AddrOutput(aPrinter->Address(), logStr);
+ LOG81("[CPrinterControlPoint::CreateJobL]/t Printer address: %S", &logStr);
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+
+ if (serviceType == EServiceNone)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ if (aPrintBasic)
+ {
+ // Force to use PrintBasic:1
+ serviceType = EPrintBasic;
+ }
+
+ // PrintBasic:1 or PrintEnhanced:1 supported
+ SubscribeL( service );
+ CUpnpAction* action;
+
+ // Create action according to service type
+
+ if (serviceType == EPrintEnhanced)
+ {
+ LOG("[CPrinterControlPoint] \t -PrintEnhanced:1 - CreateJobV2");
+ action = service->CreateActionLC( KCreateJobV2 );
+ }
+
+ else // serviceType == EPrintBasic
+ {
+ LOG("[CPrinterControlPoint] \t -PrintBasic:1 - CreateJob");
+ action = service->CreateActionLC( KCreateJob() );
+ }
+
+ User::LeaveIfNull(action);
+
+ // Common arguments for both action types
+ User::LeaveIfError(action -> SetArgumentL( KJobName, aPrintFile ));
+ User::LeaveIfError(action -> SetArgumentL( KUserName, aUserName));
+ User::LeaveIfError(action -> SetArgumentL( KDocFormat, KUPnPDocFormat() ));
+ User::LeaveIfError(action -> SetArgumentL( KCopies, aCopies ));
+ User::LeaveIfError(action -> SetArgumentL( KSides, aSides ));
+ User::LeaveIfError(action -> SetArgumentL( KNumberUp, aNumberUp ));
+ User::LeaveIfError(action -> SetArgumentL( KOrientationRequest, aOrientationRequest ));
+ User::LeaveIfError(action -> SetArgumentL( KSize, aMediaSize ));
+ User::LeaveIfError(action -> SetArgumentL( KType, aMediaType ));
+ User::LeaveIfError(action -> SetArgumentL( KQuality, aPrintQuality ));
+
+ if (serviceType == EPrintEnhanced)
+ {
+ // Fill in the rest arguments
+ User::LeaveIfError(action->SetArgumentL( KCriticalAttributes, KNullDesC8() ));
+ }
+
+ // Send action
+ SendL( action );
+
+ // return session id
+ TInt sessionId = action->SessionId();
+ CleanupStack::Pop(); // action
+ return sessionId;
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::PrintingFinishedL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::PrintingFinishedL( CUpnpDevice* aPrinter )
+{
+
+ LOG("[CPrinterControlPoint::PrintingFinishedL] \t");
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+ if (serviceType == EServiceNone)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ // Service is PrintBasic:1 or PrintEnhanced:1 - Unsubscribe
+ UnsubscribeL(service);
+
+ LOG("[CPrinterControlPoint::PrintingFinishedL] \t - unsubscribed... ...deleting event");
+
+ // init job state events
+ if ( iJobStateEvents )
+ {
+ iJobStateEvents->InitL();
+ }
+ // Remove last printer address from allowed list
+
+ LOG("[CPrinterControlPoint::PrintingFinishedL] \t - out");
+}
+
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::CancelJobL
+// Cancel printer job
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::CancelJobL( CUpnpDevice* aPrinter,
+ const TDesC8& aJobId )
+{
+
+ LOG81("[CPrinterControlPoint] \tCPrinterControlPoint::CancelJobL %S", &aJobId);
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+ if (serviceType == EServiceNone)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ // Service is PrintBasic:1 or PrintEnhanced:1
+ DoCancelJobL(*service, aJobId);
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::CancelJobL
+// Cancel printer job by session id
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::CancelJobL( const TInt aSessionId )
+{
+
+ LOG1("[CPrinterControlPoint::CancelJobL] \t by session id %d", aSessionId);
+
+ // Add id to cancelled jobs - nothing else to do at this point
+ // Actual cancelling is done when a message with this session id and job id is received from printer
+ iCancelledJobSIDs.AppendL(aSessionId);
+
+ // If number of pending cancel request exceeds KMaxCancelReqs delete the oldest request
+ if (iCancelledJobSIDs.Count() > KMaxCancelReqs)
+ {
+ iCancelledJobSIDs.Remove(0);
+ }
+
+
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::GetPrinterAttributesL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::GetPrinterAttributesL( CUpnpDevice* aPrinter )
+{
+
+ LOG("[CPrinterControlPoint::GetPrinterAttributesL]");
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+ if (serviceType == EServiceNone)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ if( serviceType == EPrintBasic )
+ {
+ CUpnpAction* action = service -> CreateActionLC( KGetPrinterAttr );
+ User::LeaveIfNull(action);
+ SendL( action );
+ CleanupStack::Pop(); // action
+ }
+
+ if( serviceType == EPrintEnhanced )
+ {
+ CUpnpAction* action = service -> CreateActionLC( KGetPrinterAttrV2 );
+ User::LeaveIfNull(action);
+ SendL( action );
+ CleanupStack::Pop(); // action
+ }
+
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::GetMarginsL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::GetMarginsL( CUpnpDevice* aPrinter, const TDesC8& aMediaSize, const TDesC8& aMediaType )
+{
+
+ LOG("[CPrinterControlPoint::GetMarginsL]");
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+ if( serviceType == EPrintEnhanced )
+ {
+ CUpnpAction* action = service -> CreateActionLC( KGetMargins );
+ User::LeaveIfNull(action);
+ User::LeaveIfError(action -> SetArgumentL( KSize, aMediaSize ));
+ User::LeaveIfError(action -> SetArgumentL( KType, aMediaType));
+ SendL( action );
+ CleanupStack::Pop(); // action
+ }
+ else
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::GetMarginsL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::GetMediaListL( CUpnpDevice* aPrinter, const TDesC8& aMediaSize, const TDesC8& aMediaType )
+{
+
+ LOG("[CPrinterControlPoint::GetMediaListL]");
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+ if( serviceType == EPrintEnhanced )
+ {
+ CUpnpAction* action = service -> CreateActionLC( KGetMediaList );
+ User::LeaveIfNull(action);
+ User::LeaveIfError(action -> SetArgumentL( KSize, aMediaSize ));
+ User::LeaveIfError(action -> SetArgumentL( KType, aMediaType));
+ SendL( action );
+ CleanupStack::Pop(); // action
+ }
+ else
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::GetJobAttributesL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::GetJobAttributesL( CUpnpDevice* aPrinter,
+ const TDesC8& aJobId )
+{
+
+ LOG("[CPrinterControlPoint::GetJobAttributesL]");
+
+ // Check services
+ TPrintService serviceType;
+ CUpnpService* service = GetServiceFromDevice( aPrinter, serviceType );
+
+ if (serviceType == EServiceNone)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ CUpnpAction* action = service -> CreateActionLC( KGetJobAttr );
+ User::LeaveIfNull(action);
+ User::LeaveIfError(action -> SetArgumentL( KJobId, aJobId ));
+ SendL( action );
+ CleanupStack::Pop(); // action
+
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::StateUpdatedL
+// From ControlPoint
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::StateUpdatedL( CUpnpService* aService )
+{
+ // Seven evented state variables (see PrintEnhanced:1 and PrintBasic:1 specification for details):
+ // PrinterState, PrinterStateReasons, JobIdList, JobEndState,
+ // JobMediaSheetsConpleted, JobAbortState and ContentCompleteList
+
+ // JobEndState == JobId,JobName,JobOriginatingUser,
+ // JobMediaSheetsConpleted,job-completion-state
+
+ LOG("[CPrinterControlPoint::StateUpdatedL]");
+
+ User::LeaveIfNull(aService);
+
+ JobStateLog(aService);
+
+ CUpnpStateVariable* prntState = aService->StateVariable( KPrinterState() );
+ CUpnpStateVariable* prntStateReasons = aService->StateVariable( KPrinterStateReasons() );
+ CUpnpStateVariable* jobIdList = aService->StateVariable( KJobIdList() );
+ CUpnpStateVariable* jobEndState = aService->StateVariable( KJobEndState() );
+ CUpnpStateVariable* sheets = aService->StateVariable( KSheetsCompleted() );
+
+ // The next ones are supported only in PrintEnhanced:1
+ CUpnpStateVariable* jobAbortState = aService->StateVariable( KJobAbortState() );
+ CUpnpStateVariable* contentCompList = aService->StateVariable( KContentCompleteList() );
+
+ if ( iJobStateEvents )
+ {
+ if( prntState )
+ {
+ TPtrC8 ptr = RemoveTags( prntState->Value());
+ if(iJobStateEvents->ChangedEventL(ptr, CJobStateEvents::EPrinterState))
+ iPCPObserver.PrinterStateUpdated( ptr );
+ }
+ if ( prntStateReasons )
+ {
+ TPtrC8 ptr = RemoveTags( prntStateReasons->Value());
+ if(iJobStateEvents->ChangedEventL(ptr, CJobStateEvents::EPrinterStateReasons))
+ iPCPObserver.PrinterStateReasonsUpdated( ptr );
+ }
+
+ if ( jobIdList )
+ {
+ TPtrC8 ptr = RemoveTags( jobIdList->Value());
+ if(iJobStateEvents->ChangedEventL( ptr, CJobStateEvents::EJobIdList))
+ iPCPObserver.JobIdListUpdated( ptr );
+ }
+
+ if ( jobEndState )
+ {
+ TPtrC8 ptr = RemoveTags( jobEndState->Value());
+ if(iJobStateEvents->ChangedEventL( ptr, CJobStateEvents::EJobEndState))
+ iPCPObserver.JobEndStateUpdated( ptr );
+ }
+
+ if ( sheets )
+ {
+ TPtrC8 ptr = RemoveTags( sheets->Value());
+ if(iJobStateEvents->ChangedEventL(ptr, CJobStateEvents::EJobMediaSheetsCompleted))
+ iPCPObserver.JobMediaSheetsCompletedUpdated( ptr );
+ }
+
+ if ( jobAbortState )
+ {
+ TPtrC8 ptr = RemoveTags( jobAbortState->Value());
+ if(iJobStateEvents->ChangedEventL(ptr, CJobStateEvents::EContentCompleteList))
+ iPCPObserver.JobAbortStateUpdated( ptr );
+ }
+
+ if ( contentCompList )
+ {
+ TPtrC8 ptr = RemoveTags( contentCompList->Value());
+ if(iJobStateEvents->ChangedEventL( ptr, CJobStateEvents::EJobAbortState))
+ iPCPObserver.ContentCompleteListUpdated( ptr );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::DeviceDiscoveredL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::DeviceDiscoveredL( CUpnpDevice* aDevice)
+{
+ LOG("[CPrinterControlPoint::DeviceDiscoveredL]");
+ iPCPObserver.DeviceDiscoveredL( aDevice );
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::DeviceDisappearedL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::DeviceDisappearedL( CUpnpDevice* aDevice )
+{
+ LOG("[CPrinterControlPoint::DeviceDisappearedL]");
+ iPCPObserver.DeviceDisappeared( aDevice );
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::ActionResponseReceivedL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::ActionResponseReceivedL( CUpnpAction* aAction )
+{
+ User::LeaveIfNull(aAction);
+
+ LOG8S("[CPrinterControlPoint::ActionResponseReceivedL]\t - action: ", aAction->Name());
+
+ // First check out for pending cancel responses (ie. cancel requestes with session id)
+ TInt sessionId = aAction->SessionId();
+ TInt index = iCancelledJobSIDs.Find(sessionId);
+
+ if ( index >= 0 )
+ {
+ // Cancel requested for this session's job
+ const TDesC8& jobId = aAction->ArgumentValue( KJobId() );
+
+ if (jobId.Length() > 0)
+ {
+ LOG("[CPrinterControlPoint::ActionResponseReceivedL] \t - Executing session id based canceling");
+ DoCancelJobL( aAction->Service(), jobId);
+
+ // Remove "queued" cancel job's session id from array
+ iCancelledJobSIDs.Remove(index);
+
+ // No need to handle create job responses for this job id since it was canceled
+ if(( aAction->Name().Compare( KCreateJob ) == 0 ) ||
+ ( aAction->Name().Compare( KCreateURIJob ) == 0))
+ {
+ return;
+ }
+ }
+ }
+
+ TInt err = KErrNone;
+ if( EHttp200Ok != aAction->Error() )
+ {
+ err = aAction->Error();
+ }
+
+ // Check CreateJobResponse
+ if( aAction->Name().Compare( KCreateJob ) == 0 || aAction->Name().Compare( KCreateJobV2 ) == 0 )
+ {
+ if( KErrNone == err )
+ {
+ const TDesC8& jobName = aAction->ArgumentValue( KJobName() );
+ const TDesC8& dataSinkUrl = aAction->ArgumentValue( KDataSink() );
+
+ // Send XHTML-print data (print data) via HTTP POST
+
+ LOG("[CPrinterControlPoint] \t - Sending XHTML-print data via HTTP POST");
+ TInetAddr addr;
+ CUpnpHttpMessage::AddrInput(addr, DataSinkUrlAddress( dataSinkUrl ));
+ addr.SetPort( DataSinkUrlPort( dataSinkUrl ) );
+
+ CUpnpHttpMessage* printDataMessage;
+ //CUpnpHttpMessage* printPictureMessage;
+
+
+ printDataMessage = RUpnpHttpMessageFactory::HttpPostL( addr, DataSinkUrlPath( dataSinkUrl ) );
+
+ //printPictureMessage = RUpnpHttpMessageFactory::HttpPostL( addr, DataSinkUrlPath( dataSinkUrl ) );
+
+ TFileName8 filePath;
+ filePath.Copy( KUPnPXhtmlPath() );
+ filePath.Append(jobName);
+ printDataMessage->SetOutFilenameL( filePath );
+
+ TRAP(err, SendL( printDataMessage ));
+
+ }
+
+ iPCPObserver.CreateJobResponse( aAction, err );
+
+
+ LOG1("[CPrinterControlPoint] \t - HTTP POST returns: %d", err);
+ }
+ else if( aAction->Name().Compare( KCreateURIJob ) == 0 )
+ {
+ iPCPObserver.CreateJobResponse( aAction, err );
+ }
+ else if( aAction->Name().Compare( KCancelJob ) == 0 )
+ {
+ iPCPObserver.CancelJobResponse( aAction, err );
+ }
+ else if( aAction->Name().Compare( KGetPrinterAttr ) == 0 )
+ {
+ iPCPObserver.GetPrinterAttributesResponse( aAction, err );
+ }
+ else if( aAction->Name().Compare( KGetPrinterAttrV2 ) == 0 )
+ {
+ iPCPObserver.GetPrinterAttributesResponse( aAction, err );
+ }
+ else if( aAction->Name().Compare( KGetJobAttr ) == 0 )
+ {
+ iPCPObserver.GetJobAttributesResponse( aAction, err );
+ }
+ else if( aAction->Name().Compare( KGetMargins ) == 0 )
+ {
+ iPCPObserver.GetMarginsResponse( aAction, err );
+ }
+ else if( aAction->Name().Compare( KGetMediaList ) == 0 )
+ {
+ iPCPObserver.GetMediaListResponse( aAction, err );
+ }
+ else
+ {
+ //to avoid lint error
+ }
+
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::HttpResponseReceivedL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPrinterControlPoint::HttpResponseReceivedL(
+ CUpnpHttpMessage* aMessage )
+{
+ LOG("[CPrinterControlPoint::HttpResponseReceivedL] \t");
+ if(aMessage)
+ {
+ LOG1( "[CPrinterControlPoint] \t - HTTP Response: %d", aMessage->Error() );
+ }
+}
+
+// private functions
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::GetServiceFromDevice
+// -----------------------------------------------------------------------------
+//
+CUpnpService* CPrinterControlPoint::GetServiceFromDevice( CUpnpDevice* aPrinter, TPrintService& aService )
+{
+ LOG("[CPrinterControlPoint::GetServiceFromDevice]");
+ CUpnpService* service = NULL;
+ aService = EServiceNone;
+
+ if(!aPrinter)
+ {
+ return service;
+ }
+
+ const RPointerArray<CUpnpDevice>& devices = DeviceList();
+
+ //Search of printer device
+ for( TInt i = 0; i < devices.Count(); i++ )
+ {
+ if( devices[i]->DeviceType().Compare( aPrinter->DeviceType() ) == 0 &&
+ devices[i]->Uuid().Compare( aPrinter->Uuid() ) == 0 )
+ {
+ // Printer found - search of services
+ RPointerArray<CUpnpService>& services = devices[i]->ServiceList();
+
+ for( TInt j = 0; j < services.Count(); j++ )
+ {
+ //PrintBasic:1
+ if( services[j]->ServiceType().Compare( KPrintBasic ) == 0 )
+ {
+ aService = EPrintBasic;
+ service = services[j];
+ continue; // Continue to search for PrintEnhanced:1
+ }
+
+ // PrintEnhanced:1
+ if( services[j]->ServiceType().Compare( KPrintEnhanced ) == 0 )
+ {
+ aService = EPrintEnhanced;
+ service = services[j];
+ break;
+ }
+
+ }
+ break;
+ }
+ }
+
+ return service;
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::DataSinkUrlAddress
+// -----------------------------------------------------------------------------
+//
+const TPtrC8 CPrinterControlPoint::DataSinkUrlAddress( const TDesC8& aDataSinkUrl )
+{
+ LOG("[CPrinterControlPoint::DataSinkUrlAddress] \t");
+
+ if ( aDataSinkUrl.Length() > UpnpHTTP::KHTTPUrl().Length() )
+ {
+ TPtrC8 addrAndPath = aDataSinkUrl.Right(aDataSinkUrl.Length()-UpnpHTTP::KHTTPUrl().Length());
+ TInt index = addrAndPath.Find( KUPnPColon() );
+ if ( index == KErrNotFound )
+ {
+ index = addrAndPath.Find( KUPnPSlash() );
+ }
+
+ if ( index == KErrNotFound )
+ {
+ return TPtrC8( KNullDesC8().Ptr(), 0);
+ }
+
+ TPtrC8 addr = addrAndPath.Left( index );
+
+ return addr;
+ }
+
+ return TPtrC8( KNullDesC8().Ptr(), 0);
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::DataSinkUrlPath
+// -----------------------------------------------------------------------------
+//
+const TPtrC8 CPrinterControlPoint::DataSinkUrlPath( const TDesC8& aDataSinkUrl )
+{
+ LOG("[CPrinterControlPoint::DataSinkUrlPath] \t");
+
+ if ( aDataSinkUrl.Length() > KHttpPrefix().Length() )
+ {
+ TPtrC8 addrAndPath = aDataSinkUrl.Right(aDataSinkUrl.Length()-KHttpPrefix().Length());
+ TPtrC8 addr;
+
+ // Find slash from URL and remove it, if it exists.
+ TInt index = addrAndPath.Find( KUPnPSlash() );
+ // If not found, assume that path is right as is
+ if ( index == KErrNotFound )
+ {
+ addr.Set( addrAndPath.Right( addrAndPath.Length() ) );
+ }
+ // Slash found, copy data after it
+ else
+ {
+ addr.Set( addrAndPath.Right( addrAndPath.Length() - index ) );
+ }
+ return addr;
+ }
+ else
+ {
+ return TPtrC8( KNullDesC8().Ptr(), 0);
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::DataSinkUrlPort
+//
+// -----------------------------------------------------------------------------
+//
+TInt CPrinterControlPoint::DataSinkUrlPort( const TDesC8& aDataSinkUrl )
+{
+ LOG("[CPrinterControlPoint::DataSinkUrlPort] \t");
+
+ if (aDataSinkUrl.Length() > KHttpPrefix().Length())
+ {
+ TPtrC8 addrAndPath = aDataSinkUrl.Right(aDataSinkUrl.Length()-KHttpPrefix().Length());
+ TInt separIndex = addrAndPath.Find( KUPnPColon );
+ if ( separIndex == KErrNotFound )
+ {
+ return KDefaultHttpPortNumber;
+ }
+ TInt slashIndex = addrAndPath.Find( KUPnPSlash() );
+ if ( slashIndex != -1 )
+ {
+ TPtrC8 port = addrAndPath.Mid( separIndex+1, slashIndex-separIndex );
+
+ TLex8 lex( port );
+ TInt prt;
+ lex.Val( prt );
+
+ return prt;
+ }
+ else
+ {
+ TPtrC8 port = addrAndPath.Right( addrAndPath.Length()-separIndex-1 );
+
+ TLex8 lex( port );
+ TInt prt;
+ lex.Val( prt );
+
+ return prt;
+ }
+ }
+ return KDefaultHttpPortNumber;
+}
+
+
+// -----------------------------------------------------------------------------
+// CPrinterControlPoint::DoCancelJobL
+//
+// -----------------------------------------------------------------------------
+//
+void CPrinterControlPoint::DoCancelJobL(CUpnpService& aService, const TDesC8& aJobId)
+{
+ LOG("[CPrinterControlPoint::DoCancelJobL]");
+ CUpnpAction* action = aService.CreateActionLC( KCancelJob );
+ User::LeaveIfNull(action);
+ User::LeaveIfError(action->SetArgumentL( KJobId, aJobId ));
+ SendL( action );
+ CleanupStack::Pop(); // action
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrinterControlPoint::RemoveTags
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CPrinterControlPoint::RemoveTags( const TDesC8& aString)
+{
+ LOG("[CPrinterControlPoint::RemoveTags]\t");
+ _LIT8(KUPnPStartTag, ">");
+ _LIT8(KUPnPEndTag, "</");
+ _LIT8(KUPnPEmptyTag, "<*/>");
+
+ TPtrC8 midPtr;
+ midPtr.Set(aString);
+
+ // Return if no tags
+ TInt startPos = aString.Find(KUPnPStartTag());
+ if(KErrNotFound == startPos)
+ {
+ return midPtr;
+ }
+
+ // Return if empty
+ if(KErrNotFound < aString.Match(KUPnPEmptyTag()))
+ {
+ return TPtrC8( KNullDesC8().Ptr(), 0);
+ }
+
+ // Return the mid of tags
+ startPos += KUPnPStartTag().Length();
+
+ TInt endPos = aString.Find(KUPnPEndTag());
+ if(KErrNotFound == endPos)
+ {
+ return midPtr;
+ }
+
+ midPtr.Set(aString.Mid(startPos, endPos - startPos));
+ return midPtr;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CPrinterControlPoint::RemoveTags
+//
+//--------------------------------------------------------------------------------------------
+void CPrinterControlPoint::JobStateLog(CUpnpService* aService)
+{
+ if(!aService)
+ {
+ return;
+ }
+ LOG81("CPrinterControlPoint::JobStateLog\t prntState\t\t : %S", &(aService->StateVariable( KPrinterState() )->Value()));
+ LOG81("CPrinterControlPoint::JobStateLog\t prntStateReasons: %S", &(aService->StateVariable( KPrinterStateReasons() )->Value()));
+ LOG81("CPrinterControlPoint::JobStateLog\t jobIdList\t\t : %S", &(aService->StateVariable( KJobIdList() )->Value()));
+ LOG81("CPrinterControlPoint::JobStateLog\t jobEndState\t : %S", &(aService->StateVariable( KJobEndState() )->Value()));
+ LOG81("CPrinterControlPoint::JobStateLog\t sheets\t\t\t : %S", &(aService->StateVariable( KSheetsCompleted() )->Value()));
+ LOG81("CPrinterControlPoint::JobStateLog\t jobAbortState\t : %S", &(aService->StateVariable( KJobAbortState() )->Value()));
+ LOG81("CPrinterControlPoint::JobStateLog\t contentCompList : %S", &(aService->StateVariable( KContentCompleteList() )->Value()));
+}
+
+// End Of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupfilesharingactive.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,134 @@
+/*
+* 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 CUPFileSharingActive class
+*
+*/
+
+
+#include <upnpfilesharing.h>
+#include <upnpitem.h>
+#include <e32debug.h>
+
+#include "cupfilesharingactive.h"
+
+_LIT8( KRoot, "0" );
+
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::NewL
+// -----------------------------------------------------------------------------
+//
+CUPFileSharingActive* CUPFileSharingActive::NewL()
+ {
+ CUPFileSharingActive* self = new (ELeave) CUPFileSharingActive;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::RunL
+// -----------------------------------------------------------------------------
+//
+void CUPFileSharingActive::RunL()
+ {
+ CActiveScheduler::Stop();
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CUPFileSharingActive::DoCancel()
+ {
+ ;
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CUPFileSharingActive::RunError( TInt aError )
+ {
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::ShareItemL
+// -----------------------------------------------------------------------------
+//
+void CUPFileSharingActive::ShareItemL( CUpnpItem& aItem )
+ {
+ iStatus = KRequestPending;
+ iFileSharing->ShareItemL( KRoot, aItem, iStatus );
+ SetActive();
+ CActiveScheduler::Start();
+ User::LeaveIfError( iStatus.Int() );
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::UnShareItem
+// -----------------------------------------------------------------------------
+//
+void CUPFileSharingActive::UnshareItemL( TInt aId )
+ {
+ iFileSharing->UnshareItemL( aId, iStatus );
+ SetActive();
+ CActiveScheduler::Start();
+ User::LeaveIfError( iStatus.Int() );
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::GetSharedItemL
+// -----------------------------------------------------------------------------
+//
+void CUPFileSharingActive::GetSharedItemL( TInt aId, CUpnpItem& aItem )
+ {
+ iFileSharing->GetSharedItemL( aId, aItem , iStatus );
+ SetActive();
+ CActiveScheduler::Start();
+ User::LeaveIfError(iStatus.Int());
+ }
+
+// Constructors and destructor
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::CUPFileSharingActive
+// -----------------------------------------------------------------------------
+//
+CUPFileSharingActive::CUPFileSharingActive():CActive( EPriorityNormal )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CUPFileSharingActive::ConstructL()
+ {
+ iFileSharing = CUpnpFileSharing::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CUPFileSharingActive::~CUPFileSharingActive
+// -----------------------------------------------------------------------------
+//
+CUPFileSharingActive::~CUPFileSharingActive()
+ {
+ Cancel();
+ delete iFileSharing;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupjobstate.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,779 @@
+/*
+* 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 CUPJobState class
+*
+*/
+
+
+#include <e32math.h>
+
+#include "cupjobstate.h"
+#include "upconsts.h"
+#include "cupprintingjob.h"
+#include "cuplogger.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::NewL
+//
+//--------------------------------------------------------------------------------------------
+CUPJobState* CUPJobState::NewL()
+ {
+ CUPJobState *self = NewLC();
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CUPJobState* CUPJobState::NewLC()
+{
+ CUPJobState *self = new (ELeave) CUPJobState();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::ConstructL()
+{
+ LOG("[CUPFileParser]\t ConstructL");
+ Init();
+ InitErrorValues();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::CUPJobState
+//
+//--------------------------------------------------------------------------------------------
+CUPJobState::~CUPJobState()
+{
+ Init();
+ iErrorValues.Reset();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::Init
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::Init()
+{
+ iSheetsCompleted = KErrNotFound;
+ iSheetsToPrint = 0; // cannot be negative for progress
+ iId.Copy(KNullDesC8());
+ iReason = ENoMessage;
+ iState = EStateUnknown;
+ iActiveId.Copy(KNullDesC8());
+ iEndState.Init();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::InitErrorValues
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::InitErrorValues()
+{
+ TMapError err;
+
+ err.iErrorCode = ENoMessage;
+ err.iErrorString.Set(KUPnPStateNone);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbCheckPrinter;
+ err.iErrorString.Set(KUPnPStateAttentionRequired);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonPaperJam;
+ err.iErrorString.Set(KUPnPStateMediaJam);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbCheckPrinter;
+ err.iErrorString.Set(KUPnPStatePaused);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonHardwareCoverOpen;
+ err.iErrorString.Set(KUPnPStateDoorOpen);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonPaperNearlyEmpty;
+ err.iErrorString.Set(KUPnPStateMediaLow);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonPaperEmpty;
+ err.iErrorString.Set(KUPnPStateMediaEmpty);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = ENoMessage;
+ err.iErrorString.Set(KUPnPStateOutputAreaAlmostFull);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbCheckPrinter;
+ err.iErrorString.Set(KUPnPStateOutputAreaFull);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonInkLow;
+ err.iErrorString.Set(KUPnPStateMarkerSupplyLow);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonInkEmpty;
+ err.iErrorString.Set(KUPnPStateMarkerSupplyEmpty);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonInk;
+ err.iErrorString.Set(KUPnPStateMarkerFailure);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonPaperMedia;
+ err.iErrorString.Set(KUPnPStateMediaChangeRequest);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbCheckPrinter;
+ err.iErrorString.Set(KUPnPStateVendorDefined);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateCopies);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateSides);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateNumberUp);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateOrientationRequested);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateMediaSize);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateMediaType);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStatePrintQuality);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateTextLayout);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateImageLayout);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateImageOrientation);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStatePdlFidelity);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateFontFamily);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateFontSize);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateFormatError);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateHttpError);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonHardware;
+ err.iErrorString.Set(KUPnPJobStateHwError);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateObjectFailure);
+ iErrorValues.Append(err);
+
+ err.iErrorCode = EPbStatusErrorReasonFile;
+ err.iErrorString.Set(KUPnPJobStateUriNotFound);
+ iErrorValues.Append(err);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::GetErrorValue
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::GetErrorValue(const TDesC8& aError)
+{
+ LOG81("[CUPJobState::GetErrorValue]\t for: %S", &aError);
+ for (TInt i = 0; i < iErrorValues.Count();++i)
+ {
+ if(0 == aError.Compare(iErrorValues[i].iErrorString))
+ {
+// LOG1("[CUPJobState::GetErrorValue]\t returns: %d", iErrorValues[i].iErrorCode);
+ return iErrorValues[i].iErrorCode;
+ }
+ }
+// LOG("[CUPJobState::GetErrorValue]\t returns: EPbCheckPrinter");
+ return EPbCheckPrinter;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SetState
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::SetState(TUPnPState aState)
+{
+ LOG1("[CUPJobState::SetState]\t %d", aState);
+
+ if(iActiveId.Length() < 1)
+ {
+ iState = EStateUnknown;
+ return;
+ }
+
+ // return if state is one of the terminating states
+ if( EStateReady == iState ||
+ EPrinterStateStopped == iState ||
+ EStatePending == iState ||
+ EJobStateAborted == iState ||
+ EJobStateCanceled == iState )
+ return;
+
+ switch ( aState )
+ {
+ case EPrinterStateStopped:
+ case EStatePending:
+ case EJobStateAborted:
+ case EJobStateCanceled:
+ case EStateReady:
+ Init();
+ iState = aState;
+ break;
+ case EStatePrinting:
+ iState = aState;
+ break;
+ case EJobStateSuccessful:
+ iState = EStatePrinting;
+ break;
+ default:
+ if(0 == iId.Compare(ActiveId()))
+ {
+ if(SheetsToPrint() == SheetsCompleted())
+ iState = EStateReady;
+ else if (EStateUnknown == iState)
+ iState = EStatePrinting;
+ }
+ break;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::State
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::State()
+{
+// LOG1("[CUPJobState::State]\t : %d",iState);
+ return iState;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SetActiveId
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::SetActiveId(const TDesC8& aId)
+{
+ Init();
+ iActiveId.Copy(aId);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::ActiveId
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CUPJobState::ActiveId()
+{
+ return iActiveId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SetSheetsCompleted
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::SetSheetsCompleted(const TDesC8& aSheetsCompleted)
+{
+// LOG1("[CUPJobState::SetSheetsCompleted]\t - at the beginning SheetsCompleted(): %d",SheetsCompleted());
+// LOG8S("[CUPJobState::SetSheetsCompleted]\t - aSheetsCompleted: ",aSheetsCompleted);
+
+ if(EStateReady == State())
+ {
+ iSheetsCompleted = SheetsToPrint();
+ LOG1("[CUPJobState::SetSheetsCompleted]\t - State ready, set SheetsToPrint(): %d",SheetsToPrint());
+ }
+ else
+ {
+ TLex8 sheetsLex(aSheetsCompleted);
+ //Should here be an check about return value of Val??? /TTP
+ sheetsLex.Val(iSheetsCompleted);
+ }
+ LOG1("[CUPJobState::SetSheetsCompleted]\t - iSheetsCompleted: %d",SheetsCompleted());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SheetsCompleted
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::SheetsCompleted()
+{
+ return iSheetsCompleted;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SetReason
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::SetReason(TInt aReason)
+{
+ iReason = aReason;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::Reason
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::Reason()
+{
+ return iReason;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SetJobList
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::SetJobList(const TDesC8& aJobIdList)
+{
+ TInt pos = PendingJobId(aJobIdList);
+ if(1 < pos)
+ SetState(EStatePending);
+ else if (1 == pos)
+ {
+ iId = ActiveId();
+ SetState(EStatePrinting);
+ }
+
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SetSheetsToPrint
+//
+//--------------------------------------------------------------------------------------------
+void CUPJobState::SetSheetsToPrint(TInt aSheets)
+{
+ LOG1("[CUPJobState::SetSheetsToPrint]\t aSheets\t = %d", aSheets);
+ if(0 < aSheets)
+ iSheetsToPrint = aSheets;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::SheetsToPrint
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::SheetsToPrint()
+{
+// LOG1("[CUPJobState::SheetsToPrint]\t iSheetsToPrint\t = %d", iSheetsToPrint);
+ return iSheetsToPrint;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::Progress
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::Progress(TInt aSheets)
+{
+ TInt percentage = 0;
+ if(State() == EStateReady)
+ percentage = 100;
+ else if(0 < SheetsCompleted() && 0 < aSheets)
+ percentage = (((SheetsCompleted() << 8) / aSheets) * 100) >> 8;
+
+// LOG1("[CUPJobState::Progress]\t SheetsCompleted()\t = %d", SheetsCompleted());
+// LOG1("[CUPJobState::Progress]\t aSheets\t\t\t = %d", aSheets);
+ LOG1("[CUPJobState::Progress]\t percentage\t\t\t = %d%%", percentage);
+
+ return percentage;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::Progress
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::Progress()
+{
+ return Progress(SheetsToPrint());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::UpdateJobState
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::UpdateJobState(const TDesC8& aPrinterState, const TDesC8& aReason, const TDesC8& aJobList, const TDesC8& aJobId, const TDesC8& aSheetsCompleted)
+{
+ LOG81("[CUPJobState::UpdateJobState]\t active job: %S", &(ActiveId()));
+
+ LOG81("[CUPJobState]\t - aPrinterState: %S", &aPrinterState);
+ LOG81("[CUPJobState]\t - aReason: %S", &aReason);
+ LOG81("[CUPJobState]\t - aJobList: %S", &aJobList);
+ LOG81("[CUPJobState]\t - aJobId: %S", &aJobId);
+ LOG81("[CUPJobState]\t - aSheetsCompleted: %S", &aSheetsCompleted);
+
+ SetReason(GetErrorValue(aReason));
+
+ //Set sheets for progress
+ SetSheetsCompleted(aSheetsCompleted);
+
+ // If printer state stopped, no reason to continue
+ if(KErrNotFound != aPrinterState.Find(KUPnPPrinterStateStopped()))
+ {
+ SetState(EPrinterStateStopped);
+ return State();
+ }
+
+ // If job is in the list, state is printing or pending. Else the job does not exist.
+ SetJobList(aJobList);
+ if(EStatePending == State())
+ {
+ SetReason(EPbStatusErrorReasonHardwarePrinterBusy);
+ }
+ else if(State() == EStatePrinting && aJobId.Compare(ActiveId()) != 0 )
+ {
+ LOG82("[CUPJobState::State]\t - Ready: iState: %d, aJobId; %S",iState, &aJobId);
+ SetState(EStateReady);
+ }
+
+ return State();
+}
+
+//// PRIVATE ///
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::CUPJobState
+//
+//--------------------------------------------------------------------------------------------
+CUPJobState::CUPJobState()
+{
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::PendingJobId
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::PendingJobId(const TDesC8& aJobIdList)
+{
+ if(0 >= aJobIdList.Length())
+ return KErrNotFound;
+
+ TInt count = 0;
+ TLex8 list(aJobIdList);
+
+ TLex8 idLex(ActiveId());
+ TInt activeId;
+ if (idLex.Val(activeId) != KErrNone)
+ {
+ return KErrArgument;
+ }
+
+ while(!list.Eos() && count < 50)
+ {
+ ++count;
+ TInt val = KErrNotFound;
+ if(KErrNone == list.Val(val))
+ {
+ if(activeId == val)
+ return count;
+ else
+ list.Inc();
+ }
+ }
+ return KErrNotFound;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::ParseState
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::ParseState(const TDesC8& aState)
+{
+ if(KErrNotFound != aState.Find(KUPnPJobStateSuccessful()))
+ return EJobStateSuccessful;
+ if(KErrNotFound != aState.Find(KUPnPJobStateAborted()))
+ return EJobStateAborted;
+ if(KErrNotFound != aState.Find(KUPnPJobStateCanceled()))
+ return EJobStateCanceled;
+ if(KErrNotFound != aState.Find(KUPnPPrinterStateIdle()))
+ return EPrinterStateIdle;
+ if(KErrNotFound != aState.Find(KUPnPPrinterStateProcessing()))
+ return EPrinterStateProcessing;
+ if(KErrNotFound != aState.Find(KUPnPPrinterStateStopped()))
+ return EPrinterStateStopped;
+
+ return EStateUnknown;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::ParseJobEndStateL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPJobState::ParseJobEndStateL(const TDesC8& aJobEndState)
+{
+// LOG("[CUPJobState::ParseJobEndState]\t");
+ iEndState.Init();
+ TInt res = KErrNotFound;
+
+ // Return if no data
+ if(1 > aJobEndState.Length())
+ return res;
+
+ // Parse current job and state from JobEndState
+ _LIT8(KSeparator, ",");
+
+ RArray<TPtrC8> strings;
+ CleanupClosePushL(strings);
+ strings.Reset();
+
+ TPtrC8 ptr(aJobEndState);
+ TInt pos = aJobEndState.Find(KSeparator());
+ while(KErrNotFound != pos)
+ {
+ strings.Append(ptr.Left(pos));
+ pos += KSeparator().Length();
+ ptr.Set(ptr.Right(ptr.Length() - pos));
+
+ pos = ptr.Find(KSeparator());
+ if(KErrNotFound == pos)
+ strings.Append(ptr);
+ }
+
+ // Assign strings in member variables if current job's state
+ if(1 <= strings.Count() && 0 == strings[0].Compare(ActiveId()))
+ {
+ if(1 <= strings.Count())
+ {
+ iId.Copy(strings[0]);
+ iEndState.iId.Set(iId);
+ }
+ if(2 <= strings.Count())
+ iEndState.iJobName.Set(strings[1]);
+ if(3 <= strings.Count())
+ iEndState.iOriginator.Set(strings[2]);
+ if(4 <= strings.Count())
+ {
+ SetSheetsCompleted(strings[3]);
+ iEndState.iSheets = SheetsCompleted();
+ }
+ if(5 <= strings.Count())
+ iEndState.iState = ParseState(strings[4]);
+ if(6 <= strings.Count())
+ iEndState.iReason = GetErrorValue(strings[5]);
+
+ res = KErrNone;
+ }
+ CleanupStack::PopAndDestroy( &strings );
+
+ return res;
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::PrinterStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::PrinterStateUpdated( const TDesC8& aEvent )
+{
+ // If printer state not stopped, no reason to assign it
+ if(KErrNotFound < aEvent.Find(KUPnPPrinterStateStopped()))
+ {
+ SetState(EPrinterStateStopped);
+ }
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::PrinterStateReasonsUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::PrinterStateReasonsUpdated( const TDesC8& aEvent )
+{
+ SetReason(GetErrorValue(aEvent));
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::JobIdListUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::JobIdListUpdated( const TDesC8& aEvent )
+{
+ //Check if pending
+ SetJobList(aEvent);
+ if(EStatePending == State())
+ {
+ SetReason(EPbStatusErrorReasonHardwarePrinterBusy);
+ }
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::JobEndStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::JobEndStateUpdatedL( const TDesC8& aEvent )
+{
+ // init id
+ iId.Copy(KNullDesC8());
+
+ // Parse if contains data and for this job
+ TInt res = ParseJobEndStateL(aEvent);
+ if(KErrNotFound != res)
+ {
+ SetState(iEndState.iState);
+
+ // if any abort state updates never received, let's wait the one concerning this case
+ if(EJobStateAborted == iEndState.iState && iEndState.iAbortState)
+ return EStatePrinting;
+ }
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::JobMediaSheetsCompletedUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::JobMediaSheetsCompletedUpdated( const TDesC8& aEvent )
+{
+ JobMediaSheetsCompletedUpdated(iId, aEvent);
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::JobMediaSheetsCompletedUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::JobMediaSheetsCompletedUpdated(const TDesC8& aId, const TDesC8& aEvent )
+{
+ LOG82("[CUPJobState::JobMediaSheetsCompletedUpdated]\t - aId: %S aEvent: %S", &aId, &aEvent);
+
+ // id matches to active id
+ if(0 == aId.Compare(ActiveId()))
+ {
+ SetSheetsCompleted(aEvent);
+
+ // -1 for unknown, 0 for pending or processing (or finished)
+ if( (-1 == SheetsCompleted()) || (0 == SheetsCompleted()) )
+ {
+ LOG81("[CUPJobState::JobMediaSheetsCompletedUpdated]\t - aId:%S\t",&aId);
+ }
+ else if (SheetsToPrint() == SheetsCompleted())
+ {
+ LOG1("[CUPJobState::JobMediaSheetsCompletedUpdated]\t - state ready -> SheetsToPrint(): %d",SheetsToPrint());
+ SetState(EStateReady);
+ }
+ else
+ {
+ LOG1("[CUPJobState::JobMediaSheetsCompletedUpdated]\t - state printing -> SheetsToPrint(): %d",SheetsToPrint());
+ SetState(EStatePrinting);
+ }
+ }
+
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::ContentCompleteListUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::ContentCompleteListUpdated( const TDesC8& /*aEvent*/ )
+{
+ return State();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPJobState::JobAbortStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPJobState::JobAbortStateUpdatedL( const TDesC8& aEvent )
+{
+ // Mark flag as true that any abort state messages never received
+ iEndState.iAbortState = ETrue;
+
+ // Parse if contains data and for this job
+ TInt res = ParseJobEndStateL(aEvent);
+ if(KErrNotFound != res)
+ {
+ SetReason(iEndState.iReason);
+ SetState(iEndState.iState);
+ }
+
+ return State();
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupnpprintingdevice.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,1606 @@
+/*
+* 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 CUPnPPrintingDevice class
+*
+*/
+
+
+#include <upnpsettings.h>
+#include <fbs.h>
+#include <upnpitem.h>
+#include <upnphttpmessage.h>
+#include <upnphttpmessagefactory.h>
+#include <upnpicons.mbg>
+
+#include "cupnpprintingdevice.h"
+#include "cuplogger.h"
+#include "upconsts.h"
+
+_LIT( KIconsFileName, "imageprintdata\\protocols\\upnpicons.mbm" );
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::NewL
+//
+//--------------------------------------------------------------------------------------------
+MProtPrintingDevice* CUPnPPrintingDevice::NewL()
+ {
+ LOG("[CUPnPPrintingDevice]\t ConstructL");
+ return new (ELeave) CUPnPPrintingDevice();
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::ConstructL(const TDesC& /*aDLLPath*/)
+ {
+ LOG("[CUPnPPrintingDevice]\t ConstructL");
+
+ iPrinterContainer = CUPPrinterContainer::NewL();
+ iPrinterTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+ iPrintFactory = CUPPrintFactory::NewL();
+
+ LOG("[CUPnPPrintingDevice]\t Done.");
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::~CUPnPPrintingDevice
+//
+//--------------------------------------------------------------------------------------------
+CUPnPPrintingDevice::~CUPnPPrintingDevice()
+ {
+ if (iPrinterTimer){
+ iPrinterTimer->Cancel();
+ delete iPrinterTimer;
+ }
+
+ if (iPrinterControl)
+ delete iPrinterControl;
+
+ if (iFbsBitmap)
+ delete iFbsBitmap;
+
+ if (iPrintingJob)
+ delete iPrintingJob;
+
+ if (iPrinterContainer)
+ delete iPrinterContainer;
+
+ if (iPrintFactory)
+ delete iPrintFactory;
+
+ REComSession::DestroyedImplementation( iDtor_ID_Key );
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DiscoveryTimeoutCBL
+//
+//--------------------------------------------------------------------------------------------
+TBool CUPnPPrintingDevice::DiscoveryTimeoutCBL(TAny *aWho)
+ {
+ CUPnPPrintingDevice *cbTarget = static_cast<CUPnPPrintingDevice*>(aWho);
+ return cbTarget->DoDiscoveryTimeoutL(ETrue);
+ }
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::StatusTimeoutCBL
+//
+//--------------------------------------------------------------------------------------------
+TBool CUPnPPrintingDevice::StatusTimeoutCBL(TAny *aWho)
+ {
+ CUPnPPrintingDevice *cbTarget = static_cast<CUPnPPrintingDevice*>(aWho);
+ TInt res = KErrNone;
+ TInt err = KErrNone;
+ TRAP(err, res = cbTarget->DoStatusTimeoutL());
+ if(KErrNone != err)
+ {
+ cbTarget->FinishPrinting(KErrTimedOut, err);
+ //Don't run the callback again
+ res = EFalse;
+ }
+ return res;
+ }
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SubmitTimeoutCBL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::SubmitTimeoutCBL(TAny *aWho)
+ {
+ CUPnPPrintingDevice *cbTarget = static_cast<CUPnPPrintingDevice*>(aWho);
+ cbTarget->DoSubmitTimeoutL();
+ return EFalse; // Don't run the callback again
+ }
+
+
+
+
+// ===============================
+// From MProtPrintingDevice.
+// ===============================
+// General
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::Version
+//
+//--------------------------------------------------------------------------------------------
+TVersion CUPnPPrintingDevice::Version()
+ {
+ LOG("[CUPnPPrintingDevice]\t Version");
+ return TVersion(KVersionMajor, KVersionMinor, KVersionBuild);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SupportedProtocols
+//
+//--------------------------------------------------------------------------------------------
+TUint CUPnPPrintingDevice::SupportedProtocols()
+ {
+ return KImagePrint_PrinterProtocol_UPnP;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::RegisterIdleObserver
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::RegisterIdleObserver(MProtIdleObserver* /*aObserver*/)
+{
+
+}
+
+
+// Discovery.
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::StartDiscoveryL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::StartDiscoveryL(MProtDiscoveryObserver& aObserver, TUint aProtocol)
+{
+ LOG("[CUPnPPrintingDevice]\t StartDiscoveryL");
+ iDiscoveryObserver = &aObserver;
+ iPrintersFound = EFalse;
+
+
+ TRAPD(err, StartDiscoveryInternalL(aProtocol))
+ if(KErrNone != err)
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, err, 0);
+ }
+
+ return;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::StartDiscoveryL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::StartDiscoveryInternalL(TUint aProtocol)
+ {
+ LOG("[CUPnPPrintingDevice]\t StartDiscoveryInternalL");
+
+ if (!(aProtocol & KImagePrint_PrinterProtocol_UPnP))
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrNotSupported, 0);
+ return;
+ }
+
+ switch ( iState )
+ {
+ case EUPnPDiscovery: // Already discovering
+ break;
+ case EUPnPUninitialized:
+ {
+ LOG("[CUPnPPrintingDevice]\t starting discovery");
+ // (Re)start printer control point
+ RestartControlPointL();
+ // No devices available - return printers from cache and start timer
+ SendPrinterListL(EFalse);
+ }
+ break;
+ case EUPnPJobReady:
+ case EUPnPReady:
+ {
+ LOG("[CUPnPPrintingDevice]\t returning latest printer list");
+ SendPrinterListL();
+ }
+ break;
+ case EUPnPCancellingDiscovery:
+ case EUPnPCancelling:
+ case EUPnPPrintingStarted:
+ case EUPnPPrinting:
+ default:
+ {
+ LOG("[CUPnPPrintingDevice]\t cannot start discovery");
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrInvalidSequence, 0);
+ break;
+ }
+
+ }
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::RemoveCachedDeviceL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::RemoveCachedDeviceL(TInt aDeviceID)
+ {
+ LOG("[CUPnPPrintingDevice::RemoveCachedDeviceL]");
+ return iPrinterContainer->RemoveCachedDeviceL(aDeviceID);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CancelDiscovery
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::CancelDiscovery(TBool aDoCallBack)
+ {
+ LOG("[CUPnPPrintingDevice]\t CancelDiscovery");
+ if (iState == EUPnPDiscovery)
+ {
+ iState = EUPnPCancellingDiscovery;
+ if (aDoCallBack && iDiscoveryObserver)
+ {
+ //We're not interested if the call back leaves
+ TRAP_IGNORE(iDiscoveryObserver->DiscoveryStatusL(EDiscoveryCancelling, KErrNone, 0));
+ }
+
+ // This needs to be trapped since this function is not named as leaving - no need to chekc the error value
+ TRAP_IGNORE( DoDiscoveryTimeoutL( EFalse ) );
+ }
+ }
+
+// Print
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CreatePrintJobL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::CreatePrintJobL(TInt aDeviceId, RPointerArray<TDesC>& aImages, MProtPrintEventObserver& aObserver)
+ {
+ LOG("[CUPnPPrintingDevice]\t CreatePrintJobL");
+ iPrintEventObserver = &aObserver;
+
+ switch ( iState )
+ {
+ case EUPnPReady:
+ case EUPnPJobReady:
+ {
+ LOG("[CUPnPPrintingDevice]\t initializing job container");
+ InitJobL(aDeviceId, aImages);
+ return KErrNone;
+ }
+ case EUPnPCancelling:
+ case EUPnPPrintingStarted:
+ case EUPnPPrinting:
+ case EUPnPCancellingDiscovery:
+ case EUPnPUninitialized:
+ default:
+ {
+ LOG("[CUPnPPrintingDevice]\t cannot create job");
+ break;
+ }
+
+ }
+ return KErrInvalidSequence;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SubmitPrintJobL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::SubmitPrintJobL()
+ {
+
+ LOG("[CUPnPPrintingDevice]\t SubmitPrintJobL");
+ TInt err = KErrNone;
+
+ switch ( iState )
+ {
+ case EUPnPPrintingStarted:
+ case EUPnPPrinting:
+ break; // Already printing
+ case EUPnPJobReady:
+ {
+ LOG("[CUPnPPrintingDevice]\t submitting jobs");
+
+ // Share jobs
+ TRAP(err, iPrintingJob->ShareImagesL());
+ if (err != KErrNone)
+ {
+ LOG1("[CUPnPPrintingDevice]\t -Sharing failed: %d", err);
+ break;
+ }
+
+ LOG1("[CUPnPPrintingDevice::SubmitPrintJobL]\t start printing with state=%d", iState);
+ iState = EUPnPSubmittingJob;
+ TRAP(err, StartPrintingL());
+ if (err != KErrNone)
+ iState = EUPnPJobReady;
+
+ LOG1("[CUPnPPrintingDevice::SubmitPrintJobL]\t StartPrintingL leaves with %d", err);
+ LOG1("[CUPnPPrintingDevice::SubmitPrintJobL]\t state=%d", iState);
+ }
+ break;
+ case EUPnPDiscovery:
+ case EUPnPCancelling:
+ case EUPnPCancellingDiscovery:
+ case EUPnPUninitialized:
+ case EUPnPReady:
+ default:
+ {
+ LOG("[CUPnPPrintingDevice]\t Invalid sequence to submit job");
+ err = KErrInvalidSequence;
+ }
+ break;
+ }
+
+ if(KErrNone != err)
+ {
+ if (iPrintEventObserver)
+ iPrintEventObserver->PrintJobErrorEvent(EObexSendError, err);
+ else
+ User::Leave(err);
+ }
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CancelPrintJob
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::CancelPrintJob()
+ {
+ LOG("[CUPnPPrintingDevice]\t CancelPrintJob");
+ return DoCancelPrinting();
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::ContinuePrintJobL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::ContinuePrintJobL()
+ {
+ return KErrInvalidSequence;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetNumPrintPages
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetNumPrintPages()
+{
+ if( iPrintingJob )
+ return iPrintingJob->Sheets();
+ else
+ return KErrInvalidSequence;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetPrintJobStatus
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetPrintJobStatus()
+ {
+ if (iState == EUPnPPrinting)
+ return KErrInvalidSequence;
+ return KErrNone;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetPrinterStatus
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetPrinterStatus(TInt /*aDeviceId*/)
+ {
+ return KErrNone;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetDeviceCapabilityIDsL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetDeviceCapabilityIDsL(TInt /*aDeviceID*/, RArray<TInt>& aCapabilityIDs)
+ {
+ LOG("[CUPnPPrintingDevice]\t GetDeviceCapabilityIDsL");
+
+ if (iState == EUPnPUninitialized)
+ {
+ LOG("[CUPnPPrintingDevice]\t No devices discovered");
+ return KErrInvalidSequence;
+ }
+
+ // Return supported settings from XHTML file factory
+ iPrintFactory->GetCapabilityIDs(aCapabilityIDs);
+ return KErrNone;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetDeviceCapabilityL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetDeviceCapabilityL(TInt /*aDeviceID*/, TInt aCapabilityID, TPrintCapability& aCapability)
+ {
+ LOG("[CUPnPPrintingDevice]\t GetDeviceCapabilityL");
+
+ if (iState == EUPnPUninitialized)
+ {
+ LOG("[CUPnPPrintingDevice]\t No devices discovered");
+ return KErrInvalidSequence;
+ }
+
+ // Return value from XHTML-print file factory
+ return iPrintFactory->GetCapability(aCapabilityID, aCapability);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetJobSetting
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetJobSetting(TInt aCapabilityID, TInt& aValue)
+ {
+ LOG("[CUPnPPrintingDevice]\t GetJobSetting");
+ if (iState != EUPnPJobReady)
+ {
+ LOG("[CUPnPPrintingDevice]\t Invalid state");
+ return KErrInvalidSequence;
+ }
+
+ return iPrintFactory->GetPrintSetting(aCapabilityID, aValue);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SetJobSettingL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
+ {
+ LOG("[CUPnPPrintingDevice]\t SetJobSettingL");
+ if (iState != EUPnPJobReady)
+ {
+ LOG("[CUPnPPrintingDevice]\t Invalid state");
+ return KErrInvalidSequence;
+ }
+
+ // Set setting in job container
+ aAffectedCapability = aCapabilityID;
+ return iPrintFactory->SetPrintSetting(aCapabilityID, aValue);
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetNumPreviewPages
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetNumPreviewPages()
+ {
+ return KErrNotSupported;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetJobTemplateIconL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::GetJobTemplateIconL(TInt /*aTemplateID*/, TInt& aFsBitmapHandle)
+ {
+ TInt res = KErrNone;
+
+ if(iFbsBitmap)
+ aFsBitmapHandle = iFbsBitmap->Handle();
+ else
+ {
+ iFbsBitmap = new (ELeave) CFbsBitmap();
+ TFileName iconsFileName;
+ iconsFileName.Append( KDC_RESOURCE_FILES_DIR );
+ iconsFileName.Append( KIconsFileName );
+ res = iFbsBitmap->Load( iconsFileName ,EMbmUpnpiconsIcon );
+
+ if( res == KErrNone )
+ aFsBitmapHandle = iFbsBitmap->Handle();
+ else
+ {
+ aFsBitmapHandle = 0;
+ delete iFbsBitmap;
+ iFbsBitmap = NULL;
+ }
+ }
+
+ return res;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CreatePreviewImage
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::CreatePreviewImage(TInt /*aPageNumber*/)
+ {
+ return KErrNotSupported;
+ }
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SetNumsOfCopiesL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr )
+{
+ if(iState != EUPnPJobReady)
+ aErr = KErrInvalidSequence;
+ else
+ aErr = iPrintingJob->SetNumsOfCopies(aNumsOfCopies);
+
+ return;
+}
+
+// ==========================================================================================
+// From MPCPObserver
+// ==========================================================================================
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CreateJobResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::CreateJobResponse( CUpnpAction* aAction, TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::CreateJobResponse]\t Error: %d", aErrorCode);
+
+ if(!aAction)
+ return;
+
+ if (iState == EUPnPCancelling || iPrintingJob->SessionId() != aAction->SessionId())
+ return;
+
+ if(KErrNone != aErrorCode)
+ {
+ FinishPrinting(EObexConnectError, aErrorCode);
+ return;
+ }
+
+ ResetTimer();
+ iPrintingJob->SetJobId(aAction->ArgumentValue(KJobId()));
+
+ iState = EUPnPPrintingStarted;
+
+ TBuf8<KMaxIdLength> id;
+ iPrintingJob->GetJobId(id);
+
+ LOG("[CUPnPPrintingDevice]\t ******");
+ LOG81("[CUPnPPrintingDevice]\t -Printing started with job id: * %S", &id);
+ LOG("[CUPnPPrintingDevice]\t ******");
+
+ // Printing started - restart timer
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(StatusTimeoutCBL, this) );
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CancelJobResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::CancelJobResponse( CUpnpAction* /*aAction*/, TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::CancelJobResponse]\t Error: %d", aErrorCode);
+
+ FinishPrinting(aErrorCode, KErrNone);
+ if (iPrintEventObserver && KErrNone == aErrorCode)
+ iPrintEventObserver->PrintJobProgressEvent(EDone, iPrintingJob->Progress(), ECancelling);
+}
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetPrinterAttributesResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::GetPrinterAttributesResponse( CUpnpAction* aAction, TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::GetPrinterAttributesResponse]\t Error: %d", aErrorCode);
+
+ if(!aAction)
+ return;
+
+ if (KErrNone != aErrorCode)
+ {
+ FinishPrinting(KErrGeneral, aErrorCode);
+ return;
+ }
+
+ // Cancel and restart timer
+ // Read printer attributes from action and update job status
+ TUPnPState state = EStateUnknown;
+ TRAPD(err, state = iPrintingJob->UpdateJobState(aAction->ArgumentValue( KPrinterState() ),
+ aAction->ArgumentValue( KPrinterStateReasons() ),
+ aAction->ArgumentValue( KJobIdList() ),
+ aAction->ArgumentValue( KJobId() ),
+ aAction->ArgumentValue( KSheetsCompleted() ) ) );
+ if(KErrNone != err)
+ {
+ FinishPrinting(KErrGeneral, err);
+ return;
+ }
+
+ UpdatePrintingStatus(state);
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetJobAttributesResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::GetJobAttributesResponse( CUpnpAction* aAction, TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::GetJobAttributesResponse]\t Error: %d", aErrorCode);
+
+ if (KErrNone != aErrorCode)
+ {
+ LOG1("[CUPnPPrintingDevice:.GetJobAttributesResponse]\t - GetPrinterAttributesL with error: %d", aErrorCode);
+
+ TInt err = KErrNone;
+ CUpnpDevice* printer = GetPrinter();
+ if(!printer)
+ err = KErrNoMemory;
+ else
+ TRAP(err, iPrinterControl->GetPrinterAttributesL(printer));
+
+ if(KErrNone != err)
+ FinishPrinting(KErrGeneral, err);
+
+ return;
+ }
+
+ if(!aAction)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::GetJobAttributesResponse]\t sheets: ", &(aAction->ArgumentValue( KSheetsCompleted() )));
+ LOG81("[CUPnPPrintingDevice::GetJobAttributesResponse]\t name: ", &(aAction->ArgumentValue( KJobName() )));
+ LOG81("[CUPnPPrintingDevice::GetJobAttributesResponse]\t origin: ", &(aAction->ArgumentValue( KUserName() )));
+ LOG81("[CUPnPPrintingDevice::GetJobAttributesResponse]\t id: ", &(aAction->ArgumentValue( KJobId() )));
+
+ TBuf8<KMaxIdLength> id;
+ iPrintingJob->GetJobId(id);
+
+ TUPnPState state = EStateUnknown;
+ state = iPrintingJob->JobMediaSheetsCompletedUpdated(id, aAction->ArgumentValue( KSheetsCompleted() ) );
+
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetMarginsResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::GetMarginsResponse( CUpnpAction* /*aAction*/, TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::GetMarginsResponse]\t Error: %d", aErrorCode);
+ if (KErrNone != aErrorCode)
+ {
+ FinishPrinting(KErrGeneral, aErrorCode);
+ return;
+ }
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetMediaListResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::GetMediaListResponse( CUpnpAction* /*aAction*/, TInt aErrorCode )
+{
+ LOG1("[CUPnPPrintingDevice::GetMediaListResponse]\t Error: %d", aErrorCode);
+ if (KErrNone != aErrorCode)
+ {
+ FinishPrinting(KErrGeneral, aErrorCode);
+ return;
+ }
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::StateUpdatedResponse
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::StateUpdatedResponse( const TDesC8& /*aPrinterState*/,
+ const TDesC8& /*aPrinterStateReasons*/,
+ const TDesC8& /*aJobIdList*/,
+ const TDesC8& /*aJobEndState*/,
+ const TDesC8& /*aJobMediaSheetsCompleted*/,
+ const TDesC8& /*aJobAbortState*/,
+ const TDesC8& /*aContentCompleteList*/ )
+{
+ LOG("[CUPnPPrintingDevice::StateUpdatedResponse]\t");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::PrinterStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::PrinterStateUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::PrinterStateUpdated]\t:%S",&aEvent);
+ iStatusTimeout = EFalse;
+ TUPnPState state = iPrintingJob->PrinterStateUpdated(aEvent);
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::PrinterStateReasonsUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::PrinterStateReasonsUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::PrinterStateReasonsUpdated]\t: %S",&aEvent);
+ iStatusTimeout = EFalse;
+ TUPnPState state = iPrintingJob->PrinterStateReasonsUpdated(aEvent);
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::JobIdListUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::JobIdListUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::JobIdListUpdated]\t:%S",&aEvent);
+ iStatusTimeout = EFalse;
+ TUPnPState state = iPrintingJob->JobIdListUpdated(aEvent);
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::JobEndStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::JobEndStateUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::JobEndStateUpdated]\t:%S",&aEvent);
+
+ TUPnPState state = EStateUnknown;
+ TRAPD(err, state = iPrintingJob->JobEndStateUpdatedL(aEvent));
+ if(KErrNone != err)
+ {
+ LOG1("[CUPnPPrintingDevice::JobEndStateUpdated]\t leaving with error %d. Continue with timer.",err);
+ return;
+ }
+
+ iStatusTimeout = EFalse;
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::JobMediaSheetsCompletedUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::JobMediaSheetsCompletedUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::JobMediaSheetsCompletedUpdated]\t:%S",&aEvent);
+ iStatusTimeout = EFalse;
+ TUPnPState state = iPrintingJob->JobMediaSheetsCompletedUpdated(aEvent);
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::ContentCompleteListUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::ContentCompleteListUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::ContentCompleteListUpdated]\t:%S",&aEvent);
+ iStatusTimeout = EFalse;
+ TUPnPState state = iPrintingJob->ContentCompleteListUpdated(aEvent);
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::JobAbortStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::JobAbortStateUpdated( const TDesC8& aEvent )
+{
+ // no need to check the states: we're not printing
+ if(EUPnPPrintingStarted != iState && EUPnPPrinting != iState)
+ return;
+
+ LOG81("[CUPnPPrintingDevice::JobAbortStateUpdated]\t:%S",&aEvent);
+
+ TUPnPState state = EStateUnknown;
+ TRAPD(err, state = iPrintingJob->JobAbortStateUpdatedL(aEvent));
+ if(KErrNone != err)
+ {
+ LOG1("[CUPnPPrintingDevice::JobAbortStateUpdatedL]\t leaving with error %d. Continue with timer.",err);
+ return;
+ }
+
+ iStatusTimeout = EFalse;
+ UpdatePrintingStatus(state);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DeviceDiscoveredL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::DeviceDiscoveredL( CUpnpDevice* aDevice )
+{
+
+ LOG("[CUPnPPrintingDevice::DeviceDiscovered]\t ");
+ TInt id;
+ TInt err = KErrNone;
+
+ if(!aDevice)
+ return;
+
+ //Trap this: the iDiscoveryObserver will othervise never know about error
+ TRAP(err, iPrinterContainer->AddPrinterL(*aDevice, id));
+
+ // Inform about error and leave
+ if(KErrNone != err && KErrAlreadyExists != err)
+ {
+ if(iDiscoveryObserver && iState == EUPnPDiscovery)
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, err, 0);
+ }
+ User::Leave(err);
+ }
+
+ iPrintersFound = ETrue;
+ if (iState == EUPnPUninitialized)
+ {
+ iState = EUPnPReady;
+ }
+
+ if(iState == EUPnPDiscovery && iDiscoveryObserver && KErrAlreadyExists != err)
+ {
+
+ TInt index = iPrinterContainer->PrinterIndex(id);
+ TPrinter printer = iPrinterContainer->ToTPrinter(index);
+ iDiscoveryObserver->FoundDeviceL(printer);
+ }
+
+ if (iState == EUPnPSubmittingJob)
+ {
+ // Check if the discovered printer is the one we're trying to print with
+ if (iPrintingJob->PrinterId() == id)
+ {
+ // Stop submit timer and submit job
+ ResetTimer();
+ TRAP(err, SubmitJobToPcpL(*aDevice, id) );
+
+ // If error occured inform client - leaving not necessary here
+ if (err != KErrNone)
+ {
+ if (iPrintEventObserver)
+ {
+ iPrintEventObserver->PrintJobErrorEvent(EObexConnectError, err);
+ }
+ iState = EUPnPJobReady;
+ }
+ }
+ }
+ LOG("[CUPnPPrintingDevice::DeviceDiscovered]\t -out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DeviceDisappeared
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::DeviceDisappeared( CUpnpDevice* aDevice )
+{
+ LOG("[CUPnPPrintingDevice]\t DeviceDisappeared");
+ if ( aDevice )
+ {
+ // Notify protocol client if we're in discovery state
+ if(iState == EUPnPDiscovery && iDiscoveryObserver)
+ {
+ TInt index = iPrinterContainer->PrinterIndex( *aDevice );
+ if (index >= 0)
+ {
+ LOG("[CUPnPPrintingDevice]\t informing observer");
+ TPrinter printer = iPrinterContainer->ToTPrinter(index);
+
+ // Notification needs to be trapped because this is not a leaving function
+ TRAP_IGNORE(iDiscoveryObserver->RemoveDeviceL(printer));
+
+ iPrinterContainer->RemovePrinter(index);
+ }
+ }
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t saving to disappeared list");
+ // Trapped because this is not a leaving function
+ TRAP_IGNORE(iPrinterContainer->PrinterDisappeared( *aDevice ));
+ }
+ }
+ if ( iPrinterContainer->PrinterCount() < 1 )
+ {
+ iPrintersFound = EFalse;
+ }
+}
+
+
+/////////////////////////
+// Protected.
+/////////////////////////
+
+
+/////////////////////////
+// Private.
+/////////////////////////
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::CUPnPPrintingDevice
+//
+//--------------------------------------------------------------------------------------------
+CUPnPPrintingDevice::CUPnPPrintingDevice()
+ {
+ iPrinterTimer = NULL;
+ iState = EUPnPUninitialized;
+ iPrintersFound = EFalse;
+ iTriedReadCacheAndFail = EFalse;
+ ResetTimer();
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::RestartControlPointL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::RestartControlPointL()
+ {
+ if (iPrinterControl)
+ {
+ delete iPrinterControl;
+ iPrinterControl = NULL;
+ }
+
+ iFriendlyName.Copy(KUPnPUserName());
+
+ CUpnpSettings *rep = CUpnpSettings::NewL( KCRUidUPnPStack );
+ CleanupStack::PushL(rep);
+ //Get Access Point from central repository
+ TInt iapId = -1;
+ User::LeaveIfError( rep->Get( CUpnpSettings::KUPnPStackIapId, iapId ));
+
+ //Check accessPoint and leave if not ok
+ if( iapId < 0 )
+ {
+ if(iDiscoveryObserver)
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrAbort, 0);
+ User::Leave( KErrAbort );
+ }
+
+ CleanupStack::PopAndDestroy(rep);
+
+
+ // Create printer control point - search starts right away
+ LOG("[CUPnPPrintingDevice]\t - Printer control point");
+ iPrinterControl = CPrinterControlPoint::NewL(*this);
+ }
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SendPrinterListL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::SendPrinterListL(TBool aSync)
+{
+LOG("[CUPnPPrintingDevice]\t SendPrinterListL Begin");
+ TInt err = KErrNone;
+ if (aSync)
+ {
+ // Remove disappeared devices from array
+ iPrinterContainer->SyncPrinterArray();
+ }
+
+ if (iPrinterContainer->PrinterCount() < 1 && !iTriedReadCacheAndFail)
+ {
+ // Read printer cache
+ LOG("[CUPnPPrintingDevice]\t SendPrinterListL xxx trying read cache file");
+ TRAP(err, iPrinterContainer->ReadCacheL());
+ if(KErrNone != err)
+ {
+ LOG1("[CUPnPPrintingDevice]\t SendPrinterListL xxx some error file reading %d", err);
+ if(err == KErrNotFound)
+ {
+ iPrintersFound = EFalse;
+ iTriedReadCacheAndFail = ETrue;
+ }
+ else
+ User::Leave(err);
+ }
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t SendPrinterListL xxx cachefile readed");
+ iPrintersFound = EFalse;
+ }
+
+ if(aSync)
+ {
+ RestartControlPointL();
+ }
+ }
+
+ if (iPrinterContainer->PrinterCount() > 0 && iDiscoveryObserver)
+ {
+ for (TInt i=0; i< iPrinterContainer->PrinterCount(); i++)
+ {
+ TPrinter t = iPrinterContainer->ToTPrinter(i);
+ iDiscoveryObserver->FoundDeviceL( t );
+ }
+ }
+
+ if (!iPrintersFound)
+ {
+ // start timed search
+ StartTimer(KPrinterDiscoveryTimeout, KPrinterDiscoveryTimeout, TCallBack(DiscoveryTimeoutCBL, this) );
+ iState = EUPnPDiscovery;
+ iTriedReadCacheAndFail = EFalse;
+ }
+ else
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrNone, 0);
+ }
+ LOG("[CUPnPPrintingDevice]\t SendPrinterListL end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DoDiscoveryTimeoutL
+//
+//--------------------------------------------------------------------------------------------
+TBool CUPnPPrintingDevice::DoDiscoveryTimeoutL(TBool aDoCallBack)
+{
+ LOG("[CUPnPPrintingDevice]\t DoDiscoveryTimeOut");
+
+ ResetTimer();
+ switch( iState )
+ {
+ case EUPnPCancellingDiscovery:
+ {
+ LOG("[CUPnPPrintingDevice]\t cancelling discovery");
+
+ if (iPrinterContainer->PrinterCount() > 0)
+ {
+ iPrintersFound = ETrue;
+ }
+
+ if (aDoCallBack && iDiscoveryObserver)
+ {
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrNone, 0);
+ }
+
+ }
+ break;
+ case EUPnPDiscovery:
+ {
+ LOG("[CUPnPPrintingDevice]\t discovery timeout");
+
+ // Notify about cached devices, which weren't discovered
+ RPointerArray<CUPPrinter> cachedPrinters;
+ CleanupClosePushL(cachedPrinters);
+ iPrinterContainer->GetDisappearedPrinters(cachedPrinters);
+ for (TInt i=0; i < cachedPrinters.Count(); i++)
+ {
+ TPrinter printer = cachedPrinters[i]->ToTPrinter();
+ iDiscoveryObserver->RemoveDeviceL(printer);
+ }
+
+ CleanupStack::PopAndDestroy(); //cachedPrinters
+
+ // Remove disappeared printers and cached printers, which weren't found printers from container
+ iPrinterContainer->SyncPrinterArray();
+
+ if (iPrinterContainer->PrinterCount() > 0)
+ {
+ iPrintersFound = ETrue;
+ }
+
+ // Notify client's observer
+ if (aDoCallBack && iDiscoveryObserver)
+ iDiscoveryObserver->DiscoveryStatusL(EDiscoveryFinished, KErrNone, 0);
+
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (!iPrintersFound)
+ {
+ LOG("[CUPnPPrintingDevice]\t no printers found");
+ iState = EUPnPUninitialized;
+ }
+ else
+ {
+ iState = EUPnPReady;
+ }
+
+ //Don't run this callback again
+ return EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DoStatusTimeoutL
+//
+//--------------------------------------------------------------------------------------------
+TBool CUPnPPrintingDevice::DoStatusTimeoutL()
+{
+ LOG("[CUPnPPrintingDevice]\t DoStatusTimeOut");
+
+ if (iState == EUPnPCancelling || iState == EUPnPSubmittingJob)
+ {
+ // Printer did not response to cancel or create job
+ LOG("[CUPnPPrintingDevice]\t - no response for cancel or create.");
+ FinishPrinting(KErrGeneral, EPbCheckPrinter);
+ return EFalse; // do not call again
+ }
+
+ if (iState == EUPnPPrinting || iState == EUPnPPrintingStarted)
+ {
+ --iPendingCount;
+
+ // No printing status notifications received
+ CUpnpDevice* printer = GetPrinter();
+ if (!printer || iStatusTimeout || 0 > iPendingCount)
+ {
+ // print error - cancel printing
+ LOG("[CUPnPPrintingDevice]\t - print error - cancel printing.");
+ LOG1("[CUPnPPrintingDevice]\t - iStatusTimeout: %d", iStatusTimeout);
+ LOG1("[CUPnPPrintingDevice]\t - iPendingCount: %d", iPendingCount);
+ ResetTimer();
+ if (iPrintEventObserver)
+ iPrintEventObserver->PrintJobErrorEvent(KErrTimedOut, EPbCheckPrinter);
+ DoCancelPrinting();
+ return EFalse; // do not call again
+ }
+
+ iStatusTimeout = ETrue;
+
+ LOG1("[CUPnPPrintingDevice]\t - GetPrinterAttributesL with iState: %d", iState);
+ iPrinterControl->GetPrinterAttributesL(printer);
+
+ /*LOG1("[CUPnPPrintingDevice]\t - GetJobAttributesL with iState: %d", iState);
+ TBuf8<KMaxIdLength> id;
+ iPrintingJob->GetJobId(id);
+ iPrinterControl->GetJobAttributesL(printer, id);*/
+ }
+
+ return ETrue; // call again
+}
+
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::InitJobL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::InitJobL(TInt aDeviceId, RPointerArray<TDesC>& aImages)
+{
+ LOG("[CUPnPPrintingDevice::InitJobL]\t");
+
+ // Check that device exists
+ CUPPrinter* printer = iPrinterContainer->Printer(aDeviceId);
+ if (!printer)
+ {
+ LOG("[CUPnPPrintingDevice]\t printer not found");
+ User::Leave(KErrArgument);
+ }
+
+ // Create job
+ if (iPrintingJob)
+ {
+ delete iPrintingJob;
+ iPrintingJob = NULL;
+ }
+
+ // Change format of file list
+ RArray<TFileName> imageList;
+ CleanupClosePushL(imageList);
+ for (TInt i=0; i < aImages.Count(); i++)
+ {
+ LOG81("[InitJobL]\t ", aImages[i]);
+ imageList.Append( *(aImages[i]) );
+ }
+
+ // Create job object
+ iPrintingJob = CUPPrintingJob::NewL(printer, imageList, iPrintFactory, iFriendlyName);
+ CleanupStack::PopAndDestroy(&imageList);
+
+ // Update state and return
+ iState = EUPnPJobReady;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::StartPrintingL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::StartPrintingL()
+{
+ LOG("[CUPnPPrintingDevice::StartPrintingL]\t");
+ ResetTimer();
+
+ // Get pointer to correct CDevice
+ CUPPrinter* upPrinter = static_cast<CUPPrinter*>(User::LeaveIfNull(
+ iPrinterContainer->Printer(iPrintingJob->PrinterId())));
+
+ CUpnpDevice* printer = upPrinter->Device();
+
+ if (!printer)
+ {
+ LOG("[CUPnPPrintingDevice]\t -UPnP Printer pointer was NULL");
+
+ // Try to discover selected printer - start timer
+ StartTimer(KPrinterSubmitTimeout, KPrinterSubmitTimeout, TCallBack(SubmitTimeoutCBL, this) );
+ return;
+ }
+
+ // Send create job to PCP
+ SubmitJobToPcpL(*printer, iPrintingJob->PrinterId());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DoSubmitTimeoutL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::DoSubmitTimeoutL()
+{
+ LOG("[CUPnPPrintingDevice]\t CUPnPPrintingDevice::DoSubmitTimeoutL");
+
+ ResetTimer();
+
+ TRAPD(err, SubmitJobToPcpL(iPrintingJob->PrinterId()));
+
+ if( err != KErrNone)
+ {
+ if (iPrintEventObserver)
+ iPrintEventObserver->PrintJobErrorEvent(EObexConnectError, err);
+ iState = EUPnPJobReady;
+ }
+
+}
+
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SubmitJobToPcpL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::SubmitJobToPcpL(TInt aDeviceID)
+{
+ LOG("[CUPnPPrintingDevice::SubmitJobToPcpL(TInt)]\t");
+
+ // Get pointer to correct CDevice
+ CUPPrinter* printer = NULL;
+
+ TInt printerIndex = iPrinterContainer->PrinterIndex(aDeviceID);
+ if (printerIndex >= 0)
+ {
+ printer =
+ static_cast<CUPPrinter*> (User::LeaveIfNull(iPrinterContainer->Printer(printerIndex)));
+ }
+
+ SubmitJobToPcpL(*(printer->Device()), aDeviceID);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::SubmitJobToPcpL
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::SubmitJobToPcpL(CUpnpDevice& aPrinter, TInt aPrinterID)
+{
+ LOG("[CUPnPPrintingDevice::SubmitJobToPcpL(CDevice&, TInt)]\t");
+
+ // Init settings
+ TPtrC8 userName;
+ iPrintingJob->GetUserName(userName);
+
+ // Get and convert xhtml file
+ TFileName8 fileName;
+
+ LOG("[CUPnPPrintingDevice::SubmitJobToPcpL]\t -before GetPrintFileL call");
+ iPrintingJob->GetPrintFileL(fileName);
+ LOG("[CUPnPPrintingDevice::SubmitJobToPcpL]\t -after GetPrintFile call");
+
+ User::LeaveIfNull(&aPrinter);
+
+ LOG("[CUPnPPrintingDevice::SubmitJobToPcpL]\t -before CreateJobL call");
+ TInt sessionId = iPrinterControl->CreateJobL(&aPrinter, fileName, userName, KUPnPOne(), KUPnPDeviceSetting(),
+ KUPnPDeviceSetting(), KUPnPDeviceSetting(), KUPnPDeviceSetting(), KUPnPDeviceSetting(), KUPnPDeviceSetting());
+ LOG("[CUPnPPrintingDevice::SubmitJobToPcpL]\t -after CreateJobL call");
+
+ iPrintingJob->SetSessionId(sessionId);
+ iPendingCount = KPendingLimit + iPrintingJob->ImageCount();
+
+ LOG1("[CUPnPPrintingDevice]\t -Printing started successfully - timer can expire %d times", iPendingCount);
+
+ //Add printer in cache if doesn't exist
+ iPrinterContainer->UpdateCacheL(aPrinterID);
+
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(StatusTimeoutCBL, this) );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::DoCancelPrintJob()
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPnPPrintingDevice::DoCancelPrinting()
+{
+ LOG("[CUPnPPrintingDevice]\t DoCancelPrinting()");
+
+ if (iState == EUPnPPrintingStarted || iState == EUPnPPrinting || iState == EUPnPSubmittingJob)
+ {
+ // Cancel printer response timer first
+ LOG("[CUPnPPrintingDevice]\t -Canceling timer");
+ ResetTimer();
+
+ // Cancel current job
+ iState = EUPnPCancelling;
+ CUpnpDevice* printer = GetPrinter();
+ if (!printer)
+ {
+ LOG("[CUPnPPrintingDevice]\t Invalid printer");
+ return KErrArgument;
+ }
+
+ TInt err;
+ TBuf8<KMaxIdLength> id;
+ iPrintingJob->GetJobId(id);
+
+ if (id.Length() >= 1)
+ {
+ LOG81("[CUPnPPrintingDevice]\t Cancel with job id %S", &id);
+ TRAP(err, iPrinterControl->CancelJobL(printer, id))
+ }
+ else
+ {
+ LOG81("[CUPnPPrintingDevice]\t Cancel with session id %S", iPrintingJob->SessionId());
+ TRAP(err, iPrinterControl->CancelJobL(iPrintingJob->SessionId()) );
+ }
+
+ if(KErrNone != err)
+ {
+ LOG1("[CUPnPPrintingDevice]\t Cancel failed with error %d -> roughly finish printing ", err);
+ FinishPrinting(KErrGeneral, err);
+ return err;
+ }
+
+ // Start timer for cancel response
+ StartTimer(KPrinterResponseTimeout, KPrinterResponseTimeout, TCallBack(StatusTimeoutCBL, this) );
+
+ return KErrNone;
+ }
+
+ if (iState == EUPnPJobReady)
+ {
+ return KErrNone;
+ }
+
+ return KErrInvalidSequence;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::UpdatePrintingStatus()
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::UpdatePrintingStatus(TUPnPState aJobState)
+{
+ LOG1("[CUPnPPrintingDevice::UpdatePrintingStatus]\t - JobState: %d", aJobState);
+
+ /* Printer stopped */
+ if(EPrinterStateStopped == aJobState || EStatePending == aJobState)
+ {
+ iStatusTimeout = EFalse;
+ // Finish printing if reason found. Otherwise wait timer or new message
+ if(ENoMessage != iPrintingJob->JobState()->Reason())
+ {
+ LOG1("[CUPnPPrintingDevice]\t - state NOK -> Cancel with %d", iPrintingJob->JobStateReason());
+ if (iPrintEventObserver)
+ iPrintEventObserver->PrintJobErrorEvent(KErrGeneral, iPrintingJob->JobStateReason());
+ DoCancelPrinting();
+ }
+ return;
+ }
+
+ // Job aborted
+ if(EJobStateAborted == aJobState)
+ {
+ LOG("[CUPnPPrintingDevice]\t - EJobStateAborted -> Finish");
+ FinishPrinting(KErrGeneral, iPrintingJob->JobStateReason());
+ return;
+ }
+
+ if(EStateReady == aJobState)
+ {
+ // Printing finished for current job
+ LOG("[CUPnPPrintingDevice]\t - Printing finished");
+ iPrintEventObserver->PrintJobProgressEvent(EDone, iPrintingJob->Progress(), ENoMessage);
+
+ // FinishPrinting
+ FinishPrinting();
+ return;
+ }
+
+ iPrintEventObserver->PrintJobProgressEvent(EActive, iPrintingJob->Progress(), ENoMessage);
+ iStatusTimeout = EFalse;
+ LOG("[CUPnPPrintingDevice::UpdatePrintingStatus]\t - out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::FinishPrinting
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::FinishPrinting()
+{
+ LOG("[CUPnPPrintingDevice::FinishPrinting]\t ");
+
+ LOG("[CUPnPPrintingDevice]\t -Reset timer");
+ ResetTimer();
+
+ LOG("[CUPnPPrintingDevice]\t -Unshare");
+ iPrintingJob->UnShareImages();
+
+ LOG("[CUPnPPrintingDevice]\t -Init ids");
+ iPrintingJob->SetJobId(KNullDesC8());
+ iPrintingJob->SetSessionId(KErrNotFound);
+ iPendingCount = KPendingLimit;
+
+ LOG("[CUPnPPrintingDevice]\t -Update state");
+ if(NULL != GetPrinter())
+ iState = EUPnPJobReady;
+ else
+ iState = EUPnPReady;
+ LOG1("[CUPnPPrintingDevice]\t FinishPrinting: state=%d", iState);
+
+
+ // Inform control point
+ // No can do if this leaves -> ignore leave
+ TRAP_IGNORE(iPrinterControl->PrintingFinishedL(GetPrinter()));
+ LOG("[CUPnPPrintingDevice::FinishPrinting]\t -out");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::FinishPrinting
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::FinishPrinting(TInt aErrorCode, TInt aErrorMessage)
+{
+ FinishPrinting();
+
+ if (iPrintEventObserver && KErrNone != aErrorCode)
+ iPrintEventObserver->PrintJobErrorEvent(aErrorCode, aErrorMessage);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::GetPrinter
+//
+//--------------------------------------------------------------------------------------------
+CUpnpDevice* CUPnPPrintingDevice::GetPrinter()
+{
+ LOG("[CUPnPPrintingDevice::GetPrinter]");
+
+ if(iPrintingJob)
+ {
+ CUPPrinter* uaPrinter = iPrinterContainer->Printer(iPrintingJob->PrinterId());
+ if (uaPrinter)
+ {
+ return uaPrinter->Device();
+ }
+ }
+ return NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::ResetTimer
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::ResetTimer()
+{
+ LOG("[CUPnPPrintingDevice::ResetTimer]\t");
+
+ if(iPrinterTimer)
+ iPrinterTimer->Cancel();
+ iStatusTimeout = EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPnPPrintingDevice::ResetTimer
+//
+//--------------------------------------------------------------------------------------------
+void CUPnPPrintingDevice::StartTimer(TTimeIntervalMicroSeconds32 aDelay,
+ TTimeIntervalMicroSeconds32 anInterval,
+ TCallBack aCallBack)
+{
+ LOG("[CUPnPPrintingDevice::StartTimer]\t");
+
+ ResetTimer();
+
+ iPrinterTimer->Start(aDelay, anInterval, aCallBack );
+
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprinter.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,283 @@
+/*
+* 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 CUPPrinter class
+*
+*/
+
+
+#include <upnpmediaserversettings.h>
+
+#include "cupprinter.h"
+#include "cuplogger.h"
+#include "tprintcapability.h"
+
+// Public functions
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::~CUPPrinter
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter::~CUPPrinter()
+{
+ if ( iUId )
+ {
+ delete iUId;
+ }
+
+ if ( iDisplayName )
+ {
+ delete iDisplayName;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::NewL
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter* CUPPrinter::NewL(CUpnpDevice& aDevice, TInt aId)
+{
+ CUPPrinter* self = new (ELeave) CUPPrinter();
+ CleanupStack::PushL(self);
+ self->ConstructL(&aDevice, aId, aDevice.Uuid(), aDevice.DescriptionProperty(UpnpMediaServerSettings::KModelName()), TPrinter::EVendorNone);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::NewL
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter* CUPPrinter::NewL(const TInt aId, const TDesC8& aUId, const TDesC8& aDisplayName, const TInt aVendor)
+{
+ CUPPrinter* self = new (ELeave) CUPPrinter();
+ CleanupStack::PushL(self);
+ self->ConstructL(NULL, aId, aUId, aDisplayName, aVendor);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::Device
+//
+//--------------------------------------------------------------------------------------------
+CUpnpDevice* CUPPrinter::Device()
+{
+ return iDevice;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::SetCached
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinter::SetCached(TBool aCached)
+{
+ iCached = aCached;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::Cached
+//
+//--------------------------------------------------------------------------------------------
+TBool CUPPrinter::Cached()
+{
+ return iCached;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::Vendor
+//
+//--------------------------------------------------------------------------------------------
+TPrinter::TPrinterVendor CUPPrinter::Vendor()
+ {
+ return iVendor;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::SetVendor
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinter::SetVendor(const TDesC8& aManufacturer)
+ {
+ LOG("[CUPPrinter::SetVendor]\t Begin");
+ iVendor = TPrinter::EVendorNone;
+ // At the moment this functionality is not used, but no Vendor is set.
+ LOG("[CUPPrinter::SetVendor]\t End");
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::ToTPrinter
+//
+//--------------------------------------------------------------------------------------------
+TPrinter CUPPrinter::ToTPrinter()
+{
+ TInt cached(0);
+ TPrinter printer;
+ printer.iPrinterID = iId;
+ printer.iDisplayName.Copy(iDisplayName->Des());
+ printer.iVendor = Vendor();
+ // cast boolean value to integer
+ cached = Cached();
+ printer.iProperties = cached | TPrinter::SupportsPreview;
+ printer.iProtocol = KImagePrint_PrinterProtocol_UPnP;
+
+ LOG1("[CUPPrinter::ToTPrinter]\t printer.iVendor = %d", printer.iVendor)
+
+ return printer;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::Id
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinter::Id()
+ {
+ return iId;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::UId
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CUPPrinter::UId()
+{
+ if ( iUId )
+ {
+ return TPtrC8( iUId->Des() );
+ }
+ else
+ {
+ return TPtrC8( KNullDesC8 );
+ }
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::DisplayName
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CUPPrinter::DisplayName()
+{
+ if ( iDisplayName )
+ {
+ return TPtrC8( iDisplayName->Des() );
+ }
+ else
+ {
+ return TPtrC8( KNullDesC8 );
+ }
+
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::IsDisappeared
+//
+//--------------------------------------------------------------------------------------------
+TBool CUPPrinter::IsDisappeared()
+{
+ return iDisappeared;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::SetDisappeared
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinter::SetDisappeared(TBool aDisappeared)
+{
+ iDisappeared = aDisappeared;
+
+ if (iDisappeared)
+ {
+ iDevice = NULL;
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::SetDevice
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinter::SetDevice(CUpnpDevice* aDevice)
+{
+ iDevice = aDevice;
+
+ if (!aDevice)
+ return;
+
+ // Update display name
+ delete iDisplayName;
+ iDisplayName = NULL;
+
+ iDisplayName = aDevice->DescriptionProperty(UpnpMediaServerSettings::KModelName()).Alloc();
+}
+
+// Protected functions
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::ConstructL(
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinter::ConstructL(CUpnpDevice* aDevice, const TInt aId, const TDesC8& aUId, const TDesC8& aDisplayName, const TInt aVendor)
+{
+ iId = aId;
+ iUId = aUId.AllocL();
+ iDisplayName = aDisplayName.AllocL();
+ iVendor = (TPrinter::TPrinterVendor)aVendor;
+
+ if (aDevice)
+ {
+ // Discovered device
+ iDevice = aDevice;
+ iDisappeared = EFalse;
+
+ SetVendor(iDevice->DescriptionProperty(UpnpMediaServerSettings::KManufacturer()));
+ }
+ else
+ {
+ // Cached device
+ iDisappeared = ETrue;
+ }
+
+ iCached = EFalse;
+}
+
+// Private functions
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinter::CUPPrinter
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter::CUPPrinter()
+{
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintercontainer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,775 @@
+/*
+* 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 CUPPrinterContainer class
+*
+*/
+
+
+#include "cupprintercontainer.h"
+#include "cuplogger.h"
+#include "upconsts.h"
+
+_LIT(KUPnPPrinterCache, "printers.txt");
+
+#define KMaxCacheFileSize 512
+
+// Public functions
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::~CUPPrinterContainer
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinterContainer::~CUPPrinterContainer()
+{
+ iPrinters.ResetAndDestroy();
+ iPrinters.Close();
+ iFsSession.Close();
+ if(iCacheBuffer)
+ delete iCacheBuffer;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::NewL
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinterContainer* CUPPrinterContainer::NewL()
+{
+ CUPPrinterContainer* self = new (ELeave) CUPPrinterContainer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::Printer
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter* CUPPrinterContainer::Printer(CUpnpDevice& aDevice)
+{
+ TInt index = PrinterIndex(aDevice);
+ if(KErrNotFound != index)
+ {
+ return PrinterByIndex(index);
+ }
+ else
+ return NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::Printer
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter* CUPPrinterContainer::Printer(TInt aId)
+{
+ TInt index = PrinterIndex(aId);
+ if(KErrNotFound != index)
+ {
+ return PrinterByIndex(index);
+ }
+ else
+ return NULL;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::ToTPrinter
+//
+//--------------------------------------------------------------------------------------------
+TPrinter CUPPrinterContainer::ToTPrinter(CUpnpDevice& aDevice)
+{
+ TInt index = PrinterIndex(aDevice);
+ return ToTPrinter(index);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::ToTPrinter
+//
+//--------------------------------------------------------------------------------------------
+TPrinter CUPPrinterContainer::ToTPrinter(TInt aIndex)
+{
+ if (aIndex >= iPrinters.Count() )
+ {
+ TPrinter nullPrinter;
+ nullPrinter.iPrinterID = KErrNotFound;
+ nullPrinter.iProtocol = 0;
+ nullPrinter.iProperties = TPrinter::Cached;
+ return nullPrinter;
+ }
+
+ return iPrinters[aIndex]->ToTPrinter();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::PrinterCount
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::PrinterCount()
+{
+ return iPrinters.Count();
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::AddPrinterL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::AddPrinterL(CUpnpDevice& aDevice, TInt& aId)
+{
+ aId = KErrNotFound;
+
+ // Check if the discovered printer is cached/ disappeared
+ for (TInt i=0; i < iPrinters.Count(); i++)
+ {
+ if (iPrinters[i]->UId().Compare(aDevice.Uuid()) == 0)
+ {
+ // Printer already in array - update pointer
+ iPrinters[i]->SetDevice(&aDevice);
+ if (iPrinters[i]->IsDisappeared())
+ {
+ // remove disappeared flag
+ iPrinters[i]->SetDisappeared(EFalse);
+ }
+ aId = iPrinters[i]->Id();
+ User::Leave(KErrAlreadyExists);
+ }
+ }
+
+ // New printer - append to list
+ TInt id = GenerateId();
+ CUPPrinter* newPrinter = CUPPrinter::NewL(aDevice, id);
+ CleanupStack::PushL(newPrinter);
+ iPrinters.AppendL(newPrinter);
+ CleanupStack::Pop(newPrinter);
+ aId = id;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::RemovePrinter
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::RemovePrinter(CUpnpDevice& aDevice)
+{
+ TInt index = PrinterIndex(aDevice);
+ if(KErrNotFound != index)
+ {
+ return RemovePrinter(index);
+ }
+ else
+ return index;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::RemovePrinter
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::RemovePrinter(TInt aIndex)
+{
+ if (aIndex >= iPrinters.Count() || aIndex < 0)
+ return KErrArgument;
+ CUPPrinter* temp = iPrinters[aIndex];
+ iPrinters.Remove(aIndex);
+ if (temp)
+ {
+ delete temp;
+ temp = NULL;
+ }
+ return KErrNone;
+}
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::RemovePrinter
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::RemoveCachedDeviceL(TInt aDeviceID)
+{
+ TInt err = KErrNone;
+ TBool cached = EFalse;
+
+ for (TInt i=0; i < iPrinters.Count(); i++)
+ {
+ if (iPrinters[i]->Id() == aDeviceID)
+ {
+ cached = iPrinters[i]->Cached();
+ iPrinters[i]->SetCached(EFalse);
+ break;
+ }
+ }
+
+ if(!cached)
+ return KErrNone;
+
+ ReadCacheFileL();
+
+ TInt startPos = 0;
+ TInt endPos = 0;
+
+ FindCachedPrinterL(aDeviceID, startPos, endPos);
+
+ LOG1("[CUPPrinterContainer::RemoveCachedDeviceL]\t startPos:\t%d", startPos);
+ LOG1("[CUPPrinterContainer::RemoveCachedDeviceL]\t endPos:\t%d", endPos);
+
+ if(0 < endPos)
+ {
+ //Remove printer form the buffer
+ iCacheBuffer->Des().Delete(startPos, endPos-startPos);
+
+ //Write buffer in file
+ RFile cacheFile;
+ CleanupClosePushL(cacheFile);
+ TInt err = cacheFile.Replace( iFsSession, KUPnPPrinterCache, EFileWrite);
+ if (err == KErrNone)
+ {
+ err = cacheFile.Write(iCacheBuffer->Des());
+ }
+ CleanupStack::PopAndDestroy(&cacheFile);
+ }
+
+ delete iCacheBuffer;
+ iCacheBuffer = NULL;
+
+ return err;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::Printer
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinter* CUPPrinterContainer::PrinterByIndex(TInt aIndex)
+{
+ if (aIndex >= iPrinters.Count() || aIndex < 0)
+ return NULL;
+ return iPrinters[aIndex];
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::PrinterIndex
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::PrinterIndex(CUpnpDevice& aDevice)
+{
+ TPtrC8 uuid = aDevice.Uuid();
+ TInt count = iPrinters.Count();
+ for (TInt i=0; i<count; i++)
+ {
+ TPtrC8 tempUuid = KNullDesC8();
+ if(!iPrinters[i]->IsDisappeared())
+ tempUuid.Set( (iPrinters[i])->Device()->Uuid() );
+
+ if (uuid.Compare(tempUuid) == 0)
+ return i;
+ }
+ return KErrNotFound;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::PrinterIndex
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::PrinterIndex(TInt aId)
+{
+ TInt count = iPrinters.Count();
+ for (TInt i=0; i<count; i++)
+ {
+ if (aId == iPrinters[i]->Id())
+ return i;
+ }
+
+ return KErrNotFound;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::PrinterDisappeared
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::PrinterDisappeared(CUpnpDevice& aDevice)
+{
+ // Check if device is found from iPrinters array. If so add to disappeared array.
+ TInt index = PrinterIndex(aDevice);
+ if ( index >=0 )
+ {
+ iPrinters[index]->SetDisappeared(ETrue);
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::SyncPrinterArray
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::SyncPrinterArray()
+{
+ for(TInt i=0; i<iPrinters.Count(); i++)
+ {
+ if (iPrinters[i]->IsDisappeared())
+ {
+ RemovePrinter(i);
+ i--;
+ }
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::UpdateCache
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::UpdateCacheL()
+{
+ // Calculate size for buffer
+ TInt bufSize = 0;
+ for (TInt i=0; i < iPrinters.Count(); i++)
+ {
+ bufSize += 3; // Separators and line feed
+
+ TBuf8<10> id;
+ id.AppendNum(iPrinters[i]->Id());
+ TBuf8<10> vendor;
+ vendor.AppendNum(iPrinters[i]->Vendor());
+
+ bufSize += id.Length();
+ bufSize += iPrinters[i]->DisplayName().Length();
+ bufSize += vendor.Length();
+ bufSize += iPrinters[i]->UId().Length();
+ }
+
+ // Create buffer
+ if(iCacheBuffer)
+ {
+ delete iCacheBuffer;
+ iCacheBuffer = NULL;
+ }
+
+ iCacheBuffer = HBufC8::NewL(bufSize);
+
+ // Write buffer
+ for (TInt i=0; i < iPrinters.Count(); i++)
+ {
+ iCacheBuffer->Des().AppendNum(iPrinters[i]->Id());
+ iCacheBuffer->Des().Append(KUPnPComma());
+ iCacheBuffer->Des().Append(iPrinters[i]->DisplayName());
+ iCacheBuffer->Des().Append(KUPnPComma());
+ iCacheBuffer->Des().AppendNum(iPrinters[i]->Vendor());
+ iCacheBuffer->Des().Append(KUPnPComma());
+ iCacheBuffer->Des().Append(iPrinters[i]->UId());
+ iCacheBuffer->Des().Append(KUPnPLineFeed8());
+ }
+
+ // Write buffer to file
+ RFile cacheFile;
+ TInt err = cacheFile.Replace( iFsSession, KUPnPPrinterCache, EFileWrite);
+ if (err == KErrNone)
+ {
+ err = cacheFile.Write(iCacheBuffer->Des());
+ }
+ cacheFile.Close();
+ User::LeaveIfError(err);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::UpdateCache
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::UpdateCacheL(TInt aDeviceId)
+{
+
+ // Get correct printer
+ CUPPrinter* printer = NULL;
+ for (TInt i=0; i < iPrinters.Count(); i++)
+ {
+ if(iPrinters[i]->Id() == aDeviceId)
+ {
+ printer = iPrinters[i];
+ break;
+ }
+ }
+
+ // Calculate size for buffer
+ TInt bufSize = 0;
+ if(!printer->Cached())
+ {
+ TBuf8<10> id;
+ id.AppendNum(printer->Id());
+
+ TBuf8<10> vendor;
+ vendor.AppendNum(printer->Vendor());
+ vendor.Append(_L8(" "));
+
+ bufSize += id.Length();
+ bufSize += KUPnPComma().Length();
+ bufSize += printer->DisplayName().Length();
+ bufSize += KUPnPComma().Length();
+ bufSize += vendor.Length();
+ bufSize += KUPnPComma().Length();
+ bufSize += printer->UId().Length();
+ bufSize += KUPnPLineFeed().Length();
+
+ // Create buffer
+ HBufC8* fileBuffer = HBufC8::NewL(bufSize);
+ CleanupStack::PushL(fileBuffer);
+
+ fileBuffer->Des().AppendNum(printer->Id());
+ fileBuffer->Des().Append(KUPnPComma());
+ fileBuffer->Des().Append(printer->DisplayName());
+ fileBuffer->Des().Append(KUPnPComma());
+ fileBuffer->Des().Append(vendor);
+ fileBuffer->Des().Append(KUPnPComma());
+ fileBuffer->Des().Append(printer->UId());
+ fileBuffer->Des().Append(KUPnPLineFeed());
+
+
+ RFile cacheFile;
+ CleanupClosePushL(cacheFile);
+ TInt fSize = 0;
+ // Find end of file to write if exists
+ TInt err = cacheFile.Open( iFsSession, KUPnPPrinterCache, EFileWrite);
+ if (err == KErrNone)
+ {
+ cacheFile.Size(fSize);
+ ++fSize;
+ }
+ else
+ {
+ // Write buffer to file
+ User::LeaveIfError(cacheFile.Replace( iFsSession, KUPnPPrinterCache, EFileWrite));
+ }
+ User::LeaveIfError(cacheFile.Write(fSize, fileBuffer->Des()));
+ printer->SetCached(ETrue);
+
+ CleanupStack::PopAndDestroy(2); // fileBuffer, cacheFile
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::GetDisappearedPrinters
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::GetDisappearedPrinters(RPointerArray<CUPPrinter>& aArray)
+{
+ for (TInt i=0; i < iPrinters.Count(); i++)
+ {
+ if (iPrinters[i]->IsDisappeared())
+ {
+ aArray.Append(iPrinters[i]);
+ }
+ }
+}
+
+///////////////////////////
+// Protected functions
+///////////////////////////
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::ConstructL()
+{
+ iCacheBuffer = NULL;
+
+ // Init file server session
+ User::LeaveIfError( iFsSession.Connect() );
+
+ TInt err = iFsSession.MkDirAll( KUPnPDataPath );
+ if (err != KErrNone && err != KErrAlreadyExists)
+ {
+ User::Leave(err);
+ }
+
+ User::LeaveIfError(iFsSession.SetSessionPath( KUPnPDataPath ));
+}
+
+///////////////////////////
+// Private functions
+///////////////////////////
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::CUPPrinterContainer
+//
+//--------------------------------------------------------------------------------------------
+CUPPrinterContainer::CUPPrinterContainer()
+{
+ iIdCounter = 0;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::ToCDevice
+//
+//--------------------------------------------------------------------------------------------
+CUpnpDevice* CUPPrinterContainer::ToCDevice(TInt aIndex)
+{
+ if (aIndex >= iPrinters.Count() || aIndex < 0 || iPrinters[aIndex]->IsDisappeared())
+ return NULL;
+ return iPrinters[aIndex]->Device();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::ReadCacheL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::ReadCacheL()
+{
+ LOG("[CUPPrinterContainer::ReadCacheL]\t");
+
+ ReadCacheFileL();
+
+ TPtr8 bufferPtr( iCacheBuffer->Des() );
+
+ // Add cached devices.
+ while (bufferPtr.Find(KUPnPLineFeed8()) >= 0)
+ {
+ // Read id
+ TInt separPos = bufferPtr.Find(KUPnPComma());
+ TInt lfPos = bufferPtr.Find(KUPnPLineFeed8());
+
+ if (lfPos < 1 || lfPos < separPos)
+ {
+ break; // No id could be read
+ }
+
+ TPtrC8 idStr = bufferPtr.Left(separPos);
+ TInt id;
+ TLex8 lex(idStr);
+ TInt error = lex.Val(id);
+ User::LeaveIfError( error );
+
+ bufferPtr = bufferPtr.Right(bufferPtr.Length()-separPos-1);
+
+ // Read display name
+ separPos = bufferPtr.Find(KUPnPComma());
+ lfPos = bufferPtr.Find(KUPnPLineFeed8());
+
+ if (lfPos < 1 || lfPos < separPos)
+ {
+ break; // No name could be read
+ }
+
+ TPtrC8 name = bufferPtr.Left(separPos);
+ TBuf8<100> dispName;
+ dispName.Copy(name);
+ bufferPtr = bufferPtr.Right(bufferPtr.Length()-separPos-1);
+
+ // Read vendor
+ separPos = bufferPtr.Find(KUPnPComma());
+ lfPos = bufferPtr.Find(KUPnPLineFeed8());
+
+ if (lfPos < 1 || lfPos < separPos)
+ {
+ break; // No vendor could be read
+ }
+
+ TPtrC8 vendorStr = bufferPtr.Left(separPos);
+ TInt vendor;
+ TLex8 lexV(vendorStr);
+ TInt err = lexV.Val(vendor);
+
+ // FIX: if error reading vendor, use default 0 and return err to none
+ if ( err != KErrNone )
+ {
+ vendor = 0;
+ err = KErrNone;
+ }
+
+ bufferPtr = bufferPtr.Right(bufferPtr.Length()-separPos-1);
+
+ //Read uid
+ separPos = bufferPtr.Find(KUPnPComma());
+ lfPos = bufferPtr.Find(KUPnPLineFeed8());
+
+ if ( (lfPos < 1) || (lfPos > separPos && separPos >= 0 ) )
+ {
+ break; // No uid could be read
+ }
+
+ TPtrC8 uid = bufferPtr.Left(lfPos);
+
+ // Add cached printer
+ if (err == KErrNone)
+ {
+ AddCachedPrinterL(id, uid, dispName, vendor);
+ }
+
+ bufferPtr = bufferPtr.Right(bufferPtr.Length()-lfPos-1);
+
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::FindCachedPrinterL
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CUPPrinterContainer::FindCachedPrinterL(TInt aId, TInt& aStartPos, TInt& aEndPos)
+{
+ LOG("[CUPPrinterContainer::FindCachedPrinterL]\t");
+
+ User::LeaveIfNull(iCacheBuffer);
+ TPtrC8 bufferPtr( iCacheBuffer->Des() );
+
+ TBuf8<10> reqId;
+ reqId.AppendNum(aId);
+
+ aStartPos = 0;
+ aEndPos = 0;
+
+ // Find cached device.
+ while (bufferPtr.Find(KUPnPLineFeed8()) >= 0)
+ {
+ aStartPos = aEndPos;
+
+ // Read id
+ TInt separPos = bufferPtr.Find(KUPnPComma());
+ TInt lfPos = bufferPtr.Find(KUPnPLineFeed8());
+
+ if (lfPos < 1 || lfPos < separPos)
+ {
+ break; // No id could be read
+ }
+
+ aEndPos += lfPos+1;
+
+ LOG81("[CUPPrinterContainer::FindCachedPrinterL]\t bufferPtr: %S", &bufferPtr);
+
+ //Find next printer if id doesn't match
+ if(0 != reqId.Compare(bufferPtr.Left(separPos)))
+ {
+ bufferPtr.Set(bufferPtr.Right(bufferPtr.Length()-lfPos-1));
+ continue;
+ }
+ else
+ {
+ return bufferPtr.Left(aEndPos);
+ }
+ }
+
+ return NULL;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::ReadCacheFileLC
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::ReadCacheFileL()
+{
+ LOG("[CUPPrinterContainer::ReadCacheFileL]\t");
+
+ RFile cacheFile;
+ CleanupClosePushL(cacheFile);
+
+ TInt err = cacheFile.Open( iFsSession, KUPnPPrinterCache, EFileRead );
+
+ if (err == KErrNone)
+ {
+
+ TInt fileSize = 0;
+ err = cacheFile.Size(fileSize);
+ if(err != KErrNone)
+ fileSize = KMaxCacheFileSize;
+
+ iCacheBuffer = HBufC8::NewL(fileSize);
+
+ TPtr8 bufferPtr( iCacheBuffer->Des() );
+ bufferPtr.Zero();
+
+ err = cacheFile.Read(bufferPtr);
+ }
+
+ if (err != KErrNone)
+ {
+ // Problem in opening or reading cache file
+ if (iCacheBuffer)
+ {
+ delete iCacheBuffer;
+ iCacheBuffer = NULL;
+ }
+ iCacheBuffer = HBufC8::NewL(0);
+ // printer not found from cache, leave!
+ User::Leave( KErrNotFound );
+ }
+
+ CleanupStack::PopAndDestroy(); //cacheFile
+}
+
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::GenerateIdL
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrinterContainer::GenerateId()
+{
+ TInt id = -1;
+ for (TInt i=1; i < iPrinters.Count()+2; i++)
+ {
+ TInt j;
+ for (j=0; j < iPrinters.Count(); j++)
+ {
+ if (iPrinters[j]->Id() == i)
+ {
+ break;
+ }
+ }
+
+ if (j == iPrinters.Count())
+ {
+ id = i;
+ break;
+ }
+ }
+
+ return id;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrinterContainer::AddCachedPrinterL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrinterContainer::AddCachedPrinterL(TInt aId, TDesC8& aUPnPUId, TDesC8& aDisplayName, TInt aVendor)
+{
+ LOG("[CUPPrinterContainer::AddCachedPrinterL]");
+ CUPPrinter* newPrinter = CUPPrinter::NewL(aId, aUPnPUId, aDisplayName, aVendor);
+ newPrinter->SetCached(ETrue);
+ CleanupStack::PushL(newPrinter);
+ iPrinters.AppendL(newPrinter);
+ CleanupStack::Pop(newPrinter);
+}
+
+// End of File
--- /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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintingjob.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,709 @@
+/*
+* 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 CUPPrintingJob class
+*
+*/
+
+
+#include <upnpdevice.h>
+#include <escapeutils.h> //utf8 conversions
+#include <upnpprotocolinfo.h>
+#include <upnpmediaserversettings.h>
+
+#include "cupprintingjob.h"
+#include "cupprinter.h"
+#include "cuplogger.h"
+#include "cupprintfactory.h"
+#include "printcapabilitycodes.h"
+#include "cupfilesharingactive.h"
+
+
+
+_LIT8(KResource, "res");
+_LIT(KMediaTypes, "image/jpeg:*,audio/mpeg:MP3,audio/mp4:AAC_ISO_320,video/mp4:AVC_MP4_BL_CIF15_AAC_520,application/vnd.pwg-xhtml-print+xml:*");
+
+// Public functions
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::NewL
+//
+//--------------------------------------------------------------------------------------------
+CUPPrintingJob* CUPPrintingJob::NewL(CUPPrinter* aPrinter, RArray<TFileName>& aImages,
+ CUPPrintFactory* aFileFactory, const TDesC8& aUserName)
+{
+ CUPPrintingJob* self = new (ELeave) CUPPrintingJob(aFileFactory);
+ CleanupStack::PushL(self);
+ self->ConstructL(aPrinter, aImages, aUserName);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::~CUPPrintingJob
+//
+//--------------------------------------------------------------------------------------------
+CUPPrintingJob::~CUPPrintingJob()
+{
+ // Stop sharing
+ UnShareImages();
+
+ if(iFileSharing)
+ delete iFileSharing;
+
+ if(iOrgMediaServerStatus != RUpnpMediaServerClient::EStartedOnline)
+ {
+ iMediaServerClient.Stop();
+ if(iOrgMediaServerStatus == RUpnpMediaServerClient::EStartedOffline)
+ {
+ iMediaServerClient.StartOffline();
+ }
+ }
+
+ iMediaServerClient.Close();
+
+ iImages.Close();
+
+ if(iJobState)
+ delete iJobState;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUAPrintingJob::SetSessionId
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::SetSessionId(TInt aId)
+{
+ iSessionId = aId;
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUAPrintingJob::SessionId
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::SessionId()
+{
+ return iSessionId;
+}
+
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::SetJobId
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::SetJobId(const TDesC8& aId)
+{
+ iJobId.Copy(aId);
+ iJobState->SetActiveId(aId);
+ // SetActiveId initializes iJobState -> set sheets to print
+ iJobState->SetSheetsToPrint(Sheets());
+
+ LOG1("[CUPPrintingJob::SetJobId]\t Sheets(). %d", Sheets());
+
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::GetJobId
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::GetJobId(TDes8& aId)
+{
+ aId.Copy(iJobId);
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::GetJobName
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::GetJobName(TDes8& aJobName)
+{
+ // Return the name of first image
+ if (iImages.Count() > 0)
+ {
+ iImages[0].GetFilePath(aJobName);
+ }
+ else
+ {
+ aJobName.Append(KNullDesC8());
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::ImageCount
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::ImageCount()
+{
+ return iImages.Count();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::Images
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::Images(RArray<CImageInfo>& aImages)
+{
+ for (TInt i=0; i < iImages.Count(); i++)
+ {
+ aImages.Append(iImages[i]);
+ }
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::PrinterId
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::PrinterId()
+{
+ return iPrinterId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::GetUserName
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::GetUserName(TPtrC8& aUserName)
+{
+ aUserName.Set(iUserName);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::ShareFileL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::ShareFileL(CUpnpItem* aItemToShare)
+{
+ User::LeaveIfNull(aItemToShare);
+
+ LOG81("[CUPPrintingJob::ShareFileL]\t ShareFileL: %S", &(aItemToShare->RefId()));
+
+ TRAPD( err, iFileSharing->ShareItemL(*aItemToShare));
+
+ if (KErrAlreadyExists == err)
+ {
+ // Resolve http address of the already shared file
+ TLex8 tmp(aItemToShare->Id());
+ TInt tmpId;
+ tmp.Val(tmpId);
+
+ iFileSharing->GetSharedItemL(tmpId, *aItemToShare);
+
+ }
+ else if(err == KErrNotFound)
+ {
+ LOG("[CUPPrintingJob]\t - ShareItemL: file not found");
+ User::Leave(EPbFileNotFound);
+ }
+ else if(err != KErrNone)
+ {
+ LOG1("[CUPPrintingJob]\t - ShareItemL: %d", err);
+ User::Leave(err);
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::ShareImagesL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::ShareImagesL()
+{
+ LOG("[CUPPrintingJob]\t ShareImagesL");
+ TBuf8<1024> tmpUri;
+ for (TInt i=0; i<iImages.Count(); i++)
+ {
+ // Skip images with no file path (they are already shared by external repository)
+ TFileName8 name;
+ iImages[i].GetFilePath(name);
+ if (name.Length() < 1)
+ {
+ continue;
+ }
+
+ // Generate id
+ TInt itemId = KUPnPIdBase+i;
+ LOG("[CUPPrintingJob::ConstructL]\t File sharing opened");
+ CUpnpItem* upnpItem = UPnPItemLC(itemId, name, KImageType, KJpegMime);
+
+ ShareFileL(upnpItem);
+
+ // Get "res"-element value after filesharing.
+ RUPnPElementsArray tmpElementArray;
+ tmpElementArray = upnpItem->GetElements();
+ for(TInt j = 0; j<tmpElementArray.Count();j++)
+ if(tmpElementArray[j]->Name() == KResource)
+ tmpUri.Copy(tmpElementArray[j]->Value());
+
+ // Parse shared folder address in the "res"-element value.
+ TFileName8 itemAddress;
+ TBuf8<1024> tmpPartOfUri;
+ tmpPartOfUri.Copy( tmpUri.Mid(28));
+ itemAddress.Copy(iMediaServerAddress);
+ itemAddress.Append(tmpPartOfUri);
+
+
+ // Set http address and id to image information
+ iImages[i].SetUri(itemAddress, ETrue);
+ LOG82("[CPrintJob::ShareImagesL]\t iFilePath: \"%S\", iUri: \"%S\"", &name, &itemAddress);
+
+ TPtrC8 tmp = upnpItem->Id();
+ TLex8 lex( tmp );
+ TInt id;
+ lex.Val( id );
+ iImages[i].SetId(id);
+
+ CleanupStack::PopAndDestroy( upnpItem );
+
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::UnShareImages
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::UnShareImages()
+{
+ LOG("[CUPPrintingJob]\t UnShareImages");
+
+ for (TInt i=0; i < iImages.Count(); i++)
+ {
+ UnShareFile(iImages[i].Id());
+ }
+
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::UnShareFile
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::UnShareFile(TInt aItemId)
+{
+ LOG("[CUPPrintingJob::UnShareFile]");
+
+ if (aItemId < 0)
+ {
+ // Not shared because no item id is set
+ return KErrNone;
+ }
+
+ TBuf8<KMaxIdLength> itemIdStr;
+ itemIdStr.AppendNum(aItemId);
+ LOG1("[CUPPrintingJob::UnShareFile]\t Item id = %d", aItemId);
+
+ TRAPD(err, iFileSharing->UnshareItemL(aItemId));
+ LOG1("[CUPPrintingJob::UnShareFile]\t err = %d", err);
+ return err;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::SetNumsOfCopies
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::SetNumsOfCopies( const RArray<TInt>& aNumsOfCopies)
+{
+ TInt err = KErrNone;
+
+ for(TInt arrayIx = 0, imgIx = 0; arrayIx < aNumsOfCopies.Count(); ++arrayIx)
+ {
+ if(iImages[imgIx].Index() < aNumsOfCopies.Count())
+ {
+ TInt copies = aNumsOfCopies[iImages[imgIx].Index()];
+ if(0 < copies)
+ iImages[imgIx].SetCopies(copies);
+ ++imgIx;
+ }
+ else
+ err = KErrCorrupt;
+ }
+ return err;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::GetPrintFileL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::GetPrintFileL(TDes8& aPrintFile)
+{
+ TInt layout;
+ TInt paper;
+ TInt quality;
+ TBuf8<1024> tmpUri;
+
+ iPrintFactory->GetPrintSetting(EPrintCapabLayout, layout);
+ iPrintFactory->GetPrintSetting(EPrintCapabPaperSize, paper);
+ iPrintFactory->GetPrintSetting(EPrintCapabQuality, quality);
+
+ TFileName tmpFile;
+ tmpFile.Copy(aPrintFile);
+ iPrintFactory->CreateXhtmlFileL( iImages, layout, paper, quality, tmpFile, iSheets );
+ aPrintFile.Copy(tmpFile);
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::Sheets
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::Sheets()
+{
+ if(0 == iSheets)
+ {
+ TInt layout;
+ TInt layoutNbr = 0;
+ TInt imageNbr = 0;
+
+ iPrintFactory->GetPrintSetting(EPrintCapabLayout, layout);
+
+ switch( layout )
+ {
+ case EPrintCapabLayout1Up:
+ case EPrintCapabLayout1UpBorderless:
+ case EPrintCapabLayout1UpBorder:
+ layoutNbr = 1;
+ break;
+ case EPrintCapabLayout2Up:
+ layoutNbr = 2;
+ break;
+ case EPrintCapabLayout4Up:
+ layoutNbr = 4;
+ break;
+ case EPrintCapabLayout6Up:
+ layoutNbr = 6;
+ break;
+ case EPrintCapabLayout9Up:
+ layoutNbr = 9;
+ break;
+ case EPrintCapabLayout12Up:
+ layoutNbr = 12;
+ break;
+ case EPrintCapabLayout16Up:
+ layoutNbr = 16;
+ break;
+ default:
+ break;
+ }
+
+ for (TInt i = 0; i<iImages.Count(); ++i)
+ {
+ imageNbr += iImages[i].Copies();
+ }
+
+ iSheets = imageNbr / layoutNbr;
+ if(0 < imageNbr % layoutNbr)
+ ++iSheets;
+ }
+ LOG1("[CUPPrintingJob::Sheets]\t iSheets = %d", iSheets);
+ return iSheets;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::Progress
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::Progress()
+{
+ return iJobState->Progress(Sheets());
+}
+
+
+// Protected functions
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CUPPrintingJob::ConstructL(CUPPrinter* aPrinter, RArray<TFileName>& aImages, const TDesC8& aUserName)
+{
+ _LIT(KHttpPrefixLow16, "http://");
+
+ if (aImages.Count() < 1)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ // Initialize iImages array
+ for (TInt i=0 ; i<aImages.Count(); i++)
+ {
+ // Skip empty strings
+ if (aImages[i].Length() < 1)
+ {
+ continue;
+ }
+
+ aImages[i].LowerCase();
+
+ CImageInfo *imageInfo = CImageInfo::NewLC();
+
+ imageInfo->SetId(KErrNotFound);
+ imageInfo->SetIndex(i);
+ imageInfo->SetCopies(1);
+
+ if (aImages[i].Compare(KHttpPrefixLow16()) < 0 )
+ {
+ // Images with file path
+ imageInfo->SetFilePathL(aImages[i]);
+ }
+ else
+ {
+ // Images with HTTP address
+ imageInfo->SetUriL(aImages[i]);
+ }
+ iImages.Append( *imageInfo );
+ CleanupStack::PopAndDestroy( imageInfo );
+ }
+
+ // Set printer
+ iPrinterId = aPrinter->Id();
+
+ iUserName.Set(aUserName);
+ iJobState = CUPJobState::NewL();
+ iSheets = 0;
+
+ iFileSharing = CUPFileSharingActive::NewL();
+
+ // Connect to the local media server and open file sharing session
+ LOG("[CUPPrintingJob::ConstructL]\t Media server connected");
+ User::LeaveIfError(iMediaServerClient.Connect());
+
+ // get original MS status and start MS if needed.
+ // If MS is in wrong status(started offline mode) then stop MS and start it in online-mode.
+ iMediaServerClient.Status(iOrgMediaServerStatus);
+ if(iOrgMediaServerStatus != RUpnpMediaServerClient::EStartedOnline)
+ {
+ if(iOrgMediaServerStatus == RUpnpMediaServerClient::EStartedOffline)
+ {
+ iMediaServerClient.Stop();
+ }
+ CUpnpMediaServerSettings* settings = CUpnpMediaServerSettings::NewL();
+ TBuf8<1024> media;
+
+ //// Supported Media
+ media.Copy(KMediaTypes);
+ settings->SetL(UpnpMediaServerSettings::ESupportedMedia, media);
+ delete settings;
+ LOG("[CUPPrintingJob::ConstructL]\t Media server start");
+ User::LeaveIfError(iMediaServerClient.Start());
+ }
+
+ // Get Media server ip address and port number.
+ TFileName8 tmpAddress;
+ TInetAddr timppi;
+ TInt err = iMediaServerClient.GetAddress(timppi);
+
+ TFileName addr16;
+ timppi.Output(addr16);
+
+ // Address
+ iMediaServerAddress.Copy( KHttpPrefix() );
+ iMediaServerAddress.Append(addr16);
+
+ // Port
+ iMediaServerAddress.Append( KUPnPColon() );
+ iMediaServerAddress.AppendNum(timppi.Port());
+}
+
+
+// Private functions
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::CUPPrintingJob
+//
+//--------------------------------------------------------------------------------------------
+CUPPrintingJob::CUPPrintingJob(CUPPrintFactory* aFileFactory) :
+iSessionId(KErrNotFound),
+iPrintFactory(aFileFactory),
+iXhtmlFileShareId(0)
+{
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::UPnPItem
+//
+//--------------------------------------------------------------------------------------------
+CUpnpItem* CUPPrintingJob::UPnPItemLC(TInt aItemId, const TDesC8& aFileName, const TDesC8& aObjectType, const TDesC8& aMimeType)
+{
+ // Init upnp item
+ CUpnpItem* upnpItem = CUpnpItem::NewL();
+ CleanupStack::PushL(upnpItem);
+
+ upnpItem->SetRefIdL(aFileName);
+ TFileName8 tmpTitle;
+ TInt tmpLocate = aFileName.LocateReverse( TChar( '\\' ) );
+ tmpLocate++;
+ tmpTitle.Copy(aFileName.Mid(tmpLocate));
+ upnpItem->SetTitleL(tmpTitle);
+ upnpItem->SetObjectClassL(aObjectType);
+
+ TBuf8<KMaxIdLength> itemIdStr;
+ itemIdStr.AppendNum(aItemId);
+ upnpItem->SetIdL(itemIdStr);
+ upnpItem->SetRestricted(0);
+ _LIT8(KDefParentId, "0");
+ upnpItem->SetParentIdL(KDefParentId);
+
+ // Convert FileName to the unicode that MediaServer can handle it correct.
+ HBufC16* buf = EscapeUtils::ConvertToUnicodeFromUtf8L(aFileName);
+ CleanupStack::PushL(buf);
+
+ CUpnpProtocolInfo* protocolInfo = CUpnpProtocolInfo::NewL();
+ CleanupStack::PushL(protocolInfo);
+ protocolInfo->SetFirstFieldL(_L8("http-get"));
+ protocolInfo->SetSecondFieldL(_L8("*"));
+ protocolInfo->SetThirdFieldL(aMimeType);
+ protocolInfo->SetFourthFieldL(_L8("*"));
+
+ upnpItem->AddResourceL(buf->Des(), protocolInfo->ProtocolInfoL());
+ CleanupStack::Pop(protocolInfo);
+ CleanupStack::PopAndDestroy(buf);
+
+ return upnpItem;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::UpdateJobState
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::UpdateJobState(const TDesC8& aPrinterState, const TDesC8& aReason, const TDesC8& aJobList, const TDesC8& aJobId, const TDesC8& aJobMediaSheetsCompleted)
+{
+// LOG("[CUPPrintingJob::UpdateJobState]\t");
+
+ return iJobState->UpdateJobState(aPrinterState, aReason, aJobList, aJobId, aJobMediaSheetsCompleted);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobStateReason
+//
+//--------------------------------------------------------------------------------------------
+TInt CUPPrintingJob::JobStateReason()
+{
+ return iJobState->Reason();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobState
+//
+//--------------------------------------------------------------------------------------------
+CUPJobState* CUPPrintingJob::JobState()
+{
+ return iJobState;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::PrinterStateUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::PrinterStateUpdated( const TDesC8& aEvent )
+{
+ return iJobState->PrinterStateUpdated(aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::PrinterStateReasonsUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::PrinterStateReasonsUpdated( const TDesC8& aEvent )
+{
+ return iJobState->PrinterStateReasonsUpdated(aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobIdListUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::JobIdListUpdated( const TDesC8& aEvent )
+{
+ return iJobState->JobIdListUpdated(aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobEndStateUpdatedL
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::JobEndStateUpdatedL( const TDesC8& aEvent )
+{
+ return iJobState->JobEndStateUpdatedL(aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobMediaSheetsCompletedUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::JobMediaSheetsCompletedUpdated( const TDesC8& aEvent )
+{
+ return iJobState->JobMediaSheetsCompletedUpdated(aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobMediaSheetsCompletedUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::JobMediaSheetsCompletedUpdated(const TDesC8& aId, const TDesC8& aEvent )
+{
+ return iJobState->JobMediaSheetsCompletedUpdated(aId, aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::JobAbortStateUpdatedL
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::JobAbortStateUpdatedL( const TDesC8& aEvent )
+{
+ return iJobState->JobAbortStateUpdatedL(aEvent);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CUPPrintingJob::ContentCompleteListUpdated
+//
+//--------------------------------------------------------------------------------------------
+TUPnPState CUPPrintingJob::ContentCompleteListUpdated( const TDesC8& aEvent )
+{
+ return iJobState->ContentCompleteListUpdated(aEvent);
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cuptimer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,187 @@
+/*
+* 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 CUPTimer class
+*
+*/
+
+
+#include <e32svr.h>
+#include <upnpitem.h>
+
+#include "cuptimer.h"
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CUPTimer* CUPTimer::NewL()
+ {
+ CUPTimer* self = NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+CUPTimer* CUPTimer::NewLC()
+ {
+ CUPTimer* self = new (ELeave) CUPTimer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// ~CUPTimer
+// ---------------------------------------------------------------------------
+//
+CUPTimer::~CUPTimer()
+ {
+
+ Cancel();
+
+ if (iTimeOutTimer)
+ {
+ delete iTimeOutTimer;
+ iTimeOutTimer = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SetActiveNow
+// ---------------------------------------------------------------------------
+//
+void CUPTimer::SetActiveNow()
+ {
+ TRequestStatus* statusPtr = &iStatus;
+ User::RequestComplete (statusPtr, KErrNone);
+ }
+
+// ---------------------------------------------------------------------------
+// RunL
+// ---------------------------------------------------------------------------
+//
+void CUPTimer::RunL()
+ {
+ iTimeOutTimer->Cancel();
+ iObserver->TimerExpiredL(iItemToShare);
+ }
+
+// ---------------------------------------------------------------------------
+// RunL
+// ---------------------------------------------------------------------------
+//
+TInt CUPTimer::RunError(TInt aError)
+ {
+ Cancel();
+
+ return aError;
+ }
+
+// ---------------------------------------------------------------------------
+// DoCancel
+// ---------------------------------------------------------------------------
+//
+void CUPTimer::DoCancel()
+ {
+ if (iTimeOutTimer->IsActive())
+ {
+ iTimeOutTimer->Cancel();
+ }
+ return;
+ }
+
+// ---------------------------------------------------------------------------
+// WaitUntilTimeExpired
+// ---------------------------------------------------------------------------
+//
+void CUPTimer::WaitUntilTimeExpired(MUPTimerObserver* aObserver,
+ TTimeIntervalMicroSeconds32 aTimeOut,
+ CUpnpItem* aItemToShare)//,
+ // TRequestStatus &aStatus)
+ {
+
+ /* This might be a little bit dangerous but server knows when to start timer */
+ Cancel();
+
+ iItemToShare = aItemToShare;
+
+ if(!IsActive())
+ {
+ SetActive();
+ }
+
+
+ iObserver = aObserver;
+
+ // Start the time out timer
+ TRAPD(trapError, iTimeOutTimer = CPeriodic::NewL(EPriorityBackground));
+ if (trapError != KErrNone)
+ {
+
+ }
+
+ TCallBack callback(CUPTimer::TimedOut,(TAny*)(this));
+ iTimeOutTimer->Start(aTimeOut, aTimeOut, callback);
+
+ iStatus = KRequestPending;
+ }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CUPTimer::ConstructL()
+ {
+ CActiveScheduler::Add(this);
+ }
+
+// ---------------------------------------------------------------------------
+// CUPTimer
+// ---------------------------------------------------------------------------
+//
+CUPTimer::CUPTimer() : CActive(EPriorityNormal)
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// CancelTimer
+// ---------------------------------------------------------------------------
+//
+
+void CUPTimer::CancelTimer()
+ {
+ Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// TimedOut
+// ---------------------------------------------------------------------------
+//
+TInt CUPTimer::TimedOut(TAny* aPtr)
+ {
+ CUPTimer* obj = reinterpret_cast<CUPTimer*>(aPtr);
+ if (obj)
+ {
+ obj->SetActiveNow();
+ }
+
+ return KErrNone;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/main.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "cupnpprintingdevice.h"
+
+// Entry point to the application DLL
+
+// Map the interface UIDs to implementation factory functions
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( 0x10208A28, CUPnPPrintingDevice::NewL )
+ };
+
+// Exported proxy for instantiation method resolution
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/bwins/xhtmlfilecomposeru.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,47 @@
+EXPORTS
+ ??0CImageInfo@@QAE@XZ @ 1 NONAME ; CImageInfo::CImageInfo(void)
+ ?UnitToPixel@CXhtmlFileComposer@@AAENN@Z @ 2 NONAME ; double CXhtmlFileComposer::UnitToPixel(double)
+ ?CreateXhtmlFileL@CXhtmlFileComposer@@QAEXABV?$RArray@VCImageInfo@@@@HHHABVTDesC16@@AAHH@Z @ 3 NONAME ; void CXhtmlFileComposer::CreateXhtmlFileL(class RArray<class CImageInfo> const &, int, int, int, class TDesC16 const &, int &, int)
+ ?UriLog@CImageInfo@@SAXABVTDesC16@@AAVTDes16@@@Z @ 4 NONAME ; void CImageInfo::UriLog(class TDesC16 const &, class TDes16 &)
+ ??1CXhtmlFileComposer@@UAE@XZ @ 5 NONAME ; CXhtmlFileComposer::~CXhtmlFileComposer(void)
+ ?Index@CImageInfo@@QBEHXZ @ 6 NONAME ; int CImageInfo::Index(void) const
+ ??0CImageInfo@@QAE@ABV0@@Z @ 7 NONAME ; CImageInfo::CImageInfo(class CImageInfo const &)
+ ?EncodeFileNameL@CImageInfo@@AAEXAAVTDes8@@@Z @ 8 NONAME ; void CImageInfo::EncodeFileNameL(class TDes8 &)
+ ?EncodeUriL@CImageInfo@@QAEXABVTDesC16@@AAVTDes8@@@Z @ 9 NONAME ; void CImageInfo::EncodeUriL(class TDesC16 const &, class TDes8 &)
+ ?GetFilePath@CImageInfo@@QBEXAAVTDes8@@@Z @ 10 NONAME ; void CImageInfo::GetFilePath(class TDes8 &) const
+ ?EncodeUriL@CImageInfo@@QAEXABVTDesC8@@AAVTDes8@@@Z @ 11 NONAME ; void CImageInfo::EncodeUriL(class TDesC8 const &, class TDes8 &)
+ ?PixelToUnit@CXhtmlFileComposer@@AAE?AVTSizeReal@@V2@@Z @ 12 NONAME ; class TSizeReal CXhtmlFileComposer::PixelToUnit(class TSizeReal)
+ ?ConvertToUnicodeL@CImageInfo@@SAXABVTDesC8@@AAVTDes16@@@Z @ 13 NONAME ; void CImageInfo::ConvertToUnicodeL(class TDesC8 const &, class TDes16 &)
+ ?GetUriL@CImageInfo@@QBEXAAVTDes16@@@Z @ 14 NONAME ; void CImageInfo::GetUriL(class TDes16 &) const
+ ?SetId@CImageInfo@@QAEXH@Z @ 15 NONAME ; void CImageInfo::SetId(int)
+ ?Id@CImageInfo@@QBEHXZ @ 16 NONAME ; int CImageInfo::Id(void) const
+ ?UriLog@CImageInfo@@SAXABVTDesC8@@@Z @ 17 NONAME ; void CImageInfo::UriLog(class TDesC8 const &)
+ ?UriLog@CImageInfo@@SAXABVTDesC16@@@Z @ 18 NONAME ; void CImageInfo::UriLog(class TDesC16 const &)
+ ?SetUriL@CImageInfo@@QAEXABVTDesC16@@@Z @ 19 NONAME ; void CImageInfo::SetUriL(class TDesC16 const &)
+ ?ConstructL@CImageInfo@@IAEXXZ @ 20 NONAME ; void CImageInfo::ConstructL(void)
+ ?Copies@CImageInfo@@QBEHXZ @ 21 NONAME ; int CImageInfo::Copies(void) const
+ ?GetEncodedUriL@CImageInfo@@QAEXAAVTDes8@@@Z @ 22 NONAME ; void CImageInfo::GetEncodedUriL(class TDes8 &)
+ ?NewL@CImageInfo@@SAPAV1@ABV1@@Z @ 23 NONAME ; class CImageInfo * CImageInfo::NewL(class CImageInfo const &)
+ ?UnitToPixel@CXhtmlFileComposer@@AAE?AVTSizeReal@@V2@@Z @ 24 NONAME ; class TSizeReal CXhtmlFileComposer::UnitToPixel(class TSizeReal)
+ ??1CImageInfo@@UAE@XZ @ 25 NONAME ; CImageInfo::~CImageInfo(void)
+ ?SetFilePath@CImageInfo@@QAEXABVTDesC8@@@Z @ 26 NONAME ; void CImageInfo::SetFilePath(class TDesC8 const &)
+ ?CompareUri@CImageInfo@@QAEHABVTDesC8@@@Z @ 27 NONAME ; int CImageInfo::CompareUri(class TDesC8 const &)
+ ?NewLC@CImageInfo@@SAPAV1@ABV1@@Z @ 28 NONAME ; class CImageInfo * CImageInfo::NewLC(class CImageInfo const &)
+ ?NewLC@CXhtmlFileComposer@@SAPAV1@ABVTDesC16@@@Z @ 29 NONAME ; class CXhtmlFileComposer * CXhtmlFileComposer::NewLC(class TDesC16 const &)
+ ?SetUri@CImageInfo@@QAEXABVTDesC8@@H@Z @ 30 NONAME ; void CImageInfo::SetUri(class TDesC8 const &, int)
+ ?SetCopies@CImageInfo@@QAEXH@Z @ 31 NONAME ; void CImageInfo::SetCopies(int)
+ ?GetFilePathL@CImageInfo@@QBEXAAVTDes16@@@Z @ 32 NONAME ; void CImageInfo::GetFilePathL(class TDes16 &) const
+ ?SetFilePathL@CImageInfo@@QAEXABVTDesC16@@@Z @ 33 NONAME ; void CImageInfo::SetFilePathL(class TDesC16 const &)
+ ?CompareFilePath@CImageInfo@@QAEHABVTDesC8@@@Z @ 34 NONAME ; int CImageInfo::CompareFilePath(class TDesC8 const &)
+ ?CompareUri@CImageInfo@@QAEHABVTDesC16@@@Z @ 35 NONAME ; int CImageInfo::CompareUri(class TDesC16 const &)
+ ?NewL@CXhtmlFileComposer@@SAPAV1@ABVTDesC16@@@Z @ 36 NONAME ; class CXhtmlFileComposer * CXhtmlFileComposer::NewL(class TDesC16 const &)
+ ?ConvertToUTF8L@CImageInfo@@SAXABVTDesC16@@AAVTDes8@@@Z @ 37 NONAME ; void CImageInfo::ConvertToUTF8L(class TDesC16 const &, class TDes8 &)
+ ?NewL@CImageInfo@@SAPAV1@XZ @ 38 NONAME ; class CImageInfo * CImageInfo::NewL(void)
+ ?SetIndex@CImageInfo@@QAEXH@Z @ 39 NONAME ; void CImageInfo::SetIndex(int)
+ ?GetUri@CImageInfo@@QBEXAAVTDes8@@@Z @ 40 NONAME ; void CImageInfo::GetUri(class TDes8 &) const
+ ?NewLC@CImageInfo@@SAPAV1@XZ @ 41 NONAME ; class CImageInfo * CImageInfo::NewLC(void)
+ ?UriLog@CImageInfo@@SAXABVTDesC8@@AAVTDes8@@@Z @ 42 NONAME ; void CImageInfo::UriLog(class TDesC8 const &, class TDes8 &)
+ ?CompareFilePath@CImageInfo@@QAEHABVTDesC16@@@Z @ 43 NONAME ; int CImageInfo::CompareFilePath(class TDesC16 const &)
+ ?PixelToUnit@CXhtmlFileComposer@@AAENN@Z @ 44 NONAME ; double CXhtmlFileComposer::PixelToUnit(double)
+ ?AppendL@CImageInfo@@SAXPAVHBufC8@@ABVTDesC8@@@Z @ 45 NONAME ; void CImageInfo::AppendL(class HBufC8 *, class TDesC8 const &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/data/xhtmlfiletemplate.txt Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<!-- adaptive-template - 02.19.04 - version 0.1 -->
+
+ <head>
+ <meta name="copyright" content="Copyright 2005 Nokia"/>
+ <title>XHTML-print template</title>
+ <style type="text/css">
+ @media print { @page {size:<<pageWidth>> <<pageHeight>>; margin:<<pageMargin>>;}}
+
+ body { padding:0mm; }
+
+ div.page { position:relative; page-break-after:always; }
+ div.page_last { position:relative;}
+
+ #img_frame {
+ overflow:hidden;
+ padding:0mm;
+ position:absolute;
+ width:<<imgFrameWidth>>; height:<<imgFrameHeight>>;}
+
+ <<framePosition>>
+ <<imageDetails>>
+
+ </style>
+ </head>
+
+ <body>
+ <<page>>
+ </body>
+</html>
+
+<!--
+<<positionStart>>
+ .position<<posId>> {top:<<positionTop>>; left:<<positionLeft>>;}<<positionEnd>>
+<<imgStart>>
+ .img_details<<detId>> { width:<<imgWidth>>; height:<<imgHeight>>; margin-<<imgMargin>>; image-orientation:<<imgOrientation>>;}<<imgEnd>>
+<<frameStart>>
+ <div id="img_frame" class="position<<posId>>">
+ <img class="img_details<<detId>>" src="<<imgName>>" alt=""/>
+ </div> <<frameEnd>>
+<<pageStart>>
+ <div class="<<pageType>>">
+ <<frame>>
+ </div> <<pageEnd>>
+-->
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/eabi/xhtmlfilecomposeru.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,57 @@
+EXPORTS
+ _ZN10CImageInfo10CompareUriERK6TDesC8 @ 1 NONAME
+ _ZN10CImageInfo10CompareUriERK7TDesC16 @ 2 NONAME
+ _ZN10CImageInfo10ConstructLEv @ 3 NONAME
+ _ZN10CImageInfo10EncodeUriLERK6TDesC8R5TDes8 @ 4 NONAME
+ _ZN10CImageInfo10EncodeUriLERK7TDesC16R5TDes8 @ 5 NONAME
+ _ZN10CImageInfo11SetFilePathERK6TDesC8 @ 6 NONAME
+ _ZN10CImageInfo12SetFilePathLERK7TDesC16 @ 7 NONAME
+ _ZN10CImageInfo14ConvertToUTF8LERK7TDesC16R5TDes8 @ 8 NONAME
+ _ZN10CImageInfo14GetEncodedUriLER5TDes8 @ 9 NONAME
+ _ZN10CImageInfo15CompareFilePathERK6TDesC8 @ 10 NONAME
+ _ZN10CImageInfo15CompareFilePathERK7TDesC16 @ 11 NONAME
+ _ZN10CImageInfo15EncodeFileNameLER5TDes8 @ 12 NONAME
+ _ZN10CImageInfo17ConvertToUnicodeLERK6TDesC8R6TDes16 @ 13 NONAME
+ _ZN10CImageInfo4NewLERKS_ @ 14 NONAME
+ _ZN10CImageInfo4NewLEv @ 15 NONAME
+ _ZN10CImageInfo5NewLCERKS_ @ 16 NONAME
+ _ZN10CImageInfo5NewLCEv @ 17 NONAME
+ _ZN10CImageInfo5SetIdEi @ 18 NONAME
+ _ZN10CImageInfo6SetUriERK6TDesC8i @ 19 NONAME
+ _ZN10CImageInfo6UriLogERK6TDesC8 @ 20 NONAME
+ _ZN10CImageInfo6UriLogERK6TDesC8R5TDes8 @ 21 NONAME
+ _ZN10CImageInfo6UriLogERK7TDesC16 @ 22 NONAME
+ _ZN10CImageInfo6UriLogERK7TDesC16R6TDes16 @ 23 NONAME
+ _ZN10CImageInfo7AppendLEP6HBufC8RK6TDesC8 @ 24 NONAME
+ _ZN10CImageInfo7SetUriLERK7TDesC16 @ 25 NONAME
+ _ZN10CImageInfo8SetIndexEi @ 26 NONAME
+ _ZN10CImageInfo9SetCopiesEi @ 27 NONAME
+ _ZN10CImageInfoC1ERKS_ @ 28 NONAME
+ _ZN10CImageInfoC1Ev @ 29 NONAME
+ _ZN10CImageInfoC2ERKS_ @ 30 NONAME
+ _ZN10CImageInfoC2Ev @ 31 NONAME
+ _ZN10CImageInfoD0Ev @ 32 NONAME
+ _ZN10CImageInfoD1Ev @ 33 NONAME
+ _ZN10CImageInfoD2Ev @ 34 NONAME
+ _ZN18CXhtmlFileComposer11PixelToUnitE9TSizeReal @ 35 NONAME
+ _ZN18CXhtmlFileComposer11PixelToUnitEd @ 36 NONAME
+ _ZN18CXhtmlFileComposer11UnitToPixelE9TSizeReal @ 37 NONAME
+ _ZN18CXhtmlFileComposer11UnitToPixelEd @ 38 NONAME
+ _ZN18CXhtmlFileComposer16CreateXhtmlFileLERK6RArrayI10CImageInfoEiiiRK7TDesC16Rii @ 39 NONAME
+ _ZN18CXhtmlFileComposer4NewLERK7TDesC16 @ 40 NONAME
+ _ZN18CXhtmlFileComposer5NewLCERK7TDesC16 @ 41 NONAME
+ _ZN18CXhtmlFileComposerD0Ev @ 42 NONAME
+ _ZN18CXhtmlFileComposerD1Ev @ 43 NONAME
+ _ZN18CXhtmlFileComposerD2Ev @ 44 NONAME
+ _ZNK10CImageInfo11GetFilePathER5TDes8 @ 45 NONAME
+ _ZNK10CImageInfo12GetFilePathLER6TDes16 @ 46 NONAME
+ _ZNK10CImageInfo2IdEv @ 47 NONAME
+ _ZNK10CImageInfo5IndexEv @ 48 NONAME
+ _ZNK10CImageInfo6CopiesEv @ 49 NONAME
+ _ZNK10CImageInfo6GetUriER5TDes8 @ 50 NONAME
+ _ZNK10CImageInfo7GetUriLER6TDes16 @ 51 NONAME
+ _ZTI10CImageInfo @ 52 NONAME ; #<TI>#
+ _ZTI18CXhtmlFileComposer @ 53 NONAME ; #<TI>#
+ _ZTV10CImageInfo @ 54 NONAME ; #<VT>#
+ _ZTV18CXhtmlFileComposer @ 55 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* 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: Build file for XHTML File Composer library
+*
+*/
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../data/xhtmlfiletemplate.txt /epoc32/data/z/resource/imageprintdata/protocols/xhtmlfiletemplate.txt
+
+PRJ_MMPFILES
+./xhtmlfilecomposer.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/group/xhtmlfilecomposer.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,61 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+deffile xhtmlfilecomposer.def
+
+TARGET xhtmlfilecomposer.dll
+
+TARGETTYPE dll
+UID 0x1000008d 0x200009E5
+
+CAPABILITY ALL -TCB
+
+// Include paths
+USERINCLUDE ../inc
+USERINCLUDE ../../../ImagePrintLibrary/inc
+USERINCLUDE ../../../inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+// Sources
+SOURCEPATH ../src
+SOURCE cxhtmlfilecomposer.cpp
+SOURCE cimageinfo.cpp
+
+DEBUGLIBRARY flogger.lib
+
+LIBRARY charconv.lib
+LIBRARY efsrv.lib
+LIBRARY euser.lib
+LIBRARY fbscli.lib
+LIBRARY imageconversion.lib
+LIBRARY jpegyuvdecoder.lib
+LIBRARY inetprotutil.lib
+LIBRARY platformenv.lib
+
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/cimageinfo.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,118 @@
+/*
+* 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: Contains the declarations for miscellanous image information.
+*
+*/
+
+
+#ifndef CIMAGEINFO_H
+#define CIMAGEINFO_H
+
+#include "xhtmlfilecomposerconst.h"
+
+/**
+* @class CImageInfo
+* @brief A simple class for miscellaneous information of an image to be printed.
+*
+* This class contains information of the image, required in several phases of the process.
+* The data included is not all required for composing XHTML file but also for other use of the
+* image data from the printing job creation to the end of job printing.
+*/
+class CImageInfo : public CBase
+{
+ public:
+ IMPORT_C CImageInfo();
+ IMPORT_C CImageInfo(const CImageInfo& a);
+ IMPORT_C ~CImageInfo();
+
+ // statics
+ IMPORT_C static CImageInfo* NewL();
+ IMPORT_C static CImageInfo* NewL(const CImageInfo& a);
+ IMPORT_C static CImageInfo* NewLC();
+ IMPORT_C static CImageInfo* NewLC(const CImageInfo& a);
+
+
+ IMPORT_C static void ConvertToUTF8L(const TDesC& aSource, TDes8& aResult);
+
+ IMPORT_C static void ConvertToUnicodeL(const TDesC8& aSource, TDes& aResult);
+
+ IMPORT_C static void AppendL(HBufC8* aWhere, const TDesC8& aWhat);
+
+ IMPORT_C static void UriLog(const TDesC8& aUri);
+ IMPORT_C static void UriLog(const TDesC& aUri);
+ IMPORT_C static void UriLog(const TDesC8& aUri, TDes8& aConvert);
+ IMPORT_C static void UriLog(const TDesC& aUri, TDes& aConvert);
+
+ // non-statics
+ IMPORT_C void EncodeUriL(const TDesC16& aDecodedUri, TDes8& aEncodedUri);
+ IMPORT_C void EncodeUriL(const TDesC8& aDecodedUri, TDes8& aEncodedUri);
+
+ IMPORT_C void SetUri(const TDesC8& aUri, const TBool aEncoded=EFalse);
+ IMPORT_C void SetUriL(const TDesC& aUri);
+
+ IMPORT_C void GetUri(TDes8& aUri) const;
+ IMPORT_C void GetUriL(TDes& aUri) const;
+ IMPORT_C void GetEncodedUriL(TDes8& aUri);
+ IMPORT_C TBool CompareUri(const TDesC& aUri);
+ IMPORT_C TBool CompareUri(const TDesC8& aUri);
+
+ IMPORT_C void SetFilePath(const TDesC8& aFilePath);
+ IMPORT_C void SetFilePathL(const TDesC& aFilePath);
+
+ IMPORT_C void GetFilePath(TDes8& aFilePath) const;
+ IMPORT_C void GetFilePathL(TDes& aFilePath) const;
+ IMPORT_C TBool CompareFilePath(const TDesC& aFilePath);
+ IMPORT_C TBool CompareFilePath(const TDesC8& aFilePath);
+
+ IMPORT_C void SetId(const TInt aId);
+ IMPORT_C TInt Id() const;
+
+ IMPORT_C void SetCopies(const TInt aCopies);
+ IMPORT_C TInt Copies() const;
+
+ IMPORT_C void SetIndex(const TInt aIndex);
+ IMPORT_C TInt Index() const;
+
+
+ protected:
+ IMPORT_C void ConstructL();
+
+ private:
+ IMPORT_C void EncodeFileNameL(TDes8& aString);
+
+ /** @var TFileName8 iUri
+ * @brief Image's shared uri used as a reference to the image. */
+ TFileName8 iUri;
+ TBool iEncoded;
+
+ /** @var TFileName8 iFilePath
+ * @brief File location in local file system otherway zero length. */
+ TFileName8 iFilePath;
+
+ /** @var TInt iId
+ * @brief Id of shared image. */
+ TInt iId;
+
+ /** @var TInt iCopies
+ * @brief Number of copies to print of this image */
+ TInt iCopies;
+
+ /** @var TInt iIndex
+ * @brief Index for mapping the number of copies to correct image */
+ TInt iIndex;
+};
+
+#endif // CIMAGEINFO_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/cxfclogger.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,184 @@
+/*
+* 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 logging macros
+*
+*/
+
+
+#ifndef CXFCLOGGER_H
+#define CXFCLOGGER_H
+
+#include "logdef.h"
+
+/**
+ * @file CXFCLogger.h
+ * @brief Declares logging macros.
+ *
+ * @note Link to flogger.lib in MMP file. Use DEBUGLIBRARY -keyword to avoid
+ * warnings in release builds.\n
+ * @code DEBUGLIBRARY flogger.lib @endcode
+ *
+ * @b Usage: \n
+ * @code LOG("[MODULE_NAME]\t Trace text here"); @endcode
+ *
+ * Trace target can be changed below (file logging needs directory @c c:\\logs\\upnp )\n
+ * #define __FLOGGING__ -row uncommented (default) = File logging \n
+ * #define __CLOGGING__ -row uncommented = Console logging \n
+ */
+
+
+#ifdef ENABLE_LOGGING
+// Define one of these flags:
+// FLOGGING = File logging
+// CLOGGING = Console logging
+#define __FLOGGING__
+//#define __CLOGGING__
+#endif
+
+// Then actual definitions depending on the
+// flag values.
+
+#ifdef ENABLE_LOGGING
+
+ #include <e32std.h>
+ #include <f32file.h>
+
+
+ // Actual log file name
+ _LIT(KLogFile,"CXFPLog.txt");
+
+ // Subdirectory under c:\logs -directory -- MUST EXIST.
+ _LIT(KLogDir, "upnp");
+
+ /// The format in which the time is formatted in log
+ _LIT( KLogTimeFormat, "%02d.%02d:%02d:%06d ");
+ _LIT8( KLogTimeFormat8, "%02d.%02d:%02d:%06d ");
+
+ // The length of the string produced by KLogTimeFormat
+ const TInt KLogTimeFormatLength = 16;
+
+ // How many characters a log line can contain
+ const TInt KLogLineLength = 256;
+
+
+ #include <f32file.h>
+ #include <flogger.h>
+
+
+ // Define the top level macros
+ #define LOG(a) {Print( _L(a) ) ;}
+ #define LOG1(s, v) {Print( _L(s), v );}
+ #define LOG2(s, v1, v2) {Print( _L(s), v1, v2 );}
+
+ #define LOG8(a) {Print8( _L8(a) );}
+ #define LOG81(s, v) {Print8( _L8(s), v );}
+ #define LOG82(s, v1, v2) {Print8( _L8(s), v1, v2 );}
+
+ #ifdef __FLOGGING__
+
+ inline void Print( TRefByValue<const TDesC> aText, ... )
+ {
+ VA_LIST args;
+ VA_START( args, aText );
+
+ TBuf<256> buf;
+ buf.FormatList( aText, args );
+
+ RFileLogger logger;
+ TInt ret = logger.Connect();
+ if (ret==KErrNone)
+ {
+ logger.SetDateAndTime( EFalse,EFalse );
+ logger.CreateLog( KLogDir, KLogFile, EFileLoggingModeAppend );
+ TBuf<KLogTimeFormatLength> timeStamp;
+ TTime now;
+ now.HomeTime();
+ TDateTime dateTime;
+ dateTime = now.DateTime();
+ timeStamp.Format( KLogTimeFormat,
+ dateTime.Hour(), dateTime.Minute(),
+ dateTime.Second(), dateTime.MicroSecond() );
+ buf.Insert( 0, timeStamp );
+
+ logger.Write(buf);
+ }
+
+ logger.Close();
+ VA_END( args );
+ }
+
+ inline void Print8( TRefByValue<const TDesC8> aText, ... )
+ {
+ VA_LIST args;
+ VA_START( args, aText );
+
+ TBuf8<256> buf;
+ buf.FormatList( aText, args );
+
+ RFileLogger logger;
+ TInt ret = logger.Connect();
+ if (ret==KErrNone)
+ {
+ logger.SetDateAndTime( EFalse,EFalse );
+ logger.CreateLog( KLogDir, KLogFile, EFileLoggingModeAppend );
+ TBuf8<KLogTimeFormatLength> timeStamp;
+ TTime now;
+ now.HomeTime();
+ TDateTime dateTime;
+ dateTime = now.DateTime();
+ timeStamp.Format( KLogTimeFormat8,
+ dateTime.Hour(), dateTime.Minute(),
+ dateTime.Second(), dateTime.MicroSecond() );
+ buf.Insert( 0, timeStamp );
+
+ logger.Write(buf);
+ }
+
+ logger.Close();
+ VA_END( args );
+ }
+
+ #else
+ // Console Logging on
+ #define Print RDebug::Print
+
+ #define LOGS(a1, a2) {\
+ TBuf<1000> log;\
+ log.Append(_L(a1));\
+ log.Append(a2);\
+ Print(log );}
+
+ #define LOG8S(a1, a2) {\
+ TBuf8<1000> log;\
+ log.Append(_L8(a1));\
+ log.Append(a2);\
+ Print(log );}
+ #endif // __FLOGGING__
+
+#else
+
+ // DEBUG build is not on --> no logging at all
+ #define LOG(a)
+ #define LOG1(s, v)
+ #define LOG2(s, v1, v2)
+
+ #define LOG8(a)
+ #define LOG81(s, v)
+ #define LOG82(s, v1, v2)
+
+#endif // ENABLE_LOGGING
+
+#endif // CXFCLOGGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/cxhtmlfilecomposer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,342 @@
+/*
+* 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: Defines the CXhtmlFileComposer class.
+*
+*/
+
+
+#ifndef CXHTMLFILECOMPOSER_H
+#define CXHTMLFILECOMPOSER_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <e32math.h>
+
+#include "xfctemplates.h"
+#include "xhtmlfilecomposerconst.h"
+#include "cimageinfo.h"
+
+/**
+* @class CXhtmlFileComposer
+* @brief Implements the printing job compose to a XHTML file.
+*/
+
+/**
+* @example ExampleOfCreateXhtmlFile.cpp
+* This example
+* @li creates a list of images to be included in XHTML-file as CImageInfo classes
+* @li creates a new instance of this class
+* @li calls the CreateXhtmlFileL method to create the physical file
+*/
+
+class CXhtmlFileComposer : public CBase
+ {
+ public:
+
+ /**
+ * @enum TMeasureUnit
+ *
+ * The measure type is used in XHTML file for describing the unit for dimensions like
+ * page, frame and image sizes, frame positions at the page etc.
+ * Depending of the paper size type the two units of the measure is used: inches and millimeters.
+ */
+ enum TMeasureUnit
+ {
+ EUAInches, ///<@brief Inch unit identifier.
+ EUAMillis ///<@brief Millimeter unit identifier.
+ };
+
+ public:
+
+ /** NewL
+ * @brief Creates a new instance of XHTML file composer.
+ * @param aPath The path the XHTML file will be located.\n
+ * If @a aPath is empty, the @ref KXFPDefaultResultPath is used to open the file
+ * server session and to create path. Otherway the file name given in method
+ * @ref CreateXhtmlFileL can be the name of the file without path.
+ * @return Pointer to the instance.
+ */
+ IMPORT_C static CXhtmlFileComposer* NewL(const TDesC& aPath);
+
+ /** NewLC
+ * @brief Creates a new instance of XHTML file composer and leaves it in the cleanup stack.
+ * @param aPath The path the XHTML file will be located.\n
+ * If @a aPath is empty, the @ref KXFPDefaultResultPath is used to open the file
+ * server session and to create path. Otherway the file name given in method
+ * @ref CreateXhtmlFileL can be the name of the file without path.
+ * @return Pointer to the instance.
+ */
+ IMPORT_C static CXhtmlFileComposer* NewLC(const TDesC& aPath);
+
+ /** ~CXhtmlFileComposer
+ * @brief Destructor.
+ */
+ IMPORT_C ~CXhtmlFileComposer();
+
+ /** CreateXhtmlFileL
+ * @brief Writes the XHTML-Print document of the job according to the given parameters.
+ * @param aImages Array of the images to write in file
+ * @param aLayout Jobs' <em>Number up</em> setting
+ * @param aPaperSize Jobs' <em>Media size</em> setting
+ * @param aQuality Jobs' <em>Quality</em> setting <b>not implemented</b>
+ * @param aXhtmlPrintFile The name of the file to generate. The file name can be given
+ * without the path, when the file is located in the @a aPath given when the
+ * instance of this class is created. The @a aXhtmlPrintFile can be also given
+ * with the path, but then the path must already exist.
+ * @param aPageCount Returns the number of pages to print
+ */
+ IMPORT_C void CreateXhtmlFileL(const RArray<CImageInfo>& aImages, const TInt aLayout,
+ const TInt aPaperSize, const TInt aQuality,
+ const TDesC& aXhtmlPrintFile, TInt& aPageCount, TBool aDataFile = EFalse);
+
+
+ protected:
+
+ /** ConstructL
+ * @brief Symbian second phase constructor.
+ * @param aPath The path the XHTML file will be located.\n
+ * If @a aPath is empty, the @ref KXFPDefaultResultPath is used to open the file
+ * server session and the path is created. This ensures the argument @a aXhtmlPrintFile
+ * of the method @ref CreateXhtmlFileL can be given without path.
+ */
+ void ConstructL(const TDesC& aPath);
+
+
+ private:
+
+ /** CXhtmlFileComposer
+ * @brief C++ constructor
+ */
+ CXhtmlFileComposer();
+
+ /** UnitToPixel
+ * @brief Converts current unit to pixels.
+ * @param aValue Inch/millimeter value
+ * @return Pixel value
+ */
+ IMPORT_C TReal UnitToPixel(TReal aValue);
+
+ /** UnitToPixel
+ * @brief Converts current unit to pixels.
+ * @param aValue Inch/millimeter value
+ * @return Pixel value
+ */
+ IMPORT_C TSizeReal UnitToPixel(TSizeReal aValue);
+
+ /** PixelToUnit
+ * @brief Converts pixels to current unit.
+ * @param aValue pixel value
+ * @return Inch/millimeter value
+ */
+ IMPORT_C TReal PixelToUnit(TReal aValue);
+
+ /** PixelToUnit
+ * @brief Converts pixels to current unit.
+ * @param aValue pixel value
+ * @return Inch/millimeter value
+ */
+ IMPORT_C TSizeReal PixelToUnit(TSizeReal aValue);
+
+ /** ReadTemplateL
+ * @brief Reads the template file in iFileBuf
+ */
+ void ReadTemplateFileL();
+
+ /** GetRatioL
+ * @brief Counts the croping and scaling of the image
+ * @param aNewSize Cropped and scaled size for the image
+ * @param aImageSize Full string to define the margin in XHTML file
+ */
+ void GetRatioL(TSizeReal &aNewSize, TSizeReal aImageSize);
+
+ /** ComposeUnitL
+ * @brief Converts the template to current unit (millimeters or inches) in member buffer.
+ */
+ void ComposeUnitL();
+
+ /** ComposeTemplateL
+ * @brief Replaces the template with string value in member buffer
+ * @param aStr String to convert for
+ * @param aTemplate Template to convert
+ */
+ void ComposeTemplateL(const TDesC8 &aStr, const TDesC8 &aTemplate);
+
+ /** ComposeTemplateL
+ * @brief Replaces the template with number value in member buffer
+ * @param aValue Number to convert for
+ * @param aTemplate Template to convert
+ */
+ void ComposeTemplateL(const TInt aValue, const TDesC8 &aTemplate);
+
+ /** ComposeFileL
+ * @brief Composes the data in the template in member buffer
+ * @param aImageName Image name and path
+ * @param aImgSize Image size
+ */
+ void ComposeFileL(const TDes8 &aImageName, TSizeReal aImgSize, TBool aDataFile = EFalse);
+
+ /** PageData
+ * @brief Collects the paper size related data to page arguments
+ * @param aPaperSize Media size
+ */
+ void PageData(TInt aPaperSize);
+
+ /** LayoutData
+ * @brief Collects the layout related data to image frame arguments
+ * @param aLayout Layout
+ * @param aPositions Array of the image positions on the page
+ */
+ void LayoutData(TInt aLayout, RArray<TSizeReal> &aPositions);
+
+ /** FinalizeBufferL
+ * @brief Trims the member buffer tail. Replacing the template strings from
+ * the buffer makes the data length in the buffer vary and generates
+ * rubbish in the end of buffer.
+ * @return Pointer to the buffer data.
+ */
+ TPtrC8 FinalizeBufferL();
+
+ /** SetPageTypeL
+ * @brief Creates a new XHTML div for page. Last/only one must be always @c page_last.
+ */
+ void SetPageTypeL();
+
+ /** GetTemplateStringL
+ * @brief Reads the requested element's template for the XHTML file.
+ * @param aStart Start marker tag for the element
+ * @param aEnd End marker tag for the element
+ * @param aTemplate Reference to the template element read
+ * @return Pointer to the template element read
+ */
+ TPtrC8 GetTemplateStringL(const TDesC8& aStart, const TDesC8& aEnd, TDes8& aTemplate);
+
+ /** AddTemplateStringL
+ * @brief Adds the template element in XHTML buffer
+ * @param const TDesC8& The template element to add
+ * @param const TDesC8& A marker tag to where to add the element
+ */
+ void AddTemplateStringL(const TDesC8& aTemplate,const TDesC8& aTag);
+
+ /** GetImageSize
+ * @brief Returns the size in pixels of the image file
+ * @param CImageInfo Image's info
+ * @return Image size
+ */
+ TSizeReal GetImageSizeL(CImageInfo aImage);
+
+ /** AddPageL
+ * @brief Adds the new page element in XHTML template if last one is full
+ * @param aCurrentImage Index of the current image
+ * @param aPositionIndex Reference to the index of the image position at page
+ * @param aPageCount Reference to the page counter
+ * @return True if page added, False if not.
+ */
+ TBool AddPageL(TInt aCurrentImage, TInt& aPositionIndex, TInt& aPageCount);
+
+ /** CreateMatrix
+ * @brief Creates a list of positions at page for the grid of images.
+ * @param aRows Number of rows at one page
+ * @param aColumns Number of columns at one page
+ * @param aPortrait Orientation of the paper vs. images
+ * @param aPositions Reference to the array of the positions
+ */
+ void CreateMatrix(TInt aRows, TInt aColumns, RArray<TSizeReal>& aPositions);
+
+ /** GetImageNameL
+ * @brief Returns the name of the image for IMG tag.
+ * @param aImageInfo Image details
+ * @param aImageName Reference to the image name
+ */
+ void GetImageNameL(CImageInfo aImageInfo, TDes8 &aImageName, TBool aDataFile = EFalse);
+
+ /** SizeAndOrientationL
+ * @brief Returns the size and orientation of the image.
+ * @param aImageInfo Image details
+ * @param aImageSize Reference to the image size
+ * @param aFramePortrait Returns True if image is portrait, otherway False
+ */
+ void SizeAndOrientationL(const CImageInfo aImageInfo, TSizeReal& aImageSize, TBool& aFramePortrait);
+
+ /** ComposePositionL
+ * @brief Composes the position string identifier values in XHTML file.
+ * @param aPositionIndex index of the position to compose
+ * @param aPositions The array of the positions
+ */
+ void ComposePositionL(TInt aPositionIndex, RArray<TSizeReal>& aPositions);
+
+ /** FormatReal
+ * @brief Composes the position string identifier values in XHTML file.
+ * @param aNumber float number to convert
+ * @param aString Converted string type of "%f<<units>>"
+ */
+ void FormatReal(TRealX aNumber, TDes8& aString);
+
+ private:
+
+ /** @var TSizeReal iPaperSize
+ * Paper size to print */
+ TSizeReal iPaperSize;
+
+ /** @var TInt iPaperType
+ * Measurement unit (millimeters or inches) in XHTML file */
+ TInt iPaperType;
+
+ /** @var TReal iPageMargin
+ * Marginals at the page */
+ TReal iPageMargin;
+
+ /** @var TSizeReal iImageFrame
+ * Frame to contain an image */
+ TSizeReal iImageFrame;
+
+ /** @var HBufC8* iFileBuf
+ * Buffer to read the template file */
+ HBufC8* iFileBuf;
+
+ /** @var RFs iFsSession
+ * File server session */
+ RFs iFsSession;
+
+ /** @var TInt iImagesPerPage
+ * Number of the images at one page */
+ TInt iImagesPerPage;
+
+ /** @var TBool iImagePortrait
+ * The orientation of the image. TRUE if portrait, FALSE if landscape */
+ TBool iImagePortrait;
+
+ /** @var TBool iPagePortrait
+ * The orientation of the page. TRUE if portrait, FALSE if landscape */
+ TBool iPagePortrait;
+
+ /** @var TBlock iPageTemplate
+ * Page element template of the XHTML file */
+ TBlock iPageTemplate;
+
+ /** @var TBlock iFrameTemplate
+ * Frame element template of the XHTML file */
+ TBlock iFrameTemplate;
+
+ /** @var TBlock iPositionTemplate
+ * Image position element template of the XHTML file */
+ TBlock iPositionTemplate;
+
+ /** @var TBlock iImageTemplate
+ * Image element template of the XHTML file */
+ TBlock iImageTemplate;
+ };
+
+#endif // CXHTMLFILECOMPOSER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/xfctemplates.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,80 @@
+/*
+* 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: Contains template tags and sections used to handle XHTML template file.
+*
+*/
+
+
+#ifndef XFCTEMPLATES_H
+#define XFCTEMPLATES_H
+
+
+#include "cxhtmlfilecomposer.h"
+
+ _LIT( KXHTMLTemplate, "z:\\resource\\imageprintdata\\protocols\\xhtmltempl\\xhtmlfiletemplate.txt" );
+
+_LIT8(KPageWidth, "<<pageWidth>>");
+_LIT8(KPageHeight, "<<pageHeight>>");
+_LIT8(KPageMargin, "<<pageMargin>>");
+
+_LIT8(KImgWidth, "<<imgWidth>>");
+_LIT8(KImgHeight, "<<imgHeight>>");
+_LIT8(KImgMargin, "<<imgMargin>>");
+_LIT8(KImgOrientation, "<<imgOrientation>>");
+
+_LIT8(KPositionTop, "<<positionTop>>");
+_LIT8(KPositionLeft, "<<positionLeft>>");
+
+_LIT8(KImgFrameWidth, "<<imgFrameWidth>>");
+_LIT8(KImgFrameHeight, "<<imgFrameHeight>>");
+
+_LIT8(KId, "<<id>>");
+_LIT8(KPosId, "<<posId>>");
+_LIT8(KDetId, "<<detId>>");
+
+_LIT8(KUnit, "<<unit>>");
+_LIT8(KTop, "top:");
+_LIT8(KLeft, "left:");
+
+_LIT8(KDeg, "%ddeg");
+
+_LIT8(KFramePosition, "<<framePosition>>");
+_LIT8(KPositionStart, "<<positionStart>>");
+_LIT8(KPositionEnd, "<<positionEnd>>");
+
+_LIT8(KImgDetails, "<<imageDetails>>");
+_LIT8(KImgStart, "<<imgStart>>");
+_LIT8(KImgEnd, "<<imgEnd>>");
+
+_LIT8(KEndTag, "</html>");
+
+_LIT8(KPage, "<<page>>");
+
+_LIT8(KPageType, "<<pageType>>");
+_LIT8(KPageFirsts, "page");
+_LIT8(KPageLast, "page_last");
+
+_LIT8(KPageStart, "<<pageStart>>");
+_LIT8(KPageEnd, "<<pageEnd>>");
+
+_LIT8(KFrame, "<<frame>>");
+_LIT8(KFrameStart, "<<frameStart>>");
+_LIT8(KFrameEnd, "<<frameEnd>>");
+
+_LIT8(KImgName, "<<imgName>>");
+
+
+#endif // XFCTEMPLATES_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/xhtmlfilecomposerconst.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,259 @@
+/*
+* 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: Contains the constant definitions used for composing XHTML file.
+*
+*/
+
+
+#ifndef XHTMLFILECOMPOSERCONST_H
+#define XHTMLFILECOMPOSERCONST_H
+
+/**
+ * @name Constants
+ */
+//@{
+/** Frame ratio defined for all image frames
+ *
+ * Paper is used maximally. That is, the image frames at certain layout
+ * are calculated to fill the whole page what ever an aspect ratio of a frame will be.\n
+ * It is wanted to use defined aspect ratio for all images at all layouts. It is more
+ * effectual to perform an image at reasonable aspect ratio despiting of the unused space
+ * left on page.
+ */
+const TReal KFrameRatio = 1.3325;
+
+/** Relation between inches and millimieters.
+ * @note 25.4 is the amount to multiply inch to get millimeters.
+ */
+const TReal KInchDivider = 25.4;
+
+/** DPI (dots per inch) divider to convert the image size in pixels to the same unit as the paper is.*/
+const TInt KDpiDivider = 150;
+//@}
+
+/**
+ * @ref Constants
+ */
+//@{
+/** Maximum size of template file */
+const TInt KXFCMaxFileSize = 2048;
+
+/** Maximum length for XHTML value to be set in final XHTML file */
+const TInt KXFCMaxSettingLen = 110;
+
+/** Maximum length for template element for XHTML block before assigning */
+const TInt KXFCMaxBlockLen = 250;
+//@}
+
+
+/**
+ * @ref Constants
+ */
+//@{
+/** Degree value for image orientation*/
+const TInt KXFC270Deg = 270;
+const TInt KXFCZeroDeg = 0;
+const TInt KXFC90Deg = 90;
+const TInt KXFC180Deg = 180;
+//@}
+
+/**
+ * @name Literal constants
+ */
+//@{
+/// Default path for the XHTML-file
+_LIT( KXFCDefaultResultPath, "c:\\system\\data\\xhtml\\" );
+
+/// Mime type identifier for JPEG
+_LIT8( KMimeJpeg, "image/jpeg" );
+
+_LIT8(KMimeXhtml, "application/xhtml+xml");
+
+/// Characters
+_LIT8( KPros8, "%" );
+_LIT8( KUnderScore8, "_" );
+_LIT( KPros, "%" );
+_LIT( KUnderScore, "_" );
+_LIT8( KBackSlash, "\\" );
+_LIT8( KSlash, "/" );
+
+/// URL encode values
+_LIT8( KAmpUrlEncoded, "%26" );
+_LIT8( KSemiColonUrlEncoded, "%3b" );
+_LIT8( KSlashUrlEncoded, "%2f" );
+_LIT8( KQuestionMarkUrlEncoded, "%3f" );
+_LIT8( KAtUrlEncoded, "%40" );
+_LIT8( KEqualsUrlEncoded, "%3d" );
+_LIT8( KPlusUrlEncoded, "%2b" );
+_LIT8( KDollarUrlEncoded, "%24" );
+_LIT8( KCommaUrlEncoded, "%2c" );
+_LIT8( KAposUrlEncoded, "%27" );
+_LIT8( KLeftBracketUrlEncoded, "%5b" );
+_LIT8( KRightBracketUrlEncoded, "%5d" );
+_LIT8( KHashUrlEncoded, "%23" );
+_LIT8( KBackSlashUrlEncoded, "%5c" );
+_LIT8( KColonUrlEncoded, "%3a" );
+
+//@}
+
+/** @typedef typedef TBuf8<KXFCMaxSettingLen> TXhtmlSetting
+ * @brief Type definition for XHTML setting value string */
+typedef TBuf8<KXFCMaxSettingLen> TXhtmlSetting;
+
+/** @typedef typedef TBuf8<KXFCMaxBlockLen> TBlock
+ * @brief Type definition for XHTML element block */
+typedef TBuf8<KXFCMaxBlockLen> TBlock;
+
+/** @typedef typedef TBuf8<KMaxFileName> TFileName8
+ * @brief Type definition for 8-bit filename buffer */
+typedef TBuf8<KMaxFileName> TFileName8;
+
+
+/**
+* @class TSizeReal
+* @brief A type class to store a size (width, height) with floating values.
+*
+*/
+class TSizeReal
+{
+ public:
+ //@{
+ /// Constructors
+ inline TSizeReal(){iWidth = 0; iHeight = 0;}
+ inline TSizeReal(const TSize &a){iWidth = a.iWidth; iHeight = a.iHeight;}
+ inline TSizeReal(const TReal aW, const TReal aH){iWidth = aW; iHeight = aH;}
+ inline TSizeReal(const TInt aW, const TInt aH){iWidth = aW; iHeight = aH;}
+ inline TSizeReal(const TReal aW, const TInt aH){iWidth = aW; iHeight = aH;}
+ inline TSizeReal(const TInt aW, const TReal aH){iWidth = aW; iHeight = aH;}
+ //@}
+
+ inline void SetSize(const TReal aW, const TReal aH){iWidth = aW; iHeight = aH;}
+ inline void SetSize(const TInt aW, const TInt aH){iWidth = aW; iHeight = aH;}
+ inline void SetSize(const TReal aW, const TInt aH){iWidth = aW; iHeight = aH;}
+ inline void SetSize(const TInt aW, const TReal aH){iWidth = aW; iHeight = aH;}
+
+ // Arithmetic operators
+ inline TSizeReal operator*(const TSizeReal& a) const
+ {TSizeReal x; x.iWidth = iWidth * a.iWidth; x.iHeight = iHeight * a.iHeight; return x;}
+
+ inline TSizeReal operator*(const TReal& a) const
+ {TSizeReal x; x.iWidth = iWidth * a; x.iHeight = iHeight * a; return x;}
+
+ inline TSizeReal operator/(const TReal& a) const
+ {TSizeReal x; x.iWidth = iWidth / a; x.iHeight = iHeight / a; return x;}
+
+ inline TSizeReal operator/(const TSizeReal& a) const
+ {TSizeReal x; x.iWidth = iWidth / a.iWidth; x.iHeight = iHeight / a.iHeight; return x;}
+
+ inline TSizeReal operator-(const TReal& a) const
+ {TSizeReal x; x.iWidth = iWidth - a; x.iHeight = iHeight - a; return x;}
+
+ inline TSizeReal operator-(const TSizeReal& a) const
+ {TSizeReal x; x.iWidth = iWidth - a.iWidth; x.iHeight = iHeight - a.iHeight; return x;}
+
+ inline TSizeReal operator+(const TReal& a) const
+ {TSizeReal x; x.iWidth = iWidth + a; x.iHeight = iHeight + a; return x;}
+
+ inline TSizeReal operator+(const TSizeReal& a) const
+ {TSizeReal x; x.iWidth = iWidth + a.iWidth; x.iHeight = iHeight + a.iHeight; return x;}
+
+ inline TSizeReal operator-=(const TReal& a)
+ {iWidth = iWidth - a; iHeight = iHeight - a; return *this;}
+
+ inline TSizeReal operator-=(const TSizeReal& a)
+ {iWidth = iWidth - a.iWidth; iHeight = iHeight - a.iHeight; return *this;}
+
+ inline TSizeReal operator+=(const TReal& a)
+ {iWidth = iWidth + a; iHeight = iHeight + a; return *this;}
+
+ inline TSizeReal operator+=(const TSizeReal& a)
+ {iWidth = iWidth + a.iWidth; iHeight = iHeight + a.iHeight; return *this;}
+
+ inline TSizeReal operator*=(const TReal& a)
+ {iWidth = iWidth * a; iHeight = iHeight * a; return *this;}
+
+ inline TSizeReal operator*=(const TSizeReal& a)
+ {iWidth = iWidth * a.iWidth; iHeight = iHeight * a.iHeight; return *this;}
+
+ inline TSizeReal operator/=(const TReal& a)
+ {iWidth = iWidth / a; iHeight = iHeight / a; return *this;}
+
+ inline TSizeReal operator/=(const TSizeReal& a)
+ {iWidth = iWidth / a.iWidth; iHeight = iHeight / a.iHeight; return *this;}
+
+ // Compare operators
+ inline TBool operator==(const TSizeReal& a) const
+ {if((iWidth == a.iWidth) && (iHeight == a.iHeight))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator!=(const TSizeReal& a) const
+ {if((iWidth != a.iWidth) && (iHeight != a.iHeight))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator<=(const TSizeReal& a) const
+ {if((iWidth <= a.iWidth) && (iHeight <= a.iHeight))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator>=(const TSizeReal& a) const
+ {if((iWidth >= a.iWidth) && (iHeight >= a.iHeight))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator<(const TSizeReal& a) const
+ {if((iWidth < a.iWidth) && (iHeight < a.iHeight))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator>(const TSizeReal& a) const
+ {if((iWidth > a.iWidth) && (iHeight > a.iHeight))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator==(const TReal& a) const
+ {if((iWidth == a) && (iHeight == a))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator!=(const TReal& a) const
+ {if((iWidth != a) && (iHeight != a))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator<=(const TReal& a) const
+ {if((iWidth <= a) && (iHeight <= a))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator>=(const TReal& a) const
+ {if((iWidth >= a) && (iHeight >= a))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator<(const TReal& a) const
+ {if((iWidth < a) && (iHeight < a))return ETrue;
+ else return EFalse;}
+
+ inline TBool operator>(const TReal& a) const
+ {if((iWidth > a) && (iHeight > a))return ETrue;
+ else return EFalse;}
+
+ // Change width to height and vice versa
+ inline void Reverse()
+ {TSizeReal x(iHeight, iWidth); iWidth = x.iWidth; iHeight = x.iHeight;}
+
+ // Get the ratio of of width vs. height
+ inline TReal Ratio()
+ {return iWidth/iHeight;}
+
+ public:
+ TReal iWidth;
+ TReal iHeight;
+};
+
+#endif // XHTMLFILECOMPOSERCONST_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/src/cimageinfo.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,627 @@
+/*
+* 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: Contains the declarations for miscellanous image information.
+*
+*/
+
+
+#include <uri8.h> // curi8
+#include <uri16.h> // curi16
+#include <uriutils.h> // uriutils
+#include <escapeutils.h> //utf8 conversions
+
+#include "cimageinfo.h"
+#include "cxfclogger.h"
+
+// log macros for static methods
+
+#ifdef ENABLE_LOGGING
+//#define LOCAL_LOGGING
+#endif
+
+#ifdef LOCAL_LOGGING
+
+#define I_LOG(a) LOG(a)
+#define I_LOG1(s, v) LOG1(s, v)
+#define I_LOG2(s, v1, v2) LOG2(s, v1, v2)
+
+#define I_LOG8(a) LOG8(a)
+#define I_LOG81(s, v) LOG81(s, v)
+#define I_LOG82(s, v1, v2) LOG82(s, v1, v2)
+
+#else
+
+#ifdef ENABLE_LOGGING
+#undef ENABLE_LOGGING
+#endif
+
+#define I_LOG(a)
+#define I_LOG1(s, v)
+#define I_LOG2(s, v1, v2)
+
+#define I_LOG8(a)
+#define I_LOG81(s, v)
+#define I_LOG82(s, v1, v2)
+
+
+#endif
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo* CImageInfo::NewL()
+{
+ CImageInfo *self = NewLC();
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo* CImageInfo::NewL(const CImageInfo& a)
+{
+ CImageInfo *self = NewLC(a);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo* CImageInfo::NewLC()
+{
+ CImageInfo *self = new (ELeave) CImageInfo();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo* CImageInfo::NewLC(const CImageInfo& a)
+{
+ CImageInfo *self = new (ELeave) CImageInfo(a);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::ConstructL()
+{
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo::CImageInfo() :
+ iUri(KNullDesC8()),
+ iEncoded(EFalse),
+ iFilePath(KNullDesC8()),
+ iId(KErrNotFound),
+ iCopies(1),
+ iIndex(KErrNotFound)
+{
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo::CImageInfo(const CImageInfo &a) :
+ iUri(a.iUri),
+ iEncoded(a.iEncoded),
+ iFilePath(a.iFilePath),
+ iId(a.iId),
+ iCopies(a.iCopies),
+ iIndex(a.iIndex)
+{
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CImageInfo
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CImageInfo::~CImageInfo()
+{
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::UriLog
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::UriLog(const TDesC8& aUri)
+{
+#ifdef ENABLE_LOGGING
+ TFileName8 uri;
+ UriLog(aUri, uri);
+ LOG81("[CImageInfo::UriLog]\t \"%S\"", &uri);
+#else // prevent warning in compiler
+ aUri.Length();
+#endif
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::UriLog
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::UriLog(const TDesC& aUri)
+{
+#ifdef ENABLE_LOGGING
+ TFileName uri;
+ UriLog(aUri, uri);
+ LOG1("[CImageInfo::UriLog(const TDesC&)]\t \"%S\"", &uri);
+#else // prevent warning in compiler
+ aUri.Length();
+#endif
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::UriLog
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::UriLog(const TDesC8& aUri, TDes8& aConvert)
+{
+#ifdef ENABLE_LOGGING
+
+ I_LOG2("[CImageInfo::UriLog(const TDesC8&, TDes8&)]\t %d - %d", aConvert.MaxLength(), aUri.Length());
+ if(aUri.Length() >= aConvert.MaxLength())
+ {
+ aConvert.Copy(aUri.Left(aConvert.MaxLength()));
+ }
+ else
+ {
+ aConvert.Copy(aUri);
+ }
+
+ TInt pos = aConvert.Find(KPros8());
+ while(pos != KErrNotFound)
+ {
+ if(KErrNotFound != pos && pos < aConvert.Length())
+ aConvert.Replace(pos, KPros8().Length(), KUnderScore8());
+
+ pos = aConvert.Find(KPros8());
+ }
+#else // prevent warning in compiler
+ aUri.Length();
+ aConvert.Length();
+#endif
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::UriLog
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::UriLog(const TDesC& aUri, TDes& aConvert)
+{
+#ifdef ENABLE_LOGGING
+ I_LOG2("[CImageInfo::UriLog(const TDesC&, TDes&)]\t %d - %d", aConvert.MaxLength(), aUri.Length());
+ if(aUri.Length() >= aConvert.MaxLength())
+ {
+ aConvert.Copy(aUri.Left(aConvert.MaxLength()));
+ }
+ else
+ {
+ aConvert.Copy(aUri);
+ }
+
+ TInt pos = aConvert.Find(KPros());
+ while(pos != KErrNotFound)
+ {
+ if(KErrNotFound != pos && pos < aConvert.Length())
+ aConvert.Replace(pos, KPros().Length(), KUnderScore());
+
+ pos = aConvert.Find(KPros());
+ }
+#else // prevent warning in compiler
+ aUri.Length();
+ aConvert.Length();
+#endif
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::ConvertL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::ConvertToUTF8L(const TDesC& aSource, TDes8& aResult)
+{
+ HBufC8* buf = EscapeUtils::ConvertFromUnicodeToUtf8L(aSource);
+ if(buf)
+ {
+ I_LOG2("[CImageInfo::ConvertToUTF8L]\t %d - %d", aResult.MaxLength(), buf->Des().Length());
+ aResult.Copy(buf->Des());
+ delete buf;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::ConvertL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::ConvertToUnicodeL(const TDesC8& aSource, TDes& aResult)
+{
+ HBufC16* buf = EscapeUtils::ConvertToUnicodeFromUtf8L(aSource);
+ if(buf)
+ {
+ I_LOG2("[CImageInfo::ConvertToUnicodeL]\t %d - %d", aResult.MaxLength(), buf->Des().Length());
+ aResult.Copy(buf->Des());
+ delete buf;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::EncodeUriL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::EncodeUriL(const TDesC8& aDecodedUri, TDes8& aEncodedUri)
+{
+ TFileName unicodeUri;
+ ConvertToUnicodeL( aDecodedUri, unicodeUri );
+ EncodeUriL(unicodeUri, aEncodedUri);
+}
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::EncodeUriL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::EncodeUriL(const TDesC16& aDecodedUri, TDes8& aEncodedUri)
+{
+ I_LOG("[CImageInfo::EncodeUriL]");
+ CUri8* uri8 = UriUtils::CreateUriL( aDecodedUri );
+ CleanupStack::PushL( uri8 );
+ HBufC16* uriBuf = uri8->Uri().DisplayFormL();
+ CleanupStack::PushL( uriBuf );
+
+ //alloc enough memory: encoding replaces one char with three: '%XX'
+ HBufC8* uriBuf8 = HBufC8::NewLC(KMaxFileName*3);
+
+ TPtr8 buf8Ptr(uriBuf8->Des());
+ ConvertToUTF8L( uriBuf->Des(), buf8Ptr );
+ I_LOG("[CImageInfo::EncodeUriL]\t <-ConvertToUTF8L");
+
+ // encode additionally the following characters
+ //";" | "?" | "@" | "&" | "=" | "+" | "$" | ","
+ // no encoding of "/" or ":" for paths
+
+ TInt pos = buf8Ptr.LocateReverse('/');
+ I_LOG1("[CImageInfo::EncodeUriL]\t pos %d", pos);
+ if(KErrNotFound != pos)
+ {
+ TPtr8 namePtr(buf8Ptr.LeftTPtr(pos));
+ I_LOG1("[CImageInfo::EncodeUriL]\t namePtr.Length() %d", namePtr.Length());
+ UriLog(namePtr);
+
+ I_LOG("[CImageInfo::EncodeUriL]\t ->EncodeFileNameL");
+ EncodeFileNameL(namePtr);
+ }
+
+ if(buf8Ptr.Length() > aEncodedUri.MaxLength())
+ User::Leave(KErrOverflow);
+
+ aEncodedUri.Copy(buf8Ptr);
+ I_LOG("[CImageInfo::EncodeUriL]\t aEncodedUri:");
+ UriLog(aEncodedUri);
+
+ CleanupStack::PopAndDestroy( uriBuf8 );
+ CleanupStack::PopAndDestroy( uriBuf );
+ CleanupStack::PopAndDestroy( uri8 );
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetUri(const TDesC8& aUri, const TBool aEncoded)
+{
+ iUri.Copy(aUri);
+ iEncoded = aEncoded;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetUriL(const TDesC& aUri)
+{
+ ConvertToUTF8L(aUri, iUri);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::GetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::GetUri(TDes8& aUri) const
+{
+ aUri.Copy(iUri);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::GetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::GetUriL(TDes& aUri) const
+{
+ ConvertToUnicodeL( iUri, aUri );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::GetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::GetEncodedUriL(TDes8& aUri)
+{
+ I_LOG1("[CImageInfo::EncodeUriL]\t iEncoded = %d", iEncoded);
+
+ if(iEncoded)
+ GetUri(aUri);
+ else
+ EncodeUriL(iUri, aUri);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CompareUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TBool CImageInfo::CompareUri(const TDesC& aUri)
+{
+ if(KNullDesC() == aUri && KNullDesC8() == iUri)
+ return ETrue;
+
+ TFileName8 tmpUri8;
+ //First try copy (if earlier copied 8->16 the conversion cannot be done anymore):
+ tmpUri8.Copy(aUri);
+ if(CompareUri(tmpUri8))
+ return ETrue;
+
+ //Then convert:
+ TRAPD(err, ConvertToUTF8L(aUri, tmpUri8));
+ if(KErrNone == err)
+ return CompareUri(tmpUri8);
+
+ return EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CompareUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TBool CImageInfo::CompareUri(const TDesC8& aUri)
+{
+ if(0 == iUri.Compare(aUri))
+ return ETrue;
+
+ TFileName8 encodedUri;
+ TRAPD(err, EncodeUriL(iUri, encodedUri));
+ if(KErrNone == err && 0 == encodedUri.Compare(aUri))
+ return ETrue;
+
+ return EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetFilePath(const TDesC8& aFilePath)
+{
+ iFilePath = aFilePath;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetFilePathL(const TDesC& aFilePath)
+{
+ ConvertToUTF8L(aFilePath, iFilePath);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::GetFilePath(TDes8& aFilePath) const
+{
+ aFilePath.Copy(iFilePath);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::GetFilePathL(TDes& aFilePath) const
+{
+ ConvertToUnicodeL(iFilePath, aFilePath);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CompareFilePath
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TBool CImageInfo::CompareFilePath(const TDesC& aFilePath)
+{
+ if(KNullDesC() == aFilePath && KNullDesC8() == iFilePath)
+ return ETrue;
+
+ TFileName8 tmpFile8;
+ TRAPD(err, ConvertToUTF8L(aFilePath, tmpFile8));
+ if(KErrNone == err)
+ return CompareFilePath(tmpFile8);
+
+ return EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::CompareFilePath
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TBool CImageInfo::CompareFilePath(const TDesC8& aFilePath)
+{
+ if(0 == iFilePath.Compare(aFilePath))
+ return ETrue;
+
+ return EFalse;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetId(const TInt aId)
+{
+ iId = aId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TInt CImageInfo::Id() const
+{
+ return iId;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetCopies(const TInt aCopies)
+{
+ iCopies = aCopies;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TInt CImageInfo::Copies() const
+{
+ return iCopies;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::SetIndex(const TInt aIndex)
+{
+ iIndex = aIndex;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::SetUri
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TInt CImageInfo::Index() const
+{
+ return iIndex;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::EncodeFileNameL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::EncodeFileNameL(TDes8& aFileName)
+{
+
+ HBufC8* result = HBufC8::NewLC(aFileName.MaxLength());
+
+ for(TInt i = 0; i < result->Length(); ++i)
+ {
+ TUint8 ch = aFileName[i];
+ switch(ch)
+ {
+ case ':':
+ AppendL(result, KColonUrlEncoded());
+ break;
+ case '/':
+ AppendL(result, KSlashUrlEncoded());
+ break;
+ default:
+ TBufC8<1> character(&ch);
+ AppendL(result, character);
+ break;
+ }
+ }
+ aFileName.Copy(result->Des());
+ CleanupStack::PopAndDestroy(result);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CImageInfo::Append
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CImageInfo::AppendL(HBufC8* aWhere, const TDesC8& aWhat)
+{
+ if( (aWhere->Length() + aWhat.Length()) >= aWhere->Des().MaxLength())
+ {
+ I_LOG2("[CImageInfo::AppendL]\t %d - %d", aWhat.Length(), aWhere->Length());
+ aWhere = aWhere->ReAllocL(aWhere->Des().MaxLength() + aWhat.Length());
+ }
+
+ aWhere->Des().Append(aWhat);
+}
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/src/cxhtmlfilecomposer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,992 @@
+/*
+* 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: Defines the CXhtmlFileComposer class.
+*
+*/
+
+
+#include <imageconversion.h>
+
+#ifdef _DEBUG
+#include <driveinfo.h>
+#include <pathinfo.h>
+#endif
+
+#include "cxhtmlfilecomposer.h"
+#include "printcapabilitycodes.h"
+#include "cxfclogger.h"
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::NewL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CXhtmlFileComposer* CXhtmlFileComposer::NewL(const TDesC& aPath)
+ {
+ CXhtmlFileComposer *self = NewLC(aPath);
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::NewLC
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CXhtmlFileComposer* CXhtmlFileComposer::NewLC(const TDesC& aPath)
+ {
+ CXhtmlFileComposer *self = new (ELeave) CXhtmlFileComposer();
+ CleanupStack::PushL(self);
+
+ if(0 >= aPath.Length())
+ {
+ self->ConstructL(KXFCDefaultResultPath());
+ }
+ else
+ {
+ self->ConstructL(aPath);
+ }
+
+ return self;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::CreateXhtmlFileL
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C void CXhtmlFileComposer::CreateXhtmlFileL(const RArray<CImageInfo>& aImages, const TInt aLayout,
+ const TInt aPaperSize, const TInt /*aQuality*/,
+ const TDesC& aXhtmlPrintFile,TInt& aPageCount, TBool aDataFile)
+{
+ LOG("[CXhtmlFileComposer]\t WriteJobControlFileL");
+
+ // Get page and layout related data
+ PageData(aPaperSize);
+
+ RArray<TSizeReal> positions;
+ CleanupClosePushL(positions);
+ LayoutData(aLayout, positions);
+
+ ReadTemplateFileL();
+
+ // init counter variables
+ aPageCount = 0;
+ TInt posIx = 0;
+ TInt copies = 0;
+ TInt currentImgNum = 0;
+ TInt imageCount = aImages.Count();
+
+ // loop for images
+ for(TInt imgIx = 0; imgIx < aImages.Count(); imgIx++)
+ {
+ /**** Handle copies ****/
+ copies = aImages[imgIx].Copies();
+ imageCount += copies - 1; // decrease current image from copies
+
+ // Create template blocks for each copy
+ while(1 <= copies && imageCount > currentImgNum)
+ {
+ AddPageL(currentImgNum, posIx, aPageCount);
+ AddTemplateStringL(iFrameTemplate, KFrame());
+
+ // add frame position template once per position for all pages
+ if(1 == aPageCount)
+ {
+ AddTemplateStringL(iPositionTemplate, KFramePosition());
+ ComposePositionL(posIx, positions);
+ }
+ ComposeTemplateL(posIx+1, KPosId());
+ --copies;
+ ++currentImgNum;
+ }
+
+ // add image details
+ AddTemplateStringL(iImageTemplate, KImgDetails());
+ ComposeTemplateL(1+imgIx, KDetId());
+
+ // Get correct name for the image
+ TFileName8 imageName;
+ GetImageNameL(aImages[imgIx], imageName, aDataFile);
+
+ /**** Image size and orientation ****/
+ TSizeReal imageSize(0,0);
+ TBool framePortrait = EFalse;
+
+ SizeAndOrientationL(aImages[imgIx], imageSize, framePortrait);
+
+ /**** Image scaling & cropping ****/
+ TSizeReal scaledSize;
+ GetRatioL(scaledSize, imageSize);
+
+ // Turn frame and scaled size in correct orientation again
+ if(framePortrait != iImagePortrait)
+ {
+ scaledSize.Reverse();
+ iImageFrame.Reverse();
+ }
+
+ ComposeFileL(imageName, scaledSize, aDataFile);
+
+ }// End of loop for images
+ CleanupStack::PopAndDestroy( &positions );
+
+ // Compose the correct unit in file
+ ComposeUnitL();
+
+ /**** Create result file ****/
+ RFile newFile;
+ CleanupClosePushL( newFile );
+ User::LeaveIfError( newFile.Replace( iFsSession, aXhtmlPrintFile, EFileWrite) );
+ newFile.Write( FinalizeBufferL() );
+ CleanupStack::PopAndDestroy( &newFile );
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::~CXhtmlFileComposer
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C CXhtmlFileComposer::~CXhtmlFileComposer()
+{
+ iFsSession.Close();
+ if(iFileBuf)
+ delete iFileBuf;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::UnitToPixel
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TReal CXhtmlFileComposer::UnitToPixel(TReal aValue)
+{
+ TReal tmp = aValue;
+ if(EUAMillis == iPaperType)
+ tmp = aValue/(TReal)KInchDivider;
+
+ tmp = tmp*(TReal)KDpiDivider;
+
+ return tmp;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::UnitToPixel
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TSizeReal CXhtmlFileComposer::UnitToPixel(TSizeReal aValue)
+{
+ TSizeReal tmp = aValue;
+ if(EUAMillis == iPaperType)
+ tmp = aValue/(TReal)KInchDivider;
+
+ tmp = tmp*(TReal)KDpiDivider;
+
+ return tmp;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::PixelToUnit
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TReal CXhtmlFileComposer::PixelToUnit(TReal aValue)
+{
+ TReal tmp = aValue/(TReal)KDpiDivider;
+ if(EUAMillis == iPaperType)
+ tmp = tmp*(TReal)KInchDivider;
+
+ return tmp;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::PixelToUnit
+//
+//--------------------------------------------------------------------------------------------
+EXPORT_C TSizeReal CXhtmlFileComposer::PixelToUnit(TSizeReal aValue)
+{
+ TSizeReal tmp = aValue/(TReal)KDpiDivider;
+ if(EUAMillis == iPaperType)
+ tmp = tmp*(TReal)KInchDivider;
+
+ return tmp;
+}
+
+// PROTECTED
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ConstructL(const TDesC& aPath)
+{
+ LOG("[CXhtmlFileComposer::ConstructL]\t");
+
+ User::LeaveIfError( iFsSession.Connect() );
+ iFsSession.SetSessionPath( aPath );
+ iFsSession.MkDirAll( aPath );
+
+ iPaperSize.SetSize(0,0);
+ iPaperType = 0;
+ iPageMargin = 0;
+ iImageFrame.SetSize(0,0);
+ iFileBuf = NULL;
+ iImagesPerPage = 0;
+ iImagePortrait=EFalse;
+ iPagePortrait = ETrue;
+ iPageTemplate.Copy(KNullDesC8());
+ iFrameTemplate.Copy(KNullDesC8());
+ iPositionTemplate.Copy(KNullDesC8());
+ iImageTemplate.Copy(KNullDesC8());
+
+ LOG("[CXhtmlFileComposer::ConstructL]\t Done.");
+}
+
+// PRIVATE
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::CXhtmlFileComposer
+//
+//--------------------------------------------------------------------------------------------
+CXhtmlFileComposer::CXhtmlFileComposer()
+{
+}
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::GetRatioL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::GetRatioL(TSizeReal &aNewSize, TSizeReal aImageSize)
+{
+ LOG("[CXhtmlFileComposer::GetRatioL]\t ********************************");
+
+ TRealX margin = 0;
+ TXhtmlSetting marginStr, tmpStr;
+
+ LOG2("[CXhtmlFileComposer::GetRatioL]\t aImageSize: %fx%f", PixelToUnit(aImageSize.iWidth), PixelToUnit(aImageSize.iHeight));
+ LOG2("[CXhtmlFileComposer::GetRatioL]\t iImageFrame: %fx%f", PixelToUnit(iImageFrame.iWidth), PixelToUnit(iImageFrame.iHeight));
+ LOG2("[CXhtmlFileComposer::GetRatioL]\t image ratio: %f vs. frame ratio %f", aImageSize.Ratio(), iImageFrame.Ratio());
+
+ TReal relativeRatio = aImageSize.Ratio() / iImageFrame.Ratio();
+ LOG2("[CXhtmlFileComposer::GetRatioL]\t relativeRatio: %f, iPageMargin %f", relativeRatio, iPageMargin);
+
+ // crop borderless: if iPageMargin == 0, the margin must be negative
+ if((1 < relativeRatio && iPageMargin) || (1 > relativeRatio && !iPageMargin))
+ {
+ LOG("[CXhtmlFileComposer::GetRatioL]\t *Match width*");
+ aNewSize.SetSize(iImageFrame.iWidth, iImageFrame.iWidth/aImageSize.Ratio());
+ margin = (iImageFrame.iHeight-aNewSize.iHeight)/2;
+
+ if((!iPagePortrait && !iPageMargin && iImagePortrait) || iPagePortrait)
+ marginStr.Copy(KTop());
+ else
+ marginStr.Copy(KLeft());
+ }
+ else
+ {
+ LOG("[CXhtmlFileComposer::GetRatioL]\t *Match height*");
+ aNewSize.SetSize(iImageFrame.iHeight*aImageSize.Ratio(), iImageFrame.iHeight);
+ margin = (iImageFrame.iWidth-aNewSize.iWidth)/2;
+
+ if((!iPagePortrait && !iPageMargin && iImagePortrait) || iPagePortrait)
+ marginStr.Copy(KLeft());
+ else
+ marginStr.Copy(KTop());
+ }
+
+ FormatReal(PixelToUnit(margin), tmpStr);
+ marginStr.Append(tmpStr);
+
+ LOG2("[CXhtmlFileComposer::GetRatioL]\t aNewSize: %fx%f", PixelToUnit(aNewSize.iWidth), PixelToUnit(aNewSize.iHeight));
+ LOG81("[CXhtmlFileComposer::GetRatioL]\t \"%S\"", &marginStr);
+
+ // margin not needed anymore: compose margin into file buffer
+ ComposeTemplateL(marginStr, KImgMargin());
+ LOG("[CXhtmlFileComposer::GetRatioL]\t ********************************");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::ComposeUnitL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ComposeUnitL()
+{
+ LOG("[CXhtmlFileComposer]\t ComposeUnit");
+
+ if(EUAMillis == iPaperType)
+ {
+ _LIT8(KMm, "mm");
+ ComposeTemplateL(KMm(), KUnit());
+ }
+ else
+ {
+ _LIT8(KIn, "in");
+ ComposeTemplateL(KIn(), KUnit());
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::ComposeFile
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ComposeFileL(const TDes8 &aImageName, TSizeReal aImgSize, TBool aDataFile)
+{
+ LOG("[CXhtmlFileComposer]\t ComposeFile");
+
+ // Format page settings in file
+ TXhtmlSetting pageWidthStr, pageHeightStr, pageMarginStr;
+
+ FormatReal(PixelToUnit(iPaperSize.iWidth), pageWidthStr);
+ ComposeTemplateL(pageWidthStr, KPageWidth());
+
+ FormatReal(PixelToUnit(iPaperSize.iHeight), pageHeightStr);
+ ComposeTemplateL(pageHeightStr, KPageHeight());
+
+ FormatReal(iPageMargin, pageMarginStr);
+ ComposeTemplateL(pageMarginStr, KPageMargin());
+
+ // Format image frame settings in file
+ TXhtmlSetting imgFrameWidthStr, imgFrameHeightStr;
+
+ FormatReal(PixelToUnit(iImageFrame.iWidth), imgFrameWidthStr);
+ ComposeTemplateL(imgFrameWidthStr, KImgFrameWidth());
+
+ FormatReal(PixelToUnit(iImageFrame.iHeight), imgFrameHeightStr);
+ ComposeTemplateL(imgFrameHeightStr, KImgFrameHeight());
+
+ // Format image settings in file
+ TXhtmlSetting imgWidthStr, imgHeightStr;
+
+ FormatReal(PixelToUnit(aImgSize.iWidth), imgWidthStr);
+ ComposeTemplateL(imgWidthStr, KImgWidth());
+
+ FormatReal(PixelToUnit(aImgSize.iHeight), imgHeightStr);
+ ComposeTemplateL(imgHeightStr, KImgHeight());
+
+///////////
+ HBufC8* data = NULL;
+ if(aDataFile)
+ {
+
+ TFileName imgFile;
+ imgFile.Copy(aImageName);
+
+ LOG("[CXhtmlFileComposer]\t ComposeFileL - read image data");
+ // Open the template file and read it into buffer
+ RFile file;
+ CleanupClosePushL(file);
+
+ User::LeaveIfError( file.Open( iFsSession, imgFile, EFileRead | EFileShareReadersOnly ) );
+ LOG("[CXhtmlFileComposer]\t ComposeFileL - file opened");
+
+ TInt fileSize = 0;
+ User::LeaveIfError( file.Size(fileSize) );
+ LOG1("[CXhtmlFileComposer]\t ComposeFileL - file size %d",fileSize);
+
+ _LIT8(KDataUrl, "data:image/jpeg;base64,");
+
+ data = HBufC8::NewLC(fileSize + KDataUrl().Length());
+ TPtr8 dataPtr( data->Des() );
+
+ dataPtr.Zero();
+ file.Read(dataPtr);
+
+ dataPtr.Insert(0, KDataUrl());
+
+ ComposeTemplateL(dataPtr, KImgName());
+ LOG("[CXhtmlFileComposer]\t ComposeFileL - file composed");
+
+ CleanupStack::PopAndDestroy(2); // data, file
+ }
+///////////
+ else
+ {
+ // Format image name in file
+ ComposeTemplateL(aImageName, KImgName());
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::ComposeTemplateL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ComposeTemplateL(const TInt aValue, const TDesC8 &aTemplate)
+{
+// LOG("[CXhtmlFileComposer]\t ComposeTemplateL");
+
+ TBuf8<KDefaultRealWidth> valueStr;
+ valueStr.Zero();
+ valueStr.AppendNum(aValue);
+
+ ComposeTemplateL(valueStr, aTemplate);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::ComposeTemplateL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ComposeTemplateL(const TDesC8 &aStr, const TDesC8 &aTemplate)
+{
+// LOG("[CXhtmlFileComposer]\t ComposeTemplateL");
+
+ User::LeaveIfNull(iFileBuf);
+
+ TInt pos = iFileBuf->Find(aTemplate);
+ while(KErrNotFound != pos)
+ {
+ TInt requiredSize = iFileBuf->Des().Length() + aStr.Length();
+ if(iFileBuf->Des().MaxLength() < requiredSize)
+ {
+ iFileBuf = iFileBuf->ReAllocL(requiredSize);
+ }
+ iFileBuf->Des().Replace(pos, aTemplate.Length(), aStr);
+ pos = iFileBuf->Find(aTemplate);
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::SetPageTypeL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::SetPageTypeL()
+{
+ LOG("[CXhtmlFileComposer]\t SetPageTypeL");
+
+ User::LeaveIfNull(iFileBuf);
+
+ TXhtmlSetting pageType(KPageFirsts());
+
+ TInt pos = iFileBuf->Find(KPageType());
+ if(KErrNotFound >= pos)
+ User::Leave(KErrCorrupt);
+
+ while(KErrNotFound != pos)
+ {
+ // check if next exists to assign correct page type in template
+ TPtrC8 tmpBuf;
+ tmpBuf.Set(iFileBuf->Mid(pos+KPageType().Length()));
+
+ if(KErrNotFound == tmpBuf.Find(KPageType()))
+ pageType.Copy(KPageLast());
+
+ // replace correct page type in first found position
+ TInt requiredSize = iFileBuf->Des().Length() + pageType.Length();
+ if(iFileBuf->Des().MaxLength() < requiredSize)
+ {
+ iFileBuf = iFileBuf->ReAllocL(requiredSize);
+ }
+ iFileBuf->Des().Replace(pos, KPageType().Length(), pageType);
+ pos = iFileBuf->Find(KPageType());
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::FinalizeBufferL
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CXhtmlFileComposer::FinalizeBufferL()
+{
+ LOG("[CXhtmlFileComposer]\t FinalizeBufferL");
+
+ User::LeaveIfNull(iFileBuf);
+
+ SetPageTypeL();
+
+ // Remove markers from the buffer
+ TInt pos = iFileBuf->Find(KPage());
+ if(KErrNotFound != pos)
+ iFileBuf->Des().Delete(pos, KPage().Length());
+
+ pos = iFileBuf->Find(KFrame());
+ if(KErrNotFound != pos)
+ iFileBuf->Des().Delete(pos, KFrame().Length());
+
+ pos = iFileBuf->Find(KImgDetails());
+ if(KErrNotFound != pos)
+ iFileBuf->Des().Delete(pos, KImgDetails().Length());
+
+ pos = iFileBuf->Find(KFramePosition());
+ if(KErrNotFound != pos)
+ iFileBuf->Des().Delete(pos, KFramePosition().Length());
+
+ // Cut the template to the end tag
+ pos = iFileBuf->Find(KEndTag());
+ if(KErrNotFound == pos)
+ User::Leave(KErrCorrupt);
+
+ TInt dataLen = pos + KEndTag().Length();
+ TPtrC8 tail = iFileBuf->Des().Left(dataLen);
+
+ return tail;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::PageData
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::PageData(TInt aPaperSize)
+{
+ LOG("[CXhtmlFileComposer]\t PageData");
+
+ const TSizeReal KSizeA4(210.0, 297.0);
+ const TSizeReal KSizeA6(105.0, 148.5);
+ const TSizeReal KSizeLetter(8.5, 11.0);
+ const TSizeReal KSize4x6(4.0, 6.0);
+ const TSizeReal KSize5x7(5.0, 7.0);
+
+ switch(aPaperSize)
+ {
+ case EPrintCapabPaperSizeA4:
+ iPaperType = CXhtmlFileComposer::EUAMillis;
+ iPaperSize = UnitToPixel(KSizeA4);
+ iPageMargin = 3.0;
+ break;
+ case EPrintCapabPaperSizeA6:
+ iPaperType = CXhtmlFileComposer::EUAMillis;
+ iPaperSize = UnitToPixel(KSizeA6);
+ iPageMargin = 3.0;
+ break;
+ case EPrintCapabPaperSizeLetter:
+ iPaperType = CXhtmlFileComposer::EUAInches;
+ iPaperSize = UnitToPixel(KSizeLetter);
+ iPageMargin = 0.12;
+ break;
+ case EPrintCapabPaperSize5x7:
+ iPaperType = CXhtmlFileComposer::EUAInches;
+ iPaperSize = UnitToPixel(KSize5x7);
+ iPageMargin = 0.12;
+ break;
+ case EPrintCapabPaperSizeAuto:
+ case EPrintCapabPaperSizeSticker:
+ case EPrintCapabPaperSize4x6:
+ default:
+ iPaperType = CXhtmlFileComposer::EUAInches;
+ iPaperSize = UnitToPixel(KSize4x6);
+ iPageMargin = 0.12;
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::LayoutData
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::LayoutData(TInt aLayout, RArray<TSizeReal>& aPositions)
+{
+ LOG1("[CXhtmlFileComposer::LayoutData]\t aLayout: %d", aLayout);
+
+ TSizeReal pos(0,0);
+
+ switch(aLayout)
+ {
+ case EPrintCapabLayout1UpBorder:
+ iImagesPerPage = 1;
+ iPagePortrait = EFalse;
+ CreateMatrix(1/*rows*/, 1/*columns*/, aPositions);
+ break;
+ case EPrintCapabLayout2Up:
+ iImagesPerPage = 2;
+ iPagePortrait = ETrue;
+ CreateMatrix(2, 1, aPositions);
+ break;
+ case EPrintCapabLayout4Up:
+ iImagesPerPage = 4;
+ iPagePortrait = EFalse;
+ CreateMatrix(2, 2, aPositions);
+ break;
+ case EPrintCapabLayout6Up:
+ iImagesPerPage = 6;
+ iPagePortrait = ETrue;
+ CreateMatrix(3, 2, aPositions);
+ break;
+ case EPrintCapabLayout9Up:
+ iImagesPerPage = 9;
+ iPagePortrait = EFalse;
+ CreateMatrix(3, 3, aPositions);
+ break;
+ case EPrintCapabLayout12Up:
+ iImagesPerPage = 12;
+ iPagePortrait = ETrue;
+ CreateMatrix(4, 3, aPositions);
+ break;
+ case EPrintCapabLayout16Up:
+ iImagesPerPage = 16;
+ iPagePortrait = EFalse;
+ CreateMatrix(4, 4, aPositions);
+ break;
+ case EPrintCapabLayout1Up:
+ case EPrintCapabLayout1UpBorderless:
+ default:
+ iImagesPerPage = 1;
+ iPageMargin = 0;
+ iImageFrame = iPaperSize;
+ iPagePortrait = EFalse;
+ aPositions.Append(pos);
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::CreateMatrix
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::CreateMatrix(TInt aRows, TInt aColumns, RArray<TSizeReal>& aPositions)
+{
+ LOG("[CXhtmlFileComposer]\t CreateMatrix");
+
+ TSizeReal pos;
+ TSizeReal matrix(aColumns,aRows);
+ TSizeReal relativeSize(KFrameRatio, 1);
+
+ if(!iPagePortrait)
+ {
+ matrix.Reverse();
+ relativeSize.Reverse();
+ }
+
+ // count print area: paper size - margins
+ TSizeReal margins(matrix);
+ margins += 1;
+ margins *= UnitToPixel(iPageMargin);
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t margins: %fx%f", PixelToUnit(margins.iWidth), PixelToUnit(margins.iHeight));
+
+ TSizeReal printArea = (iPaperSize - margins);
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t printArea: %fx%f", PixelToUnit(printArea.iWidth), PixelToUnit(printArea.iHeight));
+
+ // Count frame size
+
+ iImageFrame = printArea/matrix;
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t iImageFrame bef. ratio: %fx%f", PixelToUnit(iImageFrame.iWidth), PixelToUnit(iImageFrame.iHeight));
+
+ LOG1("[CXhtmlFileComposer::CreateMatrix]\t frame ratio: %f", iImageFrame.Ratio());
+
+ // force frame ratio to KFrameRatio ratio
+ LOG1("[CXhtmlFileComposer::CreateMatrix]\t relativeRatio: %f", relativeSize.Ratio());
+
+ TReal relativeRatio = relativeSize.Ratio()/iImageFrame.Ratio();
+ if(1 < relativeRatio)
+ {
+ iImageFrame.iHeight /= relativeRatio;
+ }
+ else if(1 > relativeRatio)
+ {
+ iImageFrame.iWidth *= relativeRatio;
+ }
+
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t iImageFrame aft. ratio: %fx%f", PixelToUnit(iImageFrame.iWidth), PixelToUnit(iImageFrame.iHeight));
+ LOG1("[CXhtmlFileComposer::CreateMatrix]\t --> ratio: %f (1.3325/0.7505)", iImageFrame.Ratio());
+
+ // Count the empty space on page to centerise the frame set
+ TSizeReal frameSetSize(iImageFrame*matrix);
+ TSizeReal emptySpace = (printArea - frameSetSize) / 2;
+
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t frameSetSize:\t %fx%f", PixelToUnit(frameSetSize.iWidth), PixelToUnit(frameSetSize.iHeight));
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t emptySpace:\t %fx%f", PixelToUnit(emptySpace.iWidth), PixelToUnit(emptySpace.iHeight));
+
+ // if only one image/page, no need to calculate positions.
+ if(0 >= aColumns || 0 >= aRows)
+ {
+ aPositions.Append(pos);
+ return;
+ }
+
+ emptySpace.Reverse();
+
+ for(TInt row = 0; row < aRows; ++row)
+ {
+ LOG1("[CXhtmlFileComposer::CreateMatrix]\t row: %d", row);
+ pos.iWidth = (iImageFrame.iHeight+UnitToPixel(iPageMargin)) * row;
+ pos.iWidth += emptySpace.iWidth;
+ for(TInt col = 0; col < aColumns; ++col)
+ {
+ pos.iHeight = (iImageFrame.iWidth+UnitToPixel(iPageMargin)) * col;
+ pos.iHeight += emptySpace.iHeight;
+ LOG2("[CXhtmlFileComposer::CreateMatrix]\t col: %fx%f", PixelToUnit(pos.iWidth), PixelToUnit(pos.iHeight));
+ aPositions.Append(pos);
+ }
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::ReadTemplateL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ReadTemplateFileL()
+{
+ LOG("[CXhtmlFileComposer]\t ReadTemplateL");
+ // Open the template file and read it into buffer
+ RFile templateFile;
+ CleanupClosePushL(templateFile);
+
+#ifdef _DEBUG
+ //_LIT(KFile, "e:\\UPnPXHTMLTemplate.xhtml");
+ _LIT(KFileName, "UPnPXHTMLTemplate.xhtml");
+ TInt drive;
+ TFileName path;
+
+ DriveInfo::GetDefaultDrive(DriveInfo::EDefaultRemovableMassStorage, drive);
+ PathInfo::GetRootPath(path, drive);
+ path.Append(KFileName());
+
+ TInt e = templateFile.Open( iFsSession, path, EFileRead);
+ if(KErrNone != e)
+#endif
+ {
+ User::LeaveIfError( templateFile.Open( iFsSession, KXHTMLTemplate(), EFileRead) );
+ }
+ TInt fileSize = 0;
+ TInt err = templateFile.Size(fileSize);
+ if(KErrNone != err)
+ fileSize = KXFCMaxFileSize;
+
+ iFileBuf = HBufC8::NewL(fileSize);
+ TPtr8 bufferPtr( iFileBuf->Des() );
+
+ bufferPtr.Zero();
+ templateFile.Read(bufferPtr);
+
+ CleanupStack::PopAndDestroy(&templateFile);
+
+ // Separate page, frame position, image details and frame
+ // template elements from the template buffer
+ GetTemplateStringL(KPageStart(), KPageEnd(), iPageTemplate);
+ GetTemplateStringL(KFrameStart(), KFrameEnd(), iFrameTemplate);
+ GetTemplateStringL(KPositionStart(), KPositionEnd(),iPositionTemplate);
+ GetTemplateStringL(KImgStart(), KImgEnd(), iImageTemplate);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::GetTemplateStringL
+//
+//--------------------------------------------------------------------------------------------
+TPtrC8 CXhtmlFileComposer::GetTemplateStringL(const TDesC8 &aStart, const TDesC8 &aEnd, TDes8 &aTemplate)
+{
+ User::LeaveIfNull(iFileBuf);
+
+ TInt start = iFileBuf->Find(aStart);
+ if(KErrNotFound == start)
+ User::Leave(KErrCorrupt);
+
+ TInt end = iFileBuf->Find(aEnd);
+ if(KErrNotFound == end)
+ User::Leave(KErrCorrupt);
+
+ TPtrC8 ptr = iFileBuf->Des().Mid(start+aStart.Length(), end-start-aStart.Length());
+
+ if(aTemplate.MaxLength() < ptr.Length())
+ User::Leave(KErrOverflow);
+
+ aTemplate = ptr;
+ iFileBuf->Des().Delete(start, ptr.Length()+aStart.Length()+aEnd.Length());
+ return ptr;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::AddTemplateStringL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::AddTemplateStringL(const TDesC8 &aTemplate,const TDesC8 &aTag)
+{
+ User::LeaveIfNull(iFileBuf);
+
+ TInt pos = iFileBuf->Find(aTag);
+ if(KErrNotFound == pos)
+ User::Leave(KErrCorrupt);
+
+ TInt requiredSize = iFileBuf->Des().Length() + aTemplate.Length();
+ if(iFileBuf->Des().MaxLength() < requiredSize)
+ {
+ iFileBuf = iFileBuf->ReAllocL(requiredSize);
+ }
+ iFileBuf->Des().Insert(pos, aTemplate);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::GetImageDataL
+//
+//--------------------------------------------------------------------------------------------
+TSizeReal CXhtmlFileComposer::GetImageSizeL(CImageInfo aImage)
+{
+ TSizeReal imageSize(0,0);
+ TFileName name;
+ aImage.GetFilePathL(name);
+ if(name.Compare(KNullDesC()))
+ {
+ // Test file existing
+ TEntry data;
+ TInt err = iFsSession.Entry(name, data);
+ User::LeaveIfError(err);
+
+ // Get image size in pixels
+ CImageDecoder *id = NULL;
+ TRAP(err, id = CImageDecoder::FileNewL(iFsSession, name, KMimeJpeg()));
+
+ if(KErrNone == err)
+ {
+ TFrameInfo frameInfo;
+ frameInfo = id->FrameInfo();
+ imageSize = frameInfo.iOverallSizeInPixels;
+ }
+
+ if(id)
+ delete id;
+ }
+ LOG2("[CXhtmlFileComposer]\t Image size: %fx%f", imageSize.iWidth, imageSize.iHeight);
+ return imageSize;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::AddPageL
+//
+//--------------------------------------------------------------------------------------------
+TBool CXhtmlFileComposer::AddPageL(TInt aCurrentImage, TInt& aPositionIndex, TInt& aPageCount)
+{
+ TBool ret = EFalse;
+ // increase position index by default and reset it in case of new page
+ ++aPositionIndex;
+
+ User::LeaveIfNull(iFileBuf);
+ if(0 >= iImagesPerPage)
+ User::Leave(KErrArgument);
+
+ TInt modulo = aCurrentImage % iImagesPerPage;
+
+ if(0 == modulo)
+ {
+ //delete current page's frame marker before...
+ TInt pos = iFileBuf->Find(KFrame());
+ if(KErrNotFound != pos)
+ iFileBuf->Des().Delete(pos, KFrame().Length());
+
+ // ...add the new page template and reset position index
+ AddTemplateStringL(iPageTemplate, KPage());
+ aPositionIndex = 0;
+ ++aPageCount;
+ ret = ETrue;
+ }
+ return ret;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::GetImageName
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::GetImageNameL(CImageInfo aImageInfo, TDes8 &aImageName, TBool aDataFile)
+{
+ aImageInfo.GetEncodedUriL(aImageName);
+ if(0 >= aImageName.Length() || aDataFile)
+ {
+ aImageInfo.GetFilePath(aImageName);
+ if(0 >= aImageName.Length())
+ User::Leave(KErrArgument);
+ }
+
+ LOG81("[CXhtmlFileComposer]\t Image: %S", &aImageName);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::SizeAndOrientationL
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::SizeAndOrientationL(const CImageInfo aImageInfo, TSizeReal& aImageSize, TBool& aFramePortrait)
+{
+ aImageSize = GetImageSizeL(aImageInfo);
+
+ // If the size of any of the sides is zero, set the size as frame size
+ if(0 >= aImageSize.iWidth)
+ aImageSize = iImageFrame;
+
+ // orientations
+ iImagePortrait = (aImageSize.iWidth < aImageSize.iHeight ? ETrue : EFalse);
+ aFramePortrait = (iImageFrame.iWidth < iImageFrame.iHeight ? ETrue : EFalse);
+
+ // Set orientation in degrees
+ TInt orientation = KXFCZeroDeg;
+ if(aFramePortrait != iImagePortrait)
+ orientation = KXFC90Deg;
+
+ // Set orientation in template
+ TXhtmlSetting orientationStr;
+ orientationStr.Format(KDeg(), orientation);
+ ComposeTemplateL(orientationStr, KImgOrientation());
+
+ // Set image and image frame temporarily in same orientation
+ if(aFramePortrait != iImagePortrait)
+ iImageFrame.Reverse();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::GetImageName
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::ComposePositionL(TInt aPositionIndex, RArray<TSizeReal>& aPositions)
+{
+ TSizeReal position(0,0);
+ if(aPositions.Count() <= aPositionIndex)
+ aPositionIndex = 0;
+
+ if(0 < aPositions.Count())
+ position = aPositions[aPositionIndex];
+
+ // Format position
+ TXhtmlSetting positionTopStr, positionLeftStr;
+
+ FormatReal(PixelToUnit(position.iWidth), positionTopStr);
+ ComposeTemplateL(positionTopStr, KPositionTop());
+
+ FormatReal(PixelToUnit(position.iHeight), positionLeftStr);
+ ComposeTemplateL(positionLeftStr, KPositionLeft());
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CXhtmlFileComposer::FormatReal
+//
+//--------------------------------------------------------------------------------------------
+void CXhtmlFileComposer::FormatReal(TRealX aNumber, TDes8& aString)
+{
+ TRealFormat form;
+ form.iPlaces = 4;
+ form.iPoint = TChar('.');
+ form.iType = KDoNotUseTriads | KRealFormatFixed;
+
+ aString.Num(aNumber, form);
+ aString.Append(KUnit());
+}
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/imageprint.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,149 @@
+/*
+* 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: Client include file for the ImagePrint server. Contains the
+* CImagePrint class definition, and the following interfaces:
+* MIdleObserver, MPrinterDiscoveryObserver and MPrintEventObserver
+*
+*/
+
+
+#ifndef IMAGEPRINT_H
+#define IMAGEPRINT_H
+
+#include <e32base.h>
+
+class TPrinter;
+class TEvent;
+
+_LIT( KTabChar, "\t" );
+_LIT( KParamFile, "\\system\\data\\T_AIW_TEMP.DAT");
+
+/// Error constant defined to indicate Invalid Sequence.
+const TInt KErrInvalidSequence = -50;
+/// Error constant defined to indicate Invalid Data.
+const TInt KErrInvalidData = -51;
+/// Error constant defined to indicate that a printer has been connected
+const TInt KErrConnected = -500;
+
+/// BPP Protocol Identifier.
+const TUint KImagePrint_PrinterProtocol_BPP = 1;
+/// BIP Protocol Identifier.
+const TUint KImagePrint_PrinterProtocol_BIP = 2;
+/// OPP Protocol Identifier (Printer).
+const TUint KImagePrint_PrinterProtocol_OPP_Printer = 4;
+/// DPOF Protocol Identifier.
+const TUint KImagePrint_PrinterProtocol_DPOF = 8;
+/// PictBridge Protocol Identifier.
+const TUint KImagePrint_PrinterProtocol_PictBridge = 16;
+/// OPP Protocol Identifier (PC).
+const TUint KImagePrint_PrinterProtocol_OPP_PC = 32;
+/// UPnP Protocol Identifier
+const TUint KImagePrint_PrinterProtocol_UPnP = 64;
+
+/// Enums used to specify the current state in the DiscoveryStatusL callback.
+enum TDiscoveryStatus
+ {
+ EDiscoverying = 0,
+ EDiscoveryFinished = 1,
+ EDiscoveryCancelling = 2
+ };
+
+/// Enums used to specify the current state in the PrintJobProgressEvent callback.
+enum TPrintJobProgressEventStatus
+ {
+ EActive = 0,
+ EDone = 1
+ };
+
+/**
+ * @brief Interface to be implemented by the class using CImagePrint. It is used by CImagePrint to report anything related
+ * to the discovery process.
+ */
+class MPrinterDiscoveryObserver
+ {
+ public:
+ /**
+ * Called by Image Printer Server to notify the client application that a printer was discovered.
+ * @param aPrinterInfo Contains printer information of the discovered device.
+ */
+ virtual void FoundPrinterL( const TPrinter& aPrinterInfo ) = 0;
+ /**
+ * Called by Image Printer Server to notify the client application that an operation
+ * has completed, either successfully or with an error.
+ * @param aStatus Indicate the status of the discovery process. One of the values of \c ::TDiscoveryStatus
+ * @param aErrorCode \c KErrNone if there was no error, otherwise another of the system-wide error codes.
+ * @param aErrorStringCode StringCode - Descriptive text that can be used to further explain error.
+ */
+ virtual void DiscoveryStatusL( TInt aStatus,
+ TInt aErrorCode,
+ TInt aErrorStringCode ) = 0;
+ /**
+ * Called by Image Printer Server to notify the client application that a printer
+ * returned from the cache was not discovered during the discovery phase,
+ * and should be removed from the UI. If this call is needed, it will be made
+ * after all BPP printers have been returned, but before the discovery completes.
+ * @param aPrinterInfo Contains printer information of the printer that was not found during discovery
+ */
+ virtual void RemovePrinterL( const TPrinter& aPrinterInfo ) = 0;
+ };
+
+/**
+ * @brief Interface to be implemented by the class using CImagePrint. It is used by CImagePrint to report anything related
+ * to the printing process, once it is started.
+ */
+class MPrintEventObserver
+ {
+ public:
+ virtual void PrintJobProgressEvent( TInt aStatus,
+ TInt aPercentCompletion,
+ TInt aJobStateCode ) = 0;
+
+ virtual void PrintJobErrorEvent( TInt aError,
+ TInt aErrorStringCode ) = 0;
+
+ virtual void PrinterStatusEvent( TInt aError,
+ TInt aErrorStringCode ) = 0;
+
+ virtual void PreviewImageEvent( TInt aFsBitmapHandle ) = 0;
+
+ virtual void ShowMessageL( TInt aMsgLine1Code,
+ TInt aMsgLine2Code ) = 0;
+
+ virtual TBool AskYesNoQuestionL( TInt aMsgLine1Code,
+ TInt aMsgLine2Code ) = 0;
+
+ virtual const TDesC& AskForInputL( TInt aMsgLine1Code,
+ TInt aMsgLine2Code ) = 0;
+ };
+
+/**
+ * @brief Interface to be implemented by the class using CImagePrint. It is used by CImagePrint to report
+ * anything related to status changes in the handling protocol.
+ * @sa CImagePrint::RegisterIdleObserver
+ */
+class MIdleObserver
+ {
+ public:
+ /** Called by CImagePrint to notify of events. The meaning of the event and associated error and mesage codes
+ * is protocol dependant.
+ */
+ virtual void StatusEvent( const TEvent &aEvent,
+ TInt aError,
+ TInt aMsgCode ) = 0;
+ };
+
+
+#endif // IMAGEPRINT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/imageprint.rh Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,35 @@
+/*
+* 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 following interfaces: MProtPrintingDevice,
+* MProtIdleObserver, MProtPrintEventObserver and MProtDiscoveryObserver.
+*
+*/
+
+
+STRUCT RS_CAPABILITY
+{
+ LONG printerclass;
+ LONG capabilityid;
+ LONG type;
+ LONG defaultvalue;
+ LONG low;
+ LONG high;
+ LONG enumcodes[]; //code and link pair
+ LONG linkid;
+}
+
+STRUCT RS_CAPABILITIES
+{
+ STRUCT capabilities[];
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/mprotprintingdevice.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,326 @@
+/*
+* 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 following interfaces: MProtPrintingDevice,
+* MProtIdleObserver, MProtPrintEventObserver and MProtDiscoveryObserver.
+*
+*/
+
+
+#ifndef MPROTPRINTINGDEVICE_H
+#define MPROTPRINTINGDEVICE_H
+
+#include <e32base.h>
+
+#include "tprinter.h"
+#include "tprintcapability.h"
+#include "tidleevent.h"
+
+const TInt DEVICE_ID_FIELD_MASK = 0x03FFFFFF; // most significant bits: 0000 0011 rest is 1's
+const TInt PROTOCOL_ID_FIELD_MASK = 0xFC000000; // most significant bits: 1111 1100
+const TInt PROTOCOL_ID_CLEAR_MASK = 0x0000003F; // less siginificant bits: 0011 1111
+const TInt PROTOCOL_ID_BIT_COUNT = 6;
+
+
+/**
+ * @brief Interface to be implemented by a class observing the discovery events of a class implementing MProtPrintingDevice.
+ *
+ * Interface used by a Protocol implementing "MProtPrintingDevice" to report back any device found or not found and
+ * the general status of the discovery process. This should be implemented by the class using "MProtPrintingDevice"; in
+ * this case, it's already implemented in a class in the Image Print Library.
+ */
+class MProtDiscoveryObserver
+ {
+ public:
+ virtual void FoundDeviceL( TPrinter& aDeviceInfo ) = 0;
+ virtual void RemoveDeviceL( TPrinter& aDeviceInfo ) = 0;
+
+ /**
+ * @brief
+ * @param aStatus ( EDiscovering | ECancellingDiscovery | EDoneDiscovery | EDiscoveryFinished )
+ * EDiscovering = currently discovering
+ * ECancellingDiscovery = cancel request on discovery
+ * EDiscoveryFinished = on discovery time-out
+ * @param aErrorCode
+ * @param aErrorStringCode
+ */
+ virtual void DiscoveryStatusL( TInt aStatus,
+ TInt aErrorCode,
+ TInt aErrorStringCode = KErrNone ) = 0;
+ };
+
+/**
+ * @brief Interface to be implemented by a class observing the printing events of a class implementing MProtPrintingDevice.
+ *
+ * Interface used by a Protocol implementing "MProtPrintingDevice" to report back the printing progress, any error or
+ * the printer status. This should be implemented by the class using "MProtPrintingDevice"; in this case, it's already
+ * implemented in a class in the Image Print Library.
+ * These methods should be used only when actual printing is ongoing
+ */
+class MProtPrintEventObserver
+ {
+ public:
+ /**
+ * @brief Method to inform observer about printing proggress.
+ *
+ * @param aStatus Defines the printing status defined in ImagePrint.h.
+ * @param aPercent Percents of job readiness.
+ * @param aJobStateCode Job's state defined in PrintMessageCodes.h.
+ */
+ virtual void PrintJobProgressEvent( TInt aStatus,
+ TInt aPercent,
+ TInt aJobStateCode ) = 0;
+
+ /**
+ * @brief Method to inform observer about error occured during printing.
+ *
+ * @param aErrorCode Defines the error code that is symbian wide or defined in PrintMessageCodes.h.
+ * @param aErrorStringCode Reserved for future use.
+ */
+ virtual void PrintJobErrorEvent( TInt aErrorCode,
+ TInt aErrorStringCode = KErrNone ) = 0;
+
+ /**
+ * @brief Method to inform observer about error concerning the printing device.
+ *
+ * @param aErrorCode Defines the error code that is symbian wide or defined in PrintMessageCodes.h.
+ * @param aErrorStringCode Reserved for future use.
+ */
+ virtual void PrinterStatusEvent( TInt aErrorCode,
+ TInt aErrorStringCode = KErrNone ) = 0;
+
+ // DEPRECATED - DO NOT USE
+ virtual void PreviewImageEvent( TInt aFsBitmapHandle ) = 0;
+
+ // DEPRECATED - DO NOT USE
+ virtual void ShowMessageL( TInt aMsgLine1Code,
+ TInt aMsgLine2Code ) = 0;
+
+ // DEPRECATED - DO NOT USE
+ virtual TBool AskYesNoQuestionL( TInt aMsgLine1Code,
+ TInt aMsgLine2Code ) = 0;
+
+ // DEPRECATED - DO NOT USE
+ virtual const TDesC& AskForInputL( TInt aMsgLine1Code,
+ TInt aMsgLine2Code ) = 0;
+ };
+
+/**
+ * @brief Interface to be implemented by CImagePrint. It is used to report
+ * anything related to status changes in the handling protocol.
+ * @sa MProtPrintingDevice::RegisterIdleObserver
+ */
+class MProtIdleObserver
+ {
+ public:
+ /** Called by a protocol to notify CImagePrint of events. The meaning of the event and associated error and mesage codes
+ * is protocol dependant. This should be used only when actual printing is not ongoing.
+ */
+ virtual void StatusEvent( const TEvent &aEvent,
+ TInt aError,
+ TInt aMsgCode ) = 0;
+ };
+
+/**
+ * @brief Interface to be implemented in the Polymorphic DLLs.
+ *
+ * Interface to be implemented by any printing protocol that wants to be added to the Image Print library, so it can
+ * be seen by the library and used in a transparent way. This implementation should be encapsulated within a Polymorphic
+ * DLL and put in a specific directory.
+ */
+class MProtPrintingDevice
+ {
+ public:
+ // General.
+ /**
+ * @brief Part of the standard construction pattern.
+ * @param aDLLPath Path where the DLL was found so it can know where it is located and use that information
+ * when looking for resource files and such. The path includes the DLL itself.
+ */
+ virtual void ConstructL( const TDesC& aDLLPath ) = 0;
+ /**
+ * @brief Reports the Version of the DLL.
+ * @return A TVersion object containing the version of the protocol.
+ */
+ virtual TVersion Version() = 0;
+ /**
+ * @brief Returns the Protocols supported by the DLL. It can be any of the KImagePrint_PrinterProtocol* constants.
+ * @return An OR'ed value with the supported protocols information.
+ */
+ virtual TUint SupportedProtocols() = 0;
+ // Discovery.
+ /**
+ * @brief Starts the discovery process.
+ *
+ * This process is to find whatever printing device is available nearby. After this call server waits
+ * DiscoveryStatusL from MProtDiscoveryObserver to be called with value aStatus = EDiscoveryFinished
+ * after the discovey is finished.
+ * @param aObserver The discovery observer.
+ * @param aProtocol Used to indicate what protocols to search for. 0 = all, 1 = BPP, 2 = BIP, 4 = OPP, 8 = DPOF, 16 = PB.
+ * @return Any standard Symbian error code.
+ */
+ virtual void StartDiscoveryL( MProtDiscoveryObserver& aObserver,
+ TUint aProtocol = 0 ) = 0;
+ /**
+ * @brief Removes a specified cached printer.
+ * @param[in] aDeviceID The ID of the printer the client wants to remove.
+ * @return Any standard Symbian error code or ( KErrInvalidSequence and KErrInvalidData ).
+ */
+ virtual TInt RemoveCachedDeviceL( TInt aDeviceID ) = 0;
+
+ /**
+ * @brief Cancels the discovery process.
+ * The caller expects to get notification of cancelled discovery via 'DiscoveryStatusL' with value 'EDiscoveryCancelling'
+ * @param[in] aDoCallBack Flag to indicate whether to call back the observer or not. Default = True.
+ */
+ virtual void CancelDiscovery( TBool aDoCallBack = ETrue ) = 0;
+
+ // Print.
+ /**
+ * @brief Creates a print job in the specified printer.
+ * @param[in] aDeviceID The ID of the printer where the client wishes to create the print job.
+ * @param aImages Array containing the full names of the files to print.
+ * @param aObserver The print event observer.
+ * @return Any standard Symbian error code or ( KErrInvalidSequence and KErrInvalidData ).
+ */
+ virtual TInt CreatePrintJobL( TInt aDeviceID,
+ RPointerArray<TDesC>& aImages,
+ MProtPrintEventObserver& aObserver ) = 0;
+ /**
+ * @brief Submits a print job already created.
+ */
+ virtual void SubmitPrintJobL() = 0;
+ /**
+ * @brief Cancels the print job.
+ */
+ virtual TInt CancelPrintJob() = 0;
+ /**
+ * @brief Continues printing and / or submitting a print job. Implementation may vary from protocol to protocol.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt ContinuePrintJobL() = 0;
+ /**
+ * @brief Gets the number of pages to be printed.
+ * @return Number of pages to print.
+ */
+ virtual TInt GetNumPrintPages() = 0;
+ /**
+ * DEPRECATED - DO NOT USE
+ * @brief Gets the status of the printing job created.
+ * @return Printing job status.
+ */
+ virtual TInt GetPrintJobStatus() = 0;
+ /**
+ * DEPRECATED - DO NOT USE
+ * @brief Gets the status of the printer.
+ * @param[in] aDeviceID The ID of the printer the client wants to know about.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt GetPrinterStatus( TInt aDeviceID ) = 0;
+ // Capabilities.
+ /**
+ * @brief Gets the IDs of the capabilities supported by the printer specified.
+ * @param[in] aDeviceID The ID of the printer the client wants to know about.
+ * @param[out] aCapabilityIDs Array containing the ID's of the capabilities of the specified printer.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt GetDeviceCapabilityIDsL( TInt aDeviceID,
+ RArray<TInt>& aCapabilityIDs ) = 0;
+ /**
+ * @brief Gets the detail of a certain capability of a certain printer.
+ * @param[in] aDeviceID The exposed ID of the printer the client wants to know about.
+ * @param[in] aCapabilityID ID of the capability of interest.
+ * @param[out] aCapability Capability information.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt GetDeviceCapabilityL( TInt aDeviceID,
+ TInt aCapabilityID,
+ TPrintCapability& aCapability ) = 0;
+ /**
+ * @brief Gets a setting (i.e., papersize selected) from an existing job.
+ * @param[in] aCapabilityID ID of the capability of interest.
+ * @param[out] aValue Capability value.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt GetJobSetting( TInt aCapabilityID,
+ TInt& aValue ) = 0;
+ /**
+ * @brief Sets a print job setting.
+ * @param[in] aCapabilityID ID of the capability of interest.
+ * @param[in] aValue New capability value.
+ * @param[out] aAffectedCapability ID of any affected capability.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt SetJobSettingL( TInt aCapabilityID,
+ TInt aValue,
+ TInt& aAffectedCapability ) = 0;
+ // Preview.
+ /**
+ * DEPRECATED - DO NOT USE
+ * @brief Gets the number of pages in the preview.
+ * @return Number of pages in the preview.
+ */
+ virtual TInt GetNumPreviewPages() = 0;
+ /**
+ * DEPRECATED - DO NOT USE
+ * @brief Gets the icon representing a given layout or template.
+ * @param[in] aTemplateID ID of the template / layout of interest.
+ * @param[out] aFsBitmapHandle Handle to the appropriate bitmap.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt GetJobTemplateIconL( TInt aTemplateID,
+ TInt& aFsBitmapHandle ) = 0;
+ /**
+ * DEPRECATED - DO NOT USE
+ * @brief Creates a preview image.
+ * @param[in] aPageNumber Page number to create preview image of.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ virtual TInt CreatePreviewImage( TInt aPageNumber ) = 0;
+
+ /**
+ * @brief Destructor.
+ */
+ virtual ~MProtPrintingDevice() {}
+
+
+ /**
+ * @brief Registers the IdleObserver to send idle event notifications
+ * @param A pointer to an object implementing MIdleObserver interface that will be notified of events
+ * @note In order to stop sending notifications, send NULL as the parameter.
+ */
+ virtual void RegisterIdleObserver( MProtIdleObserver *aObserver ) = 0;
+
+
+ /**
+ * @brief Number of copies setter. Must be called after the print job is created but before
+ * submission. Amount of array elements must be the same with the amount of image files
+ * in the print job. Array elements must be greater than 0.
+ * @param aNumsOfCopies number of copies array
+ * @param aErr contains error code on return
+ */
+ virtual void SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies,
+ TInt& aErr ) = 0;
+
+ public:
+ TUid iDtor_ID_Key;
+ protected:
+ /// Protocol API observer.
+ MProtDiscoveryObserver* iDiscoveryObserver;
+ /// Protocol API observer.
+ MProtPrintEventObserver* iPrintEventObserver;
+ };
+
+#endif // MPROTPRINTINGDEVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/printcapabilitycodes.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,94 @@
+/*
+* 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 TPrintCapabilityCodes and TPrintCapabilityOptions enumerations.
+*
+*/
+
+
+#ifndef PRINTCAPABILITYCODES_H
+#define PRINTCAPABILITYCODES_H
+
+/// All the printer capabilities
+enum TPrintCapabilityCodes
+ {
+ EPrintCapabLayout = 500,
+ EPrintCapabPaperSize = 501,
+ EPrintCapabQuality = 502
+ };
+
+/// Print capability generic options
+enum TPrintCapabilityOptions
+ {
+ // Generic
+ EPrintCapabYes = 1000,
+ EPrintCapabNo = 1001,
+ EPrintCapabOn = 1002,
+ EPrintCapabOff = 1003,
+
+ // Quality
+ EPrintCapabQualityDefault = 1100,
+ EPrintCapabQualityNormal = 1101,
+ EPrintCapabQualityDraft = 1102,
+ EPrintCapabQualityFine = 1103,
+
+ // Paper size
+ EPrintCapabPaperSizeAuto = 1200,
+ EPrintCapabPaperSizeLetter = 1201,
+ EPrintCapabPaperSizeA4 = 1221,
+ EPrintCapabPaperSizeA6 = 1222,
+ EPrintCapabPaperSize4x6 = 1250,
+ EPrintCapabPaperSize5x7 = 1251,
+ EPrintCapabPaperSizeSticker = 1270,
+
+ // Layout
+ EPrintCapabLayout1Up = 1501,
+ EPrintCapabLayout2Up = 1502,
+ //EPrintCapabLayout3Up = 1503,
+ EPrintCapabLayout4Up = 1504,
+ //EPrintCapabLayout5Up = 1505,
+ EPrintCapabLayout6Up = 1506,
+ EPrintCapabLayout9Up = 1509,
+ EPrintCapabLayout12Up = 1512,
+ EPrintCapabLayout16Up = 1513,
+ EPrintCapabLayout16UpStick = 1516,
+ EPrintCapabLayout1UpSmall = 1551,
+ EPrintCapabLayout1UpMedium = 1552,
+ EPrintCapabLayout1UpLarge = 1553,
+ EPrintCapabLayout1UpBorderless = 1554,
+ EPrintCapabLayout1UpBorder = 1555,
+ //EPrintCapabLayout1UpPassport = 1556,
+ //EPrintCapabLayout1UpPassportSF = 1557, // SmallFormat paper
+
+ EPrintCapabLayout2UpPassport508x508Lg = 1558,
+ EPrintCapabLayout2UpPassport254x364Lg = 1559,
+ EPrintCapabLayout2UpPassport350x450Lg = 1560,
+ EPrintCapabLayout2UpPassport364x508Lg = 1561,
+ EPrintCapabLayout2UpPassport450x550Lg = 1562,
+
+ EPrintCapabLayout2UpPassport508x508Sm = 1563,
+
+ EPrintCapabLayout4UpStick = 1564,
+ EPrintCapabLayout1UpStick = 1565,
+
+ EPrintCapabLayout2UpPassport254x364Sm = 1566,
+ EPrintCapabLayout2UpPassport350x450Sm = 1567,
+ EPrintCapabLayout2UpPassport364x508Sm = 1568,
+ EPrintCapabLayout2UpPassport450x550Sm = 1569,
+
+ EPrintCapabLayoutLast = 3000
+ };
+
+#endif // PRINTCAPABILITYCODES_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/printmessagecodes.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,174 @@
+/*
+* 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: Contains the TPrintErrorMessageCodes and TPrintMessageCodes enumerations.
+*
+*/
+
+
+#ifndef PRINTMESSAGECODES_H
+#define PRINTMESSAGECODES_H
+
+/// Global printing Error Message Codes.
+// All supported by UI
+enum TPrintErrorMessageCodes
+{
+ EObexConnectError = -3000,
+ EObexSendError = -3001,
+ EObexDisconnectError = -3002,
+ EObexGeneralError = -3003,
+};
+
+/// Global printing Message Codes.
+enum TPrintMessageCodes
+{
+ // No message
+ ENoMessage = 0,
+
+ // Print Progress Codes
+ EJobPending = 3100,
+ EPrinting = 3101,
+ ECopying = 3102,
+ ECancelling = 3103,
+ ECancellingNoMessage = 3104,
+
+ // Pict Bridge
+ EPbOutOfPaper = 3300, ///<@deprecated Use TPrintMessageCodes::EPbStatusErrorReasonPaperEmpty
+ EPbCheckPrinter = 3301,
+ EPbPrinterIsDisconnected = 3302,
+ EPbPrinterIsConnected = 3303,
+ EPbFileNotSupported = 3304,
+ EPbFileNotFound = 3305,
+
+ EPbStatusErrorReasonNoReason, /*3306*/ ///<@brief No reason
+ EPbStatusErrorReasonPaper, ///<@brief Paper-related error
+ EPbStatusErrorReasonInk, ///<@brief Ink-related error
+ EPbStatusErrorReasonHardware, ///<@brief Hardware-related error
+ EPbStatusErrorReasonFile, ///<@brief File-related error
+ EPbStatusErrorReasonPaperEmpty, /*3311*/ ///<@brief Paper is empty
+ EPbStatusErrorReasonPaperLoad, ///<@brief Load error - paper not loaded correctly
+ EPbStatusErrorReasonPaperEject, ///<@brief Eject error - paper not ejected correctly
+ EPbStatusErrorReasonPaperMedia, ///<@brief Media error - paper is not detected, paper skewed, roll paper connot be cut or torn-off
+ EPbStatusErrorReasonPaperJam, ///<@brief Paper jam
+ EPbStatusErrorReasonPaperNearlyEmpty, ///<@brief Paper nearly empty
+ EPbStatusErrorReasonPaperCombination, ///<@brief Paper type / paper size combination not supported, or paper found in printer does not match request
+ EPbStatusErrorReasonInkEmpty, /*18*/ ///<@brief Ink empty
+ EPbStatusErrorReasonInkLow, ///<@brief Ink low
+ EPbStatusErrorReasonInkWaste, ///<@brief Waste ink error (waste-ink reservior full).
+ EPbStatusErrorReasonHardwareFatal, /*21*/ ///<@brief Fatal error
+ EPbStatusErrorReasonWarning, // warning
+ EPbStatusErrorReasonHardwareServiceCall, ///<@brief Service call
+ EPbStatusErrorReasonHardwarePrinterUnavailable, ///<@brief Printer unavailable (performing maintenance or otherwise occupied)
+ EPbStatusErrorReasonHardwarePrinterBusy, ///<@brief Printer busy (processing a job from another source, e.g. a PC)
+ EPbStatusErrorReasonHardwareLever, ///<@brief Lever error (lever position not correct)
+ EPbStatusErrorReasonHardwareCoverOpen, ///<@brief Cover open
+ EPbStatusErrorReasonHardwareNoMarkingAgent, ///<@brief No marking agent (e.g. missing printer head)
+ EPbStatusErrorReasonHardwareInkCoverOpen, ///<@brief Ink cover open
+ EPbStatusErrorReasonHardwareNoInkCartridge, ///<@brief No ink cartridge
+ EPbStatusErrorReasonFilePrintInfo, /*31*/ ///<@brief printInfo error (specified <printInfo> is too large).
+ EPbStatusErrorReasonFileFileDecode, ///<@brief File decode error (picture format of specified image cannot be decoded).
+
+ // Printer status reasons
+ EPrintReasonAttentionRequired, /*33*/ ///<@brief Indicates reason other than those listed
+ EPrintReasonPaused, ///<@brief Someone has paused the printer and the PrinterState is "stopped". In this state, a Printer may not produce printed output.
+ EPrintReasonOutputAreaAlmostFull, ///<@brief One or more output area is almost full: e.g., tray, stacker, collator.
+ EPrintReasonOutputAreaFull, ///<@brief One or more output area is full: e.g., tray, stacker, collator.
+ EPrintReasonMarkerSupplyLow, ///<@brief The device is low on at least one marker supply: e.g., toner, ink, ribbon.
+ EPrintReasonMarkerSupplyEmpty, ///<@brief The device is out of at least one marker supply: e.g., toner, ink, ribbon.
+ EPrintReasonMarkerFailure, ///<@brief The device has at least one marking device which has failed and requires service or replacement: e.g., pen.
+
+ // OBEX response codes
+ EObexReserved, ///<@brief Reserved
+ EObexContinue, ///<@brief Continue
+ EObexOKSuccess, ///<@brief OK, Success
+ EObexCreated, ///<@brief Created
+ EObexAccepted, ///<@brief Accepted
+ EObexNonAuthoritativeInformation, ///<@brief Non-Authoritative Information
+ EObexNoContent, ///<@brief No Content
+ EObexResetContent, ///<@brief Reset Content
+ EObexPartialContent, ///<@brief Partial Content
+ EObexMultipleChoices, ///<@brief Multiple Choices
+ EObexMovedPermanently, ///<@brief Moved Permanently
+ EObexMovedTemporarily, ///<@brief Moved Temporarily
+ EObexSeeOther, ///<@brief See Other
+ EObexNotModified, ///<@brief Not Modified
+ EObexUseProxy, ///<@brief Use Proxy
+ EObexBadRequest, ///<@brief Bad Request - server could not understand the request
+ EObexUnauthorized, ///<@brief Unauthorized
+ EObexPaymentRequired, ///<@brief Payment required
+ EObexForbidden, ///<@brief Forbidden: operation is understood but refused
+ EObexNotFound, ///<@brief Not found DPS: Object or File does not exist.
+ EObexMethodNotAllowed, ///<@brief Method not allowed
+ EObexNotAcceptable, ///<@brief Not acceptable
+ EObexProxyAuthRequired, ///<@brief Proxy authentication is required
+ EObexRequestTimedOut, ///<@brief Request timed out
+ EObexConflict, ///<@brief Conflict
+ EObexGone, ///<@brief Gone
+ EObexLengthRequired, ///<@brief Length Required
+ EObexPreconditionFailed, ///<@brief Precondition failed
+ EObexRequestedEntityTooLarge, ///<@brief Requested entity is too large
+ EObexRequestedURLTooLarge, ///<@brief Requested URL is too large
+ EObexUnsupportedMediaType, ///<@brief Unsupported media type. Note: Refers to MIME media-type
+ EObexInternalReceiverError, ///<@brief Internal receiver error
+ EObexNotImplemented, ///<@brief Not implemented
+ EObexBadGateway, ///<@brief Bad Gateway
+ EObexServiceUnavailable, ///<@brief Service Unavailable
+ EObexGatewayTimeout, ///<@brief Gateway Timeout
+ EObexHTTPVersionNotSupported, ///<@brief HTTP protocol version is not supported
+ EObexDatabaseFull, ///<@brief Database Full
+ EObexDatabaseLocked, ///<@brief Database Locked
+
+ EKErrIrObexRespTimedOut = -5572, // OBEX command timed out
+
+};
+
+enum TOperationStatusCodes
+{
+ EOperationStatusOk = 0x0000, ///<@brief successful-ok
+ EOperationStatusOkIgnoredOrSubstitutedAttributes = 0x0001, ///<@brief successful-ok-ignored-or-substituted-attributes
+ EOperationStatusOkConflictingAttributes = 0x0002, ///<@brief successful-ok-conflicting-attributes
+ EOperationStatusClientBadRequest = 0x0400, ///<@brief client-error-bad-request
+ EOperationStatusClientForbidden = 0x0401, ///<@brief client-error-forbidden
+ EOperationStatusClientNotAuthenticated = 0x0402, ///<@brief client-error-not-authenticated
+ EOperationStatusClientNotAuthorized = 0x0403, ///<@brief client-error-not-authorized
+ EOperationStatusClientNotPossible = 0x0404, ///<@brief client-error-not-possible
+ EOperationStatusClientTimeout = 0x0405, ///<@brief client-error-timeout
+ EOperationStatusClientNotFound = 0x0406, ///<@brief client-error-not-found
+ EOperationStatusClientGone = 0x0407, ///<@brief client-error-gone
+ EOperationStatusClientRequestEntityTooLarge = 0x0408, ///<@brief client-error-request-entity-too-large
+ EOperationStatusClientRequestValueTooLong = 0x0409, ///<@brief client-error-request-value-too-long
+ EOperationStatusClientDocumentFormatNotSupported = 0x040a, ///<@brief client-error-document-format-not-supported
+ EOperationStatusClientAttributesOrValuesNotSupported = 0x040b, ///<@brief client-error-attributes-or-values-not-supported
+ EOperationStatusClientUriSchemeNotSupported = 0x040c, ///<@brief client-error-uri-scheme-not-supported
+ EOperationStatusClientCharsetNotSupported = 0x040d, ///<@brief client-error-charset-not-supported
+ EOperationStatusClientConflictingAttributes = 0x040e, ///<@brief client-error-conflicting-attributes
+ EOperationStatusClientCompressionNotSupported = 0x040f, ///<@brief client-error-compression-not-supported
+ EOperationStatusClientCompression = 0x0410, ///<@brief client-error-compression-error
+ EOperationStatusClientDocumentFormat = 0x0411, ///<@brief client-error-document-format-error
+ EOperationStatusClientDocumentAccess = 0x0412, ///<@brief client-error-document-access-error
+ EOperationStatusClientMediaNotLoaded = 0x0418, ///<@brief client-error-media-not-loaded
+ EOperationStatusServerInternalError = 0x0500, ///<@brief server-error-internal-error
+ EOperationStatusServerOperation = 0x0501, ///<@brief server-error-operation-not-supported
+ EOperationStatusServerServiceUnavailable = 0x0502, ///<@brief server-error-service-unavailable
+ EOperationStatusServerVersionNotSupported = 0x0503, ///<@brief server-error-version-not-supported
+ EOperationStatusServerDeviceError = 0x0504, ///<@brief server-error-device-error
+ EOperationStatusServerTemporaryError = 0x0505, ///<@brief server-error-temporary-error
+ EOperationStatusServerNotAcceptingJobs = 0x0506, ///<@brief server-error-not-accepting-jobs
+ EOperationStatusServerBusy = 0x0507, ///<@brief server-error-busy
+ EOperationStatusServerJobCanceled = 0x0508, ///<@brief server-error-job-canceled
+ EOperationStatusServerMultipleDocument = 0x0509 ///<@brief server-error-multiple-document-jobs-not-supported
+};
+
+#endif // PRINTMESSAGECODES_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/tidleevent.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* 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 types necesary for MIdleObserver TPrinter class definition.
+*
+*/
+
+
+#ifndef IDLEEVENT_H
+#define IDLEEVENT_H
+
+/** The severity associated of the notification.
+ */
+enum TSeverity
+ {
+ ///The event doesn't have a specific severity. Used in cases where severity is irrelevant, unknown or can be ignored.
+ ENotSpecified,
+ ///The event does not cause an error
+ ENoError,
+ ///The event was caused by a warning. Generally this is recoverable.
+ EWarning,
+ ///The event was caused by a fatal error. Generally this is not recoverable
+ EFatal,
+ ///The event was caused by a severe error. Generally this is a async leave
+ ESevere
+ };
+
+/** The type of event the observer is being notified of. The types of events being raised vary by protocol
+ */
+enum TEventType
+ {
+ ///The protocol has made a connection to the printer, device or transport
+ EConnect,
+ ///The protocol has been disconnected from the printer, device or transport
+ EDisconnect,
+ ///The protocol can be disconnected
+ EDisconnectReady,
+ ///The protocol cannot be disconnected
+ EDisconnectNotReady,
+ ///The device or printer is ready to accept print jobs
+ EPrintReady,
+ ///The device or printer is not ready to accept print jobs
+ EPrintNotReady,
+ ///The event is notifying a change in the device status, or is reporting an error sent from the device
+ EPrinterStatus,
+ ///The event is notifying that the capabilities that the printer supports have changed
+ EPrinterCapabilityChanged,
+ ///The event is notifying that asynchronous leave has happened
+ EAsynchronousLeave
+ };
+
+/** The event object. This object provides information about the event.
+ */
+class TEvent
+ {
+ public:
+ /** The protocol that is sending the notification
+ * @sa KImagePrint_PrinterProtocol_BPP @sa KImagePrint_PrinterProtocol_BIP @sa KImagePrint_PrinterProtocol_OPP
+ * @sa KImagePrint_PrinterProtocol_DPOF @sa KImagePrint_PrinterProtocol_PictBridge
+ */
+ TInt iProtocol;
+ ///The associated severity of the event
+ TSeverity iSeverity;
+ ///What kind of event is being sent
+ TEventType iEventType;
+ };
+
+
+#endif // IDLEEVENT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/tprintcapability.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* 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: Contains the TPrintCapability class definition.
+*
+*/
+
+
+#ifndef TPRINTCAPABILITY_H
+#define TPRINTCAPABILITY_H
+
+#include <e32base.h>
+
+/**
+ * @brief A printer capability abstraction.
+ *
+ * Class describing a capability (i.e. paper sizes or layouts) supported by a printing device.
+ * Published as part of the ImagePrint Server API.
+ */
+
+#define KMaxEnumAmount 20
+
+class TPrintCapability
+ {
+ public:
+ enum ECapType
+ {
+ Int = 0,
+ Enum = 1,
+ Float = 2
+ };
+
+ TInt iCapabilityID;
+ ECapType iType;
+ TInt iDefaultValue;
+ TInt iLow;
+ TInt iHigh;
+ TInt iEnumCount;
+ TInt iEnumCodes[KMaxEnumAmount];
+ };
+
+#endif // TPRINTCAPABILITY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/tprinter.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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 TPrinter class definition.
+*
+*/
+
+
+#ifndef TPRINTER_H
+#define TPRINTER_H
+
+#include <e32base.h>
+
+/**
+ * @brief A printer abstraction.
+ *
+ * Class representing the basic properties of a printing device.
+ * Published as part of the ImagePrint Server API.
+ */
+class TPrinter
+ {
+ public:
+ enum TPrinterProperty
+ {
+ Cached = 1,
+ SupportsPreview = 2
+ };
+ enum TPrinterVendor
+ {
+ EVendorNone = 0, // No Vendor
+ EVendorHp
+ // Add other vendors
+ };
+ TInt iPrinterID;
+ TBuf<84> iDisplayName;
+ TUint iProperties;
+ TUint iProtocol;
+ TUint iVendor;
+ };
+
+#endif // TPRINTER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/bwins/imageprintclientu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,43 @@
+EXPORTS
+ ?StartDiscovery@RImagePrintClient@@QAEHAAVTDiscoveryGuardData@@IAAVTRequestStatus@@@Z @ 1 NONAME ; int RImagePrintClient::StartDiscovery(class TDiscoveryGuardData &, unsigned int, class TRequestStatus &)
+ ?Guard@CJobGuard@@QAEHHAAV?$RPointerArray@VTDesC16@@@@AAVMPrintEventObserver@@@Z @ 2 NONAME ; int CJobGuard::Guard(int, class RPointerArray<class TDesC16> &, class MPrintEventObserver &)
+ ?CancelStartDiscovery@RImagePrintClient@@QBEHXZ @ 3 NONAME ; int RImagePrintClient::CancelStartDiscovery(void) const
+ ?GetJobStatus@RImagePrintClient@@QBEHXZ @ 4 NONAME ; int RImagePrintClient::GetJobStatus(void) const
+ ?ContinueDiscovery@RImagePrintClient@@QAEHAAVTDiscoveryGuardData@@AAVTRequestStatus@@@Z @ 5 NONAME ; int RImagePrintClient::ContinueDiscovery(class TDiscoveryGuardData &, class TRequestStatus &)
+ ?ReleaseEngine@RImagePrintClient@@QBEHXZ @ 6 NONAME ; int RImagePrintClient::ReleaseEngine(void) const
+ ??1CIdleGuard@@UAE@XZ @ 7 NONAME ; CIdleGuard::~CIdleGuard(void)
+ ?Guard@CDiscoveryGuard@@QAEHAAVMPrinterDiscoveryObserver@@I@Z @ 8 NONAME ; int CDiscoveryGuard::Guard(class MPrinterDiscoveryObserver &, unsigned int)
+ ?ContinuePrintJob@RImagePrintClient@@QBEHXZ @ 9 NONAME ; int RImagePrintClient::ContinuePrintJob(void) const
+ ?SetNumberOfCopies@RImagePrintClient@@QBEHABV?$RArray@H@@@Z @ 10 NONAME ; int RImagePrintClient::SetNumberOfCopies(class RArray<int> const &) const
+ ?GetNumPreviewPages@RImagePrintClient@@QBEHXZ @ 11 NONAME ; int RImagePrintClient::GetNumPreviewPages(void) const
+ ?ContinueCreateJob@RImagePrintClient@@QAEHAAVTJobGuardData@@AAVTRequestStatus@@@Z @ 12 NONAME ; int RImagePrintClient::ContinueCreateJob(class TJobGuardData &, class TRequestStatus &)
+ ?CancelDiscovery@RImagePrintClient@@QBEHXZ @ 13 NONAME ; int RImagePrintClient::CancelDiscovery(void) const
+ ?ConnectL@RImagePrintClient@@QAEHXZ @ 14 NONAME ; int RImagePrintClient::ConnectL(void)
+ ?GetJobTemplateIcon@RImagePrintClient@@QBEHHAAH@Z @ 15 NONAME ; int RImagePrintClient::GetJobTemplateIcon(int, int &) const
+ ?RemoveCachedPrinter@RImagePrintClient@@QBEHH@Z @ 16 NONAME ; int RImagePrintClient::RemoveCachedPrinter(int) const
+ ?ReserveEngine@RImagePrintClient@@QBEHXZ @ 17 NONAME ; int RImagePrintClient::ReserveEngine(void) const
+ ?SetForeground@RImagePrintClient@@QBEHH@Z @ 18 NONAME ; int RImagePrintClient::SetForeground(int) const
+ ??1CDiscoveryGuard@@UAE@XZ @ 19 NONAME ; CDiscoveryGuard::~CDiscoveryGuard(void)
+ ?Guard@CIdleGuard@@QAEXPAVMIdleObserver@@@Z @ 20 NONAME ; void CIdleGuard::Guard(class MIdleObserver *)
+ ??1CJobGuard@@UAE@XZ @ 21 NONAME ; CJobGuard::~CJobGuard(void)
+ ?IsPictBridgeMode@RImagePrintClient@@QBEHXZ @ 22 NONAME ; int RImagePrintClient::IsPictBridgeMode(void) const
+ ?RegisterIdleObserver@RImagePrintClient@@QAEHAAVTIdleGuardData@@AAVTRequestStatus@@@Z @ 23 NONAME ; int RImagePrintClient::RegisterIdleObserver(class TIdleGuardData &, class TRequestStatus &)
+ ??0RImagePrintClient@@QAE@XZ @ 24 NONAME ; RImagePrintClient::RImagePrintClient(void)
+ ?CountConnections@RImagePrintClient@@QBEHAAH@Z @ 25 NONAME ; int RImagePrintClient::CountConnections(int &) const
+ ?GetPrinterStatus@RImagePrintClient@@QBEHH@Z @ 26 NONAME ; int RImagePrintClient::GetPrinterStatus(int) const
+ ?CancelRegisterIdleObserver@RImagePrintClient@@QBEHXZ @ 27 NONAME ; int RImagePrintClient::CancelRegisterIdleObserver(void) const
+ ?GetJobSetting@RImagePrintClient@@QBEHHAAH@Z @ 28 NONAME ; int RImagePrintClient::GetJobSetting(int, int &) const
+ ?CreateJob@RImagePrintClient@@QAEHHAAVTJobGuardData@@AAV?$RPointerArray@VTDesC16@@@@AAVTRequestStatus@@@Z @ 29 NONAME ; int RImagePrintClient::CreateJob(int, class TJobGuardData &, class RPointerArray<class TDesC16> &, class TRequestStatus &)
+ ?NewL@CIdleGuard@@SAPAV1@AAVRImagePrintClient@@@Z @ 30 NONAME ; class CIdleGuard * CIdleGuard::NewL(class RImagePrintClient &)
+ ?SupportedProtocols@RImagePrintClient@@QBEHXZ @ 31 NONAME ; int RImagePrintClient::SupportedProtocols(void) const
+ ?Close@RImagePrintClient@@QAEXXZ @ 32 NONAME ; void RImagePrintClient::Close(void)
+ ?CancelCreateJob@RImagePrintClient@@QBEHXZ @ 33 NONAME ; int RImagePrintClient::CancelCreateJob(void) const
+ ?SubmitPrintJob@RImagePrintClient@@QBEHXZ @ 34 NONAME ; int RImagePrintClient::SubmitPrintJob(void) const
+ ?GetNumPrintPages@RImagePrintClient@@QBEHXZ @ 35 NONAME ; int RImagePrintClient::GetNumPrintPages(void) const
+ ?SetJobSetting@RImagePrintClient@@QBEHHHAAH@Z @ 36 NONAME ; int RImagePrintClient::SetJobSetting(int, int, int &) const
+ ?GetPrinterCapability@RImagePrintClient@@QBEHHHAAVTPrintCapability@@@Z @ 37 NONAME ; int RImagePrintClient::GetPrinterCapability(int, int, class TPrintCapability &) const
+ ?NewL@CJobGuard@@SAPAV1@AAVRImagePrintClient@@@Z @ 38 NONAME ; class CJobGuard * CJobGuard::NewL(class RImagePrintClient &)
+ ?CancelPrintJob@RImagePrintClient@@QBEHXZ @ 39 NONAME ; int RImagePrintClient::CancelPrintJob(void) const
+ ?GetPrinterCapabilityIDs@RImagePrintClient@@QBEHHAAV?$RArray@H@@@Z @ 40 NONAME ; int RImagePrintClient::GetPrinterCapabilityIDs(int, class RArray<int> &) const
+ ?NewL@CDiscoveryGuard@@SAPAV1@AAVRImagePrintClient@@@Z @ 41 NONAME ; class CDiscoveryGuard * CDiscoveryGuard::NewL(class RImagePrintClient &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/eabi/imageprintclientu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,56 @@
+EXPORTS
+ _ZN10CIdleGuard4NewLER17RImagePrintClient @ 1 NONAME
+ _ZN10CIdleGuard5GuardEP13MIdleObserver @ 2 NONAME
+ _ZN10CIdleGuardD0Ev @ 3 NONAME
+ _ZN10CIdleGuardD1Ev @ 4 NONAME
+ _ZN10CIdleGuardD2Ev @ 5 NONAME
+ _ZN15CDiscoveryGuard4NewLER17RImagePrintClient @ 6 NONAME
+ _ZN15CDiscoveryGuard5GuardER25MPrinterDiscoveryObserverj @ 7 NONAME
+ _ZN15CDiscoveryGuardD0Ev @ 8 NONAME
+ _ZN15CDiscoveryGuardD1Ev @ 9 NONAME
+ _ZN15CDiscoveryGuardD2Ev @ 10 NONAME
+ _ZN17RImagePrintClient14StartDiscoveryER19TDiscoveryGuardDatajR14TRequestStatus @ 11 NONAME
+ _ZN17RImagePrintClient17ContinueCreateJobER13TJobGuardDataR14TRequestStatus @ 12 NONAME
+ _ZN17RImagePrintClient17ContinueDiscoveryER19TDiscoveryGuardDataR14TRequestStatus @ 13 NONAME
+ _ZN17RImagePrintClient20RegisterIdleObserverER14TIdleGuardDataR14TRequestStatus @ 14 NONAME
+ _ZN17RImagePrintClient5CloseEv @ 15 NONAME
+ _ZN17RImagePrintClient8ConnectLEv @ 16 NONAME
+ _ZN17RImagePrintClient9CreateJobEiR13TJobGuardDataR13RPointerArrayI7TDesC16ER14TRequestStatus @ 17 NONAME
+ _ZN17RImagePrintClientC1Ev @ 18 NONAME
+ _ZN17RImagePrintClientC2Ev @ 19 NONAME
+ _ZN9CJobGuard4NewLER17RImagePrintClient @ 20 NONAME
+ _ZN9CJobGuard5GuardEiR13RPointerArrayI7TDesC16ER19MPrintEventObserver @ 21 NONAME
+ _ZN9CJobGuardD0Ev @ 22 NONAME
+ _ZN9CJobGuardD1Ev @ 23 NONAME
+ _ZN9CJobGuardD2Ev @ 24 NONAME
+ _ZNK17RImagePrintClient12GetJobStatusEv @ 25 NONAME
+ _ZNK17RImagePrintClient13GetJobSettingEiRi @ 26 NONAME
+ _ZNK17RImagePrintClient13ReleaseEngineEv @ 27 NONAME
+ _ZNK17RImagePrintClient13ReserveEngineEv @ 28 NONAME
+ _ZNK17RImagePrintClient13SetForegroundEi @ 29 NONAME
+ _ZNK17RImagePrintClient13SetJobSettingEiiRi @ 30 NONAME
+ _ZNK17RImagePrintClient14CancelPrintJobEv @ 31 NONAME
+ _ZNK17RImagePrintClient14SubmitPrintJobEv @ 32 NONAME
+ _ZNK17RImagePrintClient15CancelCreateJobEv @ 33 NONAME
+ _ZNK17RImagePrintClient15CancelDiscoveryEv @ 34 NONAME
+ _ZNK17RImagePrintClient16ContinuePrintJobEv @ 35 NONAME
+ _ZNK17RImagePrintClient16CountConnectionsERi @ 36 NONAME
+ _ZNK17RImagePrintClient16GetNumPrintPagesEv @ 37 NONAME
+ _ZNK17RImagePrintClient16GetPrinterStatusEi @ 38 NONAME
+ _ZNK17RImagePrintClient16IsPictBridgeModeEv @ 39 NONAME
+ _ZNK17RImagePrintClient17SetNumberOfCopiesERK6RArrayIiE @ 40 NONAME
+ _ZNK17RImagePrintClient18GetJobTemplateIconEiRi @ 41 NONAME
+ _ZNK17RImagePrintClient18GetNumPreviewPagesEv @ 42 NONAME
+ _ZNK17RImagePrintClient18SupportedProtocolsEv @ 43 NONAME
+ _ZNK17RImagePrintClient19RemoveCachedPrinterEi @ 44 NONAME
+ _ZNK17RImagePrintClient20CancelStartDiscoveryEv @ 45 NONAME
+ _ZNK17RImagePrintClient20GetPrinterCapabilityEiiR16TPrintCapability @ 46 NONAME
+ _ZNK17RImagePrintClient23GetPrinterCapabilityIDsEiR6RArrayIiE @ 47 NONAME
+ _ZNK17RImagePrintClient26CancelRegisterIdleObserverEv @ 48 NONAME
+ _ZTI10CIdleGuard @ 49 NONAME ; #<TI>#
+ _ZTI15CDiscoveryGuard @ 50 NONAME ; #<TI>#
+ _ZTI9CJobGuard @ 51 NONAME ; #<TI>#
+ _ZTV10CIdleGuard @ 52 NONAME ; #<VT>#
+ _ZTV15CDiscoveryGuard @ 53 NONAME ; #<VT>#
+ _ZTV9CJobGuard @ 54 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_EXPORTS
+
+../rom/imageprintserver.iby CORE_APP_LAYER_IBY_EXPORT_PATH( imageprintserver.iby )
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_MMPFILES
+imageprintserver.mmp
+imageprintclient.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/group/imageprintclient.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../../inc/logdef.h"
+
+deffile imageprintclient.def
+
+TARGET imageprintclient.dll
+TARGETTYPE dll
+CAPABILITY CAP_CLIENT_DLL
+UID 0x1000008D 0x101FFAA5
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE . ../inc
+USERINCLUDE ../src/client
+USERINCLUDE ../src/server
+USERINCLUDE ../../ImagePrintLibrary/inc
+USERINCLUDE ../../inc
+USERINCLUDE ../../../clog/inc
+
+SOURCEPATH ../src/client
+
+SOURCE rimageprintclient.cpp
+SOURCE cidleguard.cpp
+SOURCE cdiscoveryguard.cpp
+SOURCE cjobguard.cpp
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/group/imageprintserver.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,67 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../../inc/logdef.h"
+#include "../inc/imageprintserveruid.h"
+
+TARGET imageprintserver.exe
+TARGETTYPE exe
+CAPABILITY CAP_SERVER
+
+UID 0x1000008D KIMAGEPRINTSERVERUID3
+EPOCSTACKSIZE 0x4000
+EPOCHEAPSIZE 0x1000 0x1000000
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE . ../inc ../src/server ../src/client
+USERINCLUDE ../../ImagePrintLibrary/inc
+USERINCLUDE ../../inc
+USERINCLUDE ../../../clog/inc
+
+SOURCEPATH ../src/server
+
+SOURCE main.cpp
+SOURCE cimageprintserver.cpp
+SOURCE cimageprintsession.cpp
+SOURCE cprotocolsloader.cpp
+SOURCE cimageprintbody.cpp
+SOURCE crsimageparser.cpp
+SOURCE cserveridleguard.cpp
+SOURCE cserverdiscoveryguard.cpp
+SOURCE cserverjobguard.cpp
+SOURCE cimageprintscheduler.cpp
+SOURCE cnumofcopies.cpp
+SOURCE tmessagewrp2.cpp
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY efsrv.lib
+LIBRARY fbscli.lib
+LIBRARY ecom.lib
+LIBRARY centralrepository.lib
+LIBRARY usbman.lib
+LIBRARY usbwatcher.lib
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cdiscoveryguard.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,77 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CDISCOVERYGUARD_H
+#define CDISCOVERYGUARD_H
+
+#include <e32base.h>
+
+class RImagePrintClient;
+class MPrinterDiscoveryObserver;
+class TDiscoveryGuardData;
+
+class CDiscoveryGuard : public CActive
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @param aClient client for communication with server process
+ * @return new object
+ */
+ IMPORT_C static CDiscoveryGuard* NewL( RImagePrintClient& aClient );
+
+ /**
+ * Destructor
+ */
+ IMPORT_C ~CDiscoveryGuard();
+
+ public:
+
+ /**
+ * Start printer discovery (and watching for discovery events)
+ * for one or several protocols
+ *
+ * @param aObserver observer for notifications about discovery events
+ * @param aProtocols OR:ed protocol ids
+ * @return error code
+ */
+ IMPORT_C TInt Guard( MPrinterDiscoveryObserver& aObserver, TUint aProtocols );
+
+ private:
+
+ CDiscoveryGuard( RImagePrintClient& aClient );
+ void ConstructL();
+
+ private: // from CActive
+
+ void RunL();
+ void DoCancel();
+
+ private: // data
+
+ RImagePrintClient& iClient;
+ MPrinterDiscoveryObserver* iObserver;
+ TDiscoveryGuardData* iData;
+ };
+
+
+#endif // CDISCOVERYGUARD_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cidleguard.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,74 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIDLEGUARD_H
+#define CIDLEGUARD_H
+
+#include <e32base.h>
+
+class RImagePrintClient;
+class MIdleObserver;
+class TIdleGuardData;
+
+class CIdleGuard : public CActive
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @param aClient client for communication with server process
+ * @return new object
+ */
+ IMPORT_C static CIdleGuard* NewL( RImagePrintClient& aClient );
+
+ /**
+ * Destructor
+ */
+ IMPORT_C ~CIdleGuard();
+
+ public:
+
+ /**
+ * Start watching for idle events
+ *
+ * @param aObserver observer for notifications about idle events
+ */
+ IMPORT_C void Guard( MIdleObserver* aObserver );
+
+ private:
+
+ CIdleGuard( RImagePrintClient& aClient );
+ void ConstructL();
+
+ private: // from CActive
+
+ void RunL();
+ void DoCancel();
+
+ private: // data
+
+ RImagePrintClient& iClient;
+ MIdleObserver* iObserver;
+ TIdleGuardData* iData;
+ };
+
+
+#endif // CIDLEGUARD_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintbody.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,272 @@
+/*
+* 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 CImagePrintBody class definition.
+*
+*/
+
+
+#ifndef CIMAGEPRINTBODY_H
+#define CIMAGEPRINTBODY_H
+
+#include <e32base.h>
+
+#include "imageprint.h"
+#include "cprotocolsloader.h"
+#include "cimageprintscheduler.h"
+#include "mprotprintingdevice.h"
+
+/**
+ *
+ * This class is in charge of discoverying devices across the protocols available, of creating
+ * a print job in the right printer and right protocol, etc. It can be considered a controller.
+ * Implements the MProtPrintingDevice observers (MProtDiscoveryObserver, MProtPrintEventObserver) so it can act
+ * accordingly when the protocols report or need something.
+ */
+class CImagePrintBody : public CBase, public MProtDiscoveryObserver, public MProtPrintEventObserver, public MProtIdleObserver
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @return new object
+ */
+ static CImagePrintBody* NewL();
+
+ /**
+ * Destructor
+ */
+ ~CImagePrintBody();
+
+ /**
+ * Start discovery for one or several protocols
+ *
+ * @param aObserver observer for notifications about discovery events
+ * @param aProtocols OR:ed protocol ids
+ * @return error code
+ */
+ TInt StartDiscovery(MPrinterDiscoveryObserver& aObserver, TUint aProtocols = 0);
+
+ /**
+ * Cancel discovery
+ */
+ void CancelDiscovery();
+
+ /**
+ * Creates print job
+ *
+ * @param aPrinterID printer id
+ * @param aImages array of image file names to be printed
+ * @param aObserver observer for notifications about print job events
+ * @return error code
+ */
+ TInt CreatePrintJobL(TInt aPrinterID, RPointerArray<TDesC>& aImages, MPrintEventObserver& aObserver);
+
+ /**
+ * Start actual printing of previously created print job
+ */
+ void SubmitPrintJobL();
+
+ /**
+ * Cancel print job
+ *
+ * @return error code
+ */
+ TInt CancelPrintJob();
+
+ /**
+ * Continue print job
+ *
+ * @return error code
+ */
+ TInt ContinuePrintJobL();
+
+ /**
+ * Print pages amount getter
+ *
+ * @return amount of print pages with current settings for current print job
+ */
+ TInt GetNumPrintPages();
+
+ /**
+ * Job status getter
+ *
+ * @return job status code
+ */
+ TInt GetJobStatus();
+
+ /**
+ * Printer status getter
+ *
+ * @param aPrinterID printer id
+ * @return printer status code
+ */
+ TInt GetPrinterStatus(TInt aPrinterID);
+
+ /**
+ * Printer capability id getter
+ *
+ * @param aPrinterID printer id
+ * @param aCapabilityIDs place holder for capability ids supported by printer
+ * @return error code
+ */
+ TInt GetPrinterCapabilityIDsL(TInt aPrinterID, RArray<TInt>& aCapabilityIDs);
+
+ /**
+ * Printer capability getter
+ *
+ * @param aPrinterID printer id
+ * @param aCapabilityID capability id
+ * @param aCapability place holder for capability
+ * @return error code
+ */
+ TInt GetPrinterCapabilityL(TInt aPrinterID, TInt aCapabilityID, TPrintCapability& aCapability);
+
+ /**
+ * Printer setting getter
+ *
+ * @param aCapabilityID capability id
+ * @param aValue place holder for capability value
+ * @return error code
+ */
+ TInt GetJobSetting(TInt aCapabilityID, TInt& aValue);
+
+ /**
+ * Printer setting setter
+ *
+ * @param aCapabilityID capability id
+ * @param aValue capability value
+ * @param aAffectedCapability affected capability id
+ * @return error code
+ */
+ TInt SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability);
+
+ /**
+ * Preview pages amount getter for current protocol
+ *
+ * @return preview pages amount
+ */
+ TInt GetNumPreviewPages();
+
+ /**
+ * Template icon getter
+ *
+ * @param aTemplateID template id
+ * @param aFbsBitmapHandle place holder for template bitmap handle
+ * @return error code
+ */
+ TInt GetJobTemplateIconL(TInt aTemplateID, TInt& aFbsBitmapHandle);
+
+ /**
+ *Creates a preview image
+ *
+ * @param aPageNumber Page number to create preview image of
+ * @return error code
+ */
+ TInt CreatePreviewImage(TInt aPageNumber);
+
+ /**
+ * Remove cached printer
+ *
+ * @param aPrinterID printer id
+ * @return error code
+ */
+ TInt RemoveCachedPrinterL(TInt aPrinterID);
+
+ /**
+ * Supported protocols getter
+ *
+ * @return OR:ed protocol ids
+ */
+ TUint SupportedProtocols();
+
+ /**
+ * Register observer for idle events receiving
+ *
+ * @param aObserver observer
+ */
+ void RegisterIdleObserver(MIdleObserver* aObserver);
+
+ /**
+ * Number of copies setter for current print job
+ *
+ * @param aNumsOfCopies number of copies array
+ * @param aErr place holder for error code
+ */
+ void SetNumsOfCopiesL(const RArray<TInt>& aNumsOfCopies, TInt& aErr);
+
+ /**
+ * Handle session disconnection
+ *
+ * @param aIdleObserver idle observer object of that session
+ * @param aDiscoveryObserver discovery observer object of that session
+ * @param aEventObserver print job observer object of that session
+ */
+ void HandleSessionDisconnect( const MIdleObserver* aIdleObserver,
+ const MPrinterDiscoveryObserver* aDiscoveryObserver,
+ const MPrintEventObserver* aEventObserver );
+
+ private: // from MProtDiscoveryObserver
+ void FoundDeviceL(TPrinter& aDeviceInfo);
+ void DiscoveryStatusL(TInt aStatus, TInt aErrorCode, TInt aErrorStringCode);
+ void RemoveDeviceL(TPrinter& aDeviceInfo);
+
+ private: // from MProtPrintEventObserver
+ void PrintJobProgressEvent(TInt aStatus, TInt aPercent, TInt aJobStateCode);
+ void PrintJobErrorEvent(TInt aErrorCode, TInt aErrorStringCode);
+ void PrinterStatusEvent(TInt aErrorCode, TInt aErrorStringCode);
+ void PreviewImageEvent(TInt aFsBitmapHandle);
+ void ShowMessageL(TInt aMsgLine1Code, TInt aMsgLine2Code);
+ TBool AskYesNoQuestionL(TInt aMsgLine1Code, TInt aMsgLine2Code);
+ const TDesC& AskForInputL(TInt aMsgLine1Code, TInt aMsgLine2Code);
+
+ private: // from MProtIdleObserver
+ void StatusEvent(const TEvent &aEvent, TInt aError, TInt aMsgCode);
+
+ private:
+ CImagePrintBody();
+ void ConstructL();
+ TInt FindInternalDeviceReference(TInt aExternalDeviceID, TInt& aInternalDeviceID, MProtPrintingDevice*& aProtToUse);
+ TInt ValidateImagesL(const RPointerArray<HBufC>& aImageList, TInt &aInvalidCount);
+ CImagePrintScheduler& ActiveScheduler() const;
+ void TryNextDiscovery();
+ static TInt TryNextDiscoveryL(TAny* aObj);
+ void DoTryNextDiscoveryL();
+
+ private:
+ /// Class loader and manager.
+ CProtocolsLoader* iClassLoader;
+ /// Pointer to store the current protocol in use for discovery.
+ MProtPrintingDevice* iCurrentProtocol;
+ /// Pointer to store the current protocol in use for creating a print job.
+ MProtPrintingDevice* iCurrentPrintJobProtocol;
+ /// ImagePrint Observer.
+ MPrinterDiscoveryObserver* iPrinterDiscoveryObserver;
+ /// ImagePrint Observer.
+ MPrintEventObserver* iPrinterPrintEventObserver;
+ /// ImagePrint Idle Observer.
+ MIdleObserver* iPrinterIdleObserver;
+ /// Used to store the requested protocols.
+ TUint iProtocolsRequested;
+ /// Array of the image filenames to print.
+ RPointerArray<HBufC> iImageFileNames;
+ /// Enables async discovery
+ CIdle* iIdleDiscovery;
+
+ TBool iDiscoveryCancelled;
+ };
+
+#endif // CIMAGEPRINTBODY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintscheduler.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTSCHEDULER_H
+#define CIMAGEPRINTSCHEDULER_H
+
+#include <e32base.h>
+
+class MProtIdleObserver;
+
+class CImagePrintScheduler : public CActiveScheduler
+ {
+ public: // from CActiveScheduler
+ void Error(TInt aError) const;
+ public:
+
+ /**
+ * Idle observer setter. Asynchronous errors (leaves) will be
+ * propagated to this observer
+ *
+ * @param aIdleObserver idle observer
+ */
+ void SetIdleObserver( MProtIdleObserver& aIdleObserver );
+
+ /**
+ * Current protocol id setter
+ *
+ * @param aProtocol current protocol id
+ */
+ void SetCurrentProtocol( TInt aProtocol );
+
+ private:
+ MProtIdleObserver* iIdleObserver;
+ TInt iCurrentProtocol;
+ };
+
+
+#endif // CIMAGEPRINTSCHEDULER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,135 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTSERVER_H
+#define CIMAGEPRINTSERVER_H
+
+#include <e32base.h>
+#include <fbs.h>
+
+class CImagePrintBody;
+
+// ----------------------------------------------------------------------------------------
+// Server's policy here
+// ----------------------------------------------------------------------------------------
+
+// Total number of ranges
+const TUint KImagePrintRangeCount = 2;
+
+// Definition of the ranges of IPC numbers
+const TInt KImagePrintRanges[KImagePrintRangeCount] =
+ {
+ 0, // implemented 0-38
+ 39 // non implemented function end of range check ; ENotSupported
+ };
+
+// Policy to implement for each of the above ranges
+const TUint8 KImagePrintElementsIndex[KImagePrintRangeCount] =
+ {
+ CPolicyServer::EAlwaysPass, // applies to 0th range
+ CPolicyServer::ENotSupported // applies to 1st range (out of range IPC)
+ };
+
+// Package all the above together into a policy
+const CPolicyServer::TPolicy KImagePrintPolicy =
+ {
+ CPolicyServer::EAlwaysPass, // specifies all connect attempts should pass
+ KImagePrintRangeCount, // number of ranges
+ KImagePrintRanges, // ranges array
+ KImagePrintElementsIndex, // elements<->ranges index
+ NULL, // array of elements
+ };
+class CImagePrintServer : public CPolicyServer
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @return new object. The object is left on the cleanup stack
+ */
+ static CImagePrintServer* NewLC();
+
+ /**
+ * Destructor
+ */
+ ~CImagePrintServer();
+
+ /**
+ * Increase session counter
+ */
+ void AddSession();
+
+ /**
+ * Decrease session counter. If the counter is decreased to 0, the
+ * server is shut down
+ */
+ void RemoveSession();
+
+ /**
+ * Session count getter
+ *
+ * @return session count
+ */
+ TInt SessionCount() const;
+
+ /**
+ * Reserve printing engine to the session
+ *
+ * @param aSession session that claims the printing engine
+ * @return error code
+ */
+ TInt ReserveEngine( const CSession2* aSession );
+
+ /**
+ * Release printing engine by the session
+ *
+ * @param aSession session that wants to release the printing engine
+ * @return error code
+ */
+ TInt ReleaseEngine( const CSession2* aSession );
+
+ /**
+ * Printing engine getter
+ *
+ * @return printing engine
+ */
+ CImagePrintBody& Engine() const;
+
+ private:
+
+ TInt RunError( TInt aError );
+ CImagePrintServer();
+ void ConstructL();
+ CSession2* NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const;
+
+ private:
+
+ TInt iConnsCount;
+
+ const CSession2* iEngineHolder;
+
+ CImagePrintBody* iEngine;
+
+ RFbsSession iFbs;
+ };
+
+
+#endif // CIMAGEPRINTSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintsession.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,104 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTSESSION_H
+#define CIMAGEPRINTSESSION_H
+
+#include <e32base.h>
+
+#include "tprintcapability.h"
+#include "tmessagewrp2.h"
+
+class CImagePrintServer;
+class CServerIdleGuard;
+class CServerDiscoveryGuard;
+class CServerJobGuard;
+class CNumOfCopies;
+
+
+class CImagePrintSession : public CSession2
+ {
+ public: // from CSession2
+ void CreateL();
+
+ private:
+ ~CImagePrintSession();
+ CImagePrintServer& Server();
+ void ServiceL( const RMessage2& aMessage );
+ void Disconnect(const RMessage2 &aMessage);
+
+ private:
+ void ServiceFirstPartL( TInt aIndex );
+ void ServiceSecondPartL( TInt aIndex );
+ void ServiceThirdPartL ( TInt aIndex );
+ void CountConnectionsL( TMessageWrp2& aMessage );
+ void SetForegroundL( TMessageWrp2& aMessage );
+ void ReserveEngine( TMessageWrp2& aMessage );
+ void ReleaseEngine( TMessageWrp2& aMessage );
+ void SupportedProtocols( TMessageWrp2& aMessage );
+ void GetNumPrintPages( TMessageWrp2& aMessage );
+ void GetJobStatus( TMessageWrp2& aMessage );
+ void GetPrinterStatus( TMessageWrp2& aMessage );
+ void CancelDiscovery( TMessageWrp2& aMessage );
+ void SubmitPrintJobL( TMessageWrp2& aMessage );
+ void CancelPrintJob( TMessageWrp2& aMessage );
+ void ContinuePrintJobL( TMessageWrp2& aMessage );
+ void RemoveCachedPrinterL( TMessageWrp2& aMessage );
+ void GetJobTemplateIconL( TMessageWrp2& aMessage );
+ void GetNumPreviewPages( TMessageWrp2& aMessage );
+ void SetJobSettingL( TMessageWrp2& aMessage );
+ void GetJobSettingL( TMessageWrp2& aMessage );
+ void GetPrinterCapabilityL( TMessageWrp2& aMessage );
+ void GetPrinterCapIdL( TMessageWrp2& aMessage );
+ void GetPrinterCapTypeL( TMessageWrp2& aMessage );
+ void GetPrinterCapDefL( TMessageWrp2& aMessage );
+ void GetPrinterCapLowL( TMessageWrp2& aMessage );
+ void GetPrinterCapHighL( TMessageWrp2& aMessage );
+ void GetPrinterCapEnumCountL( TMessageWrp2& aMessage );
+ void GetPrinterCapEnumL( TMessageWrp2& aMessage );
+ void GetPrinterCapabilityIDsCountL( TMessageWrp2& aMessage );
+ void GetPrinterCapabilityIDL( TMessageWrp2& aMessage );
+ void RegisterIdleObserverL( TMessageWrp2& aMessage );
+ void CancelRegisterIdleObserverL( TMessageWrp2& aMessage );
+ void StartDiscoveryL( TMessageWrp2& aMessage );
+ void ContinueDiscoveryL( TMessageWrp2& aMessage );
+ void PrepareJobL( TMessageWrp2& aMessage );
+ void CreateJobL( TMessageWrp2& aMessage );
+ void ContinueCreateJobL( TMessageWrp2& aMessage );
+ void CancelStartDiscoveryL( TMessageWrp2& aMessage );
+ void CancelCreateJobL( TMessageWrp2& aMessage );
+ void IsPictBridgeModeL( TMessageWrp2& aMessage );
+ void SetNumberOfCopiesCountL( TMessageWrp2& aMessage );
+ void SetNumberOfCopiesL( TMessageWrp2& aMessage );
+
+ private: // data
+
+ RPointerArray<TMessageWrp2> iMsgWrappers;
+ RArray<TInt> iCapabilityIDs;
+ CServerIdleGuard* iIdleGuard;
+ CServerDiscoveryGuard* iDiscoveryGuard;
+ CServerJobGuard* iJobGuard;
+ TPrintCapability iCapability;
+ CNumOfCopies* iNumOfCopies;
+ TBool iConnected;
+ };
+
+
+#endif // CIMAGEPRINTSESSION_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cjobguard.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,77 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CJOBGUARD_H
+#define CJOBGUARD_H
+
+#include <e32base.h>
+
+class RImagePrintClient;
+class MPrintEventObserver;
+class TJobGuardData;
+
+class CJobGuard : public CActive
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @param aClient client for communication with server process
+ * @return new object
+ */
+ IMPORT_C static CJobGuard* NewL( RImagePrintClient& aClient );
+
+ /**
+ * Destructor
+ */
+ IMPORT_C ~CJobGuard();
+
+ public:
+
+ /**
+ * Create print job and start watching for print job events
+ *
+ * @param aPrinterID printer id
+ * @param aImages array of image file names to be printed
+ * @param aObserver observer for notifications about print job events
+ * @return error code
+ */
+ IMPORT_C TInt Guard( TInt aPrinterID, RPointerArray<TDesC>& aImages, MPrintEventObserver& aObserver );
+
+ private:
+
+ CJobGuard( RImagePrintClient& aClient );
+ void ConstructL();
+
+ private: // from CActive
+
+ void RunL();
+ void DoCancel();
+
+ private: // data
+
+ RImagePrintClient& iClient;
+ MPrintEventObserver* iObserver;
+ TJobGuardData* iData;
+ };
+
+
+#endif // CJOBGUARD_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cnumofcopies.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,77 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CNUMOFCOPIES_H
+#define CNUMOFCOPIES_H
+
+#include <e32base.h>
+
+class CNumOfCopies : public CBase
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @return new object
+ */
+ static CNumOfCopies* NewL();
+
+ /**
+ * Destructor
+ */
+ ~CNumOfCopies();
+
+ private:
+ CNumOfCopies();
+ void ConstructL();
+
+ public:
+
+ /**
+ * Set the amount of coming array elements
+ *
+ * @param aCount amount of coming array elements
+ */
+ void Reset( TInt aCount );
+
+ /**
+ * Append next element to the array
+ *
+ * @param aNumOfCopies number of copies array element
+ * @param aFull place holder for value which indicates that
+ * all elements are added to the array
+ */
+ void AddNumOfCopyL( TInt aNumOfCopies, TBool& aFull );
+
+ /**
+ * Number of copies array getter
+ *
+ * @return number of copies array
+ */
+ const RArray<TInt>& NumsOfCopies() const;
+
+ private: // data
+ TInt iCount;
+ RArray<TInt> iNumsOfCopies;
+ };
+
+
+#endif // CNUMOFCOPIES_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cprotocolsloader.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,96 @@
+/*
+* 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.
+*
+*/
+
+
+#ifndef CPROTOCOLSLOADER_H
+#define CPROTOCOLSLOADER_H
+
+#include <e32base.h>
+
+class MProtPrintingDevice;
+
+class CProtocolsLoader : public CBase
+ {
+ public:
+
+ static CProtocolsLoader* NewL();
+ ~CProtocolsLoader();
+
+ /**
+ * Gets the number of protocol implementations that could be loaded.
+ * @return Number of protocols available.
+ */
+ TInt GetNumberOfProtocolsAvailable() const;
+
+ /**
+ * Gets the next protocol in the internal list of protocols.
+ *
+ * Returns a pointer to the next protocol in the list. If the end of the list is reached, it starts the list over.
+ * The order in which protocols will be returned is: DPOF, BPP, PictBridge, any other protocols (sorted alpha-
+ * betically). This pointer should not be deleted.
+ * @return Pointer to the next protocol instance.
+ */
+ MProtPrintingDevice* GetNextProtocol();
+
+ /**
+ * Gets the protocol located in the position specified.
+ * @param aIndex Index of the desired protocol. If there are 3 protocols, the valid indexes are: 0, 1, 2.
+ * @return Pointer to the next protocol instance. This pointer should not be deleted.
+ */
+ MProtPrintingDevice* GetProtocolAt(TInt aIndex);
+
+ /**
+ * Resets the inner pointers to the beginning of the protocols' list.
+ */
+ void Reset();
+
+ /**
+ * Returns the index of the current protocol
+ */
+ TInt GetProtocolIndex() const;
+
+ /**
+ * @brief Returns the Protocols supported by the DLL. It can be any of the KImagePrint_PrinterProtocol* constants.
+ * @return An OR'ed value with the supported protocols information.
+ */
+ TUint SupportedProtocols() const;
+
+ private:
+
+ CProtocolsLoader();
+ void ConstructL();
+ void LoadL();
+ static void CleanupProt( TAny* aData );
+
+ private: // data
+
+ /// Used to store the number of protocols loaded and available for use.
+ TInt iAvailableProtocols;
+
+ /// Index of the next protocol available.
+ TInt iProtIndex;
+
+ /// Pointer array used to store the reference to the protocols.
+ RPointerArray<MProtPrintingDevice> iProtocols;
+
+ /// OR'ed value with the supported protocols information.
+ TUint iSupportedProtocols;
+ };
+
+#endif // CPROTOCOLSLOADER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/crsimageparser.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,84 @@
+/*
+* 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 CRsImageParser class definition.
+*
+*/
+
+
+#ifndef CRSIMAGEPARSER_H
+#define CRSIMAGEPARSER_H
+
+#include <e32base.h>
+#include <f32file.h>
+
+class CRsImageParser : public CBase
+ {
+ public:
+ enum TImageEncoding
+ {
+ EUnknown = 0,
+ ENonDiffHuffmanBaseline = 0xc0,
+ ENonDiffHuffmanExtendedSeq,
+ ENonDiffHuffmanProgressive,
+ ENonDiffHuffmanLossless,
+ EUnused1,
+ EDiffHuffmanSequential,
+ EDiffHuffmanProgressive,
+ EDiffHuffmanLossless,
+ EReserved,
+ ENonDiffArithExtendedSeq,
+ ENonDiffArithProgressive,
+ ENonDiffArithLossless,
+ EUnused2,
+ EDiffArithSequential,
+ EDiffArithProgressive,
+ EDiffArithLossless
+ };
+
+ /**
+ * 2-phase constructor
+ *
+ * @return new object. The object is left on the cleanup stack
+ */
+ static CRsImageParser* NewLC();
+
+ /**
+ * Destructor
+ */
+ ~CRsImageParser();
+
+ /**
+ * JPEG image validator
+ *
+ * @param aFileName image file name
+ * @param aValid place holder for validity indicator
+ * @param aErr place holder for error code
+ */
+ void ValidateL( const TDesC& aFileName, TBool& aValid, TInt& aErr );
+
+ private:
+
+ CRsImageParser();
+ void ConstructL();
+ TBool Validate( TInt aStartOfDataOffset, TInt aWidth, TInt aHeight, TInt aSize, TInt aEncoding, TInt aErr );
+ TInt ReadData( RFile& aFile, TInt aStartByte, TDes8& aData );
+
+ private:
+
+ RFs iFs;
+ };
+
+#endif // CRSIMAGEPARSER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cserverdiscoveryguard.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,91 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CSERVERDISCOVERYGUARD_H
+#define CSERVERDISCOVERYGUARD_H
+
+#include <e32base.h>
+
+#include "imageprint.h"
+#include "tdiscoveryguarddata.h"
+
+class CImagePrintBody;
+class TMessageWrp2;
+
+class CServerDiscoveryGuard : public CBase, public MPrinterDiscoveryObserver
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @param aEngine printing engine
+ * @return new object
+ */
+ static CServerDiscoveryGuard* NewL( CImagePrintBody& aEngine );
+
+ /**
+ * Destructor
+ */
+ ~CServerDiscoveryGuard();
+
+ private: // from MPrinterDiscoveryObserver
+
+ void FoundPrinterL(const TPrinter& aPrinterInfo);
+ void DiscoveryStatusL(TInt aStatus, TInt aErrorCode, TInt aErrorStringCode);
+ void RemovePrinterL(const TPrinter& aPrinterInfo);
+
+ public:
+
+ /**
+ * Start discovery and set this object as discovery events observer
+ *
+ * @param aMessage message contains OR:ed protocol ids
+ */
+ TInt StartL( TMessageWrp2& aMessage );
+
+ /**
+ * Continue waiting for discovery events
+ *
+ * @param aMessage message completed upon event arrival
+ */
+ void ContinueL( TMessageWrp2& aMessage );
+
+ /**
+ * Stop waiting for discovery events. Cancel waiting message
+ */
+ void Stop();
+
+ private:
+
+ CServerDiscoveryGuard( CImagePrintBody& aEngine );
+ void ConstructL();
+ void ProcessL();
+
+ private: // data
+
+ CImagePrintBody& iEngine;
+ TMessageWrp2* iMessage;
+ RArray<TDiscoveryGuardData> iBuffer;
+ TBool iRequestActive;
+ };
+
+
+#endif // CSERVERDISCOVERYGUARD_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cserveridleguard.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,85 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CSERVERIDLEGUARD_H
+#define CSERVERIDLEGUARD_H
+
+#include <e32base.h>
+
+#include "imageprint.h"
+#include "tidleguarddata.h"
+
+class TEvent;
+class CImagePrintBody;
+class TMessageWrp2;
+
+class CServerIdleGuard : public CBase, public MIdleObserver
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @param aEngine printing engine
+ * @return new object
+ */
+ static CServerIdleGuard* NewL( CImagePrintBody& aEngine );
+
+ /**
+ * Destructor
+ */
+ ~CServerIdleGuard();
+
+ private: // from MIdleObserver
+
+ void StatusEvent(const TEvent &aEvent, TInt aError, TInt aMsgCode);
+
+ public:
+
+ /**
+ * Start and continue waiting for idle events
+ *
+ * @param aMessage message completed upon event arrival
+ */
+ void Guard( TMessageWrp2& aMessage );
+
+ /**
+ * Stop waiting for idle events. Cancel waiting message
+ */
+ void Stop();
+
+ private:
+
+ CServerIdleGuard( CImagePrintBody& aEngine );
+ void ConstructL();
+ void DoStatusEventL( const TEvent &aEvent, TInt aError, TInt aMsgCode );
+ void Process( TInt aErr = KErrNone );
+ void DoProcessL();
+
+ private: // data
+
+ CImagePrintBody& iEngine;
+ TMessageWrp2* iMessage;
+ RArray<TIdleGuardData> iBuffer;
+ TBool iRequestActive;
+ };
+
+
+#endif // CSERVERIDLEGUARD_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cserverjobguard.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,105 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CSERVERJOBGUARD_H
+#define CSERVERJOBGUARD_H
+
+#include <e32base.h>
+
+#include "imageprint.h"
+#include "tjobguarddata.h"
+
+class CImagePrintBody;
+class TMessageWrp2;
+
+class CServerJobGuard : public CBase, public MPrintEventObserver
+ {
+ public:
+
+ /**
+ * 2-phase constructor
+ *
+ * @param aEngine printing engine
+ * @return new object
+ */
+ static CServerJobGuard* NewL( CImagePrintBody& aEngine );
+
+ /**
+ * Destructor
+ */
+ ~CServerJobGuard();
+
+ private: // from MPrintEventObserver
+
+ void PrintJobProgressEvent(TInt aStatus, TInt aPercentCompletion, TInt aJobStateCode);
+ void PrintJobErrorEvent(TInt aError, TInt aErrorStringCode);
+ void PrinterStatusEvent(TInt aError, TInt aErrorStringCode);
+ void PreviewImageEvent(TInt aFsBitmapHandle);
+ void ShowMessageL(TInt aMsgLine1Code, TInt aMsgLine2Code);
+ TBool AskYesNoQuestionL(TInt aMsgLine1Code, TInt aMsgLine2Code);
+ const TDesC& AskForInputL(TInt aMsgLine1Code, TInt aMsgLine2Code);
+
+ public:
+
+ /**
+ * Prepare print job by copying image file name into internal buffer
+ *
+ * @param aMessage message contains file name of one image.
+ */
+ void PrepareL( TMessageWrp2& aMessage );
+
+ /**
+ * Create print job and set this object as print job events observer
+ *
+ * @param aMessage message contains printer id
+ */
+ TInt CreateL( TMessageWrp2& aMessage );
+
+ /**
+ * Continue waiting for print job events
+ *
+ * @param aMessage message completed upon event arrival
+ */
+ void ContinueCreateL( TMessageWrp2& aMessage );
+
+ /**
+ * Stop waiting for print job events. Cancel waiting message
+ */
+ void Stop();
+
+ private:
+
+ CServerJobGuard( CImagePrintBody& aEngine );
+ void ConstructL();
+ void Process( TInt aErr = KErrNone );
+ void DoProcessL();
+ void DoPreProcessL( const TJobGuardData& aData );
+
+ private: // data
+
+ CImagePrintBody& iEngine;
+ TMessageWrp2* iMessage;
+ RArray<TJobGuardData> iBuffer;
+ RPointerArray<TDesC> iImages;
+ TBool iRequestActive;
+ };
+
+
+#endif // CSERVERJOBGUARD_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/imageprintclientserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,79 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTCLIENTSERVER_H
+#define IMAGEPRINTCLIENTSERVER_H
+
+#include <e32std.h>
+
+#include "imageprintserveruid.h"
+
+_LIT( KImagePrintServerName, "imageprintserver" );
+_LIT( KImagePrintServerImg, "imageprintserver" ); // EXE name
+
+const TInt KMaxImagePrintMessage = 512;
+const TInt KImagePrintServerMajor = 0;
+const TInt KImagePrintServerMinor = 0;
+const TInt KImagePrintServerBuild = 0;
+
+enum TImagePrintMessages
+ {
+ ECountConnections = 0,
+ ESetForeground,
+ EReserveEngine,
+ EReleaseEngine,
+ ESupportedProtocols,
+ EGetNumPrintPages,
+ EGetJobStatus,
+ EGetPrinterStatus,
+ ECancelDiscovery,
+ ESubmitPrintJob,
+ ECancelPrintJob, // 10
+ EContinuePrintJob,
+ ERemoveCachedPrinter,
+ EGetJobTemplateIcon,
+ EGetNumPreviewPages,
+ ESetJobSetting,
+ EGetJobSetting,
+ EGetPrinterCapability,
+ EGetPrinterCapId,
+ EGetPrinterCapType,
+ EGetPrinterCapDef, // 20
+ EGetPrinterCapLow,
+ EGetPrinterCapHigh,
+ EGetPrinterCapEnumCount,
+ EGetPrinterCapEnum,
+ EGetPrinterCapabilityIDsCount,
+ EGetPrinterCapabilityID,
+ ERegisterIdleObserver,
+ ECancelRegisterIdleObserver,
+ EStartDiscovery,
+ EContinueDiscovery, // 30
+ EPrepareJob,
+ ECreateJob,
+ EContinueCreateJob,
+ ECancelStartDiscovery,
+ ECancelCreateJob,
+ EIsPictBridgeMode,
+ ESetNumberOfCopiesCount,
+ ESetNumberOfCopies // 38
+ };
+
+#endif// IMAGEPRINTCLIENTSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/imageprintserveruid.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTSERVERUID_H
+#define IMAGEPRINTSERVERUID_H
+
+// Image Print Server UID3
+
+#define KIMAGEPRINTSERVERUID3 0x101FFAA4
+
+#endif // IMAGEPRINTSERVERUID_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/rimageprintclient.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,310 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef RIMAGEPRINTCLIENT_H
+#define RIMAGEPRINTCLIENT_H
+
+#include <e32std.h>
+
+class TPrintCapability;
+class TIdleGuardData;
+class TDiscoveryGuardData;
+class TJobGuardData;
+
+class RImagePrintClient : public RSessionBase
+ {
+ public:
+
+ /**
+ * Constructor
+ */
+ IMPORT_C RImagePrintClient();
+
+ /**
+ * Connect to the ImagePrint server
+ *
+ * @return KErrNone if successful, otherwise another of the system-wide error codes
+ */
+ IMPORT_C TInt ConnectL();
+
+ /**
+ * Close the session
+ */
+ IMPORT_C void Close();
+
+ /**
+ * Count connections to the server ( all clients in all prosesses )
+ *
+ * @param aConnections holder for connnections count
+ * @return KErrNone if successful, otherwise another of the system-wide error codes
+ */
+ IMPORT_C TInt CountConnections( TInt& aConnections ) const;
+
+ /**
+ * Inform server about foreground/background state of the client
+ *
+ * @param aFg foreground/background flag
+ * @return KErrNone if successful, otherwise another of the system-wide error codes
+ */
+ IMPORT_C TInt SetForeground( TInt aFg ) const;
+
+
+ /**
+ * Reserves ImagePrint engine for this client
+ *
+ * @return KErrNone if successful, KErrInUse if used by another client
+ */
+ IMPORT_C TInt ReserveEngine() const;
+
+ /**
+ * Releases ImagePrint engine
+ *
+ * @return KErrNone if successful, KErrInUse if used by another client
+ */
+ IMPORT_C TInt ReleaseEngine() const;
+
+ /**
+ * Get protocols supported by ImagePrint engine
+ *
+ * @return OR:ed protocols or KErrInUse if used by another client
+ */
+ IMPORT_C TInt SupportedProtocols() const;
+
+ /**
+ * Gets the number of pages to be printed
+ *
+ * @return Number of pages to print or KErrInUse if used by another client
+ */
+ IMPORT_C TInt GetNumPrintPages() const;
+
+ /**
+ * Gets the status of the printing job created
+ *
+ * @return Printing job status or KErrInUse if used by another client
+ */
+ IMPORT_C TInt GetJobStatus() const;
+
+ /**
+ * Gets the status of the printer
+ *
+ * @param aPrinterID The exposed ID of the printer the client wants to know about.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt GetPrinterStatus( TInt aPrinterID ) const;
+
+ /**
+ * Cancel discovery
+ *
+ * @return KErrNone or KErrInUse if used by another client
+ */
+ IMPORT_C TInt CancelDiscovery() const;
+
+ /**
+ * Submits a print job already created. The actual job execution is asynchronous so this
+ * function returns immediately. If successful, notification of job status and job
+ * completion is received by the client through the MPrintEventObserver.
+ *
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt SubmitPrintJob() const;
+
+ /**
+ * Cancels the print job. This is an asynchronous command. MPrintEventObserver::PrintJobProgressEvent
+ * will be called with the status of TPrintJobProgressEventStatus::EDone when the cancellation
+ * is completed. The notification can potentially be received by the client before
+ * this command returns to the client.
+ *
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt CancelPrintJob() const;
+
+ /**
+ * Continues printing and / or submitting a print job.
+ *
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt ContinuePrintJob() const;
+
+ /**
+ * Removes a specified cached printer.
+ *
+ * @param aPrinterID The exposed ID of the printer the client wants to remove.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt RemoveCachedPrinter( TInt aPrinterID ) const;
+
+ /**
+ * Gets the icon representing a given layout or template.
+ *
+ * @param aTemplateID ID of the template / layout of interest.
+ * @param aFbsBitmapHandle Handle to the appropriate bitmap.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt GetJobTemplateIcon( TInt aTemplateID, TInt& aFbsBitmapHandle ) const;
+
+ /**
+ * Gets the number of pages in the preview.
+ *
+ * @return Number of pages in the preview.
+ */
+ IMPORT_C TInt GetNumPreviewPages() const;
+
+ /**
+ * Sets a print job setting.
+ *
+ * @param aCapabilityID ID of the capability of interest.
+ * @param aValue New capability value.
+ * @param aAffectedCapability ID of any affected capability.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt SetJobSetting( TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability ) const;
+
+ /**
+ * Gets a setting configured for the created print job.
+ *
+ * @param aCapabilityID ID of the capability of interest.
+ * @param aValue Capability value.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt GetJobSetting( TInt aCapabilityID, TInt& aValue ) const;
+
+ /**
+ * Gets the detail of a certain capability of a certain printer.
+ *
+ * @param aPrinterID The exposed ID of the printer the client wants to know about.
+ * @param aCapabilityID ID of the capability of interest.
+ * @param aCapability Capability information.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt GetPrinterCapability(TInt aPrinterID, TInt aCapabilityID, TPrintCapability& aCapability) const;
+
+ /**
+ * Gets the IDs of the capabilities supported by the printer specified.
+ *
+ * @param aPrinterID The exposed ID of the printer the client wants to know about.
+ * @param aCapabilityIDs Array containing the ID's of the capabilities of the specified printer.
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt GetPrinterCapabilityIDs( TInt aPrinterID, RArray<TInt>& aCapabilityIDs ) const;
+
+ /**
+ * Registers the IdleObserver to send idle event notifications. Asynchronous function.
+ *
+ * @param aData place holder for idle event. On function completion contains idle event data.
+ * @param aStatus request status
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt RegisterIdleObserver( TIdleGuardData& aData, TRequestStatus& aStatus );
+
+ /**
+ * Cancel registering idle observer
+ *
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt CancelRegisterIdleObserver() const;
+
+ /**
+ * Start discovery and set request for discovery event. Asynchronous function.
+ *
+ * @param aData place holder for discovery event. On function completion contains discovery event data.
+ * @param aProtocols OR:ed protocol ids
+ * @param aStatus request status
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt StartDiscovery( TDiscoveryGuardData& aData, TUint aProtocols, TRequestStatus& aStatus );
+
+ /**
+ * Set next request for discovery event. Asynchronous function.
+ *
+ * @param aData place holder for discovery event. On function completion contains discovery event data.
+ * @param aStatus request status
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt ContinueDiscovery( TDiscoveryGuardData& aData, TRequestStatus& aStatus );
+
+ /**
+ * Create print job and set request for print job event. Asynchronous function.
+ *
+ * @param aPrinterID printer id
+ * @param aData place holder for print job event. On function completion contains print job event data.
+ * @param aImages array of image file names
+ * @param aStatus request status
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt CreateJob( TInt aPrinterID, TJobGuardData& aData, RPointerArray<TDesC>& aImages, TRequestStatus& aStatus );
+
+ /**
+ * Set next request for print job event. Asynchronous function.
+ *
+ * @param aData place holder for print job event. On function completion contains print job event data.
+ * @param aStatus request status
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt ContinueCreateJob( TJobGuardData& aData, TRequestStatus& aStatus );
+
+ /**
+ * Cancel starting discovery
+ *
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt CancelStartDiscovery() const;
+
+ /**
+ * Cancel creating print job
+ *
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt CancelCreateJob() const;
+
+ /**
+ * PictBridge USB mode checker
+ *
+ * @return TInt value more than 0, if PictBridge USB mode is on; 0 if off; negative value if error
+ */
+ IMPORT_C TInt IsPictBridgeMode() const;
+
+ /**
+ * Set number of copies
+ *
+ * @param aArray array of number of copies elements. Each array element corresponds to the array
+ * of image file names of created print job
+ * @return Any standard Symbian error code or error codes [ KErrInvalidSequence (-50) / KErrInvalidData (-51) ].
+ */
+ IMPORT_C TInt SetNumberOfCopies( const RArray<TInt>& aArray ) const;
+
+ public:
+
+ /**
+ * Version getter
+ *
+ * @return version of the client
+ */
+ TVersion Version() const;
+
+ private:
+
+ TPtr8 iDicsoveryDataPtr;
+ TPtr8 iIdleDataPtr;
+ TPtr8 iJobDataPtr;
+ TPrintCapability* iCapability;
+ };
+
+
+#endif // RIMAGEPRINTCLIENT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tdiscoveryguarddata.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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:
+*
+*/
+
+
+
+#ifndef TDISCOVERYGUARDDATA_H
+#define TDISCOVERYGUARDDATA_H
+
+#include <e32def.h>
+
+#include "tprinter.h"
+
+class TDiscoveryGuardData
+ {
+ public:
+
+ enum TCallbackNum
+ {
+ EFoundCb = 0,
+ EStatusCb,
+ ERemoveCb
+ };
+
+ public:
+
+ TPrinter iPrinterInfo;
+ TInt iStatus;
+ TInt iErrorCode;
+ TInt iErrorStringCode;
+ TCallbackNum iCb;
+ };
+
+#endif // TDISCOVERYGUARDDATA_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tidleguarddata.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef TIDLEGUARDDATA_H
+#define TIDLEGUARDDATA_H
+
+#include <e32def.h>
+
+#include "tidleevent.h"
+
+class TIdleGuardData
+ {
+ public:
+
+ TEvent iEvent;
+ TInt iError;
+ TInt iMsgCode;
+ };
+
+#endif // TIDLEGUARDDATA_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tjobguarddata.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef TJOBGUARDDATA_H
+#define TJOBGUARDDATA_H
+
+#include <e32def.h>
+
+class TJobGuardData
+ {
+ public:
+
+ enum TCallbackNum
+ {
+ EProgressEventCb = 0,
+ EErrorEventCb,
+ EStatusEventCb,
+ EImageEventCb
+ };
+
+ public:
+
+ TInt iStatus;
+ TInt iPercentCompletion;
+ TInt iJobStateCode;
+ TInt iError;
+ TInt iErrorStringCode;
+ TInt iFsBitmapHandle;
+ TCallbackNum iCb;
+ };
+
+#endif // TJOBGUARDDATA_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tmessagewrp2.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,136 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef TMESSAGEWRP2_H
+#define TMESSAGEWRP2_H
+
+#include <e32base.h>
+
+class TMessageWrp2
+ {
+ public:
+
+ /**
+ * Message wrapper constructor
+ *
+ * @param aMessage message to be wrapped
+ * @param aConnected session connection flag
+ */
+ TMessageWrp2( const RMessage2& aMessage, const TBool& aConnected );
+
+ public:
+
+ /**
+ * If session connected, write descriptor to the wrapped message
+ *
+ * @param aParam message parameter id
+ * @param aDes descriptor
+ * @param aOffset offset from the start of the client's descriptor
+ */
+ void WriteL(TInt aParam, const TDesC8 &aDes, TInt aOffset=0) const;
+
+ /**
+ * If session connected, complete the wrapped message
+ *
+ * @param aReason completion code
+ */
+ void Complete(TInt aReason) const;
+
+ /**
+ * If session connected, gets the 1st message argument as an integer value
+ *
+ * @return 1st message argument as an integer value
+ */
+ TInt Int0() const;
+
+ /**
+ * If session connected, gets the 2nd message argument as an integer value
+ *
+ * @return 2nd message argument as an integer value
+ */
+ TInt Int1() const;
+
+ /**
+ * If session connected, gets the length of a descriptor argument
+ * in the client's process
+ *
+ * @param aParam index value identifying the argument
+ * @return the length of the descriptor or error code
+ */
+ TInt GetDesLength(TInt aParam) const;
+
+ /**
+ * If session connected, read data from the specified offset within
+ * the 8-bit descriptor argument, into the specified target descriptor
+ *
+ * @param aParam message parameter id
+ * @param aDes target descriptor
+ * @param aOffset offset from the start of the client's descriptor
+ */
+ void ReadL(TInt aParam, TDes8 &aDes, TInt aOffset=0) const;
+
+ /**
+ * If session connected, read data from the specified offset within
+ * the 16-bit descriptor argument, into the specified target descriptor
+ *
+ * @param aParam message parameter id
+ * @param aDes target descriptor
+ * @param aOffset offset from the start of the client's descriptor
+ */
+ void ReadL(TInt aParam, TDes16 &aDes, TInt aOffset=0) const;
+
+ /**
+ * Panic the client thread
+ *
+ * @param aCategory category descriptor
+ * @param aReason reason id
+ */
+ void Panic(const TDesC &aCategory, TInt aReason) const;
+
+ /**
+ * Gets the the number of the function requested by the client
+ *
+ * @return the function number
+ */
+ TInt Function() const;
+
+ /**
+ * Sets the disposable state. Disposable means that the message needs not
+ * to be preserved
+ *
+ * @param aDisposable disposable flag
+ */
+ void SetDisposable( TBool aDisposable );
+
+ /**
+ * Gets the disposable state
+ *
+ * @return the disposable flag
+ */
+ TBool Disposable() const;
+
+ private: // data
+ RMessage2 iMessage;
+ const TBool& iConnected;
+ TBool iDisposable;
+ };
+
+
+#endif // TMESSAGEWRP2_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/rom/imageprintserver.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTSERVER_IBY
+#define IMAGEPRINTSERVER_IBY
+
+#include <imageprintdef.iby>
+
+file=ABI_DIR\IP_DIR\imageprintserver.exe PROGRAMS_DIR\imageprintserver.exe
+file=ABI_DIR\IP_DIR\imageprintclient.dll SHARED_LIB_DIR\imageprintclient.dll
+
+#endif // IMAGEPRINTSERVER_IBY
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/cdiscoveryguard.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cdiscoveryguard.h"
+#include "rimageprintclient.h"
+#include "imageprint.h"
+#include "tdiscoveryguarddata.h"
+
+EXPORT_C CDiscoveryGuard* CDiscoveryGuard::NewL( RImagePrintClient& aClient )
+ {
+ CDiscoveryGuard* self = new ( ELeave ) CDiscoveryGuard( aClient );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CDiscoveryGuard::CDiscoveryGuard( RImagePrintClient& aClient ) :
+ CActive( CActive::EPriorityStandard ),
+ iClient( aClient )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+EXPORT_C CDiscoveryGuard::~CDiscoveryGuard()
+ {
+ Cancel();
+ delete iData;
+ }
+
+void CDiscoveryGuard::ConstructL()
+ {
+ iData = new (ELeave) TDiscoveryGuardData;
+ }
+
+EXPORT_C TInt CDiscoveryGuard::Guard( MPrinterDiscoveryObserver& aObserver, TUint aProtocols )
+ {
+ Cancel();
+ iObserver = &aObserver;
+ TInt err = iClient.StartDiscovery( *iData, aProtocols, iStatus );
+ if( !err )
+ {
+ SetActive();
+ }
+ return err;
+ }
+
+void CDiscoveryGuard::RunL()
+ {
+ if( iStatus == KErrNone && iObserver )
+ {
+ switch( iData->iCb )
+ {
+ case TDiscoveryGuardData::EFoundCb:
+ iObserver->FoundPrinterL( iData->iPrinterInfo );
+ break;
+ case TDiscoveryGuardData::EStatusCb:
+ iObserver->DiscoveryStatusL( iData->iStatus, iData->iErrorCode, iData->iErrorStringCode );
+ break;
+ case TDiscoveryGuardData::ERemoveCb:
+ iObserver->RemovePrinterL( iData->iPrinterInfo );
+ break;
+ default:
+ break;
+ }
+
+ iClient.ContinueDiscovery( *iData, iStatus );
+ SetActive();
+ }
+ }
+
+void CDiscoveryGuard::DoCancel()
+ {
+ iClient.CancelStartDiscovery();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/cidleguard.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cidleguard.h"
+#include "rimageprintclient.h"
+#include "imageprint.h"
+#include "tidleguarddata.h"
+#include "clog.h"
+
+EXPORT_C CIdleGuard* CIdleGuard::NewL( RImagePrintClient& aClient )
+ {
+ CIdleGuard* self = new ( ELeave ) CIdleGuard( aClient );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CIdleGuard::CIdleGuard( RImagePrintClient& aClient ) :
+ CActive( CActive::EPriorityStandard ),
+ iClient( aClient )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+EXPORT_C CIdleGuard::~CIdleGuard()
+ {
+ Cancel();
+ delete iData;
+ }
+
+void CIdleGuard::ConstructL()
+ {
+ iData = new (ELeave) TIdleGuardData;
+ }
+
+EXPORT_C void CIdleGuard::Guard( MIdleObserver* aObserver )
+ {
+ Cancel();
+ iObserver = aObserver;
+ iClient.RegisterIdleObserver( *iData, iStatus );
+ SetActive();
+ }
+
+void CIdleGuard::RunL()
+ {
+ LOG1("CIdleGuard::RunL iStatus.Int(): %d", iStatus.Int());
+ LOG1("CIdleGuard::RunL iData->iEvent.iProtocol: %d", iData->iEvent.iProtocol);
+ LOG1("CIdleGuard::RunL iData->iEvent.iSeverity: %d", iData->iEvent.iSeverity);
+ LOG1("CIdleGuard::RunL iData->iEvent.iEventType: %d", iData->iEvent.iEventType);
+ LOG1("CIdleGuard::RunL iData->iError: %d", iData->iError);
+ LOG1("CIdleGuard::RunL iData->iMsgCode: %d", iData->iMsgCode);
+ if( iStatus == KErrNone && iObserver )
+ {
+ iObserver->StatusEvent( iData->iEvent, iData->iError, iData->iMsgCode );
+ iClient.RegisterIdleObserver( *iData, iStatus );
+ SetActive();
+ }
+ }
+
+void CIdleGuard::DoCancel()
+ {
+ iClient.CancelRegisterIdleObserver();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/cjobguard.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,112 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cjobguard.h"
+#include "rimageprintclient.h"
+#include "imageprint.h"
+#include "clog.h"
+#include "tjobguarddata.h"
+
+EXPORT_C CJobGuard* CJobGuard::NewL( RImagePrintClient& aClient )
+ {
+ CJobGuard* self = new ( ELeave ) CJobGuard( aClient );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CJobGuard::CJobGuard( RImagePrintClient& aClient ) :
+ CActive( CActive::EPriorityHigh ),
+ iClient( aClient )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+EXPORT_C CJobGuard::~CJobGuard()
+ {
+ Cancel();
+ delete iData;
+ }
+
+void CJobGuard::ConstructL()
+ {
+ iData = new (ELeave) TJobGuardData;
+ }
+
+EXPORT_C TInt CJobGuard::Guard( TInt aPrinterID, RPointerArray<TDesC>& aImages, MPrintEventObserver& aObserver )
+ {
+ LOG1("CJobGuard::Guard begin with aPrinterID: %d", aPrinterID);
+ Cancel();
+ iObserver = &aObserver;
+ TInt err = iClient.CreateJob( aPrinterID, *iData, aImages, iStatus );
+ if( !err )
+ {
+ SetActive();
+ }
+ LOG1("CJobGuard::Guard end with err: %d", err);
+ return err;
+ }
+
+void CJobGuard::RunL()
+ {
+ LOG1("CJobGuard::RunL begin with iStatus.Int(): %d", iStatus.Int());
+ if( iStatus == KErrNone && iObserver )
+ {
+ switch( iData->iCb )
+ {
+ case TJobGuardData::EProgressEventCb:
+ LOG("CJobGuard::RunL TJobGuardData::EProgressEventCb");
+ LOG1("CJobGuard::RunL iData->iStatus: %d", iData->iStatus);
+ LOG1("CJobGuard::RunL iData->iPercentCompletion: %d", iData->iPercentCompletion);
+ LOG1("CJobGuard::RunL iData->iJobStateCode: %d", iData->iJobStateCode);
+ iObserver->PrintJobProgressEvent( iData->iStatus, iData->iPercentCompletion, iData->iJobStateCode );
+ break;
+ case TJobGuardData::EErrorEventCb:
+ LOG("CJobGuard::RunL TJobGuardData::EErrorEventCb");
+ LOG1("CJobGuard::RunL iData->iError: %d", iData->iError);
+ LOG1("CJobGuard::RunL iData->iErrorStringCode: %d", iData->iErrorStringCode);
+ iObserver->PrintJobErrorEvent( iData->iError, iData->iErrorStringCode );
+ break;
+ case TJobGuardData::EStatusEventCb:
+ LOG("CJobGuard::RunL TJobGuardData::EStatusEventCb");
+ LOG1("CJobGuard::RunL iData->iError: %d", iData->iError);
+ LOG1("CJobGuard::RunL iData->iErrorStringCode: %d", iData->iErrorStringCode);
+ iObserver->PrintJobErrorEvent( iData->iError, iData->iErrorStringCode );
+ break;
+ case TJobGuardData::EImageEventCb:
+ LOG("CJobGuard::RunL TJobGuardData::EImageEventCb");
+ LOG1("CJobGuard::RunL iData->iFsBitmapHandle: %d", iData->iFsBitmapHandle);
+ iObserver->PreviewImageEvent( iData->iFsBitmapHandle );
+ break;
+ default:
+ break;
+ }
+
+ iClient.ContinueCreateJob( *iData, iStatus );
+ SetActive();
+ }
+ LOG("CJobGuard::RunL end");
+ }
+
+void CJobGuard::DoCancel()
+ {
+ iClient.CancelCreateJob();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/rimageprintclient.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,554 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32svr.h>
+#include <e32math.h>
+
+#include "rimageprintclient.h"
+#include "imageprintclientserver.h"
+#include "tprintcapability.h"
+#include "clog.h"
+#include "tidleguarddata.h"
+#include "tdiscoveryguarddata.h"
+#include "tjobguarddata.h"
+
+namespace
+ {
+ // Server startup code
+ TInt StartServer()
+ {
+ // EPOC and EKA2 is easy, we just create a new server process. Simultaneous
+ // launching of two such processes should be detected when the second one
+ // attempts to create the server object, failing with KErrAlreadyExists.
+ RProcess server;
+ TInt r = server.Create( KImagePrintServerImg, KNullDesC );
+
+ if( r != KErrNone )
+ return r;
+ TRequestStatus stat;
+ server.Rendezvous(stat);
+ if (stat!=KRequestPending)
+ server.Kill(0); // abort startup
+ else
+ server.Resume(); // logon OK - start the server
+ User::WaitForRequest(stat); // wait for start or death
+ // we can't use the 'exit reason' if the server panicked as this
+ // is the panic 'reason' and may be '0' which cannot be distinguished
+ // from KErrNone
+ r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
+
+ server.Close();
+ return r;
+ }
+ }
+
+TVersion RImagePrintClient::Version() const
+ {
+ return TVersion( KImagePrintServerMajor, KImagePrintServerMinor, KImagePrintServerBuild );
+ }
+
+EXPORT_C RImagePrintClient::RImagePrintClient() : RSessionBase(),
+ iDicsoveryDataPtr(NULL, 0, 0),
+ iIdleDataPtr(NULL, 0, 0),
+ iJobDataPtr(NULL, 0, 0)
+ {
+ iCapability = NULL;
+ }
+
+EXPORT_C TInt RImagePrintClient::ConnectL()
+ {
+ LOG1("RImagePrintClient::Connect Handle(): %d", Handle());
+ // check against double-connect
+ if( Handle() != KNullHandle ) return KErrAlreadyExists;
+
+ iCapability = new (ELeave) TPrintCapability();
+ if( ! iCapability ) return KErrNoMemory;
+
+ TInt retry = 2;
+ for (;;)
+ {
+ LOG1("RImagePrintClient::Connect retry: %d", retry);
+ TInt r = CreateSession( KImagePrintServerName, Version() );
+ LOG1("RImagePrintClient::Connect r after CreateSession: %d", r);
+
+ if( r != KErrNotFound && r!= KErrServerTerminated )
+ return r;
+ if( --retry == 0 )
+ return r;
+ r = StartServer();
+ LOG1("RImagePrintClient::Connect r after StartServer: %d", r);
+ if( r != KErrNone && r != KErrAlreadyExists )
+ return r;
+ }
+ }
+
+EXPORT_C void RImagePrintClient::Close()
+ {
+ LOG("RImagePrintClient::Close begin");
+ if( iCapability )
+ {
+ delete iCapability;
+ iCapability = NULL;
+ }
+ RSessionBase::Close();
+ LOG("RImagePrintClient::Close end");
+ }
+
+EXPORT_C TInt RImagePrintClient::CountConnections( TInt& aConnections ) const
+ {
+ TPckg<TInt> connsBuf( aConnections );
+ return SendReceive( ECountConnections, TIpcArgs( &connsBuf ) );
+ }
+
+EXPORT_C TInt RImagePrintClient::SetForeground( TInt aFg ) const
+ {
+ return SendReceive( ESetForeground, TIpcArgs( aFg ) );
+ }
+
+EXPORT_C TInt RImagePrintClient::ReserveEngine() const
+ {
+ return SendReceive( EReserveEngine );
+ }
+
+EXPORT_C TInt RImagePrintClient::ReleaseEngine() const
+ {
+ return SendReceive( EReleaseEngine );
+ }
+
+EXPORT_C TInt RImagePrintClient::SupportedProtocols() const
+ {
+ LOG("RImagePrintClient::SupportedProtocols ESupportedProtocols");
+ TInt prots = SendReceive( ESupportedProtocols );
+ LOG1("RImagePrintClient::SupportedProtocols end with: %d", prots);
+ return prots;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetNumPrintPages() const
+ {
+ LOG("RImagePrintClient::GetNumPrintPages EGetNumPrintPages");
+ TInt pages = SendReceive( EGetNumPrintPages );
+ LOG1("RImagePrintClient::GetNumPrintPages end with: %d", pages);
+ return pages;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetJobStatus() const
+ {
+ LOG("RImagePrintClient::GetJobStatus EGetJobStatus");
+ TInt status = SendReceive( EGetJobStatus );
+ LOG1("RImagePrintClient::GetJobStatus end with: %d", status);
+ return status;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetPrinterStatus( TInt aPrinterID ) const
+ {
+ LOG1("RImagePrintClient::GetPrinterStatus EGetPrinterStatus aPrinterID: %d", aPrinterID);
+ TInt status = SendReceive( EGetPrinterStatus, TIpcArgs( aPrinterID ) );
+ LOG1("RImagePrintClient::GetPrinterStatus end with: %d", status);
+ return status;
+ }
+
+EXPORT_C TInt RImagePrintClient::CancelDiscovery() const
+ {
+ LOG("RImagePrintClient::CancelDiscovery ECancelDiscovery");
+ TInt err = SendReceive( ECancelDiscovery );
+ LOG1("RImagePrintClient::CancelDiscovery end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::SubmitPrintJob() const
+ {
+ LOG("RImagePrintClient::SubmitPrintJob ESubmitPrintJob");
+ TInt err = SendReceive( ESubmitPrintJob );
+ LOG1("RImagePrintClient::SubmitPrintJob end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::CancelPrintJob() const
+ {
+ LOG("RImagePrintClient::CancelPrintJob ECancelPrintJob");
+ TInt err = SendReceive( ECancelPrintJob );
+ LOG1("RImagePrintClient::CancelPrintJob end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::ContinuePrintJob() const
+ {
+ LOG("RImagePrintClient::ContinuePrintJob EContinuePrintJob");
+ TInt err = SendReceive( EContinuePrintJob );
+ LOG1("RImagePrintClient::ContinuePrintJob end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::RemoveCachedPrinter( TInt aPrinterID ) const
+ {
+ LOG1("RImagePrintClient::RemoveCachedPrinter ERemoveCachedPrinter aPrinterID: %d", aPrinterID);
+ TInt err = SendReceive( ERemoveCachedPrinter, TIpcArgs( aPrinterID ) );
+ LOG1("RImagePrintClient::RemoveCachedPrinter end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetJobTemplateIcon( TInt aTemplateID, TInt& aFbsBitmapHandle ) const
+ {
+ TPckg<TInt> handleBuf( aFbsBitmapHandle );
+ LOG1("RImagePrintClient::GetJobTemplateIcon EGetJobTemplateIcon aTemplateID: %d", aTemplateID);
+ TInt err = SendReceive( EGetJobTemplateIcon, TIpcArgs( aTemplateID, &handleBuf ) );
+ LOG1("RImagePrintClient::GetJobTemplateIcon aFbsBitmapHandle: %d", aFbsBitmapHandle);
+ LOG1("RImagePrintClient::GetJobTemplateIcon end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetNumPreviewPages() const
+ {
+ LOG("RImagePrintClient::GetNumPreviewPages EGetNumPreviewPages");
+ TInt pages = SendReceive( EGetNumPreviewPages );
+ LOG1("RImagePrintClient::GetNumPreviewPages end with: %d", pages);
+ return pages;
+ }
+
+EXPORT_C TInt RImagePrintClient::SetJobSetting( TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability ) const
+ {
+ TPckg<TInt> capBuf( aAffectedCapability );
+ LOG1("RImagePrintClient::SetJobSetting ESetJobSetting aCapabilityID: %d", aCapabilityID);
+ LOG1("RImagePrintClient::SetJobSetting ESetJobSetting aValue: %d", aValue);
+ TInt err = SendReceive( ESetJobSetting, TIpcArgs( aCapabilityID, aValue, &capBuf ) );
+ LOG1("RImagePrintClient::SetJobSetting aAffectedCapability: %d", aAffectedCapability);
+ LOG1("RImagePrintClient::SetJobSetting end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetJobSetting( TInt aCapabilityID, TInt& aValue ) const
+ {
+ TPckg<TInt> valueBuf( aValue );
+ LOG1("RImagePrintClient::GetJobSetting EGetJobSetting aCapabilityID: %d", aCapabilityID);
+ TInt err = SendReceive( EGetJobSetting, TIpcArgs( aCapabilityID, &valueBuf ) );
+ LOG1("RImagePrintClient::GetJobSetting aValue: %d", aValue);
+ LOG1("RImagePrintClient::GetJobSetting end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::GetPrinterCapability(TInt aPrinterID, TInt aCapabilityID, TPrintCapability& aCapability) const
+ {
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapability aPrinterID: %d", aPrinterID);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapability aCapabilityID: %d", aCapabilityID);
+ TInt err = SendReceive( EGetPrinterCapability, TIpcArgs( aPrinterID, aCapabilityID ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapability err: %d", err);
+
+ if( !err )
+ {
+ TInt capId;
+ TPckg<TInt> capIdBuf( capId );
+ LOG("RImagePrintClient::GetPrinterCapability EGetPrinterCapId");
+ err = SendReceive( EGetPrinterCapId, TIpcArgs( &capIdBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapId err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapId capId: %d", capId);
+ if( !err )
+ {
+ iCapability->iCapabilityID = capId;
+ }
+ }
+
+ if( !err )
+ {
+ TInt type;
+ TPckg<TInt> typeBuf( type );
+ LOG("RImagePrintClient::GetPrinterCapability EGetPrinterCapType");
+ err = SendReceive( EGetPrinterCapType, TIpcArgs( &typeBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapType err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapType type: %d", type);
+ if( !err )
+ {
+ iCapability->iType = static_cast<TPrintCapability::ECapType>(type);
+ }
+ }
+
+ if( !err )
+ {
+ TInt def;
+ TPckg<TInt> defBuf( def );
+ LOG("RImagePrintClient::GetPrinterCapability EGetPrinterCapDef");
+ err = SendReceive( EGetPrinterCapDef, TIpcArgs( &defBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapDef err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapDef def: %d", def);
+ if( !err )
+ {
+ iCapability->iDefaultValue = def;
+ }
+ }
+
+ if( !err )
+ {
+ TInt low;
+ TPckg<TInt> lowBuf( low );
+ LOG("RImagePrintClient::GetPrinterCapability EGetPrinterCapLow");
+ err = SendReceive( EGetPrinterCapLow, TIpcArgs( &lowBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapLow err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapLow low: %d", low);
+ if( !err )
+ {
+ iCapability->iLow = low;
+ }
+ }
+
+ if( !err )
+ {
+ TInt high;
+ TPckg<TInt> highBuf( high );
+ LOG("RImagePrintClient::GetPrinterCapability EGetPrinterCapHigh");
+ err = SendReceive( EGetPrinterCapHigh, TIpcArgs( &highBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapHigh err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapHigh high: %d", high);
+ if( !err )
+ {
+ iCapability->iHigh = high;
+ }
+ }
+
+ if( !err )
+ {
+ TInt count;
+ TPckg<TInt> countBuf( count );
+ LOG("RImagePrintClient::GetPrinterCapability EGetPrinterCapEnumCount");
+ err = SendReceive( EGetPrinterCapEnumCount, TIpcArgs( &countBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapEnumCount err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapEnumCount count: %d", count);
+
+ if( !err )
+ {
+ iCapability->iEnumCount = count;
+ for( TInt i = 0; i < count && ! err; i++ )
+ {
+ TInt value;
+ TPckg<TInt> valueBuf( value );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapEnum i: %d",i);
+ TInt err = SendReceive( EGetPrinterCapEnum, TIpcArgs( i, &valueBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapEnum err: %d", err);
+ LOG1("RImagePrintClient::GetPrinterCapability EGetPrinterCapEnum value: %d", value);
+
+ if( !err )
+ {
+ iCapability->iEnumCodes[i] = value;
+ }
+ }
+ }
+ }
+
+ if( !err )
+ {
+ aCapability = *iCapability;
+ }
+
+ LOG1("RImagePrintClient::GetPrinterCapability end with: %d", err);
+ return err;
+ }
+
+
+EXPORT_C TInt RImagePrintClient::GetPrinterCapabilityIDs( TInt aPrinterID, RArray<TInt>& aCapabilityIDs ) const
+ {
+ TInt count;
+ TPckg<TInt> countBuf( count );
+
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs EGetPrinterCapabilityIDsCount aPrinterID: %d", aPrinterID);
+ TInt err = SendReceive( EGetPrinterCapabilityIDsCount, TIpcArgs( aPrinterID, &countBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs EGetPrinterCapabilityIDsCount err: %d", err);
+ if( !err )
+ {
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs EGetPrinterCapabilityIDsCount count: %d", count);
+ for( TInt i = 0; i < count && !err; i++ )
+ {
+ TInt capability;
+ TPckg<TInt> capBuf( capability );
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs EGetPrinterCapabilityID i: %d", i);
+ err = SendReceive( EGetPrinterCapabilityID, TIpcArgs( i, &capBuf ) );
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs EGetPrinterCapabilityID err: %d", err);
+ if( !err )
+ {
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs capability id: %d", capability);
+ err = aCapabilityIDs.Append( capability );
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs append err: %d", err);
+ }
+ }
+ }
+
+ LOG1("RImagePrintClient::GetPrinterCapabilityIDs end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::RegisterIdleObserver( TIdleGuardData& aData, TRequestStatus& aStatus )
+ {
+ LOG("RImagePrintClient::RegisterIdleObserver EReserveEngine");
+ TInt err = SendReceive( EReserveEngine );
+ LOG1("RImagePrintClient::RegisterIdleObserver EReserveEngine err: %d", err);
+ if( !err )
+ {
+ LOG("RImagePrintClient::RegisterIdleObserver ERegisterIdleObserver");
+ iIdleDataPtr.Set(reinterpret_cast<TUint8*>(&aData), sizeof(aData), sizeof(aData));
+ SendReceive( ERegisterIdleObserver, TIpcArgs( &iIdleDataPtr ), aStatus );
+ }
+ LOG1("RImagePrintClient::RegisterIdleObserver end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::CancelRegisterIdleObserver() const
+ {
+ LOG("RImagePrintClient::CancelRegisterIdleObserver ECancelRegisterIdleObserver");
+ TInt err = SendReceive( EReleaseEngine );
+ LOG1("RImagePrintClient::RegisterIdleObserver EReleaseEngine err: %d", err);
+
+ err = SendReceive( ECancelRegisterIdleObserver );
+ LOG1("RImagePrintClient::RegisterIdleObserver ECancelRegisterIdleObserver err: %d", err);
+
+ LOG1("RImagePrintClient::CancelRegisterIdleObserver end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::StartDiscovery( TDiscoveryGuardData& aData, TUint aProtocols, TRequestStatus& aStatus )
+ {
+ LOG("RImagePrintClient::StartDiscovery EReserveEngine");
+ TInt err = SendReceive( EReserveEngine );
+ LOG1("RImagePrintClient::StartDiscovery EReserveEngine err: %d", err);
+ if( !err )
+ {
+ LOG1("RImagePrintClient::StartDiscovery EStartDiscovery aProtocols: %d", aProtocols);
+ err = SendReceive( EStartDiscovery, TIpcArgs( aProtocols ) );
+ LOG1("RImagePrintClient::StartDiscovery EStartDiscovery err: %d", err);
+ }
+ if( !err )
+ {
+ LOG("RImagePrintClient::StartDiscovery EContinueDiscovery");
+ iDicsoveryDataPtr.Set(reinterpret_cast<TUint8*>(&aData), sizeof(aData), sizeof(aData));
+ SendReceive( EContinueDiscovery, TIpcArgs( &iDicsoveryDataPtr ), aStatus );
+ }
+ LOG1("RImagePrintClient::StartDiscovery end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::ContinueDiscovery( TDiscoveryGuardData& aData, TRequestStatus& aStatus )
+ {
+ LOG("RImagePrintClient::ContinueDiscovery EReserveEngine");
+ TInt err = SendReceive( EReserveEngine );
+ LOG1("RImagePrintClient::ContinueDiscovery EReserveEngine err: %d", err);
+ if( !err )
+ {
+ LOG("RImagePrintClient::ContinueDiscovery EContinueDiscovery");
+ iDicsoveryDataPtr.Set(reinterpret_cast<TUint8*>(&aData), sizeof(aData), sizeof(aData));
+ SendReceive( EContinueDiscovery, TIpcArgs( &iDicsoveryDataPtr ), aStatus );
+ }
+ LOG1("RImagePrintClient::ContinueDiscovery end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::CreateJob( TInt aPrinterID, TJobGuardData& aData, RPointerArray<TDesC>& aImages, TRequestStatus& aStatus )
+ {
+ LOG("RImagePrintClient::CreateJob EReserveEngine");
+ TInt err = SendReceive( EReserveEngine );
+ LOG1("RImagePrintClient::CreateJob EReserveEngine err: %d", err);
+ if( !err )
+ {
+ TInt count = aImages.Count();
+ LOG1("RImagePrintClient::CreateJob aImages.Count(): %d", aImages.Count());
+ for( TInt i = 0; i < count && !err; i++ )
+ {
+ LOG("RImagePrintClient::CreateJob EPrepareJob");
+ err = SendReceive( EPrepareJob, TIpcArgs( aImages[i] ) );
+ LOG1("RImagePrintClient::CreateJob EPrepareJob err: %d", err);
+ }
+ }
+ if( !err )
+ {
+ LOG("RImagePrintClient::CreateJob ECreateJob");
+ err = SendReceive( ECreateJob, TIpcArgs( aPrinterID ) );
+ LOG1("RImagePrintClient::CreateJob ECreateJob err: %d", err);
+ }
+ if( !err )
+ {
+ LOG("RImagePrintClient::CreateJob EContinueCreateJob");
+ iJobDataPtr.Set(reinterpret_cast<TUint8*>(&aData), sizeof(aData), sizeof(aData));
+ SendReceive( EContinueCreateJob, TIpcArgs( &iJobDataPtr ), aStatus );
+ }
+ LOG1("RImagePrintClient::CreateJob end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::ContinueCreateJob( TJobGuardData& aData, TRequestStatus& aStatus )
+ {
+ LOG("RImagePrintClient::ContinueCreateJob EReserveEngine");
+ TInt err = SendReceive( EReserveEngine );
+ LOG1("RImagePrintClient::ContinueCreateJob EReserveEngine err: %d", err);
+ if( !err )
+ {
+ LOG("RImagePrintClient::ContinueCreateJob EContinueCreateJob");
+ iJobDataPtr.Set(reinterpret_cast<TUint8*>(&aData), sizeof(aData), sizeof(aData));
+ SendReceive( EContinueCreateJob, TIpcArgs( &iJobDataPtr ), aStatus );
+ }
+ LOG1("RImagePrintClient::ContinueCreateJob end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::CancelStartDiscovery() const
+ {
+ LOG("RImagePrintClient::CancelStartDiscovery ECancelStartDiscovery");
+ TInt err = SendReceive( ECancelStartDiscovery );
+ LOG1("RImagePrintClient::CancelStartDiscovery end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::CancelCreateJob() const
+ {
+ LOG("RImagePrintClient::CancelCreateJob ECancelCreateJob");
+ TInt err = SendReceive( ECancelCreateJob );
+ LOG1("RImagePrintClient::CancelCreateJob end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::IsPictBridgeMode() const
+ {
+ LOG("RImagePrintClient::IsPictBridgeMode EIsPictBridgeMode");
+#ifdef __WINS__
+ TInt err( KErrNotFound );
+#else
+ TInt err = SendReceive( EIsPictBridgeMode );
+#endif
+ LOG1("RImagePrintClient::IsPictBridgeMode end with: %d", err);
+ return err;
+ }
+
+EXPORT_C TInt RImagePrintClient::SetNumberOfCopies( const RArray<TInt>& aArray ) const
+ {
+ LOG("RImagePrintClient::SetNumberOfCopies EReserveEngine");
+ TInt err = SendReceive( EReserveEngine );
+ LOG1("RImagePrintClient::SetNumberOfCopies EReserveEngine err: %d", err);
+ if( !err )
+ {
+ TInt count = aArray.Count();
+ LOG1("RImagePrintClient::SetNumberOfCopies count: %d", count);
+ LOG("RImagePrintClient::SetNumberOfCopies ESetNumberOfCopiesCount");
+ err = SendReceive( ESetNumberOfCopiesCount, TIpcArgs( count ) );
+ LOG1("RImagePrintClient::SetNumberOfCopies ESetNumberOfCopiesCount err: %d", err);
+ for( TInt i = 0; i < count && !err; i++ )
+ {
+ LOG1("RImagePrintClient::SetNumberOfCopies i: %d", i);
+ LOG("RImagePrintClient::SetNumberOfCopies ESetNumberOfCopies");
+ err = SendReceive( ESetNumberOfCopies, TIpcArgs( aArray[i] ) );
+ LOG1("RImagePrintClient::SetNumberOfCopies ESetNumberOfCopies err: %d", err);
+ }
+ }
+ LOG1("RImagePrintClient::SetNumberOfCopies end with: %d", err);
+ return err;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintbody.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,691 @@
+/*
+* 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 CImagePrintBody class definition.
+*
+*/
+
+
+#include <bluetooth/hci/hcierrors.h>
+
+#include "cimageprintbody.h"
+#include "crsimageparser.h"
+#include "clog.h"
+
+CImagePrintBody* CImagePrintBody::NewL()
+ {
+ CImagePrintBody* self = new (ELeave) CImagePrintBody();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CImagePrintBody::~CImagePrintBody()
+ {
+ LOG("CImagePrintBody::~CImagePrintBody begin");
+ delete iClassLoader;
+ iImageFileNames.ResetAndDestroy();
+ delete iIdleDiscovery;
+ LOG("CImagePrintBody::~CImagePrintBody end");
+ }
+
+TInt CImagePrintBody::StartDiscovery(MPrinterDiscoveryObserver& aObserver, TUint aProtocols)
+ {
+ LOG1("CImagePrintBody::StartDiscovery aProtocols: %d", aProtocols);
+ iPrinterDiscoveryObserver = &aObserver;
+
+ if( iCurrentProtocol )
+ {
+ iCurrentProtocol->CancelDiscovery( EFalse );
+ }
+
+ iCurrentProtocol = NULL;
+ iClassLoader->Reset();
+ iProtocolsRequested = aProtocols;
+ iDiscoveryCancelled = EFalse;
+ TryNextDiscovery();
+
+ LOG("CImagePrintBody::StartDiscovery end");
+ return KErrNone;
+ }
+
+void CImagePrintBody::CancelDiscovery()
+ {
+ LOG("CImagePrintBody::CancelDiscovery begin");
+ iDiscoveryCancelled = ETrue;
+ if( iCurrentProtocol )
+ {
+ iCurrentProtocol->CancelDiscovery();
+ }
+ LOG("CImagePrintBody::CancelDiscovery end");
+ }
+
+
+TInt CImagePrintBody::CreatePrintJobL(TInt aPrinterID, RPointerArray<TDesC>& aImages, MPrintEventObserver& aObserver)
+ {
+ LOG("CImagePrintBody::CreatePrintJobL begin");
+ iPrinterPrintEventObserver = &aObserver;
+ iCurrentPrintJobProtocol = NULL;
+
+ if( iCurrentProtocol )
+ {
+ iCurrentProtocol->CancelDiscovery( EFalse );
+ }
+
+ TInt DeviceID;
+ TInt err = FindInternalDeviceReference( aPrinterID, DeviceID, iCurrentPrintJobProtocol );
+ if( !err )
+ {
+ TInt count = aImages.Count();
+ if( count )
+ {
+ iImageFileNames.ResetAndDestroy();
+ for( TInt i = 0; i < count; ++i )
+ {
+ HBufC* fileName = aImages[i]->AllocLC();
+ iImageFileNames.AppendL( fileName );
+ CleanupStack::Pop(); // fileName
+ }
+
+ ActiveScheduler().SetCurrentProtocol( iCurrentPrintJobProtocol->SupportedProtocols() );
+ err = iCurrentPrintJobProtocol->CreatePrintJobL( DeviceID, aImages, *this );
+ }
+ else
+ {
+ err = KErrInvalidData;
+ }
+ }
+
+ LOG1("CImagePrintBody::CreatePrintJobL return: %d", err);
+ return err;
+ }
+
+
+void CImagePrintBody::SubmitPrintJobL()
+ {
+ LOG1("CImagePrintBody::SubmitPrintJobL iCurrentPrintJobProtocol: %d", iCurrentPrintJobProtocol);
+ TInt err( KErrNone );
+
+ if( !iCurrentPrintJobProtocol )
+ {
+ err = KErrInvalidSequence;
+ }
+ if( !err )
+ {
+ TInt invalidImages;
+ err = ValidateImagesL( iImageFileNames, invalidImages );
+ LOG1("CImagePrintBody::SubmitPrintJobL ValidateImagesL returns: %d", err);
+ }
+
+ User::LeaveIfError( err );
+
+ iCurrentPrintJobProtocol->SubmitPrintJobL();
+
+ LOG("CImagePrintBody::SubmitPrintJobL end");
+ }
+
+
+TInt CImagePrintBody::CancelPrintJob()
+ {
+ LOG("CImagePrintBody::CancelPrintJob begin");
+ TInt err( KErrNone );
+ if( !iCurrentPrintJobProtocol )
+ {
+ err = KErrInvalidSequence;
+ }
+ if( !err )
+ {
+ err = iCurrentPrintJobProtocol->CancelPrintJob();
+ }
+ LOG1("CImagePrintBody::CancelPrintJob return: %d", err);
+ return err;
+ }
+
+
+TInt CImagePrintBody::ContinuePrintJobL()
+ {
+ LOG("CImagePrintBody::ContinuePrintJobL begin");
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->ContinuePrintJobL();
+ }
+ LOG1("CImagePrintBody::ContinuePrintJobL return: %d", err);
+ return err;
+ }
+
+
+TInt CImagePrintBody::GetNumPrintPages()
+ {
+ LOG("CImagePrintBody::GetNumPrintPages begin");
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->GetNumPrintPages();
+ }
+ LOG1("CImagePrintBody::GetNumPrintPages return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetJobStatus()
+ {
+ LOG("CImagePrintBody::GetJobStatus begin");
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->GetPrintJobStatus();
+ }
+ LOG1("CImagePrintBody::GetJobStatus return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetPrinterStatus(TInt aPrinterID)
+ {
+ LOG1("CImagePrintBody::GetPrinterStatus aPrinterID: %d", aPrinterID);
+ TInt DeviceID;
+ MProtPrintingDevice* theProtToQuery = NULL;
+ TInt err = FindInternalDeviceReference( aPrinterID, DeviceID, theProtToQuery );
+ if( !err )
+ {
+ err = theProtToQuery->GetPrinterStatus( DeviceID );
+ }
+ LOG1("CImagePrintBody::GetPrinterStatus return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetPrinterCapabilityIDsL(TInt aPrinterID, RArray<TInt>& aCapabilityIDs)
+ {
+ LOG1("CImagePrintBody::GetPrinterCapabilityIDsL aPrinterID: %d", aPrinterID);
+ TInt DeviceID;
+ MProtPrintingDevice* theProtToQuery = NULL;
+
+ TInt err = FindInternalDeviceReference( aPrinterID, DeviceID, theProtToQuery );
+ if( !err )
+ {
+ err = theProtToQuery->GetDeviceCapabilityIDsL( DeviceID, aCapabilityIDs );
+ }
+ else if( err == KErrNotFound )
+ {
+ err = KErrInvalidData;
+ }
+
+ LOG1("CImagePrintBody::GetPrinterCapabilityIDsL return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetPrinterCapabilityL(TInt aPrinterID, TInt aCapabilityID, TPrintCapability& aCapability)
+ {
+ LOG1("CImagePrintBody::GetPrinterCapabilityL aPrinterID: %d", aPrinterID);
+ LOG1("CImagePrintBody::GetPrinterCapabilityL aCapabilityID: %d", aCapabilityID);
+ TInt DeviceID;
+ MProtPrintingDevice* theProtToQuery = NULL;
+
+ TInt err = FindInternalDeviceReference( aPrinterID, DeviceID, theProtToQuery );
+ if( !err )
+ {
+ err = theProtToQuery->GetDeviceCapabilityL( DeviceID, aCapabilityID, aCapability );
+ }
+ else if( err == KErrNotFound )
+ {
+ err = KErrInvalidData;
+ }
+
+ LOG1("CImagePrintBody::GetPrinterCapabilityL return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetJobSetting(TInt aCapabilityID, TInt& aValue)
+ {
+ LOG1("CImagePrintBody::GetJobSetting aCapabilityID: %d", aCapabilityID);
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->GetJobSetting( aCapabilityID, aValue );
+ }
+ LOG1("CImagePrintBody::GetJobSetting return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
+ {
+ LOG1("CImagePrintBody::SetJobSettingL aCapabilityID: %d", aCapabilityID);
+ LOG1("CImagePrintBody::SetJobSettingL aValue: %d", aValue);
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->SetJobSettingL( aCapabilityID, aValue, aAffectedCapability );
+ }
+ LOG1("CImagePrintBody::SetJobSettingL return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetNumPreviewPages()
+ {
+ LOG("CImagePrintBody::GetNumPreviewPages");
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->GetNumPreviewPages();
+ }
+ LOG1("CImagePrintBody::GetNumPreviewPages return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::GetJobTemplateIconL( TInt aTemplateID, TInt& aFbsBitmapHandle )
+ {
+ LOG1("CImagePrintBody::GetJobTemplateIconL aTemplateID: %d", aTemplateID);
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->GetJobTemplateIconL( aTemplateID, aFbsBitmapHandle );
+ }
+ LOG1("CImagePrintBody::GetJobTemplateIconL return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::CreatePreviewImage(TInt aPageNumber)
+ {
+ LOG1("CImagePrintBody::CreatePreviewImage aPageNumber: %d", aPageNumber);
+ TInt err( KErrInvalidSequence );
+ if( iCurrentPrintJobProtocol )
+ {
+ err = iCurrentPrintJobProtocol->CreatePreviewImage(aPageNumber);
+ }
+ LOG1("CImagePrintBody::CreatePreviewImage return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::RemoveCachedPrinterL(TInt aPrinterID)
+ {
+ LOG1("CImagePrintBody::RemoveCachedPrinterL aPrinterID: %d", aPrinterID);
+ TInt DeviceID;
+ MProtPrintingDevice* theProtToQuery = NULL;
+ TInt err = FindInternalDeviceReference( aPrinterID, DeviceID, theProtToQuery );
+ if( !err )
+ {
+ err = theProtToQuery->RemoveCachedDeviceL( DeviceID );
+ }
+ LOG1("CImagePrintBody::RemoveCachedPrinterL return: %d", err);
+ return err;
+ }
+
+TUint CImagePrintBody::SupportedProtocols()
+ {
+ LOG("CImagePrintBody::SupportedProtocols begin");
+ TUint prots = iClassLoader->SupportedProtocols();
+ LOG1("CImagePrintBody::SupportedProtocols return: %d", prots);
+ return prots;
+ }
+
+void CImagePrintBody::RegisterIdleObserver(MIdleObserver *aObserver)
+ {
+ LOG("CImagePrintBody::RegisterIdleObserver begin");
+ iPrinterIdleObserver = aObserver;
+ LOG("CImagePrintBody::RegisterIdleObserver end");
+ }
+
+// From MProtDiscoveryObserver.
+void CImagePrintBody::FoundDeviceL(TPrinter& aDeviceInfo)
+ {
+ LOG("CImagePrintBody::FoundDeviceL begin");
+ if( iPrinterDiscoveryObserver )
+ {
+ //Check that device id is valid, there can't be any bits in the protocol field (higher bits)
+ if( !( PROTOCOL_ID_FIELD_MASK & aDeviceInfo.iPrinterID ) )
+ {
+ // Get the protocol index number
+ TInt protocolIndex = iClassLoader->GetProtocolIndex();
+
+ // Left shift this number so that it occupies the higher X bits (the PROTOCOL_ID_BIT_COUNT highest bits)
+ protocolIndex <<= sizeof(TInt)*8 - PROTOCOL_ID_BIT_COUNT;
+
+ // Add the protocol index number to the device id
+ aDeviceInfo.iPrinterID |= protocolIndex;
+
+ // Forward the FoundPrinterL callback to the observer
+ iPrinterDiscoveryObserver->FoundPrinterL( aDeviceInfo );
+ }
+ }
+ LOG("CImagePrintBody::FoundDeviceL end");
+ }
+
+void CImagePrintBody::DiscoveryStatusL( TInt aStatus, TInt aErrorCode, TInt aErrorStringCode )
+ {
+ LOG1("CImagePrintBody::DiscoveryStatusL aStatus: %d", aStatus);
+ LOG1("CImagePrintBody::DiscoveryStatusL aErrorCode: %d", aErrorCode);
+ LOG1("CImagePrintBody::DiscoveryStatusL aErrorStringCode: %d", aErrorStringCode);
+ if( iPrinterDiscoveryObserver )
+ {
+ switch( aStatus )
+ {
+ case EDiscoveryFinished: // Done with 1 protocol.
+ {
+ // When Bluetooth discovery is finished, but Bluetooth is not enabled pass error code to UI.
+ if ( aErrorCode == ENoConnection )
+ {
+ iPrinterDiscoveryObserver->DiscoveryStatusL( aStatus, aErrorCode, aErrorStringCode );
+ }
+ iCurrentProtocol = NULL;
+ TUint doDiscovery = iProtocolsRequested & iClassLoader->SupportedProtocols();
+ LOG1("CImagePrintBody::DiscoveryStatusL doDiscovery: %d", doDiscovery);
+ LOG1("CImagePrintBody::DiscoveryStatusL iDiscoveryCancelled: %d", iDiscoveryCancelled);
+ if( ( !doDiscovery && aErrorCode == KErrCancel ) || iDiscoveryCancelled )
+ {
+ iPrinterDiscoveryObserver->DiscoveryStatusL( aStatus, aErrorCode, aErrorStringCode );
+ }
+ else
+ {
+ TryNextDiscovery();
+ }
+ }
+ break;
+ default: // Discovering, Cancelling.
+ iCurrentProtocol = NULL;
+ iPrinterDiscoveryObserver->DiscoveryStatusL( aStatus, aErrorCode, aErrorStringCode );
+ break;
+ }
+ }
+ LOG("CImagePrintBody::DiscoveryStatusL end");
+ }
+
+
+void CImagePrintBody::RemoveDeviceL(TPrinter& aDeviceInfo)
+ {
+ LOG("CImagePrintBody::RemoveDeviceL begin");
+ if( iPrinterDiscoveryObserver )
+ {
+ if (PROTOCOL_ID_FIELD_MASK & aDeviceInfo.iPrinterID)
+ { //Invalid id, reject printer
+ }
+ else
+ { // Get the protocol index number
+ TInt protocolIndex = iClassLoader->GetProtocolIndex();
+
+ // Left shift this number so that it occupies the higher X bits (the PROTOCOL_ID_BIT_COUNT highest bits)
+ protocolIndex <<= sizeof(TInt)*8 - PROTOCOL_ID_BIT_COUNT;
+
+ // Add the protocol index number to the device id
+ aDeviceInfo.iPrinterID |= protocolIndex;
+
+ // Forward the RemovePrinterL callback to the observer
+ iPrinterDiscoveryObserver->RemovePrinterL( aDeviceInfo );
+ }
+ }
+ LOG("CImagePrintBody::RemoveDeviceL end");
+ }
+
+// From MProtPrintEventObserver.
+void CImagePrintBody::PrintJobProgressEvent(TInt aStatus, TInt aPercent, TInt aJobStateCode)
+ {
+ LOG1("CImagePrintBody::PrintJobProgressEvent aStatus: %d", aStatus);
+ LOG1("CImagePrintBody::PrintJobProgressEvent aPercent: %d", aPercent);
+ LOG1("CImagePrintBody::PrintJobProgressEvent aJobStateCode: %d", aJobStateCode);
+ if( iPrinterPrintEventObserver )
+ iPrinterPrintEventObserver->PrintJobProgressEvent(aStatus, aPercent, aJobStateCode);
+ LOG("CImagePrintBody::PrintJobProgressEvent end");
+ }
+
+void CImagePrintBody::PrintJobErrorEvent(TInt aErrorCode, TInt aErrorStringCode)
+ {
+ LOG1("CImagePrintBody::PrintJobErrorEvent aErrorCode: %d", aErrorCode);
+ LOG1("CImagePrintBody::PrintJobErrorEvent aErrorStringCode: %d", aErrorStringCode);
+ if( iPrinterPrintEventObserver )
+ iPrinterPrintEventObserver->PrintJobErrorEvent(aErrorCode, aErrorStringCode);
+ LOG("CImagePrintBody::PrintJobErrorEvent end");
+ }
+
+void CImagePrintBody::PrinterStatusEvent(TInt aErrorCode, TInt aErrorStringCode)
+ {
+ LOG1("CImagePrintBody::PrinterStatusEvent aErrorCode: %d", aErrorCode);
+ LOG1("CImagePrintBody::PrinterStatusEvent aErrorStringCode: %d", aErrorStringCode);
+ if( iPrinterPrintEventObserver )
+ iPrinterPrintEventObserver->PrinterStatusEvent(aErrorCode, aErrorStringCode);
+ LOG("CImagePrintBody::PrinterStatusEvent end");
+ }
+
+void CImagePrintBody::PreviewImageEvent(TInt aFsBitmapHandle)
+ {
+ LOG1("CImagePrintBody::PreviewImageEvent aFsBitmapHandle: %d", aFsBitmapHandle);
+ if( iPrinterPrintEventObserver )
+ iPrinterPrintEventObserver->PreviewImageEvent(aFsBitmapHandle);
+ LOG("CImagePrintBody::PreviewImageEvent end");
+ }
+
+void CImagePrintBody::ShowMessageL(TInt aMsgLine1Code, TInt aMsgLine2Code)
+ {
+ LOG1("CImagePrintBody::ShowMessageL aMsgLine1Code: %d", aMsgLine1Code);
+ LOG1("CImagePrintBody::ShowMessageL aMsgLine2Code: %d", aMsgLine2Code);
+ if( iPrinterPrintEventObserver )
+ iPrinterPrintEventObserver->ShowMessageL(aMsgLine1Code, aMsgLine2Code);
+ LOG("CImagePrintBody::ShowMessageL end");
+ }
+
+TBool CImagePrintBody::AskYesNoQuestionL(TInt aMsgLine1Code, TInt aMsgLine2Code)
+ {
+ LOG1("CImagePrintBody::AskYesNoQuestionL aMsgLine1Code: %d", aMsgLine1Code);
+ LOG1("CImagePrintBody::AskYesNoQuestionL aMsgLine2Code: %d", aMsgLine2Code);
+ TBool res( EFalse );
+ if( iPrinterPrintEventObserver )
+ {
+ res = iPrinterPrintEventObserver->AskYesNoQuestionL(aMsgLine1Code, aMsgLine2Code);
+ }
+ LOG1("CImagePrintBody::AskYesNoQuestionL return: %d", res);
+ return res;
+ }
+
+const TDesC& CImagePrintBody::AskForInputL(TInt aMsgLine1Code, TInt aMsgLine2Code)
+ {
+ LOG1("CImagePrintBody::ShowMessageL aMsgLine1Code: %d", aMsgLine1Code);
+ LOG1("CImagePrintBody::ShowMessageL aMsgLine2Code: %d", aMsgLine2Code);
+ if( iPrinterPrintEventObserver )
+ {
+ return iPrinterPrintEventObserver->AskForInputL(aMsgLine1Code, aMsgLine2Code);
+ }
+ else
+ {
+ return KNullDesC;
+ }
+ }
+
+void CImagePrintBody::StatusEvent(const TEvent& aEvent, TInt aError, TInt aMsgCode)
+ {
+ LOG1("CImagePrintBody::StatusEvent aError: %d", aError);
+ LOG1("CImagePrintBody::StatusEvent aMsgCode: %d", aMsgCode);
+ LOG1("CImagePrintBody::StatusEvent aEvent.iProtocol: %d", aEvent.iProtocol);
+ LOG1("CImagePrintBody::StatusEvent aEvent.iSeverity: %d", aEvent.iSeverity);
+ LOG1("CImagePrintBody::StatusEvent aEvent.iEventType: %d", aEvent.iEventType);
+
+ if( iPrinterIdleObserver )
+ {
+ iPrinterIdleObserver->StatusEvent( aEvent, aError, aMsgCode );
+ }
+
+ if( aEvent.iEventType == EAsynchronousLeave )
+ {
+ // a protocol threw an async leave
+ // we continue with other protocols
+ TUint doDiscovery = iProtocolsRequested & iClassLoader->SupportedProtocols();
+ if( doDiscovery ) TryNextDiscovery();
+ }
+ LOG("CImagePrintBody::StatusEvent end");
+ }
+
+CImagePrintBody::CImagePrintBody() :
+ iCurrentProtocol( NULL ),
+ iCurrentPrintJobProtocol( NULL )
+ {
+ LOG("CImagePrintBody::CImagePrintBody begin");
+ LOG("CImagePrintBody::CImagePrintBody end");
+ }
+
+void CImagePrintBody::ConstructL()
+ {
+ LOG("CImagePrintBody::ConstructL begin");
+ iClassLoader = CProtocolsLoader::NewL();
+ iClassLoader->Reset();
+ for( TInt x=0; x < iClassLoader->GetNumberOfProtocolsAvailable(); ++x )
+ {
+ iClassLoader->GetNextProtocol()->RegisterIdleObserver( this );
+ }
+
+ iIdleDiscovery = CIdle::NewL( CActive::EPriorityIdle );
+ ActiveScheduler().SetIdleObserver( *this );
+ LOG("CImagePrintBody::ConstructL end");
+ }
+
+CImagePrintScheduler& CImagePrintBody::ActiveScheduler() const
+ {
+ LOG("CImagePrintBody::ActiveScheduler begin");
+ CImagePrintScheduler* scheduler = static_cast<CImagePrintScheduler*>( CActiveScheduler::Current() );
+ LOG("CImagePrintBody::ActiveScheduler end");
+ return *scheduler;
+ }
+
+TInt CImagePrintBody::FindInternalDeviceReference(TInt aExternalDeviceID, TInt& aInternalDeviceID, MProtPrintingDevice*& aProtToUse)
+ {
+ LOG1("CImagePrintBody::FindInternalDeviceReference aExternalDeviceID: %d", aExternalDeviceID);
+ TInt err( KErrNotFound );
+
+ aProtToUse = NULL;
+
+ // Separate the external id into the corresponding fields
+ TInt protId = aExternalDeviceID & PROTOCOL_ID_FIELD_MASK;
+
+ TInt deviceId = aExternalDeviceID & DEVICE_ID_FIELD_MASK;
+ protId >>= (sizeof(TInt)*8 - PROTOCOL_ID_BIT_COUNT);
+ // If TInt is more than 4 bytes the mask should clear everything but the 6 least significant bits
+ protId &= PROTOCOL_ID_CLEAR_MASK; //remove 1's if the original protId was negative
+
+ // Check that the external ID does indeed belong to one of the currently
+ // loaded protocols
+ if( protId >= 0 && protId < iClassLoader->GetNumberOfProtocolsAvailable() )
+ {
+ aInternalDeviceID = deviceId;
+ aProtToUse = iClassLoader->GetProtocolAt(protId);
+ if( aProtToUse ) err = KErrNone;
+ }
+
+ LOG1("CImagePrintBody::FindInternalDeviceReference return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintBody::ValidateImagesL(const RPointerArray<HBufC>& aImageList, TInt &aInvalidCount)
+ {
+ LOG1("CImagePrintBody::ValidateImagesL aImageList.Count(): %d", aImageList.Count());
+ aInvalidCount = 0;
+ TInt lastError = KErrNone;
+ CRsImageParser *imageParser = CRsImageParser::NewLC();
+
+ for( TInt nCnt=0; nCnt < aImageList.Count(); ++nCnt )
+ {
+ LOG1("CImagePrintBody::ValidateImagesL nCnt: %d", nCnt);
+ LOG1("CImagePrintBody::ValidateImagesL image: %S", aImageList[nCnt]);
+ TBool valid;
+ imageParser->ValidateL(*(aImageList[nCnt]), valid, lastError);
+ LOG1("CImagePrintBody::ValidateImagesL valid: %d", valid);
+ LOG1("CImagePrintBody::ValidateImagesL lastError: %d", lastError);
+ if( !valid )
+ {
+ ++aInvalidCount;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(imageParser);
+ LOG1("CImagePrintBody::ValidateImagesL aInvalidCount: %d", aInvalidCount);
+ LOG1("CImagePrintBody::ValidateImagesL ends with: %d", lastError);
+ return lastError;
+ }
+
+void CImagePrintBody::TryNextDiscovery()
+ {
+ LOG("CImagePrintBody::TryNextDiscovery begin");
+ iIdleDiscovery->Cancel();
+ iIdleDiscovery->Start(TCallBack(TryNextDiscoveryL, this));
+ LOG("CImagePrintBody::TryNextDiscovery end");
+ }
+
+void CImagePrintBody::DoTryNextDiscoveryL()
+ {
+ LOG("CImagePrintBody::DoTryNextDiscoveryL begin");
+ TUint doDiscovery = iProtocolsRequested & iClassLoader->SupportedProtocols();
+ LOG1("CImagePrintBody::DoTryNextDiscoveryL doDiscovery: %d", doDiscovery);
+ if( doDiscovery )
+ {
+ TBool found( EFalse );
+ TInt protId( 0 );
+ TInt count = iClassLoader->GetNumberOfProtocolsAvailable();
+ LOG1("CImagePrintBody::DoTryNextDiscoveryL count: %d", count);
+ for( TInt i = 0; i < count && !found; i++ )
+ {
+ iCurrentProtocol = iClassLoader->GetNextProtocol();
+ protId = iCurrentProtocol->SupportedProtocols();
+ if( iProtocolsRequested & protId ) found = ETrue;
+ }
+ LOG1("CImagePrintBody::DoTryNextDiscoveryL found: %d", found);
+ LOG1("CImagePrintBody::DoTryNextDiscoveryL protId: %d", protId);
+ if( found )
+ {
+ TUint temp = KMaxTUint ^ protId;
+ iProtocolsRequested &= temp;
+ LOG1("CImagePrintBody::DoTryNextDiscoveryL iProtocolsRequested: %d", iProtocolsRequested);
+ ActiveScheduler().SetCurrentProtocol( protId );
+ iCurrentProtocol->StartDiscoveryL( *this, protId );
+ }
+ }
+ else
+ {
+ iPrinterDiscoveryObserver->DiscoveryStatusL( EDiscoveryFinished, 0, 0 );
+ }
+ LOG("CImagePrintBody::DoTryNextDiscoveryL end");
+ }
+
+TInt CImagePrintBody::TryNextDiscoveryL(TAny* aObj)
+ {
+ LOG("CImagePrintBody::TryNextDiscoveryL begin");
+ CImagePrintBody* obj = static_cast<CImagePrintBody*>(aObj);
+ obj->DoTryNextDiscoveryL();
+ LOG("CImagePrintBody::TryNextDiscoveryL end");
+ return EFalse;
+ }
+
+void CImagePrintBody::SetNumsOfCopiesL( const RArray<TInt>& aNumsOfCopies, TInt& aErr )
+ {
+ LOG1("CImagePrintBody::SetNumberOfCopiesL aNumsOfCopies.Count(): %d", aNumsOfCopies.Count());
+
+ if( iCurrentPrintJobProtocol )
+ {
+ iCurrentPrintJobProtocol->SetNumsOfCopiesL( aNumsOfCopies, aErr );
+ LOG1("CImagePrintBody::SetNumberOfCopiesL aErr: %d", aErr);
+ }
+
+ LOG("CImagePrintBody::SetNumberOfCopiesL end");
+ }
+
+void CImagePrintBody::HandleSessionDisconnect( const MIdleObserver* aIdleObserver,
+ const MPrinterDiscoveryObserver* aDiscoveryObserver,
+ const MPrintEventObserver* aEventObserver )
+ {
+ LOG1("CImagePrintBody::HandleSessionDisconnect aIdleObserver address: %d", aIdleObserver);
+ LOG1("CImagePrintBody::HandleSessionDisconnect iPrinterIdleObserver address: %d", iPrinterIdleObserver);
+ LOG1("CImagePrintBody::HandleSessionDisconnect aDiscoveryObserver address: %d", aDiscoveryObserver);
+ LOG1("CImagePrintBody::HandleSessionDisconnect iPrinterDiscoveryObserver address: %d", iPrinterDiscoveryObserver);
+ LOG1("CImagePrintBody::HandleSessionDisconnect aEventObserver address: %d", aEventObserver);
+ LOG1("CImagePrintBody::HandleSessionDisconnect iPrinterPrintEventObserver address: %d", iPrinterPrintEventObserver);
+ if( aIdleObserver == iPrinterIdleObserver ) iPrinterIdleObserver = NULL;
+ if( aEventObserver == iPrinterPrintEventObserver ) iPrinterPrintEventObserver = NULL;
+ if( aDiscoveryObserver == iPrinterDiscoveryObserver ) iPrinterDiscoveryObserver = NULL;
+ LOG("CImagePrintBody::HandleSessionDisconnect end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintscheduler.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cimageprintscheduler.h"
+#include "mprotprintingdevice.h"
+#include "tidleevent.h"
+#include "printmessagecodes.h"
+#include "clog.h"
+
+void CImagePrintScheduler::Error(TInt aError) const
+ {
+ LOG1("CImagePrintScheduler::Error aError: %d", aError);
+ if( iIdleObserver )
+ {
+ TEvent event;
+ event.iProtocol = iCurrentProtocol;
+ event.iSeverity = ESevere;
+ event.iEventType = EAsynchronousLeave;
+ LOG("CImagePrintScheduler::Error informing observer");
+ iIdleObserver->StatusEvent( event, aError, ENoMessage );
+ }
+ LOG("CImagePrintScheduler::Error end");
+ }
+
+void CImagePrintScheduler::SetIdleObserver( MProtIdleObserver& aIdleObserver )
+ {
+ LOG("CImagePrintScheduler::SetIdleObserver begin");
+ iIdleObserver = &aIdleObserver;
+ LOG("CImagePrintScheduler::SetIdleObserver end");
+ }
+
+void CImagePrintScheduler::SetCurrentProtocol( TInt aProtocol )
+ {
+ LOG1("CImagePrintScheduler::SetCurrentProtocol aProtocol: %d", aProtocol);
+ iCurrentProtocol = aProtocol;
+ LOG("CImagePrintScheduler::SetCurrentProtocol end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintserver.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cimageprintserver.h"
+#include "imageprintclientserver.h"
+#include "cimageprintsession.h"
+#include "clog.h"
+#include "cimageprintbody.h"
+
+namespace
+ {
+ // panic
+ _LIT( KImagePrintServerPanic, "CIPSer" );
+ enum TImagePrintServerPanic
+ {
+ EBadDescriptor
+ };
+
+ void PanicClient( const RMessage2& aMessage, TImagePrintServerPanic aCategory )
+ {
+ aMessage.Panic( KImagePrintServerPanic, aCategory );
+ }
+ }
+
+
+CImagePrintServer* CImagePrintServer::NewLC()
+ {
+ CImagePrintServer* server = new (ELeave) CImagePrintServer();
+ CleanupStack::PushL( server ) ;
+ server->ConstructL();
+ return server;
+ }
+
+
+CImagePrintServer::CImagePrintServer()
+ : CPolicyServer( 0, KImagePrintPolicy, ESharableSessions )
+ {
+ }
+
+CImagePrintServer::~CImagePrintServer()
+ {
+ LOG("CImagePrintServer::~CImagePrintServer begin");
+ delete iEngine;
+ iFbs.Disconnect();
+ LOG("CImagePrintServer::~CImagePrintServer end");
+ }
+
+void CImagePrintServer::ConstructL()
+ {
+ LOG("CImagePrintServer::ConstructL begin");
+ StartL( KImagePrintServerName );
+ User::LeaveIfError( iFbs.Connect() );
+ iEngine = CImagePrintBody::NewL();
+ LOG("CImagePrintServer::ConstructL end");
+ }
+
+void CImagePrintServer::AddSession()
+ {
+ LOG("CImagePrintServer::AddSession begin");
+ ++iConnsCount;
+ LOG("CImagePrintServer::AddSession end");
+ }
+
+void CImagePrintServer::RemoveSession()
+ {
+ --iConnsCount;
+ LOG1("CImagePrintServer::RemoveSession iConnsCount: %d", iConnsCount);
+ if( iConnsCount == 0 )
+ {
+ delete iEngine;
+ iEngine = NULL;
+ iFbs.Disconnect();
+ CActiveScheduler::Stop();
+ }
+ LOG("CImagePrintServer::RemoveSession end");
+ }
+
+TInt CImagePrintServer::SessionCount() const
+ {
+ LOG("CImagePrintServer::SessionCount begin");
+ LOG1("CImagePrintServer::SessionCount return: %d", iConnsCount);
+ return iConnsCount;
+ }
+
+TInt CImagePrintServer::RunError( TInt aError )
+ {
+ LOG1("CImagePrintServer::RunError aError: %d", aError);
+ if( aError == KErrBadDescriptor )
+ {
+ PanicClient( Message(), EBadDescriptor );
+ }
+ else
+ {
+ Message().Complete( aError );
+ }
+ ReStart();
+ LOG("CImagePrintServer::RunError end");
+ return KErrNone;
+ }
+
+
+CSession2* CImagePrintServer::NewSessionL( const TVersion& aVersion, const RMessage2& ) const
+ {
+ LOG("CImagePrintServer::NewSessionL begin");
+ TBool supported = User::QueryVersionSupported( TVersion( KImagePrintServerMajor,
+ KImagePrintServerMinor,
+ KImagePrintServerBuild ),
+ aVersion );
+ if( !supported )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ LOG("CImagePrintServer::NewSessionL end");
+ return new (ELeave) CImagePrintSession();
+ }
+
+TInt CImagePrintServer::ReserveEngine( const CSession2* aSession )
+ {
+ LOG("CImagePrintServer::ReserveEngine begin");
+ TInt err( KErrInUse );
+ if( iEngineHolder == aSession || !iEngineHolder )
+ {
+ iEngineHolder = aSession;
+ err = KErrNone;
+ }
+ LOG1("CImagePrintServer::ReserveEngine return: %d", err);
+ return err;
+ }
+
+TInt CImagePrintServer::ReleaseEngine( const CSession2* aSession )
+ {
+ LOG("CImagePrintServer::ReleaseEngine begin");
+ TInt err( KErrInUse );
+ if( iEngineHolder == aSession || !iEngineHolder )
+ {
+ iEngineHolder = NULL;
+ err = KErrNone;
+ }
+ LOG1("CImagePrintServer::ReleaseEngine return: %d", err);
+ return err;
+ }
+
+CImagePrintBody& CImagePrintServer::Engine() const
+ {
+ LOG("CImagePrintServer::Engine begin");
+ LOG("CImagePrintServer::Engine end");
+ return *iEngine;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintsession.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,799 @@
+/*
+* 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:
+*
+*/
+
+
+#include <usbman.h>
+#include <usbstates.h>
+#include <usbpersonalityids.h>
+
+#include "cimageprintsession.h"
+#include "imageprintclientserver.h"
+#include "cimageprintserver.h"
+#include "clog.h"
+#include "cimageprintbody.h"
+#include "cserveridleguard.h"
+#include "cserverdiscoveryguard.h"
+#include "cserverjobguard.h"
+#include "cnumofcopies.h"
+
+namespace
+ {
+ // panic
+ _LIT( KImagePrintSessionPanic, "CIPSes" );
+ enum TImagePrintSessionPanic
+ {
+ ENotSupported
+ };
+
+ void PanicClient( const TMessageWrp2& aMessage, TImagePrintSessionPanic aCategory )
+ {
+ aMessage.Panic( KImagePrintSessionPanic, aCategory );
+ }
+ }
+
+CImagePrintSession::~CImagePrintSession()
+ {
+ LOG("CImagePrintSession::~CImagePrintSession begin");
+ delete iNumOfCopies;
+ delete iIdleGuard;
+ delete iDiscoveryGuard;
+ delete iJobGuard;
+ iCapabilityIDs.Close();
+ iMsgWrappers.ResetAndDestroy();
+ iMsgWrappers.Close();
+ Server().ReleaseEngine( this );
+ Server().RemoveSession();
+ LOG("CImagePrintSession::~CImagePrintSession end");
+ }
+
+CImagePrintServer& CImagePrintSession::Server()
+ {
+ return *static_cast<CImagePrintServer*>( const_cast<CServer2*>( CSession2::Server() ) );
+ }
+
+void CImagePrintSession::CreateL()
+ {
+ LOG("CImagePrintSession::CreateL begin");
+ Server().AddSession();
+ iIdleGuard = CServerIdleGuard::NewL( Server().Engine() );
+ iDiscoveryGuard = CServerDiscoveryGuard::NewL( Server().Engine() );
+ iJobGuard = CServerJobGuard::NewL( Server().Engine() );
+ iNumOfCopies = CNumOfCopies::NewL();
+ iConnected = ETrue;
+ LOG("CImagePrintSession::CreateL end");
+ }
+
+void CImagePrintSession::Disconnect(const RMessage2 &aMessage)
+ {
+ LOG("CImagePrintSession::Disconnect begin");
+ Server().Engine().HandleSessionDisconnect( iIdleGuard, iDiscoveryGuard, iJobGuard );
+ iConnected = EFalse;
+ CSession2::Disconnect( aMessage );
+ LOG("CImagePrintSession::Disconnect end");
+ }
+
+void CImagePrintSession::ServiceL( const RMessage2& aMessage )
+ {
+ LOG1("CImagePrintSession::ServiceL aMessage.Function(): %d", aMessage.Function());
+
+ // wrapper array clean begin
+ TInt index = iMsgWrappers.Count();
+ LOG1("CImagePrintSession::ServiceL index: %d", index);
+ TBool result( EFalse );
+ while( --index >= 0 && !result )
+ {
+ if( ( iMsgWrappers[index] )->Disposable() )
+ {
+ TMessageWrp2* toDispose = iMsgWrappers[index];
+ iMsgWrappers.Remove( index );
+ delete toDispose;
+ toDispose = NULL;
+ result = ETrue;
+ }
+ }
+ // wrapper array clean end
+
+ TMessageWrp2* msgWrapper = new (ELeave) TMessageWrp2( aMessage, iConnected );
+ TInt err = iMsgWrappers.Insert( msgWrapper, 0 );
+ if( err )
+ {
+ delete msgWrapper;
+ User::Leave( err );
+ }
+ else
+ {
+ msgWrapper = NULL;
+ }
+
+ TInt messageIndex = aMessage.Function();
+
+ if ( messageIndex <= EContinuePrintJob )
+ {
+ ServiceFirstPartL( messageIndex );
+ }
+ else if ( messageIndex >= ERemoveCachedPrinter && messageIndex <= EGetPrinterCapHigh )
+ {
+ ServiceSecondPartL( messageIndex );
+ }
+ else if ( messageIndex >= EGetPrinterCapEnumCount && messageIndex <= ESetNumberOfCopies )
+ {
+ ServiceThirdPartL ( messageIndex );
+ }
+ else
+ {
+ PanicClient( *iMsgWrappers[0], ENotSupported );
+ }
+
+ LOG("CImagePrintSession::ServiceL end");
+ }
+void CImagePrintSession::ServiceFirstPartL( TInt aIndex )
+ {
+ switch( aIndex )
+ {
+ case ECountConnections:
+ CountConnectionsL( *iMsgWrappers[0] );
+ break;
+
+ case ESetForeground:
+ SetForegroundL( *iMsgWrappers[0] );
+ break;
+
+ case EReserveEngine:
+ ReserveEngine( *iMsgWrappers[0] );
+ break;
+
+ case EReleaseEngine:
+ ReleaseEngine( *iMsgWrappers[0] );
+ break;
+
+ case ESupportedProtocols:
+ SupportedProtocols( *iMsgWrappers[0] );
+ break;
+
+ case EGetNumPrintPages:
+ GetNumPrintPages( *iMsgWrappers[0] );
+ break;
+
+ case EGetJobStatus:
+ GetJobStatus( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterStatus:
+ GetPrinterStatus( *iMsgWrappers[0] );
+ break;
+
+ case ECancelDiscovery:
+ CancelDiscovery( *iMsgWrappers[0] );
+ break;
+
+ case ESubmitPrintJob:
+ SubmitPrintJobL( *iMsgWrappers[0] );
+ break;
+
+ case ECancelPrintJob:
+ CancelPrintJob( *iMsgWrappers[0] );
+ break;
+
+ case EContinuePrintJob:
+ ContinuePrintJobL( *iMsgWrappers[0] );
+ break;
+
+ default:
+ LOG1("[CImagePrintSession::ServiceFirstPartL]\t Method reached to an end with index: %d", aIndex);
+ break;
+ }
+ }
+
+void CImagePrintSession::ServiceSecondPartL( TInt aIndex )
+ {
+ switch( aIndex )
+ {
+ case ERemoveCachedPrinter:
+ RemoveCachedPrinterL( *iMsgWrappers[0] );
+ break;
+
+ case EGetJobTemplateIcon:
+ GetJobTemplateIconL( *iMsgWrappers[0] );
+ break;
+
+ case EGetNumPreviewPages:
+ GetNumPreviewPages( *iMsgWrappers[0] );
+ break;
+
+ case ESetJobSetting:
+ SetJobSettingL( *iMsgWrappers[0] );
+ break;
+
+ case EGetJobSetting:
+ GetJobSettingL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapability:
+ GetPrinterCapabilityL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapId:
+ GetPrinterCapIdL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapType:
+ GetPrinterCapTypeL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapDef:
+ GetPrinterCapDefL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapLow:
+ GetPrinterCapLowL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapHigh:
+ GetPrinterCapHighL( *iMsgWrappers[0] );
+ break;
+
+ default:
+ LOG1("[CImagePrintSession::ServiceSecondPartL]\t Method reached to an end with index: %d", aIndex);
+ break;
+ }
+ }
+
+void CImagePrintSession::ServiceThirdPartL( TInt aIndex )
+ {
+ switch( aIndex )
+ {
+ case EGetPrinterCapEnumCount:
+ GetPrinterCapEnumCountL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapEnum:
+ GetPrinterCapEnumL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapabilityIDsCount:
+ GetPrinterCapabilityIDsCountL( *iMsgWrappers[0] );
+ break;
+
+ case EGetPrinterCapabilityID:
+ GetPrinterCapabilityIDL( *iMsgWrappers[0] );
+ break;
+
+ case ERegisterIdleObserver:
+ RegisterIdleObserverL( *iMsgWrappers[0] );
+ break;
+
+ case ECancelRegisterIdleObserver:
+ CancelRegisterIdleObserverL( *iMsgWrappers[0] );
+ break;
+
+ case EStartDiscovery:
+ StartDiscoveryL( *iMsgWrappers[0] );
+ break;
+
+ case EContinueDiscovery:
+ ContinueDiscoveryL( *iMsgWrappers[0] );
+ break;
+
+ case EPrepareJob:
+ PrepareJobL( *iMsgWrappers[0] );
+ break;
+
+ case ECreateJob:
+ CreateJobL( *iMsgWrappers[0] );
+ break;
+
+ case EContinueCreateJob:
+ ContinueCreateJobL( *iMsgWrappers[0] );
+ break;
+
+ case ECancelStartDiscovery:
+ CancelStartDiscoveryL( *iMsgWrappers[0] );
+ break;
+
+ case ECancelCreateJob:
+ CancelCreateJobL( *iMsgWrappers[0] );
+ break;
+
+ case EIsPictBridgeMode:
+ IsPictBridgeModeL( *iMsgWrappers[0] );
+ break;
+
+ case ESetNumberOfCopiesCount:
+ SetNumberOfCopiesCountL( *iMsgWrappers[0] );
+ break;
+
+ case ESetNumberOfCopies:
+ SetNumberOfCopiesL( *iMsgWrappers[0] );
+ break;
+
+ default:
+ LOG1("[CImagePrintSession::ServiceThirdPartL]\t Method reached to an end with index: %d", aIndex);
+ break;
+ }
+ }
+
+
+void CImagePrintSession::CountConnectionsL( TMessageWrp2& aMessage )
+ {
+ TInt count = Server().SessionCount();
+ TPckgC<TInt> countDes( count );
+ aMessage.WriteL( 0, countDes );
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( KErrNone );
+ }
+
+void CImagePrintSession::SetForegroundL( TMessageWrp2& aMessage )
+ {
+ TInt fg = aMessage.Int0();
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( KErrNone );
+ }
+
+void CImagePrintSession::ReserveEngine( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::ReleaseEngine( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReleaseEngine( this );
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::SupportedProtocols( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ aMessage.SetDisposable( ETrue );
+ if( !err )
+ {
+ TInt protocols = Server().Engine().SupportedProtocols();
+ aMessage.Complete( protocols );
+ }
+ else
+ {
+ aMessage.Complete( err );
+ }
+ }
+
+void CImagePrintSession::GetNumPrintPages( TMessageWrp2& aMessage )
+{
+ TInt err = Server().ReserveEngine( this );
+ aMessage.SetDisposable( ETrue );
+ if( !err )
+ {
+ TInt pages = Server().Engine().GetNumPrintPages();
+ aMessage.Complete( pages );
+ }
+ else
+ {
+ aMessage.Complete( err );
+ }
+ }
+
+void CImagePrintSession::GetJobStatus( TMessageWrp2& aMessage )
+{
+ TInt err = Server().ReserveEngine( this );
+ aMessage.SetDisposable( ETrue );
+ if( !err )
+ {
+ TInt status = Server().Engine().GetJobStatus();
+ aMessage.Complete( status );
+ }
+ else
+ {
+ aMessage.Complete( err );
+ }
+ }
+
+void CImagePrintSession::GetPrinterStatus( TMessageWrp2& aMessage )
+{
+ TInt err = Server().ReserveEngine( this );
+ aMessage.SetDisposable( ETrue );
+ if( !err )
+ {
+ TInt id = aMessage.Int0();
+ TInt status = Server().Engine().GetPrinterStatus( id );
+ aMessage.Complete( status );
+ }
+ else
+ {
+ aMessage.Complete( err );
+ }
+ }
+
+void CImagePrintSession::CancelDiscovery( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ Server().Engine().CancelDiscovery();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::SubmitPrintJobL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ Server().Engine().SubmitPrintJobL();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::CancelPrintJob( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ err = Server().Engine().CancelPrintJob();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::ContinuePrintJobL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ err = Server().Engine().ContinuePrintJobL();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::RemoveCachedPrinterL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt id = aMessage.Int0();
+ err = Server().Engine().RemoveCachedPrinterL( id );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetJobTemplateIconL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt id = aMessage.Int0();
+ TInt handle;
+ err = Server().Engine().GetJobTemplateIconL( id, handle );
+ TPckgC<TInt> handleDes( handle );
+ aMessage.WriteL( 1, handleDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetNumPreviewPages( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ aMessage.SetDisposable( ETrue );
+ if( !err )
+ {
+ TInt num = Server().Engine().GetNumPreviewPages();
+ aMessage.Complete( num );
+ }
+ else
+ {
+ aMessage.Complete( err );
+ }
+ }
+
+void CImagePrintSession::SetJobSettingL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt capabilityID = aMessage.Int0();
+ TInt value = aMessage.Int1();
+ TInt affectedCapability;
+
+ LOG2("CImagePrintSession::SetJobSettingL || capabilityID = %d, value = %d", capabilityID, value );
+
+ err = Server().Engine().SetJobSettingL( capabilityID, value, affectedCapability );
+ TPckgC<TInt> affectedCapabilityDes( affectedCapability );
+ aMessage.WriteL( 2, affectedCapabilityDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetJobSettingL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt capabilityID = aMessage.Int0();
+ TInt value;
+ err = Server().Engine().GetJobSetting( capabilityID, value );
+ TPckgC<TInt> valueDes( value );
+ aMessage.WriteL( 1, valueDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapabilityL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt printerID = aMessage.Int0();
+ TInt capabilityID = aMessage.Int1();
+ err = Server().Engine().GetPrinterCapabilityL( printerID, capabilityID, iCapability );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapIdL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TPckgC<TInt> capIdDes( iCapability.iCapabilityID );
+ aMessage.WriteL( 0, capIdDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapTypeL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TPckgC<TInt> typeDes( iCapability.iType );
+ aMessage.WriteL( 0, typeDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapDefL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TPckgC<TInt> defDes( iCapability.iDefaultValue );
+ aMessage.WriteL( 0, defDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapLowL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TPckgC<TInt> lowDes( iCapability.iLow );
+ aMessage.WriteL( 0, lowDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapHighL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TPckgC<TInt> highDes( iCapability.iHigh );
+ aMessage.WriteL( 0, highDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapEnumCountL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TPckgC<TInt> countDes( iCapability.iEnumCount );
+ aMessage.WriteL( 0, countDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapEnumL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt index = aMessage.Int0();
+ TPckgC<TInt> enumDes( iCapability.iEnumCodes[index] );
+ aMessage.WriteL( 1, enumDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+
+void CImagePrintSession::GetPrinterCapabilityIDsCountL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ iCapabilityIDs.Reset();
+ TInt printerID = aMessage.Int0();
+ err = Server().Engine().GetPrinterCapabilityIDsL( printerID, iCapabilityIDs );
+ if( !err )
+ {
+ TInt count = iCapabilityIDs.Count();
+ TPckgC<TInt> countDes( count );
+ aMessage.WriteL( 1, countDes );
+ }
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::GetPrinterCapabilityIDL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ TInt index = aMessage.Int0();
+ TInt id = iCapabilityIDs[index];
+ TPckgC<TInt> idDes( id );
+ aMessage.WriteL( 1, idDes );
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::RegisterIdleObserverL( TMessageWrp2& aMessage )
+ {
+ iIdleGuard->Guard( aMessage );
+ }
+
+void CImagePrintSession::CancelRegisterIdleObserverL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ iIdleGuard->Stop();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::StartDiscoveryL( TMessageWrp2& aMessage )
+ {
+ TInt err = iDiscoveryGuard->StartL( aMessage );
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::ContinueDiscoveryL( TMessageWrp2& aMessage )
+ {
+ iDiscoveryGuard->ContinueL( aMessage );
+ }
+
+void CImagePrintSession::PrepareJobL( TMessageWrp2& aMessage )
+ {
+ iJobGuard->PrepareL( aMessage );
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( KErrNone );
+ }
+
+void CImagePrintSession::CreateJobL( TMessageWrp2& aMessage )
+ {
+ TInt err = iJobGuard->CreateL( aMessage );
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::ContinueCreateJobL( TMessageWrp2& aMessage )
+ {
+ iJobGuard->ContinueCreateL( aMessage );
+ }
+
+void CImagePrintSession::CancelStartDiscoveryL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ iDiscoveryGuard->Stop();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::CancelCreateJobL( TMessageWrp2& aMessage )
+ {
+ TInt err = Server().ReserveEngine( this );
+ if( !err )
+ {
+ iJobGuard->Stop();
+ }
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::IsPictBridgeModeL( TMessageWrp2& aMessage )
+ {
+ RUsb usbManager;
+ TUsbDeviceState dState;
+ TInt personality;
+ TInt err = EFalse;
+ User::LeaveIfError( usbManager.Connect());
+ User::LeaveIfError( usbManager.GetDeviceState(dState));
+ User::LeaveIfError( usbManager.GetCurrentPersonalityId(personality));
+ usbManager.Close();
+
+ /*
+ * If there is some problems with pictbridge, check from usbpersonalityids.h that constants haven't been changed.
+ */
+ if( dState == EUsbDeviceStateConfigured && personality == KUsbPersonalityIdMTP )
+ err = ETrue;
+
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::SetNumberOfCopiesCountL( TMessageWrp2& aMessage )
+ {
+ LOG("CImagePrintSession::CheckNumberOfCopiesL begin");
+ TInt count = aMessage.Int0();
+ LOG1("CImagePrintSession::CheckNumberOfCopiesL count: %d", count);
+ TInt err = ( count > 0 ) ? KErrNone : KErrInvalidData;
+ if( !err )
+ {
+ iNumOfCopies->Reset( count );
+ }
+ LOG1("CImagePrintSession::CheckNumberOfCopiesL return: %d", err);
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+void CImagePrintSession::SetNumberOfCopiesL( TMessageWrp2& aMessage )
+ {
+ LOG("CImagePrintSession::SetNumberOfCopiesL begin");
+ TInt copies = aMessage.Int0();
+ LOG1("CImagePrintSession::SetNumberOfCopiesL copies: %d", copies);
+ TInt err = ( copies < 0 ) ? KErrInvalidData : KErrNone;
+ if( !err )
+ {
+ TBool full;
+ iNumOfCopies->AddNumOfCopyL( copies, full );
+ LOG1("CImagePrintSession::SetNumberOfCopiesL full: %d", full);
+ if( full )
+ {
+ Server().Engine().SetNumsOfCopiesL( iNumOfCopies->NumsOfCopies(), err );
+ }
+ }
+ LOG1("CImagePrintSession::SetNumberOfCopiesL return: %d", err);
+ aMessage.SetDisposable( ETrue );
+ aMessage.Complete( err );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cnumofcopies.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,67 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cnumofcopies.h"
+#include "clog.h"
+
+CNumOfCopies* CNumOfCopies::NewL()
+ {
+ CNumOfCopies* obj = new (ELeave) CNumOfCopies();
+ CleanupStack::PushL( obj ) ;
+ obj->ConstructL();
+ CleanupStack::Pop(); // obj
+ return obj;
+ }
+
+CNumOfCopies::~CNumOfCopies()
+ {
+ LOG("CNumOfCopies::~CNumOfCopies begin");
+ iNumsOfCopies.Close();
+ LOG("CNumOfCopies::~CNumOfCopies end");
+ }
+
+CNumOfCopies::CNumOfCopies() : iCount( 0 )
+ {
+ }
+
+void CNumOfCopies::ConstructL()
+ {
+ }
+
+void CNumOfCopies::Reset( TInt aCount )
+ {
+ LOG("CNumOfCopies::Reset begin");
+ iCount = aCount;
+ iNumsOfCopies.Reset();
+ LOG("CNumOfCopies::Reset end");
+ }
+
+void CNumOfCopies::AddNumOfCopyL( TInt aNumOfCopies, TBool& aFull )
+ {
+ LOG1("CNumOfCopies::AddNumOfCopyL aNumOfCopies: %d", aNumOfCopies);
+ iNumsOfCopies.AppendL( aNumOfCopies );
+ aFull = ( iNumsOfCopies.Count() == iCount ) ? ETrue : EFalse;
+ LOG1("CNumOfCopies::AddNumOfCopyL end with aFull: %d", aFull);
+ }
+
+const RArray<TInt>& CNumOfCopies::NumsOfCopies() const
+ {
+ return iNumsOfCopies;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cprotocolsloader.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,190 @@
+/*
+* 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/crsimageparser.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,163 @@
+/*
+* 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 CRsImageParser class definition.
+*
+*/
+
+
+// RsImageParser.cpp: implementation of the CRsImageParser class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "crsimageparser.h"
+#include "clog.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CRsImageParser* CRsImageParser::NewLC()
+ {
+ CRsImageParser* self = new (ELeave) CRsImageParser();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+
+void CRsImageParser::ConstructL()
+ {
+ User::LeaveIfError(iFs.Connect());
+ }
+
+
+CRsImageParser::~CRsImageParser()
+ {
+ iFs.Close();
+ }
+
+CRsImageParser::CRsImageParser()
+ {
+ }
+
+void CRsImageParser::ValidateL( const TDesC& aFileName, TBool& aValid, TInt& aErr )
+ {
+ LOG1("CRsImageParser::ValidateL aFileName: %S", &aFileName);
+ aValid = EFalse;
+ TInt dataPos( 0 );
+ TBuf8<9> imgData;
+ TBool bAllDone( EFalse );
+ TInt height( 0 );
+ TInt width( 0 );
+ TInt startOfDataOffset( 0 );
+ TInt encoding( EUnknown );
+ TInt size( 0 );
+
+ RFile file;
+ aErr = file.Open( iFs, aFileName, EFileRead | EFileShareReadersOnly );
+ LOG1("CRsImageParser::ValidateL file.Open (shareread mode): %d", aErr);
+ if ( aErr != KErrNone )
+ {
+ aErr = file.Open( iFs, aFileName, EFileRead | EFileShareAny );
+ LOG1("CRsImageParser::ValidateL file.Open (shareany mode): %d", aErr);
+ }
+
+ // magic numbers used here are JPEG format related
+ else // if ( aErr == KErrNone ) // 1 IF
+ {
+ CleanupClosePushL( file );
+ aErr = file.Size( size );
+ if( size && aErr == KErrNone ) // 2 IF
+ {
+ aErr = ReadData( file, dataPos, imgData );
+ if( aErr == KErrNone && imgData.Length() == 9 ) // 3 IF
+ {
+ // First check for the JPEG header "FF D8"
+ if( imgData[0] == 0xff && imgData[1] == 0xd8 ) // 4 IF
+ {
+ // Start skipping headers until we find the one we're looking for
+ dataPos = (imgData[4] << 8) + imgData[5] + 4;
+
+ aErr = ReadData( file, dataPos, imgData );
+
+ while( aErr == KErrNone && imgData.Length() == 9 && imgData[0] == 0xff )
+ {
+ switch( imgData[1] )
+ {
+ case 0xda:
+ // Start of data
+ startOfDataOffset = dataPos + ((imgData[2] << 8) + imgData[3] + 2);
+ bAllDone = ETrue;
+ break;
+
+ case EDiffArithLossless:
+ encoding = imgData[1];
+ height = (imgData[5] << 8) + imgData[6];
+ width = (imgData[7] << 8) + imgData[8];
+ break;
+
+ default:
+ break;
+ } // SWITCH
+
+ if( bAllDone )
+ {
+ break;
+ }
+ else
+ {
+ dataPos += (imgData[2] << 8) + imgData[3] + 2;
+ aErr = ReadData( file, dataPos, imgData );
+ }
+ } // WHILE
+ } // 4 IF
+ else
+ {
+ // Not a JPG
+ aErr = KErrCorrupt;
+ }
+ } // 3 IF
+ } // 2 IF
+
+ CleanupStack::PopAndDestroy( &file );
+ } // 1 IF
+
+ aValid = Validate( startOfDataOffset, width, height, size, encoding, aErr );
+
+ LOG1("CRsImageParser::ValidateL aValid: %d", aValid);
+ LOG1("CRsImageParser::ValidateL aErr: %d", aErr);
+ LOG("CRsImageParser::ValidateL end");
+ }
+
+TBool CRsImageParser::Validate( TInt aStartOfDataOffset, TInt aWidth, TInt aHeight, TInt aSize, TInt aEncoding, TInt aErr )
+ {
+ if ( aStartOfDataOffset && aWidth && aHeight && aSize && aEncoding && !aErr )
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+TInt CRsImageParser::ReadData( RFile& aFile, TInt aStartByte, TDes8& aData )
+ {
+ LOG("CRsImageParser::ReadData begin");
+ TInt err = aFile.Read( aStartByte, aData );
+ LOG1("CRsImageParser::ReadData return: %d", err);
+ return err;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cserverdiscoveryguard.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,155 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cserverdiscoveryguard.h"
+#include "cimageprintbody.h"
+#include "clog.h"
+#include "tmessagewrp2.h"
+
+CServerDiscoveryGuard* CServerDiscoveryGuard::NewL( CImagePrintBody& aEngine )
+ {
+ CServerDiscoveryGuard* self = new ( ELeave ) CServerDiscoveryGuard( aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CServerDiscoveryGuard::CServerDiscoveryGuard( CImagePrintBody& aEngine ) : iEngine( aEngine ),
+ iRequestActive( EFalse )
+ {
+ }
+
+CServerDiscoveryGuard::~CServerDiscoveryGuard()
+ {
+ LOG("CServerDiscoveryGuard::~CServerDiscoveryGuard begin");
+ iBuffer.Close();
+ LOG("CServerDiscoveryGuard::~CServerDiscoveryGuard end");
+ }
+
+void CServerDiscoveryGuard::ConstructL()
+ {
+ }
+
+TInt CServerDiscoveryGuard::StartL( TMessageWrp2& aMessage )
+ {
+ LOG("CServerDiscoveryGuard::StartL begin");
+ iRequestActive = EFalse;
+ iBuffer.Reset();
+ TInt protocols = aMessage.Int0();
+ TInt err = iEngine.StartDiscovery( *this, protocols );
+ LOG1("CServerDiscoveryGuard::StartL err: %d", err);
+ return err;
+ }
+
+void CServerDiscoveryGuard::ContinueL( TMessageWrp2& aMessage )
+ {
+ LOG("CServerDiscoveryGuard::ContinueL begin");
+ if( iMessage ) iMessage->SetDisposable( ETrue );
+ iMessage = &aMessage;
+ iRequestActive = ETrue;
+ if( iBuffer.Count() )
+ {
+ LOG("CServerDiscoveryGuard::ContinueL before ProcessL");
+ ProcessL();
+ LOG("CServerDiscoveryGuard::ContinueL after ProcessL");
+ }
+ LOG("CServerDiscoveryGuard::ContinueL end");
+ }
+
+void CServerDiscoveryGuard::Stop()
+ {
+ LOG("CServerDiscoveryGuard::Stop begin");
+ iBuffer.Reset();
+ if( iRequestActive )
+ {
+ LOG("CServerDiscoveryGuard::Stop cancelling...");
+ iMessage->Complete( KErrCancel );
+ iRequestActive = EFalse;
+ }
+ LOG("CServerDiscoveryGuard::Stop end");
+ }
+
+void CServerDiscoveryGuard::FoundPrinterL(const TPrinter& aPrinterInfo)
+ {
+ LOG("CServerDiscoveryGuard::FoundPrinterL begin");
+ LOG1("CServerDiscoveryGuard::FoundPrinterL aPrinterInfo.iProtocol: %d", aPrinterInfo.iProtocol);
+ LOG1("CServerDiscoveryGuard::FoundPrinterL aPrinterInfo.iProperties: %d", aPrinterInfo.iProperties);
+ LOG1("CServerDiscoveryGuard::FoundPrinterL aPrinterInfo.iPrinterID: %d", aPrinterInfo.iPrinterID);
+ LOG1("CServerDiscoveryGuard::FoundPrinterL aPrinterInfo.iDisplayName: %S", &(aPrinterInfo.iDisplayName));
+ LOG1("CServerDiscoveryGuard::FoundPrinterL aPrinterInfo.iVendor: %d", aPrinterInfo.iVendor);
+ TDiscoveryGuardData data;
+ data.iCb = TDiscoveryGuardData::EFoundCb;
+ data.iPrinterInfo = aPrinterInfo;
+ User::LeaveIfError( iBuffer.Append( data ) );
+ ProcessL();
+ LOG("CServerDiscoveryGuard::FoundPrinterL end");
+ }
+
+void CServerDiscoveryGuard::DiscoveryStatusL(TInt aStatus, TInt aErrorCode, TInt aErrorStringCode)
+ {
+ LOG("CServerDiscoveryGuard::DiscoveryStatusL begin");
+ LOG1("CServerDiscoveryGuard::DiscoveryStatusL aStatus: %d", aStatus);
+ LOG1("CServerDiscoveryGuard::DiscoveryStatusL aErrorCode: %d", aErrorCode);
+ LOG1("CServerDiscoveryGuard::DiscoveryStatusL aErrorStringCode: %d", aErrorStringCode);
+ TDiscoveryGuardData data;
+ data.iCb = TDiscoveryGuardData::EStatusCb;
+ data.iStatus = aStatus;
+ data.iErrorCode = aErrorCode;
+ data.iErrorStringCode = aErrorStringCode;
+ User::LeaveIfError( iBuffer.Append( data ) );
+ ProcessL();
+ LOG("CServerDiscoveryGuard::DiscoveryStatusL end");
+ }
+
+void CServerDiscoveryGuard::RemovePrinterL(const TPrinter& aPrinterInfo)
+ {
+ LOG("CServerDiscoveryGuard::RemovePrinterL begin");
+ LOG1("CServerDiscoveryGuard::RemovePrinterL aPrinterInfo.iProtocol: %d", aPrinterInfo.iProtocol);
+ LOG1("CServerDiscoveryGuard::RemovePrinterL aPrinterInfo.iProperties: %d", aPrinterInfo.iProperties);
+ LOG1("CServerDiscoveryGuard::RemovePrinterL aPrinterInfo.iPrinterID: %d", aPrinterInfo.iPrinterID);
+ LOG1("CServerDiscoveryGuard::RemovePrinterL aPrinterInfo.iDisplayName: %S", &(aPrinterInfo.iDisplayName));
+ TDiscoveryGuardData data;
+ data.iCb = TDiscoveryGuardData::ERemoveCb;
+ data.iPrinterInfo = aPrinterInfo;
+ User::LeaveIfError( iBuffer.Append( data ) );
+ ProcessL();
+ LOG("CServerDiscoveryGuard::RemovePrinterL end");
+ }
+
+void CServerDiscoveryGuard::ProcessL()
+ {
+ LOG("CServerDiscoveryGuard::ProcessL begin");
+ if( iBuffer.Count() && iRequestActive )
+ {
+ LOG("CServerDiscoveryGuard::ProcessL step 1");
+ TPtr8 ptr(reinterpret_cast<TUint8*>(&(iBuffer[0])), sizeof(iBuffer[0]), sizeof(iBuffer[0]));
+ LOG("CServerDiscoveryGuard::ProcessL step 2");
+ iMessage->WriteL( 0, ptr );
+ LOG("CServerDiscoveryGuard::ProcessL step 3");
+ iMessage->Complete( KErrNone );
+ LOG("CServerDiscoveryGuard::ProcessL step 4");
+ iRequestActive = EFalse;
+ LOG("CServerDiscoveryGuard::ProcessL step 5");
+ iBuffer.Remove( 0 );
+ LOG("CServerDiscoveryGuard::ProcessL step 6");
+ }
+ LOG("CServerDiscoveryGuard::ProcessL end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cserveridleguard.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,147 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cserveridleguard.h"
+#include "cimageprintbody.h"
+#include "tidleevent.h"
+#include "clog.h"
+#include "tmessagewrp2.h"
+
+CServerIdleGuard* CServerIdleGuard::NewL( CImagePrintBody& aEngine )
+ {
+ CServerIdleGuard* self = new ( ELeave ) CServerIdleGuard( aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CServerIdleGuard::CServerIdleGuard( CImagePrintBody& aEngine ) : iEngine( aEngine ),
+ iRequestActive( EFalse )
+ {
+ }
+
+CServerIdleGuard::~CServerIdleGuard()
+ {
+ LOG("CServerIdleGuard::~CServerIdleGuard begin");
+ iBuffer.Close();
+ LOG("CServerIdleGuard::~CServerIdleGuard end");
+ }
+
+void CServerIdleGuard::ConstructL()
+ {
+ }
+
+void CServerIdleGuard::StatusEvent( const TEvent &aEvent, TInt aError, TInt aMsgCode )
+ {
+ LOG("CServerIdleGuard::StatusEvent begin");
+ LOG1("CServerIdleGuard::StatusEvent aError: %d", aError);
+ LOG1("CServerIdleGuard::StatusEvent aMsgCode: %d", aMsgCode);
+ LOG1("CServerIdleGuard::StatusEvent aEvent.iProtocol: %d", aEvent.iProtocol);
+ LOG1("CServerIdleGuard::StatusEvent aEvent.iSeverity: %d", aEvent.iSeverity);
+ LOG1("CServerIdleGuard::StatusEvent aEvent.iEventType: %d", aEvent.iEventType);
+ TRAPD( err, DoStatusEventL( aEvent, aError, aMsgCode ) );
+ LOG1("CServerIdleGuard::StatusEvent DoStatusEventL's TRAP err: %d", err);
+ Process( err );
+ LOG("CServerIdleGuard::StatusEvent end");
+ }
+
+void CServerIdleGuard::Guard( TMessageWrp2& aMessage )
+ {
+ LOG("CServerIdleGuard::Guard begin");
+ if( iMessage ) iMessage->SetDisposable( ETrue );
+ iMessage = &aMessage;
+ iRequestActive = ETrue;
+ iEngine.RegisterIdleObserver( this );
+ if( iBuffer.Count() )
+ {
+ LOG("CServerIdleGuard::Guard before Process");
+ Process();
+ LOG("CServerIdleGuard::Guard after Process");
+ }
+ LOG("CServerIdleGuard::Guard end");
+ }
+
+void CServerIdleGuard::Stop()
+ {
+ LOG("CServerIdleGuard::Stop begin");
+ if( iRequestActive )
+ {
+ LOG("CServerIdleGuard::Stop cancelling...");
+ iMessage->Complete( KErrCancel );
+ iRequestActive = EFalse;
+ }
+ iEngine.RegisterIdleObserver( NULL );
+ LOG("CServerIdleGuard::Stop end");
+ }
+
+void CServerIdleGuard::DoStatusEventL( const TEvent &aEvent, TInt aError, TInt aMsgCode )
+ {
+ LOG("CServerIdleGuard::DoStatusEventL begin");
+ TIdleGuardData data;
+ data.iEvent = aEvent;
+ data.iError = aError;
+ data.iMsgCode = aMsgCode;
+ User::LeaveIfError( iBuffer.Append( data ) );
+ LOG("CServerIdleGuard::DoStatusEventL end");
+ }
+
+void CServerIdleGuard::Process( TInt aErr )
+ {
+ LOG("CServerIdleGuard::Process begin");
+ if( aErr )
+ {
+ LOG1("CServerIdleGuard::Process aErr: %d", aErr);
+ iMessage->Complete( aErr );
+ iRequestActive = EFalse;
+ }
+ else
+ {
+ LOG("CServerIdleGuard::Process calling DoProcessL");
+ TRAPD( err, DoProcessL() );
+ LOG1("CServerIdleGuard::Process DoProcessL's TRAP err: %d", err);
+ if( err )
+ {
+ iMessage->Complete( err );
+ iRequestActive = EFalse;
+ }
+ }
+ LOG("CServerIdleGuard::Process end");
+ }
+
+void CServerIdleGuard::DoProcessL()
+ {
+ LOG("CServerIdleGuard::DoProcessL begin");
+ if( iBuffer.Count() && iRequestActive )
+ {
+ LOG("CServerIdleGuard::DoProcessL step 1");
+ TPtr8 ptr(reinterpret_cast<TUint8*>(&(iBuffer[0])), sizeof(iBuffer[0]), sizeof(iBuffer[0]));
+ LOG("CServerIdleGuard::DoProcessL step 2");
+ iMessage->WriteL( 0, ptr );
+ LOG("CServerIdleGuard::DoProcessL step 3");
+ iMessage->Complete( KErrNone );
+ LOG("CServerIdleGuard::DoProcessL step 4");
+ iRequestActive = EFalse;
+ LOG("CServerIdleGuard::DoProcessL step 5");
+ iBuffer.Remove( 0 );
+ LOG("CServerIdleGuard::DoProcessL step 6");
+ }
+ LOG("CServerIdleGuard::DoProcessL end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cserverjobguard.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,236 @@
+/*
+* 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:
+*
+*/
+
+
+
+#include "cserverjobguard.h"
+#include "cimageprintbody.h"
+#include "clog.h"
+#include "tmessagewrp2.h"
+
+CServerJobGuard* CServerJobGuard::NewL( CImagePrintBody& aEngine )
+ {
+ CServerJobGuard* self = new ( ELeave ) CServerJobGuard( aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CServerJobGuard::CServerJobGuard( CImagePrintBody& aEngine ) : iEngine( aEngine ),
+ iRequestActive( EFalse )
+ {
+ }
+
+CServerJobGuard::~CServerJobGuard()
+ {
+ LOG("CServerJobGuard::~CServerJobGuard begin");
+ iImages.ResetAndDestroy();
+ iImages.Close();
+ iBuffer.Close();
+ LOG("CServerJobGuard::~CServerJobGuard end");
+ }
+
+void CServerJobGuard::ConstructL()
+ {
+ }
+
+void CServerJobGuard::PrepareL( TMessageWrp2& aMessage )
+ {
+ LOG("CServerJobGuard::PrepareL begin");
+ TInt len = aMessage.GetDesLength( 0 );
+ HBufC* buf = HBufC::NewLC( len );
+ TPtr ptr( buf->Des() );
+ aMessage.ReadL( 0, ptr );
+ iImages.AppendL( buf );
+ CleanupStack::Pop(); // buf
+ LOG("CServerJobGuard::PrepareL end");
+ }
+
+void CServerJobGuard::Stop()
+ {
+ LOG("CServerJobGuard::Stop begin");
+ iImages.ResetAndDestroy();
+ if( iRequestActive )
+ {
+ LOG("CServerJobGuard::Stop cancelling...");
+ iMessage->Complete( KErrCancel );
+ iRequestActive = EFalse;
+ }
+ LOG("CServerJobGuard::Stop end");
+ }
+
+TInt CServerJobGuard::CreateL( TMessageWrp2& aMessage )
+ {
+ LOG("CServerJobGuard::CreateL begin");
+ iRequestActive = EFalse;
+ iBuffer.Reset();
+ TInt printer = aMessage.Int0();
+ TInt err = iEngine.CreatePrintJobL( printer, iImages, *this );
+ LOG1("CServerJobGuard::CreateL err: %d", err);
+ if( err )
+ {
+ iImages.ResetAndDestroy();
+ }
+ LOG1("CServerJobGuard::CreateL return: %d", err);
+ return err;
+ }
+
+void CServerJobGuard::ContinueCreateL( TMessageWrp2& aMessage )
+ {
+ LOG("CServerJobGuard::ContinueCreateL begin");
+ if( iMessage ) iMessage->SetDisposable( ETrue );
+ iMessage = &aMessage;
+ iRequestActive = ETrue;
+ if( iBuffer.Count() )
+ {
+ LOG("CServerJobGuard::ContinueCreateL before ProcessL");
+ Process();
+ LOG("CServerJobGuard::ContinueCreateL after ProcessL");
+ }
+ LOG("CServerJobGuard::ContinueCreateL end");
+ }
+
+void CServerJobGuard::PrintJobProgressEvent(TInt aStatus, TInt aPercentCompletion, TInt aJobStateCode)
+ {
+ LOG("CServerJobGuard::PrintJobProgressEvent begin");
+ LOG1("CServerJobGuard::PrintJobProgressEvent aStatus: %d", aStatus);
+ LOG1("CServerJobGuard::PrintJobProgressEvent aPercentCompletion: %d", aPercentCompletion);
+ LOG1("CServerJobGuard::PrintJobProgressEvent aJobStateCode: %d", aJobStateCode);
+ TJobGuardData data;
+ data.iCb = TJobGuardData::EProgressEventCb;
+ data.iStatus = aStatus;
+ data.iPercentCompletion = aPercentCompletion;
+ data.iJobStateCode = aJobStateCode;
+ TRAPD( err, DoPreProcessL( data ) );
+ LOG1("CServerJobGuard::PrintJobProgressEvent DoPreProcessL's TRAP err: %d", err);
+ Process( err );
+ LOG("CServerJobGuard::PrintJobProgressEvent end");
+ }
+
+void CServerJobGuard::PrintJobErrorEvent(TInt aError, TInt aErrorStringCode)
+ {
+ LOG("CServerJobGuard::PrintJobErrorEvent begin");
+ LOG1("CServerJobGuard::PrintJobErrorEvent aError: %d", aError);
+ LOG1("CServerJobGuard::PrintJobErrorEvent aErrorStringCode: %d", aErrorStringCode);
+ TJobGuardData data;
+ data.iCb = TJobGuardData::EErrorEventCb;
+ data.iError = aError;
+ data.iErrorStringCode = aErrorStringCode;
+ TRAPD( err, DoPreProcessL( data ) );
+ LOG1("CServerJobGuard::PrintJobErrorEvent DoPreProcessL's TRAP err: %d", err);
+ Process( err );
+ LOG("CServerJobGuard::PrintJobErrorEvent end");
+ }
+
+void CServerJobGuard::PrinterStatusEvent(TInt aError, TInt aErrorStringCode)
+ {
+ LOG("CServerJobGuard::PrinterStatusEvent begin");
+ LOG1("CServerJobGuard::PrinterStatusEvent aError: %d", aError);
+ LOG1("CServerJobGuard::PrinterStatusEvent aErrorStringCode: %d", aErrorStringCode);
+ TJobGuardData data;
+ data.iCb = TJobGuardData::EStatusEventCb;
+ data.iError = aError;
+ data.iErrorStringCode = aErrorStringCode;
+ TRAPD( err, DoPreProcessL( data ) );
+ LOG1("CServerJobGuard::PrinterStatusEvent DoPreProcessL's TRAP err: %d", err);
+ Process( err );
+ LOG("CServerJobGuard::PrinterStatusEvent end");
+ }
+
+void CServerJobGuard::PreviewImageEvent(TInt aFsBitmapHandle)
+ {
+ LOG("CServerJobGuard::PreviewImageEvent begin");
+ LOG1("CServerJobGuard::PreviewImageEvent aFsBitmapHandle: %d", aFsBitmapHandle);
+ TJobGuardData data;
+ data.iCb = TJobGuardData::EImageEventCb;
+ data.iFsBitmapHandle = aFsBitmapHandle;
+ TRAPD( err, DoPreProcessL( data ) );
+ LOG1("CServerJobGuard::PreviewImageEvent DoPreProcessL's TRAP err: %d", err);
+ Process( err );
+ LOG("CServerJobGuard::PreviewImageEvent end");
+ }
+
+void CServerJobGuard::DoPreProcessL( const TJobGuardData& aData )
+ {
+ LOG("CServerJobGuard::DoPreProcessL begin");
+ User::LeaveIfError( iBuffer.Append( aData ) );
+ LOG("CServerJobGuard::DoPreProcessL end");
+ }
+
+void CServerJobGuard::DoProcessL()
+ {
+ LOG("CServerJobGuard::ProcessL begin");
+ if( iBuffer.Count() && iRequestActive )
+ {
+ LOG("CServerJobGuard::DoProcessL step 1");
+ TPtr8 ptr(reinterpret_cast<TUint8*>(&(iBuffer[0])), sizeof(iBuffer[0]), sizeof(iBuffer[0]));
+ LOG("CServerJobGuard::DoProcessL step 2");
+ iMessage->WriteL( 0, ptr );
+ LOG("CServerJobGuard::DoProcessL step 3");
+ iMessage->Complete( KErrNone );
+ LOG("CServerJobGuard::DoProcessL step 4");
+ iRequestActive = EFalse;
+ LOG("CServerJobGuard::DoProcessL step 5");
+ iBuffer.Remove( 0 );
+ LOG("CServerJobGuard::DoProcessL step 6");
+ }
+ LOG("CServerJobGuard::ProcessL end");
+ }
+
+void CServerJobGuard::Process( TInt aErr )
+ {
+ LOG("CServerJobGuard::Process begin");
+ if( aErr )
+ {
+ LOG1("CServerJobGuard::Process aErr: %d", aErr);
+ iMessage->Complete( aErr );
+ iRequestActive = EFalse;
+ }
+ else
+ {
+ LOG("CServerJobGuard::Process calling DoProcessL");
+ TRAPD( err, DoProcessL() );
+ LOG1("CServerJobGuard::Process DoProcessL's TRAP err: %d", err);
+ if( err )
+ {
+ iMessage->Complete( err );
+ iRequestActive = EFalse;
+ }
+ }
+ LOG("CServerJobGuard::Process end");
+ }
+
+
+
+// DEPRECATED
+
+void CServerJobGuard::ShowMessageL( TInt /*aMsgLine1Code*/, TInt /*aMsgLine2Code*/ )
+ {
+ }
+
+TBool CServerJobGuard::AskYesNoQuestionL( TInt /*aMsgLine1Code*/, TInt /*aMsgLine2Code*/ )
+ {
+ return EFalse;
+ }
+
+const TDesC& CServerJobGuard::AskForInputL( TInt /*aMsgLine1Code*/, TInt /*aMsgLine2Code*/ )
+ {
+ return KNullDesC;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/main.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32base.h>
+
+#include "imageprintclientserver.h"
+#include "cimageprintserver.h"
+#include "cimageprintscheduler.h"
+#include "clog.h"
+
+// init and run the server
+static void RunTheServerL()
+ {
+#ifndef __SECURE_API__
+ User::LeaveIfError( RThread().Rename( KImagePrintServerName ) ); //Deprecated! Replace this with the line below as soon as possible
+#else
+ User::LeaveIfError( RThread().RenameMe( KImagePrintServerName ) );
+#endif
+
+ CActiveScheduler* scheduler = new (ELeave) CImagePrintScheduler;
+ CleanupStack::PushL( scheduler );
+ CActiveScheduler::Install( scheduler );
+
+ CImagePrintServer::NewLC();
+
+ RProcess::Rendezvous( KErrNone );
+
+ CActiveScheduler::Start();
+ CleanupStack::PopAndDestroy( 2 ); // CImagePrintServer, scheduler
+ }
+
+// Server process entry-point
+TInt E32Main()
+ {
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ TInt r( KErrNoMemory );
+ if( cleanup )
+ {
+ TRAP( r, RunTheServerL() );
+ delete cleanup;
+ }
+ return r;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/tmessagewrp2.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,143 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32cmn.h>
+
+#include "tmessagewrp2.h"
+#include "clog.h"
+
+TMessageWrp2::TMessageWrp2( const RMessage2& aMessage,
+ const TBool& aConnected ) :
+ iConnected( aConnected ),
+ iDisposable( EFalse )
+
+ {
+ iMessage = aMessage;
+ }
+
+void TMessageWrp2::WriteL(TInt aParam, const TDesC8 &aDes, TInt aOffset) const
+ {
+ LOG("TMessageWrp2::WriteL begin");
+ LOG1("TMessageWrp2::WriteL iConnected: %d", iConnected);
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::WriteL iMessage.Function(): %d", iMessage.Function());
+ iMessage.WriteL( aParam, aDes, aOffset );
+ }
+ LOG("TMessageWrp2::WriteL end");
+ }
+
+void TMessageWrp2::Complete(TInt aReason) const
+ {
+ LOG("TMessageWrp2::Complete begin");
+ LOG1("TMessageWrp2::Complete iConnected: %d", iConnected);
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::Complete iMessage.Function(): %d", iMessage.Function());
+ iMessage.Complete( aReason );
+ }
+ LOG("TMessageWrp2::Complete end");
+ }
+
+TInt TMessageWrp2::Int0() const
+ {
+ LOG("TMessageWrp2::Int0 begin");
+ LOG1("TMessageWrp2::Int0 iConnected: %d", iConnected);
+ TInt value( 0 );
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::Int0 iMessage.Function(): %d", iMessage.Function());
+ value = iMessage.Int0();
+ }
+ LOG("TMessageWrp2::Int0 end");
+ return value;
+ }
+
+TInt TMessageWrp2::Int1() const
+ {
+ LOG("TMessageWrp2::Int1 begin");
+ LOG1("TMessageWrp2::Int1 iConnected: %d", iConnected);
+ TInt value( 0 );
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::Int1 iMessage.Function(): %d", iMessage.Function());
+ value = iMessage.Int1();
+ }
+ LOG("TMessageWrp2::Int1 end");
+ return value;
+ }
+
+TInt TMessageWrp2::GetDesLength(TInt aParam) const
+ {
+ LOG("TMessageWrp2::GetDesLength begin");
+ LOG1("TMessageWrp2::GetDesLength iConnected: %d", iConnected);
+ TInt value( 0 );
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::GetDesLength iMessage.Function(): %d", iMessage.Function());
+ value = iMessage.GetDesLength( aParam );
+ }
+ LOG("TMessageWrp2::GetDesLength end");
+ return value;
+ }
+
+void TMessageWrp2::ReadL(TInt aParam, TDes8 &aDes, TInt aOffset) const
+ {
+ LOG("TMessageWrp2::ReadL TDes8 begin");
+ LOG1("TMessageWrp2::ReadL TDes8 iConnected: %d", iConnected);
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::ReadL TDes8 iMessage.Function(): %d", iMessage.Function());
+ iMessage.ReadL( aParam, aDes, aOffset );
+ }
+ LOG("TMessageWrp2::ReadL TDes8 end");
+ }
+
+void TMessageWrp2::ReadL(TInt aParam, TDes16 &aDes, TInt aOffset) const
+ {
+ LOG("TMessageWrp2::ReadL TDes16 begin");
+ LOG1("TMessageWrp2::ReadL TDes16 iConnected: %d", iConnected);
+ if( !iMessage.IsNull() && iConnected )
+ {
+ LOG1("TMessageWrp2::ReadL TDes16 iMessage.Function(): %d", iMessage.Function());
+ iMessage.ReadL( aParam, aDes, aOffset );
+ }
+ LOG("TMessageWrp2::ReadL TDes16 end");
+ }
+
+TInt TMessageWrp2::Function() const
+ {
+ return iMessage.Function();
+ }
+
+void TMessageWrp2::SetDisposable( TBool aDisposable )
+ {
+ iDisposable = aDisposable;
+ }
+
+TBool TMessageWrp2::Disposable() const
+ {
+ return iDisposable;
+ }
+
+void TMessageWrp2::Panic(const TDesC &aCategory, TInt aReason) const
+ {
+ iMessage.Panic( aCategory, aReason );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_EXPORTS
+
+../DeviceProtocols/rom/deviceprotocols.iby CORE_APP_LAYER_IBY_EXPORT_PATH(deviceprotocols.iby)
+../rom/imageprintengine.iby CORE_APP_LAYER_IBY_EXPORT_PATH(imageprintengine.iby)
+../ImagePrintServer/rom/imageprintserver.iby CORE_APP_LAYER_IBY_EXPORT_PATH(imageprintserver.iby)
+
+../DeviceProtocols/btprotocol/data/btxmltemplate.txt /epoc32/data/z/resource/imageprintdata/protocols/btxmltemplate.txt
+../DeviceProtocols/xhtmlfilecomposer/data/xhtmlfiletemplate.txt /epoc32/data/z/resource/imageprintdata/protocols/xhtmltempl/xhtmlfiletemplate.txt
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_MMPFILES
+
+../ImagePrintServer/group/imageprintclient.mmp
+../ImagePrintServer/group/imageprintserver.mmp
+
+../DeviceProtocols/xhtmlfilecomposer/group/xhtmlfilecomposer.mmp
+../DeviceProtocols/dpof/group/dpofprotdll.mmp
+../DeviceProtocols/btprotocol/group/btprotocol.mmp
+../DeviceProtocols/pictbridge2/group/pdphotolib.mmp
+../DeviceProtocols/upnpprotocolfw2/group/upnpprotocol.mmp
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/inc/logdef.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef LOGDEF_H
+#define LOGDEF_H
+
+#ifdef _DEBUG
+// logging is always enabled in debug builds
+#define ENABLE_LOGGING
+#else
+// manually enable in release builds
+//#define ENABLE_LOGGING
+#endif // _DEBUG
+
+//#define LOG_TO_FILE
+
+#endif // LOGDEF_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/rom/imageprintengine.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,25 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTENGINE_IBY
+#define IMAGEPRINTENGINE_IBY
+
+#include <imageprintserver.iby>
+#include <deviceprotocols.iby>
+
+#endif // IMAGEPRINTENGINE_IBY
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:
+*
+*/
+
+
+#include "../imageprinteng/group/bld.inf"
+#include "../imageprintapp/group/bld.inf"
+#include "../imgpprintdll/group/bld.inf"
+#include "../imageprintprovider/group/bld.inf"
+
+PRJ_EXPORTS
+
+../rom/desw_imageprintui.iby CORE_APP_LAYER_IBY_EXPORT_PATH( desw_imageprintui.iby )
+../rom/imageprintresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH( imageprintresources.iby )
+
+PRJ_PLATFORMS
+DEFAULT
+
+// End of File
Binary file ImagePrint/ImagePrintUI/imageprintapp/aif/aif.mbm has changed
Binary file ImagePrint/ImagePrintUI/imageprintapp/aif/context_pane_icon_44x44.bmp has changed
Binary file ImagePrint/ImagePrintUI/imageprintapp/aif/context_pane_icon_44x44_mask_soft.bmp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/aif/imageprintappaif.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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:
+*
+*/
+
+
+#include <aiftool.rh>
+
+RESOURCE AIF_DATA
+ {
+ app_uid = 0x101FFA84;
+ num_icons = 2;
+ embeddability = KAppNotEmbeddable;
+ hidden = KAppIsHidden;
+ newfile = KAppDoesNotSupportNewFile;
+ }
+
+// End of File
\ No newline at end of file
Binary file ImagePrint/ImagePrintUI/imageprintapp/aif/list_icon_42x29.bmp has changed
Binary file ImagePrint/ImagePrintUI/imageprintapp/aif/list_icon_42x29_mask_soft.bmp has changed
Binary file ImagePrint/ImagePrintUI/imageprintapp/data/2x2inchsmall.bmp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/imageprintapp.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,520 @@
+/*
+* 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:
+*
+*/
+
+
+// RESOURCE IDENTIFIER
+NAME IGPR // 4 letter ID
+
+// INCLUDES
+
+#include <eikon.rh>
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <avkon.hrh>
+#include <avkon.mbg>
+#include <avkon.loc>
+#include <AvkonIcons.hrh>
+#include <appinfo.rh>
+#include <data_caging_paths_strings.hrh>
+#include <btnotif.mbg>
+#include <imageprintapp.loc>
+
+#include "imageprintapp.hrh"
+
+// Maximum and minimum number
+#define MIN_TINT_NAME -2147483646
+#define MAX_TINT_NAME 2147483647
+
+// RESOURCE DEFINITIONS
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf="ImagePrint"; }
+
+/**
+ * Application resource
+ */
+RESOURCE EIK_APP_INFO
+ {
+ menubar = r_settings_view_menubar;
+ cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
+ }
+
+/**
+ * Main view resource
+ */
+RESOURCE AVKON_VIEW r_settings_view
+ {
+ menubar = r_settings_view_menubar;
+ cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
+ }
+
+RESOURCE AVKON_VIEW r_empty_view
+ {
+ menubar = R_AVKON_MENUPANE_EMPTY;
+ cba = R_AVKON_SOFTKEYS_EMPTY;
+ }
+
+/**
+ * Main view menubar
+ */
+RESOURCE MENU_BAR r_settings_view_menubar
+ {
+ titles =
+ {
+ MENU_TITLE
+ {
+ menu_pane = r_profile_list_view_menu;
+ txt = " "; // Won't be visible, "Options" is shown
+ }
+ };
+ }
+
+/**
+ * Main view menupane
+ */
+RESOURCE MENU_PANE r_profile_list_view_menu
+ {
+ items =
+ {
+ MENU_ITEM
+ {
+ command = ESettingsChangeItem;
+ txt = qtn_print_settings_opt_change;
+ },
+ MENU_ITEM
+ {
+ command = ESettingsPrint;
+ txt = qtn_print_menu_opt_print;
+ },
+ MENU_ITEM
+ {
+ command = ECmdPrintHelp;
+ txt = qtn_print_menu_opt_help;
+ },
+ MENU_ITEM
+ {
+ command = ESettingsExit;
+ txt = qtn_print_menu_opt_exit;
+ }
+ };
+ }
+
+RESOURCE LOCALISABLE_APP_INFO r_imageprintapp_localisable_app_info
+ {
+ caption_and_icon =
+ CAPTION_AND_ICON_INFO
+ {
+ caption = qtn_app_caption_string;
+ number_of_icons = 1;
+ icon_file = APP_BITMAP_DIR"\\imageprintapp_aif.mif";
+ };
+ }
+
+/**
+ * Dialog resource for print progress note
+ */
+RESOURCE DIALOG r_print_progress_prog_note
+ {
+ flags = EAknProgressNoteFlags;
+ buttons = R_AVKON_SOFTKEYS_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EBitmapCtrl;
+ id = EBrandingBitmap;
+ },
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = EPrintWaitNote;
+ control = AVERELL_NOTE
+ {
+ layout = EProgressLayout;
+ singular_label = qtn_print_progress_prompt;
+ imagefile = AVKON_ICON_FILE;
+ imageid = EMbmAvkonQgn_note_progress;
+ imagemask = EMbmAvkonQgn_note_progress_mask;
+ };
+ }
+ };
+ }
+
+/**
+ * Dialog resource for plain print progress note
+ */
+RESOURCE DIALOG r_print_progress_plain_prog_note
+ {
+ flags = EAknProgressNoteFlags;
+ buttons = R_AVKON_SOFTKEYS_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = EPrintWaitNote;
+ control = AVERELL_NOTE
+ {
+ layout = EProgressLayout;
+ singular_label = qtn_print_progress_prompt;
+ imagefile = AVKON_ICON_FILE;
+ imageid = EMbmAvkonQgn_note_progress;
+ imagemask = EMbmAvkonQgn_note_progress_mask;
+ };
+ }
+ };
+ }
+
+/**
+ * MMC printing completed dialog
+ */
+RESOURCE DIALOG r_mmc_printing_completed
+ {
+ flags = EEikDialogFlagNoDrag | EEikDialogFlagNoTitleBar |
+ EEikDialogFlagCbaButtons;
+ buttons = R_AVKON_SOFTKEYS_OK_EMPTY;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = EPrintProgressNote;
+ control = AVKON_NOTE
+ {
+ layout = EConfirmationLayout;
+ singular_label = qtn_print_mmc_print_note;
+ };
+ }
+ };
+ }
+
+/**
+ * Connect USB printer dialog
+ */
+RESOURCE DIALOG r_connect_usb
+ {
+ flags = EAknInformationNoteFlags;
+ buttons = R_AVKON_SOFTKEYS_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = EAknNoteNoType;
+ control = AVKON_NOTE
+ {
+ layout = ENoteWithImageLayout;
+ singular_label = qtn_print_connect_usb_note;
+ };
+ }
+ };
+ }
+
+/**
+ * Confirmation dialog for "no printers" note
+ */
+RESOURCE DIALOG r_no_printers_confirmation
+ {
+ flags = EGeneralQueryFlags;
+ buttons = R_AVKON_SOFTKEYS_YES_NO;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtQuery;
+ id = ENoPrintersConfirmation;
+ control = AVKON_CONFIRMATION_QUERY
+ {
+ layout = EConfirmationQueryLayout;
+ };
+ }
+ };
+ }
+
+RESOURCE DIALOG r_cancel_printing_dialog
+ {
+ flags = EAknWaitNoteFlags | EEikDialogFlagWait;
+ buttons = R_AVKON_SOFTKEYS_EMPTY;
+ items=
+ {
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = 1;
+ control= AVKON_NOTE
+ {
+ layout = EWaitLayout;
+ animation =R_QGN_GRAF_WAIT_BAR_ANIM;
+ };
+ }
+ };
+ }
+
+// Image array for pop-up animation
+RESOURCE ARRAY r_imageprint_animation_images
+ {
+ items =
+ {
+ BMPANIM_FRAME { bmpid=18; maskid=19; },
+ BMPANIM_FRAME { bmpid=16; maskid=17; },
+ BMPANIM_FRAME { bmpid=20; maskid=21; },
+ BMPANIM_FRAME { bmpid=16; maskid=17; }
+ };
+ }
+
+RESOURCE ARRAY r_bt_animation_for_popuplist_images
+ {
+ items=
+ {
+ BMPANIM_FRAME {bmpid=EMbmBtnotifQgn_note_bt_popup_2; maskid=EMbmBtnotifQgn_note_bt_popup_2_mask; },
+ BMPANIM_FRAME {bmpid=EMbmBtnotifQgn_note_bt_popup; maskid=EMbmBtnotifQgn_note_bt_popup_mask; },
+ BMPANIM_FRAME {bmpid=EMbmBtnotifQgn_note_bt_popup_3; maskid=EMbmBtnotifQgn_note_bt_popup_3_mask; },
+ BMPANIM_FRAME {bmpid=EMbmBtnotifQgn_note_bt_popup; maskid=EMbmBtnotifQgn_note_bt_popup_mask; }
+ };
+ }
+
+// Animation for searching devices popup-list
+RESOURCE BMPANIM_DATA r_imageprint_animation
+ {
+ frameinterval = 200;
+ playmode = EAknBitmapAnimationPlayModeCycle;
+ bmpfile = APP_BITMAP_DIR"\\btnotif.mbm";
+ frames = r_bt_animation_for_popuplist_images;
+ }
+
+/**
+ * Generic popup setting item
+ */
+RESOURCE AVKON_SETTING_PAGE r_setting_generic_protocol_page
+ {
+ softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL;
+ type = EAknCtPopupSettingList;
+ editor_resource_id = r_empty_protocol_setting_list;
+ }
+
+RESOURCE POPUP_SETTING_LIST r_empty_protocol_setting_list
+ {
+ }
+
+RESOURCE CBA r_avkon_softkeys_stop
+ {
+ buttons =
+ {
+ CBA_BUTTON
+ {
+ txt = " ";
+ },
+ CBA_BUTTON
+ {
+ id = EAknSoftkeyCancel;
+ txt= qtn_clk_softkey_stop;
+ }
+ };
+ }
+
+
+
+/**
+ *
+ * Resource strings
+ *
+ */
+
+RESOURCE TBUF r_settings_imageprint_mmc_print_note { buf = qtn_print_mmc_print_note; }
+RESOURCE TBUF r_settings_imageprint_mmc_print_note_one_picture { buf = qtn_print_mmc_print_note_one_picture; }
+RESOURCE TBUF r_txt_imageprint_title_printsettings { buf = qtn_app_caption_string; }
+RESOURCE TBUF r_printjob_images { buf = qtn_printjob_images; }
+RESOURCE TBUF r_printjob_image { buf = qtn_printjob_image; }
+RESOURCE TBUF r_print_selected_printer { buf = qtn_print_selected_printer; }
+RESOURCE TBUF r_print_memory_card { buf = qtn_print_memory_card; }
+RESOURCE TBUF r_print_no_printer { buf = qtn_print_no_printer; }
+
+RESOURCE TBUF r_qtn_print_progress_note_title { buf = qtn_print_progress_prompt; }
+RESOURCE TBUF r_qtn_print_not_found_error { buf = qtn_print_not_found_error; }
+RESOURCE TBUF r_qtn_print_no_printers { buf = qtn_print_no_printers; }
+RESOURCE TBUF r_qtn_print_settings_default_usb { buf = qtn_print_settings_default_usb; }
+RESOURCE TBUF r_qtn_print_settings_default_bt { buf = qtn_print_settings_default_bt; }
+RESOURCE TBUF r_qtn_print_settings_default_wlan { buf = qtn_print_settings_default_wlan; }
+RESOURCE TBUF r_qtn_print_wrongtype_note { buf = qtn_print_wrongtype_note; }
+RESOURCE TBUF r_qtn_print_selectnew_note { buf = qtn_print_selectnew_note; }
+RESOURCE TBUF r_qtn_print_concurrent_note { buf = qtn_print_concurrent_note; }
+RESOURCE TBUF r_qtn_print_memory_card { buf = qtn_print_memory_card; }
+RESOURCE TBUF r_qtn_print_settings_noc {buf = qtn_print_settings_noc; }
+RESOURCE TBUF r_qtn_print_progress_prompt_cancel { buf = qtn_print_progress_prompt_cancel; }
+
+RESOURCE TBUF r_qtn_popup_list_title { buf = qtn_print_selectprinter_prompt; }
+RESOURCE TBUF r_qtn_copy_progress_note_title { buf = qtn_print_progress_prompt_mmc; }
+RESOURCE TBUF r_qtn_popup_list_title2 { buf = qtn_print_selectprinter_prompt2; }
+RESOURCE TBUF r_qtn_search_again { buf = qtn_print_search_again; }
+
+RESOURCE TBUF r_note_imageprint_error_ink_out { buf = qtn_print_outofink_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_load { buf = qtn_print_paper_load_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_eject { buf = qtn_print_paper_eject_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_media { buf = qtn_print_paper_media_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_jam { buf = qtn_print_paper_jam_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_combination { buf = qtn_print_paper_combination_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_low { buf = qtn_print_paper_low_error; }
+RESOURCE TBUF r_note_imageprint_error_paper { buf = qtn_print_paper_error; }
+RESOURCE TBUF r_note_imageprint_error_ink_low { buf = qtn_print_inklow_error; }
+RESOURCE TBUF r_note_imageprint_error_ink_waste { buf = qtn_print_ink_waste_error; }
+RESOURCE TBUF r_note_imageprint_error_ink { buf = qtn_print_ink_error; }
+RESOURCE TBUF r_note_imageprint_error_file_decode { buf = qtn_print_file_decode_error; }
+RESOURCE TBUF r_note_imageprint_error_file { buf = qtn_print_file_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_cover_open { buf = qtn_print_hardware_cover_open_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_fatal { buf = qtn_print_hardware_fatal_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_servicecall { buf = qtn_print_hardware_servicecall_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_printer_unavailable { buf = qtn_print_hardware_printer_unavailable_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_printer_busy { buf = qtn_print_hardware_printer_busy_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_lever { buf = qtn_print_hardware_lever_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_no_marking_agent { buf = qtn_print_hardware_no_marking_agent_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_ink_cover_open { buf = qtn_print_hardware_ink_cover_open_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware_no_ink_cartridge { buf = qtn_print_hardware_no_ink_cartridge_error; }
+RESOURCE TBUF r_note_imageprint_error_hardware { buf = qtn_print_hardware_error; }
+RESOURCE TBUF r_note_imageprint_error_output_area_almost_full { buf = qtn_print_output_area_almost_full_error; }
+RESOURCE TBUF r_note_imageprint_error_output_area_full { buf = qtn_print_output_area_full_error; }
+RESOURCE TBUF r_note_imageprint_error_marker_supply_low { buf = qtn_print_marker_supply_low_error; }
+RESOURCE TBUF r_note_imageprint_error_marker_supply_empty { buf = qtn_print_marker_supply_empty_error; }
+RESOURCE TBUF r_note_imageprint_error_marker_failure { buf = qtn_print_marker_failure_error; }
+RESOURCE TBUF r_note_imageprint_error_printer_paused { buf = qtn_print_paused_error; }
+RESOURCE TBUF r_note_imageprint_error_paper_out { buf = qtn_print_outofpaper_error; }
+
+RESOURCE TBUF r_note_print_status_error { buf = qtn_print_status_error; }
+RESOURCE TBUF r_note_send_print_error { buf = qtn_print_send_error; }
+RESOURCE TBUF r_note_disconnect_print_error { buf = qtn_print_disconnect_error; }
+RESOURCE TBUF r_note_general_print_error { buf = qtn_print_general_error; }
+RESOURCE TBUF r_note_connect_print_error { buf = qtn_print_connect_error; }
+RESOURCE TBUF r_note_imageprint_mmccopyfail { buf = qtn_print_note_mmccopyfail; }
+
+RESOURCE ARRAY r_default_printer_selection_popup_texts
+ {
+ items =
+ {
+ LBUF
+ {
+ txt = qtn_print_settings_default_bt;
+ },
+ LBUF
+ {
+ txt = qtn_print_memory_card;
+ },
+ LBUF
+ {
+ txt = qtn_print_settings_default_usb;
+ },
+ LBUF
+ {
+ txt = qtn_print_settings_default_wlan;
+ }
+ };
+ }
+
+RESOURCE DIALOG r_hidden_dialog
+ {
+ flags = EAknWaitNoteFlags | EEikDialogFlagWait;
+ buttons = R_AVKON_SOFTKEYS_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = EGeneralNote;
+ control = AVERELL_NOTE
+ {
+ layout = EWaitLayout;
+ singular_label = qtn_print_progress_prompt_pro;
+ animation = R_QGN_GRAF_WAIT_BAR_ANIM;
+ };
+ }
+ };
+ }
+
+RESOURCE DIALOG r_startwait_dialog
+ {
+ flags = EAknWaitNoteFlags;
+ buttons = R_AVKON_SOFTKEYS_EMPTY;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtNote;
+ id = EGeneralNote;
+ control = AVERELL_NOTE
+ {
+ layout = EWaitLayout;
+ singular_label = qtn_print_progress_prompt_pro;
+ animation = R_QGN_GRAF_WAIT_BAR_ANIM;
+ };
+ }
+ };
+ }
+
+RESOURCE DIALOG r_launch_wlan_wizard_query
+ {
+ flags = EGeneralQueryFlags | EEikDialogFlagNoBorder | EEikDialogFlagNoShadow;
+ buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+ items=
+ {
+ DLG_LINE
+ {
+ type = EAknCtPopupHeadingPane;
+ id = EAknMessageQueryHeaderId;
+ control = AVKON_HEADING
+ {
+ label = qtn_launch_wlan_wizard_query_header;
+ };
+ },
+ DLG_LINE
+ {
+ type = EAknCtMessageQuery;
+ id = EAknMessageQueryContentId;
+ control = AVKON_MESSAGE_QUERY
+ {
+ message = qtn_launch_wlan_wizard_query_msg;
+ };
+ }
+ };
+ }
+
+// Image print number of copies dialog resource.
+
+RESOURCE DIALOG r_noc_query
+ {
+ flags = EGeneralQueryFlags;
+ buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtQuery;
+ id = EGeneralQuery;
+ control = AVKON_DATA_QUERY
+ {
+ layout = ENumberLayout;
+ label = qtn_print_settings_noc;
+ control = AVKON_INTEGER_EDWIN
+ {
+ min = 1;
+ max = 999;
+ maxlength = 3;
+ unset_value=1;
+ };
+ };
+ }
+ };
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/imageprintapp_caption.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,25 @@
+/*
+* 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:
+*
+*/
+
+
+#include <imageprintapp.loc>
+#include <apcaptionfile.rh>
+
+RESOURCE CAPTION_DATA
+{
+ caption=qtn_app_caption_string;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_indi_print_cached.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="24" height="24" viewBox="0 0 24 24"
+ overflow="visible" enable-background="new 0 0 24 24" xml:space="preserve">
+<g>
+ <rect x="0" width="24" height="24"/>
+ <rect x="2.789" y="9.479" fill="#FFFFFF" stroke="#000000" stroke-width="1.071" width="18.917" height="7.793"/>
+ <g>
+ <polygon fill="#FFFFFF" points="5.461,2.047 5.461,9.224 18.9,9.224 18.9,5.433 14.76,2.047 "/>
+ <path d="M14.993,1.393h-0.467h-8.41h-1.31v1.31V8.57v1.31h1.31h12.128h1.311V8.57V5.744V5.123L19.074,4.73l-3.719-3.041
+ L14.993,1.393L14.993,1.393z M6.116,2.703h8.41l3.719,3.041V8.57l0,0l0,0H6.116V2.703L6.116,2.703L6.116,2.703z"/>
+ </g>
+ <g>
+ <rect x="5.671" y="14.12" fill="#FFFFFF" width="13.009" height="7.008"/>
+ <path d="M19.128,13.67h-0.897H6.12H5.222v0.898v6.11v0.897H6.12h12.111h0.897v-0.897v-6.11V13.67L19.128,13.67z M6.12,14.569
+ h12.111v6.11l0,0l0,0H6.12V14.569L6.12,14.569L6.12,14.569z"/>
+ </g>
+</g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_menu_print.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="88" height="88" viewBox="0 0 88 88">
+<g>
+<g>
+<rect fill="none" width="88" height="88"/>
+<g>
+<g>
+<g>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M30.127,59.293 c-1.682,0.835-18.246,4.503-19.252,5.035c-1.65,0.874-1.605,2.744,1.089,3.691c1.021,0.36,44.074,12.574,46.419,13.371 c2.354,0.806,4.623,0.207,5.656-0.797c1.033-0.997,16.514-10.781,17.885-12.381c1.256-1.473-0.342-3.088-2.063-3.628 c-1.723-0.54-42.836-4.948-44.798-5.576C33.102,58.395,31.813,58.469,30.127,59.293z"/>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M30.293,59.882 c-1.405,0.688-17.384,4.056-18.371,4.581c-1.562,0.806-1.372,2.425,0.954,3.24c2.961,1.04,43.343,12.312,45.624,13.087 c2.236,0.772,4.35,0.182,5.258-0.69c0.979-0.938,16.121-10.326,17.176-11.7c1.25-1.213-0.201-2.896-1.906-3.441 c-3.51-1.104-42.379-4.799-44.08-5.349C33.057,59.009,31.866,59.102,30.293,59.882z"/>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M30.459,60.451 c-1.125,0.56-16.521,3.624-17.488,4.135c-1.471,0.751-1.139,2.105,0.823,2.795c4.904,1.721,42.612,12.063,44.825,12.814 c2.127,0.727,4.084,0.147,4.863-0.599c0.693-0.662,15.535-9.781,16.459-11.019c1.152-1.109-0.061-2.719-1.74-3.244 c-5.295-1.687-41.921-4.656-43.357-5.12C33.015,59.627,31.928,59.73,30.459,60.451z"/>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M30.62,61.026 c-0.842,0.422-15.653,3.191-16.602,3.688c-1.382,0.685-0.902,1.796,0.687,2.351c6.854,2.4,41.888,11.806,44.029,12.532 c2.014,0.692,3.82,0.128,4.477-0.5c0.516-0.494,14.922-9.541,15.744-10.337c1.037-1.014,0.082-2.527-1.584-3.053 c-7.074-2.251-41.464-4.52-42.636-4.893C32.971,60.26,31.986,60.358,30.62,61.026z"/>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M30.785,61.61 c-0.565,0.272-14.792,2.747-15.714,3.23c-1.297,0.629-0.674,1.473,0.549,1.915c8.8,3.07,41.16,11.538,43.236,12.247 c1.896,0.65,3.553,0.094,4.076-0.4c0.342-0.331,14.4-9.035,15.033-9.656c0.934-0.928,0.223-2.351-1.432-2.876 c-8.863-2.822-41-4.362-41.915-4.661C32.93,60.879,32.044,60.986,30.785,61.61z"/>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M30.948,62.189 c-0.278,0.14-13.928,2.311-14.829,2.774c-1.207,0.579-0.438,1.168,0.413,1.463c10.751,3.76,40.433,11.295,42.439,11.978 c1.785,0.611,3.287,0.066,3.689-0.305c0.168-0.159,13.18-8.52,13.637-8.972c0.824-0.829,1.045-2.159-0.59-2.685 c-10.646-3.397-40.549-4.217-41.191-4.429C32.886,61.497,32.096,61.62,30.948,62.189z"/>
+<path fill-opacity="0.06" stroke-opacity="0.06" d="M31.114,62.759 c0,0-13.067,1.886-13.946,2.33c-1.121,0.516-0.208,0.85,0.276,1.017c12.699,4.442,39.706,11.035,41.643,11.707 c1.668,0.56,3.014,0.039,3.289-0.216c0,0.005,12.646-8.01,12.93-8.292c0.717-0.731,1.188-1.971-0.43-2.486 c-12.436-3.976-40.09-4.089-40.481-4.207C32.845,62.115,32.16,62.253,31.114,62.759z"/>
+</g>
+<g>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.882,63.886 8.396,72.429 43.977,82.654 54.262,72.744 20.074,63.746 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="53.271,73.005 43.837,82.095 9.515,72.229 20.178,64.289 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.262,60.627 1.686,73.63 44.817,86.012 60.203,71.18 19.453,60.488 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.365,61.17 2.804,73.43 44.678,85.452 59.213,71.44 19.556,61.031 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.469,61.713 3.923,73.229 44.537,84.893 58.223,71.701 19.659,61.574 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.572,62.256 5.042,73.029 44.397,84.333 57.232,71.962 19.763,62.117 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.676,62.799 6.16,72.829 44.258,83.773 56.242,72.223 19.866,62.66 "/>
+<polygon fill-opacity="0.06" stroke-opacity="0.06" points="19.779,63.342 7.278,72.629 44.117,83.214 55.252,72.483 19.97,63.203 "/>
+</g>
+</g>
+<g>
+<g>
+<polygon fill="#262626" points="27.128,37.535 32.975,35.981 32.975,38.812 27.245,38.812 "/>
+<g>
+<g>
+<linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="38.3984" y1="15.4512" x2="68.6708" y2="45.7235">
+<stop offset="0" style="stop-color:#FFFFFF"/>
+<stop offset="0.0055" style="stop-color:#FFFFFF"/>
+<stop offset="1" style="stop-color:#EEEDED"/>
+</linearGradient>
+<path fill="url(#XMLID_11_)" d="M70.123,44.271c2.732-15.5,2.751-15.497,3.765-21.512 c0.615-3.654-3.051-3.859-3.051-3.859L39.42,16.633c0,0-3.244-0.387-3.938,2.366l-4.286,19.565L70.123,44.271z"/>
+<linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="75.6484" y1="20.4707" x2="67.3586" y2="43.2468">
+<stop offset="0" style="stop-color:#FFFFFF"/>
+<stop offset="0.0055" style="stop-color:#FFFFFF"/>
+<stop offset="0.0492" style="stop-color:#FFFFFF"/>
+<stop offset="0.0874" style="stop-color:#E8E7E8"/>
+<stop offset="0.3607" style="stop-color:#9A9A9A"/>
+<stop offset="0.5519" style="stop-color:#5C5B5C"/>
+<stop offset="0.8361" style="stop-color:#2E2E2F"/>
+<stop offset="0.929" style="stop-color:#121213"/>
+<stop offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<path fill="url(#XMLID_12_)" d="M70.837,18.9c0,0,3.666,0.205,3.051,3.859c-0.615,3.653-3.805,21.48-3.805,21.48 l2.575-0.762l3.34-19.7c0,0,0.483-2.41-2.34-3.814l-1.511-0.766C72.147,19.197,71.44,18.959,70.837,18.9z"/>
+</g>
+<g>
+<linearGradient id="XMLID_13_" gradientUnits="userSpaceOnUse" x1="71.5361" y1="22.063" x2="64.0085" y2="42.7449">
+<stop offset="0" style="stop-color:#BABABA"/>
+<stop offset="0.071" style="stop-color:#333333"/>
+<stop offset="0.1639" style="stop-color:#262626"/>
+<stop offset="1" style="stop-color:#262626"/>
+</linearGradient>
+<path fill="url(#XMLID_13_)" d="M70.273,24.022c0,0,0.279-2.765-2.453-3.093l0.952,0.175 c3.053,0.63,2.417,3.811,2.417,3.811l-3.237,18.341l-1.176,0.497L70.273,24.022z"/>
+<radialGradient id="XMLID_14_" cx="38.4966" cy="20.8086" r="32.4464" fx="38.4966" fy="20.8086" gradientUnits="userSpaceOnUse">
+<stop offset="0" style="stop-color:#F4F3F3"/>
+<stop offset="0.0056" style="stop-color:#F4F3F3"/>
+<stop offset="0.1838" style="stop-color:#EDEDED"/>
+<stop offset="0.4421" style="stop-color:#D9D9D9"/>
+<stop offset="0.7474" style="stop-color:#B5B5B5"/>
+<stop offset="1" style="stop-color:#919191"/>
+</radialGradient>
+<path fill="url(#XMLID_14_)" d="M66.907,43.08l3.366-19.058c0,0,0.279-2.765-2.453-3.093 C65.087,20.6,39.236,18.65,39.236,18.65s-2.923-0.462-3.548,2.212C35.063,23.538,32,38.069,32,38.069L66.907,43.08z"/>
+</g>
+</g>
+</g>
+<g>
+<path fill="none" d="M77.423,66.822"/>
+</g>
+<g>
+<linearGradient id="XMLID_15_" gradientUnits="userSpaceOnUse" x1="41.4722" y1="30.3418" x2="49.4886" y2="52.3668">
+<stop offset="0" style="stop-color:#222221"/>
+<stop offset="0.0984" style="stop-color:#5E5F5F"/>
+<stop offset="0.8142" style="stop-color:#BFBFC0"/>
+<stop offset="0.9344" style="stop-color:#E3E2E2"/>
+<stop offset="1" style="stop-color:#FFFFFF"/>
+</linearGradient>
+<path fill="url(#XMLID_15_)" d="M70.546,41.653l-0.096-0.03l-2.999,1.14L28.082,37.28l3.606-0.957l0.116-0.534l-18.47,4.793 c1.15-0.309,2.299-0.039,2.299-0.039s36.829,5.644,41.969,6.497c1.075,0.179,1.9,0.556,2.534,1.04l0.339,0.287l16.95-6.796 c-1.179-1.002-2.396-1.194-2.396-1.194l-1.802-0.26l-0.099,0.59L70.546,41.653z"/>
+<linearGradient id="XMLID_16_" gradientUnits="userSpaceOnUse" x1="63.2852" y1="46.6133" x2="74.5485" y2="70.7676">
+<stop offset="0" style="stop-color:#FFFFFF"/>
+<stop offset="0.0055" style="stop-color:#FFFFFF"/>
+<stop offset="0.0601" style="stop-color:#FFFFFF"/>
+<stop offset="0.1202" style="stop-color:#E8E7E8"/>
+<stop offset="0.4426" style="stop-color:#9A9A9A"/>
+<stop offset="0.6393" style="stop-color:#5C5B5C"/>
+<stop offset="0.8361" style="stop-color:#2E2E2F"/>
+<stop offset="0.929" style="stop-color:#121213"/>
+<stop offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<path fill="url(#XMLID_16_)" d="M77.423,66.822c2.263-1.404,2.198-3.914,2.198-3.914V47.071 c-0.003-3.172-1.299-4.862-2.512-5.751l-16.973,6.761c2.394,1.833,2.039,5.206,2.039,5.206s0,13.363,0,20.01 c0,2.146-0.698,3.354-1.645,4.007L77.423,66.822"/>
+</g>
+<g>
+<g>
+<linearGradient id="XMLID_17_" gradientUnits="userSpaceOnUse" x1="16.4624" y1="36.8472" x2="58.7645" y2="79.1493">
+<stop offset="0" style="stop-color:#FFFFFF"/>
+<stop offset="0.0055" style="stop-color:#FFFFFF"/>
+<stop offset="0.5593" style="stop-color:#EEEDED"/>
+<stop offset="1" style="stop-color:#E5E4E4"/>
+</linearGradient>
+<path fill="url(#XMLID_17_)" d="M15.633,40.544c0,0-4.603-1.083-4.603,3.556s0,17.863,0,17.863 s-0.465,3.519,4.213,4.778c4.679,1.263,40.234,10.858,40.234,10.858s6.697,2.343,6.697-4.304s0-20.01,0-20.01 s0.567-5.395-4.573-6.246C52.462,46.188,15.633,40.544,15.633,40.544z"/>
+<g>
+<linearGradient id="XMLID_18_" gradientUnits="userSpaceOnUse" x1="47.6025" y1="60.0303" x2="57.9474" y2="72.3588">
+<stop offset="0" style="stop-color:#B2B2B2"/>
+<stop offset="0.071" style="stop-color:#B2B2B2"/>
+<stop offset="0.1967" style="stop-color:#333333"/>
+<stop offset="0.3607" style="stop-color:#262626"/>
+<stop offset="0.9016" style="stop-color:#262626"/>
+<stop offset="0.9891" style="stop-color:#000000"/>
+<stop offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<path fill="url(#XMLID_18_)" d="M40.008,69.447l15.262,4.812c2.007-0.974,2.897-2.031,2.897-4.021 c0-5.137,0-14.17,0-14.17s0.042-2.194-1.492-3.65L40.008,69.447z"/>
+<linearGradient id="XMLID_19_" gradientUnits="userSpaceOnUse" x1="22.75" y1="39.2256" x2="42.8448" y2="67.9239">
+<stop offset="0" style="stop-color:#BABABA"/>
+<stop offset="0.071" style="stop-color:#4D4D4D"/>
+<stop offset="0.1366" style="stop-color:#404040"/>
+<stop offset="0.6557" style="stop-color:#404040"/>
+<stop offset="0.7268" style="stop-color:#545454"/>
+<stop offset="0.7978" style="stop-color:#6B6B6B"/>
+<stop offset="0.8743" style="stop-color:#B2B2B2"/>
+<stop offset="1" style="stop-color:#B2B2B2"/>
+</linearGradient>
+<path fill="url(#XMLID_19_)" d="M40.463,69.591l-27.212-8.577V45.962 c1.536-1.535,3.222-1.181,3.222-1.181s33.211,5.733,37.697,6.457c1.277,0.208,2.148,0.758,2.739,1.418L40.463,69.591z"/>
+</g>
+<linearGradient id="XMLID_20_" gradientUnits="userSpaceOnUse" x1="17.521" y1="41.6763" x2="52.8252" y2="76.9805">
+<stop offset="0" style="stop-color:#E6E6E6"/>
+<stop offset="0.0056" style="stop-color:#E6E6E6"/>
+<stop offset="0.15" style="stop-color:#CCCCCC"/>
+<stop offset="0.3" style="stop-color:#B2B2B2"/>
+<stop offset="0.45" style="stop-color:#999999"/>
+<stop offset="0.6" style="stop-color:#808080"/>
+<stop offset="0.75" style="stop-color:#666666"/>
+<stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<path fill="url(#XMLID_20_)" d="M15.36,45.523c0,0-3.018-0.693-3.018,2.894c0,3.585,0,13.187,0,13.187 s-0.199,2.603,2.63,3.37c4.059,1.099,36.227,9.331,36.227,9.331s5.855,1.812,5.855-3.326c0-5.136,0-14.169,0-14.169 s0.203-4.142-3.997-4.828C48.573,51.248,15.36,45.523,15.36,45.523z"/>
+</g>
+<path d="M54.826,70.989v-7.528c0-2.342-1.675-2.456-1.675-2.456c-4.466-0.652-37.595-7.541-37.607-7.546 c-0.742-0.094-1.718-0.636-1.718,0.85c0,0.001,0,7.514,0,7.554c0.017,0.429,0.222,1.084,1.26,1.364l37.005,9.502 C52.092,72.729,54.826,73.424,54.826,70.989z"/>
+</g>
+</g>
+<g>
+<path fill="#1BA8CB" d="M22.255,54.849L4.23,71.605l38.231,10.764l12.364-14.03v-4.878 c0,0,0.095-2.203-1.675-2.456C50.556,60.634,22.255,54.849,22.255,54.849z"/>
+<path fill="#2589BD" d="M51.177,72.456c0,0-4.282-3.068-6.093-4.878c-1.81-1.809-6.03-1.485-8.351-0.093 c-2.32,1.391-4.779,3.201-6.125,1.855c-1.346-1.345-4.222-0.696-4.732-0.185c-0.511,0.51-14.639-4.064-14.639-4.064 l-1.717,1.595L46.37,77.924L51.177,72.456z"/>
+<polyline fill="#7FCECF" points="10.319,65.98 4.741,71.251 42.973,82.014 47.782,76.588 "/>
+<path fill="#8B6712" d="M47.572,76.934l-3.765,4.245L5.576,70.414l4.59-4.336c0,0,5.265,4.152,12.132,5.018 c6.867,0.866,8.784,2.165,12.125,3.712c3.341,1.546,13.328,1.945,13.328,1.945"/>
+<path fill="#0E2131" d="M46.116,78.575l-2.309,2.604L5.576,70.414l3.253-3.073c0,0,4.87,4.497,9.076,4.497 c4.208,0,2.228-0.989,5.383,1.175C26.442,75.18,44.998,79.692,46.116,78.575z"/>
+<path fill="#0E2131" d="M21.277,74.869c0,0,5.527-11.188,8.312-12.396c2.783-1.206,2.783-1.299,2.783,2.136 c0,3.434,1.114-1.3,1.114-1.95c0-0.649,2.597-2.505,2.041,0.465c-0.557,2.969,1.948-3.712,1.948-3.712 s0.372,3.712,1.021,2.134c0.65-1.576,1.038-3.193,1.038-3.193L28.71,56.164c0,0-5.433,0.278-5.71,0.559 c-0.278,0.276,3.943-0.048,4.918,0.927c0.974,0.973-6.403,1.484-6.403,2.413c0,0.927,6.033-1.021,6.033-1.021h1.298 c0,0-6.553,13.803-10.347,13.896c-3.794,0.092,2.516,1.67,2.516,1.67"/>
+<polyline fill="#8C8C8C" points="42.462,82.369 54.826,68.303 54.826,69.263 42.462,83.561 42.462,82.369 "/>
+<polygon fill="#D9D9D9" points="4.23,71.605 42.462,82.369 42.462,83.561 4.264,72.704 "/>
+<path fill="#FFFFFF" d="M54.826,68.303v-2.151L41.895,80.604L7.568,71.023l16.327-15.835 c-1.034-0.215-1.64-0.34-1.64-0.34L4.263,71.573l38.232,10.765L54.826,68.303"/>
+<path fill-opacity="0.74" stroke-opacity="0.74" d="M18.828,58.085l35.998,8.148v-2.772c0-2.342-1.675-2.456-1.675-2.456 c-3.187-0.465-20.969-4.107-30.898-6.156L18.828,58.085z"/>
+</g>
+</g>
+</g>
+</g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_bt.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
+<g>
+<g>
+<g>
+<path fill-rule="evenodd" fill="#FFFFFF" d="M24.351,3.984 c-1.875-2.179-4.605-3.238-8.35-3.238s-6.475,1.06-8.35,3.238C5.521,6.461,4.485,10.391,4.485,16s1.035,9.539,3.166,12.015 c1.875,2.18,4.605,3.238,8.35,3.238s6.475-1.06,8.35-3.238c2.129-2.476,3.164-6.405,3.164-12.015S26.479,6.461,24.351,3.984z"/>
+<path fill-rule="evenodd" fill="#0B3D91" d="M17.153,8.785l2.355,2.357l-2.355,2.355 V8.785L17.153,8.785z M17.153,23.214l2.355-2.356l-2.355-2.355V23.214L17.153,23.214z M14.636,16L9.54,10.891l1.477-1.477 l4.061,4.061v-9.73l7.383,7.381L17.585,16l4.875,4.875l-7.383,7.381v-9.73l-4.061,4.06L9.54,21.108L14.636,16L14.636,16z M16.001,30.253c6.225,0,10.514-2.956,10.514-14.253S22.226,1.746,16.001,1.746S5.485,4.703,5.485,16 S9.776,30.253,16.001,30.253L16.001,30.253z"/>
+</g>
+<rect fill="none" width="32" height="32"/>
+</g>
+</g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_kiosk.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 11.0, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg
+ xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" i:viewOrigin="405 313" i:rulerOrigin="0 0" i:pageBounds="0 595.2754 841.8896 0"
+ xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" width="32" height="32"
+ viewBox="0 0 32 32" overflow="visible" enable-background="new 0 0 32 32" xml:space="preserve">
+ <metadata>
+ <variableSets xmlns="&ns_vars;">
+ <variableSet varSetName="binding1" locked="none">
+ <variables></variables>
+ <v:sampleDataSets xmlns="&ns_custom;" xmlns:v="&ns_vars;"></v:sampleDataSets>
+ </variableSet>
+ </variableSets>
+ <sfw xmlns="&ns_sfw;">
+ <slices></slices>
+ <sliceSourceBounds y="281" x="405" width="32" height="32" bottomLeftOrigin="true"></sliceSourceBounds>
+ </sfw>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?><x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 3.0-29, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description rdf:about='uuid:f55c7c60-03c8-482f-a2d3-6f06bc1fe634'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <pdf:Producer>Adobe PDF library 6.66</pdf:Producer>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:f55c7c60-03c8-482f-a2d3-6f06bc1fe634'
+ xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:f55c7c60-03c8-482f-a2d3-6f06bc1fe634'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'
+ xmlns:xapGImg='http://ns.adobe.com/xap/1.0/g/img/'>
+ <xap:CreateDate>2005-08-31T14:12:21+03:00</xap:CreateDate>
+ <xap:ModifyDate>2005-08-31T12:01:27Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:MetadataDate>2005-08-31T14:12:21+03:00</xap:MetadataDate>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType='Resource'>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>256</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYqlWoeadCsarLdK8g/3VF+8avgeOw+nNVq+29Lg+qYJ7hufs/S5O
PR5J8gxy+/MWRqrYWwQdpJjU/wDArt+Oczq/bCR2wwrzl+ofrc/H2WP4j8khvNd1W+r9ZuXZD/us
Hin/AAK0Gcvq+1dTqP7yZI7uQ+Qc7Hp4Q5BUsNb1SyoLe4dUH+6yeSf8C1RkdJ2rqdP/AHcyB3cx
8jsjJp4T5hkVj57k2W9tww7yRGh/4Fv6502k9s5DbNC/OP6j+sOBk7NH8J+bILLzBpN5QRXCq5/3
XJ8Dfj1+jOn0nb2k1G0ZgS7pbH7efwcHJpckOYTDNw47sVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdiqTal5v8vafVZrxHlH+6ov3jV8Dx2H0nNXqu2dNh+qYJ7hufs/S5WLR
ZZ8h82L6j+aErVXTrQIO0s5qf+AXb/hjnOar2skdsUK85fqH63Y4uyR/Gfkxq/8AMWs6jUXd27of
91A8U/4FaDOa1faeoz/XMkd3IfIOwx6bHD6Qg1Oa4tqqpyBQqqciWKspyBQqqciWKqpyBYpjZaxq
NpQQTsqj9gnkv/AmozP0na+q0393Mgd3MfI7NGTBCfMJ9Z+cn2W7gDeLxmh/4E/1zqdH7bSG2aF+
cf1H9YcLJ2eP4SndpremXVBHMFc/sP8ACfx6/RnU6Pt/R6jaMwJd0vSft5/Bwp6aceYR2blodirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVSPVfO3lnTKrPepJKP90w/vXr4HjUD6SM1up7W0+H
6pAnuG7l4dDlyco7eezENT/NyZ6ppdkIx2muDyP/AACmg/4I5z+p9qJcsUa85fqH63Z4uxh/Gfkx
TUfM+u6nUXl5I8Z6xKeEf/ALRc53VdpZ8/1zJHdyHyDssWlx4/pCBU5ry3KqnIFCqpyJYoy1s7u5
P7iJnHiBt952ymeSMeZa5TA5pza+WbhqG4lWMfyr8R/gMw56wdA48tQOicWui6dBQ+n6jD9qT4vw
6fhmHPUTl1pollkVSfSLCbcxhG/mT4fw6ZGOeY6oGWQS+by/Ku8MgYfytsfvGZEdUOobRnHVByWt
zB/exlR49R942y4TjLkWYkDyaU4lKspyJYqqnIFij7PVL+2oIZmVR+wd1+47ZsNH2xqtN/dzIHdz
HyOzTkwQlzCc2vmp9hcwg/5cex+4/wBc6rR+3EhtnhfnH9R/WHDnoR/CU3ttX0+4oElAY/sP8J/H
Os0XtDo9RtGYEu6XpP28/hbhz0848wjM3TS7FXYq7FXYq7FXYq7FXYq7FXYqkGr+e/K2lcluL5JJ
l/3RB+9evgeNQv8AsiM12o7V0+L6pWe4buZh0GbJyjt57MJ1b85535JpNiIx2muTyb/kWhAH/BHN
HqPaU8sca8z+ofrdrh7EH8cvkw7VPNnmHViRfX0kkbdYVPCP/gEop+nNBqe0M+b65Eju5D5O0xaP
Fj+mIS5TmAW9WU5AsVVTkShHWmn31zT0YWZT+1Si/wDBHbKMmWMeZapTiOZTu08qzGhuZgg/kT4j
95pmFk1w/hDjy1I6BOrTRdNt6FYhIw/ak+I/d0/DMLJqZy6uPLLIpkpAFB0HTMYtK8NgpC8NkaQv
BwIbxV2KoaXT7SXcxhT/ADLsfwyyOWQ6sxMhCSaOw3ieo8G2P3jLRqO9mMveh3t54vtoQPHqPvGW
CYPJmJAuU4lVVTkCxVVORLFHWuo3lvQRSsFH7J3X7jmx0fbOq0393kkB3cx8js1TwxlzCa23mJth
PED/AJSbfgf651mi9u5DbPjvzj+o/rDiT0XcUzg1KznpwkAY/stsfxzrtF7RaLU7QyAS7pek/bz+
FuJPBOPMInN21OxV2KuxV2KuxVj/AJ61+90Ly/Jf2ao04kSNfUBZRzNCaAjNd2pq5YMJnGrvq5ug
08cuXhlyeKav5t8x6vUX19LJG3WFTwj/AOATip+nOG1HaGfN9ciR3dPk9Vh0eLH9MQlGYbkuxVep
yJYpjZaVqN1QwwMVP7Z+FfvNBmPkzwjzLVPJGPMp7Z+UHNDdzhfFI9z/AMEf6Zg5NeP4Q409V3BP
LPRdMtqFIQzj9t/iP47ZhZNROXMuNLLI9UyBzGal4bAhcGyNIXhsFIXhsFIXhsjSF4bBSF4ORVdi
h2KuxV2KqUlrA/VAD4jY5ITIZCRCHbTyP7tvob+uWDL3suNTMMqfaU08eoyXECmwuU4CqqpyBYqq
nIlii4L26h/u5CAP2TuPuObLRdtavS/3WSQHdzHyOzVPFGXMJ9p9zJcWwkcDlUg09s9d9ne0sms0
oy5K4rI28nW5oCMqCJzetTsVdirsVYj+aoB8l3dR0khI/wCRgzT9vf4rL3j73Zdk/wB+Pj9zwvOB
euTzSPJXmfVuLWlhIIW6Tyj0o6HuGenL/Y1zP0/ZmfN9MTXedg4mbXYsf1S3+aJtPJ1aG7n+aRD/
AI2b+mc9k7Q/mj5olqu4J5Z6NpdrQxQKWH7b/E34/wAMwsmonLmXGnllLmUxDZjU1Lw2BC8NkaQv
DYKQvDYELw2RQvDYKQvDZGkLw2BC8NgpVwbI0heGwIX1wIdirsVdirsVdiqxoo26rv44RIptYben
2T9Bw8SeJES6dfQfbiPEftL8Q/DN1rfZ/WafeeM8PePUPs5fFqjnhLkVNTmkLYyHRv8AeIf6xz2D
2K/xAf1pOr1X1o7Otcd2KuxV2Kpfr2h2mt6a+nXbOsEjIzmMgN8DBgKkHwzG1eljnhwS5Hub9Pnl
inxR5obSPJ/lrSQDZWESyL/u5x6kn/BvyI+jK9P2dgw/TEX38z9rPNrcuT6pFOczXFeTBs8Gp6le
GyNIXhsCFwbBSF4bI0heGwIXhsiheGwUheGwUheGyNKvDYKQvDZFC8NgpC8NkaQvDYKQuBwIbxV2
KuxV2KuxV2Kstz6OdIoT2NpPvJGCx/aGx+8Zqtb2HpNV/eY4k942PzDZDLKPIrra2jt4/TQkrUkV
98t7M7Nx6PF4WO+Gyd/NGSZkbKrmwYOxV2KuxV2KuxV2KvIg2eEPVLw2RpC8NgpC8NkULw2CkLw2
CkLw2RpC4NgpV4bI0heGwUheGwIXhsjSF4bAheGyKF4bBSF4bIoXg4EN4q7FXYq7FXYqy3Po50js
VdirsVdirsVdirsVdirsVePBs8Jp6teGwUheGwIfA2e8PLPUPqntiqWejnUcDzXG70ceBeN3o48C
8bvRx4F43ejjwLxu9HHgXjd6OPAvG70ceBeN3o48C8bvRx4F43ejjwLxu9HHgXjTP6p7Zy70ry/F
X6T584u7dirsVZbn0c6R2KuxV2KuxV2KuxV2KuxV2KvGw2eFvWLw2BC8NkaQ+Cc93eVe0/VfbFUh
9HOx4HkeN3o48C8bvRx4F43ejjwLxu9HHgXjd6OPAvG70ceBeN3o48C8bvRx4F43ejjwLxu9HHgX
jd6OPAvGn31X2zjnrni2Kv0nrnzi7t2KuxVlufRzpHYq7FXYq7FXYq7FXYq7FXYq8XDZ4bT1q8Ng
QvDZFXwbnuryb6C+qe2KsX9HO64HiON3o48C8bvRx4F43ejjwLxu9HHgXjd6OPAvG70ceBeN3o48
C8bvRx4F43ejjwLxu9HHgXjd6OPAvGyj6p7Zwr2759xV+kgbPnJ3i4HAhvFWW59HOkdirsVdirsV
dirsVdirsVdirxMNnh7168NkaQvDYKQvDYKQ8p+qe2e6PJsM9IZ6HwvAcTvSGPCvE70hjwrxO9IY
8K8TvSGPCvE70hjwrxO9IY8K8TvSGPCvE70hjwrxO9IY8K8TvSGPCvE70hjwrxMz+qe2eePfvoIN
nzrTvl4bBSF4bIoXg4EMuz6OdI7FXYq7FXYq7FXYq7FXYq7FXiAbPEaewXhsihcGwUhUDZGkMD+q
+2e5vJPPeGej0+d27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS29C+q+
2ecPoj2cNnzu79eGwUheGyNIXhsFIZln0Y6N2KuxV2KuxV2KuxV2KuxV2KvDA2eJPYrw2CkLw2RQ
vDYKQkH1T2z3F5F5Zwz0qnza3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3c
MaW3qf1T2zzV9Jelhs+eaegXhsjSF4bAq8NgpDNc+inQuxV2KuxV2KuxV2KuxV2KuxV4QGzxSnsl
4bAheGyNIXhsCFv1X2z295B43wz06nzG3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMa
W3cMaW3cMaW3sn1X2zzF9OZcGz57ehXhsjSrw2CkLw2RQznPol0DsVdirsVdirsVdirsVdirsVeC
hs8Wp7NeGyNIXhsCFwbBSE6+qe2e2vHvCuGeo0+WW7hjS27hjS27hjS27hjS27hjS27hjS27hjS2
7hjS27hjS27hjS27hjS291+qe2eXPqaZBs+fKejXhsFIXhsCF4bI0hnufQ7z7sVdirsVdirsVdir
sVdirsVeAhs8Ye0XhsjSF4bBSF4bIoZt9U9s9seOfPPDPVafKLdwxpbdwxpbdwxpbdwxpbdwxpbd
wxpbdwxpbdwxpbdwxpbdwxpbdwxpbfQ31T2zyp9XQobPn56ReGwUheGyNIXhsFIegZ9CvPOxV2Ku
xV2KuxV2KuxV2KuxV8+hs8Zp7VeGwIXhsCrw2RpD1P6r7Z7U8Y+aOGesU+R27hjS27hjS27hjS27
hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS2+l/qvtnk764xgNngFPSrw2RQvDYKQvDYEPRM+
g3nXYq7FXYq7FXYq7FXYq7FXYq+eg2eNvbrw2CkLw2RpC4NgQ9v+qe2e0PFu+qe2Ku+qe2Ku+qe2
Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2KvPA2eBPTLw2RpC8
NgQvDZGkPSM+gnnHYq7FXYq7FXYq7FXYq7FXYq+dg2eO09wvDYELw2RpC8NgpC8NkaQvDYKQvDZG
kLg2BC8NgpC8NkaQvDYKVeGyNIXhsCF4bAheGyNIXhsFIXhsiheGwUheGyNIXhsCF4bBSF4bIoel
59APNuxV2KuxV2KuxV2KuxV2KuxV85Bs8fe5XhsjSF4bBSF4bI0heGwUheGwIXhsjSF4bBSF4bI0
heGwUq8NgpC8NkaQuDYELw2RpC8NgpC8NkULw2CkLw2BC8NkaQvDYKQvDZFV4bBSHp+e/PMuxV2K
uxV2KuxV2KuxV2KuJoK4q+bw2eQU90vDYELw2CkLw2RpC4NgpC8NkaQvDYELw2ClXhsjSF4bBSF4
bIoXhsFIXhsFIXhsiheGwUheGyNIXhsFIXBsjSF4bAheGwUq8NkaQvDYEPU898eYdirsVdirsVdi
rsVdirsVdir571/S5dJ1m7sJAR6MhEZPeM7o30rTPLNbpjhyygeh+zo9rp8oyYxIdUEGzEptXhsi
heGwUheGwUheGyKrw2CkLw2RpC4NgpC8NgpC8NkaQvDYELw2RpC8NgpC8NkaQvDYKQvDYELw2RVe
GwUheGyNIXhsFIRml2j3l9DbKK82HL2UbsfuzM7O0Z1OeGMfxHf3dfsac0+CJL03PbXnHYq7FXYq
7FXYq7FXYq7FXYqxvzj5LtPMMCuGEGoQqRDcUqCK14P3K+Hhmp7U7Khqo3ymOR/Qfxs52i10sJ74
no8tv/I3mqxlKPp8s6jpJbqZlPv8FT94zi8/Y+pxmjAn+rv9z0OPX4Zj6gPfsxjVtY0rRbw2Os3s
GmXoUObW8lSCUK32W4SFWoe22Y/8naj/AFOf+lP6mz81i/nx+YQo86eT/wDq+6f/ANJUH/NeD+Tt
R/qc/wDSn9SPzWL+dH5hcPOvk7/q+6d/0lwf815H+TtR/qc/9Kf1I/NYv50fmF487eTv+r9p3/SX
B/zXg/k7U/6nP/Sn9S/mcX86PzC4ed/Jv/V+07/pLg/5rwfybqf9Tn/pZfqR+Zxfzo/MLx538mf9
X/Tv+kuD/mvB/Jup/wBTn/pZfqR+Zxfzo/MLx548mf8AV/07/pLg/wCa8j/Jup/1Of8ApZfqR+Zx
fzo/MLh558l/9X/Tf+kuD/mvB/Jup/1Of+ll+pH5nF/Oj8wvHnryV/1MGm/9JkH/ADXg/kzU/wCp
5P8ASy/Uv5nF/Oj8wuHnryT/ANTBpv8A0mQf814P5M1P+pZP9LL9SPzGP+dH5hePPfkn/qYdN/6T
IP8AmvI/yZqf9Syf6WX6kfmMf86PzC4efPJH/Uw6Z/0mW/8AzXg/kzVf6lk/0sv1I/MY/wCdH5he
PPvkf/qYtM/6TLf/AJrwfyXqv9Syf6WX6kfmMf8AOj8wuHn3yP8A9TFpn/SZb/8ANeD+S9V/qWT/
AEsv1L+Yx/zo/MLx5+8jf9TFpn/Sbb/815H+S9V/qWT/AEkv1I/MY/50fmF48/8AkX/qY9L/AOk2
3/5rwfyXqv8AUsn+kl+pH5jH/Oj8wuH5geRP+pj0v/pNt/8AmvB/JWq/1LJ/pJfqR4+P+cPmEw0b
zL5e1q9Fjo+qWmpXrKXFrZzxTylV+03CNmag77YP5K1X+pZP9JL9SPHx/wA4fNk9p5c1u4cKtq8Y
7tKDGB/wVD92ZGn7A1mU0Mco+cvT97XPV449fkzXQdAg0uIsT6l04pJLTYD+VfbPQuxew4aKN/Vk
lzP6B5fe6jU6k5D5Jrm9cV2KuxV2KuxV2KuxV2KuxV2KuxV2KvhX/nLz/wAnLc/8wNp/xE4q8VxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvav+cQ//Jy23/MDd/8AERir7qxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2Kvlf/AJyH/Ib8y/On5kTa55f0+K5057W3iWV7iGI841IYcXZWxV5n/wBC
n/nb/wBWeD/pMtv+qmKu/wChT/zt/wCrPB/0mW3/AFUxV3/Qp/52/wDVng/6TLb/AKqYq7/oU/8A
O3/qzwf9Jlt/1UxV3/Qp/wCdv/Vng/6TLb/qpirv+hT/AM7f+rPB/wBJlt/1UxV3/Qp/52/9WeD/
AKTLb/qpirv+hT/zt/6s8H/SZbf9VMVd/wBCn/nb/wBWeD/pMtv+qmKu/wChT/zt/wCrPB/0mW3/
AFUxV3/Qp/52/wDVng/6TLb/AKqYq7/oU/8AO3/qzwf9Jlt/1UxV3/Qp/wCdv/Vng/6TLb/qpirv
+hT/AM7f+rPB/wBJlt/1UxV3/Qp/52/9WeD/AKTLb/qpirv+hT/zt/6s8H/SZbf9VMVemf8AOPH5
DfmX5L/MiHXPMGnxW2nJa3ETSpcQynnIoCjijM2KvqjFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9k=</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:f55c7c60-03c8-482f-a2d3-6f06bc1fe634'
+ xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'>
+ <xapMM:DocumentID>uuid:98c671b0-8b65-4ea2-a622-4a99e13331d7</xapMM:DocumentID>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:f55c7c60-03c8-482f-a2d3-6f06bc1fe634'
+ xmlns:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+ <?xpacket end='w'?>
+ </metadata>
+ <g id="Layer_1" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+ <g>
+ <rect i:knockout="Off" fill="none" width="32" height="32"/>
+ <g i:knockout="Off">
+ <path i:knockout="Off" fill="#FFFFFF" d="M15.682,2.043L2.399,6.471C1.99,6.608,1.714,6.992,1.716,7.424L1.725,9.39
+ c0.001,0.319,0.155,0.619,0.414,0.806c0.259,0.187,0.592,0.239,0.896,0.14c0,0,0.494-0.161,0.966-0.314
+ c0,2.306,0,14.843,0,14.843c0,1.418,1.009,2.554,2.333,2.865c0,0.482,0,0.968,0,0.968c0,0.553,0.448,1,1,1h17.334
+ c0.553,0,1-0.447,1-1c0,0,0-0.484,0-0.965c0.539-0.126,1.05-0.346,1.452-0.749C27.688,26.417,28,25.664,28,24.865
+ c0,0,0-12.539,0-14.848c0.478,0.156,0.977,0.319,0.977,0.319c0.305,0.1,0.639,0.047,0.898-0.142
+ c0.259-0.188,0.412-0.49,0.412-0.811l-0.003-1.966c-0.001-0.43-0.276-0.811-0.684-0.947L16.318,2.043
+ C16.113,1.975,15.887,1.975,15.682,2.043z"/>
+ </g>
+ <rect x="7.333" y="26.865" i:knockout="Off" width="17.334" height="1.833"/>
+ <linearGradient id="XMLID_5_" gradientUnits="userSpaceOnUse" x1="25.3057" y1="5.1343" x2="5.7579" y2="29.5982">
+ <stop offset="0.2022" style="stop-color:#FEF700"/>
+ <stop offset="1" style="stop-color:#D37700"/>
+ <a:midPointStop offset="0.2022" style="stop-color:#FEF700"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FEF700"/>
+ <a:midPointStop offset="1" style="stop-color:#D37700"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_5_)" d="M16.021,4.386L27,8v16.865c0,1.1-0.9,2-2,2H7c-1.1,0-2-0.9-2-2V8L16.021,4.386z
+ "/>
+ <g>
+ <rect x="8" y="11" i:knockout="Off" width="16" height="3"/>
+ <linearGradient id="XMLID_6_" gradientUnits="userSpaceOnUse" x1="16.0005" y1="22" x2="16.0005" y2="8.2506">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#000000"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#000000"/>
+ </linearGradient>
+ <rect x="9" y="11" i:knockout="Off" fill="url(#XMLID_6_)" width="14" height="11"/>
+ <linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="16.0005" y1="21" x2="16.0005" y2="8.5006">
+ <stop offset="0.0056" style="stop-color:#0094FF"/>
+ <stop offset="0.5225" style="stop-color:#0062B7"/>
+ <stop offset="1" style="stop-color:#001021"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#0094FF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094FF"/>
+ <a:midPointStop offset="0.5225" style="stop-color:#0062B7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0062B7"/>
+ <a:midPointStop offset="1" style="stop-color:#001021"/>
+ </linearGradient>
+ <rect x="10" y="11" i:knockout="Off" fill="url(#XMLID_7_)" width="12" height="10"/>
+ </g>
+ <linearGradient id="XMLID_8_" gradientUnits="userSpaceOnUse" x1="30.4277" y1="0.6431" x2="8.4277" y2="12.4771">
+ <stop offset="0.2022" style="stop-color:#FEF700"/>
+ <stop offset="1" style="stop-color:#D37700"/>
+ <a:midPointStop offset="0.2022" style="stop-color:#FEF700"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FEF700"/>
+ <a:midPointStop offset="1" style="stop-color:#D37700"/>
+ </linearGradient>
+ <polygon i:knockout="Off" fill="url(#XMLID_8_)" points="29.284,7.42 16.002,2.992 16,2.998 15.998,2.992 2.716,7.42
+ 2.725,9.386 16.032,5.053 29.287,9.386 "/>
+ </g>
+ </g>
+ </svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_mmc.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="24" height="24" viewBox="0 0 24 24"
+ overflow="visible" enable-background="new 0 0 24 24" xml:space="preserve">
+<g>
+ <rect width="24" height="24"/>
+ <polygon fill="#FFFFFF" points="21.379,9.357 16.801,4.904 2.62,4.904 2.62,18.496 21.379,18.496 "/>
+ <rect x="16.608" y="9.374" width="3.021" height="1.806"/>
+ <rect x="16.608" y="12.375" width="3.021" height="1.805"/>
+ <rect x="16.608" y="15.245" width="3.021" height="1.805"/>
+</g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_bar.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ width="299.001" height="4" viewBox="0 0 299.001 4" overflow="visible" enable-background="new 0 0 299.001 4"
+ xml:space="preserve">
+ <metadata>
+ <x:xmpmeta x:xmptk="XMP toolkit 3.0-29, framework 1.6" xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:iX="http://ns.adobe.com/iX/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/"></rdf:Description>
+ <rdf:Description rdf:about="" xmlns:tiff="http://ns.adobe.com/tiff/1.0/"></rdf:Description>
+ <rdf:Description rdf:about="" xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/" xmlns:xap="http://ns.adobe.com/xap/1.0/">
+ <xap:CreateDate>2005-12-13T08:31:39Z</xap:CreateDate>
+ <xap:ModifyDate>2005-12-13T08:31:39Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>4</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgABAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8ANR/0JN2+o/8AczwoXD/o
+Snt9R/7mWHdGy4f9CWdvqP8A3Msl6kelcP8AoS/t9S/7mWH1o9K4f9CY9vqX/cyw+tHoXD/oTTt9
+S/7mOS/eI9DY/wChN+31L/uY4f3rH92uH/QnXb6l/wBzHJfvkfulw/6E97fU/wDuY4f334pH7pcP
++hP+31P/ALmGS/f/AIpH7lcP+hQu31P/ALmGH/CPxSP3P4tcP+hRe31P/uYZL/CfxSP3H4tcP+hS
+O31P/uYYf8K8/sY/4P8Ai1w/6FL7fU/+5hkv8K8/sR/g/wCLXD/oU3t9U/6f8P8Ahfn9iP8ABvxb
+Y/6FQ7fVP+n/AA/4Z5/Yj/BvL7Vw/wChU+31T/p/w/4Z5/Yj/BfL7Vw/6FV7fVP+n/H/AAzz+xH+
+CeX2tj/oVft9U/6fsP8Ahvn9iP8ABPL7Vw/6FZ7fVP8Ap+w/4b5/Yj/A/L7Wx/0K5/y6/wDT9j/h
+vn9iP8D8vtXf9Yvf8uv/AE/Yf8O8/sR/gXl9rY/6Fg/5df8Ap+w/4d5/7FH+BeX2rh/0LF2+q/8A
+T7j/AId5/wCxR/gXl9rY/wChZP8Al1/6fcP+H+f+xX/AfL/ZN/8AWM3/AC6/9PuP+H+f+xR/gPl/
+slw/6Fo/5df+n3D/AIf5/wCxR/gHl/sm/wDrGn/l1/6fcf8AD/P/AGKP8A8v9k3/ANY1/wDLt/0+
+4f8AXDz/ANiv+AeX+yb/AOsbP+Xb/p9x/wBcPP8A2KP9b/L/AGTf/WN3/Lt/0+4/64ef+xX/AFv8
+v9k7/rG//l2/6fMP+uHn/sUf63+X+yf/2Q==
+ </xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+ </rdf:RDF>
+ </x:xmpmeta>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?><x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 3.0-29, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description rdf:about=''
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'
+ xmlns:xapGImg='http://ns.adobe.com/xap/1.0/g/img/'>
+ <xap:CreateDate>2005-12-13T08:31:39Z</xap:CreateDate>
+ <xap:ModifyDate>2005-12-13T08:32:56Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType='Resource'>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>4</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgABAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AgF9/yrr69cc/8Zc/Vfl6
XD068jXh/k+GdLl4+M34vM8uKvh5PL4eDgjXhchz4b+PmpD/AJVx/wB/p/wmQ9X+2/7Jn6P9p/2K
4f8AKuf+/wA/+EyQ4/8Abf8AZI9H+0/7FcP+Vdf9/l/wmS9f+2/7Jj6P9q/2K8f8q7/7/H/hMI4/
9s/2SPR/tX+xXD/lXf8A3+H/AAmS9f8Atn+yR6P9q/2K4f8AKvP+/v8A+EyX7z/bP9kx9H+1f7Fs
f8q8/wC/t/5J4f3n9P8A2S/u/wDa/wDYtj/lXv8A39n/ACTwjxP6f+yR+7/2v/Yrh/yr3/v6v+Se
S/ef0v8AZI/d/wBD/Yt/8g+/7+n/AJJ4f3n9L/ZI/d/0P9i3/wAg+/7+f6fSw/vP6X+yX93/AEP9
i2P+Vf8A/fy/T6WH975/7JH7v+j/ALFv/kH/AP38n/JLJfvfP/ZI/d/0f9i3/wA6B/38X0+jh/e/
i1/d+X+xb/50D/v4f+SOH97+LR+78v8AYt/86D/2v/p9HH97+LX915fY7/nQf+19/wAkcf3v4tH7
r8U3/wA6F/2vP+SGP73y+1f3X4pv/nQv+13/AMkMP73y+1H7r8U7/nQv+1z/AMkMf3vl9q/uvP7H
f86H/wBrj/khj+98vtX915/Y7/nQ/wDtbf8ATvj+9/o/av7rz+x3/Oh/9rX/AKd8f3v9H7V/df0v
sb/50P8A7Wf/AE74/vf6P2r+6/pfY7/nRP8AtZf9O2P73+j9q/uv6f2O/wCdE/7WP/Ttj++/ofav
7r+n9jX/ADon/L//ANO2P77+h9q/uv6bv+dE/wCX7/p2x/ff0PtX91/Td/zon/L7/wBOuP77+h9q
/uv9sa/50T/l8/6dcf339BP7r/bFkv8AgT03r9cpxNeP1WvTt75E+LX8CY+FY/vH/9k=</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+ <?xpacket end='w'?>
+ </metadata>
+ <g id="Layer_1">
+ <g>
+ <linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="73.7603" y1="77.7402" x2="225.2508" y2="-73.7503">
+ <stop offset="0" style="stop-color:#0094F8"/>
+ <stop offset="0.2022" style="stop-color:#0094F8"/>
+ <stop offset="0.3387" style="stop-color:#0089EA"/>
+ <stop offset="0.5988" style="stop-color:#006EC4"/>
+ <stop offset="0.9529" style="stop-color:#004187"/>
+ <stop offset="1" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="0" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.2022" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.3387" style="stop-color:#0089EA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0089EA"/>
+ <a:midPointStop offset="0.5988" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.9529" style="stop-color:#004187"/>
+ <a:midPointStop offset="0.5" style="stop-color:#004187"/>
+ <a:midPointStop offset="1" style="stop-color:#003B7E"/>
+ </linearGradient>
+ <polyline fill="url(#XMLID_3_)" points="0,0 299.001,0 299.001,4 0.02,4 "/>
+
+ <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="366.0947" y1="2" x2="662.8066" y2="2" gradientTransform="matrix(-1 0 0 1 663.9512 0)">
+ <stop offset="0" style="stop-color:#006EC4"/>
+ <stop offset="0.1215" style="stop-color:#0067BA"/>
+ <stop offset="0.3276" style="stop-color:#00539F"/>
+ <stop offset="0.5337" style="stop-color:#003B7E"/>
+ <stop offset="1" style="stop-color:#000000"/>
+ <a:midPointStop offset="0" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5899" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5337" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="0.5" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="1" style="stop-color:#000000"/>
+ </linearGradient>
+ <rect x="1.145" y="1" fill="url(#XMLID_4_)" width="296.712" height="2"/>
+ </g>
+ </g>
+ </svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_bar_short.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ width="125.002" height="4" viewBox="0 0 125.002 4" overflow="visible" enable-background="new 0 0 125.002 4"
+ xml:space="preserve">
+ <metadata>
+ <x:xmpmeta x:xmptk="XMP toolkit 3.0-29, framework 1.6" xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:iX="http://ns.adobe.com/iX/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/"></rdf:Description>
+ <rdf:Description rdf:about="" xmlns:tiff="http://ns.adobe.com/tiff/1.0/"></rdf:Description>
+ <rdf:Description rdf:about="" xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/" xmlns:xap="http://ns.adobe.com/xap/1.0/">
+ <xap:CreateDate>2005-12-13T08:31:03Z</xap:CreateDate>
+ <xap:ModifyDate>2005-12-13T08:31:03Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>8</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgACAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8ALc9WfIXYq7FXYq7FXYq0
+RgStIxStIwMlhGBK0jAlYRgZArCMiyBWEYGQKwjAyBWEZFkCpkYGQKwjAyBWEZFkCsZcDIFTZciy
+BU2XAyBWMuRZgqbLgZAqbLkWQKmRgZgqbLkWQKxlwMgVNlyLMFTZcDIFTZciyBU2XAQzBf/Z
+ </xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+ </rdf:RDF>
+ </x:xmpmeta>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?><x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 3.0-29, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description rdf:about=''
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'
+ xmlns:xapGImg='http://ns.adobe.com/xap/1.0/g/img/'>
+ <xap:CreateDate>2005-12-13T08:31:03Z</xap:CreateDate>
+ <xap:ModifyDate>2005-12-13T08:34:54Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType='Resource'>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>8</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgACAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5p5pm/MldamGhhv0bxT0
qJbkV4jlvIOX2s7XXy14ynwfo2/m/peF7Oj2ecI8b+83/nfo2SoXH5x9w/8AyLtP6ZiCfann8oOZ
wdk+XzmuFx+cHcP/AMBaf0yQn2n+BBHB2V5fOa8XH5u9w/8AwFr/AEyXH2l+BBjwdl+XzmuE/wCb
XcP/AMBa/wBMkJ9o/gRRwdl+XzmuE/5r9w//AAFr/TDx9ofgRY8HZn4M1wm/NPuH/wCAtv6ZLi1/
44UcHZv4M1wm/M/uG/4C2/pkuLXfjhXh7O/Bk2JfzK7hv+At/wCmHi1v44UcPZ/4MmxL+Y3cN/wN
v/TDxaz8cKOHQfjib9T8we4b/gYP6ZLi1f44UcOh/HE36nnzuG/4GD+mG9V+KXh0X44m+fnfuG/4
GH+mG9T+KRWj/HE3z85dw3/Aw/0w3qPxS1pPxxN8/NvcH/gYv6ZK8/4pFaX8W3y80dwfuj/pjeb8
Utab8W7l5j7g/dHjeX8UitP+Lb5a/wBwfuTD+9WsH4t1da7g/cmP7xf3P4tuurdwfuXH1o/dfi3f
7ke4P3Lj6l/du/0zuP1Y+pfQ6k/f+GO6+l1H74rs7ivfFba4wd/440Fsu42nf+ONRTcncLDv+tsa
itza4aZ3p97YKgt5HcNH70+98agt5fxTXp6J3p9741jTeb8Uh75NJFu31enrVFN28d+uQyCFbc23
CcvF6uXwf//Z</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+ <?xpacket end='w'?>
+ </metadata>
+ <g id="Layer_1">
+ <g>
+ <linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="30.2607" y1="34.2417" x2="94.7521" y2="-30.2496">
+ <stop offset="0" style="stop-color:#0094F8"/>
+ <stop offset="0.2022" style="stop-color:#0094F8"/>
+ <stop offset="0.3387" style="stop-color:#0089EA"/>
+ <stop offset="0.5988" style="stop-color:#006EC4"/>
+ <stop offset="0.9529" style="stop-color:#004187"/>
+ <stop offset="1" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="0" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.2022" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.3387" style="stop-color:#0089EA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0089EA"/>
+ <a:midPointStop offset="0.5988" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.9529" style="stop-color:#004187"/>
+ <a:midPointStop offset="0.5" style="stop-color:#004187"/>
+ <a:midPointStop offset="1" style="stop-color:#003B7E"/>
+ </linearGradient>
+ <polyline fill="url(#XMLID_3_)" points="0,0 125.002,0 125.002,4 0.02,4 "/>
+
+ <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="506.7969" y1="2" x2="629.5098" y2="2" gradientTransform="matrix(-1 0 0 1 630.6543 0)">
+ <stop offset="0" style="stop-color:#006EC4"/>
+ <stop offset="0.1215" style="stop-color:#0067BA"/>
+ <stop offset="0.3276" style="stop-color:#00539F"/>
+ <stop offset="0.5337" style="stop-color:#003B7E"/>
+ <stop offset="1" style="stop-color:#000000"/>
+ <a:midPointStop offset="0" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5899" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5337" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="0.5" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="1" style="stop-color:#000000"/>
+ </linearGradient>
+ <rect x="1.145" y="1" fill="url(#XMLID_4_)" width="122.713" height="2"/>
+ </g>
+ </g>
+ </svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_handle.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.0"
+ width="32"
+ height="32"
+ id="svg1467">
+ <defs
+ id="defs1469">
+ <linearGradient
+ x1="-239.9175"
+ y1="414.63229"
+ x2="-206.6431"
+ y2="414.63229"
+ id="XMLID_17_"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-1,242,431.6357)">
+ <stop
+ style="stop-color:#0094f8;stop-opacity:1"
+ offset="0"
+ id="stop1370" />
+
+ <stop
+ style="stop-color:#0094f8;stop-opacity:1"
+ offset="0.2022"
+ id="stop1372" />
+
+ <stop
+ style="stop-color:#0089ea;stop-opacity:1"
+ offset="0.3387"
+ id="stop1374" />
+
+ <stop
+ style="stop-color:#006ec4;stop-opacity:1"
+ offset="0.5988"
+ id="stop1376" />
+
+ <stop
+ style="stop-color:#004187;stop-opacity:1"
+ offset="0.95289999"
+ id="stop1378" />
+
+ <stop
+ style="stop-color:#003b7e;stop-opacity:1"
+ offset="1"
+ id="stop1380" />
+
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.2022"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.3387"
+ style="stop-color:#0089EA" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0089EA" />
+
+ <a:midPointStop
+ offset="0.5988"
+ style="stop-color:#006EC4" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#006EC4" />
+
+ <a:midPointStop
+ offset="0.9529"
+ style="stop-color:#004187" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#004187" />
+
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#003B7E" />
+
+ </linearGradient>
+ </defs>
+ <g
+ id="layer1">
+ <g
+ transform="matrix(0.961712,0,0,1.09174,-3.191334,-3.399255)"
+ id="g1364">
+
+
+ <g
+ transform="translate(1.235389,0.764611)"
+ id="g1367">
+
+ <linearGradient
+ x1="-239.9175"
+ y1="414.63229"
+ x2="-206.6431"
+ y2="414.63229"
+ id="linearGradient1484"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-1,242,431.6357)">
+ <stop
+ style="stop-color:#0094f8;stop-opacity:1"
+ offset="0"
+ id="stop1486" />
+
+ <stop
+ style="stop-color:#0094f8;stop-opacity:1"
+ offset="0.2022"
+ id="stop1488" />
+
+ <stop
+ style="stop-color:#0089ea;stop-opacity:1"
+ offset="0.3387"
+ id="stop1490" />
+
+ <stop
+ style="stop-color:#006ec4;stop-opacity:1"
+ offset="0.5988"
+ id="stop1492" />
+
+ <stop
+ style="stop-color:#004187;stop-opacity:1"
+ offset="0.95289999"
+ id="stop1494" />
+
+ <stop
+ style="stop-color:#003b7e;stop-opacity:1"
+ offset="1"
+ id="stop1496" />
+
+ <a:midPointStop
+ offset="0"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.2022"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0094F8" />
+
+ <a:midPointStop
+ offset="0.3387"
+ style="stop-color:#0089EA" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#0089EA" />
+
+ <a:midPointStop
+ offset="0.5988"
+ style="stop-color:#006EC4" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#006EC4" />
+
+ <a:midPointStop
+ offset="0.9529"
+ style="stop-color:#004187" />
+
+ <a:midPointStop
+ offset="0.5"
+ style="stop-color:#004187" />
+
+ <a:midPointStop
+ offset="1"
+ style="stop-color:#003B7E" />
+
+ </linearGradient>
+
+ <path
+ d="M 35.357,30.241 C 35.357,31.024 34.677,31.66 33.838,31.66 L 3.6,31.66 C 2.763,31.66 2.083,31.024 2.083,30.241 L 2.083,3.768 C 2.083,2.984 2.762,2.349 3.6,2.349 L 33.838,2.349 C 34.677,2.349 35.357,2.985 35.357,3.768 L 35.357,30.241 z "
+ style="fill:url(#XMLID_17_)"
+ id="path1382" />
+
+ </g>
+
+ </g>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_left.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ width="13.926" height="13.5" viewBox="0 0 13.926 13.5" overflow="visible" enable-background="new 0 0 13.926 13.5"
+ xml:space="preserve">
+ <metadata>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?><x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 3.0-29, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description rdf:about=''
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'
+ xmlns:xapGImg='http://ns.adobe.com/xap/1.0/g/img/'>
+ <xap:CreateDate>2005-12-13T08:29:40Z</xap:CreateDate>
+ <xap:ModifyDate>2005-12-13T08:29:40Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType='Resource'>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>248</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUNqOp6dplnJe6jcxWlpEKyTzu
saD5sxAyUYGRoCyxlIRFnYPEfPf/ADk5p9oZLLyhbC+mFVOp3IZYAfGOL4Xf5txHsRm20/ZRO+Q1
5Osz9pAbQ383gXmXzf5l8y3313W9QmvZwax8zRI69o41oiD/AFQM3GPDDGKiKdZPLKZuRt6x/wA4
/wD5va1D5gtfKmt3T3mm3/7qwlnYvJBMBVEDn4ij048expSgrms7Q0cTEziKIdhotUeLhlyL6czR
O4dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqG1HUtP020kv
NQuYrS0iFZJ5nVEHzZiBkoQMjQFljKYiLJoPF/O//OTGl2fqWnlO2+v3AqP0hcBktwfFI/hkf6eP
05t9P2RI75DXk6vP2pEbQF+bwXzR5x8y+Z7v61rl/LeOCTHGxpFHXtHGtEX6Bm5xYIYxURTqcmae
Q3I2kLZYxCw4CyCfflyf+Qh+V/8Atr2P/UTHmNqf7uX9U/c5Gn/vI+8Pu7OTekdirsVdirsVdirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqG1DUtP020kvNQuY7S1iFZJ5nCIPmzEDJ
QgZGgLLGcxEWTQeN+dv+ck9LtPUtPKtt9fnFR9fuAyQA+KR/C7/Tx+nNxp+x5HfIa8urqdR2tEbQ
F+bwjzP5w8yeZrv61rd/LeOCTGjGkaV7RxrRF+gZu8WnhjFRFOny555DcjaRNljAKbYGYU2yLILD
gLIJ9+XX/kw/K/8A217D/qJjzG1P93L+qfucjT/3kfeH3dnJvSOxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxVDahqNhp1o95f3MdraxCsk8zBEHzLUGShAyNRFljOYiLJoPHvO
n/OR+mWnqWvla2+vTio+v3AZIAfFI/hd/p4/Tm603Y0jvkNeXV0+o7YiNsYvz6PDPM3m7zH5ku/r
WtX0l24JMaMaRpXska0RfoGbzDp4YhURTpcueeQ3I2kbZa1hTbIswptkWQU2wMwptkWQWHAWQT78
uv8AyYflf/tr2H/UTHmNqf7uX9U/c5Gn/vI+8Pu7OTekdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVdirsVdirsVdiqHv8AULHT7WS7vriO1tYhWSeZgiD5lqDJQhKRqIssZzjEXI0HkPnL/nIrTbT1
LXyvb/XpxUfXrgMkAPikezv9PH6c3em7Fkd8hry6uk1PbURtjF+fR4f5k82+YvMd19Z1m+ku3BJj
RjSNK9kjWiL9AzfYdPDEKgKdHm1E8puRtJGy1rCm2RZhTbAyCm2RZhDS3Ea7A8j4DNdqO0cePb6j
5Ow0+gyZN/pHmoxzO8m+wp0zE0eunmy0do1ycrV6OGLHY52vbNu6wLDgLIJ9+XX/AJMPyv8A9tew
/wComPMbU/3cv6p+5yNP/eR94fd2cm9I7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVC
9vbOxtnur2eO2tohWSaVgiKPdmIGShAyNAWWM5iIsmg8n84/85CaTZc7Xy1B+kLkVH1yYMlup/yV
2eT/AIUe5zd6XsSct8h4R3dXR6rtuEdsY4j39HiPmbzf5j8yXP1jWL6S5INY4ieMSf6ka0VfnSud
Bg02PEKgKdDm1OTKbmbSNsuagptkWQU2wMgptkSzCDnvYU2Hxt4Dp9+azU9qYsew9R8v1uz0/ZuT
JufSPP8AUgZbmWTqaL/KM0Oo1+TLsTQ7g7vT6HHi5Cz3lSzCcxVt/wC8+jNn2T/e/B1/af8AdfFW
bOjdCFhwFkE48jSPF538vSoaOmp2bKfcXCEZRqB+7l7i34frHvD70zkXpXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYqoXl7Z2Vs91eTx21tGKyTSsERR7s1BkoQMjURZYzmIi5Gg8p83/wDOQGlW
fO28twfpC4FR9cmDJbqf8ldnf/hR7nN7pew5y3yHhHd1dFqu3YR2xjiPf0/a8W8yebvMXmO59fWL
2S5INY4ieMSf6ka0VfurnQ4NLjwioCnns+qyZjczaSNlzSFNsiWQU2wMwpttkSWQCAuNSgjqE/eN
7dPvzVantbFj2j6j9nzdrpuysk95ekfb8ktmu55q8mov8o2Gc/qNfly8zt3B32n0OPFyG/eVHMNz
HYq7FVW3/vPozZ9k/wB78HX9p/3XxVmzo3QhYcBZBNvJf/KZaD/20bT/AJPplGf6Je4t2H6x7w+9
s5F6Z2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqN5e2dlbPc3k8dvbxisk0rBEUe7NQZKEJSNRFlj
OcYi5Gg8r83fn5pVnztvLkH1+4FR9cmDJbqf8ldnf/hR7nN9pOwZy3ynhHd1/Y6DV9vwjtiHEe/p
+14z5j82eYfMVz6+r3slyQaxxE8Yk/1I1oq/dXOiwaXHhFQFPOajV5MxuZtJDl7SFhyLILGwMgpu
QASdgOpyJNM4i0sutXt46rF+9f2+z9+afVdsY4bQ9R+x3Gl7IyT3l6R9qVXF7cTn42ov8g2Gc/qd
dlzfUdu7o9BptDjw/SN+/qoZhuW7FXYq7FXYqq2/959GbPsn+9+Dr+0/7r4qzZ0boQsOAsgm3kv/
AJTLQf8Ato2n/J9Moz/RL3Fuw/WPeH3tnIvTOxV2KuxV2KuxV2KuxV2KuxV2KuxVRu7y0srd7m7m
S3t4xWSaVgiKPdmoMlCEpGoiyxnOMRcjQeXebPz50uz523l2D6/cCo+tzApAp/yV2d/+FHuc3+k7
AnLfKeEd3X9jz2r9oIR2xDiPeeX7fseN+YvNfmDzDcevq17JckGscRPGJP8AUjWij7q50mn0mPCK
gKea1GryZjczf3JMcuaQsOBkFM4GQU3ZVBZiAB1J2GQlIAWWcYkmglV3rlvHVYR6r+PRfv75pdV2
1jhtD1H7HdaXsXJPefpH2pPc31zcn94/w9kGy/dnPanW5cx9R27uj0em0WLCPSN+/qh8xHKdirsV
dirsVdirsVVbf+8+jNn2T/e/B1/af918VZs6N0IWHAWQTbyX/wAploP/AG0bT/k+mUZ/ol7i3Yfr
HvD72zkXpnYq7FXYq7FXYq7FXYq7FXYqpXN1bWsD3F1KkEEYrJLIwRFHiWNAMlCBkaAssZzERcjQ
eZ+a/wA89IsudvoEP6QuRt9Zkqlup9hs7/gPfN/pOwJy3ynhHd1/Y89rPaHHDbEOI9/T9rxzzF5q
1/zBcmfVbx7ihJjirxiSv8kY+EfrzptPpMeEVAV97y+p1mXObmb+75JKcvaAsOBkFhyLIKUjoiln
YKo6sTQZCchEWTQbIRMjQFlJ73zDbx1W3Hqv/MdlH8Tmj1fbkIbY/Ufs/a73Sdh5J75PSPt/Ykl1
fXVyazOSOyjZR9Gc7qNZlzH1n4dHo9NosWEegfHqh8xXKdirsVdirsVdirsVdirsVVbf+8+jNn2T
/e/B1/af918VZs6N0IWHAWQTbyX/AMploP8A20bT/k+mUZ/ol7i3YfrHvD72zkXpnYq7FXYq7FXY
q7FXYqpXN1bWsD3FzKkEEYrJLIwRVHiWNAMlCBkaAssZzjEXI0Hmvmr88NJsudvoMX6QuRUfWZKp
bqfYbO/4D3zoNH7PznvlPCO7r+x53W+0WOG2IcR7+n7XkPmHzZ5g8wT+rqt484BrHCPhiT/VjFFH
z6502m0eLAKgK+/5vLanW5c5ucr+75JKcyXGCw4GQUzkWQUpZI40LyMEQdWY0AyE5xiLkaDZjhKR
qIspHfeZYEJS1X1W/nbZf6nNBqu3oR2xjiPf0/b9j0Gk7AnLfIeEd3X9n2pDdX11dNymkLeC9FHy
Gc5qNXkzG5m/uel0+jx4RUBX3qGYzkuxV2KuxV2KuxV2KuxV2KuxV2Kqtv8A3n0Zs+yf734Ov7T/
ALr4qzZ0boQsOAsgm3kv/lMtB/7aNp/yfTKM/wBEvcW7D9Y94fe2ci9M7FXYq7FXYq7FVK5ura1g
ee5lSCCMVeWRgqqPEsaAZKEDI1EWWM5xiLkaDzfzT+duk2XO30KL9IXAqPrMlUgU+w2d/wAB750G
j9nsk98p4R3df2POa32kxw2xDjPf0/WXkfmHzXr+vz+rql28wBrHCPhiT/VQfCPn1zqNNosWAVAV
9/zeU1Wuy5zeSV/d8kmOZLjLTgSsOBkFGeaKGMySuEQdWY0GVZMkYC5Gg24sUpnhiLKQX/mqFapZ
r6jf78aoX6B1Oc/q+34jbEOI955PR6P2ekd8p4R3Dn+r72PXV7dXT8p5C/gD0HyHTOb1GqyZjczb
02n0mPCKhED8d6hmO5DsVdirsVdirsVdirsVdirsVdirsVdiqrb/AN59GbPsn+9+Dr+0/wC6+Ks2
dG6ELDgLIJj5VmMPmnR5gKmO+tnAPfjMpynMLgfcW7EfUPe++85B6Z2KuxV2KqVzc21rA89zKkEE
Yq8sjBVUeJY0AyUIGRqIssZzjEXI0HnHmj87NKs+dvoUX1+4G31mSqQKfYbO/wCA986HR+z2Se+U
8I7uv7Hm9b7SY4bYhxnv6frLybX/ADVr2vzerql28wBqkP2Yk/1UHwj59c6nTaLFgFQFff8AN5LV
a7LnN5JX5dPkk5zJcZacCVhwMlG4uIIIzJNIsaDqzGgyrLlhjHFIgBtxYZ5JcMASfJjmo+bo1qli
nM/79eoH0L1+/Oc1ftCBtiF+Z/U9No/ZwnfMa8h+tjt1e3V3JzuJDI3avQfIdBnN59TkzG5m3p9P
pceEVAUoZQ3uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kqtv/efRmz7J/vfg6/tP+6+Ks2dG6EL
DgLII3y7/wApDpf/ADFwf8nVyrL9J9zbj+oe99/5x707sVU57iC3hee4kWGGMcpJZGCqo8Sx2GSj
EyNAWWMpiIsmg8481fnVpNjyt9CjGoXIqDcPVbdT7dGf6KD3zoNF7P5J75TwDu6/sec13tJjh6cQ
45d/T9v43eS6/wCate1+f1dUu3mANUh+zEn+qg+EfPrnVabRYsAqAr7/AJvI6rXZc5vJK/Lp8kpz
KcR2KrTgZIe6u7a2jMlxIsaDuxp93jlObPDFHimQA34NPPLLhgDIsa1HzkN0sI6n/f0n8F/rnNav
2iHLEPif1fr+T0+j9mzzzH4D9J/V82N3N3c3UnqXEjSP4senyHQZzebUTyy4pkkvUYNPjxR4YARC
jlLc7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqq2/959GbPsn+9+Dr+0/7r4qzZ0boQsOA
sgjfLv8AykOl/wDMXB/ydXKsv0n3NuP6h7333PcQW8Lz3EiwwxjlJLIwVVHiWOwzkYxMjQFl6WUx
EWTQedeaPzq0ax52+iR/pG5G3rtVLdT+DP8ARQe+b/R+z2Se+Q8A7uv7Pxs85rfaTHDbEOOXf0/b
+N3kvmHzb5g8wTepqd20qA1jt1+GJP8AVQbfT1zqtLocWAVAV59fm8lq9fm1BvJK/Lp8knzLcN2K
uxVRu7y1tIjLcSLFGO7d/kOpynPqIYo8UzQbsGnyZZcMAZFi2p+dGNY9Pj4jp68g3/2K/wBfuzmN
Z7RE7YR8T+gfr+T1ei9mgN8x/wA0fpP6vmxq5urm5kMlxI0rnuxr93hnN5s88suKZMi9Ph08MUeG
AEQpZU3OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kqtv/AHn0Zs+yf734Ov7T/uvi
rNnRuhCw4CyCN8u/8pDpf/MXB/ydXKsv0n3NuP6h73r/AJm82a9r95JJqVw/phyY7OpEUW/QJ0qO
lTvm50ehxYIgQHx6l5XW6/LqJEzJru6BJMzXCdirsVdiqhfG9Fs/1IIbj9gSV4/h3zH1Pi8B8KuP
zcjS+F4g8W+Dyec6q2qG6b9I8/XHZ+lP8mm1PlnnutOc5P318Xn+jpXufSdAMAx/uK4PL9PW/eg8
w3NdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVVbf+8+jNn2T/e/B1/af918V
Zs6N0IWHAWQRvl3/AJSHS/8AmLg/5OrlWX6T7m3H9Q976386/k9Z6vczajpEy2V9KS8sDj9xI56n
4d0J77H5Zgdn9vSxAQyDiiOvUfrZ9pez0c0jPGeGR6dD+p5Fr3lbXtBm9PVLN4ATRJftRt/qutVP
yrXOr02txZxcJX9/yeQ1WhzYDWSNfd80pzKcR2KuxV2KqF5Y2l5EYrmJZE7V6j3B6jKNRpseaPDM
WHI0+qyYZcWM8JYrqXkqVKyWEnNevoybN9DdD9OcvrPZ2Q3xG/I8/m9ZovaWJ2zCj3jl8v7WNz28
9vIYp42jkHVWFDnOZcU8cuGQIL02LNDJHigRIeSnlbY7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYqq2/959GbPsn+9+Dr+0/7r4qzZ0boQsOAsgjfLv8AykOl/wDMXB/ydXKsv0n3NuP6
h733/nHvTqVzbW11A8FzEk8Ego8UihlYeBU1ByUJmJuJosZwjIVIWHnfmf8AJXRr7nPokn6OuTv6
DVe3Y/iyfRUe2dBo/aHJDbKOMd/X9v43ec1vs3jnviPBLu6fs/GzyjzF5O8w+X5eOpWjJETRLlPj
hb5ONvoNDnUaXX4s49B37uryer7Pzac+uO3f0+aSZmOE7FXYqtOBkhruytbuP07mJZV7chuPkeoz
Hz6fHlFTAkHI0+pyYTcJGJYzqXk5hWSweo/3zId/ob+uc1rPZ488J+B/Qf1/N6nRe0gO2Yf5w/SP
1fJjlxa3FtIY542jcdmFPuznM2CeM8MwQXpsOeGWPFAiQUsqbXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FVW3/vPozZ9k/wB78HX9p/3XxVmzo3QhYcBZBE6LMIda0+YiojuYXIHfjIDlWQXE
tsDuH6B5x707sVdiqyWKKaNopUWSNxR0cBlI8CDhjIg2OaJRBFHcPP8AzP8AkzoGpFp9Kb9F3R34
IOUDH/UqOH+xNPbN9o+38uPafrj9vz6/H5vP632dw5N8fol9ny6fD5PJ/MnkXzL5edjf2hNsOl5D
V4T2+0B8PyYA51Gk7Sw5/pO/cef49zyWs7Mz6c+uPp7xy/HvY/me69acDJacCVhwMlC5tbe5jMc8
ayIezCv3eGU5sEMseGYBDfgzzxS4oExLG9Q8oLu9jJQ/76k/g39c5zV+zw54j8D+v9fzem0ftGeW
YfEfpH6vkx25tLm2k9OeNo38COvyPfObzaeeI1MEF6bBqMeWPFAiQUspbnYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FVW3/ALz6M2fZP978HX9p/wB18VZs6N0IWHAWQVNP/wCOja/8Zo/+JDK58i2R
5v0IzjnqHYq7FXYq7FWmVXUqwDKwoyncEHscQaQRbBPM35P+WtW5z2IOl3jb1hAMJP8AlRbAf7Ej
N5o+3s2LaXrj58/n+t0Wt9n8GXeHol5cvl+qnkfmf8vPNHl/nJd2pms1/wCPyCskVPFv2k/2QGdR
pO1MOfaJqXcef7Xk9Z2Tn0+8hce8cv2fFjBzYOuWHAyWnAlYcDIKFxBDPGY5kEiHqrCoyrLijkHD
IWG7FlnjlxRJBY/f+VYyS9m/A/76fcfQ3X7853V+z4O+I15H9b0mj9oSNsovzH6mP3Nnc2r8J4yj
dq9D8j0Oc5n02TEamKelwanHmFwNqOUN7sVdirsVdirsVdirsVdirsVdirsVdiqrb/3n0Zs+yf73
4Ov7T/uvirNnRuhCw4CyCpp//HRtf+M0f/Ehlc+RbI836EZxz1DsVdirsVdirsVdirRAIodweoxV
hPmf8o/K2tB5reP9GXzVPrW4Hpk/5cWyn/Y0ObjSdt5sWxPHHz/W6XWdhYM24HBLy/V/Y8h80/lj
5q8vh5pYPrditSbu2q6geLrTkn0invnUaTtbDn2B4ZdxeU1nY+fBuRxR7x+nuYgc2TrFhwMgsOBk
FM5FkFKaKKVCkqB0PVWFRleTHGYqQsNuPJKBuJopFfeWYmq9o3pt/vtt1+g9RnP6vsGMt8R4T3Hk
9DpO35R2yjiHeOaRXNnc2rcZ4yngeoPyI2zndRpcmE1MU9Jp9VjzC4G1DMdyHYq7FXYq7FXYq7FX
Yq7FXYq7FVW3/vPozZ9k/wB78HX9p/3XxVmzo3QhYcBZBU0//jo2v/GaP/iQyufItkeb9CM456h2
KuxV2KuxV2KuxV2KuxV2KsN80/lV5V18PKIfqF83S6tgFqf8uP7LfgffNrpO2M2Ha+KPcf1up1nY
2DPvXDLvH6Q8f81/lN5q0HnNHF+krBd/rNsCWA/y4t2X6Kj3zptJ2xhzbE8Mu4/reW1nYufDuBxx
7x+kMHbNq6pTORZBYcDILDkWQUpY0kQo6hlPVSKjITgJCpCw2QmYm4mik155dgerWzem38h3X+oz
RarsOEt8Z4T3dHfaXt2cdsg4h39UkubO5tm4zIV8G6g/I5zuo0mTCamK+56PT6vHmFwN/eoZjOS7
FXYq7FXYq7FXYq7FXYqq2/8AefRmz7J/vfg6/tP+6+Ks2dG6ELDgLIKmn/8AHRtf+M0f/Ehlc+Rb
I836EZxz1DsVdirsVdirsVdirsVdirsVdirsVYn5q/LHyp5j5S3Fv9Vvm3+u21Ecn/LFCr/SK++b
HSdqZsGwNx7i63V9lYc+5FS7x+N3jfmv8mvNeil5rNP0tYipEtup9VQP54d2/wCB5Z02l7aw5dpe
iXny+bzGr7EzYt4+uPlz+Tz91ZWKsCGBoQdiCM2zqFM5FkFhwMgpnAyCm6qylWAZT1B3GQlEEUdw
zjIg2NilN5oUD1aA+k38vVf7M0mq7EhPfH6T9n7HeaXtucdsnqH2/tSe5sri3NJUoOzDcH6c57Ua
PJhPqHx6PQ6fWY8w9J+HVQzFcp2KuxV2KuxV2KuxVVt/7z6M2fZP978HX9p/3XxVmzo3QhYcBZBU
0/8A46Nr/wAZo/8AiQyufItkeb9CM456h2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsY80/lz5U8y
h3vrQR3jDa+gpHMD4kgUf/Zg5naXtHNh+k+nuPJwNV2bhz/UPV3jn+Pe8Z82fkf5o0n1LjS6avZL
uBEONwo94t+X+wJ+WdJpe28WTafol9nz/W81quw8uPeHrj9vy/U82ljkjdo5FKSISrIwIII6gg5t
wb5OnquakcWQWHIsgsbAyCk4DAgioPUHISAIos4kg2EtutIgerRfu28Oq/dmn1PY2Oe8PSfsdzpe
2MkNp+ofalM9ncQH94vw/wAw3Gc9qNFlw/UNu/o9Bp9Zjy/Sd+7qo5iuU7FXYq7FXYqq2/8AefRm
z7J/vfg6/tP+6+Ks2dG6ELDgLILrWVYruCV/sRyKzU8AwJyEhszjzfoVnGvUuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxVjvmjyB5W8zRsNTslNwRRb2Kkc69h8YHxU8GqPbMvTa7LhPpO3d0cPU
6DFmHqG/f1eL+bvyF8x6YHudEkGrWgqfRA4XKj/Urxf/AGJqf5c6PS9t457T9J+x5zVdh5Ibw9Y+
15fc29xbzPBcRPDNGaPFIpVlPgVNCM3AkCLHJ05iQaPNQbFIU2yJZBTbAzCmwBFDuMiRbMGkvuNN
hepT923t0+7NRqeyMc94+k/Y7bTdq5IbS9Q+1Lp7WaE/Evw/zDcZoNRosmH6ht39HfafW48v0nfu
6qOYjlOxV2Kqtv8A3n0Zs+yf734Ov7T/ALr4qzZ0boQsOAsgptkSzD9EM4x6l2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KpF5n8k+WfM0Hp6vZJNIBSO5X4Jk/1ZF+L6Dt7Zk6fWZMJ9B+H
RxtRo8eYesfHq8W84f8AOPmt2PO58uTfpO2G/wBVl4pcqPY7JJ/wp9s6DS9twltkHCe/o89qexJx
3xniHd1eT31jeWNzJa3sEltcxGkkMqlHU+6sAc3MZiQsGw6eUDE0RRQjYUhTbIsgptgZBTbIlmEH
PZRPuvwN7dPuzV6nsvHk3j6T9nydpp+08kNpeofjqgZbaWPqKj+YdM0Oo0OTFuRt3h3eDW48vI79
ylmG5arb/wB59GbPsn+9+Dr+0/7r4qzZ0boQsOAsgptkSzD9EM4x6l2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KpN5j8oeW/MlsINZsY7oKKRykFZU/wBSRaOv0HL8GpyYjcDTRn02
PKKmLeLecf8AnHTU7cvc+V7kXsO5+o3BVJh7LJsj/Tx+nN9pu24nbIK8xydFqexZDfGb8jzePanp
eo6ZdvZ6jbS2l1H9uGZCjD3oex7HN1DJGYuJsOnnjlA1IUUC2FAU2yLMKbYGQU2yJZhDS20bbj4T
7ZrdR2bjybj0ny/U7HB2hkhsfUFGOJ0k36U65iaLRTw5bPKublavVwy4tud8l7ZuHVhYcBZBTbIl
mH6IZxj1LsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSvX/LGgeYLQ2us2
MV7FQhfUX40r1KOKOh91OW4c88ZuJpqy4IZBUhbxXzl/zjbcJ6l15UvPWXqNOuyFf5RzbKfYOB/r
ZvNP20DtkHxH6nSajsYjfGfgf1vFtZ0TV9GvGstVs5bK6XrFMpUkeK12Ye42zdY8sZi4mw6ieOUD
UhRS1skgKbZFmFNsiyCm2BmFNsiyCw4CyCm2RLMP0QzjHqXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYql+taBouuWTWWr2UV7at/uuVQ1D4qeqn3U1yzHllA3E0WvJij
MVIWHivnT/nGiNhJdeUrzi27fo28NV+UcwFR7Bx/ss3Wn7Z6ZB8R+p1GfsjrjPwLw/zB5Z1/y/d/
VNZsJrGffiJVorAbEo4qrj3UkZuceaGQXE26nJilA1IUlDZJiFNsDMKbZFkFhwFkFNsiWYfohnGP
UuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVB6to2lavZPY6
paRXtpJ9qGZA618RXoR2I3ycMkoG4miwnCMhUhYeLed/+cZdPuBJd+Ubr6nLuf0bdMzwn2jl+J1/
2XL5jNvp+1yNsgvzDq8/ZYO8DXk8J80eTvMvli7+q65YS2bkkRyMKxSU7xyLVG+g5uMWeGQXE26r
JhnjNSFJC2WMQsOAsgptkSzD9EM4x6l2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KobUNN0/UrR7PULWK8tJP7yCdFkRvmrAjJRmYmwaLGURIURbxnzx/zj
HomoF7vyrc/ou5NT9Rn5SWzH/JbeSP8A4YeAGbXB2rIbTF/e67N2bE7w2eBebfIXmzypcmDXNPkt
lJpFcgc4JP8AUlWqn5Vr4jNvi1EMguJdXkwTxn1Bkf5RflLrXm/XbS7ubWSHy3byLLd3kilUlVDX
0oiftlqUNPsjr2rj6zVxxxIB9TkaXTGZs/S//9k=</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+ <?xpacket end='w'?>
+ </metadata>
+ <g id="Layer_1">
+ <g>
+ <g>
+ <g>
+
+ <linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="-2" y1="6.7832" x2="11.9258" y2="6.7832" gradientTransform="matrix(1 0 0 1 2 -0.0332)">
+ <stop offset="0" style="stop-color:#0094F8"/>
+ <stop offset="0.2022" style="stop-color:#0094F8"/>
+ <stop offset="0.3387" style="stop-color:#0089EA"/>
+ <stop offset="0.5988" style="stop-color:#006EC4"/>
+ <stop offset="0.9529" style="stop-color:#004187"/>
+ <stop offset="1" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="0" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.2022" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0094F8"/>
+ <a:midPointStop offset="0.3387" style="stop-color:#0089EA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#0089EA"/>
+ <a:midPointStop offset="0.5988" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.9529" style="stop-color:#004187"/>
+ <a:midPointStop offset="0.5" style="stop-color:#004187"/>
+ <a:midPointStop offset="1" style="stop-color:#003B7E"/>
+ </linearGradient>
+ <path fill="url(#XMLID_2_)" d="M0.188,6.6C-0.078,6.678-0.06,6.994,0.234,7.146L13.402,13.5c0.288,0,0.523-0.236,0.523-0.527
+ L13.862,0.527C13.862,0.236,13.627,0,13.339,0"/>
+ </g>
+ </g>
+ <polygon fill="#303030" points="3.026,6.43 7.416,4.289 12.462,1.828 12.462,11.672 7.416,9.211 3.026,7.072 2.462,6.75 "/>
+ </g>
+ </g>
+ </svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_right.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ width="13.925" height="13.5" viewBox="0 0 13.925 13.5" overflow="visible" enable-background="new 0 0 13.925 13.5"
+ xml:space="preserve">
+ <metadata>
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?><x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 3.0-29, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description rdf:about=''
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'
+ xmlns:xapGImg='http://ns.adobe.com/xap/1.0/g/img/'>
+ <xap:CreateDate>2005-12-13T08:30:12Z</xap:CreateDate>
+ <xap:ModifyDate>2005-12-13T08:30:12Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType='Resource'>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>248</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AW/M/8ztX8yavc2lpcvBo
MDtFb28TFRKFNPVlpTnzpUA7AfST2fZ/Z8MUASLmfseM7Q7QnlmQDUB9rHvLPnrzT5ZlDaRfPFFX
k9q3xwP48o2qu/iN/fMnUaPHmHrHx6uNp9Zkwn0H4dHtPlH/AJyE0G/9O28wwHS7s0BuY6yWzHxP
V4/pqP8AKzntT2JOO+M8Q+16HTdtQltkHCfseq2l5aXlulzaTJcW8o5RzRMHRh4hlqDmmlExNEUX
cxkJCwbCtkWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi
rsVfDxz0Z85WnAlo4pTfy55x8yeW7n19HvpLaprJCDyif/XjaqN86VzHz6XHlFTFuRg1OTEbgae0
+UP+citKuzHa+ZrX6hMaA30HKSAnxZN5E+jlnP6nsSUd8Zvy6u/03bUZbZBXn0et6fqWn6japd2F
zFd20n2JoXDofpUnNJOEompCi7uE4yFxNhE5Fk7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXw8c9GfOVpwJaOKVpwJWnAlM9A80eYPL139b0a+ls5duYQ1RwOzo
ao4/1hlObTwyipi2/DnnjNxNPZ/J3/OR1rKUtfNVr9Xc7fpC1BaP5yRbsvzUn5ZodT2KRvjN+R/W
73TdtA7ZBXmHsOka1pOsWa3ul3cV5av0lhYMAfA03U+x3zSZMUoGpCi7vHljMXE2EblbN2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvh456M+crTgS0cUrTgStOBK04E
tHFKO0TzDrehXgvNIvZbK4GxeJqBgOzr9lh7MCMqy4YZBUhYbsWaeM3E0Xsvk7/nJEgJa+bLSvQf
pG0X8ZISfvKH/Y5otT2L1xn4H9bu9N2z0yD4j9T2fQ/MWh69ZC90e9ivbc0q0TVKk9nU0ZD7MAc0
eXDPGakKLu8WaGQXE2ExytsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir
4eOejPnK04EtHFLDPM3mfUtJ11Y4SslsYkZoHG1SWBII3BzQdodoZMGahvGhs7/s/s/Hnw2dpXzT
LSfOOkagAjP9VuD/ALqlIAJ/yX6H9eZem7UxZdieGXn+txNT2XlxbgcUfL9SdnNi65o4pWnAlacC
UVpes6tpF2t5pd3LZXK9JYXKGnWhp1HsdsryY4zFSFhsx5JQNxNF7F5O/wCck7yD07XzVZ/Wo9gd
RtQElHu8OyN81K/I5pdT2MDvjNeR/W7rT9sEbZBfmHtvl7zX5d8xWgutFv4ryOlWVDSRPZ42o6H/
AFhmjzYJ4zUhTu8WeGQXE2m2UtrsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfD
xz0Z85WnAlo4pea/mD/x3l/4wJ/xJs5Htv8Av/8ANH6XrexP7j/OP6GM5qHbpxpPmnVtNokcnq24
/wB0SVZQP8k9V+jM/Tdo5cOwNx7i4Op7OxZdyKl3hmWlec9KvqRyn6pOf2JD8JPs/T76Zv8ATdq4
smx9MvP9boNT2Vlx7j1R8v1J52zZutaOBK04pWnAlXsNS1DTbuO80+5ktLqI1jnhco4+TKQchOAk
KIsNkJmJsGi9f8m/85JaxZmO180Ww1C2FFN7bgR3A92TaOT6OP05ptR2PE74zR7ujt9P2vIbTFjv
6vcfLHnbyv5nt/W0XUIrogcpIK8Zk/14mo4+dKZo82myYjUhTu8OohkFxNp5lDc7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXw8c9GfOVpwJaOKXmv5g/8AHeX/AIwJ/wASbOR7b/v/APNH
6XrexP7j/OP6GM5qHbuxV2KpppfmTVdNosMvOAf7ok+JKe3cfRmbptflxcjY7i4eo0GLLzG/eGY6
X500u8AS4P1Sc9nPwE+z/wBaZv8ATdrYsm0vSfs+bodR2Vkx7x9Q+35J9UEVBqDuCM2dutWnFWjg
ZLTilUtLy8srmO6s55La5iPKKeJijqfFWUgjISiJCjuGUZEGxzeteS/+cj/MOmlLbzJD+l7MbfWU
4x3Sj8Ek+mh/ys1Op7IhLeHpP2O10/as47T9Q+17r5S/MLyl5rh56NfpLOBWSzk/d3CfONt6e61H
vmiz6XJiPqH6ndYNVDL9JZHmO5DsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfEVzEIriWIGo
jZlB+RpnooNi3zoijSicVaOKXmv5g/8AHeX/AIwJ/wASbOR7b/v/APNH6XrexP7j/OP6GM5qHbux
V2KuxV2KplpfmDU9NIEEtYu8D/En3dvozL02uy4fpO3d0cTUaLHl+ob9/Vl2l+dNOuqR3X+izHar
GsZP+t2+nN9pu1sc9pek/Y6PUdlZIbx9Q+1PwysoZSCp3BG4Izag26yqaOKVpwJWnAldBcT28yT2
8jQzRnlHLGxVlI7hhQjIkAiiyBI3D1XyV/zkV5q0YJa66n6bsV2EjtwulH/GWhD/AOzFT/Nmr1HZ
WOe8fSfsdnp+05x2l6h9r3jyd+Z3k7zbGo0q+VbylX0+ekVwvj8BPxU8UJGaPUaPJi+obd/R3ODV
48v0nfuZXmK5LsVdirsVdirsVdirsVdirsVdirsVdirsVfEt/wD73XH/ABlf/iRz0SHIPnc/qKGO
FDRxS81/MH/jvL/xgT/iTZyPbf8Af/5o/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxVH6brepac3+
jSn0+8TfEh+j+mZOn1mTF9J27ujjZ9Jjy/UN+/qy3TPOlhccY7sfVpTty6xn6eo+nN9p+18c9p+k
/Y6TUdlTjvH1D7U/V0dQ6MGRt1YGoI9iM2oIIsOsIINFo4qtOBLRxS0rujq6MVdSGVlNCCNwQRgK
Q9Q8l/8AOQvnPQRHbaoRrmnrQUuGIuVX/Jn3J/2Yb6M1mo7Lxz3j6T9nydjg7SyQ2PqD3vyZ+bnk
nzYI4rG9FvqL/wDSuuqRTV8EqeMn+wJzR6jRZMXMbd4dzg1mPJyO/czPMRynYq7FXYq7FXYq7FXY
q7FXYq7FXYq+Jb//AHuuP+Mr/wDEjnokOQfO5/UUMcKGjil5r+YP/HeX/jAn/Emzke2/7/8AzR+l
63sT+4/zj+hjOah27sVdirsVdirsVdirsVdiqN0/WNQ09q20xVe8Z3Q/7E5kYNXkxfSf1OPn0uPL
9QZVpnnOznpHer9XlP7YqYz/ABXN7p+14S2n6T9jpdR2VOO8PUPtT9JI5EDxsHRujKQQfpGbWMgR
Y3DrDEg0WzhVacCVpwJaqQag0I3BGBL0nyX+fvnjy4Y7e7m/TWmJQfV7tiZVX/iufdx7cuQHhmv1
HZuPJuPSfL9Tn4O0MkNj6g998k/nT5G81mO3guvqGpvQCwvKRuzHtG9eEnsAeXtmk1GgyY9yLHeH
cYNbjybXRZ5mE5bsVdirsVdirsVdirsVdirsVfEt/wD73XH/ABlf/iRz0SHIPnc/qKGOFDRxS81/
MH/jvL/xgT/iTZyPbf8Af/5o/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxV2KuxV2KuxVF2GqX1i/
K2lKA/aTqp+anbL8GpniNxNNObTwyCpBlGnec7aWkd6noP8A78WpQ/MdR+ObvT9rxltMcJ7+jps/
ZUo7wN/en8csUsYkicOjfZZSCD9IzbRkJCwbDrJRMTR2LZwoWnFLRwJWnAl6D5J/PLzz5WKQG5/S
umLQGyvGZ+K+Ecv209huvtmDqOz8eTeqPk5uDW5IeYe/+R/z38j+aDHbST/ojVHoPqd4wVWY9opt
kb2Box8M0mo7PyY9/qHk7fDroT25F6KCCKjpmC5jeKuxV2KuxV2KuxV2KviW/wD97rj/AIyv/wAS
OeiQ5B87n9RQxwoaOKXmv5g/8d5f+MCf8SbOR7b/AL//ADR+l63sT+4/zj+hjOah27sVdirsVdir
sVdirsVdirsVdirsVdiqJs9QvbJ+dtK0Z7qPsn5qdjl2HUTxm4mmrLghkFSFsl07zlC4CXyek3+/
UqV+kdR+ObrT9rxO2QV5uoz9lkbwN+TIIp4Z4xJC6yRnoymo/DNtCcZCwbDq5QMTRFFcckhacCVp
wMlpxSznyR+c/njyjwgtbv67pibfo68rJEB/xWah4/kpp7ZhZ9DjybkUe8OVh1c8fI2H0B5H/wCc
hPJHmIJb6hJ+g9TagMN2w9Bj/wAV3Hwr/wAHxOabP2dkhuPUPx0dth10J8/SXqCsrKGUhlYVVhuC
D3Ga9zW8VdirsVdirsVfEt//AL3XH/GV/wDiRz0SHIPnc/qKGOFDRxS81/MH/jvL/wAYE/4k2cj2
3/f/AOaP0vW9if3H+cf0MZzUO3dirsVdirsVdirsVdirsVdirsVdirsVdirsVV7S+u7ST1LaVo27
06H5g7HLcWaeM3E015MMZipC2R6f5wRqJfJxPT1k3H0r1+7Nzp+1gdsg+IdTn7LI3gfgyCG4guIx
JBIsiH9pTXNtDJGYuJsOsnCUTRFLjkkLTilacCWjgSzHyX+bfnjygUj0y+MunqanTbqstuR4KCeU
f+wYZi59Hjycxv3uRh1U8fI7PoHyR/zkf5M10R2us10LUWop9Y8rVj/kz0HH/ZgAeJzTZ+zZw3j6
h9rtcOvhLY+kvWIpYpY1lidZInAZHUhlYHcEEdRmuIpzgV+KuxV2KvifVI2j1K7jb7STSK3zDEZ6
HjNxHufO8gqR96EOSQ0cUvNfzB/47y/8YE/4k2cj23/f/wCaP0vW9if3H+cf0MZzUO3dirsVdirs
VdirsVdirsVdirsVdirsVdirsVdirsVVra7ubWT1LeRo38VPX5jvlmPLKBuJphkxxmKkLZDYebq0
S+jp/wAWx/xX+mbfB2t0yD4h1ebszrA/BP4Lm3uI/UgkWRD3U/rzb48sZi4mw6ueOUDUhS45NDRw
JaxVrAllXk38z/OvlCVf0PqDi0Bq+nz1ltmruf3ZPw17lKH3zHz6XHk+ob9/VvxaiePkX0B5I/5y
Y8qawY7TzDEdDvmoPXJMlozdPt05R1/yhQfzZp8/Zk47x9Q+12mHXxltLYvYLa5t7mBLi2lSeCUB
opo2DoynoVZagjNaQRsXOBtVwJfFmvf8dvUP+Ymb/k4c9Cw/RH3B89zfXL3lLzk2DRxS81/MH/jv
L/xgT/iTZyPbf9//AJo/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxVUguJ7eQSQyNG47qaZOGSUDcTRYzhGQoi0/sPNjCiXqcv+LU6/Sv8ATNtg7V6ZB8Q6zN2b
1gfgn9vdW9zEJIJBIh7jt8x2zcY8sZi4mw6yeOUDUhSpk2DWBLsVaxSyLyh+Yfm/yhc+roeoSQRM
eUto37y3k/14mqtf8ofF4HKM2nhkHqDbizyh9JfRP5Z/85GaT5lvrfRtethperXDCO3mjJa1mkbY
IOXxRs3QAkg+PbNLqezjAcUdx9rtdPrhM1LYvEde/wCO3qH/ADEzf8nDnYYfoj7g8Zm+uXvKXnJs
Gjil5r+YP/HeX/jAn/Emzke2/wC//wA0fpet7E/uP84/oYzmodu7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYqitPN+LgfUefreCeH+V2p88v05ycX7u7ac4hw+vkza0+t+gv1oIJ
v2uFafjnUYuPh9dcXk89k4eL08lXLGDsVaxS0cCsh8l+R/NPmvVIbbQrSWTjIolvlBWG33rzeXYL
QbgVqe2U5s8MYuRbsWKUz6U917/jt6h/zEzf8nDm2w/RH3B0Gb65e8pecmwaOKXmv5g/8d5f+MCf
8SbOR7b/AL//ADR+l63sT+4/zj+hjOah27sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
diqpDBNPII4UMjnoqipycISkaiLLGcxEWTSfWPlORqPevwH++k3P0t0za4Oyid5mvIOtzdpDlAfF
P7a0trWP04IxGvenU/M9Tm4xYo4xURTq8mWUzcjarljBrAl2Kp55U8j+avNd39W0LT5bsqQJZgOM
Mdf9+StRF+VantlOXPDGLkabceGUzUQ+gPIv/OL+iWHp3nm25/Sl0KH6hAWjtVPgz/DJJ/wo9jmn
z9qSO0Nvvdph7PA3lu9rsNPsNOtI7OwtorS0hHGK3gRY41HsqgAZq5SJNnm7CMQBQfGmvf8AHb1D
/mJm/wCThz0HD9EfcHz7N9cveUvOTYNHFLzX8wf+O8v/ABgT/iTZyPbf9/8A5o/S9b2J/cf5x/Qx
nNQ7d2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVVt7W4uZPTgjaR/BRX78njxymaiLLCeS
MBcjTINP8osaPfPT/ilDv9Lf0zb6fsnrkPwDrM3afSA+LILe0trZOFvGsa96Dr8z1ObjHijAVEU6
ueWUzcja85Ni0cCWsVTzyr5H81ea7v6toWny3ZUgSzAcYY6/78laiL8q1PbKc2eGMXI0248Mpmoh
7/5F/wCcYNEsPTvPNlz+lLoUb6hAWjtVPgz/AAySf8KPY5p8/akjtDb73aYezwN5bva7DT7DTrSO
zsLaK0tIRxit4EWONR7KoAGaqUjI2dy7GMQBQRGBLsVfFmvf8dvUP+Ymb/k4c9Cw/RH3B89zfXL3
lLzk2DRxS81/MH/jvL/xgT/iTZyPbf8Af/5o/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxV2KuxV2
KuxV2KuxV2KuxVWtrS5upPTt42kfwUdPmegyzHilM1EWWGTLGAuRpken+TwAHvpKnr6MfT6W/pm5
0/ZHXIfgHU5u1OkB8SyC3tbe2jEcEaxoOyj9fjm3x4owFRFB1c8kpm5G15ySFpxStOBKeeVfI/mn
zXd/VtC0+W7KkCWYDjDHX/fkrURflWp7ZTmzwxi5Gm3FhlM1EPfvI3/OMOiWHp3nmy5/Sl0KH6hA
WjtVPgz/AAySf8KPY5ps/akjtDb73a4ezojee72qw0+w060js7C2itLSEcYreFFjjUeyqABmrlIy
NncuxjEAUERkUuxV2KuxV8W6+Cuu6iCKEXUwIPUH1Gz0HD9EfcHz3N9cveUuOWMGjil5r+YP/HeX
/jAn/Emzke2/7/8AzR+l63sT+4/zj+hjOah27sVdirsVdirsVdirsVdirsVdirsVdiqIs7G7vJPT
tomkbvToPmTsMtxYJ5DURbVlzQxi5GmS6d5NjWj38nM/75jqB9LdfuzdafsgDfIb8g6nP2qTtAfE
sght4LeMRwxrHGOiqKDNvDHGAqIoOrnOUjZNleckxWnAlacDJOPLPk3zN5ovPqmh6fLeOCBJIopF
HXvJI1EX6TlOXPDGLkabcWGUzURb37yJ/wA4x6NYiO882z/pK7Hxfo+Aslsp8Hf4ZJP+FHzzTajt
WR2hsO/q7bB2cBvPd7VYafYadaR2dhbxWlpCOMVvCixxqPZVAAzVSkZGzuXZRiAKCIyKXYq7FXYq
7FXYq+M/Nv8AylOs/wDMdc/8nmzv9N/dR/qj7nz/AFP97L+sfvSg5c1NHFLzX8wf+O8v/GBP+JNn
I9t/3/8Amj9L1vYn9x/nH9DGc1Dt3Yq7FXYq7FXYq7FXYq7FXYq7FUTZabfXr8LaFpKdWGyj5sdh
l2HTzyGoi2nLnhjFyNMo03yZBHSS/f1W/wB9JUKPmep/DN3p+yIjfIb8nT5+1ZHaArzZBDBDBGI4
UWOMdFUUH4Zt4QjEVEUHVymZGybK44ULTilo4Epv5Z8m+ZvM959V0PT5bxwQJJFFIo695JGoi/Sc
pzZ4YxcjTdiwymaiLe8+R/8AnGPSrT07vzbc/pC4FG/R9sWS3B8Hk+GR/o4/Tml1HasjtAV5u3wd
mgbz3e1adpmnaZZx2WnW0VnaRCkcECLGg+SqAM1MpmRsmy7KMREUNkVkWTsVdirsVdirsVdirsVf
Gfm3/lKdZ/5jrn/k82d/pv7qP9Ufc+f6n+9l/WP3pQcuamjil5r+YP8Ax3l/4wJ/xJs5Htv+/wD8
0fpet7E/uP8AOP6GM5qHbuxV2KuxV2KuxV2KuxV2Kouw0q/v342sRcD7T9FHzY7Zfg02TKaiLaM2
ohjFyLKtN8lWsVJL5/Xcf7qWoQfT1P4ZvNP2PGO8zxHu6Omz9rSltAUPtZDHFFFGI4kWONRRUUAA
fQM28YiIoCg6uUjI2TZbOFC04ErTgSnHlryd5l8z3n1XQ7CW8cECSRRSKOveSRqIv0nKc2eGMXI0
3YsM8hqIt7v5I/5xl0q09O782XP6QnFD+j7YsluD4PJ8Mj/Rx+nNJqO1pHaArzdxg7MA3mb8ntOn
aZp2mWcdlp1tFaWkQpHBCixoPkqgDNTKZkbJsuzjERFDYInIsnYq7FXYq7FXYq7FXYq7FXYq+M/N
v/KU6z/zHXP/ACebO/0391H+qPufP9T/AHsv6x+9KDlzU0cUvNfzB/47y/8AGBP+JNnI9t/3/wDm
j9L1vYn9x/nH9DGc1Dt3Yq7FXYq7FXYq7FUbp2jajqDUtoSyjrIdkH+yOZODSZMv0j9Tj59VjxfU
WWaX5Ks4KSXrfWZf99iojH8W/wA9s3mm7IhHefqP2Ok1Ha05bQ9I+1kKRxxoEjUIi7KqgAD5AZto
xAFDk6syJNlxwqtOBLRxSm/lryf5l8zXf1XRLCW8cECR1FIo695JGoi/ScozZ4YxcjTdiwTyGoi3
u3kn/nGfSrT07vzZc/X5xQ/o+3LJbg+DyfDI/wBHH6c0mo7XkdsYrzdzg7LA3mb8ns+naZp2mWkd
np9tFaWkQpHBCixoPkqgDNRKZkbJsu0jERFAUETkWTsVdirsVdirsVdirsVdirsVdirsVfGfm3/l
KdZ/5jrn/k82d/pv7qP9Ufc+f6n+9l/WP3pQcuamjil5r+YP/HeX/jAn/Emzke2/7/8AzR+l63sT
+4/zj+hjOah27sVdirsVdiqP03Q9T1Fv9GhPp95m+FB9Pf6MytPo8mX6Rt39HGz6zHi+o793Vl+m
eSdPtqPeH61MN+PSMfR3+nN9p+yMcN5+o/Y6LUdrTntD0j7WQKiIgRFCoooqqKAD2AzagACg6skk
2XHClacCVpwJTfy15Q8x+Zrz6poljJeSLT1HUUjjB6GSRqIv0nKc2eGMXI03YcE8hqIt7p5J/wCc
adLtPTu/Ndz9fnFD+j7cskAPg8nwu/0cfpzR6jteR2xivN3Wn7KiN5m/J7Np2m6fptpHZ6fbRWlp
EKRwQoqIPkqgDNPOZkbJsu1jARFAUETkWTsVdirsVdirsVdirsVdirsVdirsVdirsVfGfm3/AJSn
Wf8AmOuf+TzZ3+m/uo/1R9z5/qf72X9Y/elBy5qaOKXmv5g/8d5f+MCf8SbOR7b/AL//ADR+l63s
T+4/zj+hjOah27sVdiqZaX5e1TUiDbxcYe87/Cn39/ozM02hy5vpG3f0cTUa3Hi+o793VmGleSdN
tKSXX+lzDswpGP8AY9/pzfabsjHDeXqP2Oi1Pa2Se0fSPtZAFVVCqAFGwA2AGbUCnV3bRxVo4GS0
4pTTy95U8xeY7z6pothLezbcygoiA95JGoiD/WOUZs8MYuRpuxYZ5DURb3HyV/zjVYW/p3fmy6+u
S7H9HWpZIR7SS/C7/JePzOaPU9sE7YxXmXdafskDfIb8ns2maVpulWaWWm2sVnaR/YghQIg96L3P
c5ppzlI3I2XbwgIigKCLyLJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvjPzb/ylOs/8x1z/
AMnmzv8ATf3Uf6o+58/1P97L+sfvSg5c1NHFLzX8wf8AjvL/AMYE/wCJNnI9t/3/APmj9L1vYn9x
/nH9DGc1Dt010ry1q2pcWhi4QH/d8nwpT27n6MzdN2flzchQ7y4Wp1+LFzNnuDMtK8laVZgPcD63
OO7j4AfZP61zoNN2Tix7y9R+z5Og1Pa2XJtH0j7fmn4AAAAoBsAM2lOtto4FWnFK04Epp5e8q+Yf
Md59U0WxlvJtuZQURAe8kjURB/rHKc2eGMXI034cE8hqIt7f5L/5xssLf07vzZdfXJdj+jrUskI9
pJfhdvkvH5nNFqe2SdsYrzLu9P2QBvkN+QezaZpWm6XZpZabaxWdpH9iCFAiD3ovc9zmmnOUjcjZ
dxCEYigKCKyDJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvjnzyqr518wKoAUaleAAb
AATvne6P+5h/Vj9zwOs/vp/1pfekRzIaGjilhfmfy1qWra8rwKEtxEitO5ooILbADcnOf7Q7PyZ8
9x+mhu7/ALP1+PBgqX1Wdkw0nyXpNhSSVfrc4/bkHwg+ydPvrmVpuycWPc+qXn+pxdT2rlybD0x8
v1p9mzda0cUrTgStOBKZ+X/KvmHzFefVNFsZbyXbmUFEQHu8hoiD/WOU5s8MYuRpvw4J5DURb27y
Z/zjdYW/p3fmu5+ty7H9HWxZIR7SS7O3yXj8zmi1PbJO2MV5l3mm7HA3yG/IPZNN0vTdLs0stOtY
rO0j+xBCgRR70Xue5zSznKRuRsu5hCMRURQRWQZOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV8dee/+U38w/8AbTvP+oh873R/3MP6sfueB1n99P8ArS+9ITmQ0NHFK04ErTgStOBL
RxSmfl/yt5g8xXf1TRrGW8l25lBREB7u5oiD/WOUZs8MYuZpvw4J5DURb2zyZ/zjhYW/C6813P1u
XY/o62LJCPaSXZ2/2PH5nNDqe2idsYrzLvdN2MBvkN+Qexabpem6XZpZ6daxWlrH9iGFAij3oO57
nNLPJKZuRsu5hCMRURQRWQZuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
8dee/wDlN/MP/bTvP+oh873R/wBzD+rH7ngdZ/fT/rS+9ITmQ0NHFK04ErTgSmOheW9d1+8Fno9l
LeT7chGPhUHu7mioPdjlObPDGLkabsOCeQ1EW9p8l/8AOOdrCY7vzXci5cb/AKNtiVj+UkuzN8lp
8zmh1XbRO2MV5l32l7GA3yG/IPZNN0vTtMtEs9OtorS1j+xDCgRR70Hc9zmjnklM3I2XdwxxgKiK
CKyDN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvjrz3/AMpv5h/7
ad5/1EPne6P+5h/Vj9zwOs/vp/1pfekJzIaGjilMNC8t67r94LTR7KW8n25CMfCoPd3NFQe7HKc2
eGMXM0G7DgnkNRFvZ/J3/OOlrFwuvNVz677H9HWpKxj2kl2ZvktPmc0Gq7bJ2xivM/qd/pexQN8h
vyH63sWl6Rpek2aWem2sVnap9mGFQi18TTqfc5osmSUzcjZd5jxxgKiKCLyDN2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvnj87fy31W11y58x6bbvc6Zen1bv0
wWaCanxlgKng/wBrl2NRttXquydfGUBjkakOXmHle1tBKMzkiLiefkXmuh+XNc167FppFlLeT/tC
MfCoPd3NFQe7HNtmzwxi5mg6nDgnkNQFl7N5P/5x2tYuF15pufXfY/o62JWMe0kuzN8lp8znP6rt
wnbEK8z+p6DS9iAb5TfkP1vYNL0nTNKs0s9NtYrS1T7MUKhFr4mnU+5zRZMkpm5Gy73HjjAVEUEX
kGbsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/2Q==</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+ <?xpacket end='w'?>
+ </metadata>
+ <g id="Layer_1">
+ <g>
+ <g>
+ <g>
+
+ <linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="-338.2256" y1="322.8701" x2="-352.1514" y2="322.8701" gradientTransform="matrix(-1 0 0 -1 -338.2246 329.6191)">
+ <stop offset="0" style="stop-color:#006EC4"/>
+ <stop offset="0.7809" style="stop-color:#004187"/>
+ <stop offset="1" style="stop-color:#003B7E"/>
+ <a:midPointStop offset="0" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#006EC4"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#004187"/>
+ <a:midPointStop offset="0.5" style="stop-color:#004187"/>
+ <a:midPointStop offset="1" style="stop-color:#003B7E"/>
+ </linearGradient>
+ <path fill="url(#XMLID_2_)" d="M13.738,6.9c0.266-0.078,0.247-0.395-0.047-0.547L0.523,0C0.234,0,0,0.236,0,0.527
+ l0.062,12.445c0,0.291,0.236,0.527,0.523,0.527"/>
+ </g>
+ </g>
+ <polygon points="10.9,7.07 6.51,9.211 1.465,11.672 1.465,1.828 6.51,4.289 10.9,6.428 11.465,6.75 "/>
+ </g>
+ </g>
+ </svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_usb.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="24.091" height="24.091"
+ viewBox="0 0 24.091 24.091" overflow="visible" enable-background="new 0 0 24.091 24.091" xml:space="preserve">
+<g>
+ <rect width="24.091" height="24.091"/>
+ <line fill="none" stroke="#FFFFFF" stroke-width="2.6214" x1="3.51" y1="12.336" x2="22.739" y2="12.336"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="2.6214" d="M6.589,4.658l6.522-0.001c0,0,1.774-0.172,2.578,1.526l3.185,6.192"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="2.6214" d="M10.034,20.032h4.232c0,0,1.882,0.19,2.658-1.529l3.168-6.072"/>
+ <polygon fill="#FFFFFF" points="7.43,12.368 7.43,16.102 4.196,14.236 0.963,12.368 4.196,10.501 7.43,8.634 "/>
+</g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_wlan.svg Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="24" height="24" viewBox="0 0 24 24"
+ overflow="visible" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect width="24" height="24"/>
+<g>
+ <g>
+ <path fill="#FFFFFF" d="M9.935,2.954H2.977v6.955h6.958v-1.3l0,0l0,0V2.954L9.935,2.954z M4.277,4.254h4.358v4.355H4.277V4.254
+ L4.277,4.254z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M21.022,2.954h-6.957v6.955h6.957v-1.3l0,0l0,0V2.954L21.022,2.954z M15.365,4.254h4.356v4.355h-4.356
+ V4.254L15.365,4.254z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M9.935,14.09H2.977v6.955h6.958v-1.3l0,0l0,0V14.09L9.935,14.09z M4.277,15.391h4.358v4.354H4.277V15.391
+ L4.277,15.391z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M21.022,14.09h-6.957v6.955h6.957v-1.3l0,0l0,0V14.09L21.022,14.09z M15.365,15.391h4.356v4.354h-4.356
+ V15.391L15.365,15.391z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M15.088,8.748H8.873v6.46h6.216v-1.3l0,0l0,0V8.748L15.088,8.748z M10.173,10.048h3.616v3.861h-3.616
+ V10.048L10.173,10.048z"/>
+ </g>
+</g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_EXPORTS
+
+PRJ_EXPORTS
+// Export localised loc file
+../loc/imageprintapp.loc APP_LAYER_LOC_EXPORT_PATH(imageprintapp.loc)
+PRJ_MMPFILES
+
+imageprintapp.mmp
+
+PRJ_TESTMMPFILES
+
+PRJ_EXTENSIONS
+START EXTENSION s60/mifconv
+OPTION TARGETFILE imgprintbitmaps.mif
+OPTION HEADERFILE imgprintbitmaps.mbg
+OPTION SOURCEDIR ../data
+OPTION SOURCES -c8,8 qgn_prop_print_slider_bar.svg -c8,8 qgn_prop_print_slider_bar_short.svg -c8,8 qgn_prop_print_slider_handle.svg -c8,8 qgn_prop_print_slider_left.svg -c8,8 qgn_prop_print_slider_right.svg -c8,8 qgn_indi_print_cached.svg -c8,8 qgn_prop_print_bt.svg -c8,8 qgn_prop_print_kiosk.svg -c8,8 qgn_prop_print_mmc.svg -c8,8 qgn_prop_print_usb.svg -c8,8 qgn_prop_print_wlan.svg
+END
+
+PRJ_EXTENSIONS
+START EXTENSION s60/mifconv
+OPTION TARGETFILE imageprintapp_aif.mif
+OPTION SOURCEDIR ../data
+OPTION SOURCES -c8,8 qgn_menu_print.svg
+END
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/group/imageprintapp.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,133 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../../inc/logdef.h"
+
+TARGET imageprintapp.exe
+TARGETTYPE exe
+
+UID 0x100039CE 0x101FFA84
+CAPABILITY CAP_APPLICATION
+VENDORID VID_DEFAULT
+
+EPOCSTACKSIZE 0x5000 // 20 kB, more stack size needed to handle avkon resorces
+
+SOURCEPATH ../src
+SOURCE cimageprintapp.cpp
+SOURCE cimageprintdoc.cpp
+SOURCE cimageprintappui.cpp
+SOURCE cimageprintblankcontainer.cpp
+SOURCE cimageprintsettingscontainer.cpp
+SOURCE cimageprintsettingsview.cpp
+SOURCE cpropertiesboxmodel.cpp
+SOURCE printapputil.cpp
+SOURCE cimgpviewemptyview.cpp
+SOURCE uimodefactory.cpp
+SOURCE caiwmode.cpp
+SOURCE cidlemode.cpp
+
+USERINCLUDE . ../inc ../../inc ../../../inc
+USERINCLUDE ../../imageprintprovider/inc
+USERINCLUDE ../../imgpprintdll/inc
+USERINCLUDE ../../imageprinteng/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintLibrary/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintServer/inc
+USERINCLUDE ../../../clog/inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH .
+DOCUMENT ip_icons_dc.mk
+DOCUMENT ip_icons_aif_scalable_dc.mk
+DOCUMENT ip_icons_aif_bitmaps_dc.mk
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY avkon.lib
+LIBRARY eikcore.lib
+LIBRARY apparc.lib
+LIBRARY cone.lib
+LIBRARY imageprintengine.lib
+LIBRARY eikcoctl.lib
+LIBRARY bafl.lib
+LIBRARY commonengine.lib
+LIBRARY fbscli.lib
+LIBRARY aknskins.lib
+LIBRARY efsrv.lib
+LIBRARY commonui.lib
+LIBRARY hlplch.lib
+LIBRARY etext.lib
+LIBRARY gdi.lib
+LIBRARY bitgdi.lib
+LIBRARY usbman.lib
+LIBRARY servicehandler.lib
+LIBRARY estor.lib
+LIBRARY ws32.lib
+LIBRARY aknicon.lib
+LIBRARY egul.lib
+LIBRARY imageprintclient.lib
+LIBRARY featmgr.lib
+LIBRARY imgpprintdll.lib
+LIBRARY apgrfx.lib
+LIBRARY platformenv.lib
+LIBRARY caf.lib
+LIBRARY eikctl.lib
+LIBRARY eikcdlg.lib
+
+START RESOURCE ../data/imageprintapp.rss
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+HEADER
+TARGETPATH APP_RESOURCE_DIR
+END
+
+#ifdef RD_SCALABLE_UI
+
+SOURCEPATH .
+ START RESOURCE imageprintapp_reg.rss
+DEPENDS imageprintapp.rsg
+ // Do not change the UID
+ TARGETPATH /private/10003a3f/apps
+ END // RESOURCE
+
+#else
+SOURCEPATH ../data
+ START RESOURCE imageprintapp_caption.rss
+ #ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+ HEADER
+ TARGETPATH APP_RESOURCE_DIR
+ END // RESOURCE
+
+AIF imageprintapp.aif ../aif imageprintappaif.rss c12 context_pane_icon_44x44.bmp context_pane_icon_44x44_mask_soft.bmp list_icon_42x29.bmp list_icon_42x29_mask_soft.bmp
+
+#endif // RD_SCALABLE_UI
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/group/imageprintapp_reg.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:
+*
+*/
+
+
+#include <appinfo.rh>
+#include <imageprintapp.rsg>
+#include <data_caging_paths_strings.hrh>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 0x101FFA84
+
+RESOURCE APP_REGISTRATION_INFO
+ {
+ app_file = "ImagePrintApp";
+
+ localisable_resource_file = APP_RESOURCE_DIR"\\ImagePrintApp";
+
+ localisable_resource_id = R_IMAGEPRINTAPP_LOCALISABLE_APP_INFO;
+
+ hidden = KAppIsHidden;
+
+ embeddability = KAppEmbeddable;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/group/ip_icons_aif_bitmaps_dc.mk Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,55 @@
+#
+# Copyright (c) 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:
+#
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=\epoc32\data\z
+endif
+
+# ----------------------------------------------------------------------------
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\ImagePrintApp_aif.MBM
+
+do_nothing :
+ @rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+
+RESOURCE :
+ mifconv $(ICONTARGETFILENAME) \
+ /c8,8 list_icon_42x29.bmp \
+ /c8,8 context_pane_icon_44x44.bmp
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+ @echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/group/ip_icons_aif_scalable_dc.mk Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,54 @@
+#
+# Copyright (c) 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:
+#
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=\epoc32\data\z
+endif
+
+# ----------------------------------------------------------------------------
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\ImagePrintApp_aif.MIF
+
+do_nothing :
+ @rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+
+RESOURCE :
+ mifconv $(ICONTARGETFILENAME) \
+ /c8,8 ..\Data\qgn_menu_print.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+ @echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/group/ip_icons_dc.mk Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 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:
+#
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=\epoc32\data\z
+endif
+
+# ----------------------------------------------------------------------------
+
+TARGETDIR=$(ZDIR)\RESOURCE\APPS
+HEADERDIR=\epoc32\include
+ICONTARGETFILENAME=$(TARGETDIR)\IMGPrintBitmaps.MIF
+HEADERFILENAME=$(HEADERDIR)\IMGPrintBitmaps.MBG
+
+do_nothing :
+ @rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+
+RESOURCE :
+ mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+ /c8,8 ..\Data\qgn_prop_print_slider_bar.svg \
+ /c8,8 ..\Data\qgn_prop_print_slider_bar_short.svg \
+ /c8,8 ..\Data\qgn_prop_print_slider_handle.svg \
+ /c8,8 ..\Data\qgn_prop_print_slider_left.svg \
+ /c8,8 ..\Data\qgn_prop_print_slider_right.svg \
+ /c8,8 ..\Data\qgn_indi_print_cached.svg \
+ /c8,8 ..\Data\qgn_prop_print_bt.svg \
+ /c8,8 ..\Data\qgn_prop_print_kiosk.svg \
+ /c8,8 ..\Data\qgn_prop_print_mmc.svg \
+ /c8,8 ..\Data\qgn_prop_print_usb.svg \
+ /c8,8 ..\Data\qgn_prop_print_wlan.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+ @echo $(HEADERFILENAME)&& \
+ @echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/caiwmode.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+#ifndef CAIWMODE_H
+#define CAIWMODE_H
+
+#include <e32def.h>
+#include <e32base.h>
+
+#include "muimode.h"
+#include "mprotocolobserver.h"
+#include "muimodeobserver.h"
+
+class CUIProtocolController;
+class CIFFactory;
+
+// CLASS DEFINITION
+/**
+ *
+ * This class represents the embedded UI mode,
+ * i.e. aiw-initilized mode
+ *
+ */
+class CAiwMode : public CBase,
+ public MUIMode,
+ public MProtocolObserver
+
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aUIModeObserver Ui mode observer
+ * @param aIFFactory Interface factory to be used
+ *
+ * @return Initialized instance of the class
+ */
+ static CAiwMode* NewL( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory );
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aUIModeObserver Ui mode observer
+ * @param aIFFactory Interface factory to be used
+ *
+ * @return Initialized instance of the class
+ */
+ static CAiwMode* NewLC( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory );
+
+ protected:
+
+ virtual ~CAiwMode();
+
+ private:
+
+ CAiwMode( MUIModeObserver* aUIModeObserver );
+
+ void ConstructL( CIFFactory& aIFFactory );
+
+ public: // Methods derived from MUIMode
+ void SearchDefaultPrinterL();
+ TBool ChangeDefaultPrinterL( TInt aProtocol );
+
+ public: // Methods derived from MProtocolObserver
+ void UsbCableDisconnected();
+
+ private:
+
+ // Interface for callbacks
+ MUIModeObserver* iUIModeObserver;
+
+ // Protocol controller for managing protocol changes etc.
+ CUIProtocolController* iUIProtocolController;
+
+ // Interface factory
+ CIFFactory* iIFFactory;
+
+ };
+
+#endif // CAIWMODE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cidlemode.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+#ifndef CIDLEMODE_H
+#define CIDLEMODE_H
+
+#include <e32def.h>
+#include <e32base.h>
+
+#include "muimode.h"
+#include "mprotocolobserver.h"
+
+class CUIProtocolController;
+class MUIModeObserver;
+class CIFFactory;
+
+// CLASS DEFINITION
+/**
+ *
+ * This class represents the stand-alone UI mode,
+ * i.e. idle-launchable mode
+ *
+ */
+class CIdleMode :
+ public CBase,
+ public MUIMode,
+ public MProtocolObserver
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructors
+ *
+ * @param aUIModeObserver Ui mode observer
+ * @param aIFFactory Interface factory to be used
+ *
+ * @return Initialized instance of the class
+ */
+ static CIdleMode* NewL( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory );
+ static CIdleMode* NewLC( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory );
+
+ protected:
+
+ virtual ~CIdleMode();
+
+ private:
+
+ CIdleMode( MUIModeObserver* aUIModeObserver );
+
+ void ConstructL( CIFFactory& aIFFactory );
+
+ public: // Methods derived from MUIMode
+ void SearchDefaultPrinterL();
+ TBool ChangeDefaultPrinterL( TInt aProtocol );
+
+ public: // Methods derived from MProtocolObserver
+ void UsbCableDisconnected();
+
+ private:
+
+ // Interface for callbacks
+ MUIModeObserver* iUIModeObserver;
+
+ // Protocol controller for managing protocol changes etc.
+ CUIProtocolController* iUIProtocolController;
+
+ // Interface factory
+ CIFFactory* iIFFactory;
+
+ };
+
+#endif // CIDLEMODE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintapp.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTAPP_H
+#define CIMAGEPRINTAPP_H
+
+#include <e32base.h>
+#include <aknapp.h>
+
+/**
+* UID of the application
+*/
+const TUid KUidImagePrint = { 0x101FFA84 };
+
+// CLASS DEFINITION
+/**
+ * Application class
+ */
+class CImagePrintApp : public CAknApplication
+ {
+
+ private: // Constructors and destructors
+
+ CApaDocument* CreateDocumentL();
+
+ private: // Methods derived from CApaApplication
+
+ TUid AppDllUid() const;
+
+ };
+
+
+// INLINE FUNCTIONS
+
+#endif // CIMAGEPRINTAPP_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintappui.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,261 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTAPPUI_H
+#define CIMAGEPRINTAPPUI_H
+
+#include <eikapp.h>
+#include <eikdoc.h>
+#include <e32std.h>
+#include <coeccntx.h>
+#include <aknappui.h>
+#include <aknViewAppUi.h>
+#include <ErrorUI.h>
+#include <aknnotewrappers.h>
+#include <AknWaitNoteWrapper.h>
+#include <AknProgressDialog.h>
+#include <e32property.h>
+#include <data_caging_path_literals.hrh>
+
+#include "midleprinteventobserver.h"
+#include "rimageprintclient.h"
+#include "muimodeobserver.h"
+
+class CAknNavigationDecorator;
+class CDiscoveryDlgManager;
+class CImagePrintDoc;
+class CIMGPPrintDlgManager;
+class MPrintSettings;
+class MPrintPreview;
+class CAknStaticNoteDialog;
+class MUIMode;
+
+const TInt KPrinterNameID( 100 );
+
+// CLASS DEFINITION
+/**
+ *
+ * AppUi class
+ *
+ */
+class CImagePrintAppUi
+ : public CAknViewAppUi,
+ public MUIModeObserver
+ {
+
+ public: // Constructors and destructors
+
+ /**
+ * Second phase constructor
+ */
+ void ConstructL();
+
+ /**
+ * Destructor
+ */
+ virtual ~CImagePrintAppUi();
+
+ private: // Methods derived from CAknViewAppUi base class
+
+ void HandleCommandL( TInt aCommand );
+
+ public: // Methods derived from MUIModeObserver
+ void ChangeViewL( TInt aView );
+ void ExitApplication();
+
+ // Set text to navipane.
+ void SetNavipaneTextL( const TInt aCopiesOfImage, HBufC* aPaperSize = NULL );
+
+ public: // New methods
+
+ /**
+ * Method is used to forward the selected images to engine.
+ *
+ * @param aFileArray, array that contains the selected images.
+ */
+ void SetImageArrayL( CDesCArrayFlat* aFileArray );
+
+ /**
+ * Method returns the Dosument class od this application
+ *
+ * @return CimagePrintDoc document class
+ */
+ CImagePrintDoc* GetDocument();
+
+ /**
+ * Method returns the image array
+ *
+ * @return CDesCArrayFlat array that contains the selected images
+ */
+ CDesCArrayFlat* GetImageArray();
+
+ /**
+ * Launches application help
+ *
+ * @param aHelptext help text context
+ */
+ void LaunchHelpApplicationL( const TDesC& aHelpText );
+
+ /**
+ * Gets the AIW state (iAiwState)
+ *
+ */
+ TInt GetAiwState();
+
+ /**
+ * Returns UID of the application
+ *
+ * @return UID
+ */
+ TInt GetApplicationUID();
+
+ /**
+ * Returns UID for the settings view
+ *
+ * @return UID
+ */
+ TUid GetSettingsViewUid();
+
+ /**
+ * Returns AIW state.
+ *
+ * ETrue = Application is launched via AIW
+ * EFalse = Application is launched from active idle.
+ *
+ * @return AIW state.
+ */
+ TBool AiwState();
+
+ /**
+ * Check orientation mode
+ *
+ * @return ETrue of orientation is portrait, otherwise EFalse
+ */
+ TBool OrientationPortrait();
+
+ /**
+ * Check whether the operating resolution is QVGA
+ *
+ * @return ETrue if operating resolution is QVGA, otherwise EFalse
+ */
+ TBool QVGAMode();
+
+ /**
+ * Gets the album call index
+ *
+ * @return album call index
+ */
+ TInt GetAlbumCall();
+
+ /**
+ * Sets the album call index
+ *
+ * @param aAlbumCall album call index
+ */
+ void SetAlbumCall(TInt aAlbumCall);
+
+ /**
+ * Sets the validity status of images
+ *
+ * @param aStatus ETrue if images are valid, otherwise EFalse
+ */
+ void SetValidImagesStatus( TBool aStatus );
+
+ /**
+ * callback for printer search in aiw mode
+ *
+ * @param aObj callback object
+ *
+ * @return status of the call
+ */
+ static TInt SearchDefaultPrinterCbL( TAny* aObj );
+
+ private: // New methods
+
+ CDesCArrayFlat* GetImagesFromAiwProviderL();
+
+ private: // Data
+
+ // Used for navigation pane text
+ CAknNavigationDecorator* iNaviDecorator;
+
+ // Offset for engine's resource file
+ TInt iResourceOffset;
+
+ //Document class
+ CImagePrintDoc* iDoc;
+
+ CIMGPPrintDlgManager* iPrintDlgManager; // use
+
+ // Printed image files
+ CDesCArrayFlat* iFiles;
+
+ // UID of the selected printer
+ TInt iPrinterUID;
+
+ // Information about the state of usb discovery
+ TBool iUSBDiscoveryOngoing;
+
+ // Is usb printer connected to phone
+ TBool iUSBPrinter;
+
+ // USB connect/disconnect note
+ CAknProgressDialog* iUSBConnectionWaitNote;
+
+ // Is usb device connected
+ TBool iUsbConnected;
+
+ // Is USB printer selected
+ TBool iUSBPrinterSelected;
+
+ // For AIW calls;
+ TInt iAiwState;
+
+ RProperty iAiwCall;
+
+ TBool iApplicationStarting;
+
+ TBool iBTDiscovery;
+
+ RImagePrintClient iImagePrintClient;
+
+ TInt iAlbumCall;
+
+ TBool iNotifyDone;
+
+ // ETrue when exiting the application in AIW mode
+ TBool iExiting;
+
+ TBool iFullDiscovery;
+
+ TBool iDisconnectOnce;
+
+ TBool iUsbWanted;
+
+ TBool iValidImages;
+
+ MUIMode* iUIMode;
+
+ // idle object for performing search in aiw mode, owned
+ CIdle* iIdleSearch;
+
+ };
+
+#endif // CIMAGEPRINTAPPUI_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintblankcontainer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,79 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTBLANKCONTAINER_H
+#define CIMAGEPRINTBLANKCONTAINER_H
+
+#include <coecntrl.h>
+
+class CAknViewAppUi;
+class CAknsListBoxBackgroundControlContext;
+
+// CLASS DEFINITION
+/**
+ * CImagePrintBlankContainer is used to show white background before
+ * the CImagePrintView is launched
+ */
+class CImagePrintBlankContainer
+ : public CCoeControl
+ {
+
+ public: // Constructors and destructor
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aRect ClientRect of the owner control
+ *
+ * @return Initialized instance of CImagePrintBlankContainer
+ */
+ static CImagePrintBlankContainer* NewL( TRect& aRect );
+ static CImagePrintBlankContainer* NewLC( TRect& aRect );
+
+ /**
+ * Destructor
+ */
+ virtual ~CImagePrintBlankContainer();
+
+ public: //Scalable UI
+ void HandleResourceChange( TInt aType );
+
+ protected: // 2:nd phase constructor and default constructor
+
+ /**
+ * 2:nd phase constructor
+ *
+ * @param aRect ClientRect of the owner control
+ */
+ void ConstructL( const TRect& aRect );
+
+ CImagePrintBlankContainer();
+
+ private: // Methods derived from CCoeControl
+
+ void Draw( const TRect& aRect ) const;
+
+ private: // Data
+
+ // Skin control context for drawing the background bitmap
+ CAknsListBoxBackgroundControlContext* iSkinControlContext;
+ };
+
+#endif // CIMAGEPRINTBLANKCONTAINER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintdoc.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,134 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTDOC_H
+#define CIMAGEPRINTDOC_H
+
+#include <AknDoc.h>
+#include <badesca.h>
+
+class CEikAppUi;
+class CImagePrintEngine;
+class CIFFactory;
+class MPrintSettings;
+class MPrintPreview;
+class MPrintJob;
+class MDiscovery;
+class MIdlePrintEventObserver;
+
+/**
+ *
+ * Document class
+ *
+ */
+class CImagePrintDoc : public CAknDocument
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two phase construction
+ *
+ * @Param aApp Application class of this application.
+ *
+ * @return Initialized instance of CImagePrintDoc
+ */
+ static CImagePrintDoc* NewL(CEikApplication& aApp);
+
+ /**
+ * Destructor.
+ */
+ virtual ~CImagePrintDoc();
+
+ private: // Constructors and destructors
+
+ /**
+ * Default constructor.
+ */
+ CImagePrintDoc(CEikApplication& aApp);
+
+ private: // Methods derived from CAknDocumnet
+
+ /**
+ * Returns AppUi class
+ *
+ * @return Initialized instance of CEikAppUi
+ */
+ CEikAppUi* CreateAppUiL();
+
+ public: // New methods
+
+ /**
+ * Returns Engine
+ *
+ * @Return CImagePrintEngine Engine for this application
+ */
+ CImagePrintEngine* Engine();
+
+ /**
+ * Returns discovery interface
+ *
+ * @return Device discovery interface
+ */
+ MDiscovery* Discovery();
+
+ /**
+ * Returns print job interface
+ *
+ * @return Print job interface
+ */
+ MPrintJob* PrintJob();
+
+ /**
+ * Returns print preview interface
+ *
+ * @return Print preview interface
+ */
+ MPrintPreview* PrintPreview();
+
+ /**
+ * Returns settings interface
+ *
+ * @return Settings interface
+ */
+ MPrintSettings* PrintSettings();
+
+ /**
+ * Initializes engine
+ */
+ void InitializeEngineL();
+
+ /**
+ * Set selected images to engine.
+ * @param aArray array of printed image, ownership is transferred
+ */
+ void SetImageArrayL( CDesCArrayFlat* aArray );
+
+ /**
+ * Restarts Image Print Engine
+ */
+ void RestartEngine();
+
+ private: // Data
+
+ // Engine for this application
+ CImagePrintEngine* iEngine;
+ };
+
+#endif // CIMAGEPRINTDOC_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintsettingscontainer.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,169 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTSETTINGSCONTAINER_H
+#define CIMAGEPRINTSETTINGSCONTAINER_H
+
+#include <coecntrl.h>
+#include <aknlists.h>
+#include <aknnotewrappers.h>
+#include <AknWaitNoteWrapper.h>
+#include <AknProgressDialog.h>
+
+#include "midleprinteventobserver.h"
+
+class MObjectProvider;
+class MPrintSettings;
+class CPropertiesBoxModel;
+class CImagePrintSettingsItemList;
+class CImagePrintAppUi;
+class MUIMode;
+
+/**
+ *
+ * Image print settings container
+ *
+ */
+class CImagePrintSettingsContainer
+ : public CCoeControl
+ {
+
+ public: // Constructors and destructor
+
+ /**
+ * Two-phase constructor
+ * @param aSettings Print settings interface
+ * @param aProvider Object provider for setting the MOP
+ * @paramt aClientRect The screen area
+ * @return Initialized instance of the class
+ */
+ static CImagePrintSettingsContainer* NewL(
+ MPrintSettings* aSettings,
+ MObjectProvider* aProvider,
+ TRect aClientRect,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode );
+
+ /**
+ * Destructor
+ */
+ virtual ~CImagePrintSettingsContainer();
+
+ protected: // Constructors and destructor
+
+ /**
+ * Constructor
+ * MPrintSettings* aSettings Print settings interface
+ */
+ CImagePrintSettingsContainer( MPrintSettings* aSettings,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode );
+
+ /**
+ * 2nd phase constructor
+ * MObjectProvider* aProvider Object provider for setting the MOP
+ * TRect aClientRect The screen area
+ */
+ void ConstructL( MObjectProvider* aProvider, const TRect& aClientRect );
+
+ protected: // Methods derived from CCoeControl
+
+ /**
+ * Returns the amount of owned UI controls
+ *
+ * @return Number of components
+ */
+ TInt CountComponentControls() const;
+
+ /**
+ * Gets the specified component of a compound control.
+ *
+ * @param aIndex The index of the control to get.
+ * @return The component control with an index of aIndex
+ */
+ CCoeControl* ComponentControl( TInt aIndex ) const;
+
+ /**
+ * Draws the control to the device screen
+ *
+ * @param aRect Modified area (not used)
+ */
+ void Draw( const TRect& aRect ) const;
+
+ void SizeChanged();
+ void HandleResourceChange( TInt aType );
+
+ public: // New methods
+
+ /**
+ * Starts editing the active item
+ */
+ void EditItemL();
+
+ /**
+ * Starts the device discovery
+ *
+ * @param aProtocol protocol for which the discovery is done
+ * @param aHidden whether discovery is visible (dialog) or hidden
+ */
+ void DoDiscoveryL( TInt aProtocol, TBool aHidden = EFalse );
+
+ /**
+ * Changes the text in status pane
+ *
+ * @param aName new text for status pane
+ */
+
+ void ChangeStatusPaneTextL( const TInt aCopiesOfImage );
+
+ /**
+ * Updates the size of settings list
+ *
+ * @param aRect new size for list
+ */
+ void UpdateListSize( TRect aRect );
+
+ /**
+ * Tells ListBox to update itself as its' size has
+ * possible changed
+ */
+ void UpdateListBox( );
+
+ protected:
+
+ // Settings
+ MPrintSettings* iPrintSettings;
+
+ // List box model
+ CPropertiesBoxModel* iModel;
+
+ // Item list
+ CAknSettingStyleListBox* iListBox;
+
+ // AppUi
+ CImagePrintAppUi* iAppUi;
+
+ // USB connect note
+ CAknProgressDialog* iUSBConnectionWaitNote;
+
+ MUIMode* iUIMode;
+ };
+
+#endif // CIMAGEPRINTSETTINGSCONTAINER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintsettingsview.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,162 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTSETTINGSVIEW_H
+#define CIMAGEPRINTSETTINGSVIEW_H
+
+#include <aknview.h>
+#include <eikapp.h>
+#include <eikdoc.h>
+#include <coeccntx.h>
+#include <aknappui.h>
+
+class MPrintSettings;
+class MPrintJob;
+class CImagePrintSettingsContainer;
+class CIMGPPrintDlgManager;
+class CImagePrintAppUi;
+class MUIMode;
+
+const TUid KImageSettingsViewId = { 2 };
+
+/**
+ *
+ * The settings view
+ *
+ */
+class CImagePrintSettingsView
+ : public CAknView
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aSettings Print settings
+ * @param aPrintJob Print job interface to the engine
+ * @return Initialized instance of this class
+ */
+ static CImagePrintSettingsView* NewL(
+ MPrintSettings* aSettings,
+ MPrintJob* aPrintJob,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode );
+ static CImagePrintSettingsView* NewLC(
+ MPrintSettings* aSettings,
+ MPrintJob* aPrintJob,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode );
+
+ /**
+ * Destructor
+ */
+ virtual ~CImagePrintSettingsView();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Second-phase constructor
+ *
+ * @param aSettings Print settings
+ */
+ void ConstructL( MPrintSettings* aSettings );
+
+ /**
+ * Constructor
+ * @param aPrintJob Print job interface to the engine
+ */
+ CImagePrintSettingsView( MPrintJob* aPrintJob,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode );
+
+ void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane);
+
+ public: // Methods derived from CAknView
+
+ /**
+ * Returns this view's ID
+ * @return View's Id
+ */
+ TUid Id() const;
+
+ /**
+ * Handles commands coming to the viwe
+ * @param aCommand The command ID
+ */
+ void HandleCommandL(TInt aCommand);
+
+ private: // Methods derived from CAknView
+
+ /**
+ * Activates the view, creates container and other UI controls
+ *
+ * @param aPrevViewId Previous view's ID
+ * @param aCustomMessageId Custom message ID for the view (not used)
+ * @param aCustomMessage Custom messsage (not used)
+ */
+ void DoActivateL(
+ const TVwsViewId &aPrevViewId, TUid aCustomMessageId,
+ const TDesC8 &aCustomMessage );
+
+ /**
+ * Called upon view deactivation
+ */
+ void DoDeactivate();
+
+ /**
+ * Handle view foreground event
+ */
+ void HandleForegroundEventL( TBool aForeground);
+
+ private: // New methods
+
+ /**
+ * Destroys control container and removes it from the stack
+ */
+ void DestroyContainer();
+
+ /**
+ * Starts the printing sequence
+ */
+ void StartPrintingL();
+ void HandlePossibleLinkDisconnectionL();
+
+ private: // Data
+
+ // Settings view control container
+ CImagePrintSettingsContainer* iContainer;
+
+ // Pointer to the print settings interface
+ MPrintSettings* iSettings;
+
+ // Pointer to print job interface
+ MPrintJob* iPrintJob;
+
+ // Print dlg manager
+ CIMGPPrintDlgManager* iPrintDlgManager;
+
+ //AppUI
+ CImagePrintAppUi* iAppUi;
+
+ // Interface to UI mode
+ MUIMode* iUIMode;
+ };
+
+#endif // CIMAGEPRINTSETTINGSVIEW_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cimgpviewemptyview.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,84 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMGPVIEWEMPTYVIEW_H
+#define CIMGPVIEWEMPTYVIEW_H
+
+#include <aknview.h>
+#include <e32std.h>
+
+class CImagePrintBlankContainer;
+
+const TUid KIMGPViewEmptyViewId = { 4 };
+
+/**
+ *
+ * Empty view
+ *
+ */
+class CIMGPViewEmptyView : public CAknView
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Standard two-phase constructors
+ *
+ * @param aAppUi Pointer to Imageprint AppUi class
+ * @param aPrintJob Print job interface to the engine
+ * @return Initialized instance of the class
+ */
+ static CIMGPViewEmptyView* NewL();
+
+ /**
+ * Destructor
+ */
+ virtual ~CIMGPViewEmptyView();
+
+ protected:
+
+ /**
+ * Constructor
+ *
+ */
+ CIMGPViewEmptyView();
+
+ /**
+ * 2nd-phase constructor
+ */
+ void ConstructL();
+
+ public: // Methods derived from CAknView
+
+ TUid Id() const;
+ void HandleCommandL( TInt aCommand );
+ private: // Methods derived from CAknView
+
+ void DoActivateL ( const TVwsViewId &aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8 &aCustomMessage );
+ void DoDeactivate();
+
+ protected:
+ void SizeChanged();
+ void HandleForegroundEventL( TBool aForeground );
+ private:
+ CImagePrintBlankContainer* iContainer;
+ };
+#endif // CIMGPVIEWEMPTYVIEW_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/cpropertiesboxmodel.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CPROPERTIESBOXMODEL_H
+#define CPROPERTIESBOXMODEL_H
+
+#include <e32base.h>
+#include <bamdesca.h>
+#include <eiklbo.h>
+
+#include "mprintsettings.h"
+
+class CImagePrintSettingsContainer;
+class CImagePrintEngine;
+
+const TInt KMaxListName = 128;
+
+/**
+ *
+ * List box model that handles the contents of the list box and launches
+ * the pop-up dialogs that are used .
+ *
+ */
+class CPropertiesBoxModel :
+ public CBase,
+ public MEikListBoxObserver,
+ public MDesCArray
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aSettings Print settings
+ * @return Initialized instance of CPropertiesBoxModel
+ */
+ static CPropertiesBoxModel* NewL( CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer );
+
+ static CPropertiesBoxModel* NewLC( CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer );
+
+ /**
+ * Destructor
+ */
+ virtual ~CPropertiesBoxModel();
+
+ private: // Constructors and destructors
+
+ /**
+ * Constructor
+ *
+ * @param aSettings Print settings
+ */
+ CPropertiesBoxModel( CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+ public: // Methods derived from MEikListBoxObserver
+
+ void HandleListBoxEventL( CEikListBox* aListBox,
+ TListBoxEvent aEventType );
+
+ /**
+ * Returns number of copies.
+ */
+ TInt NumberOfCopies();
+
+
+ private: // Methods derived from MDesCArray
+
+ TInt MdcaCount() const;
+ TPtrC MdcaPoint( TInt aIndex ) const;
+
+ private: // New methods
+
+ /**
+ * Returns the index to the capability array from list box array
+ *
+ * @return Capability array index
+ */
+ TUint CapabilityArrayIndex( TInt aListBoxIndex ) const;
+
+ /**
+ * Stores current setting to the engine
+ */
+ void SaveCurrentSelectionL( CBaseCapability &aCapab, CEikListBox* aListBox );
+
+ /**
+ * Launches list query for default printer
+ *
+ * @return wanted protocol
+ */
+ TInt LaunchDefaultPrinterListL();
+
+ /**
+ * Stores number of copies value to the engine
+ * NOTE: Number of copies value is job based value since IP 6.2
+ */
+ void LaunchNumberOfCopiesDialogL();
+
+ /**
+ * Init print settings
+ */
+ void InitSettingsL();
+
+ /**
+ * Sets DefaultPrinterItem for ListBox
+ */
+ void SetDefaultPrinterItem() const;
+
+ /**
+ * Sets SetNumberOfCopiesItem for ListBox
+ */
+ void SetNumberOfCopiesItem() const;
+
+ /**
+ * Sets other capability(template, papersize etc.) for ListBox
+ */
+ void SetOtherCapability( const TInt &aIndex ) const;
+
+ /**
+ * Sets number of copies value for settings
+ */
+ void SetNumberOfCopiesValueL();
+
+ private: // Data
+
+ CImagePrintEngine& iEngine;
+ MPrintSettings* iSettingsIF; // use
+ CPrintSettings* iPrintSettings;
+ TInt iCount;
+ TInt iNumberOfCopiesValue;
+ CImagePrintSettingsContainer* iContainer;
+ mutable TBuf<KMaxListName> iBuf;
+ HBufC* iDefaultPrinter;
+ HBufC* iNumberOfCopiesText;
+ HBufC* iMMC;
+ HBufC* iPictBridge;
+ };
+
+#endif // CPROPERTIESBOXMODEL_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/imageprintapp.hrh Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,61 @@
+/*
+* 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:
+*
+*/
+
+
+
+#ifndef IMAGEPRINTAPP_HRH
+#define IMAGEPRINTAPP_HRH
+
+enum TCustomControlsIDs
+ {
+ EPrintProgressNote = 0x2000,
+ EPrintWaitNote,
+ ENoPrintersConfirmation,
+ EBitmapCtrl,
+ EBrandingBitmap
+ };
+
+// Commands for preview view
+enum TPreviewView
+ {
+ ECmdPrint = 0x1000,
+ ECmdPrintSettings,
+ ECmdPrintNumberOfCopies,
+ ECmdPrintHelp
+ };
+
+// Commands for the setting view's HandleCommandL()
+enum TSettingsViewCommands
+ {
+ ESettingsChangeItem = 0x2200,
+ ESettingsPrint,
+ ESettingsExit
+ };
+
+enum TImageSelectionViewCommands
+ {
+ ESelectMarked = 0x2400
+ };
+
+// View state for the binary setting items
+enum TSettingsViewState
+ {
+ EOff = 0,
+ EOn = 1
+ };
+
+#endif // IMAGEPRINTAPP_HRH
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/imageprintconsts.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,460 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTCONSTS_H
+#define IMAGEPRINTCONSTS_H
+
+// High resolution / Low resolution ratio. In LR mode all UI pixel
+// parameter are half of corresponding HR parameter.
+const TInt HLRatio( 2 );
+
+// Preview Pane PORTRAIT
+const TInt KPreviewPaneWidthPort( 256 );
+const TInt KPreviewPaneHeightPort( 256 );
+const TInt KPreviewPanePositionXPort( 0 );
+const TInt KPreviewPanePositionYPort( 0 );
+const TInt KTemplateIndLeftPosX1Port( 22 );
+const TInt KTemplateIndLeftPosY1Port( 228 );
+const TInt KTemplateIndLeftPosX2Port( 22 );
+const TInt KTemplateIndLeftPosY2Port( 252 );
+const TInt KTemplateIndLeftPosX3Port( 10 );
+const TInt KTemplateIndLeftPosY3Port( 240 );
+const TInt KTemplateIndRightPosX1Port( 236 );
+const TInt KTemplateIndRightPosY1Port( 228 );
+const TInt KTemplateIndRightPosX2Port( 236 );
+const TInt KTemplateIndRightPosY2Port( 252 );
+const TInt KTemplateIndRightPosX3Port( 248 );
+const TInt KTemplateIndRightPosY3Port( 240 );
+const TInt KPreviewPaneFontSizePort( 12 );
+const TInt KPortPaperWidthPort( 192 );
+const TInt KportPaperHeightPort( 256 );
+const TInt KPortPaperPositionXPort( 32 );
+const TInt KPortPaperPositionYPort( 0 );
+const TInt KLandPaperWidthPort( 256 );
+const TInt KLandPaperHeightPort( 192 );
+const TInt KLandPaperPositionXPort( 0 );
+const TInt KLandPaperPositionYPort( 32 );
+const TInt KPageNumberBoxPositionPortX( 170 );
+const TInt KPageNumberBoxSizePortX( 86 );
+const TInt KPageNumberBoxSizePortY( 35 );
+
+// Preview Pane PORTRAIT QVGA
+const TInt KPreviewPaneWidthPortQVGA( 200 ); // pane width
+const TInt KPreviewPaneHeightPortQVGA( 200 ); // pane height
+const TInt KPreviewPanePositionXPortQVGA( 0 ); // leftmost pos of pane
+const TInt KPreviewPanePositionYPortQVGA( 0 ); // top pos of pane
+const TInt KTemplateIndLeftPosX1PortQVGA( 20 ); //coordinates for left scroll arrow
+const TInt KTemplateIndLeftPosY1PortQVGA( 176 );
+const TInt KTemplateIndLeftPosX2PortQVGA( 20 );
+const TInt KTemplateIndLeftPosY2PortQVGA( 196 );
+const TInt KTemplateIndLeftPosX3PortQVGA( 10 );
+const TInt KTemplateIndLeftPosY3PortQVGA( 186 );
+const TInt KTemplateIndRightPosX1PortQVGA( 180 ); //coordinates for right scroll arrow
+const TInt KTemplateIndRightPosY1PortQVGA( 176 );
+const TInt KTemplateIndRightPosX2PortQVGA( 180 );
+const TInt KTemplateIndRightPosY2PortQVGA( 196 );
+const TInt KTemplateIndRightPosX3PortQVGA( 190 );
+const TInt KTemplateIndRightPosY3PortQVGA( 186 );
+const TInt KPortPaperWidthPortQVGA( 150 ); // portrait paper width
+const TInt KportPaperHeightPortQVGA( 200 ); // portrait paper height
+const TInt KPortPaperPositionXPortQVGA( 25 ); // portrait paper leftmost pos
+const TInt KPortPaperPositionYPortQVGA( 0 ); // portrait paper top pos
+const TInt KLandPaperWidthPortQVGA( 200 ); // landscape paper width
+const TInt KLandPaperHeightPortQVGA( 150 ); // landscape paper height
+const TInt KLandPaperPositionXPortQVGA( 0 ); // landscape paper leftmost pos
+const TInt KLandPaperPositionYPortQVGA( 25 ); // landscape paper top pos
+const TInt KPageNumberBoxPositionPortXQVGA( 128 ); // page number box leftmost pos
+const TInt KPageNumberBoxSizePortXQVGA( 72 ); // page number box width
+const TInt KPageNumberBoxSizePortYQVGA( 18 ); // page number box height
+
+// Preview Pane LANDSCAPE QVGA
+const TInt KPreviewPaneWidthLandscapeQVGA( 192 ); // pane width
+const TInt KPreviewPaneHeightLandscapeQVGA( 192 ); // pane height
+const TInt KPreviewPanePositionXLandscapeQVGA( 0 ); // leftmost pos of pane
+const TInt KPreviewPanePositionYLandscapeQVGA( 0 ); // top pos of pane
+const TInt KTemplateIndLeftPosX1LandscapeQVGA( 20 ); //coordinates for left scroll arrow
+const TInt KTemplateIndLeftPosY1LandscapeQVGA( 168 );
+const TInt KTemplateIndLeftPosX2LandscapeQVGA( 20 );
+const TInt KTemplateIndLeftPosY2LandscapeQVGA( 188 );
+const TInt KTemplateIndLeftPosX3LandscapeQVGA( 10 );
+const TInt KTemplateIndLeftPosY3LandscapeQVGA( 178 );
+const TInt KTemplateIndRightPosX1LandscapeQVGA( 172 ); //coordinates for right scroll arrow
+const TInt KTemplateIndRightPosY1LandscapeQVGA( 168 );
+const TInt KTemplateIndRightPosX2LandscapeQVGA( 172 );
+const TInt KTemplateIndRightPosY2LandscapeQVGA( 188 );
+const TInt KTemplateIndRightPosX3LandscapeQVGA( 182 );
+const TInt KTemplateIndRightPosY3LandscapeQVGA( 178 );
+const TInt KportPaperWidthLandscapeQVGA( 144 ); // portrait paper width
+const TInt KportPaperHeightLandscapeQVGA( 192 ); // portrait paper height
+const TInt KPortPaperPositionXLandscapeQVGA( 24 ); // portrait paper leftmost pos
+const TInt KPortPaperPositionYLandscapeQVGA( 0 ); // portrait paper top pos
+const TInt KLandPaperWidthLandscapeQVGA( 192 ); // landscape paper width
+const TInt KLandPaperHeightLandscapeQVGA( 144 ); // landscape paper height
+const TInt KLandPaperPositionXLandscapeQVGA( 0 ); // landscape paper leftmost pos
+const TInt KLandPaperPositionYLandscapeQVGA( 24 ); // landscape paper top pos
+const TInt KPageNumberBoxPositionXLandscapeQVGA( 124 ); // page number box leftmost pos
+const TInt KPageNumberBoxSizeXLandscapeQVGA( 68 ); // page number box width
+const TInt KPageNumberBoxSizeYLandscapeQVGA( 18 ); // page number box height
+
+// Preview Pane LANDSCAPE
+const TInt KPreviewPaneWidthLand( 288 );
+const TInt KPreviewPaneHeightLand( 288 );
+const TInt KPreviewPanePositionXLand( 0 );
+const TInt KPreviewPanePositionYLand( 0 );
+const TInt KTemplateIndLeftPosX1Land( 24 );
+const TInt KTemplateIndLeftPosY1Land( 258 );
+const TInt KTemplateIndLeftPosX2Land( 24 );
+const TInt KTemplateIndLeftPosY2Land( 282 );
+const TInt KTemplateIndLeftPosX3Land( 12 );
+const TInt KTemplateIndLeftPosY3Land( 270 );
+const TInt KTemplateIndRightPosX1Land( 264 );
+const TInt KTemplateIndRightPosY1Land( 258 );
+const TInt KTemplateIndRightPosX2Land( 264 );
+const TInt KTemplateIndRightPosY2Land( 282 );
+const TInt KTemplateIndRightPosX3Land( 276 );
+const TInt KTemplateIndRightPosY3Land( 270 );
+const TInt KPreviewPaneFontSizeLand( 12 );
+const TInt KPortPaperWidthLand( 216 );
+const TInt KPortPaperHeightLand( 288 );
+const TInt KPortPaperPositionXLand( 36 );
+const TInt KPortPaperPositionYLand( 0 );
+const TInt KLandPaperWidthLand( 288 );
+const TInt KLandPaperHeightLand( 216 );
+const TInt KLandPaperPositionXLand( 0 );
+const TInt KLandPaperPositionYLand( 36 );
+const TInt KPageNumberBoxPositionLandX( 202 );
+const TInt KPageNumberBoxSizeLandX( 86 );
+const TInt KPageNumberBoxSizeLandY( 35 );
+
+// Browser Pane PORTRAIT
+const TInt KBrowserPaneWidthPort( 96 );
+const TInt KBrowserPaneHeightPort( 256 );
+const TInt KBrowserPanePositionXPort( 256 );
+const TInt KBrowserPanePositionYPort( 0 );
+const TInt KDefaultCursorFillPositionXPort( 264 );
+const TInt KDefaultCursorFillPositionYPort( 20 );
+const TInt KCursorFillWidthPort( 79 );
+const TInt KCursorFillHeightPort( 69 );
+const TInt KMaxCursorRightSidePort( 346 );
+const TInt KMinCursorLeftSidePort( 60 );
+const TInt KCursorStepPort( 72 ); //42
+const TInt KDefaultThumbnailPositionXPort( 12 );
+const TInt KDefaultThumbnailPositionYPort( 24 );
+const TInt KThumbnailImgWidthPort( 72 ); // 72
+const TInt KThumbnailImgHeightPort( 62 ); // 65
+const TInt KCursorFillPenSizePort( 4 );
+const TInt KCursorPenSizePort( 4 );
+const TInt KMaxCursorTopPositionPort( 78 ); //check
+const TInt KMaxCursorBottomPositionPort( 232 );
+
+const TInt KImageIndUpPosX1Port( 292 );
+const TInt KImageIndUpPosY1Port( 14 );
+const TInt KImageIndUpPosX2Port( 316 );
+const TInt KImageIndUpPosY2Port( 14 );
+const TInt KImageIndUpPosX3Port( 304 );
+const TInt KImageIndUpPosY3Port( 2 );
+const TInt KImageIndDownPosX1Port( 292 );
+const TInt KImageIndDownPosY1Port( 242 );
+const TInt KImageIndDownPosX2Port( 316 );
+const TInt KImageIndDownPosY2Port( 242 );
+const TInt KImageIndDownPosX3Port( 304 );
+const TInt KImageIndDownPosY3Port( 254 );
+
+// Browser Pane PORTRAIT QVGA
+const TInt KBrowserPaneWidthPortQVGA( 40 ); // browser pane width
+const TInt KBrowserPaneHeightPortQVGA( 200 ); // browser pane height
+const TInt KBrowserPanePositionXPortQVGA( 200 ); // browser pane leftmost pos
+const TInt KBrowserPanePositionYPortQVGA( 0 ); // browser pane top pos
+
+const TInt KDefaultCursorFillPositionXPortQVGA( 201 ); // cursor initial leftmost pos
+const TInt KDefaultCursorFillPositionYPortQVGA( 43 ); // cursor initial top pos
+const TInt KCursorFillWidthPortQVGA( 38 ); // cursor width
+const TInt KCursorFillHeightPortQVGA( 33 ); // cursor height
+const TInt KCursorStepPortQVGA( 40 ); // height pos diff between thumbnails
+const TInt KDefaultThumbnailPositionXPortQVGA( 1 ); // 1st thumbnail initial leftmost pos
+const TInt KDefaultThumbnailPositionYPortQVGA( 45 ); // 1st thumbnail initial top pos
+const TInt KThumbnailImgWidthPortQVGA( 38 ); // thumbnail image width
+const TInt KThumbnailImgHeightPortQVGA( 29 ); // thumbnail image height
+const TInt KCursorPenSizePortQVGA( 4 ); // cursor frame size
+const TInt KMaxCursorTopPositionPortQVGA( 55 ); // cursor top limit
+const TInt KMaxCursorBottomPositionPortQVGA( 155 ); // cursor bottom limit
+
+const TInt KImageIndUpPosX1PortQVGA( 210 ); //coordinates for up scroll arrow
+const TInt KImageIndUpPosY1PortQVGA( 25 );
+const TInt KImageIndUpPosX2PortQVGA( 230 );
+const TInt KImageIndUpPosY2PortQVGA( 25 );
+const TInt KImageIndUpPosX3PortQVGA( 220 );
+const TInt KImageIndUpPosY3PortQVGA( 15 );
+const TInt KImageIndDownPosX1PortQVGA( 210 ); //coordinates for down scroll arrow
+const TInt KImageIndDownPosY1PortQVGA( 175 );
+const TInt KImageIndDownPosX2PortQVGA( 230 );
+const TInt KImageIndDownPosY2PortQVGA( 175 );
+const TInt KImageIndDownPosX3PortQVGA( 220 );
+const TInt KImageIndDownPosY3PortQVGA( 185 );
+
+// Browser Pane LANDSCAPE QVGA
+const TInt KBrowserPaneWidthLandscapeQVGA( 128 ); // browser pane width
+const TInt KBrowserPaneHeightLandscapeQVGA( 192 ); // browser pane height
+const TInt KBrowserPanePositionXLandscapeQVGA( 192 ); // browser pane leftmost pos
+const TInt KBrowserPanePositionYLandscapeQVGA( 0 ); // browser pane top pos
+const TInt KDefaultCursorFillPositionXLandscapeQVGA( 216 );// cursor initial leftmost pos
+const TInt KDefaultCursorFillPositionYLandscapeQVGA( 3 ); // cursor initial top pos
+const TInt KCursorFillWidthLandscapeQVGA( 79 ); // cursor width
+const TInt KCursorFillHeightLandscapeQVGA( 60 ); // cursor height
+const TInt KCursorStepLandscapeQVGA( 61 ); // height pos diff between thumbnails
+const TInt KDefaultThumbnailPositionXLandscapeQVGA( 26 ); // 1st thumbnail initial leftmost pos
+const TInt KDefaultThumbnailPositionYLandscapeQVGA( 5 ); // 1st thumbnail initial top pos
+const TInt KThumbnailImgWidthLandscapeQVGA( 77 ); // thumbnail image width
+const TInt KThumbnailImgHeightLandscapeQVGA( 58 ); // thumbnail image height
+const TInt KCursorPenSizeLandscapeQVGA( 4 ); // cursor frame size
+const TInt KMaxCursorTopPositionLandscapeQVGA( 10 ); // cursor top limit
+const TInt KMaxCursorBottomPositionLandscapeQVGA( 155 ); // cursor bottom limit
+const TInt KImageIndUpPosX1LandscapeQVGA( 199 ); //coordinates for up scroll arrow
+const TInt KImageIndUpPosY1LandscapeQVGA( 30 );
+const TInt KImageIndUpPosX2LandscapeQVGA( 209 );
+const TInt KImageIndUpPosY2LandscapeQVGA( 30 );
+const TInt KImageIndUpPosX3LandscapeQVGA( 204 );
+const TInt KImageIndUpPosY3LandscapeQVGA( 20 );
+const TInt KImageIndDownPosX1LandscapeQVGA( 199 ); //coordinates for down scroll arrow
+const TInt KImageIndDownPosY1LandscapeQVGA( 172 );
+const TInt KImageIndDownPosX2LandscapeQVGA( 209 );
+const TInt KImageIndDownPosY2LandscapeQVGA( 172 );
+const TInt KImageIndDownPosX3LandscapeQVGA( 204 );
+const TInt KImageIndDownPosY3LandscapeQVGA( 182 );
+
+// Browser Pane LANDSCAPE
+const TInt KBrowserPaneWidthLand( 128 );
+const TInt KBrowserPaneHeightLand( 288 );
+const TInt KBrowserPanePositionXLand( 288 );
+const TInt KBrowserPanePositionYLand( 0 );
+const TInt KDefaultCursorFillPositionXLand( 298 );
+const TInt KDefaultCursorFillPositionYLand( 21 );
+const TInt KCursorFillWidthLand( 108 );
+const TInt KCursorFillHeightLand( 82 );
+const TInt KMaxCursorRightSideLand( 346 );
+const TInt KMinCursorLeftSideLand( 60 );
+const TInt KCursorStepLand( 82 ); //42
+const TInt KDefaultThumbnailPositionXLand( 14 );
+const TInt KDefaultThumbnailPositionYLand( 25 );
+const TInt KThumbnailImgWidthLand( 100 );
+const TInt KThumbnailImgHeightLand( 74 );
+const TInt KCursorFillPenSizeLand( 4 );
+const TInt KCursorPenSizeLand( 4 );
+const TInt KMaxCursorTopPositionLand( 78 ); //check
+const TInt KMaxCursorBottomPositionLand( 232 );
+
+const TInt KImageIndUpPosX1Land( 340 );
+const TInt KImageIndUpPosY1Land( 14 );
+const TInt KImageIndUpPosX2Land( 364 );
+const TInt KImageIndUpPosY2Land( 14 );
+const TInt KImageIndUpPosX3Land( 352 );
+const TInt KImageIndUpPosY3Land( 2 );
+const TInt KImageIndDownPosX1Land( 340 );
+const TInt KImageIndDownPosY1Land( 274 );
+const TInt KImageIndDownPosX2Land( 364 );
+const TInt KImageIndDownPosY2Land( 274 );
+const TInt KImageIndDownPosX3Land( 352 );
+const TInt KImageIndDownPosY3Land( 286 );
+
+// Browser pane general
+const TInt KMaxTemplatesOnScreen( 3 ); // max image thumbnails to see in browse pane
+const TInt KNoBrowserIndicators( 0 );
+const TInt KLeftBrowserIndicator( 1 );
+const TInt KRightBrowserIndicator( 2 );
+const TInt KBothBrowserIndicators( 3 );
+const TInt KCursorPositionOne( 1 );
+const TInt KCursorPositionTwo( 2 );
+const TInt KCursorPositionThree( 3 );
+const TInt KCursorFillColorR( 102 );
+const TInt KCursorFillColorG( 153 );
+const TInt KCursorFillColorB( 255 );
+const TInt KBrowserPaneCursorUp( -1 );
+const TInt KBrowserPaneCursorDown( 1 );
+const TInt KBrowserPaneCursorLeft( -1 );
+const TInt KBrowserPaneCursorRight( 1 );
+
+//Info Pane - PORTRAIT
+const TInt KInfoPaneWidth(352);
+const TInt KInfoPaneHeight(32);
+const TInt KInfoPanePositionX( 0 );
+const TInt KInfoPanePositionY( 256 );
+
+//Info Pane - PORTRAIT QVGA
+const TInt KInfoPaneWidthQVGA( 240 ); // info pane width
+const TInt KInfoPaneHeightQVGA( 24 ); // info pane height
+const TInt KInfoPanePositionXQVGA( 0 ); // info pane leftmost pos
+const TInt KInfoPanePositionYQVGA( 200 ); // info pane top pos
+
+//Tooltip - GENERAL
+const TInt KTooltipDelay( 3000000 );
+const TUint32 KTooltipTransparency( 0x333333 );
+const TInt KNumberInputInterval( 750000 );
+
+//Tooltip - PORTRAIT
+const TInt KTooltipWidthPort( 288 );
+const TInt KTooltipHeightPort( 226 );
+const TInt KTooltipPositionXPort( 32 );
+const TInt KTooltipPositionYPort( 15 );
+const TInt KTooltipPaddingPort( 10 );
+
+//Tooltip - PORTRAIT QVGA
+const TInt KTooltipWidthPortQVGA( 200 );
+const TInt KTooltipHeightPortQVGA( 170 );
+const TInt KTooltipPositionXPortQVGA( 20 );
+const TInt KTooltipPositionYPortQVGA( 15 );
+const TInt KTooltipPaddingPortQVGA( 10 );
+
+//Tooltip - LANDSCAPE
+const TInt KTooltipWidthLand( 352 );
+const TInt KTooltipHeightLand( 226 );
+const TInt KTooltipPositionXLand( 32 );
+const TInt KTooltipPositionYLand( 31 );
+const TInt KTooltipPaddingLand( 10 );
+
+//Tooltip - LANDSCAPE QVGA
+const TInt KTooltipWidthLandQVGA( 240 );
+const TInt KTooltipHeightLandQVGA( 170 );
+const TInt KTooltipPositionXLandQVGA( 35 );
+const TInt KTooltipPositionYLandQVGA( 11 );
+const TInt KTooltipPaddingLandQVGA( 10 );
+
+//SliderQuery - GENERAL
+const TUint32 KSliderQueryTransparency( 0x333333 );
+
+//SliderQuery - PORTRAIT
+const TInt KSliderQueryWidthPort( 352 );
+const TInt KSliderQueryHeightPort( 128 );
+const TInt KSliderQueryPositionXPort( 0 );
+const TInt KSliderQueryPositionYPort( 160 );
+
+const TInt KSliderQueryButtonLeftXPort( 10 );
+const TInt KSliderQueryButtonLeftYPort( 75 );
+const TInt KSliderQueryBarXPort( 40 );
+const TInt KSliderQueryBarYPort( 84 );
+const TInt KSliderQueryButtonRightXPort( 322 );
+const TInt KSliderQueryButtonRightYPort( 75 );
+
+const TInt KSliderQueryButtonSizeXPort( 20 );
+const TInt KSliderQueryButtonSizeYPort( 20 );
+const TInt KSliderQueryBarSizeXPort( 272 );
+const TInt KSliderQueryBarSizeYPort( 2 );
+const TInt KSliderQueryHandleSizeXPort( 42 );
+const TInt KSliderQueryHandleSizeYPort( 42 );
+
+const TInt KSliderQueryTitlePosXPort( 10 );
+const TInt KSliderQueryTitlePosYPort( 0 );
+const TInt KSliderQueryTitleSizXPort( 282 );
+const TInt KSliderQueryTitleSizYPort( 64 );
+
+const TInt KSliderQueryHandlePositionYPort( 64 );
+
+//SliderQuery - PORTRAIT QVGA
+const TInt KSliderQueryWidthPortQVGA( 240 );
+const TInt KSliderQueryHeightPortQVGA( 100 );
+const TInt KSliderQueryPositionXPortQVGA( 0 );
+const TInt KSliderQueryPositionYPortQVGA( 124 );
+
+const TInt KSliderQueryButtonLeftXPortQVGA( 8 );
+const TInt KSliderQueryButtonLeftYPortQVGA( 59 );
+const TInt KSliderQueryBarXPortQVGA( 25 );
+const TInt KSliderQueryBarYPortQVGA( 65 );
+const TInt KSliderQueryButtonRightXPortQVGA( 218 );
+const TInt KSliderQueryButtonRightYPortQVGA( 59 );
+
+const TInt KSliderQueryButtonSizeXPortQVGA( 14 );
+const TInt KSliderQueryButtonSizeYPortQVGA( 14 );
+const TInt KSliderQueryBarSizeXPortQVGA( 190 );
+const TInt KSliderQueryBarSizeYPortQVGA( 2 );
+const TInt KSliderQueryHandleSizeXPortQVGA( 32 );
+const TInt KSliderQueryHandleSizeYPortQVGA( 32 );
+
+const TInt KSliderQueryTitlePosXPortQVGA( 8 );
+const TInt KSliderQueryTitlePosYPortQVGA( 0 );
+const TInt KSliderQueryTitleSizXPortQVGA( 190 );
+const TInt KSliderQueryTitleSizYPortQVGA( 50 );
+
+const TInt KSliderQueryHandlePositionYPortQVGA( 50 );
+
+//SliderQuery - LANDSCAPE
+const TInt KSliderQueryWidthLand( 416 );
+const TInt KSliderQueryHeightLand( 144 );
+const TInt KSliderQueryPositionXLand( 0 );
+const TInt KSliderQueryPositionYLand( 144 );
+
+const TInt KSliderQueryButtonLeftXLand( 19 );
+const TInt KSliderQueryButtonLeftYLand( 86 );
+const TInt KSliderQueryBarXLand( 58 );
+const TInt KSliderQueryBarYLand( 95 );
+const TInt KSliderQueryButtonRightXLand( 377 );
+const TInt KSliderQueryButtonRightYLand( 86 );
+
+const TInt KSliderQueryButtonSizeXLand( 20 );
+const TInt KSliderQueryButtonSizeYLand( 20 );
+const TInt KSliderQueryBarSizeXLand( 299 );
+const TInt KSliderQueryBarSizeYLand( 2 );
+const TInt KSliderQueryHandleSizeXLand( 42 );
+const TInt KSliderQueryHandleSizeYLand( 42 );
+
+const TInt KSliderQueryTitlePosXLand( 19 );
+const TInt KSliderQueryTitlePosYLand( 0 );
+const TInt KSliderQueryTitleSizXLand( 299 );
+const TInt KSliderQueryTitleSizYLand( 73 );
+
+const TInt KSliderQueryHandlePositionYLand( 73 );
+
+//SliderQuery - LANDSCAPE QVGA
+const TInt KSliderQueryWidthLandQVGA( 320 );
+const TInt KSliderQueryHeightLandQVGA( 96 );
+const TInt KSliderQueryPositionXLandQVGA( 0 );
+const TInt KSliderQueryPositionYLandQVGA( 96 );
+
+const TInt KSliderQueryButtonLeftXLandQVGA( 13 );
+const TInt KSliderQueryButtonLeftYLandQVGA( 57 );
+const TInt KSliderQueryBarXLandQVGA( 40 );
+const TInt KSliderQueryBarYLandQVGA( 63 );
+const TInt KSliderQueryButtonRightXLandQVGA( 293 );
+const TInt KSliderQueryButtonRightYLandQVGA( 57 );
+
+const TInt KSliderQueryButtonSizeXLandQVGA( 14 );
+const TInt KSliderQueryButtonSizeYLandQVGA( 14 );
+const TInt KSliderQueryBarSizeXLandQVGA( 240 );
+const TInt KSliderQueryBarSizeYLandQVGA( 2 );
+const TInt KSliderQueryHandleSizeXLandQVGA( 32 );
+const TInt KSliderQueryHandleSizeYLandQVGA( 32 );
+
+const TInt KSliderQueryTitlePosXLandQVGA( 13 );
+const TInt KSliderQueryTitlePosYLandQVGA( 0 );
+const TInt KSliderQueryTitleSizXLandQVGA( 240 );
+const TInt KSliderQueryTitleSizYLandQVGA( 48 );
+
+const TInt KSliderQueryHandlePositionYLandQVGA( 48 );
+
+// GENERAL
+const TInt KScreenModePortrait = 0;
+const TInt KScreenModeLandscape = 1;
+const TInt KScreenModePortraitQVGA = 2;
+const TInt KScreenModeLandscapeQVGA = 3;
+
+const TInt KScreenWidthPortrait = 352;
+const TInt KScreenWidthLandscape = 416;
+const TInt KScreenWidthPortraitQVGA = 240;
+const TInt KScreenWidthLandscapeQVGA = 320;
+
+#endif // IMAGEPRINTCONSTS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/mprintingobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTINGOBSERVER_H
+#define MPRINTINGOBSERVER_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+/**
+ *
+ * Interface for observing printing status
+ *
+ */
+class MPrintingObserver
+ {
+ public: // Abstract methods
+
+ /**
+ * Receive info that printing process has been ended
+ *
+ * @param aPrintingCanceled ETrue if printing was ended by canceling
+ * the process, otherwise EFalse
+ */
+ virtual void PrintingCompletedL( TBool aPrintingCanceled = EFalse ) = 0;
+ };
+
+#endif // MPRINTINGOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/muimode.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+#ifndef MUIMODE_H
+#define MUIMODE_H
+
+#include <e32def.h>
+#include <e32base.h>
+
+class MDiscovery;
+
+/**
+ *
+ * Base class for UI mode classes
+ *
+ */
+class MUIMode
+ {
+ public:
+
+ virtual ~MUIMode(){};
+
+ public: // New methods
+
+ /**
+ * Called when applaction starts. Finds the default printer or
+ * starts the full discovery if it is not available
+ */
+ virtual void SearchDefaultPrinterL() = 0;
+
+ /**
+ * Called when specific protocol is needed.
+ */
+ virtual TBool ChangeDefaultPrinterL( TInt aProtocol ) = 0;
+
+
+ };
+
+#endif // MUIMODE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/muimodeobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+#ifndef MUIMODEOBSERVER_H
+#define MUIMODEOBSERVER_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Observer class that informs AppUi class to change view,
+ * exit application etc.
+ *
+ */
+class MUIModeObserver
+ {
+ public:
+
+ // available views
+ enum TView
+ {
+ ImageSelectionView,
+ PreviewView,
+ SettingsView
+ };
+
+ /**
+ * Changes the view to the given one
+ *
+ * @param aView the view to be changed to
+ */
+ virtual void ChangeViewL( TInt aView ) = 0;
+
+ /**
+ * Exits the application
+ */
+ virtual void ExitApplication() = 0;
+
+ /**
+ * Sets the text for navipane
+ *
+ * @param aCopiesOfImage image count for navepane
+ * @param aPaperSize paper size text for navipane
+ */
+ virtual void SetNavipaneTextL( const TInt aCopiesOfImage, HBufC* aPaperSize = NULL ) = 0;
+
+ };
+
+#endif // MUIMODEOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/printapputil.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,78 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef PRINTAPPUTIL_H
+#define PRINTAPPUTIL_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Utility class that contains small static helper methods to group
+ * the common functionality
+ *
+ */
+class PrintAppUtil
+ {
+ public:
+
+ /**
+ * Displays error note using given resource id as the text
+ *
+ * @param aResourceId Resource ID for the given error text
+ */
+ static void ShowErrorNoteL( TInt aResourceId );
+
+ /**
+ * Displays information note using given resource id as the text
+ *
+ * @param aResourceId Resource ID for the given error text
+ */
+ static void ShowInfoNoteL( TInt aResourceId );
+
+ /**
+ * Displays error note using given error code as the source
+ * for the text
+ *
+ * @param aErrCode Error code
+ */
+ static void ShowErrorMsgL( TInt aErrCode );
+
+ /**
+ * Loads error message specifically created for printer application
+ *
+ * @param aErrCode Error code
+ *
+ * @return the error message string for given error code
+ */
+ static HBufC* PrintErrorMsgLC( TInt aErrCode );
+
+ /**
+ * Returns filename with the application path
+ *
+ * @param aFileName The filename
+ *
+ * @return filename added to the application path
+ */
+ static TFileName AddApplicationPath( const TDesC& aFileName );
+ };
+
+
+#endif // PRINTAPPUTIL_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/inc/uimodefactory.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef UIMODEFACTORY_H
+#define UIMODEFACTORY_H
+
+#include <e32def.h>
+#include <e32base.h>
+
+#include "cimageprintappui.h"
+#include "muimodeobserver.h"
+#include "muimode.h"
+
+class CAiwMode;
+class CIdleMode;
+class CIFFactory;
+
+/**
+ * Factory class for UI mode objects
+ */
+class UIModeFactory
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Creates the UI mode specified with parametres
+ *
+ * @param aAiwMode Whether Aiw mode is the one to be created
+ * @param aUIModeObserver Pointer to UI mode observer
+ * @param aIFFactory Interface factory to be used
+ *
+ * @return The newly created UI mode object
+ */
+ static MUIMode* CreateL( TBool aAiwMode,
+ MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory );
+
+ protected:
+
+ ~UIModeFactory();
+ };
+
+#endif // UIMODEFACTORY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/loc/imageprintapp.loc Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,427 @@
+/*
+* Copyright (c) 2002-2008 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: The localization file for user interface in Image Print R6.2
+*
+*/
+
+
+/**
+* Syntax of a logical name entry in this file is the following:
+*
+* // d:context description (line 1)
+* // d:context description (line N)
+* // l:P_No
+* // r:n.n (n=0..N)
+*
+* #define qtn_?feature/?module_name_?freetext "?text"
+* #define text_?feature/?module_name_?freetext "?text"
+*
+* where
+* "qtn_" or "text_" starts a logical name, which does not
+* contain dots.
+* "d:" starts description line(s), which
+* clarify entry's context with information like:
+* 1. Is a word a verb in imperative or is it a noun ?
+* - what does text "Set" mean ?
+* 2. What will replace %U (unicode text parameter) or
+* %N (number parameter) included in texts ?
+* - is it phone number or email address ?
+* "l:" starts a layout information (one line).
+* "P" and "No" are symbols in LAF's information table
+* - "P" is parent pane or current pane
+* - "No" is reference number in table
+* "r:" starts the release information line. Write here the release
+* where the text will be used for the first time.
+*
+*/
+
+// LOCALISATION STRINGS
+
+// d:Search again text on device discovery dialog
+// l:list_single_pane_t1_cp2
+#define qtn_print_search_again "Search again"
+
+// d:Info note displayed to user to connect the cable
+// l:popup_note_window
+#define qtn_print_connect_usb_note "Connect USB printer"
+
+// d:Printing error note, notifies user that the printer has run out of paper
+// l:popup_note_window
+#define qtn_print_outofpaper_error "Out of paper"
+
+// d:Printing error note, notifies user to check the printer
+// l:popup_note_window
+#define qtn_print_status_error "Check status of printer"
+
+// d:Printing error note, couldn't find the file from device/MMC
+// l:popup_note_window
+#define qtn_print_not_found_error "File not found."
+
+// d:Printing error note, notifies user that the printer has run out of ink
+// l:popup_note_window
+#define qtn_print_outofink_error "Out of ink"
+
+// d:Printing error note, notifies user that the printer is running out of ink
+// l:popup_note_window
+#define qtn_print_inklow_error "Ink low"
+
+// d:Help command in the "Options" menu of Image Print
+// l:list_single_pane_t1_cp2
+#define qtn_print_menu_opt_help "Help"
+
+// d:Text used in the wait note when either printer discovery or print job has been cancelled.
+// l:popup_note_wait_window
+#define qtn_print_progress_prompt_cancel "Cancelling"
+
+// d:(No printers) text on device discovery dialog while the search is ongoing and nothing has been found
+// l:main_list_empty_pane/opt1
+#define qtn_print_no_printers "(No printers)"
+
+// d:Information dialog text that is shown after successful MMC printing
+// d:There is an icon on the upper right corner of the note.
+// l:popup_note_window
+#define qtn_print_mmc_print_note "Images copied to memory card. Memory card may now be used in DPOF printer."
+
+// d:Information dialog text that is shown after after successful MMC printing with one picture
+// d:There is an icon on the upper right corner of the note.
+// l:popup_note_window
+#define qtn_print_mmc_print_note_one_picture "Image copied to memory card. Memory card may now be used in DPOF printer."
+
+// d:Error note that is displayed, when MMC printing is failed.
+// d:There is an icon on the upper right corner of the note.
+// l:popup_note_window
+#define qtn_print_note_mmccopyfail "Copying to memory card failed. Remove data from memory card and try again."
+
+// d:Printing error note
+// d:Error note is displayed when the connection is unexpectedly terminated while the
+// d:printer is printing or somehow connected to a printer. This can be caused by error in link (e.g. Bluetooth connection
+// d:goes out-of-range or USB cable is disconnected) or then a software error happens, data is not transmitted and
+// d:system timeout causes transmission to terminate.
+// l:popup_note_window
+#define qtn_print_disconnect_error "Connection to printer lost"
+
+// d: Obs. This string is also used in Image Print Title pane.
+// d:Application's name on application shell
+// l:list_single_large_graphic_pane_t1
+#define qtn_app_caption_string "Image print"
+
+// NOTE!!!!! THERE IS A SMALL GRAPHIC ANIMATION AT THE END OF THIS LINE
+// d:Title text for device discovery popup list
+// l:heading_pane_t1/opt1
+#define qtn_print_selectprinter_prompt "Select printer"
+
+// d:Text on the device discovery pop-up list
+// l:list_single_large_graphic_pane_t1_cp2/opt1
+#define qtn_print_memory_card "Memory card"
+
+// d:Print command in the "Options" menu of the print view
+// l:list_single_pane_t1_cp2
+#define qtn_print_menu_opt_print "Print"
+
+// d:Exit command in the "Options" menu of the print view
+// l:list_single_pane_t1_cp2
+#define qtn_print_menu_opt_exit "Exit"
+
+// NOTE!!!!! ONLY ONE TEXT LINE ALLOWED
+// d:Text on the print progress dialog
+// l:popup_note_wait_window
+#define qtn_print_progress_prompt "Printing"
+
+// NOTE!!!!! ONLY ONE TEXT LINE ALLOWED
+// d:Text on the print progress dialog when copying files to MMC card
+// l:popup_note_wait_window
+#define qtn_print_progress_prompt_mmc "Copying"
+
+// d:Change command in the "Options" menu of the print settings view
+// l:list_single_pane_t1_cp2
+#define qtn_print_settings_opt_change "Change"
+
+// d:Paper size capability presented in the list box in print settings view
+// l:list_setting_pane_t1
+#define qtn_print_settings_paper_size "Paper size"
+
+// d:Paper size "Automatic" in the print settings view settings value
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_auto "Automatic"
+
+// d:Paper size "US Letter" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_letter "US Letter"
+
+// d:Paper size "A4" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_a4 "A4"
+
+// d:Paper size "A6" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_a6 "A6"
+
+// d:Paper size "4x6" in the print settings view list box / pop-up window
+// d:4x6 means paper size of 4 inches by 6 inches. This needs to be converted
+// d:in country localizations that use metric system
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_4x6 "4x6"
+
+// d:Paper size "5x7" in the print settings view list box / pop-up window
+// d:5x7 means paper size of 5 inches by 7 inches. This needs to be converted
+// d:in country localizations that use metric system
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_5x7 "5x7"
+
+// d:Paper size "Sticker" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_paper_size_sticker "Sticker"
+
+// d:Print quality capability presented in the list box in print settings view
+// l:list_setting_pane_t1
+#define qtn_print_settings_print_quality "Print quality"
+
+// d:Print quality "Automatic" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_quality_auto "Automatic"
+
+// d:Print quality "Normal" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_quality_normal "Normal"
+
+// d:Print quality "Draft" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_quality_draft "Draft"
+
+// d:Print quality "Fine" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_quality_fine "Fine"
+
+// d:Printing error note
+// d:Error note is displayed, when connection over the chosen transmission technology fails,
+// d:e.g. application tries to establish connection to printer over Bluetooth, but it is unable
+// d:to do so.
+// l:popup_note_window
+#define qtn_print_connect_error "Unable to connect to printer"
+
+// d:Printing error note
+// l:popup_note_window
+#define qtn_print_send_error "Unable to send image to printer. Printer may be busy"
+
+// d:Printing error note
+// d:This is a generic error note that is displayed, when no specific error message is available.
+// d:It tells to user that there has been problem during printing and (most probably) the printer
+// d:will cancel its current print job.
+// l:popup_note_window
+#define qtn_print_general_error "Printing error"
+
+// d:Selected printer capability presented in the list box in print settings view
+// l:list_setting_pane_t1
+#define qtn_print_selected_printer "Selected printer"
+
+// d:Default printer "PictBridge" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_settings_default_usb "PictBridge"
+
+// d:Default printer "Bluetooth" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_settings_default_bt "Bluetooth"
+
+// d:Printing information note.
+// d:This note is used to inform the user that one or many files of unsupported type(other than .jpeg) has been
+// d:selected and the application will discard them and continue with the images that are of the supported filetype(.jpeg).
+// l:popup_note_window
+#define qtn_print_wrongtype_note "Filetypes that are not supported will be removed from the selection."
+
+// d:Printing information note.
+// d:This note is used to inform the user that (s)he has selected only images that are not supported
+// d:by the application and has therefore to select new ones to print.
+// d:This often follows the qtn_print_wrongtype_note note.
+// l:popup_note_window/opt2
+#define qtn_print_selectnew_note "Select new images for printing."
+
+// d:Printing information note.
+// d:The purpose of the note is to inform the user that printing is already ongoing
+// d:and it may therefore not be initiated again elsewhere.
+// l:popup_note_window/opt2
+#define qtn_print_concurrent_note "Application already in use."
+
+// d:Text used in the wait note when a hidden discovery is ongoing.
+// l:popup_note_wait_window
+#define qtn_print_progress_prompt_pro "Processing"
+
+// d:Default printer "WLAN printer" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_settings_default_wlan "WLAN printer"
+
+// d:Number of copies pop up prompt.
+// l:list_setting_pane_t1
+#define qtn_print_settings_noc "Number of copies:"
+
+// d:Template capability as settings item in settings view
+// l:list_setting_pane_t1
+#define qtn_print_settings_template "Images per page"
+
+// d:Template 1 per page "1 borderless" in the print settings view list box / pop-up window
+// l:list_set_graphic_pane_t1
+#define qtn_print_settings_bless "1 borderless"
+
+// NOTE!!!!! THERE IS A SMALL GRAPHIC ANIMATION AT THE END OF THIS LINE
+// d:Title text for device discovery popup list
+// l:heading_pane_t1
+#define qtn_print_selectprinter_prompt2 "Searching"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_load_error "Paper not loaded correctly"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_eject_error "Paper not ejected correctly"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_media_error "Media error"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_jam_error "Paper jam"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_combination_error "Paper type/size not supported"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_low_error "Input tray is low on paper"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paper_error "Paper-related error"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_file_decode_error "Unable to decode image file"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_file_error "File-related error"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_ink_waste_error "Waste-ink reservior full"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_ink_error "Ink-related error"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_cover_open_error "Cover open"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_fatal_error "Fatal error"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_servicecall_error "Service call"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_printer_unavailable_error "Printer unavailable"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_printer_busy_error "Printer busy"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_lever_error "Lever position not correct"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_no_marking_agent_error "No marking agent"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_ink_cover_open_error "Ink cover open"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_no_ink_cartridge_error "No ink cartridge"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_hardware_error "Hardware-related error"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_output_area_almost_full_error "Output area is almost full"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_output_area_full_error "Output area is full"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_marker_supply_low_error "Marker supply low"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_marker_supply_empty_error "Marker supply is empty"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_marker_failure_error "Marker device failed"
+
+// d:Printing error note, notifies user that problem occurred while printing
+// l:popup_note_window
+#define qtn_print_paused_error "Printer is paused"
+
+// d:Confirmation query for memory card printing
+// l:popup_note_window
+#define qtn_print_dpof_confirmation_dialog "Existing print job in memory card will be overwritten"
+
+// d:Confirmation query for launching wlan wizard, header
+// l:heading_pane_t1
+#define qtn_launch_wlan_wizard_query_header "WLAN printer"
+
+// d:Confirmation query for launching wlan wizard, message
+// l:popup_note_window
+#define qtn_launch_wlan_wizard_query_msg "Home network access point must be defined. Do you want to start setup wizard to define it?"
+
+// d:Application interworking (AIW) menu command.
+// d:Starts ImagePrint application.
+// l:list_single_popup_submenu_pane_t1
+// r:6.2
+#define qtn_aiw_command_print "Print"
+
+// d: Text when there is no printer selected in settings view
+// l: list_set_graphic_pane_t1
+// r: 6.2
+#define qtn_print_no_printer "No printer"
+
+// d:Navi pane text when multiple images are selected to print.
+// d:Or when one image is selected to print multiple times (number of copies is greater than 1).
+// d:%N contains the number of the selected images/copies of one image.
+// d:E.g. '17 images', '2 images', '67 images'
+// d:Maximum number of images is 999, so maximum length of %N is 3 characters ('999 images').
+// l:navi_navi_text_pane_t1
+// r:6.2
+#define qtn_printjob_images "%N images"
+
+// d:Navi pane text when only one image and one copy of it is selected to print.
+// l:navi_navi_text_pane_t1
+// r:6.2
+#define qtn_printjob_image "1 image"
+
+CHARACTER_SET UTF8
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/caiwmode.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+#include "caiwmode.h"
+#include "muimodeobserver.h"
+#include "muimode.h"
+#include "mprintsettings.h"
+#include "cuiprotocolcontroller.h"
+#include "ciffactory.h"
+#include "mdiscoveryobserver.h"
+
+CAiwMode* CAiwMode::NewL( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory )
+ {
+ CAiwMode* self = NewLC( aUIModeObserver, aIFFactory );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CAiwMode* CAiwMode::NewLC( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory )
+ {
+ CAiwMode* self = new ( ELeave ) CAiwMode( aUIModeObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL( aIFFactory );
+ return self;
+ }
+
+// Default constructor
+CAiwMode::CAiwMode( MUIModeObserver* aUIModeObserver )
+ {
+ iUIModeObserver = aUIModeObserver;
+ }
+
+// 2nd phase constructor
+void CAiwMode::ConstructL( CIFFactory& aIFFactory )
+ {
+ iIFFactory = &aIFFactory;
+ iUIProtocolController = CUIProtocolController::NewL( this, aIFFactory );
+ }
+
+// Destructor
+CAiwMode::~CAiwMode()
+ {
+ delete iUIProtocolController;
+ }
+
+void CAiwMode::SearchDefaultPrinterL()
+ {
+ iUIProtocolController->SearchDefaultPrinterL();
+ iUIModeObserver->ChangeViewL( MUIModeObserver::SettingsView );
+ }
+
+TBool CAiwMode::ChangeDefaultPrinterL( TInt aProtocol )
+ {
+ TBool printerFound = iUIProtocolController->
+ ChangeDefaultPrinterL( aProtocol );
+
+ return printerFound;
+ }
+
+void CAiwMode::UsbCableDisconnected()
+ {
+ if ( iIFFactory->SettingsIF()->GetCurrentPrinterProtocol() ==
+ MDiscoveryObserver::EUSB )
+ {
+ iUIModeObserver->ExitApplication();
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cidlemode.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+#include "cidlemode.h"
+#include "muimodeobserver.h"
+#include "muimode.h"
+#include "mprintsettings.h"
+#include "cuiprotocolcontroller.h"
+#include "ciffactory.h"
+#include "mdiscoveryobserver.h"
+#include "clog.h"
+
+CIdleMode* CIdleMode::NewL( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory )
+ {
+ CIdleMode* self = NewLC( aUIModeObserver, aIFFactory );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CIdleMode* CIdleMode::NewLC( MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory )
+ {
+ CIdleMode* self = new ( ELeave ) CIdleMode( aUIModeObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL( aIFFactory );
+ return self;
+ }
+
+// Default constructor
+CIdleMode::CIdleMode( MUIModeObserver* aUIModeObserver )
+ {
+ iUIModeObserver = aUIModeObserver;
+ }
+
+// 2nd phase constructor
+void CIdleMode::ConstructL( CIFFactory& aIFFactory )
+ {
+ iIFFactory = &aIFFactory;
+ iUIProtocolController = CUIProtocolController::NewL( this, aIFFactory );
+ }
+
+// Destructor
+CIdleMode::~CIdleMode()
+ {
+ delete iUIProtocolController;
+ }
+
+void CIdleMode::SearchDefaultPrinterL()
+ {
+ LOG("void CIdleMode::SearchDefaultPrinterL() START");
+ TBool printerFound = iUIProtocolController->SearchDefaultPrinterL();
+ // If printer was found change to settings view
+ if( printerFound )
+ {
+ LOG("void CIdleMode::SearchDefaultPrinterL() Printer found");
+ iUIModeObserver->ChangeViewL( MUIModeObserver::SettingsView );
+ }
+ // Printer was not found or discovery cancelled
+ else
+ {
+ LOG("void CIdleMode::SearchDefaultPrinterL() Printer not found");
+ iUIModeObserver->ChangeViewL( MUIModeObserver::SettingsView );
+ }
+ LOG("void CIdleMode::SearchDefaultPrinterL() END");
+ }
+
+TBool CIdleMode::ChangeDefaultPrinterL( TInt aProtocol )
+ {
+ TBool printerFound = iUIProtocolController->
+ ChangeDefaultPrinterL( aProtocol );
+
+ return printerFound;
+ }
+
+
+void CIdleMode::UsbCableDisconnected()
+ {
+ if ( iIFFactory->SettingsIF()->GetCurrentPrinterProtocol() ==
+ MDiscoveryObserver::EUSB )
+ {
+ // No leaving function. Ignore leave.
+ TRAP_IGNORE( iUIModeObserver->ChangeViewL( MUIModeObserver::ImageSelectionView ));
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintapp.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* 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:
+*
+*/
+
+
+#include <eikstart.h>
+#include "cimageprintapp.h"
+#include "cimageprintdoc.h"
+
+LOCAL_C CApaApplication* NewApplication()
+ {
+ return new CImagePrintApp;
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ return EikStart::RunApplication(NewApplication);
+ }
+
+TUid CImagePrintApp::AppDllUid() const
+ {
+ return KUidImagePrint;
+ }
+
+CApaDocument* CImagePrintApp::CreateDocumentL()
+ {
+ return CImagePrintDoc::NewL( *this );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintappui.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,550 @@
+/*
+* 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:
+*
+*/
+
+
+#include <imageprintapp.rsg>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <aknstaticnotedialog.h>
+#include <MGFetch.h>
+#include <eikspane.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <imageconversion.h>
+#include <StringLoader.h>
+#include <avkon.hrh>
+#include <bautils.h>
+#include <hlplch.h>
+#include <e32std.h>
+#include <coehelp.h>
+#include <hal.h>
+#include <apgcli.h>
+#include <s32file.h>
+#include <AiwGenericParam.h>
+#include <e32property.h>
+#include <featmgr.h>
+#include <caf/content.h>
+
+#include "cimageprintappui.h"
+#include "imageprint.h"
+#include "cimageprintsettingsview.h"
+#include "cimgpviewemptyview.h"
+#include "cdiscoverydlgmanager.h"
+#include "cimageprintdoc.h"
+#include "printapputil.h"
+#include "imageprintapp.hrh"
+#include "mprintsettings.h"
+#include "cimgpprintdlgmanager.h"
+#include "clog.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "mdiscovery.h"
+#include "cimgpprintutils.h"
+#include "uimodefactory.h"
+#include "muimode.h"
+#include "muimodeobserver.h"
+#include "caiwprintpreviewprovider.h"
+
+using namespace ContentAccess;
+
+_LIT( KEngineRsc, "imageprintengine.rsc" );
+_LIT8( KJpegFileType, "image/jpeg" );
+
+// For navipane changes
+_LIT( KLine, " - " );
+const TInt KLineLength(3);
+const TInt32 KUid (0x101FFA84);
+
+// Second class constructor
+void CImagePrintAppUi::ConstructL()
+ {
+ LOG("CImagePrintAppUi::ConstructL BEGIN");
+
+ BaseConstructL( EAknEnableSkin | EAppOrientationAutomatic | EAknEnableMSK );
+
+ FeatureManager::InitializeLibL();
+
+ // get the best matching resource for the current locale
+ TFileName file(NULL);
+
+ file.Append( KDC_RESOURCE_FILES_DIR );
+ file.Append( KEngineRsc );
+ BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), file );
+ iResourceOffset = iEikonEnv->AddResourceFileL( file );
+
+ iDoc = static_cast<CImagePrintDoc*>( CAknAppUi::Document() );
+
+ TRAPD( err, iDoc->InitializeEngineL() );
+ if ( err == KErrInUse )
+ {
+ LOG("Too many connections. Exiting...");
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_CONCURRENT_NOTE );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ Exit();
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+
+ if ( iDoc->Engine()->InterfaceFactory().IsApplicationAlreadyInUse() )
+ {
+ LOG("Too many connections. Exiting...");
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_CONCURRENT_NOTE );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ Exit();
+ }
+
+ iAiwState = ENotAiwCall;
+ TInt r = iAiwCall.Attach(KPrintPropertyCat,EPrintProperty,EOwnerProcess);
+ if (r == KErrNone)
+ {
+ iAiwCall.Get(KPrintPropertyCat,EPrintProperty,iAiwState);
+ }
+
+ TBool aiw = EFalse;
+ if ( iAiwState == EAiwPrintCall )
+ {
+ // Set the aiw call RProperty key back to default value so that
+ // if application for some reason crashes the value is not left for AIW mode.
+ iAiwCall.Set( KPrintPropertyCat,EPrintProperty, ENotAiwCall );
+ SetImageArrayL(GetImagesFromAiwProviderL());
+ aiw = ETrue;
+ }
+
+
+ iUIMode = UIModeFactory::CreateL( aiw, this, iDoc->Engine()->InterfaceFactory() );
+
+ LOG("CImagePrintAppUi::ConstructL CImagePrintSettingsView");
+ CImagePrintSettingsView* settingsView = CImagePrintSettingsView::NewL(
+ iDoc->PrintSettings(), iDoc->PrintJob(), this, iUIMode );
+ CleanupStack::PushL( settingsView );
+ AddViewL( settingsView );
+ CleanupStack::Pop( settingsView );
+
+ LOG("CImagePrintAppUi::ConstructL CIMGPViewEmptyView");
+ CIMGPViewEmptyView* emptyView = CIMGPViewEmptyView::NewL();
+ CleanupStack::PushL( emptyView );
+ AddViewL( emptyView );
+ CleanupStack::Pop( emptyView);
+
+ SetDefaultViewL( *emptyView );
+ // default printer search in aiw mode must be done via
+ // CIdle callback for UI to construct itself properly
+ iIdleSearch = CIdle::NewL( CActive::EPriorityStandard );
+ iIdleSearch->Start( TCallBack( SearchDefaultPrinterCbL, this ));
+
+ // Default value for printer UID before printer is selected.
+ iPrinterUID = -1;
+
+ iCoeEnv->RootWin().EnableScreenChangeEvents();
+
+ iApplicationStarting = ETrue;
+ iAlbumCall = KErrNotFound;
+ LOG("CImagePrintAppUi::ConstructL END");
+ }
+
+// aiw search callback
+TInt CImagePrintAppUi::SearchDefaultPrinterCbL( TAny* aObj )
+ {
+ LOG("CImagePrintAppUi::SearchDefaultPrinterCbL begin");
+ CImagePrintAppUi* obj = static_cast<CImagePrintAppUi*>( aObj );
+ TRAPD( err, obj->iUIMode->SearchDefaultPrinterL() );
+ if ( err != KErrNone )
+ {
+ LOG1( "CImagePrintAppUi::SearchDefaultPrinterCbL search failed, err: %d", err );
+
+ if ( err == KErrDisconnected )
+ {
+ HBufC* buf = StringLoader::LoadLC( R_NOTE_DISCONNECT_PRINT_ERROR );
+ CAknErrorNote* errornote = new CAknErrorNote( ETrue );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+ // Closes program
+ obj->Exit();
+ }
+ LOG("CImagePrintAppUi::SearchDefaultPrinterCbL end");
+ return EFalse;
+ }
+
+// Destructor
+CImagePrintAppUi::~CImagePrintAppUi()
+ {
+ FeatureManager::UnInitializeLib();
+ delete iNaviDecorator;
+
+ iEikonEnv->DeleteResourceFile( iResourceOffset );
+ delete iPrintDlgManager;
+ delete iUSBConnectionWaitNote;
+
+ if( iIdleSearch )
+ {
+ iIdleSearch->Cancel();
+ }
+
+ delete iUIMode;
+ delete iIdleSearch;
+
+ iAiwCall.Close();
+ }
+
+// Handles global user events
+void CImagePrintAppUi::HandleCommandL(
+ TInt aCommand )
+ {
+ LOG1( "CImagePrintAppUi::HandleCommandL BEGIN: %d", aCommand );
+ switch ( aCommand )
+ {
+ case EAknCmdExit:
+ case EAknSoftkeyExit:
+ {
+ Exit();
+ break;
+ }
+ case EEikCmdExit:
+ {
+ // Cancel current printjob because this command may have come from MMC removal
+ // cancelling may fail in engine if mmc writing was in critical point, so TRAP
+ TRAP_IGNORE( iDoc->PrintJob()->CancelL() );
+ if ( iAiwState == EAiwPrintCall )
+ {
+ User::Exit( EAiwPrintCall );
+ }
+ else
+ {
+ Exit();
+ }
+ break;
+ }
+
+ case EAknSoftkeyBack:
+ {
+ break;
+ }
+
+ case ESelectMarked:
+ {
+ if( iValidImages )
+ {
+ iUIMode->SearchDefaultPrinterL();
+ }
+ else
+ {
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_SELECTNEW_NOTE );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ LOG( "CImagePrintAppUi::HandleCommandL END" );
+ }
+
+void CImagePrintAppUi::LaunchHelpApplicationL( const TDesC& aHelpText )
+ {
+ CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( 1 );
+ CleanupStack::PushL( cntx );
+
+ //make uid
+ TUid uid;
+ uid.iUid = ( KUid );
+
+ cntx->AppendL( TCoeHelpContext( uid, aHelpText ) );
+ CleanupStack::Pop( cntx );
+
+ //and launch help - takes ownership of context array
+ HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), cntx );
+ }
+
+// Set the image array
+void CImagePrintAppUi::SetImageArrayL( CDesCArrayFlat* aFileArray )
+ {
+ iFiles = aFileArray;
+
+ // Sets default navipane text with no copies.
+ SetNavipaneTextL( 1 );
+
+ iDoc->SetImageArrayL( aFileArray );
+ }
+
+// Get the image array
+CDesCArrayFlat* CImagePrintAppUi::GetImageArray()
+ {
+ return iFiles;
+ }
+
+// Get the document class
+CImagePrintDoc* CImagePrintAppUi::GetDocument()
+ {
+ return iDoc;
+ }
+
+TInt CImagePrintAppUi::GetAlbumCall()
+ {
+ return iAlbumCall;
+ }
+
+void CImagePrintAppUi::SetAlbumCall(TInt aAlbumCall)
+ {
+ iAlbumCall = aAlbumCall;
+ }
+
+void CImagePrintAppUi::SetValidImagesStatus( TBool aStatus )
+ {
+ iValidImages = aStatus;
+ }
+
+void CImagePrintAppUi::ChangeViewL( TInt aView )
+ {
+ switch( aView )
+ {
+ case MUIModeObserver::SettingsView:
+ {
+ ActivateLocalViewL( KImageSettingsViewId );
+ break;
+ }
+ }
+ }
+
+void CImagePrintAppUi::ExitApplication()
+ {
+ Exit();
+ }
+
+
+TInt CImagePrintAppUi::GetAiwState()
+ {
+ return iAiwState;
+ }
+
+TBool CImagePrintAppUi::AiwState()
+ {
+ TBool retValue = EFalse;
+ if( iAiwState == EAiwPrintCall )
+ {
+ retValue = ETrue;
+ }
+ return retValue;
+ }
+
+
+// Files from AIW customer
+CDesCArrayFlat* CImagePrintAppUi::GetImagesFromAiwProviderL()
+ {
+ LOG("TBool CImagePrintAppUi::GetImagesFromAiwProvider() BEGIN");
+
+ RFs fileServer;
+ User::LeaveIfError(fileServer.Connect());
+ CleanupClosePushL( fileServer );
+ RFileReadStream readStream;
+
+ TFileName paramFile;
+ CIMGPPrintUtils::GetDataFilePathL( paramFile );
+
+ User::LeaveIfError( readStream.Open(fileServer, paramFile, EFileRead) );
+ readStream.PushL();
+ CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(readStream);
+
+ CDesCArrayFlat* imageFiles = new (ELeave) CDesCArrayFlat(5);
+
+ TBool noOtherFileTypes( EFalse );
+ TBool showFilesremovedNote ( EFalse );
+
+ TInt index( 0 );
+ const TAiwGenericParam* param = paramList->FindFirst(index,
+ EGenericParamFile,
+ EVariantTypeDesC);
+ while ( index != KErrNotFound )
+ {
+ TFileName filename( param->Value().AsDes() );
+ // CheckMIMEType needs to be changed so that we can distinguish between
+ // a) file not found b) file was incorrect MIME-type
+ noOtherFileTypes = CIMGPPrintUtils::CheckMIMEType( KJpegFileType, filename );
+ if ( noOtherFileTypes )
+ {
+ // check drm protection
+ CContent* content = NULL;
+ content = CContent::NewLC( filename );
+
+ TInt isDrmProtected( 0 );
+ TInt err = content->GetAttribute( EIsProtected, isDrmProtected );
+ CleanupStack::PopAndDestroy(); // content
+ if ( err || isDrmProtected )
+ {
+ LOG("CImagePrintAppUi::GetImagesFromAiwProvider(): found drm file!");
+ noOtherFileTypes = EFalse;
+ }
+ }
+
+ if ( noOtherFileTypes )
+ {
+ imageFiles->AppendL( filename );
+ }
+ else
+ {
+ showFilesremovedNote = ETrue;
+ }
+
+ param = paramList->FindNext(index,
+ EGenericParamFile,
+ EVariantTypeDesC);
+ }
+
+ if ( showFilesremovedNote )
+ {
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_WRONGTYPE_NOTE );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+ // If only one image is selected to print and it's corrupted, exit from application.
+ if ( showFilesremovedNote && ( imageFiles->Count() == KErrNone ))
+ {
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_SELECTNEW_NOTE );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ Exit();
+ }
+
+ CleanupStack::PopAndDestroy(paramList); //paramList
+
+ LOG("TBool CImagePrintAppUi::GetImagesFromAiwProvider() END");
+
+ readStream.Close();
+ readStream.Pop();
+ CleanupStack::PopAndDestroy( &fileServer );
+ return imageFiles;
+ }
+
+TBool CImagePrintAppUi::OrientationPortrait()
+ {
+ TBool retValue = ETrue;
+ TSize screenSize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+ if( screenSize.iWidth == 416 ||
+ screenSize.iWidth == 320 )
+ {
+ retValue = EFalse;
+ }
+ return retValue;
+ }
+
+TBool CImagePrintAppUi::QVGAMode()
+ {
+ TBool retValue = EFalse;
+ TSize screenSize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+ if( screenSize.iWidth == 240 ||
+ screenSize.iWidth == 320 )
+ {
+ retValue = ETrue;
+ }
+ return retValue;
+ }
+
+// Sets NaviPane text
+void CImagePrintAppUi::SetNavipaneTextL( const TInt aCopiesOfImage, HBufC* aPaperSize )
+ {
+ // Navipane image count will be sum of all images on current print job.
+ // E.g. If 2 images selected and copies value is 2, navi value will be: 2 x 2 = 4.
+ TInt printCount = aCopiesOfImage * ( iFiles->MdcaCount() );
+
+ // Buffer to store image or images -string.
+ HBufC* naviText;
+
+ // If only one image to print navipane text will be: Image
+ if ( printCount == 1 )
+ {
+ naviText = StringLoader::LoadLC( R_PRINTJOB_IMAGE );
+ }
+ // If more than one image to print navipane text will be: Images
+ else
+ {
+ naviText = StringLoader::LoadLC( R_PRINTJOB_IMAGES, printCount );
+ }
+
+ TInt strLength = naviText->Length();
+
+ CEikStatusPane* sp =
+ iEikonEnv->AppUiFactory()->StatusPane();
+ CAknNavigationControlContainer* np =
+ static_cast<CAknNavigationControlContainer*>(
+ sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+ delete iNaviDecorator;
+ iNaviDecorator = NULL;
+
+ // If paper size needs to be added to the NaviPane, more space is needed
+ if( aPaperSize )
+ {
+ strLength += aPaperSize->Length() + KLineLength;
+ }
+ // Clear the printer name string from all formatting tabs & numbers
+ HBufC* stringholder = HBufC::NewLC( strLength );
+ *stringholder = *naviText;
+ TPtr ptr = stringholder->Des();
+ TInt pos = stringholder->Find( KTabChar );
+ if ( pos == 1 ) // 1st possible icon formatting tab is at pos 1
+ {
+ ptr.Delete( 0, 2 ); // delete the first icon tab and the number previous to it
+ pos = stringholder->Find( KTabChar );
+ }
+ // 2nd possible iconformatting tab is 2nd last char (len - 2), don't delete it here
+ while ( pos != KErrNotFound &&
+ pos != stringholder->Length() - 2 )
+ {
+ ptr.Delete( pos, 1); // delete all middle tabs
+ pos = stringholder->Find( KTabChar );
+ }
+ // 2nd possible iconformatting tab is 2nd last char
+ if ( pos != KErrNotFound &&
+ pos == stringholder->Length() - 2 )
+ {
+ // delete the 2nd icon formatting tab and the number next to it
+ ptr.Delete( stringholder->Length() - 2, 2 );
+ }
+
+ // Add paper size and '-', in the beginning of the text
+ if( aPaperSize )
+ {
+ TPtr ptr2 = aPaperSize->Des();
+ ptr.Insert(0, KLine);
+ ptr.Insert(0, ptr2);
+ }
+
+ iNaviDecorator = np->CreateNavigationLabelL( *stringholder );
+ CleanupStack::PopAndDestroy( stringholder );
+ np->PushL( *iNaviDecorator );
+ sp->DrawNow();
+
+ CleanupStack::PopAndDestroy( naviText );
+ }
+
+TUid CImagePrintAppUi::GetSettingsViewUid()
+ {
+ return KImageSettingsViewId;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintblankcontainer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,111 @@
+/*
+* 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:
+*
+*/
+
+
+#include <imageprintapp.rsg>
+#include <e32keys.h>
+#include <aknViewAppUi.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <AknsConstants.h>
+#include <AknsListBoxBackgroundControlContext.h>
+
+#include "cimageprintblankcontainer.h"
+#include "imageprintapp.hrh"
+#include "imageprintconsts.h"
+
+CImagePrintBlankContainer* CImagePrintBlankContainer::NewL(
+ TRect& aRect )
+ {
+ CImagePrintBlankContainer* self = NewLC( aRect );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CImagePrintBlankContainer* CImagePrintBlankContainer::NewLC(
+ TRect& aRect )
+ {
+ CImagePrintBlankContainer* self = new ( ELeave ) CImagePrintBlankContainer();
+ CleanupStack::PushL( self );
+ self->ConstructL( aRect );
+ return self;
+ }
+
+// Default constructor
+CImagePrintBlankContainer::CImagePrintBlankContainer()
+ {
+ }
+
+// 2nd phase constructor
+void CImagePrintBlankContainer::ConstructL(
+ const TRect& aRect )
+ {
+ CreateWindowL();
+ SetRect( aRect );
+
+ // Fetch the dimensions of the screen
+ TScreenInfoV01 info;
+ TPckgBuf<TScreenInfoV01> buf( info );
+ UserSvr::ScreenInfo( buf );
+ info = buf();
+ TRect screenRect( TPoint( 0, 0 ), info.iScreenSize );
+
+ // Create skin control context for filling the background
+ const TAknsItemID *id = &KAknsIIDNone;
+ iSkinControlContext =
+ CAknsListBoxBackgroundControlContext::NewL(
+ KAknsIIDSkinBmpMainPaneUsual, screenRect, ETrue, *id, screenRect );
+
+ ActivateL();
+ }
+
+// Destructor
+CImagePrintBlankContainer::~CImagePrintBlankContainer()
+ {
+ delete iSkinControlContext;
+ }
+
+// Draw method
+void CImagePrintBlankContainer::Draw(
+ const TRect& /*aRect*/ ) const
+ {
+ CWindowGc& gc = SystemGc();
+
+ TRect rect = Rect();
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ if ( AknsDrawUtils::HasBitmapBackground( skin, iSkinControlContext ) )
+ {
+ // Draw skin background
+ AknsDrawUtils::Background( skin, iSkinControlContext, NULL, gc, rect );
+ }
+ else
+ {
+ gc.Clear( rect );
+ }
+ }
+
+void CImagePrintBlankContainer::HandleResourceChange( TInt aType )
+ {
+ if( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ CEikAppUi* appUi = static_cast<CEikAppUi*>( iEikonEnv->AppUi() );
+ TRect rect = appUi->ClientRect();
+ SetRect( rect );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintdoc.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,96 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cimageprintdoc.h"
+#include "cimageprintappui.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+
+CImagePrintDoc::CImagePrintDoc(
+ CEikApplication& aApp )
+ : CAknDocument(aApp)
+ {
+ }
+
+// DESTRUCTION
+CImagePrintDoc::~CImagePrintDoc()
+ {
+ delete iEngine;
+ }
+
+// default constructor
+void CImagePrintDoc::InitializeEngineL()
+ {
+ iEngine = CImagePrintEngine::NewL( 0 );
+ }
+
+// Two-phased constructor.
+CImagePrintDoc* CImagePrintDoc::NewL(
+ CEikApplication& aApp )
+ {
+ CImagePrintDoc* self = new (ELeave) CImagePrintDoc( aApp );
+ return self;
+ }
+
+// METHODS
+
+//Creates AppUi class for application
+CEikAppUi* CImagePrintDoc::CreateAppUiL()
+ {
+ return new (ELeave) CImagePrintAppUi;
+ }
+
+// Returns pointer to engine
+CImagePrintEngine* CImagePrintDoc::Engine()
+ {
+ return iEngine;
+ }
+
+// Returns discovery interface
+MDiscovery* CImagePrintDoc::Discovery()
+ {
+ return iEngine->InterfaceFactory().DiscoveryIF();
+ }
+
+// Returns print job interface
+MPrintJob* CImagePrintDoc::PrintJob()
+ {
+ return iEngine->InterfaceFactory().PrintJobIF();
+ }
+
+
+// Returns print settings interface
+MPrintSettings* CImagePrintDoc::PrintSettings()
+ {
+ return iEngine->InterfaceFactory().SettingsIF();
+ }
+
+// Set selected images to engine.
+void CImagePrintDoc::SetImageArrayL(
+ CDesCArrayFlat* aArray )
+ {
+ iEngine->SetImageArrayL( aArray );
+ }
+
+// Restarts Image Print engine
+void CImagePrintDoc::RestartEngine()
+ {
+ iEngine->RestartEngine();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintsettingscontainer.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,193 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32keys.h>
+#include <aknViewAppUi.h>
+#include <coemop.h>
+#include <aknnavi.h>
+#include <aknstaticnotedialog.h>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <AknDef.h>
+#include <imageprintapp.rsg>
+
+#include "cimageprintsettingscontainer.h"
+#include "imageprintapp.hrh"
+#include "cpropertiesboxmodel.h"
+#include "cimageprintappui.h"
+#include "imageprint.h"
+#include "cimageprintdoc.h"
+#include "cdiscoverydlgmanager.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "clog.h"
+#include "printapputil.h"
+#include "midleprinteventregisterif.h"
+#include "cimgpprintutils.h"
+#include "muimode.h"
+
+// CONSTRUCTION
+CImagePrintSettingsContainer* CImagePrintSettingsContainer::NewL(
+ MPrintSettings* aSettings,
+ MObjectProvider* aProvider,
+ TRect aClientRect,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode )
+ {
+ CImagePrintSettingsContainer* self =
+ new ( ELeave ) CImagePrintSettingsContainer( aSettings, aAppUi, aUIMode );
+ CleanupStack::PushL( self );
+ self->ConstructL( aProvider, aClientRect );
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// Default constructor
+CImagePrintSettingsContainer::CImagePrintSettingsContainer(
+ MPrintSettings* aSettings,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode ) :
+ iPrintSettings( aSettings ),
+ iAppUi( aAppUi ),
+ iUIMode( aUIMode )
+ {
+ }
+
+// 2nd phase constructor
+void CImagePrintSettingsContainer::ConstructL(
+ MObjectProvider* aProvider,
+ const TRect& aRect )
+ {
+ // Create a window for this application view
+ SetMopParent( aProvider );
+ CreateWindowL();
+ CImagePrintDoc* doc = static_cast<CImagePrintDoc*>( iAppUi->Document() );
+ iModel = CPropertiesBoxModel::NewL( *( doc->Engine() ), iPrintSettings, this );
+
+ // Initialize list box outlook
+ iListBox = new ( ELeave ) CAknSettingStyleListBox;
+ iListBox->SetContainerWindowL( *this );
+ iListBox->ConstructL( this, EAknListBoxSelectionList );
+ iListBox->CreateScrollBarFrameL( ETrue );
+ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+ iEikonEnv->EikAppUi()->AddToStackL( iListBox );
+
+ // Set the model & observer
+ iListBox->SetListBoxObserver( iModel );
+ iListBox->Model()->SetItemTextArray( iModel );
+ // List box won't delete model, the Controller object will take care of it
+ iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ // Set the windows size
+ SetRect( aRect );
+ iListBox->SetSize( iListBox->MinimumSize() );
+
+ // Activate the window, which makes it ready to be drawn
+ ActivateL();
+ }
+
+// Destructor
+CImagePrintSettingsContainer::~CImagePrintSettingsContainer()
+ {
+ if ( iUSBConnectionWaitNote )
+ {
+ delete iUSBConnectionWaitNote;
+ }
+ iEikonEnv->EikAppUi()->RemoveFromStack( iListBox );
+ delete iListBox;
+ delete iModel;
+ }
+
+
+// Return the amount of compound controls
+TInt CImagePrintSettingsContainer::CountComponentControls() const
+ {
+ return 1;
+ }
+
+// Gets the specified component of a compound control.
+CCoeControl* CImagePrintSettingsContainer::ComponentControl(
+ TInt aIndex ) const
+ {
+ CCoeControl* cntrl = 0;
+
+ if ( aIndex == 0 )
+ {
+ cntrl = iListBox;
+ }
+
+ return cntrl;
+ }
+
+// Draws the empty view
+void CImagePrintSettingsContainer::Draw(
+ const TRect& /*aRect*/ ) const
+ {
+ CWindowGc& gc = SystemGc();
+ gc.Clear();
+ }
+
+// Starts editing the active item
+void CImagePrintSettingsContainer::EditItemL()
+ {
+ iModel->HandleListBoxEventL( iListBox,
+ MEikListBoxObserver::EEventEnterKeyPressed );
+
+ ChangeStatusPaneTextL( iModel->NumberOfCopies() );
+ }
+
+void CImagePrintSettingsContainer::DoDiscoveryL( TInt aProtocol, TBool /*aHidden*/ )
+ {
+ TBool ret = iUIMode->ChangeDefaultPrinterL( aProtocol );
+ }
+
+void CImagePrintSettingsContainer::ChangeStatusPaneTextL( const TInt aCopiesOfImage )
+ {
+ iAppUi->SetNavipaneTextL( aCopiesOfImage );
+ }
+
+void CImagePrintSettingsContainer::UpdateListBox()
+ {
+ iListBox->SizeChanged();
+ }
+
+void CImagePrintSettingsContainer::UpdateListSize( TRect /*aRect*/ )
+ {
+ iListBox->SetSize( iListBox->MinimumSize() );
+ }
+
+void CImagePrintSettingsContainer::SizeChanged()
+ {
+ iListBox->SetSize( iListBox->MinimumSize() );
+ }
+
+void CImagePrintSettingsContainer::HandleResourceChange( TInt aType )
+ {
+ CCoeControl::HandleResourceChange( aType );
+ if( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ TRect rect = iAppUi->ClientRect();
+ SetRect( rect );
+ UpdateListSize( rect );
+ DrawNow();
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintsettingsview.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,265 @@
+/*
+* 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:
+*
+*/
+
+
+#include <aknViewAppUi.h>
+#include <aknnavi.h>
+#include <akntitle.h>
+#include <avkon.hrh>
+#include <imageprintapp.rsg>
+#include <eikmenup.h>
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <wlaninternalpskeys.h>
+#include <e32property.h>
+
+#include "cimageprintsettingsview.h"
+#include "cimageprintsettingscontainer.h"
+#include "cimageprintsettingsview.h"
+#include "cimageprintappui.h"
+#include "cimageprintdoc.h"
+#include "cimgpprintdlgmanager.h"
+#include "mprintsettings.h"
+#include "mprintjob.h"
+#include "imageprintapp.hrh"
+#include "cimageprintengine.h"
+#include "muimode.h"
+#include "ciffactory.h"
+#include "mdiscoveryobserver.h"
+
+_LIT( KImagePrintAppHelpSettings, "IMGPRNAPP_HLP_SETTINGS" );
+
+// CONSTRUCTION
+CImagePrintSettingsView* CImagePrintSettingsView::NewL(
+ MPrintSettings* aSettings,
+ MPrintJob* aPrintJob,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode )
+ {
+ CImagePrintSettingsView* self = CImagePrintSettingsView::NewLC(
+ aSettings, aPrintJob, aAppUi, aUIMode );
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+CImagePrintSettingsView* CImagePrintSettingsView::NewLC(
+ MPrintSettings* aSettings,
+ MPrintJob* aPrintJob,
+ CImagePrintAppUi* aAppUi,
+ MUIMode* aUIMode )
+ {
+ CImagePrintSettingsView* self =
+ new ( ELeave ) CImagePrintSettingsView( aPrintJob, aAppUi, aUIMode );
+ CleanupStack::PushL( self );
+ self->ConstructL( aSettings);
+
+ return self;
+ }
+
+// 2nd phase constructor
+void CImagePrintSettingsView::ConstructL(
+ MPrintSettings* aSettings )
+ {
+
+ iSettings = aSettings;
+ TUint vendor = iSettings->GetCurrentPrinterVendor();
+ iPrintDlgManager = CIMGPPrintDlgManager::NewL( 1,
+ iPrintJob, aSettings->NumOfPagesL(),
+ aSettings->IsMMC(), vendor );
+ BaseConstructL( R_SETTINGS_VIEW );
+ }
+
+// Default constructor
+CImagePrintSettingsView::CImagePrintSettingsView(
+ MPrintJob* aPrintJob, CImagePrintAppUi* aAppUi, MUIMode* aUIMode )
+ : CAknView(),
+ iPrintJob( aPrintJob ),
+ iAppUi( aAppUi ),
+ iUIMode(aUIMode)
+ {
+ }
+
+// Default destructor
+CImagePrintSettingsView::~CImagePrintSettingsView()
+ {
+ delete iPrintDlgManager;
+ DestroyContainer();
+ }
+
+// Returns IDs
+TUid CImagePrintSettingsView::Id() const
+ {
+ return KImageSettingsViewId;
+ }
+
+// Handles commands coming to this viwe
+void CImagePrintSettingsView::HandleCommandL(
+ TInt aCommand )
+ {
+ switch ( aCommand )
+ {
+ case ESettingsChangeItem:
+ {
+ iContainer->EditItemL();
+ break;
+ }
+
+ case ESettingsPrint:
+ {
+ StartPrintingL();
+ break;
+ }
+
+ case ESettingsExit:
+ {
+ // Exit caller also
+ AppUi()->HandleCommandL( EEikCmdExit );
+ break;
+ }
+
+ case EAknSoftkeyBack:
+ {
+ // Exit to gallery
+ AppUi()->HandleCommandL( EAknCmdExit );
+ break;
+ }
+
+ case ECmdPrintHelp:
+ {
+ iAppUi->LaunchHelpApplicationL( KImagePrintAppHelpSettings );
+ break;
+ }
+
+ default:
+ AppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+
+// Activates the view, creates the control container
+void CImagePrintSettingsView::DoActivateL(
+ const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/)
+ {
+ // Change the status pane text
+ CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+ sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+ CAknTitlePane* tp = static_cast<CAknTitlePane*>(
+ sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+ tp->SetTextL( iEikonEnv->AllocReadResourceLC(
+ R_TXT_IMAGEPRINT_TITLE_PRINTSETTINGS )->Des() );
+ CleanupStack::PopAndDestroy(); // tp
+ sp->DrawNow();
+
+ if ( !iContainer )
+ {
+ iContainer = CImagePrintSettingsContainer::NewL(
+ iSettings, this, AppUi()->ClientRect(), iAppUi, iUIMode );
+ AppUi()->AddToStackL( *this, iContainer );
+ }
+ }
+
+// Deactivates view, deletes the control
+void CImagePrintSettingsView::DoDeactivate()
+ {
+ DestroyContainer();
+ }
+
+// Destroys control container
+void CImagePrintSettingsView::DestroyContainer()
+ {
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+ }
+
+ delete iContainer;
+ iContainer = 0;
+ }
+
+// Starts the printing sequence
+void CImagePrintSettingsView::StartPrintingL()
+ {
+
+ // First of all check that WLAN is on, in case WLAN is current printing protocol.
+ if ( iSettings->GetCurrentPrinterProtocol() == MDiscoveryObserver::EWLAN )
+ {
+ HandlePossibleLinkDisconnectionL();
+ }
+
+ TUint vendor = iSettings->GetCurrentPrinterVendor();
+
+ // Default number of copies value = 1, so keep it, if iSettings doesn't return deviant value.
+ TInt copiesBuffer = 1;
+ iSettings->NumberOfCopies( copiesBuffer, 0 );
+
+ delete iPrintDlgManager;
+ iPrintDlgManager = 0;
+ iPrintDlgManager = CIMGPPrintDlgManager::NewL( copiesBuffer,
+ iPrintJob, iSettings->NumOfPagesL(),
+ iSettings->IsMMC(), vendor );
+
+ CIFFactory& factory = iAppUi->GetDocument()->Engine()->InterfaceFactory();
+ factory.SettingsIF()->UpdateNumberOfCopiesToServer();
+
+ iPrintDlgManager->StartPrintingL();
+ }
+
+void CImagePrintSettingsView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
+ {
+ // Hide command <exit> if application is started from active idle
+ // and it is in landscape orientation
+ if( aResourceId == R_PROFILE_LIST_VIEW_MENU )
+ {
+ // If there is no default printer selected, remove print option from menu to avoid incorrect print sequency.
+ TInt currentProtocol = iSettings->GetCurrentPrinterProtocol();
+ if ( currentProtocol == MDiscoveryObserver::ENOPRINTER )
+ {
+ aMenuPane->DeleteMenuItem( ESettingsPrint );
+ }
+ }
+ }
+
+void CImagePrintSettingsView::HandleForegroundEventL( TBool aForeground )
+ {
+ if ( aForeground )
+ {
+ ViewScreenDeviceChangedL();
+ }
+ }
+
+void CImagePrintSettingsView::HandlePossibleLinkDisconnectionL()
+ {
+ TInt wlanState;
+ RProperty::Get( KPSUidWlan, KPSWlanIndicator, wlanState );
+
+ if ( wlanState == EPSWlanIndicatorNone )
+ {
+ // Show connection to printer lost -note and exit application.
+ HBufC* buf = StringLoader::LoadLC( R_NOTE_DISCONNECT_PRINT_ERROR );
+ CAknErrorNote* errornote = new CAknErrorNote( ETrue );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+
+ AppUi()->HandleCommandL( EEikCmdExit );
+ }
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cimgpviewemptyview.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,113 @@
+/*
+* 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:
+*
+*/
+
+
+#include <aknViewAppUi.h>
+#include <eikenv.h>
+#include <eikspane.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <avkon.hrh>
+#include <imageprintapp.rsg>
+
+#include "cimgpviewemptyview.h"
+#include "cimageprintappui.h"
+#include "cimageprintblankcontainer.h"
+
+// CONSTRUCTION
+CIMGPViewEmptyView* CIMGPViewEmptyView::NewL()
+ {
+ CIMGPViewEmptyView* self = new (ELeave) CIMGPViewEmptyView;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// Default constructor
+CIMGPViewEmptyView::CIMGPViewEmptyView()
+ {
+ }
+
+// 2nd phase constructor
+void CIMGPViewEmptyView::ConstructL()
+ {
+ BaseConstructL( R_EMPTY_VIEW );
+ }
+
+// Destructor
+CIMGPViewEmptyView::~CIMGPViewEmptyView()
+ {
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+ delete iContainer;
+ }
+ }
+
+// Returns view's ID
+TUid CIMGPViewEmptyView::Id() const
+ {
+ return KIMGPViewEmptyViewId;
+ }
+
+// Handles view commands
+void CIMGPViewEmptyView::HandleCommandL(
+ TInt /*aCommand*/ )
+ {
+ AppUi()->HandleCommandL( EAknCmdExit );
+ }
+
+// Activates the view, creates the container and other UI controls
+void CIMGPViewEmptyView::DoActivateL(
+ const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/)
+ {
+ TRect rect( AppUi()->ClientRect() );
+ iContainer = CImagePrintBlankContainer::NewL(rect);
+ iContainer->SetMopParent( this );
+ AppUi()->AddToStackL( *this, iContainer );
+ }
+
+// Deactivates the view, deletes print container
+void CIMGPViewEmptyView::DoDeactivate()
+ {
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+ delete iContainer;
+ iContainer = 0;
+ }
+ }
+
+
+void CIMGPViewEmptyView::SizeChanged()
+ {
+ //No Implementetion needed
+ }
+
+
+void CIMGPViewEmptyView::HandleForegroundEventL( TBool aForeground )
+ {
+ if ( aForeground )
+ {
+ ViewScreenDeviceChangedL();
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cpropertiesboxmodel.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,531 @@
+/*
+* 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:
+*
+*/
+
+
+#include <akntextsettingpage.h>
+#include <eiklbx.h>
+#include <StringLoader.h>
+#include <AknQueryValueText.h>
+#include <aknpopupsettingpage.h>
+#include <aknslidersettingpage.h>
+#include <bautils.h>
+#include <pathinfo.h>
+#include <aknmessagequerydialog.h>
+#include <apgcli.h> // rapalssession
+#include <imageprintapp.rsg>
+#include <AknQueryDialog.h>
+#include <driveinfo.h>
+
+#include "imageprint.h"
+#include "cprintsettings.h"
+#include "cbasecapability.h"
+#include "cimageprintsettingscontainer.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "mdiscoveryobserver.h"
+#include "mdiscovery.h"
+#include "clog.h"
+#include "clistcapability.h"
+#include "imageprintvariant.h"
+#include "cpropertiesboxmodel.h"
+
+const TInt KListItemsRequired( 2 );
+const TInt KDefaultPrinterIndex( 0 );
+const TInt KNumerOfCopiesIndex( 1 );
+
+// CONSTRUCTION
+CPropertiesBoxModel* CPropertiesBoxModel::NewL(
+ CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer )
+ {
+ CPropertiesBoxModel* self =
+ CPropertiesBoxModel::NewLC( aEngine, aSettings, aContainer );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CPropertiesBoxModel* CPropertiesBoxModel::NewLC(
+ CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer )
+ {
+ CPropertiesBoxModel* self =
+ new ( ELeave ) CPropertiesBoxModel( aEngine, aSettings, aContainer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// Constructor
+CPropertiesBoxModel::CPropertiesBoxModel(
+ CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer ) :
+ iEngine( aEngine ),
+ iSettingsIF( aSettings ),
+ iContainer( aContainer )
+ {
+ }
+
+// Destructor
+CPropertiesBoxModel::~CPropertiesBoxModel()
+ {
+ delete iPrintSettings;
+ delete iDefaultPrinter;
+ delete iNumberOfCopiesText;
+ delete iMMC;
+ delete iPictBridge;
+ }
+
+// 2nd phase constructor
+void CPropertiesBoxModel::ConstructL()
+ {
+ InitSettingsL();
+ iDefaultPrinter = StringLoader::LoadL( R_PRINT_SELECTED_PRINTER );
+ iNumberOfCopiesText = StringLoader::LoadL( R_QTN_PRINT_SETTINGS_NOC );
+ iMMC = StringLoader::LoadL( R_PRINT_MEMORY_CARD );
+ iPictBridge = StringLoader::LoadL( R_QTN_PRINT_SETTINGS_DEFAULT_USB );
+ iNumberOfCopiesValue = 1;
+ }
+
+void CPropertiesBoxModel::InitSettingsL()
+ {
+ delete iPrintSettings;
+ iPrintSettings = NULL;
+ iPrintSettings = iSettingsIF->PrinterSettingsL();
+ iCount = iPrintSettings->iCapabilities.Count();
+ TInt i( 0 );
+ TInt counter = iPrintSettings->iCapabilities.Count();
+ // If current protocol is MMC remove one item, because there is no layouts for mmc.
+ if ( MDiscoveryObserver::EMMC == iSettingsIF->GetCurrentPrinterProtocol() )
+ {
+ iCount--;
+ }
+
+ for ( i = 0; i < counter; i++ )
+ {
+ if ( iPrintSettings->iCapabilities[i]->iTitle.CompareF( KNullDesC ) == 0 )
+ {
+ // Remove non-title capability items as those won't be displayed
+ iCount--;
+ }
+ }
+
+ // Add always first two for default printer item and for Number of copies item
+ iCount = iCount + KListItemsRequired;
+ }
+
+// Returns the number of listbox items
+TInt CPropertiesBoxModel::MdcaCount() const
+ {
+ LOG1("CPropertiesBoxModel::MdcaCount: %d", iCount );
+ return iCount;
+ }
+
+// Creates the text string for the list box item and returns it
+TPtrC CPropertiesBoxModel::MdcaPoint( TInt aIndex ) const
+ {
+ LOG1("CPropertiesBoxModel::MdcaPoint START index: %d", aIndex );
+
+ switch ( aIndex )
+ {
+ case KDefaultPrinterIndex:
+ {
+ SetDefaultPrinterItem();
+ break;
+ }
+ case KNumerOfCopiesIndex:
+ {
+ SetNumberOfCopiesItem();
+ break;
+ }
+ default:
+ {
+ SetOtherCapability( aIndex );
+ break;
+ }
+ }
+
+ LOG1("CPropertiesBoxModel::MdcaPoint END, iBuf: %S", &iBuf );
+ return iBuf;
+ }
+
+void CPropertiesBoxModel::SetDefaultPrinterItem() const
+ {
+ LOG("CPropertiesBoxModel::SetDefaultPrinterItem START");
+
+ iBuf.Copy( KTabChar );
+ iBuf.Append( *iDefaultPrinter );
+ iBuf.Append( KTabChar );
+ iBuf.Append( KTabChar );
+ if( iSettingsIF->GetDefaultPrinterProtocol() ==
+ MDiscoveryObserver::EMMC ) // mmc
+ {
+ iBuf.Append( *iMMC );
+ }
+ else if( iSettingsIF->GetDefaultPrinterProtocol() ==
+ MDiscoveryObserver::EUSB ) // pictbridge
+ {
+ iBuf.Append( *iPictBridge );
+ }
+ else
+ {
+ // No can do if this fails. Not leaving function.
+ TRAP_IGNORE(
+ HBufC* defaultPrinterName =
+ iSettingsIF->GetDefaultPrinterNameLC();
+ iBuf.Append( *defaultPrinterName );
+ CleanupStack::PopAndDestroy( defaultPrinterName );
+ );
+ }
+
+ LOG("CPropertiesBoxModel::SetDefaultPrinterItem END");
+ }
+
+void CPropertiesBoxModel::SetNumberOfCopiesItem() const
+ {
+ LOG("CPropertiesBoxModel::SetNumberOfCopiesItem START");
+
+ iBuf.Copy( KTabChar );
+ iBuf.Append( *iNumberOfCopiesText );
+ iBuf.Append( KTabChar );
+ iBuf.Append( KTabChar );
+ iBuf.AppendNum( iNumberOfCopiesValue );
+
+ LOG("CPropertiesBoxModel::SetNumberOfCopiesItem END");
+ }
+
+void CPropertiesBoxModel::SetOtherCapability( const TInt &aIndex ) const
+ {
+ LOG("CPropertiesBoxModel::SetOtherCapability START");
+
+ iBuf.Zero();
+ HBufC* buf = NULL;
+
+ // Get the text for the list box
+ TInt position = CapabilityArrayIndex( aIndex - KListItemsRequired );
+ TRAPD( err,
+ buf = iPrintSettings->iCapabilities[position]->ListBoxTextL() );
+ if ( !err && buf )
+ {
+ iBuf = buf->Des();
+ delete buf;
+ }
+
+ LOG("CPropertiesBoxModel::SetOtherCapability END");
+ }
+
+// Handles the list box (enter) events by launching the pop-up list
+void CPropertiesBoxModel::HandleListBoxEventL(
+ CEikListBox* aListBox,
+ TListBoxEvent aEventType )
+ {
+ LOG("CPropertiesBoxModel::HandleListBoxEventL START");
+
+ if ( (aEventType == EEventEnterKeyPressed || aEventType == EEventItemDoubleClicked) &&
+ aListBox->CurrentItemIndex() != KErrNotFound )
+ {
+ if( aListBox->CurrentItemIndex() == 0 )
+ {
+ // launch dialog query for selecting default printer this returns
+ // protocol id as defined in DiscoveryObserver.h or -1 if failed.
+ TInt protocol = LaunchDefaultPrinterListL();
+ if( protocol >= 0 )
+ {
+ iContainer->DoDiscoveryL( protocol );
+ InitSettingsL();
+ iContainer->UpdateListBox();
+ iContainer->DrawNow();
+ }
+ }
+
+ if( aListBox->CurrentItemIndex() == 1 )
+ {
+ LaunchNumberOfCopiesDialogL();
+ iContainer->UpdateListBox();
+ iContainer->DrawNow();
+ }
+
+ if ( aListBox->CurrentItemIndex() > 1 )
+ {
+ TInt selIndex = CapabilityArrayIndex( aListBox->CurrentItemIndex() - KListItemsRequired );
+ TBool valueChanged = iPrintSettings->iCapabilities[selIndex]->LaunchPopupListL();
+
+ if( valueChanged )
+ {
+ SaveCurrentSelectionL( *(iPrintSettings->iCapabilities[ selIndex ]), aListBox );
+ InitSettingsL();
+ iContainer->UpdateListBox();
+ iContainer->DrawNow();
+ }
+ }
+ }
+
+ LOG("CPropertiesBoxModel::HandleListBoxEventL END");
+ }
+
+// Saves selection to engine
+void CPropertiesBoxModel::SaveCurrentSelectionL(
+ CBaseCapability &aCapab,
+ CEikListBox* aListBox )
+ {
+ LOG("CPropertiesBoxModel::SaveCurrentSelectionL START");
+
+ TInt initList = iSettingsIF->SetPrinterSettingL( aCapab );
+ if( initList == 0 )
+ {
+ CPrintSettings* tempSettings = iSettingsIF->PrinterSettingsL();
+ delete iPrintSettings;
+ iPrintSettings = tempSettings;
+
+ // Sets the active page to be the first one, if settings have truly
+ // changed
+ iSettingsIF->SetActivePageL( 1 );
+
+ aListBox->HandleItemRemovalL();
+ aListBox->HandleItemAdditionL();
+ }
+
+ LOG("CPropertiesBoxModel::SaveCurrentSelectionL END");
+ }
+
+// Returns capability array index based on the list box index
+TUint CPropertiesBoxModel::CapabilityArrayIndex(
+ TInt aListBoxIndex ) const
+ {
+ LOG("CPropertiesBoxModel::CapabilityArrayIndex START");
+
+ // Skip capabilities with empty title as they won't be placed to list box
+ TInt found( EFalse );
+ TInt i( 0 );
+
+ while ( !found )
+ {
+ if ( iPrintSettings->iCapabilities[i]->
+ iTitle.CompareF( KNullDesC ) != 0 )
+ {
+ aListBoxIndex--;
+ }
+
+ if ( aListBoxIndex >= 0 )
+ {
+ i++;
+ }
+ else
+ {
+ found = ETrue;
+ }
+ }
+
+ LOG("CPropertiesBoxModel::CapabilityArrayIndex END");
+ return TUint( i );
+ }
+
+
+void CPropertiesBoxModel::LaunchNumberOfCopiesDialogL()
+ {
+ LOG("CPropertiesBoxModel::LaunchNumberOfCopiesDialogL START");
+ CAknNumberQueryDialog* dlg = new( ELeave ) CAknNumberQueryDialog ( iNumberOfCopiesValue );
+ dlg->PrepareLC( R_NOC_QUERY);
+ dlg->RunLD();
+
+ // After selecting copies, NaviText is updated.
+ iContainer->ChangeStatusPaneTextL( iNumberOfCopiesValue );
+
+ // Set value for settings
+ SetNumberOfCopiesValueL();
+
+ LOG("CPropertiesBoxModel::LaunchNumberOfCopiesDialogL END");
+ }
+
+
+void CPropertiesBoxModel::SetNumberOfCopiesValueL()
+ {
+ RArray<TInt> numberOfCopiesArray;
+ CleanupClosePushL( numberOfCopiesArray );
+ iSettingsIF->NumberOfCopies( numberOfCopiesArray );
+
+ // Images selected in print job
+ TInt imagesCount = iEngine.FileArray().Count();
+
+ // Get number of copies for current image
+ if( numberOfCopiesArray.Count() != imagesCount )
+ {
+ numberOfCopiesArray.Reset();
+ for( TInt i=0; i < imagesCount; ++i )
+ {
+ numberOfCopiesArray.Append( 1 );
+ }
+ }
+
+ TInt oldNOC( numberOfCopiesArray[ 0 ] );
+
+ // if new value was entered
+ if (iNumberOfCopiesValue != oldNOC)
+ {
+ // Set Number of copies value for each image.
+ // Value is same for all images in IP 6.2
+ for ( TInt i=0; i<imagesCount; i++ )
+ {
+ numberOfCopiesArray[ i ] = iNumberOfCopiesValue;
+ }
+
+ iSettingsIF->SetNumberOfCopiesL( numberOfCopiesArray );
+ }
+
+ CleanupStack::PopAndDestroy( &numberOfCopiesArray );
+ }
+
+TInt CPropertiesBoxModel::LaunchDefaultPrinterListL()
+ {
+ const TInt expectedNumberOfProtocols( 4 );
+
+ // Array for list item descriptors.
+ CDesCArrayFlat* protocolNameArray =
+ new( ELeave ) CDesCArrayFlat( expectedNumberOfProtocols );
+ CleanupStack::PushL( protocolNameArray );
+
+ // Map from list item index to protocol.
+ RArray<TInt> indexToProtocolMap( expectedNumberOfProtocols );
+ CleanupClosePushL( indexToProtocolMap );
+
+ // Get supported protocols from the engine
+ TInt supportedProtocols =
+ iEngine.InterfaceFactory().DiscoveryIF()->SupportedProtocols();
+
+ // Read list item descriptors, append them in array and update map.
+
+ // Bluetooth printer
+ if( supportedProtocols & KImagePrint_PrinterProtocol_BPP )
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_SETTINGS_DEFAULT_BT )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EBPP );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ // Memory card printer
+ if( supportedProtocols & KImagePrint_PrinterProtocol_DPOF )
+ {
+ RFs fs;
+ CleanupClosePushL( fs );
+ if( fs.Connect() == KErrNone )
+ {
+ TInt driveId (-1);
+ TFileName path;
+ User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, driveId ) );
+ User::LeaveIfError( PathInfo::GetRootPath( path, driveId ) );
+
+ if ( BaflUtils::PathExists( fs, path ))
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_MEMORY_CARD )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EMMC );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ CleanupStack::PopAndDestroy( &fs );
+ }
+ }
+
+ // USB printers
+ if( supportedProtocols & KImagePrint_PrinterProtocol_PictBridge )
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_SETTINGS_DEFAULT_USB )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EUSB );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ // WLAN printers
+ if ( supportedProtocols & KImagePrint_PrinterProtocol_UPnP )
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_SETTINGS_DEFAULT_WLAN )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EWLAN );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ // Prepare arrays for dialog
+ CAknQueryValueTextArray* queryTextArray = CAknQueryValueTextArray::NewL();
+ CleanupStack::PushL( queryTextArray );
+ queryTextArray->SetArray( *protocolNameArray );
+
+ CAknQueryValueText* queryValue = CAknQueryValueText::NewL();
+ CleanupStack::PushL( queryValue );
+ queryValue->SetArrayL( queryTextArray );
+
+ // Determine which is the default protocol using settings interface.
+ // Here defaultProtocol is protocol id as defined in MDiscoveryObserver.h.
+ TInt defaultProtocol = iSettingsIF->GetDefaultPrinterProtocol();
+
+ // Then do lookup in indexToProtocolMap to find correct index for this
+ // protocol id. Note that after this defaultProtocol is an index.
+ defaultProtocol = indexToProtocolMap.Find( defaultProtocol );
+ if ( defaultProtocol != KErrNotFound )
+ {
+ queryValue->SetCurrentValueIndex( defaultProtocol );
+ }
+ else
+ {
+ // Default protocol not available, get current protocol
+ // This is for example for the case where MMC is default,
+ // but removed from phone.
+ TInt currentProtocol = iSettingsIF->GetCurrentPrinterProtocol();
+ currentProtocol = indexToProtocolMap.Find( currentProtocol );
+ if ( currentProtocol != KErrNotFound )
+ {
+ queryValue->SetCurrentValueIndex( currentProtocol );
+ }
+ }
+
+ CAknPopupSettingPage* page = new ( ELeave ) CAknPopupSettingPage(
+ iDefaultPrinter,
+ EAknSettingPageNoOrdinalDisplayed,
+ EAknCtPopupSettingList,
+ R_EMPTY_PROTOCOL_SETTING_LIST,
+ R_SETTING_GENERIC_PROTOCOL_PAGE,
+ *queryValue );
+
+ CleanupStack::PushL( page );
+ page->ConstructL();
+ CleanupStack::Pop( page );
+
+ // Execute dialog and check that it returns properly. If so get the selected
+ // index and use it to protocol map to get name of the selected protocol.
+ TInt selectedProtocolId( -1 );
+ if( page->ExecuteLD() )
+ {
+ selectedProtocolId =
+ indexToProtocolMap[ queryValue->CurrentValueIndex() ];
+ }
+
+ // CleanupStack contains 4 items:
+ // protocolNameArray, indexToProtocolMap (close), queryTextArray and
+ // queryArray.
+ const TInt numberOfItemsInCleanupStack( 4 );
+ CleanupStack::PopAndDestroy( numberOfItemsInCleanupStack, protocolNameArray );
+ return selectedProtocolId;
+ }
+
+TInt CPropertiesBoxModel::NumberOfCopies()
+ {
+ return iNumberOfCopiesValue;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/printapputil.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,160 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <ErrorUI.h>
+#include <eikappui.h>
+#include <eikapp.h>
+#include <eikenv.h>
+#include <obex.h>
+#include <bluetooth/hci/hcierrors.h>
+#include <imageprintapp.rsg>
+
+#include "printapputil.h"
+#include "printmessagecodes.h"
+#include "cimageprintappui.h"
+#include "clog.h"
+
+// Displays the error note
+void PrintAppUtil::ShowErrorNoteL(
+ TInt aResourceId )
+ {
+ HBufC* str = StringLoader::LoadLC( aResourceId );
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
+ note->ExecuteLD( *str );
+ CleanupStack::PopAndDestroy( str ); // str
+ }
+
+// Displays the information note
+void PrintAppUtil::ShowInfoNoteL(
+ TInt aResourceId )
+ {
+ HBufC* str = StringLoader::LoadLC( aResourceId );
+ CAknInformationNote* note = new ( ELeave ) CAknInformationNote;
+ note->ExecuteLD( *str );
+ CleanupStack::PopAndDestroy( str); // str
+ }
+
+// Displays error message based on the error code
+void PrintAppUtil::ShowErrorMsgL(
+ TInt aErrCode )
+ {
+ if ( aErrCode != KErrNone )
+ {
+ HBufC* str = PrintAppUtil::PrintErrorMsgLC( aErrCode );
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
+ note->ExecuteLD( *str );
+ CleanupStack::PopAndDestroy( str ); // str
+ }
+ }
+
+// Loads printer application specific error message
+HBufC* PrintAppUtil::PrintErrorMsgLC(
+ TInt aErrCode )
+ {
+ HBufC* errStr = 0;
+ TInt resourceId( 0 );
+
+ switch ( aErrCode )
+ {
+ case ( KHCIErrorBase - EPageTimedOut ):
+ resourceId = R_NOTE_CONNECT_PRINT_ERROR;
+ break;
+ case KErrIrObexRespServiceUnavail:
+ resourceId = R_NOTE_SEND_PRINT_ERROR;
+ break;
+ case KErrDisconnected:
+ resourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+ case EObexGeneralError:
+ resourceId = R_NOTE_GENERAL_PRINT_ERROR;
+ break;
+ case EPbStatusErrorReasonInk:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_INK;
+ break;
+ case EPbStatusErrorReasonHardwareCoverOpen:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_COVER_OPEN;
+ break;
+ case EPbStatusErrorReasonHardwarePrinterBusy:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_PRINTER_BUSY;
+ break;
+ case EPbStatusErrorReasonHardwareNoInkCartridge:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_NO_INK_CARTRIDGE;
+ break;
+ case EPbStatusErrorReasonNoReason:
+ resourceId = R_NOTE_PRINT_STATUS_ERROR;
+ break;
+ case EPbOutOfPaper:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_OUT;
+ break;
+ case EPbStatusErrorReasonInkEmpty:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_INK_OUT;
+ break;
+ case EPrintReasonPaused:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_PRINTER_PAUSED;
+ break;
+ case EPrintReasonMarkerFailure:
+ resourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_FAILURE;
+ break;
+
+ case KErrHCILinkDisconnection:
+ resourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+
+ default:
+ resourceId = R_NOTE_GENERAL_PRINT_ERROR;
+ break;
+ }
+ errStr = StringLoader::LoadLC( resourceId );
+
+// Add error code to message only when debug build is created.
+#ifdef _DEBUG
+ if ( aErrCode != 0 )
+ {
+ // append error code to message
+ _LIT( KErrTmp, ": %d" );
+ TBuf<32> errCodeMsg;
+ errCodeMsg.Format( KErrTmp, aErrCode );
+ errStr = errStr->ReAllocL( errStr->Length() + 32 );
+ CleanupStack::Pop(); // errStr before realloc
+ CleanupStack::PushL( errStr );
+ TPtr p( errStr->Des() );
+ p += errCodeMsg;
+ }
+#endif // _DEBUG
+
+ return errStr;
+ }
+
+// Adds application path
+TFileName PrintAppUtil::AddApplicationPath(
+ const TDesC& aFileName )
+ {
+ CEikAppUi* appUi = static_cast<CEikAppUi*>( CEikonEnv::Static()->AppUi() );
+ TFileName fullFilePath = appUi->Application()->AppFullName();
+
+ TParse parse;
+ parse.Set( fullFilePath, NULL, NULL );
+ fullFilePath = parse.DriveAndPath();
+ fullFilePath.Append( aFileName );
+ return fullFilePath;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/uimodefactory.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* 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:
+*
+*/
+
+
+#include "uimodefactory.h"
+#include "cimageprintappui.h"
+#include "muimode.h"
+#include "caiwmode.h"
+#include "cidlemode.h"
+#include "ciffactory.h"
+
+// CONSTRUCTOR
+MUIMode* UIModeFactory::CreateL( TBool aAiwMode,
+ MUIModeObserver* aUIModeObserver,
+ CIFFactory& aIFFactory )
+ {
+ if( aAiwMode )
+ {
+ return CAiwMode::NewL( aUIModeObserver, aIFFactory );
+ }
+ else
+ {
+ return CIdleMode::NewL( aUIModeObserver, aIFFactory );
+ }
+ }
+
+
+// Destructor
+UIModeFactory::~UIModeFactory()
+ {
+
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/bwins/imageprintengineu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,8 @@
+EXPORTS
+ ?FileArray@CImagePrintEngine@@QAEAAV?$RPointerArray@VTDesC16@@@@XZ @ 1 NONAME ; class RPointerArray<class TDesC16> & CImagePrintEngine::FileArray(void)
+ ?RestartEngine@CImagePrintEngine@@QAEXXZ @ 2 NONAME ; void CImagePrintEngine::RestartEngine(void)
+ ?NewL@CImagePrintEngine@@SAPAV1@PAVCDesC16ArrayFlat@@@Z @ 3 NONAME ; class CImagePrintEngine * CImagePrintEngine::NewL(class CDesC16ArrayFlat *)
+ ?NewLC@CImagePrintEngine@@SAPAV1@PAVCDesC16ArrayFlat@@@Z @ 4 NONAME ; class CImagePrintEngine * CImagePrintEngine::NewLC(class CDesC16ArrayFlat *)
+ ?InterfaceFactory@CImagePrintEngine@@QAEAAVCIFFactory@@XZ @ 5 NONAME ; class CIFFactory & CImagePrintEngine::InterfaceFactory(void)
+ ?SetImageArrayL@CImagePrintEngine@@QAEXPAVCDesC16ArrayFlat@@@Z @ 6 NONAME ; void CImagePrintEngine::SetImageArrayL(class CDesC16ArrayFlat *)
+
Binary file ImagePrint/ImagePrintUI/imageprinteng/data/10208a35.txt has changed
Binary file ImagePrint/ImagePrintUI/imageprinteng/data/bckgs.mbm has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/data/imageprintengine.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,157 @@
+/*
+* 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:
+*
+*/
+
+
+// RESOURCE IDENTIFIER
+NAME IGPE // 4 letter ID
+
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <eikon.rh>
+#include <imageprintapp.loc>
+
+// d:List box format string - do not localize this!
+#define qtn_lbox_format "\t%0U\t\t%1U"
+
+// Maximum and minimum number
+#define MIN_TINT_NAME -2147483646
+#define MAX_TINT_NAME 2147483647
+
+// RESOURCE DEFINITIONS
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf="ImagePrintEngine"; }
+
+/**
+ * Generic popup setting item
+ */
+RESOURCE AVKON_SETTING_PAGE r_setting_generic_page
+ {
+ softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL;
+ type = EAknCtPopupSettingList;
+ editor_resource_id = r_empty_setting_list;
+ }
+
+RESOURCE POPUP_SETTING_LIST r_empty_setting_list
+ {
+ }
+
+RESOURCE AVKON_POPUP_SETTING_TEXTS r_setting_generic_popup_page
+ {
+ flags = 0;
+ setting_texts_resource = r_setting_generic_popup_array;
+ popped_up_texts_resource = r_setting_generic_popup_array_texts;
+ }
+
+RESOURCE ARRAY r_setting_generic_popup_array
+ {
+ items =
+ {
+ AVKON_ENUMERATED_TEXT
+ {
+ value = 0;
+ text = " ";
+ }
+ };
+ }
+
+RESOURCE ARRAY r_setting_generic_popup_array_texts
+ {
+ items =
+ {
+ LBUF
+ {
+ txt = " ";
+ }
+ };
+ }
+
+/**
+ * Generic TInt setting page
+ */
+
+RESOURCE AVKON_SETTING_PAGE r_def_integer_page
+ {
+ softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL;
+ type = EAknCtIntegerEdwin;
+ editor_resource_id = r_def_integer_editor;
+ }
+
+RESOURCE AVKON_INTEGER_EDWIN r_def_integer_editor
+ {
+ min = MIN_TINT_NAME;
+ max = MAX_TINT_NAME;
+ }
+
+/**
+ * Generic float query
+ */
+RESOURCE DIALOG r_generic_float_query_dlg
+ {
+ flags = EGeneralQueryFlags;
+ buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtQuery;
+ id = 10000;
+ control = AVKON_DATA_QUERY
+ {
+ layout = EFloatingPointLayout;
+ label = " ";
+ control = FLPTED
+ {
+ };
+ };
+ }
+ };
+ }
+
+// Resource strings
+RESOURCE TBUF R_QTN_LBOX_FORMAT { buf = qtn_lbox_format; }
+RESOURCE TBUF R_EMPTY { buf = ""; }
+
+// Paper sizes
+RESOURCE TBUF R_QTN_STR_PAPER_SIZE { buf = qtn_print_settings_paper_size; }
+RESOURCE TBUF R_QTN_STR_SIZE_AUTO { buf = qtn_print_paper_size_auto; }
+RESOURCE TBUF R_QTN_STR_SIZE_LETTER { buf = qtn_print_paper_size_letter; }
+RESOURCE TBUF R_QTN_STR_SIZE_A4 { buf = qtn_print_paper_size_a4; }
+RESOURCE TBUF R_QTN_STR_SIZE_A6 { buf = qtn_print_paper_size_a6; }
+RESOURCE TBUF R_QTN_STR_SIZE_4X6 { buf = qtn_print_paper_size_4x6; }
+RESOURCE TBUF R_QTN_STR_SIZE_5X7 { buf = qtn_print_paper_size_5x7; }
+RESOURCE TBUF R_QTN_STR_SIZE_STICKER { buf = qtn_print_paper_size_sticker; }
+
+// Print quality
+RESOURCE TBUF R_QTN_STR_QUALITY { buf = qtn_print_settings_print_quality; }
+RESOURCE TBUF R_QTN_STR_QUAL_AUTO { buf = qtn_print_quality_auto; }
+RESOURCE TBUF R_QTN_STR_QUAL_NORMAL { buf = qtn_print_quality_normal; }
+RESOURCE TBUF R_QTN_STR_QUAL_DRAFT { buf = qtn_print_quality_draft; }
+RESOURCE TBUF R_QTN_STR_QUAL_FINE { buf = qtn_print_quality_fine; }
+
+// Template
+RESOURCE TBUF R_QTN_STR_TEMPLATE { buf = qtn_print_settings_template; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_BLESS { buf = qtn_print_settings_bless; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_ONE { buf = "1"; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_TWO { buf = "2"; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_FOUR { buf = "4"; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_SIX { buf = "6"; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_NINE { buf = "9"; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_TWELVE { buf = "12"; }
+RESOURCE TBUF R_QTN_STR_TEMPLATE_SIXTEEN { buf = "16"; }
+
+
Binary file ImagePrint/ImagePrintUI/imageprinteng/data/previewdata.dat has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/eabi/imageprintengineu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,40 @@
+EXPORTS
+ _ZN17CImagePrintEngine13RestartEngineEv @ 1 NONAME
+ _ZN17CImagePrintEngine14SetImageArrayLEP16CDesC16ArrayFlat @ 2 NONAME
+ _ZN17CImagePrintEngine16InterfaceFactoryEv @ 3 NONAME
+ _ZN17CImagePrintEngine4NewLEP16CDesC16ArrayFlat @ 4 NONAME
+ _ZN17CImagePrintEngine5NewLCEP16CDesC16ArrayFlat @ 5 NONAME
+ _ZN17CImagePrintEngine9FileArrayEv @ 6 NONAME
+ _ZTI10CIFFactory @ 7 NONAME ; #<TI>#
+ _ZTI11CImagePrint @ 8 NONAME ; #<TI>#
+ _ZTI12CPreviewInfo @ 9 NONAME ; #<TI>#
+ _ZTI12CRealFactory @ 10 NONAME ; #<TI>#
+ _ZTI13CTemplateData @ 11 NONAME ; #<TI>#
+ _ZTI14CPrintSettings @ 12 NONAME ; #<TI>#
+ _ZTI15CListCapability @ 13 NONAME ; #<TI>#
+ _ZTI15CTIntCapability @ 14 NONAME ; #<TI>#
+ _ZTI16CFloatCapability @ 15 NONAME ; #<TI>#
+ _ZTI16CPrintJobManager @ 16 NONAME ; #<TI>#
+ _ZTI16CSettingsManager @ 17 NONAME ; #<TI>#
+ _ZTI17CDiscoveryManager @ 18 NONAME ; #<TI>#
+ _ZTI17CImagePrintEngine @ 19 NONAME ; #<TI>#
+ _ZTI17CTemplateSettings @ 20 NONAME ; #<TI>#
+ _ZTI18CPrintEventCatcher @ 21 NONAME ; #<TI>#
+ _ZTI22CIdlePrintEventCatcher @ 22 NONAME ; #<TI>#
+ _ZTV10CIFFactory @ 23 NONAME ; #<VT>#
+ _ZTV11CImagePrint @ 24 NONAME ; #<VT>#
+ _ZTV12CPreviewInfo @ 25 NONAME ; #<VT>#
+ _ZTV12CRealFactory @ 26 NONAME ; #<VT>#
+ _ZTV13CTemplateData @ 27 NONAME ; #<VT>#
+ _ZTV14CPrintSettings @ 28 NONAME ; #<VT>#
+ _ZTV15CListCapability @ 29 NONAME ; #<VT>#
+ _ZTV15CTIntCapability @ 30 NONAME ; #<VT>#
+ _ZTV16CFloatCapability @ 31 NONAME ; #<VT>#
+ _ZTV16CPrintJobManager @ 32 NONAME ; #<VT>#
+ _ZTV16CSettingsManager @ 33 NONAME ; #<VT>#
+ _ZTV17CDiscoveryManager @ 34 NONAME ; #<VT>#
+ _ZTV17CImagePrintEngine @ 35 NONAME ; #<VT>#
+ _ZTV17CTemplateSettings @ 36 NONAME ; #<VT>#
+ _ZTV18CPrintEventCatcher @ 37 NONAME ; #<VT>#
+ _ZTV22CIdlePrintEventCatcher @ 38 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_EXPORTS
+../data/10208a35.txt /epoc32/data/z/private/10202be9/10208a35.txt
+../data/10208a35.txt /epoc32/release/winscw/udeb/z/private/10202be9/10208a35.txt
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+
+imageprintengine.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/group/imageprintengine.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,98 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+#include <data_caging_paths.hrh>
+
+#include "../../inc/logdef.h"
+
+deffile imageprintengine.def
+
+TARGET imageprintengine.dll
+TARGETTYPE dll
+
+CAPABILITY CAP_GENERAL_DLL
+
+UID 0x1000008D 0x101FFA85
+VENDORID VID_DEFAULT
+
+APP_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE . ../inc ../src
+USERINCLUDE ../../inc ../../../inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintLibrary/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintServer/inc
+USERINCLUDE ../../imageprintapp/inc
+USERINCLUDE ../../../clog/inc
+
+SOURCEPATH ../src
+
+SOURCE cimageprint.cpp
+SOURCE cimageprintengine.cpp
+SOURCE ctemplatesettings.cpp
+SOURCE ctemplatedata.cpp
+SOURCE cprintsettings.cpp
+SOURCE ciffactory.cpp
+SOURCE crealfactory.cpp
+SOURCE ctintcapability.cpp
+SOURCE clistcapability.cpp
+SOURCE cfloatcapability.cpp
+SOURCE cdiscoverymanager.cpp
+SOURCE csettingsmanager.cpp
+SOURCE cprintjobmanager.cpp
+SOURCE cprinteventcatcher.cpp
+SOURCE settingsconverter.cpp
+SOURCE cpreviewinfo.cpp
+SOURCE tpreviewimageinfo.cpp
+SOURCE cidleprinteventcatcher.cpp
+
+START RESOURCE ../data/imageprintengine.rss
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+HEADER
+#ifdef RD_SECURE_BIN_RES
+ TARGETPATH RESOURCE_FILES_DIR
+#else
+ TARGETPATH system/data
+#endif
+END
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY fbscli.lib
+LIBRARY bafl.lib
+LIBRARY commonengine.lib
+LIBRARY avkon.lib
+LIBRARY bitgdi.lib
+LIBRARY imageconversion.lib
+LIBRARY bitmaptransforms.lib
+LIBRARY cone.lib
+LIBRARY efsrv.lib
+LIBRARY eikcore.lib
+LIBRARY platformenv.lib
+LIBRARY featmgr.lib
+LIBRARY centralrepository.lib
+LIBRARY imageprintclient.lib
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cbasecapability.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,78 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CBASECAPABILITY_H
+#define CBASECAPABILITY_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+// TYPE DEFINITIONS
+typedef TBuf<64> TCapabilityTitle;
+
+/**
+ *
+ * Capability base class, pure virtual, needs to be derived
+ *
+ */
+class CBaseCapability
+ : public CBase
+ {
+ public: // New methods
+
+ virtual ~CBaseCapability() {};
+
+ /**
+ * Creates text for the setting item list box
+ *
+ * @return Correctly formatted list box text
+ */
+ virtual HBufC* ListBoxTextL() = 0;
+
+ /**
+ * Launches pop-up window to modify the values
+ *
+ * @return Did user change the value or not
+ */
+ virtual TBool LaunchPopupListL() = 0;
+
+ /**
+ * Clones and returns copy of itself
+ *
+ * @return Cloned copy of the instance itself
+ */
+ virtual CBaseCapability* CloneL() = 0;
+
+ public: // Data
+
+ // The index on the list from the top (0 = topmost)
+ TBool iIndexOnList;
+
+ // Title of this capability
+ TCapabilityTitle iTitle;
+
+ // UID of the capability
+ TInt iUid;
+
+ // Value
+ TInt iValue;
+ };
+
+#endif // CBASECAPABILITY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cdiscoverymanager.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,126 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CDISCOVERYMANAGER_H
+#define CDISCOVERYMANAGER_H
+
+#include <e32def.h>
+#include <e32std.h>
+#include <e32base.h>
+#include <f32file.h>
+
+#include "mdiscovery.h"
+#include "mdiscoveryobserver.h"
+#include "imageprint.h"
+
+class CRealFactory;
+class CIFFactory;
+class CImagePrint;
+
+/**
+ *
+ * Manages the device discovery part.
+ *
+ */
+class CDiscoveryManager
+ : public CBase,
+ public MDiscovery,
+ public MPrinterDiscoveryObserver
+ {
+ public: // Construction and destruction
+
+ /**
+ * Two-phase construction
+ *
+ * @param aFactory Pointer to factory
+ * @return Initialized instance of the class
+ */
+ static CDiscoveryManager* NewL( CIFFactory* aFactory );
+ static CDiscoveryManager* NewLC( CIFFactory* aFactory );
+
+ /**
+ * Destructor
+ */
+ virtual ~CDiscoveryManager();
+
+ private: // Construction and destruction
+
+ /**
+ * Constructor
+ *
+ * @param aFactory Pointer to factory
+ */
+ CDiscoveryManager( CIFFactory* aFactory );
+
+ /**
+ * Second-phase constructor
+ */
+ void ConstructL();
+
+ private: // Methods derived from MDiscovery
+
+ virtual void StartDeviceDiscoveryL(
+ MDiscoveryObserver* aNotifier, TUint aProtocol );
+ virtual void CancelDeviceDiscoveryL();
+ virtual TInt ChoosePrinterL( TInt aPrinterUid );
+ virtual TUint SupportedProtocols();
+ virtual TInt IsPictBridgeMode();
+ virtual void RemoveDiscoveryObserver();
+
+ private: // Methods derived from MPrinterDiscoveryObserver
+
+ virtual void FoundPrinterL( const TPrinter& aPrinterInfo );
+ virtual void DiscoveryStatusL( TInt aStatus, TInt aErrorCode,
+ TInt aErrorStringCode );
+ virtual void RemovePrinterL( const TPrinter& aPrinterInfo );
+
+ private: // Enumerations
+
+ // Different states of device discovery
+ enum TDiscoveryState
+ {
+ EDiscovering,
+ EDoneDiscovery,
+ ECancellingDiscovery
+ };
+
+ private: // Data
+
+ // Pointer to factory object
+ CIFFactory* iFactory;
+
+ // Pointer to the observer
+ MDiscoveryObserver* iDiscoveryObserver;
+
+ // Flag to indicate if the discovery or cancelling of discovery is on-going
+ TBool iOnGoingDiscovery;
+ TBool iCancelling;
+
+ // Chosen printer UID
+ TInt iPrinterUid;
+
+ // Synchronous wait system for cancellation
+ CActiveSchedulerWait iWait;
+
+ // UID for MMC printer (if available)
+ TInt iMMCUid;
+ };
+
+#endif // CDISCOVERYMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cfloatcapability.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CFLOATCAPABILITY_H
+#define CFLOATCAPABILITY_H
+
+#include "cbasecapability.h"
+
+/**
+ *
+ * Capability type for float type of settings
+ *
+ */
+class CFloatCapability :
+ public CBaseCapability
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Destructor
+ */
+ virtual ~CFloatCapability();
+
+ public: // Methods derived from CBaseCapability
+
+ virtual HBufC* ListBoxTextL();
+ virtual TBool LaunchPopupListL();
+ virtual CBaseCapability* CloneL();
+
+ public: // New methods
+
+ /**
+ * Sets the values for denominator, numerator and
+ * maximum numerator. Initializes iRealValue at the same time
+ *
+ * @param aDenom Denominator
+ * @param aNumerator Current numerator
+ * @param aMaxNumerator Maximum numerator
+ * @return Error code
+ */
+ TInt SetValues( TInt aDenom, TInt aNumerator, TInt aMaxNumerator );
+
+ /**
+ * Returns numerator
+ * @return numerator
+ */
+ TInt Numerator() const;
+
+ /**
+ * Returns denominator
+ * @return denominator
+ */
+ TInt Denominator() const;
+
+ private: // Data
+
+ // Denominator / Numerator pair
+ TInt iDenominator;
+ TInt iMaxNumerator;
+
+ TReal iRealValue;
+ };
+
+#endif // CFLOATCAPABILITY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cidleprinteventcatcher.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,107 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIDLEPRINTEVENTCATCHER_H
+#define CIDLEPRINTEVENTCATCHER_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+#include "imageprint.h"
+#include "midleprinteventregisterif.h"
+
+// FORWARD DECLARATIONS
+class CRealFactory;
+class MIdlePrintEventObserver;
+class MIdlePrintEventRegisterIF;
+
+// CLASS DEFINITION
+
+/**
+ * This class catches idle events from Image Print engine.
+ */
+class CIdlePrintEventCatcher :
+ public CBase,
+ public MIdleObserver,
+ public MIdlePrintEventRegisterIF
+ {
+ public: // Construction and destruction
+
+ /**
+ * Two phase constructor
+ *
+ * @param aFactory The factory
+ * @param aIdleUIObserver Observer to notify UI about idle events
+ *
+ * @return Initialized instance of the engine
+ */
+ static CIdlePrintEventCatcher* NewL(
+ CRealFactory* aFactory /*, MIdlePrintEventObserver* aIdleUIObserver*/ );
+ static CIdlePrintEventCatcher* NewLC(
+ CRealFactory* aFactory /*, MIdlePrintEventObserver* aIdleUIObserver*/ );
+
+ /**
+ * Destructor
+ */
+ virtual ~CIdlePrintEventCatcher();
+
+ private: // Construction and destruction
+
+ /**
+ * Constructor
+ *
+ * @param aFactory The factory
+ * @param aIdleUIObserver Observer to notify UI about idle events
+ */
+ CIdlePrintEventCatcher( CRealFactory* aFactory /*,
+ MIdlePrintEventObserver* aIdleUIObserver*/ );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+ public: // Methods derived from MIdleObserver
+
+ void StatusEvent(const TEvent &aEvent, TInt aError, TInt aMsgCode);
+
+ public: // Methods derived from MIdlePrintEventRegisterIF
+
+ void RegisterObserver( MIdlePrintEventObserver* aIdleObserver );
+ void UnRegisterObserver( MIdlePrintEventObserver* aIdleObserver );
+
+ private: // Data
+
+ // Interface factory
+ CRealFactory* iFactory;
+
+ // Observer to notify UI about idle print events
+ MIdlePrintEventObserver* iIdleUIObserver;
+
+ MIdlePrintEventObserver* iIdleUIObserver2;
+
+ RPointerArray<MIdlePrintEventObserver> iObservers;
+
+ HBufC* iBuf;
+
+ };
+
+
+#endif // CIDLEPRINTEVENTCATCHER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/ciffactory.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,132 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIFFACTORY_H
+#define CIFFACTORY_H
+
+#include <e32def.h>
+#include <e32base.h>
+
+class CImagePrintEngine;
+class CImagePrint;
+class MDiscovery;
+class MPrintJob;
+class MPrintPreview;
+class MPrintSettings;
+class MIdlePrintEventRegisterIF;
+class RImagePrintClient;
+class MPrintEventObserver;
+class MPrintEventRegisterIF;
+
+// CLASS DEFINITION
+/**
+ *
+ * Base class for the factories that create the concrete classes
+ *
+ */
+class CIFFactory
+ : public CBase
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Destructor
+ */
+ virtual ~CIFFactory();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Constructor
+ */
+ CIFFactory( CImagePrintEngine* aEngine );
+
+ public: // New methods
+
+ /**
+ * Returns discovery interface
+ *
+ * @return Device discovery interface
+ */
+ virtual MDiscovery* DiscoveryIF() = 0;
+
+ /**
+ * Returns settings interface
+ *
+ * @return Settings interface
+ */
+ virtual MPrintSettings* SettingsIF() = 0;
+
+ /**
+ * Returns print job interface
+ *
+ * @return Print job interface
+ */
+ virtual MPrintJob* PrintJobIF() = 0;
+
+ /**
+ * Restarts Engine
+ */
+ virtual void RestartEngine() = 0;
+
+ /**
+ * Returns Engine
+ */
+ virtual CImagePrint* Engine() = 0;
+
+ /**
+ * Returns Browser preview interface
+ */
+
+ /**
+ * Returns idle print event register interface
+ */
+ virtual MIdlePrintEventRegisterIF* IdlePrintEventRegisterIF() = 0;
+
+ /**
+ * Returns Interface to RImagePrintClient
+ * @return RImagePrintClient
+ */
+ virtual RImagePrintClient ImagePrintClient() = 0;
+
+ /**
+ * Returns information about application status
+ * @return TBool ETrue if application is already in use.
+ */
+ virtual TBool IsApplicationAlreadyInUse() = 0;
+
+ /**
+ * Returns Interface to print event catcher
+ * @return MPrintEventObserver
+ */
+ virtual MPrintEventObserver* PrintEventObserverIF() = 0;
+
+ /**
+ * Returns Interface to print event register interface
+ * @return MPrintEventRegisterIF
+ */
+ virtual MPrintEventRegisterIF* PrintEventRegisterIF() = 0;
+
+ protected: // Data
+
+ CImagePrintEngine* iPrintEngine;
+ };
+
+#endif // CIFFACTORY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cimageprint.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,89 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINT_H
+#define CIMAGEPRINT_H
+
+#include <e32base.h>
+#include <coemain.h>
+
+#include "rimageprintclient.h"
+#include "imageprint.h"
+
+class TPrintCapability;
+class TPrinter;
+class TEvent;
+class CIdleGuard;
+class CDiscoveryGuard;
+class CJobGuard;
+
+/**
+ * @brief Class containing the Image Print Library Public API.
+ */
+class CImagePrint : public CBase, public MCoeForegroundObserver
+ {
+ // Functions
+ public:
+ CImagePrint();
+ ~CImagePrint();
+ void ConnectL();
+ void Close();
+ TVersion Version();
+ TInt StartDiscoveryL(MPrinterDiscoveryObserver& aObserver, TUint aProtocols = 0);
+ TInt CancelDiscovery();
+ TInt CreatePrintJobL(TInt aPrinterID, RPointerArray<TDesC>& aImages, MPrintEventObserver& aObserver);
+ TInt SubmitPrintJobL();
+ TInt CancelPrintJob();
+ TInt ContinuePrintJobL();
+ TInt GetNumPrintPages();
+ TInt GetJobStatus();
+ TInt GetPrinterStatus(TInt aPrinterID);
+ TInt GetPrinterCapabilityIDsL(TInt aPrinterID, RArray<TInt>& aCapabilityIDs);
+ TInt GetPrinterCapabilityL(TInt aPrinterID, TInt aCapabilityID, TPrintCapability& aCapability);
+ TInt GetJobSetting(TInt aCapabilityID, TInt& aValue);
+ TInt SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability);
+ TInt GetNumPreviewPages();
+ TInt GetJobTemplateIconL(TInt aTemplateID, TInt& aFbsBitmapHandle);
+ TInt GetNumberOfCopies( RArray<TInt>& aArray );
+ TInt SetNumberOfCopies( const RArray<TInt>& aArray );
+ TInt CreatePreviewImage(TInt aPageNumber);
+ TInt RemoveCachedPrinterL(TInt aPrinterID);
+ TUint SupportedProtocols();
+ void RegisterIdleObserver(MIdleObserver *aObserver);
+
+ public: // From MCoeForegroundObserver
+ void HandleGainingForeground();
+ void HandleLosingForeground();
+
+ protected:
+ private:
+
+ // Data
+ public:
+ protected:
+ private:
+
+ RImagePrintClient iClient;
+ CIdleGuard* iIdleGuard;
+ CDiscoveryGuard* iDiscoveryGuard;
+ CJobGuard* iJobGuard;
+ };
+
+#endif // CIMAGEPRINT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cimageprintengine.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,130 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMAGEPRINTENGINE_H
+#define CIMAGEPRINTENGINE_H
+
+#include <e32def.h>
+#include <badesca.h>
+
+class CIFFactory;
+class CRepository;
+
+/**
+ *
+ * The main engine class, creates the factory that initializes the interface
+ * implementations and other instances
+ *
+ */
+class CImagePrintEngine
+ : public CBase
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aImageFiles The printed image files, ownership of the
+ * array is transferred. Can be also NULL at this
+ * stage
+ * @param aIdleObserver Observer to notify UI about idle events
+ *
+ * @return Initialized instance of CImagePrintEngine
+ */
+ IMPORT_C static CImagePrintEngine* NewL(
+ CDesCArrayFlat* aImageFiles );
+ IMPORT_C static CImagePrintEngine* NewLC(
+ CDesCArrayFlat* aImageFiles );
+
+ /**
+ * Destructor
+ */
+ virtual ~CImagePrintEngine();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Constructor
+ */
+ CImagePrintEngine();
+
+ /**
+ * Second phase constructor
+ *
+ * @param aImageFiles The printed image files, ownership of the
+ * array is transferred
+ * @param aIdleObserver Observer to notify UI about idle events
+ */
+ void ConstructL( CDesCArrayFlat* aImageFiles );
+
+ public: // New methods
+
+ /**
+ * Returns reference to the interface factory class that
+ * can be used to get the pointers to the concrete implementations
+ * of the mixin-interface classes
+ *
+ * @return Reference to the initialized interface factory
+ */
+ IMPORT_C CIFFactory& InterfaceFactory();
+
+ /**
+ * Sets the new image array. Ownership of the array is transferred
+ *
+ * @param aArray New array
+ */
+ IMPORT_C void SetImageArrayL( CDesCArrayFlat* aArray );
+
+ /**
+ * Returns the array of images
+ * @return array of images
+ */
+ IMPORT_C RPointerArray<TDesC>& FileArray();
+
+ /**
+ * Restarts Image Print engine by deleting and reconstructing it.
+ */
+ IMPORT_C void RestartEngine();
+
+
+ protected: // New methods
+
+ /**
+ * Creates new TFileName for file array
+ * @return pointer to new TFileName object
+ */
+ TFileName* CreateFileNameL();
+
+ protected: // Data
+
+ // Printed image files
+ CDesCArrayFlat* iFiles;
+
+ // RArray variant of the files for server
+ RPointerArray<TDesC> iFileArray;
+
+ // Factory
+ CIFFactory* iIFFactory;
+
+ // A Central Repository session
+ CRepository* iCRSession;
+ };
+
+#endif // CIMAGEPRINTENGINE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/clistcapability.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,60 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CLISTCAPABILITY_H
+#define CLISTCAPABILITY_H
+
+#include "cbasecapability.h"
+
+class CRealFactory;
+
+/**
+ *
+ * Capability type for list type of settings
+ *
+ */
+class CListCapability :
+ public CBaseCapability
+ {
+ public: // Constructors and destructors
+
+ CListCapability ( CRealFactory* aFactory );
+
+ /**
+ * Destructor
+ */
+ virtual ~CListCapability();
+
+ public: // Methods derived from CBaseCapability
+
+ virtual HBufC* ListBoxTextL();
+ virtual TBool LaunchPopupListL();
+ virtual CBaseCapability* CloneL();
+
+ public: // Data
+
+ // Enumeration IDs and the texts associated to the ids
+ RArray<TInt> iEnumIDs;
+ RPointerArray<HBufC> iTexts;
+
+ CRealFactory* iFactory; //not owned
+ };
+
+#endif // CLISTCAPABILITY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cpreviewinfo.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,70 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CPREVIEWINFO_H
+#define CPREVIEWINFO_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+#include "tpreviewimageinfo.h"
+
+/**
+ *
+ * Holds information of the preview of a single template
+ *
+ */
+class CPreviewInfo : public CBase
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Constructor
+ *
+ * @param aCapabilityUid Uid of the template
+ * @param aPaperLandscape Is paper drawn to landscape or not
+ */
+ CPreviewInfo( TInt aCapabilityUid, TBool aPaperLandscape );
+
+ /**
+ * Destructor
+ */
+ ~CPreviewInfo();
+
+ public: // data
+
+ // Paper in landscape format or not..
+ TBool iPaperLandscape;
+
+ // Template capability UID
+ TInt iUid;
+
+ // Used for sticker templates; one image per page, no matter
+ // how many image positions there will be per sheet
+ TBool iOneImagePerPage;
+
+ // Index of a background bitmap
+ TInt iBckgIndex;
+
+ // Pointers to the image information in the template
+ RPointerArray<TPreviewImageInfo> iImageInfo;
+ };
+
+#endif // CPREVIEWINFO_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cprinteventcatcher.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,121 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CPRINTEVENTCATCHER_H
+#define CPRINTEVENTCATCHER_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+#include "imageprint.h"
+#include "mprinteventregisterif.h"
+
+class CIFFactory;
+class CImagePrintEngine;
+class MPrintPreviewObserver;
+class MPrintJobStatus;
+
+// CLASS DEFINITION
+/**
+ *
+ * Image Print Server passes the notifications via single interface,
+ * which is implemented by CPrintEventCatcher. It receives the events
+ * and forwards them to the correct instances inside ImagePrintEngine.
+ *
+ */
+class CPrintEventCatcher :
+ public CBase,
+ public MPrintEventObserver,
+ public MPrintEventRegisterIF
+ {
+ public: // Construction and destruction
+
+ /**
+ * Two phase constructor
+ *
+ * @param aFactory The factory
+ * @param aEngine The image print engine
+ * @return Initialized instance of the engine
+ */
+ static CPrintEventCatcher* NewL(
+ CIFFactory* aFactory, CImagePrintEngine* aEngine );
+ static CPrintEventCatcher* NewLC(
+ CIFFactory* aFactory, CImagePrintEngine* aEngine );
+
+ /**
+ * Destructor
+ */
+ virtual ~CPrintEventCatcher();
+
+ private: // Construction and destruction
+
+ /**
+ * Constructor
+ *
+ * @param aFactory The factory
+ * @param aEngine The image print engine
+ */
+ CPrintEventCatcher( CIFFactory* aFactory, CImagePrintEngine* aEngine );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+ public: // Methods derived from MPrintEventObserver
+
+ void PrintJobProgressEvent( TInt aStatus, TInt aPercentCompletion,
+ TInt aJobStateCode );
+ void PrintJobErrorEvent( TInt aError, TInt aErrorStringCode );
+ void PrinterStatusEvent( TInt aError, TInt aErrorStringCode );
+ void PreviewImageEvent( TInt aFsBitmapHandle );
+ void ShowMessageL( TInt aMsgLine1Code, TInt aMsgLine2Code );
+ TBool AskYesNoQuestionL( TInt aMsgLine1Code, TInt aMsgLine2Code );
+ const TDesC& AskForInputL( TInt aMsgLine1Code, TInt aMsgLine2Code );
+
+ public: // from MPrintEventRegisterIF
+
+ void RegisterObserver( MPrintJobStatus* aObserver );
+ void UnRegisterObserver( MPrintJobStatus* aObserver );
+
+ public: // New methods
+
+ /**
+ * Sets the new preview observer, which will receive the
+ * print preview rendering events
+ *
+ * @param aObserver Print preview observer
+ */
+ void SetPreviewObserver( MPrintPreviewObserver* aObserver );
+
+ private: // Data
+
+ CIFFactory* iFactory;
+ CImagePrintEngine* iEngine;
+
+ // Preview observer
+ MPrintPreviewObserver* iPreviewObserver;
+
+ // Print job observer
+ RPointerArray<MPrintJobStatus> iObservers;
+ };
+
+
+#endif // CPRINTEVENTCATCHER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cprintjobmanager.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,145 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CPRINTJOBMANAGER_H
+#define CPRINTJOBMANAGER_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+#include "mprintjob.h"
+#include "mprintjobstatus.h"
+
+class MPrintJobObserver;
+class CImagePrint;
+class CImagePrintEngine;
+class CRealFactory;
+
+/**
+ *
+ * Print job manager - handels the creation of print jobs and the
+ * printing process
+ *
+ */
+class CPrintJobManager
+ : public CBase,
+ public MPrintJob,
+ public MPrintJobStatus
+ {
+ public: // Construction and destruction
+
+ /**
+ * Two phase constructor
+ *
+ * @param aFactory Factory class
+ * @param aDLLEngine DLL engine
+ *
+ * @return Initialized instance
+ */
+ static CPrintJobManager* NewL( CRealFactory* aFactory,
+ CImagePrintEngine* aDLLEngine );
+ static CPrintJobManager* NewLC( CRealFactory* aFactory,
+ CImagePrintEngine* aDLLEngine );
+
+ /**
+ * Destructor
+ */
+ virtual ~CPrintJobManager();
+
+ private: // Construction and destruction
+
+ /**
+ * Constuctor
+ *
+ * @param aFactory Factory class
+ * @param aDLLEngine DLL engine
+ */
+ CPrintJobManager( CRealFactory* aFactory,
+ CImagePrintEngine* aDLLEngine );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+ public: // Methods derived from MPrintJob
+
+ void PrintL( MPrintJobObserver* aObserver );
+ void CancelL();
+ void GetPrintJobL( RPointerArray<TDesC>& aImages );
+
+ public: // Methods derived from MPrintJobStatus
+
+ void PrintJobProgress( TInt aStatus, TInt aPercentCompletion,
+ TInt aJobStateCode );
+ void PrintJobError( TInt aError, TInt aErrorStringCode );
+ void PrinterStatus( TInt aError, TInt aErrorStringCode );
+
+ public: // New methods
+
+ /**
+ * Creates the print job but does not submit it
+ *
+ * @param aPrinterId The ID of the printer which will be used
+ */
+ TInt CreatePrintJobL( TInt aPrinterId );
+
+ /**
+ * Returns if the printing has been activated
+ *
+ * @return state of printing
+ */
+ TBool IsPrinting() const;
+
+ private: // Enumeration
+
+ // Print progress status
+ enum TPrintProgressStatus
+ {
+ EActive,
+ ECompleted
+ };
+
+ private: // Data
+
+ // Instance of the factory class
+ CRealFactory* iFactory;
+
+ // Main class of this DLL
+ CImagePrintEngine* iDLLEngine;
+
+ // Print job observer
+ MPrintJobObserver* iObserver;
+
+ // Synchronous wait system for cancellation
+ CActiveSchedulerWait iWait;
+
+ // Status flags
+ TBool iPrintingOnGoing;
+ TBool iCancelling;
+
+ // Chosen printer
+ TInt iPrinterUid;
+
+ // Images from current job
+ RPointerArray<HBufC> iImages;
+ };
+
+#endif // CPRINTJOBMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/cprintsettings.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,59 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CPRINTSETTINGS_H
+#define CPRINTSETTINGS_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+class CBaseCapability;
+
+/**
+ *
+ * Interface to use the device discovery functionality of Image Print Engine
+ *
+ */
+class CPrintSettings
+ : public CBase
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Constructor
+ */
+ CPrintSettings();
+
+ /**
+ * Destructor
+ */
+ virtual ~CPrintSettings();
+
+ public: // New methods
+
+ CPrintSettings* CloneL();
+
+ public: // Data
+
+ // Capability list
+ RPointerArray<CBaseCapability> iCapabilities;
+ };
+
+#endif // CPRINTSETTINGS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/crealfactory.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,127 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CREALFACTORY_H
+#define CREALFACTORY_H
+
+#include <e32def.h>
+
+#include "ciffactory.h"
+#include "rimageprintclient.h"
+
+class CImagePrint;
+class CDiscoveryManager;
+class CPrintEventCatcher;
+class CPrintJobManager;
+class CSettingsManager;
+class MIdlePrintEventObserver;
+class CIdlePrintEventCatcher;
+
+// CLASS DEFINITION
+/**
+ *
+ * Factory class for creating concrete interface classes for the UI
+ *
+ */
+class CRealFactory
+ : public CIFFactory
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aEngine Pointer to Image Printing Engine class instanace
+ *
+ * @return Initialized instance of this factory
+ */
+ static CRealFactory* NewL( CImagePrintEngine* aEngine );
+
+ /**
+ * Destructor
+ */
+ virtual ~CRealFactory();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Constructor
+ */
+ CRealFactory( CImagePrintEngine* aEngine );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL( );
+
+ public: // Methods derived from CIFFactory
+
+ // The factory methods that return each of the interfaces
+ virtual MDiscovery* DiscoveryIF();
+ virtual MPrintSettings* SettingsIF();
+ virtual MPrintJob* PrintJobIF();
+ virtual MIdlePrintEventRegisterIF* IdlePrintEventRegisterIF();
+ virtual RImagePrintClient ImagePrintClient();
+ virtual TBool IsApplicationAlreadyInUse();
+ virtual MPrintEventObserver* PrintEventObserverIF();
+ virtual MPrintEventRegisterIF* PrintEventRegisterIF();
+ // Method for restarting Image Print Engine
+ virtual void RestartEngine();
+
+ public: // New methods
+
+ /**
+ * Returns Engine
+ *
+ * @return Engine
+ */
+ CImagePrint* Engine();
+
+ /**
+ * Returns if the printing has been activated
+ *
+ * @return state of printing
+ */
+ TBool IsPrinting() const;
+
+ protected: // Data
+
+ // The actual printin engine
+ CImagePrint* iImageServer;
+
+ // Discovery manager
+ CDiscoveryManager* iDiscoveryMgr;
+
+ // Print job manager
+ CPrintJobManager* iPrintJobMgr;
+
+ // Settings manager
+ CSettingsManager* iSettingsMgr;
+
+ // Print event catcher - listens to events coming from the server
+ CPrintEventCatcher* iEventCatcher;
+
+ // Idle event catcher for idle events
+ CIdlePrintEventCatcher* iIdleEventCatcher;
+
+ RImagePrintClient iImagePrintClient;
+ };
+
+#endif // CREALFACTORY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/csettingsmanager.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,182 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CSETTINGSMANAGER_H
+#define CSETTINGSMANAGER_H
+
+#include <e32base.h>
+#include <f32file.h>
+
+#include "mprintsettings.h"
+
+class CImagePrint;
+class CRealFactory;
+class CRepository;
+
+/**
+ *
+ * Settings manager handles and modifies the capabilities
+ *
+ */
+class CSettingsManager
+ : public CBase,
+ public MPrintSettings
+ {
+ public: // Construction and destruction
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aFactory Pointer to factory
+ * @return Initialized instance of the class
+ */
+ static CSettingsManager* NewL(
+ CRealFactory* aFactory );
+ static CSettingsManager* NewLC(
+ CRealFactory* aFactory );
+
+ /**
+ * Destructor
+ */
+ ~CSettingsManager();
+
+ private: // Construction and destruction
+
+ /**
+ * Constructor
+ *
+ * @param aFactory Pointer to factory
+ */
+ CSettingsManager( CRealFactory* aFactory );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+ public: // Methods derived from MPrintSettings
+
+ CTemplateSettings* TemplateSettingsL();
+ void SetActiveTemplateL( TUint aUid );
+ TUint NumOfPagesL();
+ TInt NumberOfCopies( RArray<TInt>& aArray );
+ TInt NumberOfCopies( TInt& aNumberOfCopies, TInt aIndex );
+ TInt SetNumberOfCopiesL( const RArray<TInt>& aArray );
+ TInt UpdateNumberOfCopiesToServer();
+ TBool IsMMC();
+ void SetActivePageL( TUint aActivePage );
+ TUint CurActivePageL();
+ CPrintSettings* PrinterSettingsL();
+ void SetPrinterSettingsL( CPrintSettings& aSettings );
+ TInt SetPrinterSettingL( CBaseCapability& aCapab );
+ TInt TemplateUid();
+ TBool UpdatePageNumberL( TInt aCurrentImage );
+ TInt PrinterUid();
+ void SetUsbState( TBool aConnected );
+ TBool GetUsbState();
+ TInt GetDefaultPrinterProtocol();
+ TInt SetDefaultPrinterProtocol( TInt aProtocol );
+ TInt GetCurrentPrinterProtocol();
+ void SetCurrentPrinterProtocol( TInt aProtocol );
+ TUint GetCurrentPrinterVendor();
+ void SetCurrentPrinterVendor( TUint aVendor );
+ TInt GetDefaultPrintID();
+ TInt SetDefaultPrinterID( TInt aId );
+ HBufC* GetDefaultPrinterNameLC();
+ TInt SetDefaultPrinterNameL( const TDesC& aPrinterName );
+ HBufC* GetCurrentPrinterName();
+ TInt SetCurrentPrinterName( const TDesC& aPrinterName );
+ HBufC* GetCurrentPaperSizeTextL();
+
+ public: // New methods
+
+ /**
+ * Initializes settings after successfully creating a print job
+ *
+ * @param aPrinterUid Printer UID for the capability fetching
+ * @param aMMCUid MMC printer UID if available
+ */
+ void InitSettingsL( TInt aPrinterUid, TInt aMMCUid );
+
+ /**
+ * Fetches the correct capability, leaves if cannot find the capapbility
+ *
+ * @param aUid Uid of the fetched capability
+ * @return The capability
+ */
+ CBaseCapability* FetchCapabilityL( TInt aUid );
+
+ private: // New methods
+
+ /**
+ * Initializes capabilities
+ *
+ * @param aPrinterUid Printer UID for the capability fetching
+ */
+ void InitCapabilitiesL( TInt aPrinterUid );
+
+ /**
+ * Initializes template settings
+ */
+ void InitTemplateSettingsL();
+
+ private: // Data
+
+ // Pointer to factory and Image Print Server
+ CRealFactory* iFactory;
+
+ // Printer and template settings
+ CTemplateSettings* iTemplateSettings;
+ CPrintSettings* iPrintSettings;
+
+ // Active printer Uid from from Print Server
+ TInt iPrinterUid;
+
+ // Current active page
+ TUint iActivePage;
+
+ // MMC Uid
+ TInt iMMCUid;
+
+ // Images on page is dependent on the current template
+ TInt iImagesOnPage;
+
+ // USB connection state
+ TBool iUsbConnected;
+
+ // A Central Repository session
+ CRepository* iCRSession;
+
+ // printer brand
+ TUint iVendor;
+
+ // Current printer protocol
+ TInt iCurrentPrinterProtocol;
+
+ // Current printet name
+ HBufC* iCurrentPrinterName;
+
+ // Number of copies array
+ RArray<TInt> iNumberOfCopiesArray;
+ RArray<TInt> iNumberOfCopiesCumulativeArray;
+
+ };
+
+#endif // CSETTINGSMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/ctemplatedata.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CTEMPLATEDATA_H
+#define CTEMPLATEDATA_H
+
+#include <e32std.h>
+#include <fbs.h>
+
+/**
+ *
+ * Encapsulates the data of a single template
+ *
+ */
+class CTemplateData
+ : public CBase
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Standard two-phase constructor
+ */
+ static CTemplateData* NewLC();
+
+ /**
+ * Standard two-phase constructor
+ */
+ static CTemplateData* NewL();
+
+ /**
+ * Destructor
+ */
+ virtual ~CTemplateData();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Constructor
+ */
+ CTemplateData();
+
+ public: // New methods
+
+ /**
+ * Clones the template data and returns it
+ *
+ * @return cloned instance of the template data class instance
+ */
+ CTemplateData* CloneL();
+
+ public: // Data
+
+ // Uid for the template, passed to the
+ // engine, when the template is activated on
+ // print preview
+ TInt iUid;
+ };
+
+#endif // CTEMPLATEDATA_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/ctemplatesettings.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,88 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CTEMPLATESETTINGS_H
+#define CTEMPLATESETTINGS_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+class CTemplateData;
+class CRealFactory;
+
+/**
+ *
+ * Encapsulates the complete set of templates
+ *
+ */
+class CTemplateSettings
+ : public CBase
+ {
+ public: // Constuctors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @return Initialized instance of itself
+ */
+ static CTemplateSettings* NewL( CRealFactory* afactory );
+ static CTemplateSettings* NewLC( CRealFactory* afactory );
+
+ /**
+ * Destructor
+ */
+ virtual ~CTemplateSettings();
+
+ protected: // Constuctors and destructors
+
+ /**
+ * Constructor
+ */
+ CTemplateSettings( CRealFactory* afactory );
+
+ public: // New methods
+
+ /**
+ * Clones current template settings
+ *
+ * @return cloned instance
+ */
+ CTemplateSettings* CloneL();
+
+ /**
+ * Sets new active template, leaves on error
+ *
+ * @param aUid Uid of the new active template
+ */
+ void SetActiveTemplateL( TInt aUid );
+
+ public: // Data
+
+ // Set of templates
+ RPointerArray<CTemplateData> iTemplates;
+
+ // Currently active template
+ TUint iActiveTemplateUid;
+
+ //Pointer to interface factory
+ CRealFactory* iFactory;
+ };
+
+#endif // CTEMPLATESETTINGS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/ctintcapability.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CTINTCAPABILITY_H
+#define CTINTCAPABILITY_H
+
+#include "cbasecapability.h"
+
+/**
+ *
+ * Capability type for TInt type of settings
+ *
+ */
+class CTIntCapability :
+ public CBaseCapability
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Destructor
+ */
+ virtual ~CTIntCapability();
+
+ public: // Methods derived from CBaseCapability
+
+ virtual HBufC* ListBoxTextL();
+ virtual TBool LaunchPopupListL();
+ virtual CBaseCapability* CloneL();
+
+ public: // Data
+
+ // Minimum and maximum value
+ TInt iMin;
+ TInt iMax;
+ };
+
+#endif // CTINTCAPABILITY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/imageprintprivatecrkeys.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTPRIVATECRKEYS_H
+#define IMAGEPRINTPRIVATECRKEYS_H
+
+// =============================================================================
+// ImagePrint API
+// =============================================================================
+const TUid KCRUidImagePrint = { 0x10208A35 };
+
+/**
+ * Default Printer Protocol
+ */
+const TUint32 KDefaultPrinterProtocol = 0x00000001;
+
+/**
+ * Current Printer Protocol
+ */
+const TUint32 KCurrentPrinterProtocol = 0x00000002;
+
+/**
+ * Default Printer ID
+ */
+const TUint32 KDefaultPrinterID = 0x00000003;
+
+/**
+ * Default Printer Name
+ */
+const TUint32 KDefaultPrinterName = 0x00000004;
+
+#endif // IMAGEPRINTPRIVATECRKEYS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mbrowserpreviewobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MBROWSERPREVIEWOBSERVER_H
+#define MBROWSERPREVIEWOBSERVER_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Observer class that will get notification message when the print preview
+ * is ready
+ *
+ */
+class MBrowserPreviewObserver
+ {
+ public:
+
+ /**
+ * Gets called when the print server has finished the generation
+ * of preview bitmap
+ *
+ * @param aHandle Handle to the FBS bitmap
+ */
+ virtual void PreviewBitmapReady( TInt aHandle ) = 0;
+
+ virtual TPoint DefaultThumbnailPosition() = 0;
+
+ virtual TSize ThumbnailSize() = 0;
+
+ virtual TInt CursorStep() = 0;
+
+ virtual TSize BrowserPaneSize() = 0;
+
+ };
+
+#endif // MBROWSERPREVIEWOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mdiscovery.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,89 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MDISCOVERY_H
+#define MDISCOVERY_H
+
+#include <e32def.h>
+
+class MDiscoveryObserver;
+
+/**
+ *
+ * Interface to use the device discovery functionality of Image Print Engine
+ *
+ */
+class MDiscovery
+ {
+ public: // Abstract methods
+
+ /**
+ * Initializes and starts the device discovery. Engine notifies
+ * about the found devices through device observer interface.
+ * Asynchronous service.
+ *
+ * @param aNotifier an object that implements the observer IF
+ * @param aProtocol Which protocol should be used in discovery,
+ * zero if all of them
+ */
+ virtual void StartDeviceDiscoveryL(
+ MDiscoveryObserver* aNotifier, TUint aProtocol ) = 0;
+
+ /**
+ * Returns supported protocols
+ *
+ * @return supported protocols
+ */
+ virtual TUint SupportedProtocols() = 0;
+
+ /**
+ * Cancels the device discovery process. The discovery is cancelled
+ * and the observer receives error code KErrCancel.
+ * Asynchronous service.
+ */
+ virtual void CancelDeviceDiscoveryL() = 0;
+
+ /**
+ * Chooses the printer based on its UID and locks it for the
+ * application.
+ * Synchronous service.
+ *
+ * @param aPrinterUid Uid of the chosen printer
+ * @return Boolean value. If ETrue, the search will continue (user
+ * has selected 'Wireless Printers' or such)
+ */
+ virtual TInt ChoosePrinterL( TInt aPrinterUid ) = 0;
+
+ /**
+ * PictBridge USB mode checker
+ * @return TInt value more than 0, if PictBridge USB mode is on;
+ * 0 if off; negative value if error.
+ */
+ virtual TInt IsPictBridgeMode() = 0;
+
+ /**
+ * Removes the current discover observer.
+ * Used for special cases where the observer object
+ * is destroyed while still being the current observer.
+ */
+ virtual void RemoveDiscoveryObserver() = 0;
+ };
+
+#endif // MDISCOVERY_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mdiscoveryobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,83 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MDISCOVERYOBSERVER_H
+#define MDISCOVERYOBSERVER_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+/**
+ *
+ * Interface used to notify UI about the found devices and error
+ *
+ */
+class MDiscoveryObserver
+ {
+ public: // Enumerations
+
+ enum TPrinterType
+ {
+ EBPP,
+ EMMC,
+ EUSB,
+ EOPP,
+ EWLAN,
+ ENOPRINTER
+ };
+
+ public: // Abstract methods
+
+ /**
+ * Notification of new print device
+ *
+ * @param aText Textual description of the new print device.
+ * Ownership is not transferred
+ * @param aUid Uid that is associated with the print device
+ * @param aCached Is the printer cached or not?
+ * @param aType Type of the printer
+ * @param aVendor Printer vendor
+ */
+ virtual void NotifyNewPrintDeviceL( HBufC* aText, TInt aUid,
+ TBool aCached, TPrinterType aType,
+ TUint aVendor ) = 0;
+
+ /**
+ * Notification of error / cancellation of the sequence.
+ * Device discovery process is cancelled
+ *
+ * @param aErrCode Error code
+ */
+ virtual void DiscoveryError( TInt aErrCode ) = 0;
+
+ /**
+ * Notifies completion of the device discovery.
+ */
+ virtual void DeviceDiscoveryCompleted() = 0;
+
+ /**
+ * Removes cached printer as it is not found
+ *
+ * @param aUid Uid that is associated with the print device
+ */
+ virtual void RemoveCachedPrinterL( TInt aUid ) = 0;
+ };
+
+#endif // MDISCOVERYOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/midleprinteventobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MIDLEPRINTEVENTOBSERVER_H
+#define MIDLEPRINTEVENTOBSERVER_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+enum TImgPrintUSBState
+ {
+ EUSBUndefined = 0,
+ EUSBConnected,
+ ENOUSBEvent
+ };
+
+// CLASS DEFINITION
+/**
+ *
+ * Interface to notify UI about idle state events
+ *
+ */
+class MIdlePrintEventObserver
+ {
+ public: // Abstract methods
+
+ /**
+ * Called when usb printer is disconnected
+ */
+ virtual void UsbPrinterDisconnected() = 0;
+
+ /**
+ * Called when usb printer is connected
+ */
+ virtual void UsbPrinterConnected() = 0;
+
+ /**
+ * Notifies about USB state changes. Method is also used for other events
+ * @param aState information about usb state
+ */
+ virtual void UsbStateChanged( TImgPrintUSBState aState, TInt aError ) = 0;
+
+ virtual void ReadyToContinue() = 0;
+
+ /**
+ * Notifies that there's happened an asynchronous leave in server process,
+ * which in practice means that any ongoing printing should be cancelled
+ *
+ * @param aError leave code
+ */
+ virtual void AsynchronousServerLeave( TInt aError ) = 0;
+ };
+
+#endif // MIDLEPRINTEVENTOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/midleprinteventregisterif.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,58 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MIDLEPRINTEVENTREGISTERIF_H
+#define MIDLEPRINTEVENTREGISTERIF_H
+
+#include <e32def.h>
+
+class MIdlePrintEventObserver;
+
+/**
+ *
+ * Interface to use the idle print event functionality of Image Print Engine
+ *
+ */
+class MIdlePrintEventRegisterIF
+ {
+ public: // Abstract methods
+
+
+ /**
+ * Registers class to IdlePrintEventObserver. After registration
+ * the class receives idle events
+ *
+ * @param aIdleObserver class that wants to register
+ *
+ */
+ virtual void RegisterObserver( MIdlePrintEventObserver* aIdleObserver ) = 0;
+
+ /**
+ * Unregisters class from IdlePrintEventObserver. After unregistration
+ * the class stops receiving idle events. Class is also deleted from observer
+ * array.
+ *
+ * @param aIdleObserver class that wants to unregister
+ *
+ */
+ virtual void UnRegisterObserver( MIdlePrintEventObserver* aIdleObserver ) = 0;
+ };
+
+#endif // MIDLEPRINTEVENTREGISTERIF_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mprinteventregisterif.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,59 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTEVENTREGISTERIF_H
+#define MPRINTEVENTREGISTERIF_H
+
+#include <e32def.h>
+
+class MIdlePrintEventObserver;
+class MPrintJobStatus;
+
+/**
+ *
+ * Interface to use the print event functionality of Image Print Engine
+ *
+ */
+class MPrintEventRegisterIF
+ {
+ public: // Abstract methods
+
+
+ /**
+ * Registers class to PrintEventObserver. After registration
+ * the class receives events
+ *
+ * @param aObserver class that wants to register
+ *
+ */
+ virtual void RegisterObserver( MPrintJobStatus* aObserver ) = 0;
+
+ /**
+ * Unregisters class from PrintEventObserver. After unregistration
+ * the class stops receiving events. Class is also deleted from observer
+ * array.
+ *
+ * @param aIdleObserver class that wants to unregister
+ *
+ */
+ virtual void UnRegisterObserver( MPrintJobStatus* aObserver ) = 0;
+ };
+
+#endif // MPRINTEVENTREGISTERIF_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mprintjob.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTJOB_H
+#define MPRINTJOB_H
+
+#include <e32def.h>
+#include <e32base.h>
+
+class MPrintJobObserver;
+
+/**
+ *
+ * Interface to manage the printing
+ *
+ */
+class MPrintJob
+ {
+ public: // Abstract methods
+
+ /**
+ * Starts printing images with selected settings, template and printer.
+ * If this method does not leave, the printing has started. Further messages
+ * about printing progress are passed through MPrintJobObserver
+ * Asynchronous
+ *
+ * @param aObserver Pointer to the observer class that handles the
+ */
+ virtual void PrintL( MPrintJobObserver* aObserver ) = 0;
+
+ /**
+ * Cancels the active print job. The cancellation is finished, when
+ * MPrintJobObserver receives error event with error code KErrCancel
+ * Asynchronous
+ */
+ virtual void CancelL() = 0;
+
+ /**
+ * Get all the images from current print job.
+ *
+ * @param aImages An array, in which the printed images are added.
+ */
+ virtual void GetPrintJobL( RPointerArray<TDesC>& aImages ) = 0;
+
+ };
+
+#endif // MPRINTJOB_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mprintjobobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTJOBOBSERVER_H
+#define MPRINTJOBOBSERVER_H
+
+#include <e32def.h>
+
+/**
+ *
+ * Interface used to notify UI about the print progress
+ *
+ */
+class MPrintJobObserver
+ {
+ public: // Abstract methods
+
+ /**
+ * Notificiation of the printed page
+ *
+ * @param aPercentageComplete The percentage completed
+ */
+ virtual void PrintProgress( TUint aPercentageComplete ) = 0;
+
+ /**
+ * Printing finished
+ */
+ virtual void JobFinished() = 0;
+
+ /**
+ * Error during printing - the current job is cancelled
+ *
+ * @param aErrorCode The error code
+ * @param aErrorStringCode The more detailed error string
+ */
+ virtual void JobError( TInt aErrorCode, TInt aErrorStringCode ) = 0;
+
+ /**
+ * Minor error during printing, print process is NOT cancelled
+ *
+ * @param aErrorCode The error code
+ * @param aErrorStringCode The more detailed error string
+ */
+ virtual void JobStatusEvent( TInt aErrorCode, TInt aErrorStringCode ) = 0;
+ };
+
+#endif // MPRINTJOBOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mprintjobstatus.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,64 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTJOBSTATUS_H
+#define MPRINTJOBSTATUS_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Internal mixin-class for CPrintEventCatcher to notify the status
+ * of the print job
+ *
+ */
+class MPrintJobStatus
+ {
+ public:
+
+ /**
+ * Used to notify the status of the print job
+ *
+ * @param aStatus Possible TInt codes can mean (active, done)
+ * @param aPercentCompletion 0%-100% of the print job completed
+ * @param aJobStateCode Enumeration code for the Job State String
+ */
+ virtual void PrintJobProgress( TInt aStatus, TInt aPercentCompletion,
+ TInt aJobStateCode ) = 0;
+
+ /**
+ * Used to notify occured error during the job
+ *
+ * @param aError The error code
+ * @param aErrorStringCode More detailed error string
+ */
+ virtual void PrintJobError( TInt aError, TInt aErrorStringCode ) = 0;
+
+ /**
+ * Printer status is obtained through this interface, usually the
+ * suspend errors are notified using this method
+ *
+ * @param aError The error code
+ * @param aErrorStringCode Error string code
+ */
+ virtual void PrinterStatus( TInt aError, TInt aErrorStringCode ) = 0;
+ };
+
+#endif // MPRINTJOBSTATUS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mprintpreviewobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTPREVIEWOBSERVER_H
+#define MPRINTPREVIEWOBSERVER_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Observer class that will get notification message when the print preview
+ * is ready
+ *
+ */
+class MPrintPreviewObserver
+ {
+ public:
+
+ /**
+ * Gets called when the print server has finished the generation
+ * of preview bitmap
+ *
+ * @param aHandle Handle to the FBS bitmap
+ */
+ virtual void PreviewBitmapReady( TInt aHandle,
+ TBool aPaperLandscape ) = 0;
+
+ virtual TSize PaperSizeLandscape() = 0;
+
+ virtual TSize PaperSizePortrait() = 0;
+
+ virtual TPoint PaperPositionLanscape() = 0;
+
+ virtual TPoint PaperPositionPortrait() = 0;
+
+ };
+
+#endif // MPRINTPREVIEWOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/mprintsettings.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,254 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPRINTSETTINGS_H
+#define MPRINTSETTINGS_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+class CTemplateSettings;
+class CPrintSettings;
+class CBaseCapability;
+
+/**
+ *
+ * Interface to use the device discovery functionality of Image Print Engine
+ *
+ */
+class MPrintSettings
+ {
+ public: // Abstract methods
+
+ /**
+ * Fetches the available template icons and UIDs associated to
+ * the selected. Leaves on error.
+ * Synchonours
+ *
+ * @return The current settings, ownership is transferred
+ */
+ virtual CTemplateSettings* TemplateSettingsL() = 0;
+
+ /**
+ * Sets the active UID. If this succeeds, the preview bitmap
+ * needs to be updated on UI. Also the amount of pages need
+ * to be queried again.
+ * Synchronous
+ *
+ * @param aUid Uid of the activated template
+ */
+ virtual void SetActiveTemplateL( TUint aUid ) = 0;
+
+ /**
+ * Returns the number of pages with the current template/image
+ * selection.
+ * Synchronous
+ *
+ * @return Number of pages
+ */
+ virtual TUint NumOfPagesL() = 0;
+
+ /**
+ * Returns the number of copies value
+ * Synchronous
+ *
+ * @return Number of Copies
+ */
+ virtual TInt NumberOfCopies( RArray<TInt>& aArray ) = 0;
+
+ /**
+ * Returns the number of copies value
+ * Synchronous
+ *
+ * @return Number of Copies
+ */
+ virtual TInt NumberOfCopies( TInt& aNumberOfCopies, TInt aIndex ) = 0;
+
+ /**
+ * Sets the number of copies value for each image
+ * Synchronous
+ */
+ virtual TInt SetNumberOfCopiesL( const RArray<TInt>& aArray ) = 0;
+
+ virtual TInt UpdateNumberOfCopiesToServer() = 0;
+
+ /**
+ * Checks if the user has selected MMC printing
+ * Synchronous
+ *
+ * @return Boolean value to match
+ */
+ virtual TBool IsMMC() = 0;
+
+ /**
+ * Sets the active preview page on display. If this succeeds, the
+ * preview bitmap needs to be updated on UI,
+ * Synchronous
+ *
+ * @param aActivePage New active page
+ */
+ virtual void SetActivePageL( TUint aActivePage ) = 0;
+
+ /**
+ * Returns current active page
+ * Synchronous
+ *
+ * @return Current active page
+ */
+ virtual TUint CurActivePageL() = 0;
+
+ /**
+ * Fetch printer capabilities and current settings
+ * Synchronous
+ *
+ * @return Printer's capabilities, ownership changes
+ */
+ virtual CPrintSettings* PrinterSettingsL() = 0;
+
+ /**
+ * Sets new settings for the print job
+ * Synchronous
+ *
+ * @param aSettings New set of settings
+ */
+ virtual void SetPrinterSettingsL( CPrintSettings& aSettings ) = 0;
+
+ /**
+ * Sets a single setting for the print job
+ * Synchronous
+ *
+ * @param aCapab Capability to be changed
+ * @return If return value == 0 then new settings should be
+ * fetched using PrinterSettingsL() and the UI must
+ * be updated
+ */
+ virtual TInt SetPrinterSettingL( CBaseCapability& aCapab ) = 0;
+
+ /**
+ * Returns the UID of the currently selected template
+ *
+ * @return Tint UID
+ */
+ virtual TInt TemplateUid() = 0;
+
+ // Called when template OR current image is changed
+ virtual TBool UpdatePageNumberL( TInt aCurrentImage ) = 0;
+ virtual TInt PrinterUid() = 0;
+
+ /**
+ * Sets the current usb connection state
+ *
+ * @param aConnected Connection state
+ */
+ virtual void SetUsbState( TBool aConnected ) = 0;
+
+ /**
+ * Gets the current usb connection state
+ *
+ * @return Connection state
+ */
+ virtual TBool GetUsbState() = 0;
+
+ /**
+ * Default printer protocol getter
+ * @return protocol number or KErrNotFound
+ */
+ virtual TInt GetDefaultPrinterProtocol() = 0;
+
+ /**
+ * Default printer protocol setter
+ * @param aProtocol protocol number
+ * @return error code, KErrNone if OK
+ */
+ virtual TInt SetDefaultPrinterProtocol( TInt aProtocol ) = 0;
+
+ /**
+ * Current printer protocol getter
+ * @return protocol number or KErrNotFound
+ */
+ virtual TInt GetCurrentPrinterProtocol() = 0;
+
+ /**
+ * Current printer protocol setter
+ * @param aProtocol protocol number
+ * @return error code, KErrNone if OK
+ */
+ virtual void SetCurrentPrinterProtocol( TInt aProtocol ) = 0;
+
+ /**
+ * Current printer brand getter
+ * @return current printer brand id
+ */
+ virtual TUint GetCurrentPrinterVendor() = 0;
+
+ /**
+ * Current printer brand setter
+ * @param aVendor printer brand
+ */
+ virtual void SetCurrentPrinterVendor( TUint aVendor ) = 0;
+
+ /**
+ * Default printer id getter
+ * @return printer id or KErrNotFound
+ */
+ virtual TInt GetDefaultPrintID() = 0;
+
+ /**
+ * Default printer protocol setter
+ * @param aId printer id
+ * @return error code, KErrNone if OK
+ */
+ virtual TInt SetDefaultPrinterID( TInt aId ) = 0;
+
+ /**
+ * Default printer name getter
+ * @return printer name
+ */
+ virtual HBufC* GetDefaultPrinterNameLC() = 0;
+
+ /**
+ * Default printer name setter
+ * @param aPrinterName printer name
+ * @return error code, KErrNone if OK
+ */
+ virtual TInt SetDefaultPrinterNameL( const TDesC& aPrinterName ) = 0;
+
+ /**
+ * Current printer name getter
+ * @return printer name
+ */
+ virtual HBufC* GetCurrentPrinterName() = 0;
+
+ /**
+ * Current printer name setter
+ * @param aPrinterName printer name
+ * @return error code, KErrNone if OK
+ */
+ virtual TInt SetCurrentPrinterName( const TDesC& aPrinterName ) = 0;
+
+ /**
+ * Current paper size text getter
+ * @Return paper size text
+ */
+ virtual HBufC* GetCurrentPaperSizeTextL() = 0;
+
+ };
+
+#endif // MPRINTSETTINGS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/settingsconverter.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef SETTINGSCONVERTER_H
+#define SETTINGSCONVERTER_H
+
+#include <e32std.h>
+
+class CTIntCapability;
+class CListCapability;
+class CFloatCapability;
+class TPrintCapability;
+class CRealFactory;
+
+/**
+ *
+ * Utility class for converting capabilities to correct format
+ *
+ */
+class SettingsConverter
+ {
+ public:
+
+ /**
+ * Converts TCapability to CTIntCapability
+ *
+ * @param aCapability Capability coming from the engine
+ * @param aIndexOnList Capability's index on the list box
+ * @param aCapabUid Capability's UID
+ * @return Initialized CTIntCapability instance
+ */
+ static CTIntCapability* AddTIntCapabilityLC(
+ TPrintCapability& aCapability, TInt aIndexOnList, TInt aCapabUid );
+
+ /**
+ * Converts TCapability to CListCapability
+ *
+ * @param aCapability Capability coming from the engine
+ * @param aIndexOnList Capability's index on the list box
+ * @param aCapabUid Capability's UID
+ * @return Initialized CListCapability instance
+ */
+ static CListCapability* AddListCapabilityLC(
+ TPrintCapability& aCapability, TInt aIndexOnList, TInt aCapabUid,
+ CRealFactory* aFactory );
+
+ /**
+ * Converts TCapability to CFloatCapability
+ *
+ * @param aCapability Capability coming from the engine
+ * @param aIndexOnList Capability's index on the list box
+ * @param aCapabUid Capability's UID
+ * @return Initialized CFloatCapability instance
+ */
+ static CFloatCapability* AddFloatCapabilityLC(
+ TPrintCapability& aCapability, TInt aIndexOnList, TInt aCapabUid );
+
+ private:
+
+ /**
+ * Creates text string from the enumeration ID
+ *
+ * @param aId Enumeration Id
+ * @return buffer containing the string
+ */
+ static HBufC* TextStringLC( TInt aId );
+ };
+
+#endif // SETTINGSCONVERTER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/stringids.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,91 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef STRINGIDS_H
+#define STRINGIDS_H
+
+#include <imageprintengine.rsg>
+
+#include "printcapabilitycodes.h"
+#include "printmessagecodes.h"
+#include "imageprintvariant.h"
+
+const TInt KEmptyString( 0 );
+
+// This table combines the capability IDs with strings so that they
+// can be fetched from the resources
+
+#ifdef IMG_PRINT_DYNAMIC_PRINT_SETTINGS
+const TInt KConverterTableCount( 28 );
+const TInt KConverterTableIndexCount( 2 );
+const TInt KIDConverterTable[KConverterTableCount][KConverterTableIndexCount] =
+ {
+ { EPrintCapabLayout, R_QTN_STR_TEMPLATE } ,
+ { EPrintCapabPaperSize, R_QTN_STR_PAPER_SIZE },
+ { EPrintCapabPaperSizeAuto, R_QTN_STR_SIZE_AUTO },
+ { EPrintCapabPaperSizeLetter, R_QTN_STR_SIZE_LETTER },
+ { EPrintCapabPaperSizeA4, R_QTN_STR_SIZE_A4 },
+ { EPrintCapabPaperSizeA6, R_QTN_STR_SIZE_A6 },
+ { EPrintCapabPaperSize4x6, R_QTN_STR_SIZE_4X6 },
+ { EPrintCapabPaperSize5x7, R_QTN_STR_SIZE_5X7 },
+ { EPrintCapabPaperSizeSticker, R_QTN_STR_SIZE_STICKER },
+ { EPrintCapabQuality, R_QTN_STR_QUALITY },
+ { EPrintCapabQualityDefault, R_QTN_STR_QUAL_AUTO },
+ { EPrintCapabQualityNormal, R_QTN_STR_QUAL_NORMAL },
+ { EPrintCapabQualityDraft, R_QTN_STR_QUAL_DRAFT },
+ { EPrintCapabQualityFine, R_QTN_STR_QUAL_FINE },
+ { EPrintCapabLayout1UpBorderless, R_QTN_STR_TEMPLATE_BLESS },
+ { EPrintCapabLayout1UpMedium, R_QTN_STR_TEMPLATE_BLESS },
+ { EPrintCapabLayout1UpBorder, R_QTN_STR_TEMPLATE_ONE },
+ { EPrintCapabLayout1Up, R_QTN_STR_TEMPLATE_ONE },
+ { EPrintCapabLayout1UpStick, R_QTN_STR_TEMPLATE_ONE },
+ { EPrintCapabLayout2Up, R_QTN_STR_TEMPLATE_TWO },
+ { EPrintCapabLayout4Up, R_QTN_STR_TEMPLATE_FOUR },
+ { EPrintCapabLayout4UpStick, R_QTN_STR_TEMPLATE_FOUR },
+ { EPrintCapabLayout6Up, R_QTN_STR_TEMPLATE_SIX },
+ { EPrintCapabLayout9Up, R_QTN_STR_TEMPLATE_NINE },
+ { EPrintCapabLayout12Up, R_QTN_STR_TEMPLATE_TWELVE },
+ { EPrintCapabLayout16UpStick, R_QTN_STR_TEMPLATE_SIXTEEN },
+ { EPrintCapabLayout16Up, R_QTN_STR_TEMPLATE_SIXTEEN },
+ { KEmptyString, R_EMPTY }
+ };
+#else
+const TInt KConverterTableCount( 15 );
+const TInt KConverterTableIndexCount( 2 );
+const TInt KIDConverterTable[KConverterTableCount][KConverterTableIndexCount] =
+ {
+ { EPrintCapabLayout, R_EMPTY } ,
+ { EPrintCapabPaperSize, R_QTN_STR_PAPER_SIZE },
+ { EPrintCapabPaperSizeAuto, R_QTN_STR_SIZE_AUTO },
+ { EPrintCapabPaperSizeLetter, R_QTN_STR_SIZE_LETTER },
+ { EPrintCapabPaperSizeA4, R_QTN_STR_SIZE_A4 },
+ { EPrintCapabPaperSizeA6, R_QTN_STR_SIZE_A6 },
+ { EPrintCapabPaperSize4x6, R_QTN_STR_SIZE_4X6 },
+ { EPrintCapabPaperSize5x7, R_QTN_STR_SIZE_5X7 },
+ { EPrintCapabPaperSizeSticker, R_QTN_STR_SIZE_STICKER },
+ { EPrintCapabQuality, R_QTN_STR_QUALITY },
+ { EPrintCapabQualityDefault, R_QTN_STR_QUAL_AUTO },
+ { EPrintCapabQualityNormal, R_QTN_STR_QUAL_NORMAL },
+ { EPrintCapabQualityDraft, R_QTN_STR_QUAL_DRAFT },
+ { EPrintCapabQualityFine, R_QTN_STR_QUAL_FINE },
+ { KEmptyString, R_EMPTY }
+ };
+#endif
+#endif // STRINGIDS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/inc/tpreviewimageinfo.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,57 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef TPREVIEWIMAGEINFO_H
+#define TPREVIEWIMAGEINFO_H
+
+#include <e32def.h>
+#include <e32std.h>
+#include <bitmaptransforms.h>
+
+/**
+ *
+ * Data structure that presents a single image on the preview bitmap
+ *
+ */
+class TPreviewImageInfo
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Constructor
+ */
+ TPreviewImageInfo();
+
+ public: // data
+
+ // Position of the image on preview bitmap
+ TPoint iPos;
+
+ // Size of the image on previwe bitmap
+ TSize iSize;
+
+ // Rotation status & orientation of the image
+ TBool iRotated;
+
+ // Orientation of the image
+ CBitmapRotator::TRotationAngle iOrientation;
+ };
+
+#endif // TPREVIEWIMAGEINFO_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cdiscoverymanager.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,254 @@
+/*
+* 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:
+*
+*/
+
+
+#include <eikenv.h>
+#include <bluetooth/hci/hcierrors.h>
+
+#include "tprinter.h"
+#include "cdiscoverymanager.h"
+#include "ciffactory.h"
+#include "cprintjobmanager.h"
+#include "csettingsmanager.h"
+#include "imageprint.h"
+#include "cimageprint.h"
+#include "clog.h"
+
+const TInt KMMCID( 1 );
+
+// CONSTRUCTION
+CDiscoveryManager* CDiscoveryManager::NewL(
+ CIFFactory* aFactory )
+ {
+ CDiscoveryManager* self = CDiscoveryManager::NewLC( aFactory );
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+CDiscoveryManager* CDiscoveryManager::NewLC(
+ CIFFactory* aFactory )
+ {
+ CDiscoveryManager* self =
+ new ( ELeave ) CDiscoveryManager( aFactory );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ return self;
+ }
+
+// Constructor
+CDiscoveryManager::CDiscoveryManager(
+ CIFFactory* aFactory ) :
+ iFactory( aFactory )
+ {
+ }
+
+// Destruction
+CDiscoveryManager::~CDiscoveryManager()
+ {
+ }
+
+// 2nd phase constructor
+void CDiscoveryManager::ConstructL()
+ {
+ }
+
+// Returns supported protocols
+TUint CDiscoveryManager::SupportedProtocols()
+ {
+ return iFactory->Engine()->SupportedProtocols();
+ }
+
+// Initiates device discovery
+void CDiscoveryManager::StartDeviceDiscoveryL(
+ MDiscoveryObserver* aNotifier,
+ TUint aProtocol )
+ {
+ TInt discoveryError( KErrNone );
+ LOG("CDiscoveryManager::StartDeviceDiscoveryL BEGIN");
+ iMMCUid = -1;
+ iCancelling = EFalse;
+ iOnGoingDiscovery = ETrue;
+ iDiscoveryObserver = aNotifier;
+ TRAP_IGNORE( discoveryError = iFactory->Engine()->StartDiscoveryL( *this, aProtocol ) );
+ LOG1("CDiscoveryManager::StartDeviceDiscoveryL END, error = %d", discoveryError);
+ User::LeaveIfError( discoveryError );
+ }
+
+// Cancels the discovery notification
+void CDiscoveryManager::CancelDeviceDiscoveryL()
+ {
+ if ( iOnGoingDiscovery )
+ {
+ User::LeaveIfError( iFactory->Engine()->CancelDiscovery() );
+ iCancelling = ETrue;
+ iOnGoingDiscovery = EFalse;
+ }
+ }
+
+// Chooses the printer
+TInt CDiscoveryManager::ChoosePrinterL(
+ TInt aPrinterUid )
+ {
+ LOG("CDiscoveryManager::ChoosePrinterL BEGIN");
+ TInt err = 0;
+
+ // Create print job
+ CPrintJobManager* printJobManager =
+ static_cast<CPrintJobManager*>( iFactory->PrintJobIF() );
+ iOnGoingDiscovery = EFalse;
+
+ err = printJobManager->CreatePrintJobL( aPrinterUid );
+ LOG2("CDiscoveryManager::ChoosePrinterL printjob ret: %d with printer uid: %d", err, aPrinterUid );
+ if ( err == KErrNone )
+ {
+ if( aPrinterUid == KMMCID )
+ {
+ iMMCUid = KMMCID;
+ }
+
+ // Do initialization of the settings manager once print job is
+ // created and the settings can be fetched
+ CSettingsManager* settings =
+ static_cast<CSettingsManager*>( iFactory->SettingsIF() );
+ settings->InitSettingsL( aPrinterUid, iMMCUid );
+
+ iPrinterUid = aPrinterUid;
+ }
+
+ LOG("CDiscoveryManager::ChoosePrinterL END");
+ return err;
+ }
+
+// Called when the server finds the printer
+void CDiscoveryManager::FoundPrinterL(
+ const TPrinter& aPrinterInfo )
+ {
+ HBufC* name = HBufC::NewLC( aPrinterInfo.iDisplayName.Length() );
+ name->Des().Copy( aPrinterInfo.iDisplayName );
+
+ MDiscoveryObserver::TPrinterType type;
+ switch ( aPrinterInfo.iProtocol )
+ {
+ case KImagePrint_PrinterProtocol_BPP:
+ type = MDiscoveryObserver::EBPP;
+ break;
+ case KImagePrint_PrinterProtocol_DPOF:
+ type = MDiscoveryObserver::EMMC;
+ iMMCUid = aPrinterInfo.iPrinterID;
+ break;
+ case KImagePrint_PrinterProtocol_PictBridge:
+ type = MDiscoveryObserver::EUSB;
+ break;
+
+ case KImagePrint_PrinterProtocol_OPP_Printer: //fallthrough
+ case KImagePrint_PrinterProtocol_OPP_PC:
+ type = MDiscoveryObserver::EOPP;
+ break;
+ case KImagePrint_PrinterProtocol_UPnP:
+ type = MDiscoveryObserver::EWLAN;
+ break;
+ default:
+ type = MDiscoveryObserver::EBPP;
+ break;
+ }
+
+ if( iOnGoingDiscovery != EFalse )
+ {
+ iDiscoveryObserver->NotifyNewPrintDeviceL(
+ name, aPrinterInfo.iPrinterID,
+ aPrinterInfo.iProperties & TPrinter::Cached,
+ type, aPrinterInfo.iVendor );
+ }
+ CleanupStack::PopAndDestroy(); // name
+ }
+
+// Called to inform the status
+void CDiscoveryManager::DiscoveryStatusL(
+ TInt aStatus,
+ TInt aErrorCode,
+ TInt /*aErrorStringCode*/ )
+ {
+ // When Bluetooth discovery is finished, but Bluetooth is not enabled pass error code to UI.
+ if ( aErrorCode == ENoConnection )
+ {
+ if (iDiscoveryObserver){
+ iDiscoveryObserver->DiscoveryError( aErrorCode );
+ }
+ }
+ if ( iCancelling )
+ {
+ // Exection continues in CancelDiscoveryL()
+
+ if ( iDiscoveryObserver )
+ {
+ iDiscoveryObserver->DeviceDiscoveryCompleted();
+ }
+ }
+ else
+ {
+ if ( iOnGoingDiscovery )
+ {
+ if ( aStatus == EDiscovering )
+ {
+ iOnGoingDiscovery = EFalse;
+ iDiscoveryObserver->DeviceDiscoveryCompleted();
+ }
+ else if ( aStatus == EDoneDiscovery )
+ {
+ iOnGoingDiscovery = EFalse;
+ iDiscoveryObserver->DeviceDiscoveryCompleted();
+ }
+ else if ( aStatus == ECancellingDiscovery )
+ {
+ iDiscoveryObserver->DiscoveryError( aErrorCode );
+ }
+ else
+ {
+ User::Leave( KErrUnknown );
+ }
+ }
+ }
+ }
+
+// Removes cached printer from the list
+void CDiscoveryManager::RemovePrinterL( const TPrinter& aPrinterInfo )
+ {
+ if( iOnGoingDiscovery != EFalse )
+ {
+ iDiscoveryObserver->RemoveCachedPrinterL( aPrinterInfo.iPrinterID );
+ }
+ }
+
+TInt CDiscoveryManager::IsPictBridgeMode()
+ {
+ LOG("CDiscoveryManager::IsPictBridgeMode() START");
+ TInt retValue = -999;
+ retValue = iFactory->ImagePrintClient().IsPictBridgeMode();
+ LOG1("IsPictBridgeMode() returned: %d", retValue);
+ LOG("CDiscoveryManager::IsPictBridgeMode() END");
+ return retValue;
+ }
+
+void CDiscoveryManager::RemoveDiscoveryObserver()
+ {
+ iOnGoingDiscovery = EFalse;
+ iDiscoveryObserver = 0;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cfloatcapability.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,131 @@
+/*
+* 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:
+*
+*/
+
+
+#include <AknQueryDialog.h>
+#include <StringLoader.h>
+#include <imageprintengine.rsg>
+
+#include "cfloatcapability.h"
+
+const TInt KMaxTRealCharNum( 30 );
+const TInt KDecimals( 2 );
+
+// Destructor
+CFloatCapability::~CFloatCapability()
+ {
+ }
+
+// Creates text string for the settings list box
+HBufC* CFloatCapability::ListBoxTextL()
+ {
+ const TInt KGranularity( 4 );
+ TRealFormat format( KMaxTRealCharNum, KDecimals );
+ TBuf<KMaxTRealCharNum> numStr;
+
+ numStr.Zero();
+ numStr.AppendNum( iRealValue, format );
+
+ CDesCArrayFlat* strings = new ( ELeave ) CDesCArrayFlat( KGranularity );
+ CleanupStack::PushL( strings );
+ strings->AppendL( iTitle );
+ strings->AppendL( numStr );
+
+ HBufC* buf = StringLoader::LoadL( R_QTN_LBOX_FORMAT, *strings );
+ CleanupStack::PopAndDestroy(); // strings
+
+ return buf;
+ }
+
+// Displays pop-up list for changing the active TInt value
+TBool CFloatCapability::LaunchPopupListL()
+ {
+ TReal aMin = 0;
+ TReal aMax = TReal( iMaxNumerator )/TReal( iDenominator );
+
+ CAknFloatingPointQueryDialog* dlg =
+ CAknFloatingPointQueryDialog::NewL( iRealValue );
+ CleanupStack::PushL( dlg );
+ dlg->SetPromptL( iTitle );
+ dlg->PrepareLC( R_GENERIC_FLOAT_QUERY_DLG );
+ CleanupStack::Pop( dlg );
+ dlg->SetMinimumAndMaximum( aMin, aMax );
+ TBool valueChanged = dlg->RunLD();
+
+ if ( valueChanged )
+ {
+ iValue = TInt( TReal ( iRealValue / TReal ( iDenominator ) ) );
+ }
+
+ return valueChanged;
+ }
+
+// Clones itself
+CBaseCapability* CFloatCapability::CloneL()
+ {
+ CFloatCapability* clone = new ( ELeave ) CFloatCapability;
+
+ clone->iDenominator = iDenominator;
+ clone->iIndexOnList = iIndexOnList;
+ clone->iMaxNumerator = iMaxNumerator;
+ clone->iValue = iValue;
+ clone->iTitle = iTitle;
+ clone->iUid = iUid;
+ clone->iRealValue = iRealValue;
+
+ return clone;
+ }
+
+// Sets the new values and checks the boundaries
+TInt CFloatCapability::SetValues(
+ TInt aDenom,
+ TInt aNumerator,
+ TInt aMaxNumerator )
+ {
+ TInt err( KErrNone );
+
+ if ( aNumerator > aMaxNumerator )
+ {
+ err = KErrArgument;
+ }
+ else
+ {
+ iDenominator = aDenom;
+ iValue = aNumerator;
+ iMaxNumerator = aMaxNumerator;
+ if( iDenominator != 0 )
+ {
+ iRealValue = TReal( iValue )/TReal( iDenominator );
+ }
+ }
+
+ return err;
+ }
+
+// Numerator
+TInt CFloatCapability::Numerator() const
+ {
+ return iValue;
+ }
+
+// Denominator
+TInt CFloatCapability::Denominator() const
+ {
+ return iDenominator;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cidleprinteventcatcher.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,195 @@
+/*
+* 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:
+*
+*/
+
+
+#include <imageprintapp.rsg>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+#include "tidleevent.h"
+#include "cidleprinteventcatcher.h"
+#include "crealfactory.h"
+#include "midleprinteventobserver.h"
+#include "cprinteventcatcher.h"
+#include "mprintsettings.h"
+#include "clog.h"
+#include "mdiscoveryobserver.h"
+#include "midleprinteventregisterif.h"
+#include "mdiscoveryobserver.h"
+
+CIdlePrintEventCatcher* CIdlePrintEventCatcher::NewL(
+ CRealFactory* aFactory /*,
+ MIdlePrintEventObserver* aIdleUIObserver*/ )
+ {
+ CIdlePrintEventCatcher* self = CIdlePrintEventCatcher::NewLC( aFactory/*, aIdleUIObserver*/ );
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CIdlePrintEventCatcher* CIdlePrintEventCatcher::NewLC(
+ CRealFactory* aFactory/*,
+ MIdlePrintEventObserver* aIdleUIObserver*/ )
+ {
+ CIdlePrintEventCatcher* self =
+ new ( ELeave ) CIdlePrintEventCatcher( aFactory/*, aIdleUIObserver*/ );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ return self;
+ }
+
+// Constructor
+CIdlePrintEventCatcher::CIdlePrintEventCatcher(
+ CRealFactory* aFactory/*,
+ MIdlePrintEventObserver* aIdleUIObserver*/ ) :
+ iFactory( aFactory )/*,
+ iIdleUIObserver( aIdleUIObserver )*/
+ {
+ }
+
+// Destructor
+CIdlePrintEventCatcher::~CIdlePrintEventCatcher()
+ {
+ iObservers.Reset();//)AndDestroy();
+ }
+
+// 2nd phase constructor
+void CIdlePrintEventCatcher::ConstructL()
+ {
+ }
+
+void CIdlePrintEventCatcher::StatusEvent( const TEvent &aEvent,
+ TInt aError,
+ TInt aMsgCode )
+ {
+ LOG1("CIdlePrintEventCatcher::StatusEvent, aEventType: %d", aEvent.iEventType);
+ LOG2("CIdlePrintEventCatcher::StatusEvent, aError: %d, aMsgCode: %d", aError, aMsgCode );
+ TInt obsCount = iObservers.Count();
+ switch ( aEvent.iEventType )
+ {
+ ///The protocol has made a connection to the printer, device or transport
+ case EConnect:
+ {
+ LOG( "CIdlePrintEventCatcher::StatusEvent CONNECT " );
+ if ( (TUint)aEvent.iProtocol == KImagePrint_PrinterProtocol_PictBridge )
+ {
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->UsbPrinterConnected();
+ }
+ iFactory->SettingsIF()->SetUsbState( ETrue );
+ }
+ break;
+ }
+ ///The protocol has been disconnected from the printer, device or transport
+ case EDisconnect:
+ {
+ if ( (TUint)aEvent.iProtocol == KImagePrint_PrinterProtocol_PictBridge )
+ {
+ // If idle print event is called while usb printing is still ongoing,
+ // printing is cancelled.
+ if ( iFactory->IsPrinting() &&
+ ( iFactory->SettingsIF()->GetCurrentPrinterProtocol() ==
+ MDiscoveryObserver::EUSB ) && aError != KErrDisconnected)
+ {
+ LOG2("printing pictbridge, aError = %d, aMsgCode = %d", aError, aMsgCode );
+ iFactory->PrintEventObserverIF()->PrintJobErrorEvent( KErrDisconnected, KErrNone );
+ iFactory->SettingsIF()->SetUsbState( EFalse );
+ }
+ else
+ {
+ LOG2("not printing or not pictbridge, aError = %d, aMsgCode = %d", aError, aMsgCode );
+ if ( ( aError == KErrDisconnected) &&
+ ( iFactory->SettingsIF()->GetCurrentPrinterProtocol() ==
+ MDiscoveryObserver::EUSB ) )
+ {
+ LOG( "CIdlePrintEventCatcher::StatusEvent 'Connection to printer lost' " );
+
+ TInt error ( KErrNone );
+ TRAP( error, iBuf = StringLoader::LoadL( R_NOTE_DISCONNECT_PRINT_ERROR ));
+ CAknErrorNote* errornote = new CAknErrorNote( ETrue );
+ TInt err ( KErrNone );
+ TRAP( err, errornote->ExecuteLD( *iBuf ));
+
+ }
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->UsbPrinterDisconnected();
+ }
+ if ( iBuf )
+ {
+ delete iBuf;
+ iBuf = NULL;
+ }
+
+ }
+ }
+ break;
+ }
+
+ ///The event is notifying a change in the device status,
+ ///or is reporting an error sent from the device
+ case EPrinterStatus:
+ {
+ if ( EWarning==aEvent.iSeverity || EFatal==aEvent.iSeverity )
+ {
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->UsbStateChanged( ENOUSBEvent, aMsgCode );
+ }
+ }
+ break;
+ }
+
+ ///The event is notifying that an asynchronous leave has occurred
+ ///in server and user should be notified in some way
+ case EAsynchronousLeave:
+ {
+ LOG( "CIdlePrintEventCatcher::StatusEvent EAsynchronousLeave!");
+ LOG2( "CIdlePrintEventCatcher::StatusEvent protocol: %d, error: %d",
+ aEvent.iProtocol, aError );
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->AsynchronousServerLeave( aError );
+ }
+ CCoeEnv::Static()->HandleError( aError );
+ break;
+ }
+ default:
+ {
+ // Should not be never called
+ break;
+ }
+ }
+ LOG("CIdlePrintEventCatcher::StatusEvent END");
+ }
+
+void CIdlePrintEventCatcher::RegisterObserver( MIdlePrintEventObserver* aIdleObserver )
+ {
+ iObservers.Append( aIdleObserver );
+ }
+
+void CIdlePrintEventCatcher::UnRegisterObserver( MIdlePrintEventObserver* aIdleObserver )
+ {
+ TInt observerPosition = iObservers.Find( aIdleObserver );
+ if( observerPosition != KErrNotFound )
+ {
+ iObservers.Remove( observerPosition );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/ciffactory.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* 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:
+*
+*/
+
+
+#include "ciffactory.h"
+#include "cimageprintengine.h"
+#include "mdiscovery.h"
+#include "mprintjob.h"
+#include "mprintsettings.h"
+
+// Default constructor
+CIFFactory::CIFFactory(
+ CImagePrintEngine* aEngine )
+ : iPrintEngine ( aEngine )
+ {
+ }
+
+// Destructor
+CIFFactory::~CIFFactory()
+ {
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cimageprint.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,324 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cimageprint.h"
+#include "cidleguard.h"
+#include "cdiscoveryguard.h"
+#include "cjobguard.h"
+#include "clog.h"
+
+const static TInt KImagePrintVersionMajor = 0;
+const static TInt KImagePrintVersionMinor = 0;
+const static TInt KImagePrintVersionBuild = 231;
+
+/**********************
+Public member functions
+**********************/
+
+CImagePrint::CImagePrint ()
+ {
+ }
+
+/// Destructor.
+CImagePrint::~CImagePrint ()
+ {
+ LOG("CImagePrint::~CImagePrint BEGIN");
+ delete iDiscoveryGuard;
+ delete iIdleGuard;
+ delete iJobGuard;
+ CCoeEnv::Static()->RemoveForegroundObserver( *this );
+ iClient.Close();
+ LOG("CImagePrint::~CImagePrint END");
+ }
+
+/**
+ * @brief Initialize the server.
+ */
+void CImagePrint::ConnectL()
+ {
+ if( iClient.Handle() == KNullHandle )
+ {
+ User::LeaveIfError( iClient.ConnectL() );
+ iIdleGuard = CIdleGuard::NewL( iClient );
+ iDiscoveryGuard = CDiscoveryGuard::NewL( iClient );
+ iJobGuard = CJobGuard::NewL( iClient );
+ User::LeaveIfError( iClient.ReserveEngine() );
+ iClient.SetForeground( ETrue ); //For aiw cases
+ CCoeEnv::Static()->AddForegroundObserverL( *this );
+ }
+ }
+
+/**
+ * @brief Shutdown the server.
+ */
+void CImagePrint::Close()
+ {
+ iClient.ReleaseEngine();
+ }
+
+/**
+ * @brief Returns the current version of the Image Print Server
+ * @return The current version of the Image Print Server
+ */
+TVersion CImagePrint::Version()
+ {
+ return TVersion(KImagePrintVersionMajor, KImagePrintVersionMinor, KImagePrintVersionBuild); // Julian Day, August 18.
+ }
+
+/**
+ * @brief Starts the discovery process.
+ *
+ * Starts printer discovery on specified printer plug-ins. This is an asynchronous call that will use the
+ * supplied MPrinterDiscoveryObserver to signal the client when Printers are found and upon error or successful completion.
+ *
+ * @param aObserver The discovery observer.
+ * @param aProtocols Used to indicate what protocols to search for. 0 = all, 1 = BPP, 2 = BIP, 4 = OPP_Printer, 8 = DPOF, 16 = PB, 32 = OPP_PC
+ * @return Any standard Symbian error code.
+ * @sa KImagePrint_PrinterProtocol_BPP @sa KImagePrint_PrinterProtocol_BIP @sa KImagePrint_PrinterProtocol_OPP_Printer
+ * @sa KImagePrint_PrinterProtocol_DPOF @sa KImagePrint_PrinterProtocol_PictBridge @sa KImagePrint_PrinterProtocol_OPP_PC
+ */
+TInt CImagePrint::StartDiscoveryL(MPrinterDiscoveryObserver& aObserver, TUint aProtocols)
+ {
+ return iDiscoveryGuard->Guard( aObserver, aProtocols );
+ }
+
+/**
+ * Cancels printer discovery on all printer plug-ins. This is an asynchronous call
+ * that will use the MPrinterDiscoveryObserver previously supplied by
+ * CImagePrint::StartDiscoveryL to signal the client upon error or successful completion.
+ * @brief Cancels the discovery process.
+ * @return \c KErrNone if cancel was successfully submitted, otherwise another of the system-wide error codes.
+ */
+TInt CImagePrint::CancelDiscovery()
+ {
+ return iClient.CancelDiscovery();
+ }
+
+/**
+ * Creates a print job using the default settings and template. All job information beyond the images and Printer are set to the defaults of the printer.
+ * If the Printer Discovery process is ongoing when \c CreatePrintJobL is received, Printer Discovery is terminated, without sending a notification event to the Client.
+ * @brief Creates a print job in the specified printer.
+ * @param[in] aPrinterID The exposed ID of the printer where the client wishes to create the print job.
+ * @param aImages Array containing the full names of the files to print.
+ * @param aObserver The print event observer.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ * @note Only one print job can be active at a time. The Print Job must be created before any
+ * print job related functions are called. These functions include changing settings, preview, job submission, canceling, or getting status.
+ */
+TInt CImagePrint::CreatePrintJobL(TInt aPrinterID, RPointerArray<TDesC>& aImages, MPrintEventObserver& aObserver)
+ {
+ return iJobGuard->Guard(aPrinterID, aImages, aObserver);
+ }
+
+/**
+ * @brief Submits a print job already created.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ * @note The actual job execution is asynchronous so this function returns immediately. If successful, notification of job status and job completion is received by the client through the MPrintEventObserver.
+ */
+TInt CImagePrint::SubmitPrintJobL()
+ {
+ return iClient.SubmitPrintJob();
+ }
+
+/**
+ * @brief Cancels the print job.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ * @note This is an asynchronous command. MPrintEventObserver::PrintJobProgressEvent will be called with the status of TPrintJobProgressEventStatus::EDone when the cancellation is completed.
+ * @note The notification can potentially be received by the client before this command returns to the client.
+ */
+TInt CImagePrint::CancelPrintJob()
+ {
+ LOG("CImagePrint::CancelPrintJob");
+ return iClient.CancelPrintJob();
+ }
+
+/**
+ * @brief Continues printing and / or submitting a print job. Implementation may vary from protocol to protocol.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::ContinuePrintJobL()
+ {
+ return iClient.ContinuePrintJob();
+ }
+
+/**
+ * @brief Gets the number of pages to be printed.
+ * @return Number of pages to print.
+ */
+TInt CImagePrint::GetNumPrintPages()
+ {
+ return iClient.GetNumPrintPages();
+ }
+
+/**
+ * @brief Gets the status of the printing job created.
+ * @return Printing job status.
+ */
+TInt CImagePrint::GetJobStatus()
+ {
+ return iClient.GetJobStatus();
+ }
+
+/**
+ * @brief Gets the status of the printer.
+ * @param[in] aPrinterID The exposed ID of the printer the client wants to know about.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::GetPrinterStatus( TInt aPrinterID )
+ {
+ return iClient.GetPrinterStatus( aPrinterID );
+ }
+
+/**
+ * @brief Gets the IDs of the capabilities supported by the printer specified.
+ * @param[in] aPrinterID The exposed ID of the printer the client wants to know about.
+ * @param[out] aCapabilityIDs Array containing the ID's of the capabilities of the specified printer.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::GetPrinterCapabilityIDsL(TInt aPrinterID, RArray<TInt>& aCapabilityIDs)
+ {
+ return iClient.GetPrinterCapabilityIDs(aPrinterID, aCapabilityIDs);
+ }
+
+/**
+ * @brief Gets the detail of a certain capability of a certain printer.
+ * @param[in] aPrinterID The exposed ID of the printer the client wants to know about.
+ * @param[in] aCapabilityID ID of the capability of interest.
+ * @param[out] aCapability Capability information.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::GetPrinterCapabilityL(TInt aPrinterID, TInt aCapabilityID, TPrintCapability& aCapability)
+ {
+ return iClient.GetPrinterCapability(aPrinterID, aCapabilityID, aCapability);
+ }
+
+/**
+ * @brief Gets a setting configured for the created print job.
+ * @param[in] aCapabilityID ID of the capability of interest.
+ * @param[out] aValue Capability value.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::GetJobSetting(TInt aCapabilityID, TInt& aValue)
+ {
+ return iClient.GetJobSetting(aCapabilityID, aValue);
+ }
+
+/**
+ * @brief Sets a print job setting.
+ * @param[in] aCapabilityID ID of the capability of interest.
+ * @param[in] aValue New capability value.
+ * @param[out] aAffectedCapability ID of any affected capability.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::SetJobSettingL(TInt aCapabilityID, TInt aValue, TInt& aAffectedCapability)
+ {
+ return iClient.SetJobSetting(aCapabilityID, aValue, aAffectedCapability);
+ }
+
+/**
+ * @brief Gets the number of pages in the preview.
+ * @return Number of pages in the preview.
+ */
+TInt CImagePrint::GetNumPreviewPages()
+ {
+ return iClient.GetNumPreviewPages();
+ }
+
+/**
+ * @brief Gets the icon representing a given layout or template.
+ * @param[in] aTemplateID ID of the template / layout of interest.
+ * @param[out] aFbsBitmapHandle Handle to the appropriate bitmap.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::GetJobTemplateIconL(TInt /*aTemplateID*/, TInt& /*aFbsBitmapHandle*/)
+ {
+ return KErrNotSupported;
+ }
+
+/**
+ * @brief Gets number of copies for each image.
+ * @param[out] aArray contains number of copies for each image.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::GetNumberOfCopies( RArray<TInt>& /*aArray*/ )
+ {
+ return KErrNotSupported;
+ }
+
+/**
+ * @brief Sets number of copies for each image.
+ * @param[in] aArray contains number of copies for each image.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::SetNumberOfCopies( const RArray<TInt>& aArray )
+ {
+ return iClient.SetNumberOfCopies( aArray );
+ }
+
+/**
+ * @brief Creates a preview image.
+ * @param[in] aPageNumber Page number to create preview image of.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.
+ */
+TInt CImagePrint::CreatePreviewImage(TInt /*aPageNumber*/)
+ {
+ return KErrNotSupported;
+ }
+
+/**
+ * @brief Removes a specified cached printer.
+ * @param[in] aPrinterID The exposed ID of the printer the client wants to remove.
+ * @return Any standard Symbian error code or KErrInvalidSequence / KErrInvalidData.k
+ */
+TInt CImagePrint::RemoveCachedPrinterL(TInt aPrinterID)
+ {
+ return iClient.RemoveCachedPrinter( aPrinterID );
+ }
+
+/**
+ * @brief Returns the Protocols supported by the DLL. It can be any of the KImagePrint_PrinterProtocol* constants.
+ * @return An OR'ed value with the supported protocols information.
+ * @sa KImagePrint_PrinterProtocol_BPP @sa KImagePrint_PrinterProtocol_BIP @sa KImagePrint_PrinterProtocol_OPP
+ * @sa KImagePrint_PrinterProtocol_DPOF @sa KImagePrint_PrinterProtocol_PictBridge
+ */
+TUint CImagePrint::SupportedProtocols()
+ {
+ return iClient.SupportedProtocols();
+ }
+
+/**
+ * @brief Registers the IdleObserver to send idle event notifications
+ * @param A pointer to an object implementing MIdleObserver interface that will be notified of events
+ * @note In order to stop sending notifications, send NULL as the parameter.
+ */
+void CImagePrint::RegisterIdleObserver(MIdleObserver *aObserver)
+ {
+ iIdleGuard->Guard( aObserver );
+ }
+
+void CImagePrint::HandleGainingForeground()
+ {
+ iClient.SetForeground( ETrue );
+ }
+
+void CImagePrint::HandleLosingForeground()
+ {
+ iClient.SetForeground( EFalse );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cimageprintengine.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,138 @@
+/*
+* 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:
+*
+*/
+
+
+#include <centralrepository.h>
+
+#include "imageprintprivatecrkeys.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "crealfactory.h"
+#include "clog.h"
+#include "mprintsettings.h"
+
+// CONSTRUCTION
+EXPORT_C CImagePrintEngine* CImagePrintEngine::NewL(
+ CDesCArrayFlat* aImageFiles )
+ {
+ CImagePrintEngine* self = CImagePrintEngine::NewLC( aImageFiles );
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+EXPORT_C CImagePrintEngine* CImagePrintEngine::NewLC(
+ CDesCArrayFlat* aImageFiles )
+ {
+ CImagePrintEngine* self = new ( ELeave ) CImagePrintEngine;
+ CleanupStack::PushL( self );
+ self->ConstructL( aImageFiles );
+ return self;
+ }
+
+// Destructor (virtual by CBase)
+CImagePrintEngine::~CImagePrintEngine()
+ {
+ delete iIFFactory;
+ delete iFiles;
+ iFileArray.ResetAndDestroy();
+ iFileArray.Close();
+ delete iCRSession;
+ }
+
+// Default constructor
+CImagePrintEngine::CImagePrintEngine()
+ {
+ }
+
+// Second phase construct
+void CImagePrintEngine::ConstructL(
+ CDesCArrayFlat* aImageFiles )
+ {
+ CleanupStack::PushL( aImageFiles );
+ iIFFactory = CRealFactory::NewL( this );
+ CleanupStack::Pop( aImageFiles );
+ SetImageArrayL( aImageFiles );
+
+ iCRSession = CRepository::NewL( KCRUidImagePrint );
+ }
+
+// Returns the reference to interface factory
+EXPORT_C CIFFactory& CImagePrintEngine::InterfaceFactory()
+ {
+ return *iIFFactory;
+ }
+
+// Initializes the image array
+EXPORT_C void CImagePrintEngine::SetImageArrayL(
+ CDesCArrayFlat* aArray )
+ {
+ delete iFiles;
+ iFiles = aArray;
+
+ if ( iFiles )
+ {
+ iFileArray.ResetAndDestroy();
+ TInt i( 0 );
+ TInt num( iFiles->Count() );
+ for ( i = 0; i < num; i++ )
+ {
+ TFileName* tf = CreateFileNameL();
+ CleanupStack::PushL( tf );
+ *tf = iFiles->MdcaPoint( i );
+ User::LeaveIfError( iFileArray.Append( tf ) );
+ CleanupStack::Pop( tf );
+ }
+
+ MPrintSettings* settings =
+ static_cast<CRealFactory*>( iIFFactory )->SettingsIF();
+ RArray<TInt> numberOfCopiesArray;
+ CleanupClosePushL( numberOfCopiesArray );
+ for( TInt i=0; i < iFiles->Count(); ++i )
+ {
+ numberOfCopiesArray.Append( 1 );
+ }
+ if( settings )
+ {
+ settings->SetNumberOfCopiesL( numberOfCopiesArray );
+ }
+ CleanupStack::PopAndDestroy(); // numberOfCopiesArray
+ }
+ }
+
+// Returns file array to be passed to server
+EXPORT_C RPointerArray<TDesC>& CImagePrintEngine::FileArray()
+ {
+ return iFileArray;
+ }
+
+// Creates new TFileName for file array
+TFileName* CImagePrintEngine::CreateFileNameL()
+ {
+ TFileName* fileName = 0;
+ fileName = new (ELeave) TFileName;
+ User::LeaveIfNull( fileName );
+ return fileName;
+ }
+
+// Restarts Image Print engine
+EXPORT_C void CImagePrintEngine::RestartEngine()
+ {
+ iIFFactory->RestartEngine();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/clistcapability.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,213 @@
+/*
+* 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:
+*
+*/
+
+
+#include <StringLoader.h>
+#include <AknQueryValueText.h>
+#include <aknpopupsettingpage.h>
+#include <badesca.h>
+#include <imageprintengine.rsg>
+
+#include "clistcapability.h"
+#include "crealfactory.h"
+#include "mprintsettings.h"
+#include "tprinter.h"
+#include "mdiscoveryobserver.h"
+#include "printcapabilitycodes.h"
+
+const TInt KArrayGranularity( 4 );
+const TInt KTwoPaperSizeAvailable( 2 );
+const TInt KTemplateSize = 16;
+const TInt KTemplates[] = {1554,1552,1565,1555,1501,1553,1551,1558,1502,1504,1564,1506,1509,1512,1513,1516};
+
+CListCapability::CListCapability( CRealFactory* aFactory ) :
+ iFactory( aFactory )
+ {
+ }
+
+// Destructor
+CListCapability::~CListCapability()
+ {
+ iEnumIDs.Close();
+ iTexts.ResetAndDestroy();
+ }
+
+// Creates text string for the settings list box
+HBufC* CListCapability::ListBoxTextL()
+ {
+ CDesCArrayFlat* strings =
+ new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+ CleanupStack::PushL( strings );
+ strings->AppendL( iTitle );
+
+ TInt i( 0 );
+ TInt num( iEnumIDs.Count() );
+ TBool found( EFalse );
+ // Find the matching text based on the enumeration value
+ for ( i = 0; i < num && !found; i++ )
+ {
+ if ( iEnumIDs[i] == iValue )
+ {
+ strings->AppendL( iTexts[i]->Des() );
+ found = ETrue;
+ }
+ }
+
+ if ( !found )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ HBufC* buf = StringLoader::LoadL( R_QTN_LBOX_FORMAT, *strings );
+ CleanupStack::PopAndDestroy(); // strings
+
+ return buf;
+ }
+
+// Displays pop-up list for changing the active TInt value
+TBool CListCapability::LaunchPopupListL()
+ {
+ // Create value array and sets it up
+ CAknQueryValueTextArray* queryTextArray = CAknQueryValueTextArray::NewL();
+ CleanupStack::PushL( queryTextArray );
+
+ CDesCArrayFlat* array = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+ CleanupStack::PushL( array );
+ TInt i( 0 );
+ TInt num( iTexts.Count() );
+ for ( i = 0; i < num; i++ )
+ {
+ array->AppendL( iTexts[i]->Des() );
+ }
+ queryTextArray->SetArray( *array );
+
+ CAknQueryValueText* queryValue = CAknQueryValueText::NewL();
+ CleanupStack::PushL( queryValue );
+ queryValue->SetArrayL( queryTextArray );
+
+ TInt found( KErrNotFound );
+ num = iEnumIDs.Count();
+ for ( i = 0; i < num && found == KErrNotFound; i++ )
+ {
+ if ( iEnumIDs[i] == iValue )
+ {
+ found = KErrNone;
+ }
+ }
+ i--;
+ User::LeaveIfError( found );
+ queryValue->SetCurrentValueIndex( i );
+
+ TBool changed = EFalse;
+ if( array->MdcaCount() > KTwoPaperSizeAvailable )
+ {
+ // Create popup setting page and show it
+ CAknPopupSettingPage* page = new ( ELeave ) CAknPopupSettingPage(
+ &iTitle, EAknSettingPageNoOrdinalDisplayed, EAknCtPopupSettingList,
+ R_EMPTY_SETTING_LIST, R_SETTING_GENERIC_PAGE, *queryValue );
+ CleanupStack::PushL( page );
+ page->ConstructL();
+ CleanupStack::Pop(); // page
+
+ changed = page->ExecuteLD();
+ // Save new value if needed
+ if ( changed )
+ {
+ iValue = iEnumIDs[queryValue->CurrentValueIndex()];
+ }
+ }
+ // If there are only two paper sizes available, another one is automaticly changed
+ else if( array->MdcaCount() == KTwoPaperSizeAvailable )
+ {
+ if ( i == 0 )
+ {
+ iValue = iEnumIDs[1];
+ }
+ else
+ {
+ iValue = iEnumIDs[0];
+ }
+ changed = ETrue;
+ }
+ // Do nothing
+ else
+ {
+ }
+
+ CleanupStack::PopAndDestroy( 3 ); // queryTextArray, array, queryArray
+ return changed;
+ }
+
+// Clones itself
+CBaseCapability* CListCapability::CloneL()
+ {
+ CListCapability* clone = new ( ELeave ) CListCapability( iFactory );
+ CleanupStack::PushL( clone );
+
+ clone->iValue = iValue;
+ clone->iIndexOnList = iIndexOnList;
+ clone->iTitle = iTitle;
+ clone->iUid = iUid;
+
+ TInt num( iEnumIDs.Count() );
+ if ( iUid != EPrintCapabLayout )
+ {
+ for ( TInt j = 0; j < num; j++ )
+ {
+ User::LeaveIfError( clone->iEnumIDs.Append( iEnumIDs[j] ) );
+ User::LeaveIfError( clone->iTexts.Append( iTexts[j]->AllocLC() ) );
+ CleanupStack::Pop(); // clone->iTexts
+ }
+ }
+ else
+ {
+ //
+ // has to be done here, i.e. remove not-supported templates
+ TBool dropTemplates = EFalse;
+ if ( iFactory )
+ {
+ if( ( iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EWLAN ) ||
+ ( iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EBPP ) ||
+ ( iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EUSB ) ||
+ ( iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EMMC ) )
+ {
+ dropTemplates = ETrue;
+ }
+ }
+ // Also sort the print layout templates to "standard" order
+ for ( TInt i = 0; i < KTemplateSize; i++ )
+ {
+ for ( TInt j = 0; j < num; j++ )
+ {
+ if ( KTemplates[i] == iEnumIDs[j] )
+ {
+ if ( (dropTemplates && (iEnumIDs[j] == EPrintCapabLayout1UpBorderless || iEnumIDs[j] == EPrintCapabLayout1UpBorder || iEnumIDs[j] == EPrintCapabLayout1Up) ) || !dropTemplates )
+ {
+ User::LeaveIfError( clone->iEnumIDs.Append( iEnumIDs[j] ) );
+ User::LeaveIfError( clone->iTexts.Append( iTexts[j]->AllocLC() ) );
+ CleanupStack::Pop(); // clone->iTexts
+ }
+ }
+ }
+ }
+ }
+
+ CleanupStack::Pop(); // clone
+ return clone;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cpreviewinfo.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cpreviewinfo.h"
+
+// Default constructor
+CPreviewInfo::CPreviewInfo(
+ TInt aCapabilityUid,
+ TBool aPaperLandscape )
+ {
+ iUid = aCapabilityUid;
+ iPaperLandscape = aPaperLandscape;
+
+ // No, sticker templates are not used by default
+ iOneImagePerPage = EFalse;
+ }
+
+// Default destructor
+CPreviewInfo::~CPreviewInfo()
+ {
+ iImageInfo.ResetAndDestroy();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cprinteventcatcher.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,163 @@
+/*
+* 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:
+*
+*/
+
+
+#include "cprinteventcatcher.h"
+#include "crealfactory.h"
+#include "mprintpreviewobserver.h"
+#include "mprintjobstatus.h"
+#include "cprintjobmanager.h"
+#include "clog.h"
+
+// CONSTRUCTION
+CPrintEventCatcher* CPrintEventCatcher::NewL(
+ CIFFactory* aFactory,
+ CImagePrintEngine* aEngine )
+ {
+ CPrintEventCatcher* self = CPrintEventCatcher::NewLC( aFactory, aEngine );
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+CPrintEventCatcher* CPrintEventCatcher::NewLC(
+ CIFFactory* aFactory,
+ CImagePrintEngine* aEngine )
+ {
+ CPrintEventCatcher* self =
+ new ( ELeave ) CPrintEventCatcher( aFactory, aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ return self;
+ }
+
+// Constructor
+CPrintEventCatcher::CPrintEventCatcher(
+ CIFFactory* aFactory,
+ CImagePrintEngine* aEngine ) :
+ iFactory( aFactory ),
+ iEngine( aEngine )
+ {
+ }
+
+// Destructor
+CPrintEventCatcher::~CPrintEventCatcher()
+ {
+ iObservers.Reset();
+ }
+
+// 2nd phase constructor
+void CPrintEventCatcher::ConstructL()
+ {
+ }
+
+// Print progress event
+void CPrintEventCatcher::PrintJobProgressEvent(
+ TInt aStatus,
+ TInt aPercentCompletion,
+ TInt aJobStateCode )
+ {
+ TInt obsCount = iObservers.Count();
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->PrintJobProgress( aStatus, aPercentCompletion,
+ aJobStateCode );
+ }
+ }
+
+// Print job error event
+void CPrintEventCatcher::PrintJobErrorEvent(
+ TInt aError,
+ TInt aErrorStringCode )
+ {
+ LOG2("CPrintEventCatcher::PrintJobErrorEvent: aError: %d, aErrorStringCode: %d ",
+ aError, aErrorStringCode );
+ TInt obsCount = iObservers.Count();
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->PrintJobError( aError, aErrorStringCode );
+ }
+ }
+
+// Print job status event ("minor" error)
+void CPrintEventCatcher::PrinterStatusEvent(
+ TInt aError,
+ TInt aErrorStringCode )
+ {
+ LOG2("CPrintEventCatcher::PrinterStatusEvent: aError: %d, aErrorStringCode: %d ",
+ aError, aErrorStringCode );
+ TInt obsCount = iObservers.Count();
+ for( TInt i=0; i<obsCount; i++ )
+ {
+ iObservers[i]->PrinterStatus( aError, aErrorStringCode );
+ }
+ }
+
+// Receives preview events from the image print server
+void CPrintEventCatcher::PreviewImageEvent(
+ TInt /*aFsBitmapHandle*/ )
+ {
+ // Should not be called from engine anymore
+ }
+
+// Set preview observer
+void CPrintEventCatcher::SetPreviewObserver(
+ MPrintPreviewObserver* aObserver )
+ {
+ iPreviewObserver = aObserver;
+ }
+
+void CPrintEventCatcher::RegisterObserver( MPrintJobStatus* aObserver )
+ {
+ iObservers.Append( aObserver );
+ }
+
+void CPrintEventCatcher::UnRegisterObserver( MPrintJobStatus* aObserver )
+ {
+ TInt observerPosition = iObservers.Find( aObserver );
+ if( observerPosition != KErrNotFound )
+ {
+ iObservers.Remove( observerPosition );
+ }
+ }
+
+
+// GOING TO GET REMOVED
+void CPrintEventCatcher::ShowMessageL(
+ TInt /*aMsgLine1Code*/,
+ TInt /*aMsgLine2Code*/ )
+ {
+ }
+
+// GOING TO GET REMOVED
+TBool CPrintEventCatcher::AskYesNoQuestionL(
+ TInt /*aMsgLine1Code*/,
+ TInt /*aMsgLine2Code*/ )
+ {
+ return EFalse;
+ }
+
+// GOING TO GET REMOVED
+const TDesC& CPrintEventCatcher::AskForInputL(
+ TInt /*aMsgLine1Code*/,
+ TInt /*aMsgLine2Code*/ )
+ {
+ return KNullDesC;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cprintjobmanager.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,315 @@
+/*
+* 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:
+*
+*/
+
+
+#include <imageprintapp.rsg>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+#include "cprintjobmanager.h"
+#include "cprinteventcatcher.h"
+#include "csettingsmanager.h"
+#include "mprintjobobserver.h"
+#include "imageprint.h"
+#include "cimageprintengine.h"
+#include "crealfactory.h"
+#include "clog.h"
+#include "printcapabilitycodes.h"
+#include "printmessagecodes.h"
+#include "mprintsettings.h"
+#include "cimageprint.h"
+#include "mdiscoveryobserver.h"
+
+const TInt KCancelRetries( 2 );
+// CONSTRUCTION
+CPrintJobManager* CPrintJobManager::NewL(
+ CRealFactory* aFactory,
+ CImagePrintEngine* aDLLEngine )
+ {
+ CPrintJobManager* self = CPrintJobManager::NewLC(
+ aFactory, aDLLEngine );
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+CPrintJobManager* CPrintJobManager::NewLC(
+ CRealFactory* aFactory,
+ CImagePrintEngine* aDLLEngine )
+ {
+ CPrintJobManager* self = new ( ELeave ) CPrintJobManager(
+ aFactory, aDLLEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ return self;
+ }
+
+// Constructor
+CPrintJobManager::CPrintJobManager(
+ CRealFactory* aFactory,
+ CImagePrintEngine* aDLLEngine ) :
+ iFactory( aFactory ),
+ iDLLEngine( aDLLEngine )
+ {
+ }
+
+// Destructor
+CPrintJobManager::~CPrintJobManager()
+ {
+ LOG("CPrintJobManager::~CPrintJobManager BEGIN");
+
+ iImages.ResetAndDestroy();
+ iImages.Close();
+
+ // Cancel current print job at exit
+ if(IsPrinting())
+ {
+ TRAP_IGNORE( CancelL() );
+ }
+
+ LOG("CPrintJobManager::~CPrintJobManager END");
+ }
+
+// Second phase constructor
+void CPrintJobManager::ConstructL()
+ {
+ }
+
+// Creates a new print job
+TInt CPrintJobManager::CreatePrintJobL(
+ TInt aPrinterId )
+ {
+ LOG("CPrintJobManager::CreatePrintJobL BEGIN");
+ iPrintingOnGoing = EFalse;
+ // Creates a print job
+ MPrintEventObserver* notifier = iFactory->PrintEventObserverIF();
+ iPrinterUid = aPrinterId;
+
+ TInt printJobError = iFactory->Engine()->CreatePrintJobL(
+ aPrinterId, iDLLEngine->FileArray(), *notifier );
+
+ iImages.ResetAndDestroy();
+
+ for ( TInt i(0) ; i < iDLLEngine->FileArray().Count() ; i++ )
+ {
+ HBufC* image = iDLLEngine->FileArray()[i]->AllocLC();
+ iImages.AppendL( image );
+ CleanupStack::Pop( image );
+ }
+
+ LOG1( "CPrintJobManager::CreatePrintJobL END, err: %d", printJobError );
+ return printJobError;
+ }
+
+// Submits the created print job
+void CPrintJobManager::PrintL(
+ MPrintJobObserver* aObserver )
+ {
+ LOG("CPrintJobManager::PrintL BEGIN");
+ TInt getSettings;
+ iPrintingOnGoing = ETrue;
+
+ //Get current template UID from settings manager
+ TInt uid = iFactory->SettingsIF()->TemplateUid();
+
+ LOG1("Print done with id: %d", uid);
+
+ //Set the UID to Image Print Engine.
+ TInt err = iFactory->Engine()->SetJobSettingL(
+ EPrintCapabLayout, uid, getSettings );
+ LOG1("CPrintJobManager::PrintL SetJobSettingL err: %d", err);
+
+ if ( err == KErrNotFound )
+ {
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_NOT_FOUND_ERROR );
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ CleanupStack::PushL( errornote );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( errornote );
+ CleanupStack::PopAndDestroy( buf );
+ }
+ if ( err != KErrNone )
+ {
+ iPrintingOnGoing = EFalse;
+ User::Leave( err );
+ }
+ err = iFactory->Engine()->SubmitPrintJobL();
+ LOG1("CPrintJobManager::PrintL SubmitPrintJobL err: %d", err);
+ if ( err == KErrNotFound )
+ {
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_NOT_FOUND_ERROR );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+ if ( err != KErrNone )
+ {
+ iPrintingOnGoing = EFalse;
+ User::Leave( err );
+ }
+ iObserver = aObserver;
+ LOG("CPrintJobManager::PrintL END");
+ }
+
+// Cancels printing
+void CPrintJobManager::CancelL()
+ {
+ LOG("CPrintJobManager::CancelL BEGIN");
+ if ( IsPrinting() )
+ {
+ iCancelling = ETrue;
+ TInt err = iFactory->Engine()->CancelPrintJob();
+ if ( err )
+ {
+ LOG1("CPrintJobManager::CancelL failed err: %d", err);
+ if ( err == EPbStatusErrorReasonHardwarePrinterUnavailable )
+ {
+ //Printer was not ready, retry after a while a couple of times
+ for( TInt i=0; i<KCancelRetries; i++ )
+ {
+ // If cancellation doesn't work as expected. Add here Periodic timer.
+ err = iFactory->Engine()->CancelPrintJob();
+ if ( err == KErrNone )
+ {
+ break;
+ }
+ else
+ {
+ LOG1("CPrintJobManager::CancelL failed err: %d", err);
+ }
+ }
+ }
+ else
+ {
+ iCancelling = EFalse;
+ User::LeaveIfError( err );
+ }
+ }
+ // Cancellation is returned to UI after PrintJobProgress returns completion status
+ iPrintingOnGoing = EFalse;
+ }
+ else
+ {
+ if(iObserver)
+ {
+ iObserver->JobFinished();
+ }
+ }
+
+ LOG("CPrintJobManager::CancelL END");
+ }
+
+// Returns the images from current print job.
+void CPrintJobManager::GetPrintJobL( RPointerArray<TDesC>& aImages )
+ {
+ for ( TInt i(0); i < iImages.Count(); i++ )
+ {
+ aImages.AppendL( iImages[i] );
+ }
+ }
+
+// Returns the status of the printing
+TBool CPrintJobManager::IsPrinting() const
+ {
+ return iPrintingOnGoing;
+ }
+
+// Called by engine for progress notifications
+void CPrintJobManager::PrintJobProgress(
+ TInt aStatus,
+ TInt aPercentCompletion,
+ TInt aJobStateCode )
+ {
+ if ( aStatus == EActive )
+ {
+ iPrintingOnGoing = ETrue;
+ iObserver->PrintProgress( aPercentCompletion );
+ }
+ else
+ {
+ if ( aJobStateCode == ECancelling && aStatus == EDone )
+ {
+ iCancelling = EFalse;
+ iPrintingOnGoing = EFalse;
+ iObserver->JobError( aJobStateCode, KErrNone );
+ }
+ else if ( iCancelling && aStatus == EDone)
+ {
+ iCancelling = EFalse;
+ iObserver->JobFinished();
+ }
+ else if ( aJobStateCode == ECancellingNoMessage && aStatus == EDone )
+ {
+ iObserver->JobError( aJobStateCode, KErrNone );
+ }
+ else
+ {
+ iObserver->JobFinished();
+ iPrintingOnGoing = EFalse;
+ }
+ }
+ }
+
+// Called by engine to notify print errors
+void CPrintJobManager::PrintJobError(
+ TInt aError, TInt aErrorStringCode )
+ {
+ LOG2("[CPrintJobManager::PrintJobError] PrintJobError: %d, errorstring: %d", aError, aErrorStringCode);
+ if( iPrintingOnGoing )
+ {
+ if ( iObserver )
+ {
+ LOG("CPrintJobManager::PrintJobError Printing is going, send error to UI.");
+ iObserver->JobError( aError, aErrorStringCode );
+ }
+ }
+ // ERKZ-7JDFZ8 - Canceling Job hangs for ever
+ // If WLAN printer is turned off while printing UI receives KErrHostUnreach.
+ // If error is not handled, printing continues.
+ if ( aError == KErrHostUnreach )
+ {
+ if ( iObserver )
+ {
+ LOG("CPrintJobManager::PrintJobError KErrHostUnreach");
+ iObserver->JobError( KErrHostUnreach, aErrorStringCode );
+ }
+ }
+ iPrintingOnGoing = EFalse;
+ // show Pictbridge fatal errors and warnings always
+ if ( iFactory )
+ {
+ if( iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EUSB )
+ {
+ if ( iObserver )
+ {
+ LOG("CPrintJobManager::PrintJobError sending PictBridge error to UI...");
+ iObserver->JobError( aError, aErrorStringCode );
+ }
+ }
+ }
+ }
+
+// Called by engine to notify printer status (errors)
+void CPrintJobManager::PrinterStatus(
+ TInt aError,
+ TInt aErrorStringCode )
+ {
+ iObserver->JobStatusEvent( aError, aErrorStringCode );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/cprintsettings.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:
+*
+*/
+
+
+
+#include "cprintsettings.h"
+#include "cbasecapability.h"
+
+// CONSTRUCTION
+CPrintSettings::CPrintSettings()
+ {
+ }
+
+// Default destructor
+CPrintSettings::~CPrintSettings()
+ {
+ iCapabilities.ResetAndDestroy();
+ }
+
+// Clone this instance and return it
+CPrintSettings* CPrintSettings::CloneL()
+ {
+ CPrintSettings* clone = new ( ELeave ) CPrintSettings;
+ CleanupStack::PushL( clone );
+
+ TInt i( 0 );
+ TInt num( iCapabilities.Count() );
+ for ( i = 0; i < num; i++ )
+ {
+ User::LeaveIfError(
+ clone->iCapabilities.Append( iCapabilities[i]->CloneL() ) );
+ }
+
+ CleanupStack::Pop(); // clone
+
+ return clone;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/crealfactory.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,176 @@
+/*
+* 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:
+*
+*/
+
+
+#include "crealfactory.h"
+#include "cimageprintengine.h"
+#include "cdiscoverymanager.h"
+#include "cprintjobmanager.h"
+#include "cprinteventcatcher.h"
+#include "cidleprinteventcatcher.h"
+#include "csettingsmanager.h"
+#include "imageprint.h"
+#include "cimageprint.h"
+#include "clog.h"
+
+const TInt KMaxServerConnections( 3 );
+
+// CONSTRUCTION
+CRealFactory* CRealFactory::NewL(
+ CImagePrintEngine* aEngine )
+ {
+ CRealFactory* self = new ( ELeave ) CRealFactory( aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// Default constructor
+CRealFactory::CRealFactory( CImagePrintEngine* aEngine )
+ : CIFFactory( aEngine )
+ {
+ }
+
+// Destructor
+CRealFactory::~CRealFactory()
+ {
+ LOG("CRealFactory::~CRealFactory BEGIN");
+ if ( iEventCatcher )
+ {
+ iEventCatcher->UnRegisterObserver( iPrintJobMgr );
+ }
+ delete iPrintJobMgr;
+ delete iDiscoveryMgr;
+ delete iSettingsMgr;
+ delete iEventCatcher;
+ delete iIdleEventCatcher;
+
+ if ( iImageServer )
+ {
+ iImageServer->Close();
+ delete iImageServer;
+ }
+
+ iImagePrintClient.Close();
+ LOG("CRealFactory::~CRealFactory END");
+ }
+
+// 2nd phase constructor
+void CRealFactory::ConstructL()
+ {
+ iImageServer = new ( ELeave ) CImagePrint;
+ iImageServer->ConnectL();
+
+ iEventCatcher = CPrintEventCatcher::NewL( this, iPrintEngine );
+ iIdleEventCatcher = CIdlePrintEventCatcher::NewL( this /*aIdleObserver*/ );
+ iDiscoveryMgr = CDiscoveryManager::NewL( this );
+ iPrintJobMgr = CPrintJobManager::NewL( this, iPrintEngine );
+ iSettingsMgr = CSettingsManager::NewL( this );
+
+ iEventCatcher->RegisterObserver( iPrintJobMgr );
+ iImageServer->RegisterIdleObserver( iIdleEventCatcher );
+
+ User::LeaveIfError( iImagePrintClient.ConnectL() );
+ }
+
+// Discovery interface
+MDiscovery* CRealFactory::DiscoveryIF()
+ {
+ return iDiscoveryMgr;
+ }
+
+// Settings interface
+MPrintSettings* CRealFactory::SettingsIF()
+ {
+ return iSettingsMgr;
+ }
+
+// Print job interface
+MPrintJob* CRealFactory::PrintJobIF()
+ {
+ return iPrintJobMgr;
+ }
+
+// Returns event catcher
+MPrintEventObserver* CRealFactory::PrintEventObserverIF()
+ {
+ return iEventCatcher;
+ }
+
+MPrintEventRegisterIF* CRealFactory::PrintEventRegisterIF()
+ {
+ return iEventCatcher;
+ }
+
+// Restarts Engine
+void CRealFactory::RestartEngine()
+ {
+ // No implementation
+ }
+
+// Returns Engine
+CImagePrint* CRealFactory::Engine()
+ {
+ return iImageServer;
+ }
+
+TBool CRealFactory::IsPrinting() const
+ {
+ return iPrintJobMgr->IsPrinting();
+ }
+
+
+MIdlePrintEventRegisterIF* CRealFactory::IdlePrintEventRegisterIF()
+ {
+ return iIdleEventCatcher;
+ }
+
+RImagePrintClient CRealFactory::ImagePrintClient()
+ {
+ return iImagePrintClient;
+ }
+
+TBool CRealFactory::IsApplicationAlreadyInUse()
+ {
+ TBool retValue = EFalse;
+ TInt serverConnections = 0;
+ TInt err = iImagePrintClient.CountConnections( serverConnections );
+ if( err != KErrNone )
+ {
+ return EFalse;
+ }
+
+ // if server has already two connections
+ if( serverConnections == KMaxServerConnections )
+ {
+ //if another connection IS NOT pictbridge
+ TInt mode = iImagePrintClient.IsPictBridgeMode();
+ if( mode < 0 )
+ {
+ retValue = EFalse;
+ }
+ }
+ // too many connection
+ if( serverConnections > KMaxServerConnections )
+ {
+ retValue = EFalse;
+ }
+ return retValue;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/csettingsmanager.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,691 @@
+/*
+* 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:
+*
+*/
+
+
+#include <fbs.h>
+#include <eikenv.h>
+#include <e32std.h>
+
+#include "tprintcapability.h"
+#include "csettingsmanager.h"
+#include "ctemplatesettings.h"
+#include "cprintsettings.h"
+#include "ctintcapability.h"
+#include "clistcapability.h"
+#include "cfloatcapability.h"
+#include "ctemplatedata.h"
+#include "printcapabilitycodes.h"
+#include "settingsconverter.h"
+#include "crealfactory.h"
+#include "imageprint.h"
+#include "cimageprint.h"
+#include "imageprintvariant.h"
+#include <centralrepository.h>
+#include "imageprintprivatecrkeys.h"
+#include "mdiscovery.h"
+#include "clog.h"
+
+namespace
+ {
+ const TInt KDefaultPrinterNameMaxLength = 100;
+ const TInt KTemplateSize = 16;
+ const TInt KTemplates[] = {1554,1552,1565,1555,1501,1553,1551,1558,1502,1504,1564,1506,1509,1512,1513,1516};
+ }
+
+#include "clog.h"
+
+// CONSTRUCTION
+CSettingsManager* CSettingsManager::NewL(
+ CRealFactory* aFactory )
+ {
+ CSettingsManager* self = CSettingsManager::NewLC(
+ aFactory );
+ CleanupStack::Pop(); // self
+
+ return self;
+ }
+
+CSettingsManager* CSettingsManager::NewLC(
+ CRealFactory* aFactory )
+ {
+ CSettingsManager* self =
+ new ( ELeave ) CSettingsManager( aFactory );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ return self;
+ }
+
+// Constrcutor
+CSettingsManager::CSettingsManager(
+ CRealFactory* aFactory ) :
+ iFactory( aFactory ),
+ iActivePage( 1 )
+ {
+ }
+
+// Destructor
+CSettingsManager::~CSettingsManager()
+ {
+ delete iPrintSettings;
+ delete iTemplateSettings;
+ delete iCurrentPrinterName;
+ delete iCRSession;
+ iNumberOfCopiesArray.Close();
+ iNumberOfCopiesCumulativeArray.Close();
+ }
+
+// 2nd phase constructor
+void CSettingsManager::ConstructL()
+ {
+ iPrintSettings = new ( ELeave ) CPrintSettings;
+ iTemplateSettings = CTemplateSettings::NewL( iFactory );
+
+ iCRSession = CRepository::NewL( KCRUidImagePrint );
+ }
+
+// Clones the current template settings
+CTemplateSettings* CSettingsManager::TemplateSettingsL()
+ {
+ return iTemplateSettings->CloneL();
+ }
+
+// Changes active template to a new one
+void CSettingsManager::SetActiveTemplateL(
+ TUint aUid )
+ {
+ LOG1( "CSettingsManager::SetActiveTemplateL START || aUid = %d", aUid );
+ // Set active template to preview manager, if one available
+ iTemplateSettings->iActiveTemplateUid = aUid;
+
+ CListCapability* capab = static_cast<CListCapability*>(
+ FetchCapabilityL( EPrintCapabLayout ) );
+ capab->iValue = aUid;
+ LOG1( "CSettingsManager::SetActiveTemplateL || iImagesOnPage = %d", iImagesOnPage );
+ }
+
+// Returns the number of pages
+TUint CSettingsManager::NumOfPagesL()
+ {
+ // Always 1, fix this for the release 2
+ // return iFactory->Engine()->GetNumPrintPages();
+
+ TInt num( 1 );
+ return num;
+ }
+
+// Returns the number of copies
+TInt CSettingsManager::NumberOfCopies( RArray<TInt>& aArray )
+ {
+ TInt err( KErrNone );
+ aArray.Reset();
+ for( TInt i=0; i<iNumberOfCopiesArray.Count(); ++i )
+ {
+ err = aArray.Append( iNumberOfCopiesArray[ i ] );
+ if( err != KErrNone )
+ {
+ return err;
+ }
+ }
+ return KErrNone;
+ }
+
+TInt CSettingsManager::NumberOfCopies( TInt& aNumberOfCopies, TInt aIndex )
+ {
+ if( -1 < aIndex && aIndex < iNumberOfCopiesArray.Count() )
+ {
+ aNumberOfCopies = iNumberOfCopiesArray[ aIndex ];
+ return KErrNone;
+ }
+ else
+ {
+ return KErrArgument;
+ }
+ }
+
+// Sets the number of copies
+TInt CSettingsManager::SetNumberOfCopiesL( const RArray<TInt>& aArray )
+ {
+ TInt err( KErrNone );
+ TInt numberOfCopiesCumulative( 1 );
+ iNumberOfCopiesArray.Close();
+ iNumberOfCopiesCumulativeArray.Close();
+ for( TInt i=0; i<aArray.Count(); ++i )
+ {
+ err = iNumberOfCopiesArray.Append( aArray[ i ] );
+ if( err != KErrNone )
+ {
+ return err;
+ }
+ err = iNumberOfCopiesCumulativeArray.Append( numberOfCopiesCumulative );
+ numberOfCopiesCumulative += aArray[ i ];
+ if( err != KErrNone )
+ {
+ return err;
+ }
+ }
+ return err;
+ }
+
+TInt CSettingsManager::UpdateNumberOfCopiesToServer()
+ {
+ return iFactory->Engine()->SetNumberOfCopies( iNumberOfCopiesArray );
+ }
+
+// Returns
+TBool CSettingsManager::IsMMC()
+ {
+ TBool retVal = EFalse;
+ TInt supportedProtocols = iFactory->DiscoveryIF()->SupportedProtocols();
+
+ if( (supportedProtocols & KImagePrint_PrinterProtocol_DPOF) &&
+ ( iPrinterUid == iMMCUid ))
+ {
+ retVal = ETrue;
+ }
+ LOG1( "CSettingsManager::IsMMC: %d ", retVal );
+ return retVal;
+ }
+
+// Changes active page for drawing a new preview
+void CSettingsManager::SetActivePageL(
+ TUint aActivePage )
+ {
+ }
+
+// Returns current active page
+TUint CSettingsManager::CurActivePageL()
+ {
+ TUint num( 1 );
+ return num;
+ }
+
+// Clones current print settings
+CPrintSettings* CSettingsManager::PrinterSettingsL()
+ {
+ return iPrintSettings->CloneL();
+ }
+
+// Sets all settings, not supported at the moment
+void CSettingsManager::SetPrinterSettingsL(
+ CPrintSettings& /*aSettings*/ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+// Sets a single setting
+TInt CSettingsManager::SetPrinterSettingL(
+ CBaseCapability& aCapab )
+ {
+ LOG( "CSettingsManager::SetPrinterSettingL START" );
+ TInt getSettings( 0 );
+ TInt err = iFactory->Engine()->SetJobSettingL(
+ aCapab.iUid, aCapab.iValue, getSettings );
+ getSettings = 0;
+ User::LeaveIfError( err );
+
+ CBaseCapability* capab = FetchCapabilityL( aCapab.iUid );
+ capab->iValue = aCapab.iValue;
+
+#ifdef IMG_PRINT_DYNAMIC_PRINT_SETTINGS
+ // Do not initialize if only template was changed
+ if( aCapab.iUid != 500 )
+ {
+ LOG( "CSettingsManager::SetPrinterSettingL || aCapab.iUid != 500" );
+ InitCapabilitiesL( iPrinterUid );
+ InitTemplateSettingsL();
+ }
+ else
+ {
+ LOG( "CSettingsManager::SetPrinterSettingL || aCapab.iUid == 500" );
+ SetActiveTemplateL( aCapab.iValue );
+ }
+#else
+ InitCapabilitiesL( iPrinterUid );
+ InitTemplateSettingsL();
+#endif
+
+ LOG1( "CSettingsManager::SetPrinterSettingL getSettings = %d", getSettings );
+ return getSettings;
+ }
+
+// Initializes the printer settings
+void CSettingsManager::InitSettingsL(
+ TInt aPrinterUid,
+ TInt aMMCUid )
+ {
+ LOG1( "CSettingsManager::InitSettingsL aPrinterUid = %d", aPrinterUid );
+ LOG1( "CSettingsManager::InitSettingsL aMMCUid = %d", aMMCUid );
+
+ iMMCUid = aMMCUid;
+ InitCapabilitiesL( aPrinterUid );
+ InitTemplateSettingsL();
+ iPrinterUid = aPrinterUid;
+ }
+
+// Inititalizes the capabilities
+void CSettingsManager::InitCapabilitiesL(
+ TInt aPrinterUid )
+ {
+ LOG1("CSettingsManager::InitCapabilitiesL Begin: %d", aPrinterUid);
+ RArray<TInt> capabIDs;
+ CleanupClosePushL( capabIDs );
+
+ // Get list of IDs
+ iFactory->Engine()->GetPrinterCapabilityIDsL( aPrinterUid, capabIDs );
+ CPrintSettings* printSettings = new ( ELeave ) CPrintSettings;
+ CleanupStack::PushL( printSettings );
+
+ TInt i( 0 );
+ TInt num( capabIDs.Count() );
+ LOG1("CSettingsManager::InitCapabilitiesL number of capabs: %d", num);
+ for ( i = 0; i < num; i++ )
+ {
+ TPrintCapability capab;
+ iFactory->Engine()->GetPrinterCapabilityL( aPrinterUid, capabIDs[i], capab );
+ capab.iType = TPrintCapability::Enum;
+
+ CBaseCapability* capability = 0;
+
+ // Create capability
+ switch ( capab.iType )
+ {
+ case TPrintCapability::Int:
+ capability = SettingsConverter::AddTIntCapabilityLC(
+ capab, i, capabIDs[i] );
+ break;
+
+ case TPrintCapability::Enum:
+ capability = SettingsConverter::AddListCapabilityLC(
+ capab, i, capabIDs[i], iFactory );
+ break;
+
+ case TPrintCapability::Float:
+ capability = SettingsConverter::AddFloatCapabilityLC(
+ capab, i, capabIDs[i] );
+ break;
+
+ default:
+ User::Leave( KErrUnknown );
+ break;
+ }
+ iFactory->Engine()->GetJobSetting( capabIDs[i], capability->iValue );
+
+ // Add the capability to the list
+ User::LeaveIfError(
+ printSettings->iCapabilities.Append( capability ) );
+ CleanupStack::Pop(); // capability
+ }
+
+ delete iPrintSettings;
+ iPrintSettings = printSettings;
+
+ CleanupStack::Pop(); // printSettings
+ CleanupStack::PopAndDestroy(); // capabIDs
+ LOG("CSettingsManager::InitCapabilitiesL End");
+ }
+
+// Initializes the templates
+void CSettingsManager::InitTemplateSettingsL()
+ {
+ LOG("CSettingsManager::InitTemplateSettingsL Begin");
+ CTemplateSettings* settings = CTemplateSettings::NewL( iFactory );
+ CleanupStack::PushL( settings );
+ TInt templateBuffer = iFactory->SettingsIF()->TemplateUid();
+
+ TInt i( 0 );
+ TInt num( iPrintSettings->iCapabilities.Count() );
+ for ( i = 0; i < num; i++ )
+ {
+ if ( iPrintSettings->iCapabilities[i]->iUid == EPrintCapabLayout )
+ {
+ TInt j( 0 );
+ CListCapability* layouts =
+ static_cast<CListCapability*>
+ ( iPrintSettings->iCapabilities[i] );
+ for ( j = 0; j < layouts->iEnumIDs.Count(); j++ )
+ {
+ // Create new template data with the icon and Uid value
+ CTemplateData* data = CTemplateData::NewL();
+ data->iUid = layouts->iEnumIDs[j];
+ CleanupStack::PushL( data );
+ LOG1( "CSettingsManager::InitTemplateSettingsL, UID: %d", data->iUid );
+ User::LeaveIfError( settings->iTemplates.Append( data ) );
+ CleanupStack::Pop( data );
+ }
+ }
+ }
+
+ // Sort the templates to "standard" order
+ CTemplateSettings* sortsettings = CTemplateSettings::NewL( iFactory );
+ CleanupStack::PushL( sortsettings );
+ for ( TInt i = 0; i < KTemplateSize; i++ )
+ {
+ for ( TInt j = 0; j < settings->iTemplates.Count(); j++ )
+ {
+ if ( KTemplates[i] == settings->iTemplates[j]->iUid )
+ {
+ CTemplateData* data = CTemplateData::NewL();
+ data->iUid = settings->iTemplates[j]->iUid;
+ CleanupStack::PushL( data );
+ LOG1( "CSettingsManager::InitTemplateSettingsL, UID: %d", data->iUid );
+ User::LeaveIfError( sortsettings->iTemplates.Append( data ) );
+ CleanupStack::Pop( data );
+ break;
+ }
+ }
+ }
+
+ CleanupStack::Pop( sortsettings );
+ CleanupStack::PopAndDestroy( settings );
+ delete iTemplateSettings;
+ iTemplateSettings = sortsettings;
+
+ TBool templateFound = EFalse;
+ if ( iTemplateSettings->iTemplates.Count() > 0 )
+ {
+ for (TInt g = 0; g < iTemplateSettings->iTemplates.Count(); g++)
+ {
+ if (iTemplateSettings->iTemplates[g]->iUid == templateBuffer)
+ {
+ iTemplateSettings->iActiveTemplateUid = templateBuffer;
+ templateFound = ETrue;
+ }
+ }
+ if (!templateFound){
+ iTemplateSettings->iActiveTemplateUid =
+ iTemplateSettings->iTemplates[0]->iUid;
+ }
+
+ SetActiveTemplateL( iTemplateSettings->iActiveTemplateUid );
+ }
+ // If there are no templates available, draw the preview using
+ // 1/page template
+ else
+ {
+ LOG("CSettingsManager::InitTemplateSettingsL || No templates available!");
+ SetActiveTemplateL( EPrintCapabLayout1UpMedium );
+ }
+ LOG("CSettingsManager::InitTemplateSettingsL End");
+ }
+
+// Fetches capability from the list and returns it
+CBaseCapability* CSettingsManager::FetchCapabilityL(
+ TInt aUid )
+ {
+ LOG1("CSettingsManager::FetchCapabilityL Begin: %d", aUid);
+ CBaseCapability* capab = NULL;
+ TInt found( KErrNotFound );
+
+ TInt i( 0 );
+ TInt num( iPrintSettings->iCapabilities.Count() );
+ for ( i = 0; i < num && found != KErrNone; i++ )
+ {
+ if ( iPrintSettings->iCapabilities[i]->iUid == aUid )
+ {
+ capab = iPrintSettings->iCapabilities[i];
+ found = KErrNone;
+ }
+ }
+
+ User::LeaveIfError( found );
+ LOG("CSettingsManager::FetchCapabilityL End");
+ return capab;
+ }
+
+TInt CSettingsManager::TemplateUid()
+ {
+ LOG1( "CSettingsManager::TemplateUid || iActiveTemplateUid = %d", iTemplateSettings->iActiveTemplateUid );
+ return iTemplateSettings->iActiveTemplateUid;
+ }
+
+TBool CSettingsManager::UpdatePageNumberL( TInt aCurrentImage )
+ {
+ TBool retValue = EFalse;
+ TUint pageNumber;
+
+ if( iNumberOfCopiesCumulativeArray.Count() > aCurrentImage-1 )
+ {
+ aCurrentImage = iNumberOfCopiesCumulativeArray[aCurrentImage-1];
+ }
+
+ pageNumber = aCurrentImage / iImagesOnPage;
+ if ( ( aCurrentImage % iImagesOnPage ) != 0 )
+ {
+ pageNumber++;
+ }
+
+ if ( iActivePage != pageNumber )
+ {
+ iActivePage = pageNumber;
+ retValue = ETrue;
+ }
+ return retValue;
+ }
+
+TInt CSettingsManager::PrinterUid()
+ {
+ return iPrinterUid;
+ }
+
+
+TBool CSettingsManager::GetUsbState()
+ {
+ return iUsbConnected;
+ }
+
+void CSettingsManager::SetUsbState( TBool aConnected )
+ {
+ iUsbConnected = aConnected;
+ }
+
+TInt CSettingsManager::GetDefaultPrinterProtocol()
+ {
+ TInt retValue;
+ TInt err = iCRSession->Get( KDefaultPrinterProtocol, retValue );
+
+ LOG2("CSettingsManager::GetDefaultPrinterProtocol: %d, err: %d", retValue, err);
+ return ( err ) ? err : retValue;
+ }
+
+
+TInt CSettingsManager::SetDefaultPrinterProtocol( TInt aProtocol )
+ {
+ TInt err = iCRSession->Set( KDefaultPrinterProtocol, aProtocol );
+ LOG2("CSettingsManager::SetDefaultPrinterProtocol: %d, err: %d", aProtocol, err);
+ return err;
+ }
+
+TInt CSettingsManager::GetCurrentPrinterProtocol()
+ {
+ LOG1("CSettingsManager::GetCurrentPrinterProtocol: %d", iCurrentPrinterProtocol );
+ return iCurrentPrinterProtocol;
+ }
+
+void CSettingsManager::SetCurrentPrinterProtocol( TInt aProtocol )
+ {
+ LOG1("CSettingsManager::SetCurrentPrinterProtocol: %d", aProtocol );
+ iCurrentPrinterProtocol = aProtocol;
+ }
+
+TUint CSettingsManager::GetCurrentPrinterVendor()
+ {
+ LOG1("CSettingsManager::GetCurrentPrinterVendor() vendor: %d",iVendor);
+ return iVendor;
+ }
+
+void CSettingsManager::SetCurrentPrinterVendor( TUint aVendor )
+ {
+ LOG1("CSettingsManager::SetCurrentPrinterVendor() vendor: %d",aVendor);
+ iVendor = aVendor;
+ }
+
+TInt CSettingsManager::GetDefaultPrintID()
+ {
+ TInt retValue;
+ TInt err = iCRSession->Get( KDefaultPrinterID, retValue );
+ LOG2("CSettingsManager::GetDefaultPrintID: get: %d, err: %d", retValue, err);
+ return ( err ) ? err : retValue;
+ }
+
+TInt CSettingsManager::SetDefaultPrinterID( TInt aId )
+ {
+ TInt err = iCRSession->Set( KDefaultPrinterID, aId );
+ LOG2("CSettingsManager::SetDefaultPrinterID: set: %d, err: %d", aId, err);
+ return err;
+ }
+
+HBufC* CSettingsManager::GetDefaultPrinterNameLC()
+ {
+ HBufC* name = HBufC::NewLC( KDefaultPrinterNameMaxLength );
+ TPtr ptr( name->Des() );
+ TInt err = iCRSession->Get( KDefaultPrinterName, ptr );
+ LOG2("CSettingsManager::GetDefaultPrinterNameLC: name: %S, err: %d", &ptr, err);
+ return name;
+ }
+
+TInt CSettingsManager::SetDefaultPrinterNameL( const TDesC& aPrinterName )
+ {
+ TInt err = KErrNone;
+ HBufC* stringholder = HBufC::NewLC( aPrinterName.Length() );
+ *stringholder = aPrinterName;
+
+ // Clear the printer name string from all formatting tabs & numbers
+ TPtr ptr = stringholder->Des();
+ TInt pos = stringholder->Find( KTabChar );
+ if ( pos == 1 ) // 1st possible icon formatting tab is at pos 1
+ {
+ ptr.Delete( 0, 2 ); // delete the first icon tab and the number previous to it
+ pos = stringholder->Find( KTabChar );
+ }
+ while ( pos != KErrNotFound &&
+ pos != stringholder->Length() - 2 )
+ {
+ ptr.Delete( pos, 1); // delete all middle tabs
+ pos = stringholder->Find( KTabChar );
+ }
+ // 2nd possible iconformatting tab is 2nd last char
+ if ( pos != KErrNotFound &&
+ pos == stringholder->Length() - 2 )
+ {
+ // delete the 2nd icon formatting tab and the number next to it
+ ptr.Delete( stringholder->Length() - 2, 2 );
+ }
+
+ err = iCRSession->Set( KDefaultPrinterName, *stringholder );
+ LOG2("CSettingsManager::SetDefaultPrinterNameL: name: %S err: %d", &ptr, err);
+ CleanupStack::PopAndDestroy( stringholder );
+ return err;
+ }
+
+HBufC* CSettingsManager::GetCurrentPrinterName()
+ {
+ TPtr ptr = iCurrentPrinterName->Des();
+ LOG1("CSettingsManager::GetCurrentPrinterName: name: %S", &ptr );
+ return iCurrentPrinterName;
+ }
+
+TInt CSettingsManager::SetCurrentPrinterName( const TDesC& aPrinterName )
+ {
+ if( iCurrentPrinterName )
+ {
+ delete iCurrentPrinterName;
+ iCurrentPrinterName = NULL;
+ }
+
+ TInt err;
+ HBufC* tmpBuf = aPrinterName.Alloc();
+ if( !tmpBuf )
+ {
+ return KErrGeneral;
+ }
+ else
+ {
+ err = KErrNone;
+ iCurrentPrinterName = tmpBuf;
+ }
+
+ // Clear the printer name string from all formatting tabs & numbers
+ TPtr ptr = iCurrentPrinterName->Des();
+ TInt pos = iCurrentPrinterName->Find( KTabChar );
+ if ( pos == 1 ) // 1st possible icon formatting tab is at pos 1
+ {
+ ptr.Delete( 0, 2 ); // delete the first icon tab and the number previous to it
+ pos = iCurrentPrinterName->Find( KTabChar );
+ }
+ while ( pos != KErrNotFound &&
+ pos != iCurrentPrinterName->Length() - 2 )
+ {
+ ptr.Delete( pos, 1); // delete all middle tabs
+ pos = iCurrentPrinterName->Find( KTabChar );
+ }
+ // 2nd possible iconformatting tab is 2nd last char
+ if ( pos != KErrNotFound &&
+ pos == iCurrentPrinterName->Length() - 2 )
+ {
+ // delete the 2nd icon formatting tab and the number next to it
+ ptr.Delete( iCurrentPrinterName->Length() - 2, 2 );
+ }
+
+ LOG1("CSettingsManager::SetCurrentPrinterName: name: %S", &ptr );
+ return err;
+ }
+
+HBufC* CSettingsManager::GetCurrentPaperSizeTextL()
+ {
+ HBufC* retValue = NULL;
+ CListCapability* paperSizeCapab = NULL;
+ // Searches the paper size capability from the capability list
+ // Search the UID for paper size (= 4)
+ TInt counter = iPrintSettings->iCapabilities.Count();
+ for( TInt i = 0 ; i < counter ; i++ )
+ {
+
+ //Use the searched ListCapability
+ if( iPrintSettings->iCapabilities[ i ]->iUid == EPrintCapabPaperSize )
+ {
+ paperSizeCapab = static_cast< CListCapability* >
+ ( iPrintSettings->iCapabilities[ i ] );
+ }
+ }
+
+
+ TBool found( EFalse );
+
+ if ( paperSizeCapab )
+ {
+ const TInt expectedNumberOfStrings( 2 );
+ CDesCArrayFlat* strings =
+ new ( ELeave ) CDesCArrayFlat( expectedNumberOfStrings );
+ CleanupStack::PushL( strings );
+
+ TInt i( 0 );
+ TInt counter = paperSizeCapab->iEnumIDs.Count();
+ for ( i = 0; i < counter && !found; i++ )
+ {
+ if ( paperSizeCapab->iEnumIDs[i] ==
+ paperSizeCapab->iValue )
+ {
+ retValue = paperSizeCapab->iTexts[i];
+ }
+ }
+ CleanupStack::PopAndDestroy(); // strings
+ }
+ return retValue;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/ctemplatedata.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* 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:
+*
+*/
+
+
+#include "ctemplatedata.h"
+
+// CONSTRUCTION
+CTemplateData* CTemplateData::NewL()
+ {
+ CTemplateData* self = CTemplateData::NewLC();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CTemplateData* CTemplateData::NewLC()
+ {
+ CTemplateData* self = new ( ELeave ) CTemplateData;
+ CleanupStack::PushL( self );
+ return self;
+ }
+
+// Default constructor
+CTemplateData::CTemplateData()
+ {
+ }
+
+// Destructor
+CTemplateData::~CTemplateData()
+ {
+ }
+
+// Clones single template data instance
+CTemplateData* CTemplateData::CloneL()
+ {
+ CTemplateData* self = CTemplateData::NewL();
+ self->iUid = iUid;
+ return self;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/ctemplatesettings.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,127 @@
+/*
+* 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:
+*
+*/
+
+
+#include "ctemplatesettings.h"
+
+#include "ctemplatedata.h"
+#include "tprinter.h"
+#include "mdiscoveryobserver.h"
+#include "crealfactory.h"
+#include "mprintsettings.h"
+#include "clog.h"
+
+// BT Template ID's
+const TInt KOneUpBorderless( 1554 );
+const TInt KOneUpBorder( 1555 );
+const TInt KOneUpStick( 1565 );
+const TInt KFourUpStick( 1564 );
+const TInt KSixteenUpStick( 1516 );
+const TInt KOneUp( 1501 );
+
+
+// CONSTRUCTION
+CTemplateSettings* CTemplateSettings::NewL( CRealFactory* aFactory )
+ {
+ CTemplateSettings* self = CTemplateSettings::NewLC( aFactory );
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CTemplateSettings* CTemplateSettings::NewLC( CRealFactory* aFactory )
+ {
+ CTemplateSettings* self = new ( ELeave ) CTemplateSettings( aFactory );
+ CleanupStack::PushL( self );
+ return self;
+ }
+
+// Default constructor
+CTemplateSettings::CTemplateSettings( CRealFactory* aFactory )
+ {
+ iActiveTemplateUid = KMaxTUint32;
+ iFactory = aFactory;
+ }
+
+// Destructor
+CTemplateSettings::~CTemplateSettings()
+ {
+ iTemplates.ResetAndDestroy();
+ }
+
+// Clones current template settings
+CTemplateSettings* CTemplateSettings::CloneL()
+ {
+ TBool dropTemplates = EFalse;
+ CTemplateSettings* self = CTemplateSettings::NewLC( iFactory );
+
+ self->iActiveTemplateUid = iActiveTemplateUid;
+ TInt num( iTemplates.Count() );
+ TInt templateID;
+
+ if( (iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EWLAN) ||
+ (iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EBPP) ||
+ (iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EMMC) ||
+ (iFactory->SettingsIF()->GetCurrentPrinterProtocol() == MDiscoveryObserver::EUSB) )
+ {
+ LOG("[CTemplateSettings] Templates dropped");
+ dropTemplates = ETrue;
+ }
+
+ LOG1("CTemplateSettings: Number of templates received from engine: %d",num);
+
+ for ( TInt i( 0 ); i < num; i++ )
+ {
+ templateID = iTemplates[i]->iUid;
+
+
+ if( (dropTemplates && (templateID == KOneUpBorderless || templateID == KOneUpBorder || templateID == KOneUpStick || templateID == KFourUpStick || templateID == KSixteenUpStick || templateID == KOneUp )) || !dropTemplates)
+ {
+ LOG1("CTemplateSettings: Template ID: %d ADDED", templateID);
+ User::LeaveIfError( self->iTemplates.Append( iTemplates[i]->CloneL() ) );
+ }
+ else
+ {
+ LOG1("CTemplateSettings: Template ID: %d SKIPPED",templateID);
+ }
+ }
+
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+// Sets the new active template
+void CTemplateSettings::SetActiveTemplateL(
+ TInt aUid )
+ {
+ LOG1( "CTemplateSettings:SetActiveTemplateL || aUid = %d", aUid );
+ TInt err( KErrNotFound );
+
+ TInt num( iTemplates.Count() );
+ for ( TInt i( 0 ); i < num && err != KErrNone; i++ )
+ {
+ if ( aUid == iTemplates[i]->iUid )
+ {
+ iActiveTemplateUid = aUid;
+ err = KErrNone;
+ }
+ }
+ LOG2( "CTemplateSettings:SetActiveTemplateL uid: %d, err: %d", aUid, err );
+ // Leave when not found
+ User::LeaveIfError( err );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/ctintcapability.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,83 @@
+/*
+* 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:
+*
+*/
+
+
+#include <StringLoader.h>
+#include <akntextsettingpage.h>
+#include <imageprintengine.rsg>
+
+#include "ctintcapability.h"
+
+const TInt KMaxTIntCharNum( 11 );
+
+// Destructor
+CTIntCapability::~CTIntCapability()
+ {
+ }
+
+// Creates text string for the settings list box
+HBufC* CTIntCapability::ListBoxTextL()
+ {
+ const TInt KGranularity( 4 );
+ TBuf<KMaxTIntCharNum> numStr;
+ numStr.Zero();
+ numStr.AppendNum( iValue );
+
+ CDesCArrayFlat* strings = new ( ELeave ) CDesCArrayFlat( KGranularity );
+ CleanupStack::PushL( strings );
+ strings->AppendL( iTitle );
+ strings->AppendL( numStr );
+
+ HBufC* buf = StringLoader::LoadL( R_QTN_LBOX_FORMAT, *strings );
+ CleanupStack::PopAndDestroy(); // strings
+
+ return buf;
+ }
+
+// Displays pop-up list for changing the active TInt value
+TBool CTIntCapability::LaunchPopupListL()
+ {
+ CAknIntegerSettingPage* page =
+ new ( ELeave ) CAknIntegerSettingPage(
+ &iTitle, EAknSettingPageNoOrdinalDisplayed, EAknCtIntegerEdwin,
+ R_DEF_INTEGER_EDITOR, 0, iValue );
+ CleanupStack::PushL( page );
+ page->ConstructL();
+ CleanupStack::Pop(); // page
+ page->IntegerEditorControl()->SetMinimumIntegerValue( iMin );
+ page->IntegerEditorControl()->SetMaximumIntegerValue( iMax );
+ TBool changed = page->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+
+ return changed;
+ }
+
+// Clones itself
+CBaseCapability* CTIntCapability::CloneL()
+ {
+ CTIntCapability* clone = new ( ELeave ) CTIntCapability;
+
+ clone->iIndexOnList = iIndexOnList;
+ clone->iMax = iMax;
+ clone->iMin = iMin;
+ clone->iTitle = iTitle;
+ clone->iUid = iUid;
+ clone->iValue = iValue;
+
+ return clone;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/settingsconverter.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,220 @@
+/*
+* 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:
+*
+*/
+
+
+#include <StringLoader.h>
+
+#include "settingsconverter.h"
+#include "ctintcapability.h"
+#include "clistcapability.h"
+#include "cfloatcapability.h"
+#include "stringids.h"
+#include "tprintcapability.h"
+#include "imageprintvariant.h"
+#include "clog.h"
+#include "crealfactory.h"
+
+const TInt KEngineLimitValue( -1 );
+const TInt KMenuItemsRequired( 2 );
+
+// Converts TCapability to CTIntCapability
+CTIntCapability* SettingsConverter::AddTIntCapabilityLC(
+ TPrintCapability& aCapability,
+ TInt aIndexOnList,
+ TInt aCapabUid )
+ {
+ LOG("SettingsConverter::AddTIntCapabilityLC Begin");
+ CTIntCapability* intC = new ( ELeave ) CTIntCapability;
+ CleanupStack::PushL( intC );
+
+ // If engine returns KEngineLimitValue as low/high limit then it means
+ // that there is no minimum or maximum limit
+ if ( aCapability.iLow == KEngineLimitValue )
+ {
+ intC->iMax = KMinTInt32;
+ }
+ else
+ {
+ intC->iMin = aCapability.iLow;
+ }
+
+ if ( aCapability.iHigh == KEngineLimitValue )
+ {
+ intC->iMax = KMaxTInt32;
+ }
+ else
+ {
+ intC->iMax = aCapability.iHigh;
+ }
+
+ // Initialize TInt capability and return it
+ intC->iTitle = SettingsConverter::TextStringLC( aCapabUid )->Des();
+ CleanupStack::PopAndDestroy(); // SettingsConverter text string
+ intC->iIndexOnList = aIndexOnList;
+ intC->iUid = aCapabUid;
+ intC->iValue = aCapability.iDefaultValue;
+
+ LOG("SettingsConverter::AddTIntCapabilityLC End");
+ return intC;
+ }
+
+// Converts TCapability to CListCapability
+CListCapability* SettingsConverter::AddListCapabilityLC(
+ TPrintCapability& aCapability,
+ TInt aIndexOnList,
+ TInt aCapabUid,
+ CRealFactory* aFactory )
+ {
+ LOG("SettingsConverter::AddListCapabilityLC Begin");
+ CListCapability* listC = new ( ELeave ) CListCapability( aFactory );
+ CleanupStack::PushL( listC );
+ listC->iIndexOnList = aIndexOnList;
+ listC->iUid = aCapabUid;
+
+ /* There's a problem with some usb printers:
+ They offer "normal" print quality twice and nothing else.
+ This has to be handled so that user is not shown the option
+ as he cannot change it anyway in this case */
+ TBool qualityDuplicates = EFalse;
+ if ( aCapabUid == EPrintCapabQuality &&
+ aCapability.iEnumCount == KMenuItemsRequired )
+ {
+ if ( aCapability.iEnumCodes[0] == aCapability.iEnumCodes[1] )
+ {
+ LOG("SettingsConverter::AddListCapabilityLC duplicate quality detected!");
+ qualityDuplicates = ETrue;
+ }
+ }
+
+ // If there is only one value for certain capability, empty
+ // title is added so the capability is not visible on the
+ // settings menu.
+ if( aCapability.iEnumCount < KMenuItemsRequired || qualityDuplicates )
+ {
+ listC->iTitle = SettingsConverter::TextStringLC( 0 )->Des();
+ }
+ else
+ {
+ listC->iTitle = SettingsConverter::TextStringLC( aCapabUid )->Des();
+ }
+
+ CleanupStack::PopAndDestroy(); // SettingsConverter text string
+ listC->iValue = aCapability.iDefaultValue;
+
+ TBool enumLabels = listC->iTitle.CompareF( KNullDesC() ) != 0;
+ TInt i( 0 );
+ TInt num( aCapability.iEnumCount );
+ for ( i = 0; i < num; i++ )
+ {
+ User::LeaveIfError(
+ listC->iEnumIDs.Append( aCapability.iEnumCodes[i] ) );
+
+ // Find matching text for the enumeration if the capability is
+ // visible on the settings view
+#ifdef IMG_PRINT_DYNAMIC_PRINT_SETTINGS
+ if ( enumLabels || aCapability.iEnumCount < KMenuItemsRequired )
+#else
+ // Not for layout if no dynamic print settings
+ if (( enumLabels || aCapability.iEnumCount < KMenuItemsRequired ) &&
+ aCapabUid != EPrintCapabLayout )
+#endif
+ {
+ LOG("SettingsConverter::AddListCapabilityLC Adding real value");
+ User::LeaveIfError( listC->iTexts.Append(
+ SettingsConverter::TextStringLC( aCapability.iEnumCodes[i] )));
+ CleanupStack::Pop(); // SettingsConverter text string
+ }
+ else
+ {
+ LOG("SettingsConverter::AddListCapabilityLC Adding EMPTY value");
+ User::LeaveIfError( listC->iTexts.Append(
+ StringLoader::LoadLC( R_EMPTY ) ) );
+ CleanupStack::Pop(); // SettingsConverter text string
+ }
+ }
+
+ if ( aCapability.iEnumCount > 0 )
+ {
+ i = 0;
+ // Check that current active capability code is found from the
+ // list of codes and activate first one if not found
+ TInt num( aCapability.iEnumCount );
+ while ( i < num &&
+ listC->iValue != aCapability.iEnumCodes[i] )
+ {
+ i++;
+ }
+ if ( i >= aCapability.iEnumCount )
+ {
+ listC->iValue = aCapability.iEnumCodes[0];
+ }
+ }
+
+ LOG("SettingsConverter::AddListCapabilityLC End");
+ return listC;
+ }
+
+// Converts TCapability to CFloatCapability
+CFloatCapability* SettingsConverter::AddFloatCapabilityLC(
+ TPrintCapability& aCapability,
+ TInt aIndexOnList,
+ TInt aCapabUid )
+ {
+ LOG("SettingsConverter::AddFloatCapabilityLC Begin");
+ CFloatCapability* floatC = new ( ELeave ) CFloatCapability;
+ CleanupStack::PushL( floatC );
+
+ floatC->iIndexOnList = aIndexOnList;
+ floatC->iUid = aCapabUid;
+ floatC->iTitle = SettingsConverter::TextStringLC( aCapabUid )->Des();
+ CleanupStack::PopAndDestroy(); // SettingsConverter text string
+
+ floatC->SetValues( aCapability.iLow,
+ aCapability.iDefaultValue, aCapability.iHigh );
+
+ LOG("SettingsConverter::AddFloatCapabilityLC End");
+ return floatC;
+ }
+
+// Fetches text string based on the enumeration ID
+HBufC* SettingsConverter::TextStringLC(
+ TInt aId )
+ {
+ LOG1("SettingsConverter::TextStringLC Begin: %d", aId );
+ HBufC* buf = 0;
+ TBool found( EFalse );
+
+ TInt i( 0 );
+ for ( i = 0; i < KConverterTableCount && !found; i++ )
+ {
+ if ( aId == KIDConverterTable[i][0] )
+ {
+ buf = StringLoader::LoadLC( KIDConverterTable[i][1] );
+ found = ETrue;
+ }
+ }
+
+ if ( !found )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ LOG("SettingsConverter::TextStringLC End");
+ return buf;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprinteng/src/tpreviewimageinfo.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* 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:
+*
+*/
+
+
+#include "tpreviewimageinfo.h"
+
+// Default constructor
+TPreviewImageInfo::TPreviewImageInfo()
+ {
+ // Means that the image won't get rotated by default
+ iRotated = EFalse;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/group/aiwprintingprovider.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,85 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+
+#include "aiwprintingprovideruid.h"
+
+TARGET aiwprintingprovider.dll
+
+#ifndef S60_2_6_BASE
+TARGETTYPE PLUGIN
+#else
+TARGETTYPE ECOMIIC
+#endif
+CAPABILITY CAP_ECOM_PLUGIN
+UID 0x10009D8D KAiwPrintingProviderDllUid
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE dllmain.cpp
+SOURCE caiwprintpreviewprovider.cpp
+SOURCE caiwimageprintif.cpp
+
+USERINCLUDE ../../../clog/inc
+USERINCLUDE . ../inc ../../inc
+USERINCLUDE ../rss
+USERINCLUDE ../../imageprinteng/inc
+USERINCLUDE ../../imgpprintdll/inc
+USERINCLUDE ../../imageprintapp/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintServer/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintLibrary/inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+START RESOURCE ../rss/101ffaa2.rss
+TARGET aiwprintingprovider.rsc
+END
+
+START RESOURCE ../rss/aiwprintingprovider.rss
+#ifdef __S60_50__
+ LANGUAGE_IDS
+#else
+ LANG SC
+#endif
+HEADER
+TARGET aiwprintingprovider.rsc
+TARGETPATH resource
+END
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY cone.lib
+LIBRARY ecom.lib
+LIBRARY servicehandler.lib
+LIBRARY estor.lib
+LIBRARY apgrfx.lib
+LIBRARY apparc.lib
+LIBRARY ws32.lib
+LIBRARY efsrv.lib
+LIBRARY bafl.lib
+LIBRARY avkon.lib
+LIBRARY imgpprintdll.lib
+LIBRARY caf.lib
+LIBRARY imageconversion.lib
+LIBRARY platformenv.lib
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/group/aiwprintingprovideruid.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef AIFPRINTINGPROVIDERUID_H
+#define AIFPRINTINGPROVIDERUID_H
+
+#define KAiwPrintingProviderDllUid 0x101FFAA2
+#define KAiwPrintingProviderImplUid 0x101FFAA3
+#define KAiwPrintPreviewProviderImplUid 0x101FFAA4
+
+#endif // AIFPRINTINGPROVIDERUID_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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:
+*
+*/
+
+
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+aiwprintingprovider.mmp
+
+PRJ_TESTMMPFILES
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/inc/caiwimageprintif.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,66 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CAIWIMAGEPRINTIF_H
+#define CAIWIMAGEPRINTIF_H
+
+#include <AiwServiceIfMenu.h>
+#include <badesca.h>
+#include <eikenv.h>
+
+class CAiwImagePrintIf : public CAiwServiceIfMenu
+{
+ public:
+
+ ~CAiwImagePrintIf();
+
+ public:
+
+ CDesCArrayFlat* GetImageArrayL( const CAiwGenericParamList& aInParamList );
+
+ protected:
+
+ CAiwImagePrintIf();
+
+ protected: // From CAiwServiceIfMenu
+
+ TBool IsPrintingSupportedL( const CAiwGenericParamList& aInParamList );
+
+ TBool IsPrintingSupportedL( const TDesC& aFileName );
+
+ TBool IsProtectedL( const TDesC& aFileName );
+
+ TBool CheckMIMETypeL( const TDesC8& aMimeType, const TDesC& aFileName );
+
+ protected: // Implementation
+ void ConstructL();
+
+ protected: // data
+
+ CEikonEnv& iEikEnv; //Allow CAiwPrintingProvider and CAiwPreviewProvider
+ //to use Eikon Environment without CEikonEnv::Static()
+
+ private: //data
+
+ TInt iResourceOffset;
+
+};
+
+#endif // CAIWIMAGEPRINTIF_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/inc/caiwprintpreviewprovider.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,93 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CAIWPRINTPREVIEWPROVIDER_H
+#define CAIWPRINTPREVIEWPROVIDER_H
+
+#include <AknLaunchAppService.h>
+#include <AiwServiceIfMenu.h>
+#include <badesca.h>
+
+#include "caiwimageprintif.h"
+
+const TUid KPrintPropertyCat = {0x10012345};
+enum TPrintPropertyKeys
+ {
+ EPrintProperty,
+ };
+
+enum
+ {
+ ENotAiwCall,
+ EAiwPrintCall,
+ EAiwQuickPrintCall
+ };
+
+class CAiwPrintPreviewProvider :
+ public CAiwImagePrintIf,
+ public MAknServerAppExitObserver
+
+ {
+ public: //Constructors and destructors
+ static CAiwPrintPreviewProvider* NewL();
+
+ ~CAiwPrintPreviewProvider();
+
+ public: // from MAknServerAppExitObserver
+ void HandleServerAppExit( TInt aReason );
+
+ private: // Implementation
+ void LaunchImagePrintApplicationL();
+
+ private: // From CAiwImagePrintIf
+ void InitialiseL(MAiwNotifyCallback& aFrameworkCallback,
+ const RCriteriaArray& aInterest);
+
+
+ void HandleServiceCmdL( const TInt& aCmdId,
+ const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList,
+ TUint aCmdOptions = 0,
+ const MAiwNotifyCallback* aCallback = NULL);
+
+ void InitializeMenuPaneL( CAiwMenuPane& aMenuPane,
+ TInt aIndex,
+ TInt aCascadeId,
+ const CAiwGenericParamList& aInParamList);
+
+ void HandleMenuCmdL( TInt aMenuCmdId,
+ const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList,
+ TUint aCmdOptions = 0,
+ const MAiwNotifyCallback* aCallback = NULL);
+
+ void HandleLaunchRequestL( const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList,
+ const MAiwNotifyCallback* aCallback = NULL);
+
+ private: // Data
+ CAknLaunchAppService* iService;
+
+ const CAiwGenericParamList *iConsumerInParamList;
+ CAiwGenericParamList *iConsumerOutParamList;
+ const MAiwNotifyCallback *iConsumerCallback;
+ };
+
+#endif // CAIWPRINTPREVIEWPROVIDER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/rss/101ffaa2.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,61 @@
+/*
+* 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:
+*
+*/
+
+
+#include <ecom/registryinfov2.rh>
+#include <AiwCommon.hrh>
+
+#include "aiwprintingprovideruid.h"
+
+RESOURCE REGISTRY_INFO theInfo
+ {
+ resource_format_version = RESOURCE_FORMAT_VERSION_2;
+ dll_uid = KAiwPrintingProviderDllUid;
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ interface_uid = KAiwClassMenu;
+ implementations =
+ {
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = KAiwPrintingProviderImplUid;
+ version_no = 1;
+ display_name = "Image Print";
+ default_data = "image/jpeg";
+ opaque_data = KAiwCmdPrintStr;
+ }
+ };
+ },
+ INTERFACE_INFO
+ {
+ interface_uid = KAiwClassBase;
+ implementations =
+ {
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = KAiwPrintingProviderImplUid;
+ version_no = 1;
+ display_name = "Image Print";
+ default_data = "image/jpeg";
+ opaque_data = KAiwCmdPrintStr;
+ }
+ };
+ }
+ };
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/rss/aiwprintingprovider.hrh Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,25 @@
+/*
+* 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:
+*
+*/
+
+
+#include <AiwCommon.hrh>
+
+enum TPrintingCommands
+ {
+ ECmdPrint = 0x101F8725,//KAiwCmdSynchronize + 1,
+ ECmdQuickPrint
+ };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/rss/aiwprintingprovider.rss Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:
+*
+*/
+
+
+NAME AAAA // AIW Printing Provider
+
+#include <eikon.rh>
+#include <avkon.rh>
+#include <avkon.rsg>
+#include <AiwCommon.hrh>
+#include <imageprintapp.loc>
+
+/**
+ * Standard resource signature
+ */
+RESOURCE RSS_SIGNATURE { }
+
+RESOURCE MENU_PANE r_aiw_preview_printing_provider_menu
+ {
+ items=
+ {
+ MENU_ITEM
+ {
+ command = KAiwCmdPrint;
+ txt = qtn_aiw_command_print;
+ }
+ };
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/src/caiwimageprintif.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,175 @@
+/*
+* 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:
+*
+*/
+
+
+#include <badesca.h>
+#include <bautils.h>
+#include <e32std.h>
+#include <f32file.h>
+#include <caf/content.h>
+#include <imageconversion.h>
+
+#include "caiwimageprintif.h"
+#include "cimgpprintutils.h"
+
+using namespace ContentAccess;
+
+#ifndef __WINS__
+_LIT( KResourceFile, "aiwprintingprovider.rsc" );
+_LIT(KResourceFilePath, "z:\\resource\\");
+#else
+_LIT(KResourceFile, "z:\\resource\\aiwprintingprovider.rsc");
+#endif
+
+_LIT8( KJpegFileType, "image/jpeg" );
+_LIT( KJpegFileType16, "image/jpeg" );
+
+CAiwImagePrintIf::~CAiwImagePrintIf()
+ {
+ iEikEnv.DeleteResourceFile( iResourceOffset );
+ }
+
+CAiwImagePrintIf::CAiwImagePrintIf():iEikEnv( *CEikonEnv::Static() )
+ {
+ }
+
+void CAiwImagePrintIf::ConstructL()
+ {
+#ifndef __WINS__
+ TFileName file;
+ TParse parse;
+ parse.Set( file, NULL, NULL );
+ file.Append(KResourceFilePath);
+ file.Append( KResourceFile );
+#else
+ TFileName file( KResourceFile );
+#endif
+ BaflUtils::NearestLanguageFile( iEikEnv.FsSession(), file );
+ iResourceOffset = iEikEnv.AddResourceFileL( file );
+ }
+
+// Get image array
+CDesCArrayFlat* CAiwImagePrintIf::GetImageArrayL( const CAiwGenericParamList& aInParamList )
+ {
+ CDesCArrayFlat* imageFiles = new (ELeave) CDesCArrayFlat(5); //image list for the application
+ CleanupStack::PushL( imageFiles );
+ TInt index = 0;
+ const TAiwGenericParam* param = aInParamList.FindFirst(index,
+ EGenericParamFile,
+ EVariantTypeDesC);
+ TFileName filename;
+
+ while ( index != KErrNotFound )
+ {
+ filename.Copy( param->Value().AsDes() );
+
+ if ( IsPrintingSupportedL( filename ) )
+ {
+ imageFiles->AppendL( filename );
+ }
+ param = aInParamList.FindNext(index,
+ EGenericParamFile,
+ EVariantTypeDesC);
+ }
+
+ CleanupStack::Pop( imageFiles );
+ return imageFiles;
+ }
+
+TBool CAiwImagePrintIf::IsPrintingSupportedL( const CAiwGenericParamList& aInParamList )
+ {
+ TInt index(0);
+ const TAiwGenericParam* param = aInParamList.FindFirst( index, EGenericParamMIMEType );
+ TBool printable( EFalse );
+
+ // Currently Media Gallery does not offer MIME-parameter in aInParamList (Fix exists).
+ // Because of that there is checked directly from files if printing is supported
+ // This is slow and because of this should be deleted when MG offers MIMEs as parameter.
+ if ( index == KErrNotFound )
+ {
+ index = 0;
+ const TAiwGenericParam* param = aInParamList.FindFirst(index, EGenericParamFile, EVariantTypeDesC);
+
+ //Check if there is any printable images available. At least image must be
+ //JPEG and it also must be unprotected to be printable.
+ while ( index != KErrNotFound && !printable)
+ {
+ TRAP_IGNORE( printable = IsPrintingSupportedL( param->Value().AsDes() ));
+ param = aInParamList.FindNext(index, EGenericParamFile, EVariantTypeDesC);
+ }
+ return printable;
+ }
+ //End of "To be removed" section
+
+ while ( index != KErrNotFound && !printable )
+ {
+ if ( param->Value().TypeId() == EVariantTypeDesC &&
+ param->Value().AsDes() == KJpegFileType16 )
+ {
+ // MIME-type parameter follows filename parameter in parameter list.
+ // Because of that previous item in list is used.
+ if (index > 0)
+ {
+ printable = !IsProtectedL( aInParamList[index-1].Value().AsDes() );
+ }
+ }
+
+ if ( !printable )
+ {
+ param = aInParamList.FindNext(index, EGenericParamMIMEType);
+ }
+ }
+
+ return printable;
+ }
+
+TBool CAiwImagePrintIf::IsPrintingSupportedL( const TDesC& aFileName )
+ {
+ //1. check: Mimetype should be correct (JPEG)
+ TBool printable = CheckMIMETypeL( KJpegFileType, aFileName );
+
+ if (printable)
+ {
+ //2. check: file should not be protected
+ printable = !IsProtectedL( aFileName );
+ }
+
+ return printable;
+ }
+
+TBool CAiwImagePrintIf::IsProtectedL( const TDesC& aFileName )
+ {
+ CContent* content = NULL;
+ content = CContent::NewLC( aFileName );
+ TInt isDrmProtected( 0 );
+ TInt err = content->GetAttribute( EIsProtected, isDrmProtected );
+ CleanupStack::PopAndDestroy(); // content
+ return err ? ETrue : isDrmProtected;
+ }
+
+
+TBool CAiwImagePrintIf::CheckMIMETypeL( const TDesC8& aMimeType,
+ const TDesC& aFileName )
+ {
+ TBuf8<128> mimeType(0);
+ CImageDecoder::GetMimeTypeFileL(iEikEnv.FsSession(), aFileName, mimeType);
+
+ // Check that MIME-type matches (compare returns 0), otherwise return EFalse
+ return mimeType.CompareF( aMimeType ) ? EFalse : ETrue;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/src/caiwprintpreviewprovider.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,179 @@
+/*
+* 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:
+*
+*/
+
+
+#include <AiwMenu.h>
+#include <AiwCommon.h>
+#include <AiwCommon.hrh>
+#include <coemain.h>
+#include <barsread.h>
+#include <aiwprintingprovider.rsg>
+#include <e32property.h>
+#include <s32strm.h>
+#include <badesca.h>
+#include <s32file.h>
+#include <f32file.h>
+#include <apacmdln.h>
+#include <apgtask.h>
+#include <apaid.h>
+#include <apgcli.h>
+#include <w32std.h>
+#include <bautils.h>
+#include <eikenv.h>
+
+#include "clog.h"
+#include "caiwprintpreviewprovider.h"
+#include "aiwprintingprovider.hrh"
+#include "caiwimageprintif.h"
+#include "imageprint.h"
+#include "cimgpprintutils.h"
+
+CAiwPrintPreviewProvider* CAiwPrintPreviewProvider::NewL()
+ {
+
+ CAiwPrintPreviewProvider* self = new( ELeave ) CAiwPrintPreviewProvider;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CAiwPrintPreviewProvider::~CAiwPrintPreviewProvider()
+ {
+ delete iService;
+ }
+
+void CAiwPrintPreviewProvider::InitialiseL( MAiwNotifyCallback& /*aFrameworkCallback*/,
+ const RCriteriaArray& /*aInterest*/ )
+ {
+ }
+
+
+void CAiwPrintPreviewProvider::HandleServiceCmdL(const TInt& aCmdId,
+ const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList,
+ TUint /*aCmdOptions*/,
+ const MAiwNotifyCallback* aCallback)
+
+ {
+ if ( aCmdId == KAiwCmdPrintPreview || aCmdId == KAiwCmdPrint )
+ {
+ HandleLaunchRequestL( aInParamList, aOutParamList, aCallback );
+ LaunchImagePrintApplicationL();
+ }
+ }
+
+
+
+void CAiwPrintPreviewProvider::InitializeMenuPaneL
+ ( CAiwMenuPane& aMenuPane, TInt aIndex,
+ TInt /*aCascadeId*/, const CAiwGenericParamList& aInParamList )
+ {
+
+ if ( IsPrintingSupportedL( aInParamList ) )
+ {
+ LOG("CAiwPrintPreviewProvider::InitializeMenuPaneL 1");
+ TResourceReader reader;
+ iEikEnv.CreateResourceReaderLC
+ ( reader, R_AIW_PREVIEW_PRINTING_PROVIDER_MENU );
+ aMenuPane.AddMenuItemsL( reader, KAiwCmdPrint, aIndex );
+ CleanupStack::PopAndDestroy(); // reader
+ LOG("CAiwPrintPreviewProvider::InitializeMenuPaneL 2");
+ }
+
+ }
+
+void CAiwPrintPreviewProvider::HandleMenuCmdL
+ ( TInt aMenuCmdId, const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+ const MAiwNotifyCallback* aCallback)
+ {
+ if ( aMenuCmdId == KAiwCmdPrintPreview || aMenuCmdId == KAiwCmdPrint )
+ {
+ HandleLaunchRequestL( aInParamList, aOutParamList, aCallback );
+ LaunchImagePrintApplicationL();
+ }
+ }
+
+void CAiwPrintPreviewProvider::HandleLaunchRequestL
+ (const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList,
+ const MAiwNotifyCallback* aCallback)
+ {
+ iConsumerInParamList = &aInParamList;
+ iConsumerOutParamList = &aOutParamList;
+ iConsumerCallback = aCallback;
+
+ TFileName paramFile;
+ CIMGPPrintUtils::GetDataFilePathL( paramFile );
+
+ RFileWriteStream writeStream;
+ User::LeaveIfError( writeStream.Replace( iEikEnv.FsSession(), paramFile, EFileWrite) );
+ writeStream.PushL();
+ aInParamList.ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ TInt err = RProperty::Define( KPrintPropertyCat, EPrintProperty, RProperty::EInt );
+
+ if ( err != KErrAlreadyExists )
+ {
+ User::LeaveIfError( err );
+ }
+ RProperty::Set( KPrintPropertyCat,EPrintProperty,EAiwPrintCall );
+ }
+
+void CAiwPrintPreviewProvider::LaunchImagePrintApplicationL()
+ {
+ TUid appuid;
+ appuid.iUid = 0x101FFA84;
+ TRAPD( err, iService = CAknLaunchAppService::NewL( appuid, this, NULL ) );
+ if ( err != KErrNone )
+ {
+ LOG1("CAiwPrintPreviewProvider::LaunchImagePrintApplicationL failed with: %d", err);
+ }
+ }
+
+void CAiwPrintPreviewProvider::HandleServerAppExit( TInt aReason )
+ {
+ delete iService;
+ iService = NULL;
+
+ LOG1("CAiwPrintPreviewProvider::HandleServerAppExit: %d", aReason);
+
+ // In the case that we want to exit also the parent application,
+ // ImagePrint is exited with User::Exit() which is seen here as
+ // KErrServerTerminated (-15).
+ if( iConsumerInParamList && iConsumerOutParamList && iConsumerCallback && iConsumerCallback )
+ {
+ // Const cast is used to fix weirdness in AIW header files. MWaiNotifyCallback
+ // does not define any const function but CAiwServiceIfMenu interface provides
+ // const callback object.
+ TRAP_IGNORE( const_cast<MAiwNotifyCallback*>(iConsumerCallback)->HandleNotifyL(
+ KAiwCmdPrintPreview, KAiwEventCompleted,
+ *iConsumerOutParamList, *iConsumerInParamList ));
+ iConsumerInParamList = NULL;
+ iConsumerOutParamList = NULL;
+ iConsumerCallback = NULL;
+ }
+ if ( aReason == KErrServerTerminated )
+ {
+ User::Exit( 0 );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintprovider/src/dllmain.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2004 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "aiwprintingprovideruid.h"
+#include "caiwprintpreviewprovider.h"
+
+// Define the interface UIDs
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY(KAiwPrintingProviderImplUid,
+ CAiwPrintPreviewProvider::NewL)
+
+ };
+
+// The one and only exported function that is the ECom entry point
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy
+ (TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/bwins/imgpprintdllu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,11 @@
+EXPORTS
+ ?StartPrintingL@CIMGPPrintUtils@@QAEXPAVCDesC16ArrayFlat@@@Z @ 1 NONAME ; void CIMGPPrintUtils::StartPrintingL(class CDesC16ArrayFlat *)
+ ?SearchDefaultPrinterL@CUIProtocolController@@QAEHXZ @ 2 NONAME ; int CUIProtocolController::SearchDefaultPrinterL(void)
+ ?CheckMIMEType@CIMGPPrintUtils@@SAHABVTDesC8@@ABV?$TBuf@$0BAA@@@@Z @ 3 NONAME ; int CIMGPPrintUtils::CheckMIMEType(class TDesC8 const &, class TBuf<256> const &)
+ ?NewL@CUIProtocolController@@SAPAV1@PAVMProtocolObserver@@AAVCIFFactory@@@Z @ 4 NONAME ; class CUIProtocolController * CUIProtocolController::NewL(class MProtocolObserver *, class CIFFactory &)
+ ?NewL@CIMGPPrintUtils@@SAPAV1@PAVMAiwObserver@@@Z @ 5 NONAME ; class CIMGPPrintUtils * CIMGPPrintUtils::NewL(class MAiwObserver *)
+ ?ChangeDefaultPrinterL@CUIProtocolController@@QAEHH@Z @ 6 NONAME ; int CUIProtocolController::ChangeDefaultPrinterL(int)
+ ?StartPrintingL@CIMGPPrintDlgManager@@QAEXXZ @ 7 NONAME ; void CIMGPPrintDlgManager::StartPrintingL(void)
+ ?NewL@CIMGPPrintDlgManager@@SAPAV1@HPAVMPrintJob@@IHIPAVCIMGPPrintUtils@@PAVMPrintingObserver@@@Z @ 8 NONAME ; class CIMGPPrintDlgManager * CIMGPPrintDlgManager::NewL(int, class MPrintJob *, unsigned int, int, unsigned int, class CIMGPPrintUtils *, class MPrintingObserver *)
+ ?GetDataFilePathL@CIMGPPrintUtils@@SAXAAV?$TBuf@$0BAA@@@@Z @ 9 NONAME ; void CIMGPPrintUtils::GetDataFilePathL(class TBuf<256> &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/eabi/imgpprintdllu.def Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,23 @@
+EXPORTS
+ _ZN15CIMGPPrintUtils13CheckMIMETypeERK6TDesC8RK4TBufILi256EE @ 1 NONAME
+ _ZN15CIMGPPrintUtils14StartPrintingLEP16CDesC16ArrayFlat @ 2 NONAME
+ _ZN15CIMGPPrintUtils4NewLEP12MAiwObserver @ 3 NONAME
+ _ZN20CIMGPPrintDlgManager14StartPrintingLEv @ 4 NONAME
+ _ZN20CIMGPPrintDlgManager4NewLEiP9MPrintJobjijP15CIMGPPrintUtilsP17MPrintingObserver @ 5 NONAME
+ _ZN21CUIProtocolController21ChangeDefaultPrinterLEi @ 6 NONAME
+ _ZN21CUIProtocolController21SearchDefaultPrinterLEv @ 7 NONAME
+ _ZN21CUIProtocolController4NewLEP17MProtocolObserverR10CIFFactory @ 8 NONAME
+ _ZTI15CIMGPPrintUtils @ 9 NONAME ; #<TI>#
+ _ZTI17CCustomNoteDialog @ 10 NONAME ; #<TI>#
+ _ZTI20CDiscoveryDlgManager @ 11 NONAME ; #<TI>#
+ _ZTI20CIMGPPrintDlgManager @ 12 NONAME ; #<TI>#
+ _ZTI21CIMGPPrintProgressDlg @ 13 NONAME ; #<TI>#
+ _ZTI21CUIProtocolController @ 14 NONAME ; #<TI>#
+ _ZTV15CIMGPPrintUtils @ 15 NONAME ; #<VT>#
+ _ZTV17CCustomNoteDialog @ 16 NONAME ; #<VT>#
+ _ZTV20CDiscoveryDlgManager @ 17 NONAME ; #<VT>#
+ _ZTV20CIMGPPrintDlgManager @ 18 NONAME ; #<VT>#
+ _ZTV21CIMGPPrintProgressDlg @ 19 NONAME ; #<VT>#
+ _ZTV21CUIProtocolController @ 20 NONAME ; #<VT>#
+ _ZN15CIMGPPrintUtils16GetDataFilePathLER4TBufILi256EE @ 21 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+imgpprintdll.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/group/imgpprintdll.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,84 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+
+#include "../../inc/logdef.h"
+
+deffile imgpprintdll.def
+
+TARGET imgpprintdll.dll
+TARGETTYPE dll
+
+CAPABILITY CAP_GENERAL_DLL
+UID 0x1000008d 0x101FFAA1
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE cimgpprintdlgmanager.cpp
+SOURCE imgpprintapputil.cpp
+SOURCE cimgpprintprogressdlg.cpp
+SOURCE cimgpprintutils.cpp
+SOURCE cdiscoverydlgmanager.cpp
+SOURCE cuiprotocolcontroller.cpp
+SOURCE ccustomnotedialog.cpp
+
+USERINCLUDE . ../inc ../../inc
+USERINCLUDE ../../imageprintapp/inc
+USERINCLUDE ../../imageprintprovider/inc
+USERINCLUDE ../../imageprinteng/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintServer/inc
+USERINCLUDE ../../../ImagePrintEngine/ImagePrintLibrary/inc
+USERINCLUDE ../../../clog/inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+STATICLIBRARY clog.lib
+DEBUGLIBRARY flogger.lib
+
+LIBRARY euser.lib
+LIBRARY avkon.lib
+LIBRARY eikcore.lib
+LIBRARY cone.lib
+LIBRARY eikcoctl.lib
+LIBRARY commonengine.lib
+LIBRARY fbscli.lib
+LIBRARY aknskins.lib
+LIBRARY efsrv.lib
+LIBRARY eikctl.lib
+LIBRARY eikdlg.lib
+LIBRARY bafl.lib
+LIBRARY imageprintengine.lib
+LIBRARY usbman.lib
+LIBRARY aknicon.lib
+LIBRARY egul.lib
+LIBRARY imageconversion.lib
+LIBRARY imageprintclient.lib
+LIBRARY aknnotify.lib // CAknGlobalMsgQuery
+LIBRARY eiksrv.lib // CAknGlobalMsgQuery
+LIBRARY apgrfx.lib // RApaLsSession
+LIBRARY platformenv.lib
+LIBRARY apparc.lib
+
+LIBRARY centralrepository.lib // Repository
+LIBRARY ecom.lib // WLAN wizard
+LIBRARY upnpapplicationengine.lib
+LIBRARY upnpcommand.lib
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/ccustomnotedialog.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2006-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:
+*
+*/
+
+
+#ifndef CCUSTOMNOTEDIALOG_H
+#define CCUSTOMNOTEDIALOG_H
+
+#include <aknnotedialog.h>
+#include <AknProgressDialog.h> // mprogressdialogcallback
+
+class CCustomNoteDialog : public CAknNoteDialog
+ {
+ public:
+ static CCustomNoteDialog* NewL( CEikDialog** aSelfPtr );
+ static CCustomNoteDialog* NewLC( CEikDialog** aSelfPtr );
+ ~CCustomNoteDialog();
+
+ CCustomNoteDialog( CEikDialog** aSelfPtr );
+
+ public: // Methods derived from MProgressDialogCallback
+ void SetCallback( MProgressDialogCallback* aCallback );
+
+ private:
+ void ConstructL();
+
+ private:
+ MProgressDialogCallback* iCallback;
+
+ };
+
+#endif // CCUSTOMNOTEDIALOG_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/cdiscoverydlgmanager.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,273 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CDISCOVERYDLGMANAGER_H
+#define CDISCOVERYDLGMANAGER_H
+
+#include <e32std.h>
+#include <aknPopup.h>
+#include <aknlists.h>
+#include <f32file.h>
+#include <AknProgressDialog.h>
+
+#include "mdiscoveryobserver.h"
+#include "mdiscovery.h"
+
+class CAknWaitDialog;
+class CImagePrintAppUi;
+class MPrintSettings;
+class CIFFactory;
+
+// CONSTANTS
+const TInt KMaxPrinterNameLength( 84 );
+
+// CLASS DEFINITION
+/**
+ *
+ * CDiscoveryDlgManager is a class that is responsible of displaying the pop-up
+ * list at the beginning containing the available medias/devices to print to.
+ *
+ */
+class CDiscoveryDlgManager
+ : public CBase,
+ public MDiscoveryObserver,
+ public MProgressDialogCallback
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aDiscovery Discovery IF
+ *
+ * @return Initialized instance of the class
+ */
+ static CDiscoveryDlgManager* NewL( CIFFactory& aIFFactory );
+ static CDiscoveryDlgManager* NewLC( CIFFactory& aIFFactory);
+
+ /**
+ * Destructor
+ */
+ virtual ~CDiscoveryDlgManager();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Default constructor
+ * @param aDiscovery Discovery IF
+ */
+ CDiscoveryDlgManager();
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL( CIFFactory& aIFFactory );
+
+ public: // Methods derived from MDiscoveryObserver
+
+ void NotifyNewPrintDeviceL( HBufC* aText, TInt aUid, TBool aCached,
+ TPrinterType aType, TUint aVendor );
+ void DiscoveryError( TInt aErrCode );
+ void DeviceDiscoveryCompleted();
+ void RemoveCachedPrinterL( TInt aUid ) ;
+
+ public: // from MProgressDialogCallback
+
+ void DialogDismissedL( TInt aButtonId );
+
+ public: // New methods
+
+ /**
+ * Starts the dialog manager, displays pop-up window where
+ * the found printers are placed
+ *
+ * @param aProtocol Specific protocol to searh for. ( all
+ * available as default )
+ *
+ * @param aHidden True will not launch popup list. This will also
+ * select the found printer to be the printer in use.
+ * ( EFalse as default ). Note that this can only be used
+ * with specific protocol and with BT first found printer
+ * will be selected.
+ *
+ *
+ * @return ETrue = printer has been selected succesfully
+ * EFalse = not
+ */
+ TBool StartDlgManagerL( TInt aProtocol = 0, TBool aHidden = EFalse);
+
+ TInt PrinterUid() const;
+ /**
+ * Returns the chosen printer's name
+ */
+ const TDesC& PrinterName() const;
+ /*
+ * Was the selected printer USB printer
+ */
+ TBool USBPrinterSelected() const;
+
+ /*
+ * Canceling discovery and close device popuplist.
+ */
+ void CancelDiscovery();
+
+ private: // New methods
+
+ /**
+ * Creates the pop-up list around the instance's list box
+ *
+ * @return Initialized instance of the pop-up list
+ */
+ CAknPopupList* CreatePopupListL();
+
+ /**
+ * Adds new device to list, updates popup list
+ *
+ * @param aText Textual description of the new print device
+ * @param aUid Uid that is associated with the print device
+ * @param aCached Is printer cached or not?
+ * @param aType Printer type
+ * @param aVendor Printer brand
+ */
+ void AddNewDeviceToListL( HBufC* aText, TInt aUid, TBool aCached,
+ TPrinterType aType, TUint aVendor );
+
+ /**
+ * Show "restart discovery" query and start the discovery again
+ * if it is so desired
+ */
+ void RestartDiscoveryL();
+
+ /**
+ * Removes cached icons from the list
+ */
+ void RemoveCachedIconsL();
+
+ /**
+ * Adds "search again" text to pop-up list
+ */
+ void AddSearchAgainTextL();
+
+ /**
+ * Pop up a wait note during cancellation operation
+ */
+ void ShowCancelWaitNoteL();
+
+ TBool StartNormalDiscoveryL();
+
+ TBool StartHiddenDiscoveryL();
+
+ /*
+ * @function AccessPointExistsL
+ * @description Checks if access point is defined
+ * @return TBool
+ */
+ TBool WlanAccessPointExistsL();
+
+ /*
+ * @function TryWlanDiscoveryL
+ * @description Try WLAN discovery
+ * Checks if AP is defined
+ if not, launches WLAN wizard
+ * @return TBool
+ */
+ TBool TryDeviceDiscoveryL( TUint aProtocols, TBool aSingleDiscovery );
+
+ private: // Data
+
+ // Listbox for popup list
+ CAknSingleGraphicPopupMenuStyleListBox* iListBox;
+
+ // The popup list
+ CAknPopupList* iPopupList;
+
+ // Array for profile names
+ CDesCArrayFlat* iListOfDeviceNames;
+
+ // Pointer to engine discovery interface
+ MDiscovery* iDiscovery;
+
+ // True if popup window is active
+ TBool iActivePopup;
+
+ // Array of printer UIDs
+ CArrayFixFlat<TInt>* iUidArray;
+
+ // Array of printer Protocols
+ CArrayFixFlat<TPrinterType>* iProtocolArray;
+
+ // Array of printer brands
+ CArrayFixFlat<TUint>* iBrandArray;
+
+ // Selected printer's name
+ HBufC* iPrinterName;
+
+ // Supported protocols
+ TUint iSupportedProtocols;
+
+ // Cancellation wait dialog
+ CAknWaitDialog* iCancellingDialog;
+
+ // Cancelling state
+ TBool iCancelling;
+
+ // Discovery status
+ TBool iDiscoveryCompleted;
+
+ // USB printer id
+ TInt iUsbPrinterID;
+
+ TBool iUSBPrinterSelected;
+
+ // Hidden discovery flag
+ TBool iHiddenDiscovery;
+
+ // Printer found flag
+ TBool iPrinterFound;
+
+ // Searching cancelled flag
+ TBool iSearchingCancelled;
+
+ // Wait dialog shown while doing hidden discovery
+ CAknWaitDialog* iHiddenDiscoveryDialog;
+
+ // Array to store printer names
+ CDesCArray* iNameArray;
+
+ // Indicates whether discovery searches multiple devices (bt/wlan cases) or not
+ TBool iMultiDiscovery;
+
+ TInt iCurrentPrinterUid;
+
+ // Interface for settings
+ MPrintSettings* iSettings;
+
+ //Contais "Searching" title text for popup dialog
+ HBufC* iSearchingText;
+
+ //Contais "Select device" title text for popup dialog
+ HBufC* iSelectDeviceText;
+
+ //Pointer to active title text
+ TPtrC iActiveTitleText;
+
+ };
+
+#endif // CDISCOVERYDLGMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/cimgpprintdlgmanager.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,202 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMGPPRINTDLGMANAGER_H
+#define CIMGPPRINTDLGMANAGER_H
+
+#include <e32std.h>
+#include <e32base.h>
+#include <AknProgressDialog.h>
+
+#include "mprintjobobserver.h"
+#include "mprintjob.h"
+
+class CAknProgressDialog;
+class CAknWaitDialog;
+class CIMGPPrintUtils;
+class MPrintingObserver;
+
+/**
+ *
+ * Print progress dialog manager - handles the user interface of the printing
+ *
+ */
+class CIMGPPrintDlgManager
+ : public CBase,
+ public MPrintJobObserver,
+ public MProgressDialogCallback
+
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aPrintJob Pointer to print job interface
+ * @param aNumOfPages Number of printed pages
+ * @param aMMCPrinting Flag to índicate if "printing" to MMC
+ * @param aVendor printer brand
+ * @param aPrintUtils pointer to CIMGPPrintUtils class
+ * @param aPrintingObserver pointer to MPrintingObserver interface
+ *
+ * @return Initialized instance of print dialog manager
+ */
+ IMPORT_C static CIMGPPrintDlgManager* NewL(
+ TInt aNoc,
+ MPrintJob* aPrintJob,
+ TUint aNumOfPages,
+ TBool aMMCPrinting,
+ TUint aVendor,
+ CIMGPPrintUtils* aPrintUtils = NULL,
+ MPrintingObserver* aPrintingObserver = NULL );
+
+ /**
+ * Two-phase constructor
+ *
+ * @param aPrintJob Pointer to print job interface
+ * @param aNumOfPages Number of printed pages
+ * @param aMMCPrinting Flag to índicate if "printing" to MMC
+ * @param aVendor printer brand
+ * @param aPrintUtils pointer to CIMGPPrintUtils class
+ * @param aPrintingObserver pointer to MPrintingObserver interface
+ *
+ * @return Initialized instance of print dialog manager
+ */
+ static CIMGPPrintDlgManager* NewLC(
+ TInt aNoc,
+ MPrintJob* aPrintJob,
+ TUint aNumOfPages,
+ TBool aMMCPrinting,
+ TUint aVendor,
+ CIMGPPrintUtils* aPrintUtils = NULL,
+ MPrintingObserver* aPrintingObserver = NULL );
+
+ /**
+ * Destructor
+ */
+ virtual ~CIMGPPrintDlgManager();
+
+ protected: // Constructors and destructors
+
+ /**
+ * Default constructor
+ *
+ * @param aPrintJob Pointer to print job interface
+ * @param aNumOfPages Number of printed pages
+ * @param aMMCPrinting Flag to índicate if "printing" to MMC
+ * @param aVendor printer brand
+ * @param aPrintUtils pointer to CIMGPPrintUtils class
+ * @param aPrintingObserver pointer to MPrintingObserver interface
+ *
+ */
+ CIMGPPrintDlgManager( TInt aNoc,
+ MPrintJob* aPrintJob,
+ TUint aNumOfPages,
+ TBool aMMCPrinting,
+ TUint aVendor,
+ CIMGPPrintUtils* aPrintUtils = NULL,
+ MPrintingObserver* aPrintingObserver = NULL );
+
+ private: // Constructor
+ void ConstructL();
+
+
+ protected: // Methods derived from MPrintJobObserver
+
+ void PrintProgress( TUint aComplete );
+ void PrintProgressL( TUint aComplete );
+ void JobFinished();
+ void JobError( TInt aErrCode, TInt aErrorStringCode );
+ void JobStatusEvent ( TInt aErrCode, TInt aErrorStringCode );
+
+ protected: // Methods derived from MProgressDialogCallback
+
+ void DialogDismissedL( TInt aButtonId );
+
+ public: // New methods
+
+ /**
+ * Executes the printing, displays print progress dialog
+ */
+ IMPORT_C void StartPrintingL();
+
+ protected: // New methods
+
+ /**
+ * Shows the MMC printing completed dialog
+ */
+ void ShowMMCPrintingCompletedDlgL();
+
+ /**
+ * Pop up cancellation wait note
+ */
+ void ShowCancelWaitNoteL();
+
+ /**
+ * prepares the progress dialog for showing
+ */
+ void PrepareProgressDialogL();
+
+ private:
+
+ protected: // Data
+
+ // Pointer to the print job instance
+ MPrintJob* iPrintJob;
+
+ // Progress dialog
+ CAknProgressDialog* iDialog;
+
+ // Cancelling dialog
+ CAknWaitDialog* iCancellingDialog;
+
+ // Cancelling status
+ TBool iCancelling;
+
+ // Printing cancelled
+ TBool iPrintingCancelled;
+
+ // Number of pages
+ TUint iNumOfPages;
+
+ // Is printing from MMC or not (different text displayed)
+ TBool iMMCPrinting;
+
+ // printer brand
+ TUint iVendor;
+
+ // Flag to tell if print was cancelled
+ TBool iCancelled;
+
+ // Used in aiw printing
+ CIMGPPrintUtils* iPrintUtils;
+
+ // Used in preview printing
+ MPrintingObserver* iPrintingObserver; // not owned
+
+ // Used to observe is this first time job done note is displayed / 1 job.
+ TBool iFirstNote;
+
+ // Number of copies to MMC print job done note.
+ TInt iNoc;
+
+ };
+
+#endif // CIMGPPRINTDLGMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/cimgpprintprogressdlg.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,73 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMGPPRINTPROGRESSDLG_H
+#define CIMGPPRINTPROGRESSDLG_H
+
+#include <AknWaitDialog.h>
+#include <eikdialg.h>
+
+/**
+ *
+ * Modified print progress dialog to enable "branding bitmap" to appear to
+ * the bottom of the progress dialog
+ *
+ */
+class CIMGPPrintProgressDlg
+ : public CAknProgressDialog
+ {
+
+ public: // Constructor and destructor
+
+ /**
+ * Constructor
+ *
+ * @param aSelfPtr Pointer to itself. The pointer needs to be
+ * valid when the dialog is dismissed and must not
+ * be on the stack.
+ * @param aVisibilityDelayOff Cut off the delay at the beginning
+ */
+ CIMGPPrintProgressDlg( CEikDialog** aSelfPtr, TBool aVisibilityDelayOff );
+
+ /**
+ * Destructor
+ */
+ virtual ~CIMGPPrintProgressDlg();
+
+ public: // Methods derived from CAknProgressDialog
+
+ TKeyResponse OfferKeyEventL( const TKeyEvent &aKeyEvent, TEventCode aType );
+
+ void PostLayoutDynInitL();
+
+ CEikCaptionedControl* GetFirstLineOnFirstPageOrNull();
+
+ void HandleResourceChange( TInt aType );
+
+ private:
+
+ /**
+ * Handles commands coming to the viwe
+ * @param aCommand The command ID
+ */
+
+ };
+
+#endif // CIMGPPRINTPROGRESSDLG_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/cimgpprintutils.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,161 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CIMGPPRINTUTILS_H
+#define CIMGPPRINTUTILS_H
+
+#include <eikapp.h>
+#include <e32std.h>
+#include <aknappui.h>
+#include <data_caging_path_literals.hrh>
+
+#include "midleprinteventobserver.h"
+#include "rimageprintclient.h"
+#include "maiwobserver.h"
+#include "mprotocolobserver.h"
+#include "mprintjobstatus.h"
+
+class CAknNavigationDecorator;
+class CImagePrintDoc;
+class CIMGPPrintDlgManager;
+class MPrintSettings;
+class CImagePrintEngine;
+class MIdlePrintEventObserver;
+class CUIProtocolController;
+
+/**
+ *
+ * AppUi class
+ *
+ */
+class CIMGPPrintUtils
+ : public CBase,
+ public MProtocolObserver,
+ public MPrintJobStatus
+ {
+
+ public: // Constructors and destructors
+
+
+ /**
+ * Second phase constructor
+ */
+ IMPORT_C static CIMGPPrintUtils* NewL( MAiwObserver* aAiwObserver );
+ static CIMGPPrintUtils* NewLC( MAiwObserver* aAiwObserver );
+ void ConstructL( MAiwObserver* aAiwObserver );
+ virtual ~CIMGPPrintUtils();
+
+ void DialogDismissedL(TInt /*aButtonId*/);
+
+public: // from MPrintJobStatus
+ void PrintJobProgress( TInt aStatus,
+ TInt aPercentCompletion,
+ TInt aJobStateCode );
+ void PrintJobError( TInt aError, TInt aErrorStringCode );
+ void PrinterStatus( TInt aError, TInt aErrorStringCode );
+
+ public: // New methods
+
+
+ /**
+ * Starts printing process
+ */
+ IMPORT_C void StartPrintingL( CDesCArrayFlat* aImages );
+
+ /**
+ * Starts the BrowserEngine for selecting images
+ */
+ void StartBrowser();
+
+ /**
+ * Method is used to forward the selected images to engine.
+ *
+ * @param aFileArray, array that contains the selected images.
+ */
+ void SetImageArrayL( CDesCArrayFlat* aFileArray );
+
+ /**
+ * Method is used to set the printer UID value in the UI side.
+ *
+ * @param aPrinterUID printer uid.
+ */
+ void SetPrinterUID( TInt aPrinterUID );
+
+ /**
+ * Method is used to get the printer UID value in the UI side.
+ *
+ * @return printer uid.
+ */
+ TInt GetPrinterUID();
+
+ CImagePrintEngine& Engine() const;
+
+ /**
+ * Called in aiw printing when printing is completed
+ */
+ void JobFinished();
+
+ /**
+ * Called when initial printing didn't succeed because default
+ * printer was not available. Does printing after full discovery
+ */
+ void RestartPrintingL();
+
+ public: // static helpers
+ IMPORT_C static TBool CheckMIMEType( const TDesC8& aMimeType,
+ const TFileName& aFileName );
+
+ IMPORT_C static void GetDataFilePathL( TFileName& aFileName );
+
+ public: // Methods derived from MProtocolObserver
+ void UsbCableDisconnected();
+
+ private: // New methods
+
+ /**
+ * Print
+ */
+ void PrintL();
+
+ static TInt IdleCallbackL( TAny* aObj );
+
+ private: // Data
+
+ CIMGPPrintDlgManager* iPrintDlgManager; // use
+
+ // UID of the selected printer
+ TInt iPrinterUID;
+ // Application engine
+ CImagePrintEngine* iEngine;
+
+ TInt iResourceOffset;
+ TInt iResourceOffset2;
+
+ // Used in aiw printing
+ MAiwObserver* iAiwObserver;
+ // Interface for settings
+ MPrintSettings* iSettings;
+ // Protocol controller
+ CUIProtocolController* iProtocolController;
+
+ CIdle* iIdle;
+ };
+
+#endif // CIMGPPRINTUTILS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/cuiprotocolcontroller.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,254 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef CUIPROTOCOLCONTROLLER_H
+#define CUIPROTOCOLCONTROLLER_H
+
+#include <e32def.h>
+#include <e32base.h>
+#include <AknProgressDialog.h>
+#include <usbman.h>
+
+#include "cdiscoverydlgmanager.h"
+#include "mprotocolobserver.h"
+#include "midleprinteventobserver.h"
+#include "imageprint.h"
+
+class CIFFactory;
+class MIdlePrintEventRegisterIF;
+class MDiscovery;
+class MPrintSettings;
+class CCustomNoteDialog;
+
+const TUint KAllBTProtocols = KImagePrint_PrinterProtocol_BPP |
+ KImagePrint_PrinterProtocol_BIP |
+ KImagePrint_PrinterProtocol_OPP_Printer |
+ KImagePrint_PrinterProtocol_OPP_PC;
+
+// CLASS DEFINITION
+/**
+ *
+ * Class searches printers(protocols) and creates print job for
+ * selected printer. Class also works as an idle observer.
+ *
+ */
+class CUIProtocolController:
+ public CBase,
+ public MIdlePrintEventObserver,
+ public MProgressDialogCallback
+ {
+ public: // Constructors and destructors
+
+ /**
+ * Standard two-phase constructors
+ *
+ * @param aProtocolObserver Protocol observer
+ * @param aIFFactory Interface factory class
+ *
+ * @return Initialized instance of the class
+ */
+ IMPORT_C static CUIProtocolController* NewL( MProtocolObserver* aProtocolObserver,
+ CIFFactory& aIFFactory );
+ static CUIProtocolController* NewLC( MProtocolObserver* aProtocolObserver,
+ CIFFactory& aIFFactory );
+ /**
+ * Destructor.
+ */
+ virtual ~CUIProtocolController();
+
+ private:
+
+ /**
+ * Default constructor.
+ * @param aProtocolObserver Protocol observer
+ * @param aIFFactory Interface factory class
+ */
+ CUIProtocolController( MProtocolObserver* aProtocolObserver,
+ CIFFactory& aIFFactory );
+
+ /**
+ * Second phase constructor
+ *
+ * @param aIFFactory Interface factory class
+ */
+ void ConstructL( CIFFactory& aIFFactory );
+
+ public: // Methods derived from MIdlePrintEventObserver
+ void UsbPrinterDisconnected();
+ void UsbPrinterConnected();
+ void UsbStateChanged( TImgPrintUSBState aState, TInt aError );
+ void ReadyToContinue();
+ void AsynchronousServerLeave( TInt aError );
+
+ public: // Methods derived from MProgressDialogCallback
+ void DialogDismissedL(TInt /*aButtonId*/ );
+
+ public: // New methods
+
+ /**
+ * Searches default printer and takes it into use. If default
+ * printer is not found full searcg is performed.
+ *
+ * @return ETrue if printer is succesfully taken into use
+ * EFalse in all other cases.
+ */
+ IMPORT_C TBool SearchDefaultPrinterL();
+
+ /**
+ * Searches printer with a given protocol, takes it into use
+ * and sets the given protocol as a default one.
+ *
+ * @param aProtocol Protocol to be searched for.
+ * @return ETrue if printer is succesfully taken into use
+ * EFalse in all other cases.
+ */
+ IMPORT_C TBool ChangeDefaultPrinterL( TInt aProtocol );
+
+ /**
+ * Searches for all available printers.
+ * PrintJob is created after discovery with the selected
+ * printer.
+ *
+ * @return ETrue if printer has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool FullSearchL();
+
+ private: // New methods
+
+ TBool SetDefaultPrinterL( TInt aDefaultProtocol );
+
+ /**
+ * Searches the usb printer. Method is synchronous.
+ * PrintJob is created after discovery has been done.
+ *
+ * @return ETrue if PictBridge printer has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool SearchUSBPrinterL();
+
+ /**
+ * Takes the default BT printer into use.
+ * PrintJob is created without discovery.
+ *
+ * @return ETrue if default BT printer has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool SearchDefaultBTPrinterL();
+
+ /**
+ * Searches for all available BT printers.
+ * PrintJob is created after discovery with the selected
+ * printer.
+ *
+ * @return ETrue if BT printer has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool SearchBTPrinterL();
+
+ /**
+ * Searches for all available UPnP(WLAN) printers.
+ * PrintJob is created after discovery with the selected
+ * printer.
+ *
+ * @return ETrue if UPnP printer has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool SearchUPnPPrinterL();
+
+ /**
+ * Takes the default UPnP(WLAN) printer into use
+ * via hidden discovery
+ *
+ * @return ETrue if default UPnP(WLAN) printer has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool SearchDefaultUPnPPrinterL();
+
+ /**
+ * Takes the MMC into use.
+ * PrintJob is created without discovery.
+ *
+ * @return ETrue if MMC has been taken into use.
+ * EFalse in all other cases.
+ */
+ TBool SearchMMCPrinterL();
+
+ /**
+ * Is Usb cable connected AND in PictBridge mode
+ * @return ETrue if usb connected and in right mode, EFalse if not.
+ */
+ TBool IsUsbCableConnected();
+
+ /**
+ * Displays Connect USB cable -note.
+ */
+ void ShowConnectUsbCableNoteL();
+
+ private: // Enumerations
+
+ // Different states of device discovery
+ enum TClassState
+ {
+ ENormalState,
+ EDiscoveryOngoing,
+ EUSBDisconnectedDuringDiscovery
+ };
+
+ private: // Data
+
+ // Observer
+ MProtocolObserver* iProtocolObserver;
+
+ // Interface for registering idle observer
+ MIdlePrintEventRegisterIF* iIdleEventRegister;
+
+ // Interface for device discovery
+ MDiscovery* iDiscovery;
+
+ // Interface for settings
+ MPrintSettings* iSettings;
+
+ // Interface factory
+ CIFFactory* iIFFactory;
+
+ // USB connect note
+ CCustomNoteDialog* iUSBConnectionWaitNote;
+
+ // Usb manager
+ RUsb iUsbManager;
+
+ // Device state
+ TUsbDeviceState iDeviceState;
+
+ // Class state related to usb and discovery
+ TInt iClassState;
+
+ // Discovery dialog manager in case when search all protocols
+ CDiscoveryDlgManager* iDiscoveryDlgManager;
+
+ // tells that usb is connect during all protocols search.
+ TBool iStartUsb;
+
+ // indicates that usb connection has terminated at least once
+ TBool iWasUsbDisconnected;
+ };
+
+#endif // CUIPROTOCOLCONTROLLER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/imgpprintapputil.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef IMGPPRINTAPPUTIL_H
+#define IMGPPRINTAPPUTIL_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Utility class that contains small static helper methods to group
+ * the common functionality
+ *
+ */
+class IMGPPrintAppUtil
+ {
+ public:
+
+ /**
+ * Displays error note using given resource id as the text
+ *
+ * @param aResourceId Resource ID for the given error text
+ */
+ static void ShowErrorNoteL( TInt aResourceId );
+
+ /**
+ * Displays information note using given resource id as the text
+ *
+ * @param aResourceId Resource ID for the given error text
+ */
+ static void ShowInfoNoteL( TInt aResourceId );
+
+ /**
+ * Displays error note using given error code as the source
+ * for the text
+ *
+ * @param aErrCode Error code
+ */
+ static void ShowErrorMsgL( TInt aErrCode, TInt aErrorStringCode = 0 );
+
+ /**
+ * Loads error message specifically created for printer application
+ *
+ * @param aErrCode Error code
+ */
+ static HBufC* PrintErrorMsgLC( TInt aErrCode, TInt aErrorStringCode = 0 );
+
+ /**
+ * Returns filename with the application path
+ *
+ * @param aFileName The filename
+ * @return filename added to the application path
+ */
+ static TFileName AddApplicationPath( const TDesC& aFileName );
+
+ private:
+ static void HandleByStringCodeL( TInt aErrCode, TInt aErrorStringCode, TInt& aResourceId );
+ static void StringCodeInkL( TInt aErrorStringCode, TInt& aResourceId, TBool& aMatch );
+ static void StringCodeHwL( TInt aErrorStringCode, TInt& aResourceId, TBool& aMatch );
+ static void StringCodePaperL( TInt aErrorStringCode, TInt& aResourceId, TBool& aMatch );
+
+ static void HandleByErrorCodeL( TInt& aResourceId, TInt& aFinalErrCode, TInt aErrCode );
+ static void ErrorCodeInkL( TInt& aResourceId, TInt aErrCode, TBool& aMatch );
+ static void ErrorCodeHwL( TInt& aResourceId, TInt aErrCode, TBool& aMatch );
+ static void ErrorCodePaperL( TInt& aResourceId, TInt aErrCode, TBool& aMatch );
+
+ };
+
+#endif // IMGPPRINTAPPUTIL_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/maiwobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MAIWOBSERVER_H
+#define MAIWOBSERVER_H
+
+#include <e32def.h>
+#include <e32std.h>
+
+/**
+ *
+ * Interface to notify AIW Provider about print progress
+ *
+ */
+class MAiwObserver
+ {
+ public: // Abstract methods
+
+ /**
+ * Called when Print job is finished. CImgPrintUtils will be
+ * deleted after this call.
+ */
+ virtual void JobFinished() = 0;
+
+ };
+
+#endif // MAIWOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/inc/mprotocolobserver.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MPROTOCOLBSERVER_H
+#define MPROTOCOLBSERVER_H
+
+#include <e32std.h>
+
+/**
+ *
+ * Observer class that will get notification message when the print preview
+ * is ready
+ *
+ */
+class MProtocolObserver
+ {
+ public:
+
+ /**
+ * Called by CUIProtocol when usb cable is disconnected and application
+ * need to closed or view changed. This method is only called when USB
+ * printer is in use
+ */
+ virtual void UsbCableDisconnected() = 0;
+ };
+
+#endif // MPROTOCOLBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/ccustomnotedialog.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2006-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:
+*
+*/
+
+
+#include "ccustomnotedialog.h"
+
+// CONSTRUCTION
+CCustomNoteDialog* CCustomNoteDialog::NewL( CEikDialog** aSelfPtr )
+ {
+ CCustomNoteDialog* self = CCustomNoteDialog::NewLC( aSelfPtr );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// CONSTRUCTION
+CCustomNoteDialog* CCustomNoteDialog::NewLC( CEikDialog** aSelfPtr )
+ {
+ CCustomNoteDialog* self = new (ELeave) CCustomNoteDialog( aSelfPtr );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// Destructor
+CCustomNoteDialog::~CCustomNoteDialog()
+ {
+ if ( iCallback )
+ {
+ // no need to handle error here
+ TRAP_IGNORE( iCallback->DialogDismissedL( EAknSoftkeyCancel ) );
+ }
+ }
+
+// Constructor
+CCustomNoteDialog::CCustomNoteDialog( CEikDialog** aSelfPtr )
+: CAknNoteDialog( aSelfPtr )
+ {
+ // no implementation
+ }
+
+// 2nd phase constructor
+void CCustomNoteDialog::ConstructL()
+ {
+ // no implementation
+ }
+
+void CCustomNoteDialog::SetCallback( MProgressDialogCallback* aCallback )
+ {
+ iCallback = aCallback;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/cdiscoverydlgmanager.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,1081 @@
+/*
+* 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:
+ *
+*/
+
+
+#include <imageprintapp.rsg>
+#include <aknlists.h>
+#include <aknPopup.h>
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <aknPopupHeadingPane.h>
+#include <badesca.h>
+#include <eikenv.h>
+#include <StringLoader.h>
+#include <AknWaitDialog.h>
+#include <AknIconUtils.h>
+#include <AknGlobalMsgQuery.h> // global message query
+#include <apgcli.h> // rapalssession
+#include <centralrepository.h> // repository
+#include <aknmessagequerydialog.h>
+#include <bluetooth/hci/hcierrors.h>
+#include <imgprintbitmaps.mbg>
+#include <upnpsettings.h>
+#include <upnprunsetupcommand.h>
+#include <upnpshowcommand.h>
+
+#include "cdiscoverydlgmanager.h"
+#include "imageprint.h"
+#include "mdiscovery.h"
+#include "mprintsettings.h"
+#include "ciffactory.h"
+#include "mprintsettings.h"
+#include "imgpprintapputil.h"
+#include "cimageprintappui.h"
+#include "imageprintconsts.h"
+#include "cimageprintdoc.h"
+#include "cimageprintengine.h"
+#include "tprinter.h"
+#include "clog.h"
+
+const TInt KArrayGranularity( 5 );
+const TInt KSearchAgainUID ( -1 );
+
+_LIT( KEmptyIconIndex, "0" );
+_LIT( KCachedIconIndex, "1" );
+_LIT( KBTIconIndex, "2" );
+_LIT( KKioskIconIndex, "3" );
+_LIT( KMMCIconIndex, "4" );
+_LIT( KUSBIconIndex, "5" );
+_LIT( KIconFile, "z:\\resource\\apps\\imgprintbitmaps.mif" );
+
+const TUint KSpaceForSingleIcon( 2 ); // icon index + tab = 2 chars
+const TUint KSpaceForBothIcons( 4 ); // icon index + tab + cache index + tab = 4 chars
+
+const TInt KNumberOfIcons( 7 );
+_LIT( KWLANIconIndex, "6" );
+
+void CleanUpResetAndDestroy(TAny* aArray)
+ {
+ if(aArray)
+ {
+ CArrayPtrFlat<TDesC>* array=(CArrayPtrFlat<TDesC>*)aArray;
+ array->ResetAndDestroy();
+ delete array;
+ }
+ }
+// CONSTRUCTION
+CDiscoveryDlgManager* CDiscoveryDlgManager::NewL(
+ CIFFactory& aIFFactory )
+ {
+ CDiscoveryDlgManager* self = NewLC( aIFFactory );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CDiscoveryDlgManager* CDiscoveryDlgManager::NewLC(
+ CIFFactory& aIFFactory )
+ {
+ CDiscoveryDlgManager* self =
+ new (ELeave) CDiscoveryDlgManager ();
+ CleanupStack::PushL(self);
+ self->ConstructL( aIFFactory );
+ return self;
+ }
+
+// Constructor
+CDiscoveryDlgManager::CDiscoveryDlgManager()
+ {
+ }
+
+// 2nd phase constructor
+void CDiscoveryDlgManager::ConstructL( CIFFactory& aIFFactory )
+ {
+ iUidArray = new ( ELeave ) CArrayFixFlat<TInt>( KArrayGranularity );
+ iBrandArray = new ( ELeave ) CArrayFixFlat<TUint>( KArrayGranularity );
+ iProtocolArray = new ( ELeave ) CArrayFixFlat<TPrinterType>( KArrayGranularity );
+ iListOfDeviceNames = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+ iActivePopup = EFalse; // Popuplist is not activated
+ iNameArray = new (ELeave) CDesCArrayFlat( KArrayGranularity );
+ iDiscovery = aIFFactory.DiscoveryIF();
+ iSettings = aIFFactory.SettingsIF();
+ iSelectDeviceText = StringLoader::LoadL( R_QTN_POPUP_LIST_TITLE );
+ iSearchingText = StringLoader::LoadL( R_QTN_POPUP_LIST_TITLE2 );
+ iActiveTitleText.Set( iSearchingText->Des() );
+ }
+
+// Destructor
+CDiscoveryDlgManager::~CDiscoveryDlgManager()
+ {
+ if ( iDiscovery )
+ {
+ iDiscovery->RemoveDiscoveryObserver();
+ }
+ if ( iActivePopup )
+ {
+ if ( iPopupList )
+ {
+ iPopupList->CancelPopup();
+ }
+ }
+ delete iListBox;
+ delete iUidArray;
+ delete iBrandArray;
+ delete iProtocolArray;
+ delete iListOfDeviceNames;
+ if ( iNameArray )
+ {
+ iNameArray->Reset();
+ }
+ delete iNameArray;
+ delete iPrinterName;
+ delete iSearchingText;
+ delete iSelectDeviceText;
+ }
+
+// Called when new device is found
+void CDiscoveryDlgManager::NotifyNewPrintDeviceL(
+ HBufC* aText,
+ TInt aUid,
+ TBool aCached,
+ TPrinterType aType,
+ TUint aVendor )
+ {
+ LOG("CDiscoveryDlgManager::NotifyNewPrintDevice BEGIN");
+ if( iHiddenDiscovery )
+ {
+ // multi-device hidden discovery (bt/wlan) handled differently
+ if ( iMultiDiscovery )
+ {
+ LOG("CDiscoveryDlgManager::NotifyNewPrintDevice doing hidden multi-discovery");
+ TInt uid = iSettings->GetDefaultPrintID();
+ LOG2("CDiscoveryDlgManager::NotifyNewPrintDevice found: %d default: %d", aUid, uid);
+ if ( uid == aUid )
+ {
+ if( iHiddenDiscoveryDialog )
+ {
+ TRAP_IGNORE( iHiddenDiscoveryDialog->ProcessFinishedL() );
+ iHiddenDiscoveryDialog = NULL;
+ }
+
+ TInt printerErrorCode(0);
+ printerErrorCode = iDiscovery->ChoosePrinterL( aUid );
+ iSettings->SetCurrentPrinterProtocol( aType );
+ iSettings->SetCurrentPrinterVendor( aVendor );
+ iSettings->SetCurrentPrinterName( *aText );
+ if( printerErrorCode == 0 )
+ {
+ iPrinterFound = ETrue;
+ iDiscoveryCompleted = ETrue;
+ delete iPrinterName;
+ iPrinterName = NULL;
+ // Cancel the discovery when device is found printjob is done.
+ iDiscovery->CancelDeviceDiscoveryL();
+ iPrinterName = aText->AllocL();
+ }
+ else
+ {
+ iPrinterFound = EFalse;
+ }
+ }
+ }
+ // USB and MMC hidden discovery only find one printer or not a printer at all
+ else
+ {
+ if( iHiddenDiscoveryDialog )
+ {
+ iHiddenDiscoveryDialog->ProcessFinishedL();
+ iHiddenDiscoveryDialog = NULL;
+ }
+
+ TInt printerErrorCode(0);
+ printerErrorCode = iDiscovery->ChoosePrinterL( aUid );
+ iSettings->SetCurrentPrinterProtocol( aType );
+ iSettings->SetCurrentPrinterVendor( aVendor );
+ if( printerErrorCode == 0 )
+ {
+ iPrinterFound = ETrue;
+ iDiscoveryCompleted = ETrue;
+ delete iPrinterName;
+ iPrinterName = 0;
+ if( aType == MDiscoveryObserver::EMMC )
+ {
+ HBufC* memoryCard = 0;
+ memoryCard = StringLoader::LoadLC
+ ( R_QTN_PRINT_MEMORY_CARD );
+
+ iSettings->SetCurrentPrinterName( *memoryCard );
+ iPrinterName = memoryCard->AllocL();
+ CleanupStack::PopAndDestroy( memoryCard );
+ }
+ else
+ {
+ iSettings->SetCurrentPrinterName( *aText );
+ iPrinterName = aText->AllocL();
+ }
+ }
+ else
+ {
+ iPrinterFound = EFalse;
+ }
+ }
+ }
+ else
+ {
+ if ( aType == MDiscoveryObserver::EUSB )
+ {
+ iUsbPrinterID = aUid;
+ }
+
+ TRAPD( err, AddNewDeviceToListL( aText, aUid, aCached, aType, aVendor ) );
+ if ( err )
+ {
+ LOG1("CDiscoveryDlgManager::NotifyNewPrintDevice device adding leaved with: %d", err );
+ // Nothing to do with the error code coming from ShowErrorMsgL
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( err ) );
+ }
+ }
+ LOG("CDiscoveryDlgManager::NotifyNewPrintDevice END");
+ }
+
+// Called when error is found
+void CDiscoveryDlgManager::DiscoveryError(
+ TInt aErrCode )
+ {
+ if ( aErrCode == ENoConnection )
+ {
+ CancelDiscovery();
+ }
+ }
+
+// Called when process completed
+void CDiscoveryDlgManager::DeviceDiscoveryCompleted()
+ {
+ LOG1("[CDiscoveryDlgManager::DeviceDiscoveryCompleted]\t Before dissmissing the process/wait dialog, iDiscoveryCompleted has value of %d", iDiscoveryCompleted);
+ // // Added this to avoid multiple "Search Again" texts, because server sends DeviceDiscoveryCompleted() more than once
+ if( iDiscoveryCompleted )
+ {
+ return;
+ }
+
+ // Searching over, flag is essential
+ iSearchingCancelled = ETrue;
+
+ iActiveTitleText.Set( iSelectDeviceText->Des() );
+ // Set the title of the pop-up list
+ if ( iPopupList )
+ {
+ TRAP_IGNORE( iPopupList->SetTitleL( iActiveTitleText ) );
+ }
+ LOG("CDiscoveryDlgManager::DeviceDiscoveryCompleted BEGIN");
+ if( iHiddenDiscoveryDialog )
+ {
+ TRAP_IGNORE( iHiddenDiscoveryDialog->ProcessFinishedL() );
+ iHiddenDiscoveryDialog = NULL;
+ }
+
+ iDiscoveryCompleted = ETrue;
+ if ( iActivePopup )
+ {
+ iPopupList->Heading()->CancelAnimation();
+
+ TRAP_IGNORE( RemoveCachedIconsL() );
+ TRAP_IGNORE( AddSearchAgainTextL() );
+
+ if ( iPopupList )
+ {
+ TRAP_IGNORE( iPopupList->ButtonGroupContainer()->SetCommandSetL(
+ R_AVKON_SOFTKEYS_SELECT_CANCEL );
+ iPopupList->ButtonGroupContainer()->DrawNow() );
+ }
+ }
+ if ( iCancelling )
+ {
+ iCancelling = EFalse;
+ TRAP_IGNORE( iCancellingDialog->ProcessFinishedL() );
+ iCancellingDialog = NULL;
+ }
+ LOG("CDiscoveryDlgManager::DeviceDiscoveryCompleted END");
+ }
+
+// Displays the printer devices
+TBool CDiscoveryDlgManager::StartDlgManagerL( TInt aProtocol, TBool aHidden )
+ {
+ LOG2("CDiscoveryDlgManager::StartDlgManagerL BEGIN: protocol %d, hidden: %d", aProtocol, aHidden);
+ iDiscoveryCompleted = EFalse;
+ TBool okToContinue( ETrue );
+ iHiddenDiscovery = aHidden;
+
+ // Start the device discovery with all the supported protocols
+ if( aProtocol == 0 )
+ {
+ iSupportedProtocols = iDiscovery->SupportedProtocols();
+
+ // If discovering WLAN, AP must be defined before continuing
+ if ( iSupportedProtocols & KImagePrint_PrinterProtocol_UPnP )
+ {
+ LOG("CDiscoveryDlgManager::StartDlgManagerL: TryWlanDiscoveryL");
+ TryDeviceDiscoveryL( iSupportedProtocols, EFalse );
+ }
+ // Discovery without WLAN
+ else
+ {
+ LOG("CDiscoveryDlgManager::StartDlgManagerL: StartDeviceDiscoveryL");
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+ }
+ else
+ {
+ iSupportedProtocols = aProtocol;
+
+ // If discovering WLAN
+ if ( iSupportedProtocols & KImagePrint_PrinterProtocol_UPnP )
+ {
+ LOG("CDiscoveryDlgManager::StartDlgManagerL - discovering WLAN");
+ if ( !TryDeviceDiscoveryL( aProtocol, ETrue ) )
+ {
+ LOG("CDiscoveryDlgManager::StartDlgManagerL - discovering WLAN failed");
+ // If discovering failed, do not continue
+ okToContinue = EFalse;
+ return okToContinue;
+ }
+ }
+ else
+ {
+ LOG("iDiscovery->StartDeviceDiscoveryL START");
+ iDiscovery->StartDeviceDiscoveryL( this, aProtocol );
+ }
+
+ LOG("iDiscovery->StartDeviceDiscoveryL END");
+ }
+
+ // BT & WLAN cases can find multiple devices which has to be handled
+ if ( aProtocol & KImagePrint_PrinterProtocol_BPP ||
+ aProtocol & KImagePrint_PrinterProtocol_BIP ||
+ aProtocol & KImagePrint_PrinterProtocol_OPP_Printer ||
+ aProtocol & KImagePrint_PrinterProtocol_OPP_PC ||
+ aProtocol & KImagePrint_PrinterProtocol_UPnP )
+ {
+ iMultiDiscovery = ETrue;
+ }
+
+ if( iHiddenDiscovery )
+ {
+ okToContinue = StartHiddenDiscoveryL();
+ }
+ else
+ {
+ okToContinue = StartNormalDiscoveryL();
+ }
+
+ LOG1("CDiscoveryDlgManager::StartDlgManagerL END return: %d", okToContinue);
+ return okToContinue;
+ }
+
+TBool CDiscoveryDlgManager::StartNormalDiscoveryL()
+ {
+ iActiveTitleText.Set( iSearchingText->Des() );
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL BEGIN");
+ TInt printerErrorCode = 0;
+ TBool continueSearch( ETrue );
+ TBool okToContinue( ETrue );
+ iSearchingCancelled = EFalse; // ADDED
+ TInt uid; // Printer uid
+ // Loop until printer is selected or user decides to exit
+ while ( continueSearch )
+ {
+ // Create pop-up list
+ if ( !iPopupList )
+ {
+ iPopupList = CreatePopupListL();
+ }
+
+ // Show the pop-up list
+ if ( iListOfDeviceNames->Count() > 0 )
+ {
+ iPopupList->ButtonGroupContainer()->SetCommandSetL(
+ R_AVKON_SOFTKEYS_STOP
+ );
+ }
+
+ // Launch the pop-up list for found devices
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL before launch popuplist");
+ TBool selected = iPopupList->ExecuteLD();
+ LOG1("CDiscoveryDlgManager::StartNormalDiscoveryL after popupList, selected: %d", selected);
+ iPopupList = NULL;
+ iActivePopup = EFalse;
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL returned from popup");
+ TInt index = iListBox->CurrentItemIndex();
+
+ // Search again was selected
+ if ( selected && iUidArray->At( index ) == KSearchAgainUID )
+ {
+ RestartDiscoveryL();
+ }
+ // Device was selected
+ else if ( selected )
+ {
+ uid = iUidArray->At( index );
+ if ( uid == iUsbPrinterID )
+ {
+ iUSBPrinterSelected = ETrue ;
+ }
+ else
+ {
+ iUSBPrinterSelected = EFalse;
+ }
+
+ iCurrentPrinterUid = uid;
+ printerErrorCode = iDiscovery->ChoosePrinterL( uid );
+ if ( printerErrorCode != KErrNone )
+ {
+ IMGPPrintAppUtil::ShowErrorMsgL( printerErrorCode );
+ User::Leave( printerErrorCode );
+ }
+ else
+ {
+ if ( iUidArray->At( 0 ) == KSearchAgainUID )
+ {
+ iSettings->SetCurrentPrinterProtocol( iProtocolArray->At( index - 1 ) );
+ iSettings->SetCurrentPrinterVendor( iBrandArray->At( index - 1 ) );
+ iSettings->SetCurrentPrinterName( (*iNameArray)[index-1] );
+ }
+ else
+ {
+ iSettings->SetCurrentPrinterProtocol( iProtocolArray->At( index ) );
+ iSettings->SetCurrentPrinterVendor( iBrandArray->At( index ));
+ iSettings->SetCurrentPrinterName( (*iNameArray)[index] );
+ }
+
+ continueSearch = EFalse;
+ // If there wasn't default protocol then set selected printer and protocol as default
+ if ( iSettings->GetDefaultPrinterProtocol() == KErrNotFound )
+ {
+ LOG1("CDiscoveryDlgManager::StartNormalDiscoveryL default protocol wasn't set, setting uid: %d", uid );
+ iSettings->SetDefaultPrinterID( uid );
+ // Discovery has completed and 'Search again' was added as a first item
+ // access protocol array with index-1
+ if ( iUidArray->At( 0 ) == KSearchAgainUID )
+ {
+ iSettings->SetDefaultPrinterProtocol( iProtocolArray->At( index-1 ) );
+ iSettings->SetDefaultPrinterNameL( (*iNameArray)[index-1] );
+ }
+ else
+ {
+ iSettings->SetDefaultPrinterProtocol( iProtocolArray->At( index ) );
+ iSettings->SetDefaultPrinterNameL( (*iNameArray)[index] );
+ }
+ }
+ else
+ {
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL default protocol was already set" );
+ }
+ }
+
+ TPtrC name = iListOfDeviceNames->MdcaPoint( index );
+ delete iPrinterName;
+ iPrinterName = NULL;
+ iPrinterName = name.AllocL();
+ }
+ // Stop/Cancel was selected
+ else
+ {
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL Stop/Cancel was selected" );
+ // Searching cancelled by user, cancel device discovery
+ if ( !iSearchingCancelled )
+ {
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL iSearchingCancelled EFalse" );
+ iSearchingCancelled = ETrue;
+ iDiscovery->CancelDeviceDiscoveryL();
+ }
+
+ // User cancelled the whole discovery dialog
+ else
+ {
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL iSearchingCancelled ETrue" );
+ continueSearch = EFalse;
+ okToContinue = EFalse;
+ iCancelling = ETrue;
+
+ // User cancelled the discovery dialog before all the printers were found
+ if ( !iDiscoveryCompleted )
+ {
+ //ShowCancelWaitNoteL();
+ }
+ }
+ }
+ }
+ LOG("CDiscoveryDlgManager::StartNormalDiscoveryL END");
+ return okToContinue;
+ }
+
+TBool CDiscoveryDlgManager::StartHiddenDiscoveryL()
+ {
+ LOG("CDiscoveryDlgManager::StartHiddenDiscoveryL BEGIN");
+ iHiddenDiscoveryDialog =
+ new (ELeave)CAknWaitDialog(
+ (REINTERPRET_CAST(CEikDialog**,&iHiddenDiscoveryDialog)));
+ LOG("iHiddenDiscoveryDialog->ExecuteLD( R_HIDDEN_DIALOG ) BEGIN");
+ iHiddenDiscoveryDialog->ExecuteLD( R_HIDDEN_DIALOG );
+ LOG("iHiddenDiscoveryDialog->ExecuteLD( R_HIDDEN_DIALOG ) END");
+ LOG1("iPrinterFound = %d", iPrinterFound);
+ LOG("CDiscoveryDlgManager::StartHiddenDiscoveryL END");
+ return iPrinterFound;
+ }
+
+void CDiscoveryDlgManager::DialogDismissedL( TInt /*aButtonId*/ )
+ {
+ LOG("CDiscoveryDlgManager::DialogDismissedL BEGIN");
+ // This is called only if hidden discovery is cancelled
+ // start cancelling operation and put cancelling note on.
+ iPrinterFound = EFalse;
+ iCancelling = ETrue;
+ iDiscovery->CancelDeviceDiscoveryL();
+ // User cancelled the discovery dialog before all the printers were found
+ if ( !iDiscoveryCompleted )
+ {
+ ShowCancelWaitNoteL();
+ }
+ LOG("CDiscoveryDlgManager::DialogDismissedL END");
+ }
+
+void CDiscoveryDlgManager::ShowCancelWaitNoteL()
+ {
+ iCancellingDialog =
+ new ( ELeave ) CAknWaitDialog(
+ (REINTERPRET_CAST(CEikDialog**,&iCancellingDialog)));
+ iCancellingDialog->PrepareLC(R_CANCEL_PRINTING_DIALOG);
+ HBufC* text = StringLoader::LoadLC( R_QTN_PRINT_PROGRESS_PROMPT_CANCEL );
+ iCancellingDialog->SetTextL( *text );
+ CleanupStack::PopAndDestroy(text);
+
+ iCancellingDialog->SetTone( CAknNoteDialog::ENoTone );
+ iCancellingDialog->RunLD();
+ }
+
+// Creates and initializees the popup list
+CAknPopupList* CDiscoveryDlgManager::CreatePopupListL()
+ {
+ LOG("CDiscoveryDlgManager::CreatePopupListL BEGIN");
+ if ( iListBox )
+ {
+ delete iListBox;
+ iListBox = 0;
+ }
+ // Creates list box for the pop-up list
+ iListBox = new ( ELeave ) CAknSingleGraphicPopupMenuStyleListBox;//CAknSingleGraphicPopupMenuStyleListBox;
+
+ // Create and initialize the popup list
+ iPopupList = CAknPopupList::NewL(
+ iListBox,
+ /*R_AVKON_SOFTKEYS_CANCEL,*/
+ R_AVKON_SOFTKEYS_STOP,
+ AknPopupLayouts::EDynMenuWindow );
+
+ // Set the title of the pop-up list
+ iPopupList->SetTitleL( iActiveTitleText );
+
+ // Initialize list box
+ iListBox->ConstructL( iPopupList,
+ EAknListBoxSelectionList ); // EAknListBoxMenuList
+ iListBox->CreateScrollBarFrameL( ETrue );
+ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+ HBufC* text = StringLoader::LoadLC( R_QTN_PRINT_NO_PRINTERS );
+ iListBox->View()->SetListEmptyTextL( *text );
+ CleanupStack::PopAndDestroy( text );
+
+ //Array of icons to show in the pop-up list
+ CArrayPtrFlat< CGulIcon >* icons =
+ new( ELeave ) CArrayPtrFlat< CGulIcon >( KNumberOfIcons );
+
+ //Push to ClenupStack. Array and all of items added to it
+ //are deleted if leave occurs
+ CleanupStack::PushL(TCleanupItem(CleanUpResetAndDestroy, icons));
+ icons->SetReserveL( KNumberOfIcons );
+
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+
+ bitmap = new( ELeave ) CFbsBitmap();
+ User::LeaveIfError( bitmap->Create( TSize(0,0), EColor256 ) );
+ CleanupStack::PushL( bitmap );
+ CGulIcon* icon = CGulIcon::NewL( bitmap );
+ CleanupStack::Pop( bitmap );
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ AknIconUtils::CreateIconLC( bitmap, mask, KIconFile,
+ EMbmImgprintbitmapsQgn_indi_print_cached,
+ EMbmImgprintbitmapsQgn_indi_print_cached_mask );
+ icon = CGulIcon::NewL(bitmap,mask);
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ AknIconUtils::CreateIconLC( bitmap, mask, KIconFile,
+ EMbmImgprintbitmapsQgn_prop_print_bt,
+ EMbmImgprintbitmapsQgn_prop_print_bt_mask );
+ icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ AknIconUtils::CreateIconLC( bitmap, mask, KIconFile,
+ EMbmImgprintbitmapsQgn_prop_print_kiosk,
+ EMbmImgprintbitmapsQgn_prop_print_kiosk_mask );
+ icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ AknIconUtils::CreateIconLC( bitmap, mask, KIconFile,
+ EMbmImgprintbitmapsQgn_prop_print_mmc,
+ EMbmImgprintbitmapsQgn_prop_print_mmc_mask );
+ icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ AknIconUtils::CreateIconLC( bitmap, mask, KIconFile,
+ EMbmImgprintbitmapsQgn_prop_print_usb,
+ EMbmImgprintbitmapsQgn_prop_print_usb_mask );
+ icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ AknIconUtils::CreateIconLC( bitmap, mask, KIconFile,
+ EMbmImgprintbitmapsQgn_prop_print_wlan,
+ EMbmImgprintbitmapsQgn_prop_print_wlan_mask );
+ icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( 2 ); // bitmap, mask
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ CleanupStack::Pop( icons );
+ iListBox->ItemDrawer()->FormattedCellData()->SetIconArray( icons );
+ iListBox->Model()->SetItemTextArray( iListOfDeviceNames );
+ iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ // Set the animation
+ iPopupList->Heading()->SetHeaderAnimationL( R_IMAGEPRINT_ANIMATION );
+ iActivePopup = ETrue;
+
+ LOG("CDiscoveryDlgManager::CreatePopupListL END");
+ return iPopupList;
+ }
+
+// Adds new device to list, updates popup list
+void CDiscoveryDlgManager::AddNewDeviceToListL(
+ HBufC* aText,
+ TInt aUid,
+ TBool aCached,
+ TPrinterType aType,
+ TUint aVendor )
+ {
+ LOG("CDiscoveryDlgManager::AddNewDeviceToListL BEGIN");
+ HBufC* buf;
+
+ // if the device is memory card
+ if( aType == MDiscoveryObserver::EMMC )
+ {
+ HBufC* stringholdercopy = StringLoader::LoadLC
+ ( R_QTN_PRINT_MEMORY_CARD );
+ buf = HBufC::NewLC( stringholdercopy->Size() + KSpaceForSingleIcon );
+ TPtr ptr = buf->Des();
+ ptr.Append( KMMCIconIndex );
+ ptr.Append( KTabChar );
+ ptr.Append( stringholdercopy->Des() );
+
+ // Add new device into array
+ iListOfDeviceNames->InsertL( 0, *buf );
+ iNameArray->InsertL( 0, *stringholdercopy );
+ CleanupStack::PopAndDestroy( 2, stringholdercopy ); //buf, stringholdercopy
+ }
+ else // any other device
+ {
+ if ( aCached )
+ {
+ buf = HBufC::NewLC( aText->Size() + KSpaceForBothIcons );
+ }
+ else
+ {
+ buf = HBufC::NewLC( aText->Size() + KSpaceForSingleIcon );
+ }
+ TPtr ptr = buf->Des();
+ if( aType == MDiscoveryObserver::EBPP )
+ {
+ ptr.Append( KBTIconIndex );
+ }
+ else if( aType == MDiscoveryObserver::EOPP )
+ {
+ ptr.Append( KKioskIconIndex );
+ }
+ else if( aType == MDiscoveryObserver::EUSB )
+ {
+ ptr.Append( KUSBIconIndex );
+ }
+ else if( aType == MDiscoveryObserver::EWLAN )
+ {
+ ptr.Append( KWLANIconIndex );
+ }
+ else
+ {
+ ptr.Append( KEmptyIconIndex );
+ }
+ ptr.Append( KTabChar );
+ ptr.Append( aText->Des() );
+
+ if ( aCached )
+ {
+ ptr.Append( KTabChar );
+ ptr.Append( KCachedIconIndex );
+ }
+
+ // Add new device into array
+ iListOfDeviceNames->InsertL( 0, *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+ // Add Uid of the device into array
+ iUidArray->InsertL( 0, aUid );
+
+ aVendor = TPrinter::EVendorNone;
+
+ iBrandArray->InsertL( 0, aVendor );
+ iProtocolArray->InsertL( 0, aType );
+ if( aType != MDiscoveryObserver::EMMC )
+ {
+ iNameArray->InsertL( 0, *aText );
+ }
+
+ if ( iActivePopup )
+ {
+ LOG("CDiscoveryDlgManager::AddNewDeviceToListL popup update");
+ iListBox->HandleItemAdditionL();
+ iPopupList->DrawNow();
+
+ if ( iListOfDeviceNames->MdcaCount() == 1 )
+ {
+ // First item to appear, change CBA
+ iPopupList->ButtonGroupContainer()->SetCommandSetL(
+ R_AVKON_SOFTKEYS_STOP
+ );
+ iPopupList->ButtonGroupContainer()->DrawNow();
+ }
+ }
+ LOG("CDiscoveryDlgManager::AddNewDeviceToListL END");
+ }
+
+// Returns the name of the chosen printer
+TInt CDiscoveryDlgManager::PrinterUid() const
+ {
+ return iCurrentPrinterUid;
+ }
+
+// Returns the name of the chosen printer
+const TDesC& CDiscoveryDlgManager::PrinterName() const
+ {
+ LOG("CDiscoveryDlgManager::PrinterName() BEGIN");
+ if ( !iPrinterName )
+ {
+ return KNullDesC();
+ }
+ else
+ {
+ return *iPrinterName;
+ }
+ }
+
+ TBool CDiscoveryDlgManager::USBPrinterSelected() const
+ {
+ return iUSBPrinterSelected;
+ }
+
+// Resets the popup list and starts the device discovery again
+void CDiscoveryDlgManager::RestartDiscoveryL()
+ {
+ iSearchingCancelled = EFalse;
+
+ iListOfDeviceNames->Reset();
+ iUidArray->Reset();
+ iBrandArray->Reset();
+ iProtocolArray->Reset();
+ iActiveTitleText.Set( iSearchingText->Des() );
+ iPopupList = CreatePopupListL();
+ iDiscoveryCompleted = EFalse;
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+
+// Removes cached printer from the list
+void CDiscoveryDlgManager::RemoveCachedPrinterL(
+ TInt aUid )
+ {
+ TInt i( 0 );
+ TBool found( EFalse );
+ for ( i = 0; i < iUidArray->Count() && !found; i++ )
+ {
+ if ( aUid == iUidArray->At( i ) )
+ {
+ TInt curIndex = iListBox->CurrentItemIndex();
+ if ( curIndex >= i &&
+ iListOfDeviceNames->MdcaCount() > 1 && curIndex > 0 )
+ {
+ iListBox->SetCurrentItemIndexAndDraw( curIndex - 1 );
+ }
+
+ iUidArray->Delete( i );
+ iBrandArray->Delete( i );
+ iProtocolArray->Delete( i );
+ iNameArray->Delete( i );
+ iListOfDeviceNames->Delete( i );
+ iListBox->HandleItemRemovalL();
+ iPopupList->DrawNow();
+
+ if ( iListOfDeviceNames->MdcaCount() == 0 )
+ {
+ // Zero items, change softkeys
+ if ( iActivePopup )
+ {
+ iPopupList->ButtonGroupContainer()->SetCommandSetL(
+ R_AVKON_SOFTKEYS_CANCEL );
+ iPopupList->ButtonGroupContainer()->DrawNow();
+ }
+ }
+ found = ETrue;
+ }
+ }
+ }
+
+// Removes cached printer icons from the list
+void CDiscoveryDlgManager::RemoveCachedIconsL()
+ {
+ TInt counter = iListOfDeviceNames->MdcaCount();
+ TChar KTabChar( 0x0009 );
+ for ( TInt i = 0 ; i < counter; i++ )
+ {
+ TPtrC tmp( iListOfDeviceNames->MdcaPoint( i ) );
+ //locate the rightmost tab
+ TInt tabPosition = tmp.LocateReverse( KTabChar );
+ if ( tabPosition != KErrNotFound &&
+ tabPosition > 1 ) //don't remove the pre-text tab
+ {
+ iListOfDeviceNames->InsertL( i, tmp.Left( tabPosition ) );
+ iListOfDeviceNames->Delete( i + 1 );
+ }
+ }
+ iListBox->HandleItemAdditionL();
+ iPopupList->DrawNow();
+ }
+
+// Adds serarch again text to list
+void CDiscoveryDlgManager::AddSearchAgainTextL()
+ {
+ HBufC* str = StringLoader::LoadLC
+ ( R_QTN_SEARCH_AGAIN );
+ HBufC* buf = HBufC::NewLC( str->Size() + KSpaceForSingleIcon );
+ TPtr ptr = buf->Des();
+ ptr.Append( KEmptyIconIndex );
+ ptr.Append( KTabChar );
+ ptr.Append( str->Des() );
+
+ iListOfDeviceNames->InsertL( 0, *buf );
+
+ CleanupStack::PopAndDestroy( 2, str ); //buf, str
+
+ iUidArray->InsertL( 0, KSearchAgainUID );
+ iListBox->HandleItemAdditionL();
+ iPopupList->DrawNow();
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CDiscoveryDlgManager::WlanAccessPointExists
+//
+//--------------------------------------------------------------------------------------------
+TBool CDiscoveryDlgManager::WlanAccessPointExistsL()
+ {
+ LOG("[CDiscoveryDlgManager::WlanAccessPointExists] BEGIN");
+ TBool accessPointExists( EFalse );
+ CUpnpShowCommand* upnpShowCommand = NULL;
+ TRAPD ( error, upnpShowCommand = CUpnpShowCommand::NewL() );
+ if ( error != KErrNone )
+ {
+ LOG1("[CDiscoveryDlgManager::WlanAccessPointExists] CUpnpShowCommand::NewL leaves, with: %d", error);
+ return accessPointExists;
+ }
+ CleanupStack::PushL( upnpShowCommand );
+ accessPointExists = upnpShowCommand->IsAvailableL();
+ CleanupStack::PopAndDestroy(); // upnpShowCommand
+ LOG1("[CDiscoveryDlgManager::WlanAccessPointExists]\t END, AccessPointExists: %d", accessPointExists);
+ return accessPointExists;
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CDiscoveryDlgManager::TryDeviceDiscoveryL()
+//
+//--------------------------------------------------------------------------------------------
+TBool CDiscoveryDlgManager::TryDeviceDiscoveryL( TUint aProtocols, TBool aSingleDiscovery )
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL");
+
+ // WLAN access point not defined
+ if ( !WlanAccessPointExistsL() )
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - AP not defined, launch WLAN wizard query");
+
+ // Launch WLAN wizard query
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - CAknMessageQueryDialog");
+ CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog;
+
+ // User pressed OK
+ if ( dlg->ExecuteLD( R_LAUNCH_WLAN_WIZARD_QUERY ) )
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Launch WLAN wizard");
+
+ // Launch WLAN wizard
+ CUpnpRunSetupCommand* runSetupCommand = CUpnpRunSetupCommand::NewL();
+ CleanupStack::PushL(runSetupCommand);
+ runSetupCommand->RunSetupL();
+ CleanupStack::PopAndDestroy(runSetupCommand);
+
+
+ // If access point defined by the WLAN wizard
+ if ( WlanAccessPointExistsL() )
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - AP defined in WLAN wizard");
+
+ if ( aSingleDiscovery )
+ {
+ // Start discovery
+ // Continues to StartDeviceDiscoveryL
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start discovery with single protocol");
+ iDiscovery->StartDeviceDiscoveryL( this, aProtocols );
+ }
+ else
+ {
+ // Start discovery
+ // Continues to StartDeviceDiscoveryL
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start discovery with all prots");
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+ }
+
+ // Access point not defined by the WLAN wizard
+ else
+ {
+ // Thus, WLAN discovery not supported
+ iSupportedProtocols = iSupportedProtocols - KImagePrint_PrinterProtocol_UPnP;
+
+ if ( aSingleDiscovery )
+ {
+ // Do nothing
+ // WLAN not supported
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Launch WLAN wizard canceled");
+ return EFalse;
+ }
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start discovery without WLAN");
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+
+ iSupportedProtocols = iSupportedProtocols - KImagePrint_PrinterProtocol_UPnP;
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start discovery without WLAN");
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+ }
+
+ // User pressed cancel
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - User pressed cancel");
+
+ // WLAN discovery not supported
+ iSupportedProtocols = iSupportedProtocols - KImagePrint_PrinterProtocol_UPnP;
+
+ if ( aSingleDiscovery )
+ {
+ // Do nothing
+ // WLAN not supported
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Launch WLAN wizard canceled");
+ return EFalse;
+ }
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start discovery without WLAN");
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+ }
+
+ return ETrue;
+ }
+
+ // If WLAN access point is defined
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - AP is defined");
+
+ // Start discovery
+ // Continues to StartDeviceDiscoveryL
+
+ if ( aSingleDiscovery )
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start WLAN discovery");
+ iDiscovery->StartDeviceDiscoveryL( this, aProtocols );
+ }
+ else
+ {
+ LOG("[CUPnPPrintingDevice]\t TryDeviceDiscoveryL - Start discovery with all prots");
+ iDiscovery->StartDeviceDiscoveryL( this, iSupportedProtocols );
+ }
+
+ return ETrue;
+ }
+ }
+
+//--------------------------------------------------------------------------------------------
+//
+// CDiscoveryDlgManager::CancelDiscovery()
+//
+//--------------------------------------------------------------------------------------------
+void CDiscoveryDlgManager::CancelDiscovery()
+ {
+ LOG("CDiscoveryDlgManager::CancelDiscovery begin");
+ if(iPopupList)
+ {
+ LOG("CDiscoveryDlgManager::CancelDiscovery canceling popup device list.");
+ iSearchingCancelled = ETrue;
+
+ TInt error ( KErrNone );
+ TRAP( error, iDiscovery->CancelDeviceDiscoveryL());
+
+
+ iPopupList->CancelPopup();
+ }
+ LOG("CDiscoveryDlgManager::CancelDiscovery end");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/cimgpprintdlgmanager.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,463 @@
+/*
+* 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:
+*
+*/
+
+
+#include <StringLoader.h>
+#include <AknWaitDialog.h>
+#include <aknstaticnotedialog.h>
+#include <eikprogi.h>
+#include <aknnotewrappers.h>
+#include <coecntrl.h>
+#include <eikmenup.h>
+#include <bautils.h>
+#include <bluetooth/hci/hcierrors.h>
+#include <f32file.h>
+#include <imageprintapp.rsg>
+
+#include "cimgpprintdlgmanager.h"
+#include "imgpprintapputil.h"
+#include "cimgpprintprogressdlg.h"
+#include "clog.h"
+#include "cimgpprintutils.h"
+#include "mprintingobserver.h"
+#include "tprinter.h"
+#include "printmessagecodes.h"
+#include "imageprintconsts.h"
+
+_LIT(KPlain, "%S");
+
+const TUint KProgressFinalValue = 100;
+
+// Timeout for MMC InformationNote ( timeout = 5 000 000 ms -> 5 s )
+const TInt KTimeOut = 5000000;
+
+
+// CONSTRUCTION
+EXPORT_C CIMGPPrintDlgManager* CIMGPPrintDlgManager::NewL(
+ TInt aNoc,
+ MPrintJob* aPrintJob,
+ TUint aNumOfPages,
+ TBool aMMCPrinting,
+ TUint aVendor,
+ CIMGPPrintUtils* aPrintUtils,
+ MPrintingObserver* aPrintingObserver )
+ {
+ CIMGPPrintDlgManager* self =
+ CIMGPPrintDlgManager::NewLC( aNoc,
+ aPrintJob,
+ aNumOfPages,
+ aMMCPrinting,
+ aVendor,
+ aPrintUtils,
+ aPrintingObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CIMGPPrintDlgManager* CIMGPPrintDlgManager::NewLC(
+ TInt aNoc,
+ MPrintJob* aPrintJob,
+ TUint aNumOfPages,
+ TBool aMMCPrinting,
+ TUint aVendor,
+ CIMGPPrintUtils* aPrintUtils,
+ MPrintingObserver* aPrintingObserver )
+ {
+ CIMGPPrintDlgManager* self =
+ new ( ELeave ) CIMGPPrintDlgManager( aNoc,
+ aPrintJob,
+ aNumOfPages,
+ aMMCPrinting,
+ aVendor,
+ aPrintUtils,
+ aPrintingObserver );
+ self->ConstructL();
+ CleanupStack::PushL( self );
+
+ return self;
+ }
+
+
+// Second class constructor
+void CIMGPPrintDlgManager::ConstructL()
+ {
+
+ }
+
+// Default constructor
+CIMGPPrintDlgManager::CIMGPPrintDlgManager(
+ TInt aNoc,
+ MPrintJob* aPrintJob,
+ TUint aNumOfPages,
+ TBool aMMCPrinting,
+ TUint aVendor,
+ CIMGPPrintUtils* aPrintUtils,
+ MPrintingObserver* aPrintingObserver ) :
+ iPrintJob( aPrintJob ),
+ iNumOfPages( aNumOfPages ),
+ iMMCPrinting( aMMCPrinting ),
+ iVendor( aVendor )
+ {
+ iCancellingDialog = 0;
+ // Used only in aiw printing
+ if( aPrintUtils )
+ {
+ iPrintUtils = aPrintUtils;
+ }
+ if( aPrintingObserver )
+ {
+ iPrintingObserver = aPrintingObserver;
+ }
+ iNoc = aNoc;
+ }
+
+// Destructor
+CIMGPPrintDlgManager::~CIMGPPrintDlgManager()
+ {
+ LOG("CIMGPPrintDlgManager::~CIMGPPrintDlgManager BEGIN");
+ if ( iDialog )
+ {
+ delete iDialog;
+ iDialog = 0;
+ }
+ LOG("CIMGPPrintDlgManager::~CIMGPPrintDlgManager END");
+ }
+
+// Starts the print job
+EXPORT_C void CIMGPPrintDlgManager::StartPrintingL()
+ {
+ LOG("CIMGPPrintDlgManager::StartPrintingL BEGIN");
+
+ iFirstNote = ETrue;
+
+ TRAPD( err, iPrintJob->PrintL( this ));
+ if ( err == KErrNone )
+ {
+ LOG("CIMGPPrintDlgManager::StartPrintingL printing...");
+ PrepareProgressDialogL();
+ iCancelling = EFalse;
+ iPrintingCancelled = EFalse;
+ iDialog->RunLD();
+ }
+ else
+ {
+ LOG("CIMGPPrintDlgManager::StartPrintingL failed");
+ if ( iDialog )
+ {
+ delete iDialog;
+ iDialog = 0;
+ }
+ if( iPrintUtils )
+ {
+ iPrintUtils->JobFinished();
+ }
+ if( iPrintingObserver )
+ {
+ TRAP_IGNORE( iPrintingObserver->PrintingCompletedL( EFalse ));
+ }
+ // Don't leave for KErrNotFound, as there's another note for it
+ if ( err != KErrNotFound )
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( err ));
+ }
+ }
+ LOG("CIMGPPrintDlgManager::StartPrintingL END");
+ }
+
+void CIMGPPrintDlgManager::PrepareProgressDialogL()
+ {
+ LOG("CIMGPPrintDlgManager::PrepareProgressDialogL START");
+ HBufC* txt;
+ if ( !iMMCPrinting )
+ {
+ txt = StringLoader::LoadLC(
+ R_QTN_PRINT_PROGRESS_NOTE_TITLE );
+ }
+ else
+ {
+ txt = StringLoader::LoadLC(
+ R_QTN_COPY_PROGRESS_NOTE_TITLE);
+ }
+
+ TBuf<128> buf;
+ buf.Format( KPlain, txt );
+ CleanupStack::PopAndDestroy( txt );
+
+ iDialog = new ( ELeave ) CAknProgressDialog(
+ (REINTERPRET_CAST( CEikDialog**, &iDialog )), EFalse );
+ iDialog->PrepareLC( R_PRINT_PROGRESS_PLAIN_PROG_NOTE );
+
+ CEikProgressInfo* info = iDialog->GetProgressInfoL();
+ info->SetFinalValue( KProgressFinalValue );
+ iDialog->SetTextL( buf );
+ iDialog->SetCallback( this );
+ LOG("CIMGPPrintDlgManager::PrepareProgressDialogL END");
+ }
+
+
+// Called to update the print progress
+void CIMGPPrintDlgManager::PrintProgress(
+ TUint aComplete )
+ {
+ TInt err = KErrNone;
+ TRAP( err, PrintProgressL( aComplete ) );
+ if ( err != KErrNone )
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( err ) );
+ }
+ }
+
+// Called to update the print progress
+void CIMGPPrintDlgManager::PrintProgressL(
+ TUint aComplete )
+ {
+ LOG1( "CIMGPPrintDlgManager::PrintProgressL START with: %d", aComplete );
+ if( !iCancelling )
+ {
+ if ( !iDialog )
+ {
+ LOG("CIMGPPrintDlgManager::PrintProgressL: creating dialog again");
+ PrepareProgressDialogL();
+ iDialog->RunLD();
+ }
+ CEikProgressInfo* info = iDialog->GetProgressInfoL();
+ info->SetAndDraw( aComplete );
+ }
+ LOG("CIMGPPrintDlgManager::PrintProgressL END");
+ }
+
+// Called when the print job is finished
+void CIMGPPrintDlgManager::JobFinished()
+ {
+
+ LOG("CIMGPPrintDlgManager::JobFinished BEGIN");
+ if ( iDialog )
+ {
+ delete iDialog;
+ iDialog = 0;
+ }
+ if ( iMMCPrinting && !iCancelling )
+ {
+ LOG("CIMGPPrintDlgManager::JobFinished mmc note");
+ TRAP_IGNORE( ShowMMCPrintingCompletedDlgL() );
+ LOG("CIMGPPrintDlgManager::JobFinished mmc note done");
+ }
+ if ( iCancelling )
+ {
+ if(iCancellingDialog)
+ {
+ TRAP_IGNORE( iCancellingDialog->ProcessFinishedL() );
+ iCancellingDialog = 0;
+ iCancelling = EFalse;
+ }
+ }
+ else
+ {
+ if( iPrintUtils )
+ {
+ LOG("CIMGPPrintDlgManager::JobFinished iPrintUtils");
+ iPrintUtils->JobFinished();
+ LOG("CIMGPPrintDlgManager::JobFinished iPrintUtils done");
+ }
+ if( iPrintingObserver )
+ {
+ TRAP_IGNORE( iPrintingObserver->PrintingCompletedL( EFalse ));
+ }
+ }
+ LOG("CIMGPPrintDlgManager::JobFinished END");
+ }
+
+// Manages print job errors
+void CIMGPPrintDlgManager::JobError(
+ TInt aErrCode, TInt aErrorStringCode )
+ {
+ LOG2("CIMGPPrintDlgManager::JobError BEGIN, error = %d, stringcode = %d", aErrCode, aErrorStringCode );
+
+ if( iMMCPrinting && aErrCode == ECancellingNoMessage )
+ {
+ if ( iDialog )
+ {
+ delete iDialog;
+ iDialog = 0;
+ }
+ return;
+ }
+
+ if ( iMMCPrinting && !iCancelling )
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorNoteL( R_NOTE_IMAGEPRINT_MMCCOPYFAIL ) );
+ // Nothing to do if the displaying of error note fails
+ // Just need to make sure that this method never leaves
+ }
+ if ( iCancelling )
+ {
+ LOG( "CIMGPPrintDlgManager::JobError ---> iCancellingDialog->ProcessFinishedL()" );
+ TRAP_IGNORE( iCancellingDialog->ProcessFinishedL() );
+ iCancellingDialog = 0;
+ iCancelling = EFalse;
+ }
+ else
+ {
+ // Delete dialog
+ if ( iDialog )
+ {
+ delete iDialog;
+ iDialog = 0;
+ }
+ if( iPrintUtils &&
+ aErrCode != KHCIErrorBase-EPageTimedOut &&
+ aErrorStringCode != EObexConnectError )
+ {
+ iPrintUtils->JobFinished();
+ }
+ if( iPrintingObserver )
+ {
+ TRAP_IGNORE( iPrintingObserver->PrintingCompletedL( EFalse ));
+ }
+ }
+
+ /* Error note is shown to user in normal cases, but not when
+ * printing is done to MMC, canceled, done via quickprint, or
+ * BT timeout happens, as these cases are handled in other parts
+ * of code
+ */
+ if ( !iMMCPrinting &&
+ aErrCode != ECancelling &&
+ ( !iPrintUtils ||
+ ( aErrCode != KHCIErrorBase-EPageTimedOut &&
+ aErrorStringCode != EObexConnectError )))
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( aErrCode, aErrorStringCode ));
+ // Nothing to do to handle err
+ }
+ LOG("CIMGPPrintDlgManager::JobError END");
+ }
+
+// Manages print job status events
+void CIMGPPrintDlgManager::JobStatusEvent( TInt aErrCode, TInt aErrorStringCode )
+ {
+ LOG2("CIMGPPrintDlgManager::JobStatusEvent = %d, stringcode = %d", aErrCode, aErrorStringCode );
+ // If printer is disconnected cancel printing else
+ // just show the error message
+ if ( aErrCode == KErrDisconnected )
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( KErrDisconnected, aErrorStringCode ));
+ if ( iDialog )
+ {
+ // This ends the printing
+ delete iDialog;
+ iDialog = 0;
+ }
+ }
+ else
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( aErrCode, aErrorStringCode ));
+ }
+ LOG("CIMGPPrintDlgManager::JobStatusEvent END");
+ }
+
+// Shows printing completed dlg
+void CIMGPPrintDlgManager::ShowMMCPrintingCompletedDlgL()
+ {
+ LOG("CIMGPPrintDlgManager::ShowMMCPrintingCompletedDlgL BEGIN");
+
+ RPointerArray<TDesC> allImages;
+ CleanupClosePushL( allImages );
+ iPrintJob->GetPrintJobL( allImages );
+ TInt imagesCount = allImages.Count();
+ CleanupStack::PopAndDestroy( &allImages );
+ HBufC* buf = NULL;
+
+ // Blocks possibility to show note when exiting image print.
+ if (iFirstNote)
+ {
+ if ( iNoc == 1 && imagesCount == 1 )
+ {
+ buf = StringLoader::LoadLC( R_SETTINGS_IMAGEPRINT_MMC_PRINT_NOTE_ONE_PICTURE ); //r_settings_imageprint_mmc_print_note_one_picture
+ }
+ else
+ {
+ buf = StringLoader::LoadLC( R_SETTINGS_IMAGEPRINT_MMC_PRINT_NOTE );
+ }
+
+ CAknInformationNote* dlg = new ( ELeave ) CAknInformationNote( ETrue );
+ dlg->SetTimeout( (CAknNoteDialog::TTimeout) KTimeOut );
+ dlg->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+
+ iFirstNote = EFalse;
+
+ }
+
+ LOG("CIMGPPrintDlgManager::ShowMMCPrintingCompletedDlgL END");
+ }
+
+// Called when dialog gets dismissed
+void CIMGPPrintDlgManager::DialogDismissedL(
+ TInt aButtonId )
+ {
+ LOG("CIMGPPrintDlgManager::DialogDismissedL BEGIN");
+ // If user pressed cancel, cancel printing
+ LOG1( "CIMGPPrintDlgManager::DialogDismissedL iPrintingCancelled: %d", iPrintingCancelled );
+ if ( ( aButtonId == EAknSoftkeyCancel ) && ( iPrintingCancelled == EFalse ) )
+ {
+ LOG("CIMGPPrintDlgManager::DialogDismissedL aButtonId == EAknSoftkeyCancel");
+ iDialog = 0;
+ iCancelling = ETrue;
+
+ // Printing cancelled
+ iPrintingCancelled = ETrue;
+
+ TRAPD( err, iPrintJob->CancelL() );
+ if( err == KErrNone )
+ {
+ ShowCancelWaitNoteL();
+ }
+ else
+ {
+ iCancelling = EFalse;
+ }
+ }
+
+ LOG("CIMGPPrintDlgManager::DialogDismissedL END");
+ }
+
+// Displays the cancel wait note
+void CIMGPPrintDlgManager::ShowCancelWaitNoteL()
+ {
+ iCancellingDialog =
+ new ( ELeave ) CAknWaitDialog(
+ (REINTERPRET_CAST(CEikDialog**,&iCancellingDialog)));
+ iCancellingDialog->PrepareLC(R_CANCEL_PRINTING_DIALOG);
+ HBufC* text = StringLoader::LoadLC( R_QTN_PRINT_PROGRESS_PROMPT_CANCEL );
+ iCancellingDialog->SetTextL( *text );
+ CleanupStack::PopAndDestroy(text);
+
+ iCancellingDialog->SetTone( CAknNoteDialog::ENoTone );
+ iCancellingDialog->RunLD();
+
+ if( iPrintUtils )
+ {
+ iPrintUtils->JobFinished();
+ }
+ if( iPrintingObserver )
+ {
+ iPrintingObserver->PrintingCompletedL( ETrue );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/cimgpprintprogressdlg.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,93 @@
+/*
+* 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:
+*
+*/
+
+
+#include <eikcapc.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <AknsConstants.h>
+#include <AknsListBoxBackgroundControlContext.h>
+#include <AknDef.h>
+
+#include "cimgpprintprogressdlg.h"
+#include "imageprintapp.hrh"
+#include "imageprintconsts.h"
+#include "clog.h"
+
+const TInt KBrandingBitmapPosPortY ( 50 );
+const TInt KBrandingBitmapPosLandY ( 50 );
+
+// CONSTRUCTION
+CIMGPPrintProgressDlg::CIMGPPrintProgressDlg(
+ CEikDialog** aSelfPtr,
+ TBool aVisibilityDelayOff )
+ : CAknProgressDialog( aSelfPtr, aVisibilityDelayOff )
+ {
+ }
+
+// Destructor
+CIMGPPrintProgressDlg::~CIMGPPrintProgressDlg()
+ {
+ }
+
+// Positions the UI controls correctly
+void CIMGPPrintProgressDlg::PostLayoutDynInitL()
+ {
+ LOG("CIMGPPrintProgressDlg::PostLayoutDynInitL");
+ TSize screenSize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+ TInt bitmapPosY;
+ if( screenSize.iWidth == KScreenWidthPortrait )
+ {
+ bitmapPosY = KBrandingBitmapPosPortY;
+ }
+ else
+ {
+ bitmapPosY = KBrandingBitmapPosLandY;
+ }
+ CAknProgressDialog::PostLayoutDynInitL();
+ CEikCaptionedControl* capControl = GetFirstLineOnFirstPageOrNull();
+ if( capControl )
+ {
+ capControl->SetPosition( TPoint( 0, 0 ) ) ;
+ }
+ Line( EBrandingBitmap )->SetPosition( TPoint( 70, 20 ) );
+ Control( EBrandingBitmap )->SetPosition( TPoint( 0, bitmapPosY ) );
+ Line( EBrandingBitmap )->SetRect( TRect( TPoint( 70, bitmapPosY ), TPoint( 180, bitmapPosY+40 ) ) );
+ }
+
+// Overloaded method to enable the bitmap to appear to dialog
+CEikCaptionedControl* CIMGPPrintProgressDlg::GetFirstLineOnFirstPageOrNull()
+ {
+ return Line( EPrintWaitNote );
+ }
+
+void CIMGPPrintProgressDlg::HandleResourceChange( TInt aType )
+ {
+ LOG1("CIMGPPrintProgressDlg::HandleResourceChange: %d", aType);
+ //if (aType == KEikDynamicLayoutVariantSwitch)
+ // {
+ CAknNoteDialog::HandleResourceChange( aType );
+ TRAP_IGNORE ( PostLayoutDynInitL() );
+ // }
+ }
+
+TKeyResponse CIMGPPrintProgressDlg::OfferKeyEventL( const TKeyEvent &/*aKeyEvent*/, TEventCode /*aType*/ )
+ {
+ return EKeyWasConsumed;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/cimgpprintutils.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,326 @@
+/*
+* 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:
+*
+*/
+
+
+#include <imageprintapp.rsg>
+#include <imageprintengine.rsg>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <aknstaticnotedialog.h>
+#include <MGFetch.h>
+#include <eikspane.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <imageconversion.h>
+#include <StringLoader.h>
+#include <avkon.hrh>
+#include <bautils.h>
+#include <hlplch.h>
+#include <e32std.h>
+#include <coehelp.h>
+#include <s32file.h>
+#include <AiwGenericParam.h>
+#include <e32property.h>
+#include <bluetooth/hci/hcierrors.h>
+#include <pathinfo.h>
+#include <driveinfo.h>
+
+#include "cimgpprintutils.h"
+#include "imageprint.h"
+#include "cimageprintsettingsview.h"
+#include "mdiscoveryobserver.h"
+#include "cimageprintdoc.h"
+#include "imgpprintapputil.h"
+#include "imageprintapp.hrh"
+#include "mprintsettings.h"
+#include "cimgpprintdlgmanager.h"
+#include "clog.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "cuiprotocolcontroller.h"
+#include "imageprintconsts.h"
+#include "printmessagecodes.h"
+#include "mprinteventregisterif.h"
+
+#ifndef __WINS__
+_LIT( KEngineRsc, "imageprintengine.rsc" );
+_LIT( KImagePrintAppRsc, "imageprintapp.rsc" );
+#else
+_LIT( KEngineRsc, "imageprintengine.rsc" );
+_LIT( KImagePrintAppRsc, "imageprintapp.rsc" );
+#endif
+
+EXPORT_C CIMGPPrintUtils* CIMGPPrintUtils::NewL( MAiwObserver* aAiwObserver )
+ {
+ CIMGPPrintUtils* self = NewLC( aAiwObserver );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CIMGPPrintUtils* CIMGPPrintUtils::NewLC( MAiwObserver* aAiwObserver )
+ {
+ CIMGPPrintUtils* self =
+ new (ELeave) CIMGPPrintUtils;
+ CleanupStack::PushL(self);
+ self->ConstructL( aAiwObserver );
+ return self;
+ }
+// Second class constructor
+void CIMGPPrintUtils::ConstructL( MAiwObserver* aAiwObserver )
+ {
+ iAiwObserver = aAiwObserver;
+
+#ifndef __WINS__
+ TFileName file;
+ TParse parse;
+ parse.Set( file, NULL, NULL );
+ file.Append( KDC_APP_RESOURCE_DIR );
+ file.Append( KImagePrintAppRsc );
+ TFileName file2;
+ parse.Set( file2, NULL, NULL );
+ file2.Append( KDC_RESOURCE_FILES_DIR );
+ file2.Append( KEngineRsc );
+#else
+ TFileName file;
+ file.Append( KDC_APP_RESOURCE_DIR );
+ file.Append( KImagePrintAppRsc);
+ TFileName file2;
+ file2.Append( KDC_RESOURCE_FILES_DIR );
+ file2.Append( KEngineRsc );
+#endif
+ // get the best matching resource for the current locale
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), file );
+ iResourceOffset = CCoeEnv::Static()->AddResourceFileL( file );
+
+ // get the best matching resource for the current locale
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), file2 );
+ iResourceOffset2 = CCoeEnv::Static()->AddResourceFileL( file2 );
+
+ TRAPD( err, iEngine = CImagePrintEngine::NewL( 0 ));
+ if ( err == KErrInUse )
+ {
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_CONCURRENT_NOTE );
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ User::Leave( KErrInUse );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+
+ iSettings = iEngine->InterfaceFactory().SettingsIF();
+
+ if ( iEngine->InterfaceFactory().IsApplicationAlreadyInUse() )
+ {
+ HBufC* buf = StringLoader::LoadLC( R_QTN_PRINT_CONCURRENT_NOTE );
+ CAknErrorNote* errornote = new (ELeave) CAknErrorNote( ETrue );
+ errornote->ExecuteLD( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ User::Leave( KErrInUse );
+ }
+
+ // Default value for printer UID before printer is selected.
+ iPrinterUID = -1;
+
+ iIdle = CIdle::NewL( CActive::EPriorityIdle );
+ }
+
+// Destructor
+CIMGPPrintUtils::~CIMGPPrintUtils()
+ {
+ CCoeEnv::Static()->DeleteResourceFile( iResourceOffset );
+ CCoeEnv::Static()->DeleteResourceFile( iResourceOffset2 );
+
+ if ( iEngine )
+ {
+ iEngine->InterfaceFactory().PrintEventRegisterIF()->UnRegisterObserver( this );
+ }
+
+ if (iPrintDlgManager)
+ {
+ delete iPrintDlgManager;
+ }
+ delete iProtocolController;
+ delete iEngine;
+ delete iIdle;
+ }
+
+// Set the printer uid in the UI side
+void CIMGPPrintUtils::SetPrinterUID( TInt aPrinterUID )
+ {
+ iPrinterUID = aPrinterUID;
+ }
+
+// Get the printer uid in the UI side
+TInt CIMGPPrintUtils::GetPrinterUID()
+ {
+ return iPrinterUID;
+ }
+
+CImagePrintEngine& CIMGPPrintUtils::Engine() const
+ {
+ return *iEngine;
+ }
+
+EXPORT_C TBool CIMGPPrintUtils::CheckMIMEType( const TDesC8& aMimeType,
+ const TFileName& aFileName )
+ {
+ TBool retVal(ETrue);
+ TBuf8<128> mimeType;
+ mimeType.Zero();
+
+ RFs fServer;
+ TInt res = fServer.Connect();
+ if ( res != KErrNone )
+ {
+ return EFalse;
+ }
+
+ TRAPD( err, CImageDecoder::GetMimeTypeFileL(fServer, aFileName, mimeType) );
+ fServer.Close();
+ if ( err != KErrNone )
+ {
+ retVal = EFalse;
+ }
+ else if ( aMimeType.Length() > 0 )
+ {
+ // Check that MIME-type matches, otherwise don't use the image
+ if ( mimeType.CompareF( aMimeType ) != 0 )
+ {
+ retVal = EFalse;
+ }
+ }
+ return retVal;
+ }
+
+
+// Print
+EXPORT_C void CIMGPPrintUtils::StartPrintingL( CDesCArrayFlat* aImages )
+ {
+ iEngine->InterfaceFactory().PrintEventRegisterIF()->RegisterObserver( this );
+ iEngine->SetImageArrayL(aImages);
+ iProtocolController = CUIProtocolController::NewL( this, iEngine->InterfaceFactory() );
+ TBool printerFound = iProtocolController->SearchDefaultPrinterL();
+ iSettings->UpdateNumberOfCopiesToServer();
+ if( printerFound )
+ {
+ LOG( "CIMGPPrintUtils::StartPrintingL default printer found, printing" );
+ PrintL();
+ }
+ else
+ {
+ LOG( "CIMGPPrintUtils::StartPrintingL default printer NOT found, leaving" );
+ User::Leave( KErrCancel );
+ }
+ }
+
+void CIMGPPrintUtils::PrintL()
+ {
+ LOG( "CIMGPPrintUtils::PrintL Start" );
+ TInt prot = iSettings->GetCurrentPrinterProtocol();
+ TUint vendor = iSettings->GetCurrentPrinterVendor();
+ TBool mmc = EFalse;
+ if( prot == MDiscoveryObserver::EMMC )
+ {
+ mmc = ETrue;
+ }
+ else
+ {
+ mmc = EFalse;
+ }
+
+ delete iPrintDlgManager;
+ iPrintDlgManager = 0;
+ iPrintDlgManager = CIMGPPrintDlgManager::NewL( 1,
+ iEngine->InterfaceFactory().PrintJobIF(), 1, mmc, vendor, this );
+ iPrintDlgManager->StartPrintingL();
+ LOG( "CIMGPPrintUtils::PrintL End" );
+ }
+
+void CIMGPPrintUtils::JobFinished()
+ {
+ iAiwObserver->JobFinished();
+ }
+
+void CIMGPPrintUtils::UsbCableDisconnected()
+ {
+ iAiwObserver->JobFinished();
+ }
+
+void CIMGPPrintUtils::RestartPrintingL()
+ {
+ TBool printerFound = iProtocolController->FullSearchL();
+ if( printerFound )
+ {
+ LOG( "CIMGPPrintUtils::RestartPrinting: printer selected, printing" );
+ iSettings->UpdateNumberOfCopiesToServer();
+ PrintL();
+ }
+ else
+ {
+ LOG( "CIMGPPrintUtils::RestartPrinting: printer not selected, leaving" );
+ iAiwObserver->JobFinished();
+ }
+ }
+
+void CIMGPPrintUtils::PrintJobProgress( TInt /*aStatus*/,
+ TInt /*aPercentCompletion*/,
+ TInt /*aJobStateCode*/ )
+ {
+ // No implementation
+ }
+
+void CIMGPPrintUtils::PrintJobError( TInt aError, TInt aErrorStringCode )
+ {
+ if ( aError == KHCIErrorBase-EPageTimedOut &&
+ aErrorStringCode == EObexConnectError )
+ {
+ //If full discovery is not wanted, uncomment next two lines for error msg & quit
+ //TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( aError, aErrorStringCode ));
+ iIdle->Cancel();
+ iIdle->Start( TCallBack( IdleCallbackL, this ));
+ }
+ }
+
+TInt CIMGPPrintUtils::IdleCallbackL( TAny* aObj )
+ {
+ CIMGPPrintUtils* obj = static_cast<CIMGPPrintUtils*>( aObj );
+ obj->RestartPrintingL();
+ return EFalse;
+ }
+
+void CIMGPPrintUtils::PrinterStatus( TInt /*aError*/, TInt /*aErrorStringCode*/ )
+ {
+ // No implementation
+ }
+
+EXPORT_C void CIMGPPrintUtils::GetDataFilePathL( TFileName& aFileName )
+ {
+ TInt phoneMemoryNumber( 0 );
+ User::LeaveIfError( DriveInfo::GetDefaultDrive(
+ DriveInfo::EDefaultPhoneMemory, phoneMemoryNumber ) );
+
+ TDriveUnit unit( phoneMemoryNumber );
+
+ aFileName.Append( unit.Name() );
+ aFileName.Append( KParamFile );
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/cuiprotocolcontroller.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,558 @@
+/*
+* 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:
+*
+*/
+
+
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <imageprintapp.rsg>
+
+#include "cuiprotocolcontroller.h"
+#include "muimodeobserver.h"
+#include "ciffactory.h"
+#include "midleprinteventregisterif.h"
+#include "mdiscovery.h"
+#include "mprintjob.h"
+#include "mprintsettings.h"
+#include "mdiscoveryobserver.h"
+#include "tprinter.h"
+#include "imgpprintapputil.h"
+#include "ccustomnotedialog.h"
+#include "clog.h"
+
+const TInt KMMCID( 1 );
+
+// CONSTRUCTOR
+EXPORT_C CUIProtocolController* CUIProtocolController::NewL(
+ MProtocolObserver* aProtocolObserver,
+ CIFFactory& aIFFactory )
+ {
+ CUIProtocolController* self = NewLC( aProtocolObserver,
+ aIFFactory );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CUIProtocolController* CUIProtocolController::NewLC(
+ MProtocolObserver* aProtocolObserver,
+ CIFFactory& aIFFactory )
+ {
+ CUIProtocolController* self = new ( ELeave ) CUIProtocolController(
+ aProtocolObserver,
+ aIFFactory );
+ CleanupStack::PushL( self );
+ self->ConstructL( aIFFactory );
+ return self;
+ }
+
+// Default constructor
+CUIProtocolController::CUIProtocolController(
+ MProtocolObserver* aProtocolObserver,
+ CIFFactory& aIFFactory ) :
+ iProtocolObserver(aProtocolObserver)
+ {
+ iIFFactory = &aIFFactory;
+ iClassState = ENormalState;
+ iDiscoveryDlgManager = NULL;
+ iStartUsb = EFalse;
+ iWasUsbDisconnected = EFalse;
+ }
+
+// 2nd phase constructor
+void CUIProtocolController::ConstructL( CIFFactory& aIFFactory )
+ {
+ iIdleEventRegister = aIFFactory.IdlePrintEventRegisterIF();
+
+ // Register to receive idle event from engine
+ iIdleEventRegister->RegisterObserver( this );
+
+ iSettings = aIFFactory.SettingsIF();
+ iDiscovery = aIFFactory.DiscoveryIF();
+ }
+
+// Destructor
+CUIProtocolController::~CUIProtocolController()
+ {
+ if(iUSBConnectionWaitNote)
+ {
+ delete iUSBConnectionWaitNote;
+ iUSBConnectionWaitNote = NULL;
+ }
+
+ // Unregister from engine
+ if ( iIdleEventRegister )
+ {
+ iIdleEventRegister->UnRegisterObserver( this );
+ }
+ }
+
+
+EXPORT_C TBool CUIProtocolController::SearchDefaultPrinterL()
+ {
+ LOG("CUIProtocolController::SearchDefaultPrinterL START");
+ TBool retValue = EFalse;
+ TInt defaultProtocol = -1;
+ TBool usbOnlyMode = EFalse;
+
+ // Get supported protocols from the engine
+ TInt supportedProtocols = iIFFactory->DiscoveryIF()->SupportedProtocols();
+
+ // If PictBridge is only supported protocol, set it as default
+ if( !(supportedProtocols & KImagePrint_PrinterProtocol_BPP) &&
+ !(supportedProtocols & KImagePrint_PrinterProtocol_DPOF) &&
+ !(supportedProtocols & KImagePrint_PrinterProtocol_UPnP) &&
+ (supportedProtocols & KImagePrint_PrinterProtocol_PictBridge) )
+ {
+ LOG("CUIProtocolController::SearchDefaultPrinterL: USB only mode detected");
+ defaultProtocol = MDiscoveryObserver::EUSB;
+ usbOnlyMode = ETrue;
+ }
+ // If usb is connected and PictBridge selected it will be used
+ else if( iDiscovery->IsPictBridgeMode() > 0 )
+ {
+ defaultProtocol = MDiscoveryObserver::EUSB;
+ }
+ else // check default printer.
+ {
+ LOG("iSettings->GetDefaultPrinterProtocol()");
+ defaultProtocol = iSettings->GetDefaultPrinterProtocol();
+ LOG1("defaultProtocol = %d",defaultProtocol);
+ }
+
+ retValue = SetDefaultPrinterL( defaultProtocol );
+
+ // If there is no default printer or default printer not available
+ // start settings view with no printer information (but not in usb only mode)
+ if( retValue == EFalse && usbOnlyMode == EFalse )
+ {
+ retValue = ETrue;
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::ENOPRINTER );
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::ENOPRINTER );
+ HBufC* noPrinterText = StringLoader::LoadLC( R_PRINT_NO_PRINTER );
+ iSettings->SetCurrentPrinterName( *noPrinterText );
+ iSettings->SetDefaultPrinterNameL( *noPrinterText );
+ CleanupStack::PopAndDestroy ( noPrinterText ); //noPrinterText
+ }
+
+ if( iStartUsb )
+ {
+ iStartUsb = EFalse;
+ defaultProtocol = MDiscoveryObserver::EUSB;
+ retValue = SearchUSBPrinterL();
+ if( retValue )
+ {
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EUSB );
+
+ // In USB case it also must be checked whether default printer is
+ // set at this point, and if not, set USB as default. This is because
+ // in normal cases usb overrides the default protocol without
+ // changing itself to default.
+ TInt realDefault = iSettings->GetDefaultPrinterProtocol();
+ if ( realDefault == KErrNotFound )
+ {
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::EUSB );
+ iSettings->SetDefaultPrinterNameL( *iSettings->GetCurrentPrinterName() );
+ }
+ }
+ }
+
+ LOG("CUIProtocolController::SearchDefaultPrinterL END");
+ return retValue;
+ }
+
+TBool CUIProtocolController::SetDefaultPrinterL( TInt aDefaultProtocol )
+ {
+ TBool retValue = EFalse;
+ switch( aDefaultProtocol )
+ {
+ case MDiscoveryObserver::EUSB:
+ {
+ retValue = SearchUSBPrinterL();
+ if( retValue )
+ {
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EUSB );
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::EUSB );
+ iSettings->SetDefaultPrinterNameL( *iSettings->GetCurrentPrinterName() );
+ }
+ return retValue;
+ }
+ case MDiscoveryObserver::EBPP:
+ {
+ retValue = SearchDefaultBTPrinterL();
+ if( retValue )
+ {
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EBPP );
+ }
+ return retValue;
+ }
+ case MDiscoveryObserver::EOPP:
+ {
+ retValue = SearchDefaultBTPrinterL();
+ if( retValue )
+ {
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EOPP );
+ }
+ return retValue;
+ }
+ case MDiscoveryObserver::EMMC:
+ {
+ retValue = SearchMMCPrinterL();
+ if( retValue )
+ {
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EMMC );
+ }
+ return retValue;
+ }
+ case MDiscoveryObserver::EWLAN:
+ {
+ retValue = SearchDefaultUPnPPrinterL();
+ if( retValue )
+ {
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EWLAN );
+ }
+ return retValue;
+ }
+
+ default:
+ {
+ return retValue;
+ }
+ }
+ }
+
+// Changes default printer
+EXPORT_C TBool CUIProtocolController::ChangeDefaultPrinterL( TInt aProtocol )
+ {
+ LOG("CUIProtocolController::ChangeDefaultPrinterL START");
+ TBool retValue;
+ TInt previousDefaultProtocol = iSettings->GetDefaultPrinterProtocol();
+ iSettings->SetDefaultPrinterProtocol( KErrNotFound );
+ iClassState = EDiscoveryOngoing;
+
+ switch( aProtocol )
+ {
+ case MDiscoveryObserver::EUSB:
+ {
+ retValue = SearchUSBPrinterL();
+ if( retValue )
+ {
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::EUSB );
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EUSB );
+ iSettings->SetDefaultPrinterNameL( *iSettings->GetCurrentPrinterName() );
+ }
+ break;
+ }
+
+ case MDiscoveryObserver::EBPP:
+ {
+ retValue = SearchBTPrinterL();
+ if( retValue )
+ {
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::EBPP );
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EBPP );
+ }
+ break;
+ }
+
+ case MDiscoveryObserver::EMMC:
+ {
+ retValue = SearchMMCPrinterL();
+ if( retValue )
+ {
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::EMMC );
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EMMC );
+ }
+ break;
+ }
+
+ case MDiscoveryObserver::EWLAN:
+ {
+ retValue = SearchUPnPPrinterL();
+ if( retValue )
+ {
+ iSettings->SetDefaultPrinterProtocol( MDiscoveryObserver::EWLAN );
+ iSettings->SetCurrentPrinterProtocol( MDiscoveryObserver::EWLAN );
+ }
+
+ break;
+ }
+
+ default:
+ {
+ // protocol not supported
+ retValue = EFalse;
+ break;
+ }
+ }
+
+ if ( retValue == EFalse )
+ {
+ iSettings->SetDefaultPrinterProtocol( previousDefaultProtocol );
+ LOG1("CUIProtocolController::ChangeDefaultPrinterL iClassState == %d", iClassState);
+ if ( iClassState == EUSBDisconnectedDuringDiscovery )
+ {
+ iClassState = ENormalState;
+ UsbPrinterDisconnected();
+ }
+ else if( MDiscoveryObserver::EUSB == previousDefaultProtocol && iWasUsbDisconnected )
+ {
+ LOG("CUIProtocolController::ChangeDefaultPrinterL nothing selected, but usb previously disconnected, discoverying");
+ SearchDefaultPrinterL();
+ }
+ }
+ iClassState = ENormalState;
+ LOG("CUIProtocolController::ChangeDefaultPrinterL END");
+ return retValue;
+ }
+
+TBool CUIProtocolController::SearchUSBPrinterL()
+ {
+ LOG("CUIProtocolController::SearchUSBPrinterL START");
+ TBool retValue = EFalse;
+
+ // if the cable is not physically connected, show connect usb cable note
+ if( !IsUsbCableConnected() )
+ {
+ ShowConnectUsbCableNoteL();
+
+ // Active scheduler is used here to make this method synchronous
+ CActiveScheduler::Start();
+ }
+ // If usb cable is connected and pictbridge mode
+ if( iDiscovery->IsPictBridgeMode() > 0 )
+ {
+ CDiscoveryDlgManager* discoveryDlgManager =
+ CDiscoveryDlgManager::NewLC( *iIFFactory );
+ retValue = discoveryDlgManager->StartDlgManagerL(
+ KImagePrint_PrinterProtocol_PictBridge, ETrue );
+ CleanupStack::PopAndDestroy( discoveryDlgManager );
+ discoveryDlgManager = NULL;
+ }
+ LOG("CUIProtocolController::SearchUSBPrinterL END");
+ return retValue;
+ }
+
+// Takes BT printer in use
+TBool CUIProtocolController::SearchDefaultBTPrinterL()
+ {
+ LOG("CUIProtocolController::SearchDefaultBTPrinterL START");
+ TBool retValue = EFalse;
+
+ CDiscoveryDlgManager* discoveryDlgManager =
+ CDiscoveryDlgManager::NewLC( *iIFFactory );
+ retValue = discoveryDlgManager->StartDlgManagerL( KAllBTProtocols, ETrue );
+ CleanupStack::PopAndDestroy( discoveryDlgManager );
+ discoveryDlgManager = NULL;
+ LOG("CUIProtocolController::SearchDefaultBTPrinterL END");
+ return retValue;
+ }
+
+// Takes mmc in use
+TBool CUIProtocolController::SearchMMCPrinterL()
+ {
+ LOG("CUIProtocolController::SearchMMCPrinterL START");
+ TBool retValue = EFalse;
+
+ TInt err = iDiscovery->ChoosePrinterL( KMMCID );
+ if( err == KErrNone)
+ {
+ LOG("Print job done succesfully with MMC DEFAULT PRINTER");
+ // Set current printer name to be mmc
+ HBufC* mmcText = StringLoader::LoadLC
+ ( R_QTN_PRINT_MEMORY_CARD );
+ iSettings->SetCurrentPrinterName( *mmcText );
+ // Set vendor to none
+ iSettings->SetCurrentPrinterVendor( TPrinter::EVendorNone );
+
+ CleanupStack::PopAndDestroy(); //mmmcText
+ retValue = ETrue;
+ }
+ LOG("CUIProtocolController::SearchMMCPrinterL END");
+ return retValue;
+ }
+
+// Searches WLAN printers
+TBool CUIProtocolController::SearchUPnPPrinterL()
+ {
+ LOG("CUIProtocolController::SearchUPnPPrinterL START");
+ TBool retValue = EFalse;
+ CDiscoveryDlgManager* discoveryDlgManager =
+ CDiscoveryDlgManager::NewLC( *iIFFactory );
+ retValue = discoveryDlgManager->StartDlgManagerL( KImagePrint_PrinterProtocol_UPnP );
+ CleanupStack::PopAndDestroy( discoveryDlgManager );
+ discoveryDlgManager = NULL;
+ LOG("CUIProtocolController::SearchUPnPPrinterL END");
+ return retValue;
+ }
+
+// Takes WLAN printer in use
+TBool CUIProtocolController::SearchDefaultUPnPPrinterL()
+ {
+ LOG("CUIProtocolController::SearchDefaultUPnPPrinterL START");
+ TBool retValue = EFalse;
+
+ CDiscoveryDlgManager* discoveryDlgManager =
+ CDiscoveryDlgManager::NewLC( *iIFFactory );
+ retValue = discoveryDlgManager->StartDlgManagerL( KImagePrint_PrinterProtocol_UPnP, ETrue );
+ CleanupStack::PopAndDestroy( discoveryDlgManager );
+ discoveryDlgManager = NULL;
+ LOG("CUIProtocolController::SearchDefaultUPnPPrinterL END");
+ return retValue;
+ }
+
+TBool CUIProtocolController::SearchBTPrinterL()
+ {
+ LOG("CUIProtocolController::SearchBTPrinterL START");
+ TBool retValue = EFalse;
+ CDiscoveryDlgManager* discoveryDlgManager =
+ CDiscoveryDlgManager::NewLC( *iIFFactory );
+ retValue = discoveryDlgManager->StartDlgManagerL( KAllBTProtocols );
+ CleanupStack::PopAndDestroy( discoveryDlgManager );
+ discoveryDlgManager = NULL;
+ LOG("CUIProtocolController::SearchBTPrinterL END");
+ return retValue;
+ }
+
+// Searches all supported protocols
+TBool CUIProtocolController::FullSearchL()
+ {
+ LOG("CUIProtocolController::FullSearchL START");
+ TBool retValue = EFalse;
+ iDiscoveryDlgManager = CDiscoveryDlgManager::NewL( *iIFFactory );
+ LOG("CUIProtocolController::FullSearchL before Fullsearch");
+ retValue = iDiscoveryDlgManager->StartDlgManagerL();
+ LOG("CUIProtocolController::FullSearchL after FullSearch");
+ delete iDiscoveryDlgManager;
+ iDiscoveryDlgManager = NULL;
+ LOG("CUIProtocolController::FullSearchL END");
+ return retValue;
+ }
+
+// Is the usb cable connected to phone or not
+TBool CUIProtocolController::IsUsbCableConnected()
+ {
+ LOG("CUIProtocolController::IsUsbCableConnected START");
+ TInt err = iUsbManager.Connect();
+ if ( err == KErrNone )
+ {
+ iUsbManager.GetDeviceState( iDeviceState );
+ iUsbManager.Close();
+ }
+ else
+ {
+ LOG("CUIProtocolController::IsUsbCableConnected iUsbManager.Connect() FAIL");
+ }
+ LOG("CUIProtocolController::IsUsbCableConnected END");
+ return ( iDeviceState != EUsbDeviceStateUndefined );
+ }
+
+void CUIProtocolController::ShowConnectUsbCableNoteL()
+ {
+ LOG("CUIProtocolController::ShowConnectUsbCableNote START");
+ iUSBConnectionWaitNote = new (ELeave) CCustomNoteDialog(
+ reinterpret_cast< CEikDialog** > (&iUSBConnectionWaitNote) );
+ iUSBConnectionWaitNote->SetCallback( this );
+ iUSBConnectionWaitNote->ExecuteLD(R_CONNECT_USB);
+ LOG("CUIProtocolController::ShowConnectUsbCableNote END");
+ }
+
+// MProgressDialogCallback method
+void CUIProtocolController::DialogDismissedL(TInt /*aButtonId*/ )
+ {
+ LOG("CUIProtocolController::DialogDismissedL START");
+ CActiveScheduler::Stop();
+ LOG("CUIProtocolController::DialogDismissedL END");
+ }
+
+//Idle observer method
+void CUIProtocolController::UsbPrinterDisconnected()
+ {
+ LOG("CUIProtocolController::UsbPrinterDisconnected START");
+ if( iSettings->GetCurrentPrinterProtocol() == MDiscoveryObserver::EUSB )
+ {
+ LOG1("CUIProtocolController::UsbPrinterConnected iClassState is %d", iClassState);
+ if ( iClassState == EDiscoveryOngoing || iClassState == EUSBDisconnectedDuringDiscovery )
+ {
+ iClassState = EUSBDisconnectedDuringDiscovery;
+ iWasUsbDisconnected = ETrue;
+ LOG("CUIProtocolController::UsbPrinterConnected iClassState is now EUSBDisconnectedDuringDiscovery");
+ }
+ else
+ {
+ iProtocolObserver->UsbCableDisconnected();
+ }
+ }
+ LOG("CUIProtocolController::UsbPrinterDisconnected END");
+ }
+
+//Idle observer method
+void CUIProtocolController::UsbPrinterConnected()
+ {
+ LOG("CUIProtocolController::UsbPrinterConnected START");
+ if( EUSBDisconnectedDuringDiscovery == iClassState )
+ {
+ iClassState = EDiscoveryOngoing;
+ LOG("CUIProtocolController::UsbPrinterConnected iClassState is now EDiscoveryOngoing");
+ }
+
+ if( iUSBConnectionWaitNote ) // Remove wait note and start discovery
+ {
+ delete iUSBConnectionWaitNote;
+ iUSBConnectionWaitNote = NULL;
+ }
+ else
+ {
+ if(iDiscoveryDlgManager)
+ {
+ iStartUsb = ETrue;
+ iDiscoveryDlgManager->CancelDiscovery();
+ }
+ }
+ LOG("CUIProtocolController::UsbPrinterConnected END");
+ }
+
+//Idle observer method
+void CUIProtocolController::UsbStateChanged( TImgPrintUSBState aState, TInt aError )
+ {
+ LOG("CUIProtocolController::UsbStateChanged START");
+ if ( aState == ENOUSBEvent )
+ {
+ TRAP_IGNORE( IMGPPrintAppUtil::ShowErrorMsgL( aError ) );
+ }
+ LOG("CUIProtocolController::UsbStateChanged END");
+ }
+
+//Idle observer method
+void CUIProtocolController::ReadyToContinue()
+ {
+ LOG("CUIProtocolController::ReadyToContinue START");
+ LOG("CUIProtocolController::ReadyToContinue END");
+ }
+
+void CUIProtocolController::AsynchronousServerLeave( TInt /*aError*/ )
+ {
+ LOG("CUIProtocolController::AsynchronousServerLeave START");
+
+ // Cancel discovery in case of server leave. No can do if Cancel leaves.
+ LOG("CUIProtocolController::AsynchronousServerLeave CancelDeviceDiscoveryL()");
+ TRAP_IGNORE( iIFFactory->DiscoveryIF()->CancelDeviceDiscoveryL() );
+
+ // Cancel printing in case of server leave. No can do if Cancel leaves.
+ TRAP_IGNORE( iIFFactory->PrintJobIF()->CancelL() );
+ LOG("CUIProtocolController::AsynchronousServerLeave END");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imgpprintdll/src/imgpprintapputil.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,557 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32std.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <ErrorUI.h>
+#include <eikappui.h>
+#include <eikapp.h>
+#include <eikenv.h>
+#include <obex.h>
+#include <bluetooth/hci/hcierrors.h>
+#include <imageprintapp.rsg>
+
+#include "clog.h"
+#include "imgpprintapputil.h"
+#include "printmessagecodes.h"
+#include "cimgpprintutils.h"
+
+const TInt KClientErrorForbidden = 1025;
+
+// Displays the error note
+void IMGPPrintAppUtil::ShowErrorNoteL(
+ TInt aResourceId )
+ {
+ HBufC* str = StringLoader::LoadLC( aResourceId );
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
+ note->ExecuteLD( *str );
+ CleanupStack::PopAndDestroy(); // str
+ }
+
+// Displays the information note
+void IMGPPrintAppUtil::ShowInfoNoteL(
+ TInt aResourceId )
+ {
+ HBufC* str = StringLoader::LoadLC( aResourceId );
+ CAknInformationNote* note = new ( ELeave ) CAknInformationNote;
+ note->ExecuteLD( *str );
+ CleanupStack::PopAndDestroy(); // str
+ }
+
+// Displays error message based on the error code
+void IMGPPrintAppUtil::ShowErrorMsgL(
+ TInt aErrCode, TInt aErrorStringCode )
+ {
+ if ( aErrCode == KErrNoMemory )
+ {
+ CCoeEnv::Static()->HandleError( aErrCode );
+ }
+ else if ( aErrCode != KErrNone )
+ {
+ HBufC* str = IMGPPrintAppUtil::PrintErrorMsgLC( aErrCode, aErrorStringCode );
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote;
+ note->ExecuteLD( *str );
+ CleanupStack::PopAndDestroy(); // str
+ }
+ }
+
+// Loads printer application specific error message
+HBufC* IMGPPrintAppUtil::PrintErrorMsgLC(
+ TInt aErrCode, TInt aErrorStringCode )
+ {
+ HBufC* errStr = 0;
+ TInt resourceId( 0 );
+ TInt finalErrCode( 0 );
+
+ if ( aErrorStringCode )
+ {
+ HandleByStringCodeL( aErrCode, aErrorStringCode, resourceId );
+ }
+
+ if ( resourceId == 0 )
+ {
+ HandleByErrorCodeL( resourceId, finalErrCode, aErrCode );
+ }
+ else
+ {
+ finalErrCode = aErrorStringCode;
+ }
+
+ errStr = StringLoader::LoadLC( resourceId );
+
+// Add error code to message only when debug build is created.
+#ifdef _DEBUG
+ if ( finalErrCode != 0 )
+ {
+ // append error code to message
+ _LIT( KErrTmp, ": %d" );
+ TBuf<32> errCodeMsg;
+ errCodeMsg.Format( KErrTmp, finalErrCode );
+ errStr = errStr->ReAllocL( errStr->Length() + 32 );
+ CleanupStack::Pop(); // errStr before realloc
+ CleanupStack::PushL( errStr );
+ TPtr p( errStr->Des() );
+ p += errCodeMsg;
+ }
+#endif // _DEBUG
+ return errStr;
+ }
+
+void IMGPPrintAppUtil::HandleByStringCodeL( TInt aErrCode, TInt aErrorStringCode, TInt& aResourceId )
+ {
+ TBool matchOne = ETrue;
+ TBool matchTwo = ETrue;
+ TBool matchThree = ETrue;
+ StringCodeInkL( aErrorStringCode, aResourceId, matchOne );
+ StringCodeHwL( aErrorStringCode, aResourceId, matchTwo );
+ StringCodePaperL( aErrorStringCode, aResourceId, matchThree );
+
+ if ( !matchOne && !matchTwo && !matchThree)
+ {
+ switch ( aErrorStringCode )
+ {
+ case EObexConnectError: //-3000
+ {
+ if ( aErrCode == KHCIErrorBase-EPageTimedOut ) //-6004
+ {
+ aResourceId = R_NOTE_CONNECT_PRINT_ERROR;
+ }
+ else if ( aErrCode == KHCIErrorBase-EHostResourceRejection ) //-6013
+ {
+ aResourceId = R_NOTE_SEND_PRINT_ERROR;
+ }
+ else
+ {
+ aResourceId = R_NOTE_CONNECT_PRINT_ERROR;
+ }
+ }
+
+ case KErrL2CAPRequestTimeout:
+ aResourceId = R_NOTE_SEND_PRINT_ERROR;
+ break;
+
+ case KErrDisconnected:
+ // If aError check is needed, it is in one case -6305.
+ aResourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+
+ case EObexGeneralError:
+ aResourceId = R_NOTE_GENERAL_PRINT_ERROR;
+ break;
+
+ case EPbStatusErrorReasonFileFileDecode:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_FILE_DECODE;
+ break;
+
+ case EPbStatusErrorReasonFile:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_FILE;
+ break;
+
+ case EPbStatusErrorReasonWarning:
+ aResourceId = R_NOTE_PRINT_STATUS_ERROR;
+ break;
+
+ case EPbStatusErrorReasonNoReason:
+ aResourceId = R_NOTE_PRINT_STATUS_ERROR;
+ break;
+
+ case EPbOutOfPaper:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_OUT;
+ break;
+
+ case EPrintReasonPaused:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PRINTER_PAUSED;
+ break;
+
+ case EPrintReasonOutputAreaAlmostFull:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_OUTPUT_AREA_ALMOST_FULL;
+ break;
+
+ case EPrintReasonOutputAreaFull:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_OUTPUT_AREA_FULL;
+ break;
+
+ case EPrintReasonMarkerFailure:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_FAILURE;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+void IMGPPrintAppUtil::StringCodeInkL( TInt aErrorStringCode, TInt& aResourceId, TBool& aMatch )
+ {
+ switch ( aErrorStringCode )
+ {
+ case EPbStatusErrorReasonInkLow:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK_LOW;
+ break;
+
+ case EPbStatusErrorReasonInkWaste:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK_WASTE;
+ break;
+
+ case EPbStatusErrorReasonInk:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK;
+ break;
+
+ case EPbStatusErrorReasonInkEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK_OUT;
+ break;
+
+ case EPrintReasonMarkerSupplyLow:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_SUPPLY_LOW;
+ break;
+
+ case EPrintReasonMarkerSupplyEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_SUPPLY_EMPTY;
+ break;
+
+ default:
+ aMatch = EFalse;
+ break;
+ }
+ }
+
+void IMGPPrintAppUtil::StringCodeHwL( TInt aErrorStringCode, TInt& aResourceId, TBool& aMatch )
+ {
+ switch ( aErrorStringCode )
+ {
+ case EPbStatusErrorReasonHardwareCoverOpen:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_COVER_OPEN;
+ break;
+
+ case EPbStatusErrorReasonHardwareFatal:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_FATAL;
+ break;
+
+ case EPbStatusErrorReasonHardwareServiceCall:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_SERVICECALL;
+ break;
+
+ case EPbStatusErrorReasonHardwarePrinterUnavailable:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_PRINTER_UNAVAILABLE;
+ break;
+
+ case EPbStatusErrorReasonHardwarePrinterBusy:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_PRINTER_BUSY;
+ break;
+
+ case EPbStatusErrorReasonHardwareLever:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_LEVER;
+ break;
+
+ case EPbStatusErrorReasonHardwareNoMarkingAgent:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_NO_MARKING_AGENT;
+ break;
+
+ case EPbStatusErrorReasonHardwareInkCoverOpen:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_INK_COVER_OPEN;
+ break;
+
+ case EPbStatusErrorReasonHardwareNoInkCartridge:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_NO_INK_CARTRIDGE;
+ break;
+
+ case EPbStatusErrorReasonHardware:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE;
+ break;
+
+ default:
+ aMatch = EFalse;
+ break;
+ }
+ }
+
+void IMGPPrintAppUtil::StringCodePaperL( TInt aErrorStringCode, TInt& aResourceId, TBool& aMatch )
+ {
+ switch ( aErrorStringCode )
+ {
+ case EPbStatusErrorReasonPaperLoad:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_LOAD;
+ break;
+
+ case EPbStatusErrorReasonPaperEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_OUT;
+ break;
+
+ case EPbStatusErrorReasonPaperEject:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_EJECT;
+ break;
+
+ case EPbStatusErrorReasonPaperJam:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_JAM;
+ break;
+
+ case EPbStatusErrorReasonPaperMedia:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_MEDIA;
+ break;
+
+ case EPbStatusErrorReasonPaperNearlyEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_LOW;
+ break;
+
+ case EPbStatusErrorReasonPaperCombination:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_COMBINATION;
+ break;
+
+ case EPbStatusErrorReasonPaper:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER;
+ break;
+
+ default:
+ aMatch = EFalse;
+ break;
+ }
+ }
+
+void IMGPPrintAppUtil::HandleByErrorCodeL( TInt& aResourceId, TInt& aFinalErrCode, TInt aErrCode )
+ {
+ aFinalErrCode = aErrCode;
+
+ TBool matchOne = ETrue;
+ TBool matchTwo = ETrue;
+ TBool matchThree = ETrue;
+ ErrorCodeInkL( aResourceId, aErrCode, matchOne );
+ ErrorCodeHwL( aResourceId, aErrCode, matchTwo );
+ ErrorCodePaperL( aResourceId, aErrCode,matchThree );
+
+ if ( !matchOne && !matchTwo && !matchThree)
+ {
+ switch ( aErrCode )
+ {
+ case KClientErrorForbidden:
+ aResourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+
+ case KErrDisconnected:
+ aResourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+
+ case EObexGeneralError:
+ aResourceId = R_NOTE_GENERAL_PRINT_ERROR;
+ break;
+
+ case EPbStatusErrorReasonFileFileDecode:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_FILE_DECODE;
+ break;
+
+ case EPbStatusErrorReasonFile:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_FILE;
+ break;
+
+ case EPbStatusErrorReasonNoReason:
+ aResourceId = R_NOTE_PRINT_STATUS_ERROR;
+ break;
+
+ case KErrCorrupt: // Only corrupted images selected:
+ aResourceId = R_QTN_PRINT_SELECTNEW_NOTE;
+ break;
+
+ case EPrintReasonPaused:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PRINTER_PAUSED;
+ break;
+
+ case EPrintReasonOutputAreaAlmostFull:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_OUTPUT_AREA_ALMOST_FULL;
+ break;
+
+ case EPrintReasonOutputAreaFull:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_OUTPUT_AREA_FULL;
+ break;
+
+ case EPrintReasonMarkerFailure:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_FAILURE;
+ break;
+
+ case KErrHostUnreach:
+ aResourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+
+ case ( KHCIErrorBase-EHostResourceRejection ):
+ aResourceId = R_NOTE_SEND_PRINT_ERROR;
+ break;
+
+ case ( KHCIErrorBase-ERemoteHostTimeout ):
+ aResourceId = R_NOTE_SEND_PRINT_ERROR;
+ break;
+
+ case ( KHCIErrorBase-EPageTimedOut ):
+ aResourceId = R_NOTE_CONNECT_PRINT_ERROR;
+ break;
+
+ case KErrHCILinkDisconnection:
+ aResourceId = R_NOTE_DISCONNECT_PRINT_ERROR;
+ break;
+
+ default:
+ aResourceId = R_NOTE_GENERAL_PRINT_ERROR;
+ break;
+ }
+ }
+ }
+
+void IMGPPrintAppUtil::ErrorCodeInkL( TInt& aResourceId, TInt aErrCode, TBool& aMatch )
+ {
+ switch ( aErrCode )
+ {
+ case EPbStatusErrorReasonInkLow:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK_LOW;
+ break;
+
+ case EPbStatusErrorReasonInkWaste:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK_WASTE;
+ break;
+
+ case EPbStatusErrorReasonInk:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK;
+ break;
+
+ case EPrintReasonMarkerSupplyLow:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_SUPPLY_LOW;
+ break;
+
+ case EPrintReasonMarkerSupplyEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_MARKER_SUPPLY_EMPTY;
+ break;
+
+ case EPbStatusErrorReasonInkEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_INK_OUT;
+ break;
+
+ default:
+ aMatch = EFalse;
+ break;
+ }
+ }
+
+void IMGPPrintAppUtil::ErrorCodeHwL( TInt& aResourceId, TInt aErrCode, TBool& aMatch )
+ {
+ switch ( aErrCode )
+ {
+ case EPbStatusErrorReasonHardwareCoverOpen:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_COVER_OPEN;
+ break;
+
+ case EPbStatusErrorReasonHardwareFatal:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_FATAL;
+ break;
+
+ case EPbStatusErrorReasonHardwareServiceCall:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_SERVICECALL;
+ break;
+
+ case EPbStatusErrorReasonHardwarePrinterUnavailable:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_PRINTER_UNAVAILABLE;
+ break;
+
+ case EPbStatusErrorReasonHardwarePrinterBusy:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_PRINTER_BUSY;
+ break;
+
+ case EPbStatusErrorReasonHardwareLever:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_LEVER;
+ break;
+
+ case EPbStatusErrorReasonHardwareNoMarkingAgent:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_NO_MARKING_AGENT;
+ break;
+
+ case EPbStatusErrorReasonHardwareInkCoverOpen:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_INK_COVER_OPEN;
+ break;
+
+ case EPbStatusErrorReasonHardwareNoInkCartridge:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE_NO_INK_CARTRIDGE;
+ break;
+
+ case EPbStatusErrorReasonHardware:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_HARDWARE;
+ break;
+
+ default:
+ aMatch = EFalse;
+ break;
+ }
+ }
+
+void IMGPPrintAppUtil::ErrorCodePaperL( TInt& aResourceId, TInt aErrCode, TBool& aMatch )
+ {
+ switch ( aErrCode )
+ {
+ case EPbStatusErrorReasonPaperLoad:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_LOAD;
+ break;
+
+ case EPbStatusErrorReasonPaperEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_OUT;
+ break;
+
+ case EPbStatusErrorReasonPaperEject:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_EJECT;
+ break;
+
+ case EPbStatusErrorReasonPaperJam:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_JAM;
+ break;
+
+ case EPbStatusErrorReasonPaperMedia:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_MEDIA;
+ break;
+
+ case EPbStatusErrorReasonPaperNearlyEmpty:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_LOW;
+ break;
+
+ case EPbStatusErrorReasonPaperCombination:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_COMBINATION;
+ break;
+
+ case EPbStatusErrorReasonPaper:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER;
+ break;
+
+ case EPbOutOfPaper:
+ aResourceId = R_NOTE_IMAGEPRINT_ERROR_PAPER_OUT;
+ break;
+
+ default:
+ aMatch = EFalse;
+ break;
+ }
+ }
+
+// Adds application path
+TFileName IMGPPrintAppUtil::AddApplicationPath(
+ const TDesC& aFileName )
+ {
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+ CEikAppUi* appUi = static_cast<CEikAppUi*>( eikonEnv->AppUi() );
+ TFileName fullFilePath = appUi->Application()->AppFullName();
+ delete eikonEnv; eikonEnv = NULL;
+
+ TParse parse;
+ parse.Set( fullFilePath, NULL, NULL );
+ fullFilePath = parse.DriveAndPath();
+ fullFilePath.Append( aFileName );
+ return fullFilePath;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/inc/logdef.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2002-2008 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:
+*
+*/
+
+
+#ifndef LOGDEF_H
+#define LOGDEF_H
+
+/////////////////////////////////////////////////////////////////////////////
+// #Defines that control printing of additional information to debug stream.
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef _DEBUG
+// logging is always enabled in debug builds
+#define ENABLE_LOGGING
+#else
+// manually enable in release builds
+//#define ENABLE_LOGGING
+#endif // _DEBUG
+
+//#define LOG_TO_FILE
+
+#endif // LOGDEF_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/rom/desw_imageprintui.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* 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: Image Print UI components.
+*
+*/
+
+
+#ifndef DESW_IMAGEPRINTUI_IBY
+#define DESW_IMAGEPRINTUI_IBY
+
+#include <imageprintdef.iby>
+
+// Image Print application information file
+
+data=DATAZ_\APP_BITMAP_DIR\imageprintapp_aif.mif APP_BITMAP_DIR\imageprintapp_aif.mif
+
+// Non-localisable application registration file
+data=DATAZ_\Private\10003A3F\Apps\imageprintapp_reg.rsc Private\10003A3F\Apps\imageprintapp_reg.rsc
+
+// Image Print UI Binaries
+FILE=ABI_DIR\IP_DIR\imageprintengine.dll SHARED_LIB_DIR\imageprintengine.dll
+
+IP_APP(imageprintapp)
+
+// UI Resources / Bitmaps
+SCALABLE_IMAGE( APP_BITMAP_DIR,APP_BITMAP_DIR, imgprintbitmaps )
+
+// View Dll for release 3 purposes.
+FILE=ABI_DIR\IP_DIR\imgpprintdll.dll SHARED_LIB_DIR\imgpprintdll.dll
+
+// Aiw plugin
+IP_PLUGIN(aiwprintingprovider.dll,101ffaa2.rsc)
+
+// Image Print Engine centrep ini file
+DATA=DATAZ_\private\10202be9\10208a35.txt Private\10202be9\10208a35.txt
+
+#endif // DESWIMAGEPRINTUI_IBY
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/rom/imageprintresources.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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: Image Print resources.
+*
+*/
+
+
+#ifndef IMAGEPRINTRESOURCES_IBY
+#define IMAGEPRINTRESOURCES_IBY
+
+S60_APP_RESOURCE( imageprintapp )
+S60_APP_CAPTION( imageprintapp )
+
+DATA=DATAZ_\RESOURCE_FILES_DIR\imageprintengine.rsc RESOURCE_FILES_DIR\imageprintengine.rsc
+DATA=DATAZ_\RESOURCE_FILES_DIR\aiwprintingprovider.rsc RESOURCE_FILES_DIR\aiwprintingprovider.rsc
+
+data=DATAZ_\resource\imageprintdata\protocols\dpof.rsc resource\imageprintdata\protocols\dpof.rsc
+
+#endif //__IMAGEPRINTRESOURCES_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/clog/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* 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:
+*
+*/
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+clog.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/clog/group/clog.mmp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:
+*
+*/
+
+
+TARGET clog.lib
+TARGETTYPE lib
+UID 0
+
+USERINCLUDE ../../ImagePrintEngine/inc
+USERINCLUDE ../inc
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH ../src
+SOURCE clog.cpp
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE_UDEBONLY
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/clog/inc/clog.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,57 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef __CLOG_H__
+#define __CLOG_H__
+
+#include <e32base.h>
+#include <e32std.h>
+
+#include "logdef.h"
+
+#ifdef ENABLE_LOGGING
+#define LOG(s) Log::DoLog(_L(s))
+#define LOG1(s, v) Log::DoLog( _L(s), v )
+#define LOG2(s, v1, v2) Log::DoLog( _L(s), v1, v2 )
+
+#define LOG8(s) Log::DoLog8(_L8(s))
+#define LOG81(s, v) Log::DoLog8( _L8(s), v )
+#define LOG82(s, v1, v2) Log::DoLog8( _L8(s), v1, v2 )
+
+#else
+#define LOG(s)
+#define LOG1(s, v)
+#define LOG2(s, v1, v2)
+#define LOG8(s)
+#define LOG81(s, v)
+#define LOG82(s, v1, v2)
+#endif // ENABLE_LOGGING
+
+class Log
+ {
+
+ public:
+
+ static void DoLog( TRefByValue<const TDesC> aText, ... );
+
+ static void DoLog8( TRefByValue<const TDesC8> aText, ... );
+ };
+
+#endif // __CLOG_H__
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/clog/src/clog.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,119 @@
+/*
+* 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:
+*
+*/
+
+
+#include <e32svr.h>
+
+#include "clog.h"
+
+#ifdef ENABLE_LOGGING
+
+#ifdef LOG_TO_FILE
+
+#include <flogger.h>
+/// Folder where the log resides
+_LIT( KLogFolder, "ip_log" );
+/// The name of the log file
+_LIT( KLogFileName, "imageprintlog.txt" );
+/// The format in which the time is formatted in log
+_LIT( KLogTimeFormat, "%02d.%02d:%02d:%06d ");
+_LIT8( KLogTimeFormat8, "%02d.%02d:%02d:%06d ");
+/// The length of the string produced by KLogTimeFormat
+const TInt KLogTimeFormatLength = 16;
+
+#endif // LOG_TO_FILE
+
+/// How many characters a log line can contain
+const TInt KLogLineLength = 256;
+
+#endif // ENABLE_LOGGING
+
+#ifdef ENABLE_LOGGING
+
+void Log::DoLog( TRefByValue<const TDesC> aText, ... )
+ {
+ VA_LIST args;
+ VA_START( args, aText );
+
+ TBuf<KLogLineLength> buf;
+ buf.FormatList( aText, args );
+
+#ifdef LOG_TO_FILE
+ RFileLogger logger;
+ TInt ret = logger.Connect();
+ if (ret==KErrNone)
+ {
+ logger.SetDateAndTime( EFalse,EFalse );
+ logger.CreateLog( KLogFolder, KLogFileName, EFileLoggingModeAppend );
+ TBuf<KLogTimeFormatLength> timeStamp;
+ TTime now;
+ now.HomeTime();
+ TDateTime dateTime;
+ dateTime = now.DateTime();
+ timeStamp.Format( KLogTimeFormat,
+ dateTime.Hour(), dateTime.Minute(),
+ dateTime.Second(), dateTime.MicroSecond() );
+ buf.Insert( 0, timeStamp );
+
+ logger.Write(buf);
+ }
+
+ logger.Close();
+#else
+ RDebug::Print( buf );
+#endif // LOG_TO_FILE
+ VA_END( args );
+ }
+
+void Log::DoLog8( TRefByValue<const TDesC8> aText, ... )
+ {
+ VA_LIST args;
+ VA_START( args, aText );
+
+ TBuf8<KLogLineLength> buf;
+ buf.FormatList( aText, args );
+#ifdef LOG_TO_FILE
+ RFileLogger logger;
+ TInt ret = logger.Connect();
+ if (ret==KErrNone)
+ {
+ logger.SetDateAndTime( EFalse,EFalse );
+ logger.CreateLog( KLogFolder, KLogFileName, EFileLoggingModeAppend );
+ TBuf8<KLogTimeFormatLength> timeStamp;
+ TTime now;
+ now.HomeTime();
+ TDateTime dateTime;
+ dateTime = now.DateTime();
+ timeStamp.Format( KLogTimeFormat8,
+ dateTime.Hour(), dateTime.Minute(),
+ dateTime.Second(), dateTime.MicroSecond() );
+ buf.Insert( 0, timeStamp );
+
+ logger.Write(buf);
+ }
+
+ logger.Close();
+#else
+ TBuf<KLogLineLength> buf16;
+ buf16.Copy(buf);
+ RDebug::Print( buf16 );
+#endif // LOG_TO_FILE
+ VA_END( args );
+ }
+
+#endif // ENABLE_LOGGING
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+#include "../clog/group/bld.inf"
+#include "../ImagePrintEngine/group/bld.inf"
+#include "../ImagePrintUI/group/bld.inf"
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+PRJ_EXPORTS
+
+../rom/imageprint.iby CORE_APP_LAYER_IBY_EXPORT_PATH( imageprint.iby )
+../rom/imageprintdef.iby CORE_APP_LAYER_IBY_EXPORT_PATH( imageprintdef.iby )
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/inc/imageprintvariant.h Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2002-2008 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:
+*
+*/
+
+
+#ifndef IMAGEPRINTVARIANT_H
+#define IMAGEPRINTVARIANT_H
+
+// Defines dynamic settings to be in use
+#define IMG_PRINT_DYNAMIC_PRINT_SETTINGS
+
+#endif // IMAGEPRINTVARIANT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/rom/imageprint.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,25 @@
+/*
+* 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: All Image Print components except resources.
+*
+*/
+
+
+#ifndef IMAGEPRINT_IBY
+#define IMAGEPRINT_IBY
+
+#include <imageprintengine.iby>
+#include <desw_imageprintui.iby>
+
+#endif // IMAGEPRINT_IBY
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/rom/imageprintdef.iby Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* 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: Image Print rom build definition header
+*
+*/
+
+#ifndef IMAGEPRINTDEF_IBY
+#define IMAGEPRINTDEF_IBY
+
+// If __IP_DEBUG__ is defined pull in debug versions of the
+// ImagePrint and PrintingDevice DLLs and Plugins regardless of the ROM type
+
+//#define __IP_DEBUG__
+
+#ifdef __IP_DEBUG__
+define IP_DIR UDEB
+#define IP_PLUGIN ECOM_PLUGIN_UDEB
+#define IP_APP S60_APP_EXE_UDEB
+#else
+define IP_DIR BUILD_DIR
+#define IP_PLUGIN ECOM_PLUGIN
+#define IP_APP S60_APP_EXE
+#endif
+
+#endif// IMAGEPRINTDEF_IBY
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/bld.inf Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2006 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: Build information file for project printingapps
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+#include "../ImagePrint/group/bld.inf"
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+
+PRJ_TESTEXPORTS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/layers.sysdef.xml Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
+ <!ENTITY layer_real_source_path "sf/app/printing" >
+]>
+
+<SystemDefinition name="printing" schema="1.4.0">
+ <systemModel>
+ <layer name="app_layer">
+ <module name="printing">
+ <unit unitID="lcdo.printing" mrp="" bldFile="&layer_real_source_path;/group" name="printing" />
+ </module>
+ </layer>
+ </systemModel>
+</SystemDefinition>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/package_definition.xml Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0">
+ <package id="printing" name="Printing" levels="app">
+ <collection id="imageprint" name="ImagePrint" level="app">
+ <component id="clog" filter="s60" name="ImagePrint Logging" introduced="^2">
+ <unit bldFile="imageprint/clog/group"/>
+ </component>
+ <component id="imageprintengine" filter="s60" name="ImagePrint Engine" introduced="^2">
+ <unit bldFile="imageprint/imageprintengine/group"/>
+ <!-- do these other bld.infs need to be #included? -->
+ <!-- <unit bldFile="imageprint/imageprintengine/deviceprotocols/btprotocol/group"/> -->
+ <!-- <unit bldFile="imageprint/imageprintengine/deviceprotocols/dpof/group"/> -->
+ <!-- <unit bldFile="imageprint/imageprintengine/deviceprotocols/pictbridge2/group"/> -->
+ <!-- <unit bldFile="imageprint/imageprintengine/deviceprotocols/upnpprotocolfw2/group"/> -->
+ <!-- <unit bldFile="imageprint/imageprintengine/deviceprotocols/xhtmlfilecomposer/group"/> -->
+ <!-- <unit bldFile="imageprint/imageprintengine/imageprintserver/group"/> -->
+ </component>
+ <component id="imageprintui" filter="s60" name="ImagePrint UI" introduced="^2">
+ <unit bldFile="imageprint/imageprintui/group"/>
+ </component>
+ <component id="imageprint_build" filter="s60" name="ImagePrint Build" introduced="^2">
+ <!-- Need to break the IBY includes into the other components -->
+ <unit bldFile="imageprint/group"/>
+ </component>
+ </collection>
+ </package>
+</SystemDefinition>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysdef_1_4_0.dtd Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+ name CDATA #REQUIRED
+ schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+ name CDATA #REQUIRED
+ levels CDATA #IMPLIED
+ span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+ name CDATA #REQUIRED
+ level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+ unitID ID #REQUIRED
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ bldFile CDATA #REQUIRED
+ priority CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+ name CDATA #REQUIRED
+ version CDATA #REQUIRED
+ late (Y|N) #IMPLIED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+ name ID #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+ name ID #REQUIRED
+ abldTarget CDATA #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+ name ID #REQUIRED
+ abldOption CDATA #REQUIRED
+ description CDATA #REQUIRED
+ enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+ command CDATA #REQUIRED
+ targetList IDREFS #IMPLIED
+ unitParallel (Y | N | y | n) #REQUIRED
+ targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+ name CDATA #REQUIRED
+ cwd CDATA #REQUIRED
+ command CDATA #REQUIRED>