Revision: 200949
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:45:53 +0200
changeset 0 d11fb78c4374
child 1 ceeb73e410b5
Revision: 200949 Kit: 200951
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/bwins/btprotocolu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/data/01007779.rss
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/data/btprotocol.rss
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/data/btxmltemplate.txt
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/eabi/btprotocolu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/group/bld.inf
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/group/btprotocol.mmp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/btprotocolconsts.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtchannelbase.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtdevicecontainer.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtdiscover.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtdprserviceadvertiser.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtjobchannel.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtobjectserver.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtonquery.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtpasswordquery.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtprintercontroller.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtprintingdevice.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtsdpadvertiser.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtsoapcodec.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtstatuschannel.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbttimer.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cprintjob.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/crsbtdevice.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/crsbtdiscoverengine.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cxmlhandler.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/mbtonnotify.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/mbtpcobserver.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/mconfirmationnotify.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/rsutils.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/tbtmapper.h
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtchannelbase.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdevicecontainer.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdiscover.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtdprserviceadvertiser.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtjobchannel.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtobjectserver.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtonquery.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtpasswordquery.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintercontroller.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtprintingdevice.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtsdpadvertiser.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtsoapcodec.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtstatuschannel.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbttimer.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cprintjob.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/crsbtdevice.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/crsbtdiscoverengine.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cxmlhandler.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/main.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/rsutils.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/bwins/dpofprotdllu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/data/01007781.rss
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/data/dpof.rss
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/eabi/dpofprotdllu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/group/bld.inf
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/group/dpofprotdll.mmp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/ccapabilityarray.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/ccapabilityinfo.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cconfirmationquery.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cdpofprintingdevice.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cfilemanager.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cprintercapabilities.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cprinterelement.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/cprintjob.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/crsdpofengine.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/imgprintkonst.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/mconfirmationnotify.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/rsconstants.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/rsutils.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/tmapping.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/inc/tsetting.h
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/ccapabilityarray.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/ccapabilityinfo.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cconfirmationquery.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cdpofprintingdevice.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cfilemanager.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cprintercapabilities.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cprinterelement.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/cprintjob.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/crsdpofengine.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/main.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/dpof/src/rsutils.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/bwins/pdphotolibu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/data/01007783.rss
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/eabi/pdphotolibu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/group/bld.inf
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/group/pdphotolib.mmp
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/cpbconnect.h
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/cpbevent.h
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/cpbprintingdevice.h
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/mpbobserver.h
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/inc/mpersonalitynotify.h
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/cpbconnect.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/cpbevent.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/cpbprintingdevice.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/pictbridge2/src/main.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/rom/deviceprotocols.iby
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/bwins/upnpprotocolu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/data/010208a27.rss
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/data/icon.bmp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/eabi/upnpprotocolu.def
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/group/bld.inf
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/group/upnpprotocol.mmp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cjobstateevents.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cprintercontrolpoint.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupfilesharingactive.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupjobstate.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cuplogger.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupnpprintingdevice.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprinter.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprintercontainer.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprintfactory.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cupprintingjob.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/cuptimer.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/mpcpobserver.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/inc/upconsts.h
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cjobstateevents.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cprintercontrolpoint.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupfilesharingactive.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupjobstate.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupnpprintingdevice.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprinter.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintercontainer.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintfactory.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cupprintingjob.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/cuptimer.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/upnpprotocolfw2/src/main.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/bwins/xhtmlfilecomposeru.def
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/data/xhtmlfiletemplate.txt
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/eabi/xhtmlfilecomposeru.def
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/group/bld.inf
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/group/xhtmlfilecomposer.mmp
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/cimageinfo.h
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/cxfclogger.h
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/cxhtmlfilecomposer.h
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/xfctemplates.h
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/inc/xhtmlfilecomposerconst.h
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/src/cimageinfo.cpp
ImagePrint/ImagePrintEngine/DeviceProtocols/xhtmlfilecomposer/src/cxhtmlfilecomposer.cpp
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/imageprint.h
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/imageprint.rh
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/mprotprintingdevice.h
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/printcapabilitycodes.h
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/printmessagecodes.h
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/tidleevent.h
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/tprintcapability.h
ImagePrint/ImagePrintEngine/ImagePrintLibrary/inc/tprinter.h
ImagePrint/ImagePrintEngine/ImagePrintServer/bwins/imageprintclientu.def
ImagePrint/ImagePrintEngine/ImagePrintServer/eabi/imageprintclientu.def
ImagePrint/ImagePrintEngine/ImagePrintServer/group/bld.inf
ImagePrint/ImagePrintEngine/ImagePrintServer/group/imageprintclient.mmp
ImagePrint/ImagePrintEngine/ImagePrintServer/group/imageprintserver.mmp
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cdiscoveryguard.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cidleguard.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintbody.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintscheduler.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintserver.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cimageprintsession.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cjobguard.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cnumofcopies.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cprotocolsloader.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/crsimageparser.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cserverdiscoveryguard.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cserveridleguard.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/cserverjobguard.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/imageprintclientserver.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/imageprintserveruid.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/rimageprintclient.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tdiscoveryguarddata.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tidleguarddata.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tjobguarddata.h
ImagePrint/ImagePrintEngine/ImagePrintServer/inc/tmessagewrp2.h
ImagePrint/ImagePrintEngine/ImagePrintServer/rom/imageprintserver.iby
ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/cdiscoveryguard.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/cidleguard.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/cjobguard.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/client/rimageprintclient.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintbody.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintscheduler.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintserver.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cimageprintsession.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cnumofcopies.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cprotocolsloader.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/crsimageparser.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cserverdiscoveryguard.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cserveridleguard.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/cserverjobguard.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/main.cpp
ImagePrint/ImagePrintEngine/ImagePrintServer/src/server/tmessagewrp2.cpp
ImagePrint/ImagePrintEngine/group/bld.inf
ImagePrint/ImagePrintEngine/inc/logdef.h
ImagePrint/ImagePrintEngine/rom/imageprintengine.iby
ImagePrint/ImagePrintUI/group/bld.inf
ImagePrint/ImagePrintUI/imageprintapp/aif/aif.mbm
ImagePrint/ImagePrintUI/imageprintapp/aif/context_pane_icon_44x44.bmp
ImagePrint/ImagePrintUI/imageprintapp/aif/context_pane_icon_44x44_mask_soft.bmp
ImagePrint/ImagePrintUI/imageprintapp/aif/imageprintappaif.rss
ImagePrint/ImagePrintUI/imageprintapp/aif/list_icon_42x29.bmp
ImagePrint/ImagePrintUI/imageprintapp/aif/list_icon_42x29_mask_soft.bmp
ImagePrint/ImagePrintUI/imageprintapp/data/2x2inchsmall.bmp
ImagePrint/ImagePrintUI/imageprintapp/data/imageprintapp.rss
ImagePrint/ImagePrintUI/imageprintapp/data/imageprintapp_caption.rss
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_indi_print_cached.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_menu_print.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_bt.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_kiosk.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_mmc.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_bar.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_bar_short.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_handle.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_left.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_slider_right.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_usb.svg
ImagePrint/ImagePrintUI/imageprintapp/data/qgn_prop_print_wlan.svg
ImagePrint/ImagePrintUI/imageprintapp/group/bld.inf
ImagePrint/ImagePrintUI/imageprintapp/group/imageprintapp.mmp
ImagePrint/ImagePrintUI/imageprintapp/group/imageprintapp_reg.rss
ImagePrint/ImagePrintUI/imageprintapp/group/ip_icons_aif_bitmaps_dc.mk
ImagePrint/ImagePrintUI/imageprintapp/group/ip_icons_aif_scalable_dc.mk
ImagePrint/ImagePrintUI/imageprintapp/group/ip_icons_dc.mk
ImagePrint/ImagePrintUI/imageprintapp/inc/caiwmode.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cidlemode.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintapp.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintappui.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintblankcontainer.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintdoc.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintsettingscontainer.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimageprintsettingsview.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cimgpviewemptyview.h
ImagePrint/ImagePrintUI/imageprintapp/inc/cpropertiesboxmodel.h
ImagePrint/ImagePrintUI/imageprintapp/inc/imageprintapp.hrh
ImagePrint/ImagePrintUI/imageprintapp/inc/imageprintconsts.h
ImagePrint/ImagePrintUI/imageprintapp/inc/mprintingobserver.h
ImagePrint/ImagePrintUI/imageprintapp/inc/muimode.h
ImagePrint/ImagePrintUI/imageprintapp/inc/muimodeobserver.h
ImagePrint/ImagePrintUI/imageprintapp/inc/printapputil.h
ImagePrint/ImagePrintUI/imageprintapp/inc/uimodefactory.h
ImagePrint/ImagePrintUI/imageprintapp/loc/imageprintapp.loc
ImagePrint/ImagePrintUI/imageprintapp/src/caiwmode.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cidlemode.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintapp.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintappui.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintblankcontainer.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintdoc.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintsettingscontainer.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimageprintsettingsview.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cimgpviewemptyview.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/cpropertiesboxmodel.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/printapputil.cpp
ImagePrint/ImagePrintUI/imageprintapp/src/uimodefactory.cpp
ImagePrint/ImagePrintUI/imageprinteng/bwins/imageprintengineu.def
ImagePrint/ImagePrintUI/imageprinteng/data/10208a35.txt
ImagePrint/ImagePrintUI/imageprinteng/data/bckgs.mbm
ImagePrint/ImagePrintUI/imageprinteng/data/imageprintengine.rss
ImagePrint/ImagePrintUI/imageprinteng/data/previewdata.dat
ImagePrint/ImagePrintUI/imageprinteng/eabi/imageprintengineu.def
ImagePrint/ImagePrintUI/imageprinteng/group/bld.inf
ImagePrint/ImagePrintUI/imageprinteng/group/imageprintengine.mmp
ImagePrint/ImagePrintUI/imageprinteng/inc/cbasecapability.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cdiscoverymanager.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cfloatcapability.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cidleprinteventcatcher.h
ImagePrint/ImagePrintUI/imageprinteng/inc/ciffactory.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cimageprint.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cimageprintengine.h
ImagePrint/ImagePrintUI/imageprinteng/inc/clistcapability.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cpreviewinfo.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cprinteventcatcher.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cprintjobmanager.h
ImagePrint/ImagePrintUI/imageprinteng/inc/cprintsettings.h
ImagePrint/ImagePrintUI/imageprinteng/inc/crealfactory.h
ImagePrint/ImagePrintUI/imageprinteng/inc/csettingsmanager.h
ImagePrint/ImagePrintUI/imageprinteng/inc/ctemplatedata.h
ImagePrint/ImagePrintUI/imageprinteng/inc/ctemplatesettings.h
ImagePrint/ImagePrintUI/imageprinteng/inc/ctintcapability.h
ImagePrint/ImagePrintUI/imageprinteng/inc/imageprintprivatecrkeys.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mbrowserpreviewobserver.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mdiscovery.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mdiscoveryobserver.h
ImagePrint/ImagePrintUI/imageprinteng/inc/midleprinteventobserver.h
ImagePrint/ImagePrintUI/imageprinteng/inc/midleprinteventregisterif.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mprinteventregisterif.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mprintjob.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mprintjobobserver.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mprintjobstatus.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mprintpreviewobserver.h
ImagePrint/ImagePrintUI/imageprinteng/inc/mprintsettings.h
ImagePrint/ImagePrintUI/imageprinteng/inc/settingsconverter.h
ImagePrint/ImagePrintUI/imageprinteng/inc/stringids.h
ImagePrint/ImagePrintUI/imageprinteng/inc/tpreviewimageinfo.h
ImagePrint/ImagePrintUI/imageprinteng/src/cdiscoverymanager.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cfloatcapability.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cidleprinteventcatcher.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/ciffactory.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cimageprint.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cimageprintengine.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/clistcapability.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cpreviewinfo.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cprinteventcatcher.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cprintjobmanager.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/cprintsettings.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/crealfactory.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/csettingsmanager.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/ctemplatedata.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/ctemplatesettings.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/ctintcapability.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/settingsconverter.cpp
ImagePrint/ImagePrintUI/imageprinteng/src/tpreviewimageinfo.cpp
ImagePrint/ImagePrintUI/imageprintprovider/group/aiwprintingprovider.mmp
ImagePrint/ImagePrintUI/imageprintprovider/group/aiwprintingprovideruid.h
ImagePrint/ImagePrintUI/imageprintprovider/group/bld.inf
ImagePrint/ImagePrintUI/imageprintprovider/inc/caiwimageprintif.h
ImagePrint/ImagePrintUI/imageprintprovider/inc/caiwprintpreviewprovider.h
ImagePrint/ImagePrintUI/imageprintprovider/rss/101ffaa2.rss
ImagePrint/ImagePrintUI/imageprintprovider/rss/aiwprintingprovider.hrh
ImagePrint/ImagePrintUI/imageprintprovider/rss/aiwprintingprovider.rss
ImagePrint/ImagePrintUI/imageprintprovider/src/caiwimageprintif.cpp
ImagePrint/ImagePrintUI/imageprintprovider/src/caiwprintpreviewprovider.cpp
ImagePrint/ImagePrintUI/imageprintprovider/src/dllmain.cpp
ImagePrint/ImagePrintUI/imgpprintdll/bwins/imgpprintdllu.def
ImagePrint/ImagePrintUI/imgpprintdll/eabi/imgpprintdllu.def
ImagePrint/ImagePrintUI/imgpprintdll/group/bld.inf
ImagePrint/ImagePrintUI/imgpprintdll/group/imgpprintdll.mmp
ImagePrint/ImagePrintUI/imgpprintdll/inc/ccustomnotedialog.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/cdiscoverydlgmanager.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/cimgpprintdlgmanager.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/cimgpprintprogressdlg.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/cimgpprintutils.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/cuiprotocolcontroller.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/imgpprintapputil.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/maiwobserver.h
ImagePrint/ImagePrintUI/imgpprintdll/inc/mprotocolobserver.h
ImagePrint/ImagePrintUI/imgpprintdll/src/ccustomnotedialog.cpp
ImagePrint/ImagePrintUI/imgpprintdll/src/cdiscoverydlgmanager.cpp
ImagePrint/ImagePrintUI/imgpprintdll/src/cimgpprintdlgmanager.cpp
ImagePrint/ImagePrintUI/imgpprintdll/src/cimgpprintprogressdlg.cpp
ImagePrint/ImagePrintUI/imgpprintdll/src/cimgpprintutils.cpp
ImagePrint/ImagePrintUI/imgpprintdll/src/cuiprotocolcontroller.cpp
ImagePrint/ImagePrintUI/imgpprintdll/src/imgpprintapputil.cpp
ImagePrint/ImagePrintUI/inc/logdef.h
ImagePrint/ImagePrintUI/rom/desw_imageprintui.iby
ImagePrint/ImagePrintUI/rom/imageprintresources.iby
ImagePrint/clog/group/bld.inf
ImagePrint/clog/group/clog.mmp
ImagePrint/clog/inc/clog.h
ImagePrint/clog/src/clog.cpp
ImagePrint/group/bld.inf
ImagePrint/inc/imageprintvariant.h
ImagePrint/rom/imageprint.iby
ImagePrint/rom/imageprintdef.iby
group/bld.inf
layers.sysdef.xml
package_definition.xml
sysdef_1_4_0.dtd
--- /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, "&amp;");
+	ConvertFrom8To16Bit(KAmpersand, rep);
+	ConvertFrom8To16Bit(_L8("&"), src);
+	SearchAndReplaceL(*seg, src, rep);
+
+	_LIT8(KLessthan, "&lt;");
+	ConvertFrom8To16Bit(KLessthan, rep);
+	ConvertFrom8To16Bit(_L8("<"), src);
+	SearchAndReplaceL(*seg, src, rep);
+
+	_LIT8(KGreaterthan, "&gt;");	
+	ConvertFrom8To16Bit(KGreaterthan, rep);
+	ConvertFrom8To16Bit(_L8(">"), src);
+	SearchAndReplaceL(*seg, src, rep);
+
+	_LIT8(KApostrophe, "&apos;");
+	ConvertFrom8To16Bit(KApostrophe, rep);
+	ConvertFrom8To16Bit(_L8("\'"), src);
+	SearchAndReplaceL(*seg, src, rep);
+
+	_LIT8(KDoubleQuote, "&quot;");
+	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 &lt;printInfo&gt; 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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYqlWoeadCsarLdK8g/3VF+8avgeOw+nNVq+29Lg+qYJ7hufs/S5O&#xA;PR5J8gxy+/MWRqrYWwQdpJjU/wDArt+Oczq/bCR2wwrzl+ofrc/H2WP4j8khvNd1W+r9ZuXZD/us&#xA;Hin/AAK0Gcvq+1dTqP7yZI7uQ+Qc7Hp4Q5BUsNb1SyoLe4dUH+6yeSf8C1RkdJ2rqdP/AHcyB3cx&#xA;8jsjJp4T5hkVj57k2W9tww7yRGh/4Fv6502k9s5DbNC/OP6j+sOBk7NH8J+bILLzBpN5QRXCq5/3&#xA;XJ8Dfj1+jOn0nb2k1G0ZgS7pbH7efwcHJpckOYTDNw47sVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdiqTal5v8vafVZrxHlH+6ov3jV8Dx2H0nNXqu2dNh+qYJ7hufs/S5WLR&#xA;ZZ8h82L6j+aErVXTrQIO0s5qf+AXb/hjnOar2skdsUK85fqH63Y4uyR/Gfkxq/8AMWs6jUXd27of&#xA;91A8U/4FaDOa1faeoz/XMkd3IfIOwx6bHD6Qg1Oa4tqqpyBQqqciWKspyBQqqciWKqpyBYpjZaxq&#xA;NpQQTsqj9gnkv/AmozP0na+q0393Mgd3MfI7NGTBCfMJ9Z+cn2W7gDeLxmh/4E/1zqdH7bSG2aF+&#xA;cf1H9YcLJ2eP4SndpremXVBHMFc/sP8ACfx6/RnU6Pt/R6jaMwJd0vSft5/Bwp6aceYR2blodirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVSPVfO3lnTKrPepJKP90w/vXr4HjUD6SM1up7W0+H&#xA;6pAnuG7l4dDlyco7eezENT/NyZ6ppdkIx2muDyP/AACmg/4I5z+p9qJcsUa85fqH63Z4uxh/Gfkx&#xA;TUfM+u6nUXl5I8Z6xKeEf/ALRc53VdpZ8/1zJHdyHyDssWlx4/pCBU5ry3KqnIFCqpyJYoy1s7u5&#xA;P7iJnHiBt952ymeSMeZa5TA5pza+WbhqG4lWMfyr8R/gMw56wdA48tQOicWui6dBQ+n6jD9qT4vw&#xA;6fhmHPUTl1pollkVSfSLCbcxhG/mT4fw6ZGOeY6oGWQS+by/Ku8MgYfytsfvGZEdUOobRnHVByWt&#xA;zB/exlR49R942y4TjLkWYkDyaU4lKspyJYqqnIFij7PVL+2oIZmVR+wd1+47ZsNH2xqtN/dzIHdz&#xA;HyOzTkwQlzCc2vmp9hcwg/5cex+4/wBc6rR+3EhtnhfnH9R/WHDnoR/CU3ttX0+4oElAY/sP8J/H&#xA;Os0XtDo9RtGYEu6XpP28/hbhz0848wjM3TS7FXYq7FXYq7FXYq7FXYq7FXYqkGr+e/K2lcluL5JJ&#xA;l/3RB+9evgeNQv8AsiM12o7V0+L6pWe4buZh0GbJyjt57MJ1b85535JpNiIx2muTyb/kWhAH/BHN&#xA;HqPaU8sca8z+ofrdrh7EH8cvkw7VPNnmHViRfX0kkbdYVPCP/gEop+nNBqe0M+b65Eju5D5O0xaP&#xA;Fj+mIS5TmAW9WU5AsVVTkShHWmn31zT0YWZT+1Si/wDBHbKMmWMeZapTiOZTu08qzGhuZgg/kT4j&#xA;95pmFk1w/hDjy1I6BOrTRdNt6FYhIw/ak+I/d0/DMLJqZy6uPLLIpkpAFB0HTMYtK8NgpC8NkaQv&#xA;BwIbxV2KoaXT7SXcxhT/ADLsfwyyOWQ6sxMhCSaOw3ieo8G2P3jLRqO9mMveh3t54vtoQPHqPvGW&#xA;CYPJmJAuU4lVVTkCxVVORLFHWuo3lvQRSsFH7J3X7jmx0fbOq0393kkB3cx8js1TwxlzCa23mJth&#xA;PED/AJSbfgf651mi9u5DbPjvzj+o/rDiT0XcUzg1KznpwkAY/stsfxzrtF7RaLU7QyAS7pek/bz+&#xA;FuJPBOPMInN21OxV2KuxV2KuxVj/AJ61+90Ly/Jf2ao04kSNfUBZRzNCaAjNd2pq5YMJnGrvq5ug&#xA;08cuXhlyeKav5t8x6vUX19LJG3WFTwj/AOATip+nOG1HaGfN9ciR3dPk9Vh0eLH9MQlGYbkuxVep&#xA;yJYpjZaVqN1QwwMVP7Z+FfvNBmPkzwjzLVPJGPMp7Z+UHNDdzhfFI9z/AMEf6Zg5NeP4Q409V3BP&#xA;LPRdMtqFIQzj9t/iP47ZhZNROXMuNLLI9UyBzGal4bAhcGyNIXhsFIXhsFIXhsjSF4bBSF4ORVdi&#xA;h2KuxV2KqUlrA/VAD4jY5ITIZCRCHbTyP7tvob+uWDL3suNTMMqfaU08eoyXECmwuU4CqqpyBYqq&#xA;nIlii4L26h/u5CAP2TuPuObLRdtavS/3WSQHdzHyOzVPFGXMJ9p9zJcWwkcDlUg09s9d9ne0sms0&#xA;oy5K4rI28nW5oCMqCJzetTsVdirsVYj+aoB8l3dR0khI/wCRgzT9vf4rL3j73Zdk/wB+Pj9zwvOB&#xA;euTzSPJXmfVuLWlhIIW6Tyj0o6HuGenL/Y1zP0/ZmfN9MTXedg4mbXYsf1S3+aJtPJ1aG7n+aRD/&#xA;AI2b+mc9k7Q/mj5olqu4J5Z6NpdrQxQKWH7b/E34/wAMwsmonLmXGnllLmUxDZjU1Lw2BC8NkaQv&#xA;DYKQvDYELw2RQvDYKQvDZGkLw2BC8NgpVwbI0heGwIX1wIdirsVdirsVdiqxoo26rv44RIptYben&#xA;2T9Bw8SeJES6dfQfbiPEftL8Q/DN1rfZ/WafeeM8PePUPs5fFqjnhLkVNTmkLYyHRv8AeIf6xz2D&#xA;2K/xAf1pOr1X1o7Otcd2KuxV2Kpfr2h2mt6a+nXbOsEjIzmMgN8DBgKkHwzG1eljnhwS5Hub9Pnl&#xA;inxR5obSPJ/lrSQDZWESyL/u5x6kn/BvyI+jK9P2dgw/TEX38z9rPNrcuT6pFOczXFeTBs8Gp6le&#xA;GyNIXhsCFwbBSF4bI0heGwIXhsiheGwUheGwUheGyNKvDYKQvDZFC8NgpC8NkaQvDYKQuBwIbxV2&#xA;KuxV2KuxV2Kstz6OdIoT2NpPvJGCx/aGx+8Zqtb2HpNV/eY4k942PzDZDLKPIrra2jt4/TQkrUkV&#xA;98t7M7Nx6PF4WO+Gyd/NGSZkbKrmwYOxV2KuxV2KuxV2KvIg2eEPVLw2RpC8NgpC8NkULw2CkLw2&#xA;CkLw2RpC4NgpV4bI0heGwUheGwIXhsjSF4bAheGyKF4bBSF4bIoXg4EN4q7FXYq7FXYqy3Po50js&#xA;VdirsVdirsVdirsVdirsVePBs8Jp6teGwUheGwIfA2e8PLPUPqntiqWejnUcDzXG70ceBeN3o48C&#xA;8bvRx4F43ejjwLxu9HHgXjd6OPAvG70ceBeN3o48C8bvRx4F43ejjwLxu9HHgXjTP6p7Zy70ry/F&#xA;X6T584u7dirsVZbn0c6R2KuxV2KuxV2KuxV2KuxV2KvGw2eFvWLw2BC8NkaQ+Cc93eVe0/VfbFUh&#xA;9HOx4HkeN3o48C8bvRx4F43ejjwLxu9HHgXjd6OPAvG70ceBeN3o48C8bvRx4F43ejjwLxu9HHgX&#xA;jd6OPAvGn31X2zjnrni2Kv0nrnzi7t2KuxVlufRzpHYq7FXYq7FXYq7FXYq7FXYq8XDZ4bT1q8Ng&#xA;QvDZFXwbnuryb6C+qe2KsX9HO64HiON3o48C8bvRx4F43ejjwLxu9HHgXjd6OPAvG70ceBeN3o48&#xA;C8bvRx4F43ejjwLxu9HHgXjd6OPAvGyj6p7Zwr2759xV+kgbPnJ3i4HAhvFWW59HOkdirsVdirsV&#xA;dirsVdirsVdirxMNnh7168NkaQvDYKQvDYKQ8p+qe2e6PJsM9IZ6HwvAcTvSGPCvE70hjwrxO9IY&#xA;8K8TvSGPCvE70hjwrxO9IY8K8TvSGPCvE70hjwrxO9IY8K8TvSGPCvE70hjwrxMz+qe2eePfvoIN&#xA;nzrTvl4bBSF4bIoXg4EMuz6OdI7FXYq7FXYq7FXYq7FXYq7FXiAbPEaewXhsihcGwUhUDZGkMD+q&#xA;+2e5vJPPeGej0+d27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS29C+q+&#xA;2ecPoj2cNnzu79eGwUheGyNIXhsFIZln0Y6N2KuxV2KuxV2KuxV2KuxV2KvDA2eJPYrw2CkLw2RQ&#xA;vDYKQkH1T2z3F5F5Zwz0qnza3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3c&#xA;MaW3qf1T2zzV9Jelhs+eaegXhsjSF4bAq8NgpDNc+inQuxV2KuxV2KuxV2KuxV2KuxV4QGzxSnsl&#xA;4bAheGyNIXhsCFv1X2z295B43wz06nzG3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMaW3cMa&#xA;W3cMaW3cMaW3sn1X2zzF9OZcGz57ehXhsjSrw2CkLw2RQznPol0DsVdirsVdirsVdirsVdirsVeC&#xA;hs8Wp7NeGyNIXhsCFwbBSE6+qe2e2vHvCuGeo0+WW7hjS27hjS27hjS27hjS27hjS27hjS27hjS2&#xA;7hjS27hjS27hjS27hjS291+qe2eXPqaZBs+fKejXhsFIXhsCF4bI0hnufQ7z7sVdirsVdirsVdir&#xA;sVdirsVeAhs8Ye0XhsjSF4bBSF4bIoZt9U9s9seOfPPDPVafKLdwxpbdwxpbdwxpbdwxpbdwxpbd&#xA;wxpbdwxpbdwxpbdwxpbdwxpbdwxpbfQ31T2zyp9XQobPn56ReGwUheGyNIXhsFIegZ9CvPOxV2Ku&#xA;xV2KuxV2KuxV2KuxV8+hs8Zp7VeGwIXhsCrw2RpD1P6r7Z7U8Y+aOGesU+R27hjS27hjS27hjS27&#xA;hjS27hjS27hjS27hjS27hjS27hjS27hjS27hjS2+l/qvtnk764xgNngFPSrw2RQvDYKQvDYEPRM+&#xA;g3nXYq7FXYq7FXYq7FXYq7FXYq+eg2eNvbrw2CkLw2RpC4NgQ9v+qe2e0PFu+qe2Ku+qe2Ku+qe2&#xA;Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2Ku+qe2KvPA2eBPTLw2RpC8&#xA;NgQvDZGkPSM+gnnHYq7FXYq7FXYq7FXYq7FXYq+dg2eO09wvDYELw2RpC8NgpC8NkaQvDYKQvDZG&#xA;kLg2BC8NgpC8NkaQvDYKVeGyNIXhsCF4bAheGyNIXhsFIXhsiheGwUheGyNIXhsCF4bBSF4bIoel&#xA;59APNuxV2KuxV2KuxV2KuxV2KuxV85Bs8fe5XhsjSF4bBSF4bI0heGwUheGwIXhsjSF4bBSF4bI0&#xA;heGwUq8NgpC8NkaQuDYELw2RpC8NgpC8NkULw2CkLw2BC8NkaQvDYKQvDZFV4bBSHp+e/PMuxV2K&#xA;uxV2KuxV2KuxV2KuJoK4q+bw2eQU90vDYELw2CkLw2RpC4NgpC8NkaQvDYELw2ClXhsjSF4bBSF4&#xA;bIoXhsFIXhsFIXhsiheGwUheGyNIXhsFIXBsjSF4bAheGwUq8NkaQvDYEPU898eYdirsVdirsVdi&#xA;rsVdirsVdir571/S5dJ1m7sJAR6MhEZPeM7o30rTPLNbpjhyygeh+zo9rp8oyYxIdUEGzEptXhsi&#xA;heGwUheGwUheGyKrw2CkLw2RpC4NgpC8NgpC8NkaQvDYELw2RpC8NgpC8NkaQvDYKQvDYELw2RVe&#xA;GwUheGyNIXhsFIRml2j3l9DbKK82HL2UbsfuzM7O0Z1OeGMfxHf3dfsac0+CJL03PbXnHYq7FXYq&#xA;7FXYq7FXYq7FXYqxvzj5LtPMMCuGEGoQqRDcUqCK14P3K+Hhmp7U7Khqo3ymOR/Qfxs52i10sJ74&#xA;no8tv/I3mqxlKPp8s6jpJbqZlPv8FT94zi8/Y+pxmjAn+rv9z0OPX4Zj6gPfsxjVtY0rRbw2Os3s&#xA;GmXoUObW8lSCUK32W4SFWoe22Y/8naj/AFOf+lP6mz81i/nx+YQo86eT/wDq+6f/ANJUH/NeD+Tt&#xA;R/qc/wDSn9SPzWL+dH5hcPOvk7/q+6d/0lwf815H+TtR/qc/9Kf1I/NYv50fmF487eTv+r9p3/SX&#xA;B/zXg/k7U/6nP/Sn9S/mcX86PzC4ed/Jv/V+07/pLg/5rwfybqf9Tn/pZfqR+Zxfzo/MLx538mf9&#xA;X/Tv+kuD/mvB/Jup/wBTn/pZfqR+Zxfzo/MLx548mf8AV/07/pLg/wCa8j/Jup/1Of8ApZfqR+Zx&#xA;fzo/MLh558l/9X/Tf+kuD/mvB/Jup/1Of+ll+pH5nF/Oj8wvHnryV/1MGm/9JkH/ADXg/kzU/wCp&#xA;5P8ASy/Uv5nF/Oj8wuHnryT/ANTBpv8A0mQf814P5M1P+pZP9LL9SPzGP+dH5hePPfkn/qYdN/6T&#xA;IP8AmvI/yZqf9Syf6WX6kfmMf86PzC4efPJH/Uw6Z/0mW/8AzXg/kzVf6lk/0sv1I/MY/wCdH5he&#xA;PPvkf/qYtM/6TLf/AJrwfyXqv9Syf6WX6kfmMf8AOj8wuHn3yP8A9TFpn/SZb/8ANeD+S9V/qWT/&#xA;AEsv1L+Yx/zo/MLx5+8jf9TFpn/Sbb/815H+S9V/qWT/AEkv1I/MY/50fmF48/8AkX/qY9L/AOk2&#xA;3/5rwfyXqv8AUsn+kl+pH5jH/Oj8wuH5geRP+pj0v/pNt/8AmvB/JWq/1LJ/pJfqR4+P+cPmEw0b&#xA;zL5e1q9Fjo+qWmpXrKXFrZzxTylV+03CNmag77YP5K1X+pZP9JL9SPHx/wA4fNk9p5c1u4cKtq8Y&#xA;7tKDGB/wVD92ZGn7A1mU0Mco+cvT97XPV449fkzXQdAg0uIsT6l04pJLTYD+VfbPQuxew4aKN/Vk&#xA;lzP6B5fe6jU6k5D5Jrm9cV2KuxV2KuxV2KuxV2KuxV2KuxV2KvhX/nLz/wAnLc/8wNp/xE4q8VxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvav+cQ//Jy23/MDd/8AERir7qxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2Kvlf/AJyH/Ib8y/On5kTa55f0+K5057W3iWV7iGI841IYcXZWxV5n/wBC&#xA;n/nb/wBWeD/pMtv+qmKu/wChT/zt/wCrPB/0mW3/AFUxV3/Qp/52/wDVng/6TLb/AKqYq7/oU/8A&#xA;O3/qzwf9Jlt/1UxV3/Qp/wCdv/Vng/6TLb/qpirv+hT/AM7f+rPB/wBJlt/1UxV3/Qp/52/9WeD/&#xA;AKTLb/qpirv+hT/zt/6s8H/SZbf9VMVd/wBCn/nb/wBWeD/pMtv+qmKu/wChT/zt/wCrPB/0mW3/&#xA;AFUxV3/Qp/52/wDVng/6TLb/AKqYq7/oU/8AO3/qzwf9Jlt/1UxV3/Qp/wCdv/Vng/6TLb/qpirv&#xA;+hT/AM7f+rPB/wBJlt/1UxV3/Qp/52/9WeD/AKTLb/qpirv+hT/zt/6s8H/SZbf9VMVemf8AOPH5&#xA;DfmX5L/MiHXPMGnxW2nJa3ETSpcQynnIoCjijM2KvqjFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgABAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AgF9/yrr69cc/8Zc/Vfl6&#xA;XD068jXh/k+GdLl4+M34vM8uKvh5PL4eDgjXhchz4b+PmpD/AJVx/wB/p/wmQ9X+2/7Jn6P9p/2K&#xA;4f8AKuf+/wA/+EyQ4/8Abf8AZI9H+0/7FcP+Vdf9/l/wmS9f+2/7Jj6P9q/2K8f8q7/7/H/hMI4/&#xA;9s/2SPR/tX+xXD/lXf8A3+H/AAmS9f8Atn+yR6P9q/2K4f8AKvP+/v8A+EyX7z/bP9kx9H+1f7Fs&#xA;f8q8/wC/t/5J4f3n9P8A2S/u/wDa/wDYtj/lXv8A39n/ACTwjxP6f+yR+7/2v/Yrh/yr3/v6v+Se&#xA;S/ef0v8AZI/d/wBD/Yt/8g+/7+n/AJJ4f3n9L/ZI/d/0P9i3/wAg+/7+f6fSw/vP6X+yX93/AEP9&#xA;i2P+Vf8A/fy/T6WH975/7JH7v+j/ALFv/kH/AP38n/JLJfvfP/ZI/d/0f9i3/wA6B/38X0+jh/e/&#xA;i1/d+X+xb/50D/v4f+SOH97+LR+78v8AYt/86D/2v/p9HH97+LX915fY7/nQf+19/wAkcf3v4tH7&#xA;r8U3/wA6F/2vP+SGP73y+1f3X4pv/nQv+13/AMkMP73y+1H7r8U7/nQv+1z/AMkMf3vl9q/uvP7H&#xA;f86H/wBrj/khj+98vtX915/Y7/nQ/wDtbf8ATvj+9/o/av7rz+x3/Oh/9rX/AKd8f3v9H7V/df0v&#xA;sb/50P8A7Wf/AE74/vf6P2r+6/pfY7/nRP8AtZf9O2P73+j9q/uv6f2O/wCdE/7WP/Ttj++/ofav&#xA;7r+n9jX/ADon/L//ANO2P77+h9q/uv6bv+dE/wCX7/p2x/ff0PtX91/Td/zon/L7/wBOuP77+h9q&#xA;/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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgACAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5p5pm/MldamGhhv0bxT0&#xA;qJbkV4jlvIOX2s7XXy14ynwfo2/m/peF7Oj2ecI8b+83/nfo2SoXH5x9w/8AyLtP6ZiCfann8oOZ&#xA;wdk+XzmuFx+cHcP/AMBaf0yQn2n+BBHB2V5fOa8XH5u9w/8AwFr/AEyXH2l+BBjwdl+XzmuE/wCb&#xA;XcP/AMBa/wBMkJ9o/gRRwdl+XzmuE/5r9w//AAFr/TDx9ofgRY8HZn4M1wm/NPuH/wCAtv6ZLi1/&#xA;44UcHZv4M1wm/M/uG/4C2/pkuLXfjhXh7O/Bk2JfzK7hv+At/wCmHi1v44UcPZ/4MmxL+Y3cN/wN&#xA;v/TDxaz8cKOHQfjib9T8we4b/gYP6ZLi1f44UcOh/HE36nnzuG/4GD+mG9V+KXh0X44m+fnfuG/4&#xA;GH+mG9T+KRWj/HE3z85dw3/Aw/0w3qPxS1pPxxN8/NvcH/gYv6ZK8/4pFaX8W3y80dwfuj/pjeb8&#xA;Utab8W7l5j7g/dHjeX8UitP+Lb5a/wBwfuTD+9WsH4t1da7g/cmP7xf3P4tuurdwfuXH1o/dfi3f&#xA;7ke4P3Lj6l/du/0zuP1Y+pfQ6k/f+GO6+l1H74rs7ivfFba4wd/440Fsu42nf+ONRTcncLDv+tsa&#xA;itza4aZ3p97YKgt5HcNH70+98agt5fxTXp6J3p9741jTeb8Uh75NJFu31enrVFN28d+uQyCFbc23&#xA;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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUNqOp6dplnJe6jcxWlpEKyTzu&#xA;saD5sxAyUYGRoCyxlIRFnYPEfPf/ADk5p9oZLLyhbC+mFVOp3IZYAfGOL4Xf5txHsRm20/ZRO+Q1&#xA;5Osz9pAbQ383gXmXzf5l8y3313W9QmvZwax8zRI69o41oiD/AFQM3GPDDGKiKdZPLKZuRt6x/wA4&#xA;/wD5va1D5gtfKmt3T3mm3/7qwlnYvJBMBVEDn4ij048expSgrms7Q0cTEziKIdhotUeLhlyL6czR&#xA;O4dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqG1HUtP020kv&#xA;NQuYrS0iFZJ5nVEHzZiBkoQMjQFljKYiLJoPF/O//OTGl2fqWnlO2+v3AqP0hcBktwfFI/hkf6eP&#xA;05t9P2RI75DXk6vP2pEbQF+bwXzR5x8y+Z7v61rl/LeOCTHGxpFHXtHGtEX6Bm5xYIYxURTqcmae&#xA;Q3I2kLZYxCw4CyCfflyf+Qh+V/8Atr2P/UTHmNqf7uX9U/c5Gn/vI+8Pu7OTekdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqG1DUtP020kvNQuY7S1iFZJ5nCIPmzEDJ&#xA;QgZGgLLGcxEWTQeN+dv+ck9LtPUtPKtt9fnFR9fuAyQA+KR/C7/Tx+nNxp+x5HfIa8urqdR2tEbQ&#xA;F+bwjzP5w8yeZrv61rd/LeOCTGjGkaV7RxrRF+gZu8WnhjFRFOny555DcjaRNljAKbYGYU2yLILD&#xA;gLIJ9+XX/kw/K/8A217D/qJjzG1P93L+qfucjT/3kfeH3dnJvSOxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxVDahqNhp1o95f3MdraxCsk8zBEHzLUGShAyNRFljOYiLJoPHvO&#xA;n/OR+mWnqWvla2+vTio+v3AZIAfFI/hd/p4/Tm603Y0jvkNeXV0+o7YiNsYvz6PDPM3m7zH5ku/r&#xA;WtX0l24JMaMaRpXska0RfoGbzDp4YhURTpcueeQ3I2kbZa1hTbIswptkWQU2wMwptkWQWHAWQT78&#xA;uv8AyYflf/tr2H/UTHmNqf7uX9U/c5Gn/vI+8Pu7OTekdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdiqHv8AULHT7WS7vriO1tYhWSeZgiD5lqDJQhKRqIssZzjEXI0HkPnL/nIrTbT1&#xA;LXyvb/XpxUfXrgMkAPikezv9PH6c3em7Fkd8hry6uk1PbURtjF+fR4f5k82+YvMd19Z1m+ku3BJj&#xA;RjSNK9kjWiL9AzfYdPDEKgKdHm1E8puRtJGy1rCm2RZhTbAyCm2RZhDS3Ea7A8j4DNdqO0cePb6j&#xA;5Ow0+gyZN/pHmoxzO8m+wp0zE0eunmy0do1ycrV6OGLHY52vbNu6wLDgLIJ9+XX/AJMPyv8A9tew&#xA;/wComPMbU/3cv6p+5yNP/eR94fd2cm9I7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVC&#xA;9vbOxtnur2eO2tohWSaVgiKPdmIGShAyNAWWM5iIsmg8n84/85CaTZc7Xy1B+kLkVH1yYMlup/yV&#xA;2eT/AIUe5zd6XsSct8h4R3dXR6rtuEdsY4j39HiPmbzf5j8yXP1jWL6S5INY4ieMSf6ka0VfnSud&#xA;Bg02PEKgKdDm1OTKbmbSNsuagptkWQU2wMgptkSzCDnvYU2Hxt4Dp9+azU9qYsew9R8v1uz0/ZuT&#xA;JufSPP8AUgZbmWTqaL/KM0Oo1+TLsTQ7g7vT6HHi5Cz3lSzCcxVt/wC8+jNn2T/e/B1/af8AdfFW&#xA;bOjdCFhwFkE48jSPF538vSoaOmp2bKfcXCEZRqB+7l7i34frHvD70zkXpXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYqoXl7Z2Vs91eTx21tGKyTSsERR7s1BkoQMjURZYzmIi5Gg8p83/wDOQGlW&#xA;fO28twfpC4FR9cmDJbqf8ldnf/hR7nN7pew5y3yHhHd1dFqu3YR2xjiPf0/a8W8yebvMXmO59fWL&#xA;2S5INY4ieMSf6ka0VfurnQ4NLjwioCnns+qyZjczaSNlzSFNsiWQU2wMwpttkSWQCAuNSgjqE/eN&#xA;7dPvzVantbFj2j6j9nzdrpuysk95ekfb8ktmu55q8mov8o2Gc/qNfly8zt3B32n0OPFyG/eVHMNz&#xA;HYq7FVW3/vPozZ9k/wB78HX9p/3XxVmzo3QhYcBZBNvJf/KZaD/20bT/AJPplGf6Je4t2H6x7w+9&#xA;s5F6Z2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqN5e2dlbPc3k8dvbxisk0rBEUe7NQZKEJSNRFlj&#xA;OcYi5Gg8r83fn5pVnztvLkH1+4FR9cmDJbqf8ldnf/hR7nN9pOwZy3ynhHd1/Y6DV9vwjtiHEe/p&#xA;+14z5j82eYfMVz6+r3slyQaxxE8Yk/1I1oq/dXOiwaXHhFQFPOajV5MxuZtJDl7SFhyLILGwMgpu&#xA;QASdgOpyJNM4i0sutXt46rF+9f2+z9+afVdsY4bQ9R+x3Gl7IyT3l6R9qVXF7cTn42ov8g2Gc/qd&#xA;dlzfUdu7o9BptDjw/SN+/qoZhuW7FXYq7FXYqq2/959GbPsn+9+Dr+0/7r4qzZ0boQsOAsgm3kv/&#xA;AJTLQf8Ato2n/J9Moz/RL3Fuw/WPeH3tnIvTOxV2KuxV2KuxV2KuxV2KuxV2KuxVRu7y0srd7m7m&#xA;S3t4xWSaVgiKPdmoMlCEpGoiyxnOMRcjQeXebPz50uz523l2D6/cCo+tzApAp/yV2d/+FHuc3+k7&#xA;AnLfKeEd3X9jz2r9oIR2xDiPeeX7fseN+YvNfmDzDcevq17JckGscRPGJP8AUjWij7q50mn0mPCK&#xA;gKea1GryZjczf3JMcuaQsOBkFM4GQU3ZVBZiAB1J2GQlIAWWcYkmglV3rlvHVYR6r+PRfv75pdV2&#xA;1jhtD1H7HdaXsXJPefpH2pPc31zcn94/w9kGy/dnPanW5cx9R27uj0em0WLCPSN+/qh8xHKdirsV&#xA;dirsVdirsVVbf+8+jNn2T/e/B1/af918VZs6N0IWHAWQTbyX/wAploP/AG0bT/k+mUZ/ol7i3Yfr&#xA;HvD72zkXpnYq7FXYq7FXYq7FXYq7FXYqpXN1bWsD3F1KkEEYrJLIwRFHiWNAMlCBkaAssZzERcjQ&#xA;eZ+a/wA89IsudvoEP6QuRt9Zkqlup9hs7/gPfN/pOwJy3ynhHd1/Y89rPaHHDbEOI9/T9rxzzF5q&#xA;1/zBcmfVbx7ihJjirxiSv8kY+EfrzptPpMeEVAV97y+p1mXObmb+75JKcvaAsOBkFhyLIKUjoiln&#xA;YKo6sTQZCchEWTQbIRMjQFlJ73zDbx1W3Hqv/MdlH8Tmj1fbkIbY/Ufs/a73Sdh5J75PSPt/Ykl1&#xA;fXVyazOSOyjZR9Gc7qNZlzH1n4dHo9NosWEegfHqh8xXKdirsVdirsVdirsVdirsVVbf+8+jNn2T&#xA;/e/B1/af918VZs6N0IWHAWQTbyX/AMploP8A20bT/k+mUZ/ol7i3YfrHvD72zkXpnYq7FXYq7FXY&#xA;q7FXYqpXN1bWsD3FzKkEEYrJLIwRVHiWNAMlCBkaAssZzjEXI0Hmvmr88NJsudvoMX6QuRUfWZKp&#xA;bqfYbO/4D3zoNH7PznvlPCO7r+x53W+0WOG2IcR7+n7XkPmHzZ5g8wT+rqt484BrHCPhiT/VjFFH&#xA;z6502m0eLAKgK+/5vLanW5c5ucr+75JKcyXGCw4GQUzkWQUpZI40LyMEQdWY0AyE5xiLkaDZjhKR&#xA;qIspHfeZYEJS1X1W/nbZf6nNBqu3oR2xjiPf0/b9j0Gk7AnLfIeEd3X9n2pDdX11dNymkLeC9FHy&#xA;Gc5qNXkzG5m/uel0+jx4RUBX3qGYzkuxV2KuxV2KuxV2KuxV2KuxV2Kqtv8A3n0Zs+yf734Ov7T/&#xA;ALr4qzZ0boQsOAsgm3kv/lMtB/7aNp/yfTKM/wBEvcW7D9Y94fe2ci9M7FXYq7FXYq7FVK5ura1g&#xA;ee5lSCCMVeWRgqqPEsaAZKEDI1EWWM5xiLkaDzfzT+duk2XO30KL9IXAqPrMlUgU+w2d/wAB750G&#xA;j9nsk98p4R3df2POa32kxw2xDjPf0/WXkfmHzXr+vz+rql28wBrHCPhiT/VQfCPn1zqNNosWAVAV&#xA;9/zeU1Wuy5zeSV/d8kmOZLjLTgSsOBkFGeaKGMySuEQdWY0GVZMkYC5Gg24sUpnhiLKQX/mqFapZ&#xA;r6jf78aoX6B1Oc/q+34jbEOI955PR6P2ekd8p4R3Dn+r72PXV7dXT8p5C/gD0HyHTOb1GqyZjczb&#xA;02n0mPCKhED8d6hmO5DsVdirsVdirsVdirsVdirsVdirsVdiqrb/AN59GbPsn+9+Dr+0/wC6+Ks2&#xA;dG6ELDgLIJj5VmMPmnR5gKmO+tnAPfjMpynMLgfcW7EfUPe++85B6Z2KuxV2KqVzc21rA89zKkEE&#xA;Yq8sjBVUeJY0AyUIGRqIssZzjEXI0HnHmj87NKs+dvoUX1+4G31mSqQKfYbO/wCA986HR+z2Se+U&#xA;8I7uv7Hm9b7SY4bYhxnv6frLybX/ADVr2vzerql28wBqkP2Yk/1UHwj59c6nTaLFgFQFff8AN5LV&#xA;a7LnN5JX5dPkk5zJcZacCVhwMlG4uIIIzJNIsaDqzGgyrLlhjHFIgBtxYZ5JcMASfJjmo+bo1qli&#xA;nM/79eoH0L1+/Oc1ftCBtiF+Z/U9No/ZwnfMa8h+tjt1e3V3JzuJDI3avQfIdBnN59TkzG5m3p9P&#xA;pceEVAUoZQ3uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kqtv/efRmz7J/vfg6/tP+6+Ks2dG6EL&#xA;DgLII3y7/wApDpf/ADFwf8nVyrL9J9zbj+oe99/5x707sVU57iC3hee4kWGGMcpJZGCqo8Sx2GSj&#xA;EyNAWWMpiIsmg8481fnVpNjyt9CjGoXIqDcPVbdT7dGf6KD3zoNF7P5J75TwDu6/sec13tJjh6cQ&#xA;45d/T9v43eS6/wCate1+f1dUu3mANUh+zEn+qg+EfPrnVabRYsAqAr7/AJvI6rXZc5vJK/Lp8kpz&#xA;KcR2KrTgZIe6u7a2jMlxIsaDuxp93jlObPDFHimQA34NPPLLhgDIsa1HzkN0sI6n/f0n8F/rnNav&#xA;2iHLEPif1fr+T0+j9mzzzH4D9J/V82N3N3c3UnqXEjSP4senyHQZzebUTyy4pkkvUYNPjxR4YARC&#xA;jlLc7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqq2/959GbPsn+9+Dr+0/7r4qzZ0boQsOA&#xA;sgjfLv8AykOl/wDMXB/ydXKsv0n3NuP6h7333PcQW8Lz3EiwwxjlJLIwVVHiWOwzkYxMjQFl6WUx&#xA;EWTQedeaPzq0ax52+iR/pG5G3rtVLdT+DP8ARQe+b/R+z2Se+Q8A7uv7Pxs85rfaTHDbEOOXf0/b&#xA;+N3kvmHzb5g8wTepqd20qA1jt1+GJP8AVQbfT1zqtLocWAVAV59fm8lq9fm1BvJK/Lp8knzLcN2K&#xA;uxVRu7y1tIjLcSLFGO7d/kOpynPqIYo8UzQbsGnyZZcMAZFi2p+dGNY9Pj4jp68g3/2K/wBfuzmN&#xA;Z7RE7YR8T+gfr+T1ei9mgN8x/wA0fpP6vmxq5urm5kMlxI0rnuxr93hnN5s88suKZMi9Ph08MUeG&#xA;AEQpZU3OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kqtv/AHn0Zs+yf734Ov7T/uvi&#xA;rNnRuhCw4CyCN8u/8pDpf/MXB/ydXKsv0n3NuP6h73r/AJm82a9r95JJqVw/phyY7OpEUW/QJ0qO&#xA;lTvm50ehxYIgQHx6l5XW6/LqJEzJru6BJMzXCdirsVdiqhfG9Fs/1IIbj9gSV4/h3zH1Pi8B8KuP&#xA;zcjS+F4g8W+Dyec6q2qG6b9I8/XHZ+lP8mm1PlnnutOc5P318Xn+jpXufSdAMAx/uK4PL9PW/eg8&#xA;w3NdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVVbf+8+jNn2T/e/B1/af918V&#xA;Zs6N0IWHAWQRvl3/AJSHS/8AmLg/5OrlWX6T7m3H9Q976386/k9Z6vczajpEy2V9KS8sDj9xI56n&#xA;4d0J77H5Zgdn9vSxAQyDiiOvUfrZ9pez0c0jPGeGR6dD+p5Fr3lbXtBm9PVLN4ATRJftRt/qutVP&#xA;yrXOr02txZxcJX9/yeQ1WhzYDWSNfd80pzKcR2KuxV2KqF5Y2l5EYrmJZE7V6j3B6jKNRpseaPDM&#xA;WHI0+qyYZcWM8JYrqXkqVKyWEnNevoybN9DdD9OcvrPZ2Q3xG/I8/m9ZovaWJ2zCj3jl8v7WNz28&#xA;9vIYp42jkHVWFDnOZcU8cuGQIL02LNDJHigRIeSnlbY7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYqq2/959GbPsn+9+Dr+0/7r4qzZ0boQsOAsgjfLv8AykOl/wDMXB/ydXKsv0n3NuP6&#xA;h733/nHvTqVzbW11A8FzEk8Ego8UihlYeBU1ByUJmJuJosZwjIVIWHnfmf8AJXRr7nPokn6OuTv6&#xA;DVe3Y/iyfRUe2dBo/aHJDbKOMd/X9v43ec1vs3jnviPBLu6fs/GzyjzF5O8w+X5eOpWjJETRLlPj&#xA;hb5ONvoNDnUaXX4s49B37uryer7Pzac+uO3f0+aSZmOE7FXYqtOBkhruytbuP07mJZV7chuPkeoz&#xA;Hz6fHlFTAkHI0+pyYTcJGJYzqXk5hWSweo/3zId/ob+uc1rPZ488J+B/Qf1/N6nRe0gO2Yf5w/SP&#xA;1fJjlxa3FtIY542jcdmFPuznM2CeM8MwQXpsOeGWPFAiQUsqbXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FVW3/vPozZ9k/wB78HX9p/3XxVmzo3QhYcBZBE6LMIda0+YiojuYXIHfjIDlWQXE&#xA;tsDuH6B5x707sVdiqyWKKaNopUWSNxR0cBlI8CDhjIg2OaJRBFHcPP8AzP8AkzoGpFp9Kb9F3R34&#xA;IOUDH/UqOH+xNPbN9o+38uPafrj9vz6/H5vP632dw5N8fol9ny6fD5PJ/MnkXzL5edjf2hNsOl5D&#xA;V4T2+0B8PyYA51Gk7Sw5/pO/cef49zyWs7Mz6c+uPp7xy/HvY/me69acDJacCVhwMlC5tbe5jMc8&#xA;ayIezCv3eGU5sEMseGYBDfgzzxS4oExLG9Q8oLu9jJQ/76k/g39c5zV+zw54j8D+v9fzem0ftGeW&#xA;YfEfpH6vkx25tLm2k9OeNo38COvyPfObzaeeI1MEF6bBqMeWPFAiQUspbnYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FVW3/ALz6M2fZP978HX9p/wB18VZs6N0IWHAWQVNP/wCOja/8Zo/+JDK58i2R&#xA;5v0IzjnqHYq7FXYq7FWmVXUqwDKwoyncEHscQaQRbBPM35P+WtW5z2IOl3jb1hAMJP8AlRbAf7Ej&#xA;N5o+3s2LaXrj58/n+t0Wt9n8GXeHol5cvl+qnkfmf8vPNHl/nJd2pms1/wCPyCskVPFv2k/2QGdR&#xA;pO1MOfaJqXcef7Xk9Z2Tn0+8hce8cv2fFjBzYOuWHAyWnAlYcDIKFxBDPGY5kEiHqrCoyrLijkHD&#xA;IWG7FlnjlxRJBY/f+VYyS9m/A/76fcfQ3X7853V+z4O+I15H9b0mj9oSNsovzH6mP3Nnc2r8J4yj&#xA;dq9D8j0Oc5n02TEamKelwanHmFwNqOUN7sVdirsVdirsVdirsVdirsVdirsVdiqrb/3n0Zs+yf73&#xA;4Ov7T/uvirNnRuhCw4CyCpp//HRtf+M0f/Ehlc+RbI836EZxz1DsVdirsVdirsVdirRAIodweoxV&#xA;hPmf8o/K2tB5reP9GXzVPrW4Hpk/5cWyn/Y0ObjSdt5sWxPHHz/W6XWdhYM24HBLy/V/Y8h80/lj&#xA;5q8vh5pYPrditSbu2q6geLrTkn0invnUaTtbDn2B4ZdxeU1nY+fBuRxR7x+nuYgc2TrFhwMgsOBk&#xA;FM5FkFKaKKVCkqB0PVWFRleTHGYqQsNuPJKBuJopFfeWYmq9o3pt/vtt1+g9RnP6vsGMt8R4T3Hk&#xA;9DpO35R2yjiHeOaRXNnc2rcZ4yngeoPyI2zndRpcmE1MU9Jp9VjzC4G1DMdyHYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FVW3/vPozZ9k/wB78HX9p/3XxVmzo3QhYcBZBU0//jo2v/GaP/iQyufItkeb9CM456h2&#xA;KuxV2KuxV2KuxV2KuxV2KsN80/lV5V18PKIfqF83S6tgFqf8uP7LfgffNrpO2M2Ha+KPcf1up1nY&#xA;2DPvXDLvH6Q8f81/lN5q0HnNHF+krBd/rNsCWA/y4t2X6Kj3zptJ2xhzbE8Mu4/reW1nYufDuBxx&#xA;7x+kMHbNq6pTORZBYcDILDkWQUpY0kQo6hlPVSKjITgJCpCw2QmYm4mik155dgerWzem38h3X+oz&#xA;RarsOEt8Z4T3dHfaXt2cdsg4h39UkubO5tm4zIV8G6g/I5zuo0mTCamK+56PT6vHmFwN/eoZjOS7&#xA;FXYq7FXYq7FXYq7FXYqq2/8AefRmz7J/vfg6/tP+6+Ks2dG6ELDgLIKmn/8AHRtf+M0f/Ehlc+Rb&#xA;I836EZxz1DsVdirsVdirsVdirsVdirsVdirsVYn5q/LHyp5j5S3Fv9Vvm3+u21Ecn/LFCr/SK++b&#xA;HSdqZsGwNx7i63V9lYc+5FS7x+N3jfmv8mvNeil5rNP0tYipEtup9VQP54d2/wCB5Z02l7aw5dpe&#xA;iXny+bzGr7EzYt4+uPlz+Tz91ZWKsCGBoQdiCM2zqFM5FkFhwMgpnAyCm6qylWAZT1B3GQlEEUdw&#xA;zjIg2NilN5oUD1aA+k38vVf7M0mq7EhPfH6T9n7HeaXtucdsnqH2/tSe5sri3NJUoOzDcH6c57Ua&#xA;PJhPqHx6PQ6fWY8w9J+HVQzFcp2KuxV2KuxV2KuxVVt/7z6M2fZP978HX9p/3XxVmzo3QhYcBZBU&#xA;0/8A46Nr/wAZo/8AiQyufItkeb9CM456h2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsY80/lz5U8y&#xA;h3vrQR3jDa+gpHMD4kgUf/Zg5naXtHNh+k+nuPJwNV2bhz/UPV3jn+Pe8Z82fkf5o0n1LjS6avZL&#xA;uBEONwo94t+X+wJ+WdJpe28WTafol9nz/W81quw8uPeHrj9vy/U82ljkjdo5FKSISrIwIII6gg5t&#xA;wb5OnquakcWQWHIsgsbAyCk4DAgioPUHISAIos4kg2EtutIgerRfu28Oq/dmn1PY2Oe8PSfsdzpe&#xA;2MkNp+ofalM9ncQH94vw/wAw3Gc9qNFlw/UNu/o9Bp9Zjy/Sd+7qo5iuU7FXYq7FXYqq2/8AefRm&#xA;z7J/vfg6/tP+6+Ks2dG6ELDgLILrWVYruCV/sRyKzU8AwJyEhszjzfoVnGvUuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxVjvmjyB5W8zRsNTslNwRRb2Kkc69h8YHxU8GqPbMvTa7LhPpO3d0cPU&#xA;6DFmHqG/f1eL+bvyF8x6YHudEkGrWgqfRA4XKj/Urxf/AGJqf5c6PS9t457T9J+x5zVdh5Ibw9Y+&#xA;15fc29xbzPBcRPDNGaPFIpVlPgVNCM3AkCLHJ05iQaPNQbFIU2yJZBTbAzCmwBFDuMiRbMGkvuNN&#xA;hepT923t0+7NRqeyMc94+k/Y7bTdq5IbS9Q+1Lp7WaE/Evw/zDcZoNRosmH6ht39HfafW48v0nfu&#xA;6qOYjlOxV2Kqtv8A3n0Zs+yf734Ov7T/ALr4qzZ0boQsOAsgptkSzD9EM4x6l2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KpF5n8k+WfM0Hp6vZJNIBSO5X4Jk/1ZF+L6Dt7Zk6fWZMJ9B+H&#xA;RxtRo8eYesfHq8W84f8AOPmt2PO58uTfpO2G/wBVl4pcqPY7JJ/wp9s6DS9twltkHCe/o89qexJx&#xA;3xniHd1eT31jeWNzJa3sEltcxGkkMqlHU+6sAc3MZiQsGw6eUDE0RRQjYUhTbIsgptgZBTbIlmEH&#xA;PZRPuvwN7dPuzV6nsvHk3j6T9nydpp+08kNpeofjqgZbaWPqKj+YdM0Oo0OTFuRt3h3eDW48vI79&#xA;ylmG5arb/wB59GbPsn+9+Dr+0/7r4qzZ0boQsOAsgptkSzD9EM4x6l2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KpN5j8oeW/MlsINZsY7oKKRykFZU/wBSRaOv0HL8GpyYjcDTRn02&#xA;PKKmLeLecf8AnHTU7cvc+V7kXsO5+o3BVJh7LJsj/Tx+nN9pu24nbIK8xydFqexZDfGb8jzePanp&#xA;eo6ZdvZ6jbS2l1H9uGZCjD3oex7HN1DJGYuJsOnnjlA1IUUC2FAU2yLMKbYGQU2yJZhDS20bbj4T&#xA;7ZrdR2bjybj0ny/U7HB2hkhsfUFGOJ0k36U65iaLRTw5bPKublavVwy4tud8l7ZuHVhYcBZBTbIl&#xA;mH6IZxj1LsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSvX/LGgeYLQ2us2&#xA;MV7FQhfUX40r1KOKOh91OW4c88ZuJpqy4IZBUhbxXzl/zjbcJ6l15UvPWXqNOuyFf5RzbKfYOB/r&#xA;ZvNP20DtkHxH6nSajsYjfGfgf1vFtZ0TV9GvGstVs5bK6XrFMpUkeK12Ye42zdY8sZi4mw6ieOUD&#xA;UhRS1skgKbZFmFNsiyCm2BmFNsiyCw4CyCm2RLMP0QzjHqXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYql+taBouuWTWWr2UV7at/uuVQ1D4qeqn3U1yzHllA3E0WvJij&#xA;MVIWHivnT/nGiNhJdeUrzi27fo28NV+UcwFR7Bx/ss3Wn7Z6ZB8R+p1GfsjrjPwLw/zB5Z1/y/d/&#xA;VNZsJrGffiJVorAbEo4qrj3UkZuceaGQXE26nJilA1IUlDZJiFNsDMKbZFkFhwFkFNsiWYfohnGP&#xA;UuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVB6to2lavZPY6&#xA;paRXtpJ9qGZA618RXoR2I3ycMkoG4miwnCMhUhYeLed/+cZdPuBJd+Ubr6nLuf0bdMzwn2jl+J1/&#xA;2XL5jNvp+1yNsgvzDq8/ZYO8DXk8J80eTvMvli7+q65YS2bkkRyMKxSU7xyLVG+g5uMWeGQXE26r&#xA;JhnjNSFJC2WMQsOAsgptkSzD9EM4x6l2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KobUNN0/UrR7PULWK8tJP7yCdFkRvmrAjJRmYmwaLGURIURbxnzx/zj&#xA;HomoF7vyrc/ou5NT9Rn5SWzH/JbeSP8A4YeAGbXB2rIbTF/e67N2bE7w2eBebfIXmzypcmDXNPkt&#xA;lJpFcgc4JP8AUlWqn5Vr4jNvi1EMguJdXkwTxn1Bkf5RflLrXm/XbS7ubWSHy3byLLd3kilUlVDX&#xA;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&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AW/M/8ztX8yavc2lpcvBo&#xA;MDtFb28TFRKFNPVlpTnzpUA7AfST2fZ/Z8MUASLmfseM7Q7QnlmQDUB9rHvLPnrzT5ZlDaRfPFFX&#xA;k9q3xwP48o2qu/iN/fMnUaPHmHrHx6uNp9Zkwn0H4dHtPlH/AJyE0G/9O28wwHS7s0BuY6yWzHxP&#xA;V4/pqP8AKzntT2JOO+M8Q+16HTdtQltkHCfseq2l5aXlulzaTJcW8o5RzRMHRh4hlqDmmlExNEUX&#xA;cxkJCwbCtkWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVfDxz0Z85WnAlo4pTfy55x8yeW7n19HvpLaprJCDyif/XjaqN86VzHz6XHlFTFuRg1OTEbgae0&#xA;+UP+citKuzHa+ZrX6hMaA30HKSAnxZN5E+jlnP6nsSUd8Zvy6u/03bUZbZBXn0et6fqWn6japd2F&#xA;zFd20n2JoXDofpUnNJOEompCi7uE4yFxNhE5Fk7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXw8c9GfOVpwJaOKVpwJWnAlM9A80eYPL139b0a+ls5duYQ1RwOzo&#xA;ao4/1hlObTwyipi2/DnnjNxNPZ/J3/OR1rKUtfNVr9Xc7fpC1BaP5yRbsvzUn5ZodT2KRvjN+R/W&#xA;73TdtA7ZBXmHsOka1pOsWa3ul3cV5av0lhYMAfA03U+x3zSZMUoGpCi7vHljMXE2EblbN2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvh456M+crTgS0cUrTgStOBK04E&#xA;tHFKO0TzDrehXgvNIvZbK4GxeJqBgOzr9lh7MCMqy4YZBUhYbsWaeM3E0Xsvk7/nJEgJa+bLSvQf&#xA;pG0X8ZISfvKH/Y5otT2L1xn4H9bu9N2z0yD4j9T2fQ/MWh69ZC90e9ivbc0q0TVKk9nU0ZD7MAc0&#xA;eXDPGakKLu8WaGQXE2ExytsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;4eOejPnK04EtHFLDPM3mfUtJ11Y4SslsYkZoHG1SWBII3BzQdodoZMGahvGhs7/s/s/Hnw2dpXzT&#xA;LSfOOkagAjP9VuD/ALqlIAJ/yX6H9eZem7UxZdieGXn+txNT2XlxbgcUfL9SdnNi65o4pWnAlacC&#xA;UVpes6tpF2t5pd3LZXK9JYXKGnWhp1HsdsryY4zFSFhsx5JQNxNF7F5O/wCck7yD07XzVZ/Wo9gd&#xA;RtQElHu8OyN81K/I5pdT2MDvjNeR/W7rT9sEbZBfmHtvl7zX5d8xWgutFv4ryOlWVDSRPZ42o6H/&#xA;AFhmjzYJ4zUhTu8WeGQXE2m2UtrsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfD&#xA;xz0Z85WnAlo4pea/mD/x3l/4wJ/xJs5Htv8Av/8ANH6XrexP7j/OP6GM5qHbpxpPmnVtNokcnq24&#xA;/wB0SVZQP8k9V+jM/Tdo5cOwNx7i4Op7OxZdyKl3hmWlec9KvqRyn6pOf2JD8JPs/T76Zv8ATdq4&#xA;smx9MvP9boNT2Vlx7j1R8v1J52zZutaOBK04pWnAlXsNS1DTbuO80+5ktLqI1jnhco4+TKQchOAk&#xA;KIsNkJmJsGi9f8m/85JaxZmO180Ww1C2FFN7bgR3A92TaOT6OP05ptR2PE74zR7ujt9P2vIbTFjv&#xA;6vcfLHnbyv5nt/W0XUIrogcpIK8Zk/14mo4+dKZo82myYjUhTu8OohkFxNp5lDc7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXw8c9GfOVpwJaOKXmv5g/8AHeX/AIwJ/wASbOR7b/v/APNH&#xA;6XrexP7j/OP6GM5qHbuxV2KpppfmTVdNosMvOAf7ok+JKe3cfRmbptflxcjY7i4eo0GLLzG/eGY6&#xA;X500u8AS4P1Sc9nPwE+z/wBaZv8ATdrYsm0vSfs+bodR2Vkx7x9Q+35J9UEVBqDuCM2dutWnFWjg&#xA;ZLTilUtLy8srmO6s55La5iPKKeJijqfFWUgjISiJCjuGUZEGxzeteS/+cj/MOmlLbzJD+l7MbfWU&#xA;4x3Sj8Ek+mh/ys1Op7IhLeHpP2O10/as47T9Q+17r5S/MLyl5rh56NfpLOBWSzk/d3CfONt6e61H&#xA;vmiz6XJiPqH6ndYNVDL9JZHmO5DsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfEVzEIriWIGo&#xA;jZlB+RpnooNi3zoijSicVaOKXmv5g/8AHeX/AIwJ/wASbOR7b/v/APNH6XrexP7j/OP6GM5qHbux&#xA;V2KuxV2KplpfmDU9NIEEtYu8D/En3dvozL02uy4fpO3d0cTUaLHl+ob9/Vl2l+dNOuqR3X+izHar&#xA;GsZP+t2+nN9pu1sc9pek/Y6PUdlZIbx9Q+1PwysoZSCp3BG4Izag26yqaOKVpwJWnAldBcT28yT2&#xA;8jQzRnlHLGxVlI7hhQjIkAiiyBI3D1XyV/zkV5q0YJa66n6bsV2EjtwulH/GWhD/AOzFT/Nmr1HZ&#xA;WOe8fSfsdnp+05x2l6h9r3jyd+Z3k7zbGo0q+VbylX0+ekVwvj8BPxU8UJGaPUaPJi+obd/R3ODV&#xA;48v0nfuZXmK5LsVdirsVdirsVdirsVdirsVdirsVdirsVfEt/wD73XH/ABlf/iRz0SHIPnc/qKGO&#xA;FDRxS81/MH/jvL/xgT/iTZyPbf8Af/5o/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxVH6brepac3+&#xA;jSn0+8TfEh+j+mZOn1mTF9J27ujjZ9Jjy/UN+/qy3TPOlhccY7sfVpTty6xn6eo+nN9p+18c9p+k&#xA;/Y6TUdlTjvH1D7U/V0dQ6MGRt1YGoI9iM2oIIsOsIINFo4qtOBLRxS0rujq6MVdSGVlNCCNwQRgK&#xA;Q9Q8l/8AOQvnPQRHbaoRrmnrQUuGIuVX/Jn3J/2Yb6M1mo7Lxz3j6T9nydjg7SyQ2PqD3vyZ+bnk&#xA;nzYI4rG9FvqL/wDSuuqRTV8EqeMn+wJzR6jRZMXMbd4dzg1mPJyO/czPMRynYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq+Jb//AHuuP+Mr/wDEjnokOQfO5/UUMcKGjil5r+YP/HeX/jAn/Emzke2/7/8AzR+l&#xA;63sT+4/zj+hjOah27sVdirsVdirsVdirsVdiqN0/WNQ09q20xVe8Z3Q/7E5kYNXkxfSf1OPn0uPL&#xA;9QZVpnnOznpHer9XlP7YqYz/ABXN7p+14S2n6T9jpdR2VOO8PUPtT9JI5EDxsHRujKQQfpGbWMgR&#xA;Y3DrDEg0WzhVacCVpwJaqQag0I3BGBL0nyX+fvnjy4Y7e7m/TWmJQfV7tiZVX/iufdx7cuQHhmv1&#xA;HZuPJuPSfL9Tn4O0MkNj6g998k/nT5G81mO3guvqGpvQCwvKRuzHtG9eEnsAeXtmk1GgyY9yLHeH&#xA;cYNbjybXRZ5mE5bsVdirsVdirsVdirsVdirsVfEt/wD73XH/ABlf/iRz0SHIPnc/qKGOFDRxS81/&#xA;MH/jvL/xgT/iTZyPbf8Af/5o/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxV2KuxV2KuxVF2GqX1i/&#xA;K2lKA/aTqp+anbL8GpniNxNNObTwyCpBlGnec7aWkd6noP8A78WpQ/MdR+ObvT9rxltMcJ7+jps/&#xA;ZUo7wN/en8csUsYkicOjfZZSCD9IzbRkJCwbDrJRMTR2LZwoWnFLRwJWnAl6D5J/PLzz5WKQG5/S&#xA;umLQGyvGZ+K+Ecv209huvtmDqOz8eTeqPk5uDW5IeYe/+R/z38j+aDHbST/ojVHoPqd4wVWY9opt&#xA;kb2Box8M0mo7PyY9/qHk7fDroT25F6KCCKjpmC5jeKuxV2KuxV2KuxV2KviW/wD97rj/AIyv/wAS&#xA;OeiQ5B87n9RQxwoaOKXmv5g/8d5f+MCf8SbOR7b/AL//ADR+l63sT+4/zj+hjOah27sVdirsVdir&#xA;sVdirsVdirsVdirsVdiqJs9QvbJ+dtK0Z7qPsn5qdjl2HUTxm4mmrLghkFSFsl07zlC4CXyek3+/&#xA;UqV+kdR+ObrT9rxO2QV5uoz9lkbwN+TIIp4Z4xJC6yRnoymo/DNtCcZCwbDq5QMTRFFcckhacCVp&#xA;wMlpxSznyR+c/njyjwgtbv67pibfo68rJEB/xWah4/kpp7ZhZ9DjybkUe8OVh1c8fI2H0B5H/wCc&#xA;hPJHmIJb6hJ+g9TagMN2w9Bj/wAV3Hwr/wAHxOabP2dkhuPUPx0dth10J8/SXqCsrKGUhlYVVhuC&#xA;D3Ga9zW8VdirsVdirsVfEt//AL3XH/GV/wDiRz0SHIPnc/qKGOFDRxS81/MH/jvL/wAYE/4k2cj2&#xA;3/f/AOaP0vW9if3H+cf0MZzUO3dirsVdirsVdirsVdirsVdirsVdirsVdirsVV7S+u7ST1LaVo27&#xA;06H5g7HLcWaeM3E015MMZipC2R6f5wRqJfJxPT1k3H0r1+7Nzp+1gdsg+IdTn7LI3gfgyCG4guIx&#xA;JBIsiH9pTXNtDJGYuJsOsnCUTRFLjkkLTilacCWjgSzHyX+bfnjygUj0y+MunqanTbqstuR4KCeU&#xA;f+wYZi59Hjycxv3uRh1U8fI7PoHyR/zkf5M10R2us10LUWop9Y8rVj/kz0HH/ZgAeJzTZ+zZw3j6&#xA;h9rtcOvhLY+kvWIpYpY1lidZInAZHUhlYHcEEdRmuIpzgV+KuxV2KvifVI2j1K7jb7STSK3zDEZ6&#xA;HjNxHufO8gqR96EOSQ0cUvNfzB/47y/8YE/4k2cj23/f/wCaP0vW9if3H+cf0MZzUO3dirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVVra7ubWT1LeRo38VPX5jvlmPLKBuJphkxxmKkLZDYebq0&#xA;S+jp/wAWx/xX+mbfB2t0yD4h1ebszrA/BP4Lm3uI/UgkWRD3U/rzb48sZi4mw6ueOUDUhS45NDRw&#xA;JaxVrAllXk38z/OvlCVf0PqDi0Bq+nz1ltmruf3ZPw17lKH3zHz6XHk+ob9/VvxaiePkX0B5I/5y&#xA;Y8qawY7TzDEdDvmoPXJMlozdPt05R1/yhQfzZp8/Zk47x9Q+12mHXxltLYvYLa5t7mBLi2lSeCUB&#xA;opo2DoynoVZagjNaQRsXOBtVwJfFmvf8dvUP+Ymb/k4c9Cw/RH3B89zfXL3lLzk2DRxS81/MH/jv&#xA;L/xgT/iTZyPbf9//AJo/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxVUguJ7eQSQyNG47qaZOGSUDcTRYzhGQoi0/sPNjCiXqcv+LU6/Sv8ATNtg7V6ZB8Q6zN2b&#xA;1gfgn9vdW9zEJIJBIh7jt8x2zcY8sZi4mw6yeOUDUhSpk2DWBLsVaxSyLyh+Yfm/yhc+roeoSQRM&#xA;eUto37y3k/14mqtf8ofF4HKM2nhkHqDbizyh9JfRP5Z/85GaT5lvrfRtethperXDCO3mjJa1mkbY&#xA;IOXxRs3QAkg+PbNLqezjAcUdx9rtdPrhM1LYvEde/wCO3qH/ADEzf8nDnYYfoj7g8Zm+uXvKXnJs&#xA;Gjil5r+YP/HeX/jAn/Emzke2/wC//wA0fpet7E/uP84/oYzmodu7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYqitPN+LgfUefreCeH+V2p88v05ycX7u7ac4hw+vkza0+t+gv1oIJ&#xA;v2uFafjnUYuPh9dcXk89k4eL08lXLGDsVaxS0cCsh8l+R/NPmvVIbbQrSWTjIolvlBWG33rzeXYL&#xA;QbgVqe2U5s8MYuRbsWKUz6U917/jt6h/zEzf8nDm2w/RH3B0Gb65e8pecmwaOKXmv5g/8d5f+MCf&#xA;8SbOR7b/AL//ADR+l63sT+4/zj+hjOah27sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;diqpDBNPII4UMjnoqipycISkaiLLGcxEWTSfWPlORqPevwH++k3P0t0za4Oyid5mvIOtzdpDlAfF&#xA;P7a0trWP04IxGvenU/M9Tm4xYo4xURTq8mWUzcjarljBrAl2Kp55U8j+avNd39W0LT5bsqQJZgOM&#xA;Mdf9+StRF+VantlOXPDGLkabceGUzUQ+gPIv/OL+iWHp3nm25/Sl0KH6hAWjtVPgz/DJJ/wo9jmn&#xA;z9qSO0Nvvdph7PA3lu9rsNPsNOtI7OwtorS0hHGK3gRY41HsqgAZq5SJNnm7CMQBQfGmvf8AHb1D&#xA;/mJm/wCThz0HD9EfcHz7N9cveUvOTYNHFLzX8wf+O8v/ABgT/iTZyPbf9/8A5o/S9b2J/cf5x/Qx&#xA;nNQ7d2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVVt7W4uZPTgjaR/BRX78njxymaiLLCeS&#xA;MBcjTINP8osaPfPT/ilDv9Lf0zb6fsnrkPwDrM3afSA+LILe0trZOFvGsa96Dr8z1ObjHijAVEU6&#xA;ueWUzcja85Ni0cCWsVTzyr5H81ea7v6toWny3ZUgSzAcYY6/78laiL8q1PbKc2eGMXI0248Mpmoh&#xA;7/5F/wCcYNEsPTvPNlz+lLoUb6hAWjtVPgz/AAySf8KPY5p8/akjtDb73aYezwN5bva7DT7DTrSO&#xA;zsLaK0tIRxit4EWONR7KoAGaqUjI2dy7GMQBQRGBLsVfFmvf8dvUP+Ymb/k4c9Cw/RH3B89zfXL3&#xA;lLzk2DRxS81/MH/jvL/xgT/iTZyPbf8Af/5o/S9b2J/cf5x/QxnNQ7d2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxVWtrS5upPTt42kfwUdPmegyzHilM1EWWGTLGAuRpken+TwAHvpKnr6MfT6W/pm5&#xA;0/ZHXIfgHU5u1OkB8SyC3tbe2jEcEaxoOyj9fjm3x4owFRFB1c8kpm5G15ySFpxStOBKeeVfI/mn&#xA;zXd/VtC0+W7KkCWYDjDHX/fkrURflWp7ZTmzwxi5Gm3FhlM1EPfvI3/OMOiWHp3nmy5/Sl0KH6hA&#xA;WjtVPgz/AAySf8KPY5ps/akjtDb73a4ezojee72qw0+w060js7C2itLSEcYreFFjjUeyqABmrlIy&#xA;NncuxjEAUERkUuxV2KuxV8W6+Cuu6iCKEXUwIPUH1Gz0HD9EfcHz3N9cveUuOWMGjil5r+YP/HeX&#xA;/jAn/Emzke2/7/8AzR+l63sT+4/zj+hjOah27sVdirsVdirsVdirsVdirsVdirsVdiqIs7G7vJPT&#xA;tomkbvToPmTsMtxYJ5DURbVlzQxi5GmS6d5NjWj38nM/75jqB9LdfuzdafsgDfIb8g6nP2qTtAfE&#xA;sght4LeMRwxrHGOiqKDNvDHGAqIoOrnOUjZNleckxWnAlacDJOPLPk3zN5ovPqmh6fLeOCBJIopF&#xA;HXvJI1EX6TlOXPDGLkabcWGUzURb37yJ/wA4x6NYiO882z/pK7Hxfo+Aslsp8Hf4ZJP+FHzzTajt&#xA;WR2hsO/q7bB2cBvPd7VYafYadaR2dhbxWlpCOMVvCixxqPZVAAzVSkZGzuXZRiAKCIyKXYq7FXYq&#xA;7FXYq+M/Nv8AylOs/wDMdc/8nmzv9N/dR/qj7nz/AFP97L+sfvSg5c1NHFLzX8wf+O8v/GBP+JNn&#xA;I9t/3/8Amj9L1vYn9x/nH9DGc1Dt3Yq7FXYq7FXYq7FXYq7FXYq7FUTZabfXr8LaFpKdWGyj5sdh&#xA;l2HTzyGoi2nLnhjFyNMo03yZBHSS/f1W/wB9JUKPmep/DN3p+yIjfIb8nT5+1ZHaArzZBDBDBGI4&#xA;UWOMdFUUH4Zt4QjEVEUHVymZGybK44ULTilo4Epv5Z8m+ZvM959V0PT5bxwQJJFFIo695JGoi/Sc&#xA;pzZ4YxcjTdiwymaiLe8+R/8AnGPSrT07vzbc/pC4FG/R9sWS3B8Hk+GR/o4/Tml1HasjtAV5u3wd&#xA;mgbz3e1adpmnaZZx2WnW0VnaRCkcECLGg+SqAM1MpmRsmy7KMREUNkVkWTsVdirsVdirsVdirsVf&#xA;Gfm3/lKdZ/5jrn/k82d/pv7qP9Ufc+f6n+9l/WP3pQcuamjil5r+YP8Ax3l/4wJ/xJs5Htv+/wD8&#xA;0fpet7E/uP8AOP6GM5qHbuxV2KuxV2KuxV2KuxV2Kouw0q/v342sRcD7T9FHzY7Zfg02TKaiLaM2&#xA;ohjFyLKtN8lWsVJL5/Xcf7qWoQfT1P4ZvNP2PGO8zxHu6Omz9rSltAUPtZDHFFFGI4kWONRRUUAA&#xA;fQM28YiIoCg6uUjI2TZbOFC04ErTgSnHlryd5l8z3n1XQ7CW8cECSRRSKOveSRqIv0nKc2eGMXI0&#xA;3YsM8hqIt7v5I/5xl0q09O782XP6QnFD+j7YsluD4PJ8Mj/Rx+nNJqO1pHaArzdxg7MA3mb8ntOn&#xA;aZp2mWcdlp1tFaWkQpHBCixoPkqgDNTKZkbJsuzjERFDYInIsnYq7FXYq7FXYq7FXYq7FXYq+M/N&#xA;v/KU6z/zHXP/ACebO/0391H+qPufP9T/AHsv6x+9KDlzU0cUvNfzB/47y/8AGBP+JNnI9t/3/wDm&#xA;j9L1vYn9x/nH9DGc1Dt3Yq7FXYq7FXYq7FUbp2jajqDUtoSyjrIdkH+yOZODSZMv0j9Tj59VjxfU&#xA;WWaX5Ks4KSXrfWZf99iojH8W/wA9s3mm7IhHefqP2Ok1Ha05bQ9I+1kKRxxoEjUIi7KqgAD5AZto&#xA;xAFDk6syJNlxwqtOBLRxSm/lryf5l8zXf1XRLCW8cECR1FIo695JGoi/ScozZ4YxcjTdiwTyGoi3&#xA;u3kn/nGfSrT07vzZc/X5xQ/o+3LJbg+DyfDI/wBHH6c0mo7XkdsYrzdzg7LA3mb8ns+naZp2mWkd&#xA;np9tFaWkQpHBCixoPkqgDNRKZkbJsu0jERFAUETkWTsVdirsVdirsVdirsVdirsVdirsVfGfm3/l&#xA;KdZ/5jrn/k82d/pv7qP9Ufc+f6n+9l/WP3pQcuamjil5r+YP/HeX/jAn/Emzke2/7/8AzR+l63sT&#xA;+4/zj+hjOah27sVdirsVdiqP03Q9T1Fv9GhPp95m+FB9Pf6MytPo8mX6Rt39HGz6zHi+o793Vl+m&#xA;eSdPtqPeH61MN+PSMfR3+nN9p+yMcN5+o/Y6LUdrTntD0j7WQKiIgRFCoooqqKAD2AzagACg6skk&#xA;2XHClacCVpwJTfy15Q8x+Zrz6poljJeSLT1HUUjjB6GSRqIv0nKc2eGMXI03YcE8hqIt7p5J/wCc&#xA;adLtPTu/Ndz9fnFD+j7cskAPg8nwu/0cfpzR6jteR2xivN3Wn7KiN5m/J7Np2m6fptpHZ6fbRWlp&#xA;EKRwQoqIPkqgDNPOZkbJsu1jARFAUETkWTsVdirsVdirsVdirsVdirsVdirsVdirsVfGfm3/AJSn&#xA;Wf8AmOuf+TzZ3+m/uo/1R9z5/qf72X9Y/elBy5qaOKXmv5g/8d5f+MCf8SbOR7b/AL//ADR+l63s&#xA;T+4/zj+hjOah27sVdiqZaX5e1TUiDbxcYe87/Cn39/ozM02hy5vpG3f0cTUa3Hi+o793VmGleSdN&#xA;tKSXX+lzDswpGP8AY9/pzfabsjHDeXqP2Oi1Pa2Se0fSPtZAFVVCqAFGwA2AGbUCnV3bRxVo4GS0&#xA;4pTTy95U8xeY7z6pothLezbcygoiA95JGoiD/WOUZs8MYuRpuxYZ5DURb3HyV/zjVYW/p3fmy6+u&#xA;S7H9HWpZIR7SS/C7/JePzOaPU9sE7YxXmXdafskDfIb8ns2maVpulWaWWm2sVnaR/YghQIg96L3P&#xA;c5ppzlI3I2XbwgIigKCLyLJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvjPzb/ylOs/8x1z/&#xA;AMnmzv8ATf3Uf6o+58/1P97L+sfvSg5c1NHFLzX8wf8AjvL/AMYE/wCJNnI9t/3/APmj9L1vYn9x&#xA;/nH9DGc1Dt010ry1q2pcWhi4QH/d8nwpT27n6MzdN2flzchQ7y4Wp1+LFzNnuDMtK8laVZgPcD63&#xA;OO7j4AfZP61zoNN2Tix7y9R+z5Og1Pa2XJtH0j7fmn4AAAAoBsAM2lOtto4FWnFK04Epp5e8q+Yf&#xA;Md59U0WxlvJtuZQURAe8kjURB/rHKc2eGMXI034cE8hqIt7f5L/5xssLf07vzZdfXJdj+jrUskI9&#xA;pJfhdvkvH5nNFqe2SdsYrzLu9P2QBvkN+QezaZpWm6XZpZabaxWdpH9iCFAiD3ovc9zmmnOUjcjZ&#xA;dxCEYigKCKyDJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvjnzyqr518wKoAUaleAAb&#xA;AATvne6P+5h/Vj9zwOs/vp/1pfekRzIaGjilhfmfy1qWra8rwKEtxEitO5ooILbADcnOf7Q7PyZ8&#xA;9x+mhu7/ALP1+PBgqX1Wdkw0nyXpNhSSVfrc4/bkHwg+ydPvrmVpuycWPc+qXn+pxdT2rlybD0x8&#xA;v1p9mzda0cUrTgStOBKZ+X/KvmHzFefVNFsZbyXbmUFEQHu8hoiD/WOU5s8MYuRpvw4J5DURb27y&#xA;Z/zjdYW/p3fmu5+ty7H9HWxZIR7SS7O3yXj8zmi1PbJO2MV5l3mm7HA3yG/IPZNN0vTdLs0stOtY&#xA;rO0j+xBCgRR70Xue5zSznKRuRsu5hCMRURQRWQZOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV8dee/+U38w/8AbTvP+oh873R/3MP6sfueB1n99P8ArS+9ITmQ0NHFK04ErTgStOBL&#xA;RxSmfl/yt5g8xXf1TRrGW8l25lBREB7u5oiD/WOUZs8MYuZpvw4J5DURb2zyZ/zjhYW/C6813P1u&#xA;XY/o62LJCPaSXZ2/2PH5nNDqe2idsYrzLvdN2MBvkN+Qexabpem6XZpZ6daxWlrH9iGFAij3oO57&#xA;nNLPJKZuRsu5hCMRURQRWQZuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;8dee/wDlN/MP/bTvP+oh873R/wBzD+rH7ngdZ/fT/rS+9ITmQ0NHFK04ErTgSmOheW9d1+8Fno9l&#xA;LeT7chGPhUHu7mioPdjlObPDGLkabsOCeQ1EW9p8l/8AOOdrCY7vzXci5cb/AKNtiVj+UkuzN8lp&#xA;8zmh1XbRO2MV5l32l7GA3yG/IPZNN0vTtMtEs9OtorS1j+xDCgRR70Hc9zmjnklM3I2XdwxxgKiK&#xA;CKyDN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvjrz3/AMpv5h/7&#xA;ad5/1EPne6P+5h/Vj9zwOs/vp/1pfekJzIaGjilMNC8t67r94LTR7KW8n25CMfCoPd3NFQe7HKc2&#xA;eGMXM0G7DgnkNRFvZ/J3/OOlrFwuvNVz677H9HWpKxj2kl2ZvktPmc0Gq7bJ2xivM/qd/pexQN8h&#xA;vyH63sWl6Rpek2aWem2sVnap9mGFQi18TTqfc5osmSUzcjZd5jxxgKiKCLyDN2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvnj87fy31W11y58x6bbvc6Zen1bv0&#xA;wWaCanxlgKng/wBrl2NRttXquydfGUBjkakOXmHle1tBKMzkiLiefkXmuh+XNc167FppFlLeT/tC&#xA;MfCoPd3NFQe7HNtmzwxi5mg6nDgnkNQFl7N5P/5x2tYuF15pufXfY/o62JWMe0kuzN8lp8znP6rt&#xA;wnbEK8z+p6DS9iAb5TfkP1vYNL0nTNKs0s9NtYrS1T7MUKhFr4mnU+5zRZMkpm5Gy73HjjAVEUEX&#xA;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>