Revision: 201011
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 15:08:36 +0300
changeset 15 00f9ee97d895
parent 2 0b192a3a05a4
child 17 f05641c183ff
Revision: 201011 Kit: 201015
atcommands/group/bld.inf
atcommands/lccustomplugin/group/bld.inf
atcommands/lccustomplugin/group/lccustomplugin.mmp
atcommands/lccustomplugin/inc/debug.h
atcommands/lccustomplugin/inc/debugconfig.h
atcommands/lccustomplugin/inc/lccustomplugin.h
atcommands/lccustomplugin/inc/lclistallcmd.h
atcommands/lccustomplugin/inc/prjconfig.h
atcommands/lccustomplugin/rom/lccustomplugin.iby
atcommands/lccustomplugin/src/20021360.rss
atcommands/lccustomplugin/src/lccustomplugin.cpp
atcommands/lccustomplugin/src/lclistallcmd.cpp
atcommands/lccustomplugin/src/proxy.cpp
atcommands/modematplugin/group/bld.inf
atcommands/modematplugin/group/modematplugin.mmp
atcommands/modematplugin/inc/atcopscmd.h
atcommands/modematplugin/inc/cmdpluginobserver.h
atcommands/modematplugin/inc/debug.h
atcommands/modematplugin/inc/debugconfig.h
atcommands/modematplugin/inc/modematplugin.h
atcommands/modematplugin/inc/prjconfig.h
atcommands/modematplugin/rom/modematplugin.iby
atcommands/modematplugin/src/20029fbf.rss
atcommands/modematplugin/src/atcopscmd.cpp
atcommands/modematplugin/src/modematplugin.cpp
atcommands/modematplugin/src/proxy.cpp
bluetoothappprofiles/avrcp/remconbeareravrcp/group/remconbeareravrcp.mmp
bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpcommand.h
bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcputils.h
bluetoothappprofiles/avrcp/remconbeareravrcp/inc/bulkbearer.h
bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h
bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlcommand.h
bluetoothappprofiles/avrcp/remconbeareravrcp/inc/remconcommandinterface.h
bluetoothappprofiles/avrcp/remconbeareravrcp/src/bulkbearer.cpp
bluetoothappprofiles/avrcp/remconbeareravrcp/src/controlcommand.cpp
bluetoothappprofiles/avrcp/remconbeareravrcp/src/playerstatewatcher.cpp
bluetoothappprofiles/avrcp/remconbeareravrcp/src/remconbeareravrcp.cpp
bluetoothengine/btaudioman/btaccpanic.h
bluetoothengine/btaudioman/data/10208970.rss
bluetoothengine/btaudioman/group/btaudioman.mmp
bluetoothengine/btaudioman/inc/BTAccClient.h
bluetoothengine/btaudioman/inc/BTAccClientSrv.h
bluetoothengine/btaudioman/inc/BTAccServer.h
bluetoothengine/btaudioman/inc/BTAccSession.h
bluetoothengine/btaudioman/inc/basrvaccman.h
bluetoothengine/btaudioman/inc/basrvaccstate.h
bluetoothengine/btaudioman/inc/btaccpanic.h
bluetoothengine/btaudioman/inc/btaudiomanplugin.h
bluetoothengine/btaudioman/inc/debug.h
bluetoothengine/btaudioman/inc/debugconfig.h
bluetoothengine/btaudioman/src/BTAccClient.cpp
bluetoothengine/btaudioman/src/BTAccServer.cpp
bluetoothengine/btaudioman/src/BTAccSession.cpp
bluetoothengine/btaudioman/src/BTAccSession_accfw_var.cpp
bluetoothengine/btaudioman/src/basrvacc.cpp
bluetoothengine/btaudioman/src/basrvaccman.cpp
bluetoothengine/btaudioman/src/basrvaccstate.cpp
bluetoothengine/btaudioman/src/basrvaccstateattach.cpp
bluetoothengine/btaudioman/src/basrvaccstateattached.cpp
bluetoothengine/btaudioman/src/basrvaccstateconnect.cpp
bluetoothengine/btaudioman/src/basrvaccstatedetach.cpp
bluetoothengine/btaudioman/src/basrvaccstatedisconnect.cpp
bluetoothengine/btaudioman/src/basrvaccstatequery.cpp
bluetoothengine/btaudioman/src/basrvsdpquery.cpp
bluetoothengine/btaudioman/src/btaudiomanplugin.cpp
bluetoothengine/bteng/btfeatures/btfeatures.cpp
bluetoothengine/bteng/btfeatures/btfeatures.mmp
bluetoothengine/bteng/bttoggle/inc/bttoggle.h
bluetoothengine/bteng/bttoggle/src/bttoggle.cpp
bluetoothengine/bteng/cenrep/keys_bteng.xls
bluetoothengine/bteng/conf/bteng.confml
bluetoothengine/bteng/conf/bteng_10204DAC.crml
bluetoothengine/bteng/data/btengsdp.rss
bluetoothengine/bteng/data/btrfs.txt
bluetoothengine/bteng/data/bttoggle_reg.rss
bluetoothengine/bteng/group/backup_registration.xml
bluetoothengine/bteng/group/bld.inf
bluetoothengine/bteng/group/bteng.mmp
bluetoothengine/bteng/group/btengconnman.mmp
bluetoothengine/bteng/group/btengdiscovery.mmp
bluetoothengine/bteng/group/btengsettings.mmp
bluetoothengine/bteng/inc/btengactive.h
bluetoothengine/bteng/inc/btengactive.inl
bluetoothengine/bteng/inc/btengincpair.h
bluetoothengine/bteng/inc/btengpairman.h
bluetoothengine/bteng/inc/btengprivatecrkeys.h
bluetoothengine/bteng/inc/btengserver.h
bluetoothengine/bteng/inc/btengsrvsession.h
bluetoothengine/bteng/inc/btengsrvsettingsmgr.h
bluetoothengine/bteng/inc/btengsrvstate.h
bluetoothengine/bteng/rom/bteng.iby
bluetoothengine/bteng/src/btengactive.cpp
bluetoothengine/bteng/src/btengincpair.cpp
bluetoothengine/bteng/src/btengpairman.cpp
bluetoothengine/bteng/src/btengserver.cpp
bluetoothengine/bteng/src/btengsrvkeywatcher.cpp
bluetoothengine/bteng/src/btengsrvpluginmgr.cpp
bluetoothengine/bteng/src/btengsrvsession.cpp
bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp
bluetoothengine/bteng/src/btengsrvstate.cpp
bluetoothengine/bthid/bthidclient/eabi/bthidclientu.def
bluetoothengine/bthid/bthidclient/inc/bthidclient.h
bluetoothengine/bthid/bthidclient/src/bthidclient.cpp
bluetoothengine/bthid/bthidengplugin/src/bthidengplugin.cpp
bluetoothengine/bthid/bthidserver/inc/btconnectionobserver.h
bluetoothengine/bthid/bthidserver/inc/bthidconnection.h
bluetoothengine/bthid/bthidserver/inc/bthidserver.h
bluetoothengine/bthid/bthidserver/src/bthidconnection.cpp
bluetoothengine/bthid/bthidserver/src/bthidserver.cpp
bluetoothengine/bthid/bthidserver/src/bthidsession.cpp
bluetoothengine/bthid/mouse/PaintCursor/data/paintcursor_reg.rss
bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappui.h
bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappview.h
bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursordocument.h
bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappui.cpp
bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappview.cpp
bluetoothengine/bthid/mouse/PaintCursor/src/paintcursordocument.cpp
bluetoothengine/bthid/mouse/Sesame_client/data/Thumbs.db
bluetoothengine/bthid/mouse/Sesame_client/data/cursormask.bmp
bluetoothengine/bthid/mouse/Sesame_client/inc/pointmsgqueue.h
bluetoothengine/bthid/mouse/Sesame_client/src/clientimagecommander.cpp
bluetoothengine/bthid/mouse/Sesame_server/bwins/btcursor_serveru.def
bluetoothengine/bthid/mouse/Sesame_server/eabi/btcursor_serveru.def
bluetoothengine/bthid/mouse/Sesame_server/group/animation_server.mmp
bluetoothengine/bthid/mouse/Sesame_server/inc/mousecursorsrv.h
bluetoothengine/bthid/mouse/Sesame_server/src/mousecursorimage.cpp
bluetoothengine/btmac/BWINS/BTMonoCmdHandlerU.DEF
bluetoothengine/btmac/eabi/BTMonoCmdHandleru.DEF
bluetoothengine/btmac/group/BTMonoCmdHandler.mmp
bluetoothengine/btmac/inc/btmonocmdhandler/btmc_defs.h
bluetoothengine/btmac/inc/btmonocmdhandler/btmcnumber.h
bluetoothengine/btmac/inc/btmonocmdhandler/btmcoperator.h
bluetoothengine/btmac/inc/btmonocmdhandler/btmcphonestatus.h
bluetoothengine/btmac/inc/btmonocmdhandler/btmcprotocol.h
bluetoothengine/btmac/inc/btmonocmdhandler/btmcvolume.h
bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallstatus.cpp
bluetoothengine/btmac/src/BTMonoCmdHandler/btmcnumber.cpp
bluetoothengine/btmac/src/BTMonoCmdHandler/btmcoperator.cpp
bluetoothengine/btmac/src/BTMonoCmdHandler/btmcphonestatus.cpp
bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp
bluetoothengine/btmac/src/BTMonoCmdHandler/btmcvolume.cpp
bluetoothengine/btmac/src/btmac/btmrfcommsock.cpp
bluetoothengine/btnotif/ecom/BtnotifWrapper.cpp
bluetoothengine/btnotif/group/BTNotif.mmp
bluetoothengine/btnotif/group/bld.inf
bluetoothengine/btnotif/inc/BTNGenericInfoNotifier.h
bluetoothengine/btnotif/inc/BTNGenericQueryNotifier.h
bluetoothengine/btnotif/inc/btnotifier.h
bluetoothengine/btnotif/inc/btnotifuiutil.h
bluetoothengine/btnotif/inc/btnpaireddevsettnotifier.h
bluetoothengine/btnotif/inc/btnpairnotifier.h
bluetoothengine/btnotif/inc/btnpinnotifier.h
bluetoothengine/btnotif/inc/btnssppasskeyentrynotifier.h
bluetoothengine/btnotif/inc/btnumcmpnotifier.h
bluetoothengine/btnotif/inc/btuserconfnotifier.h
bluetoothengine/btnotif/src/BTNAuthNotifier.cpp
bluetoothengine/btnotif/src/BTNGenericInfoNotifier.cpp
bluetoothengine/btnotif/src/BTNGenericQueryNotifier.cpp
bluetoothengine/btnotif/src/BTNInqNotifier.cpp
bluetoothengine/btnotif/src/BTNInqUI.cpp
bluetoothengine/btnotif/src/BTNMain.cpp
bluetoothengine/btnotif/src/BTNObexPinNotifier.cpp
bluetoothengine/btnotif/src/BTNPBAPPinNotifier.cpp
bluetoothengine/btnotif/src/BTNPinNotifier.cpp
bluetoothengine/btnotif/src/BTNotifier.cpp
bluetoothengine/btnotif/src/btnenterpriseitsecurityinfonotifier.cpp
bluetoothengine/btnotif/src/btnotifuiutil.cpp
bluetoothengine/btnotif/src/btnpaireddevsettnotifier.cpp
bluetoothengine/btnotif/src/btnpairnotifier.cpp
bluetoothengine/btnotif/src/btnssppasskeyentrynotifier.cpp
bluetoothengine/btnotif/src/btnumcmpnotifier.cpp
bluetoothengine/btnotif/src/btuserconfnotifier.cpp
bluetoothengine/btsac/btrcc/inc/btrccLinker.h
bluetoothengine/btsac/btrcc/inc/btrccplayerstarter.h
bluetoothengine/btsac/btrcc/src/btrccLinker.cpp
bluetoothengine/btsac/btrcc/src/btrccplayerstarter.cpp
bluetoothengine/btui/Ecom/group/bld.inf
bluetoothengine/btui/Ecom/inc/bluetoothuiutil.h
bluetoothengine/btui/Ecom/inc/bluetoothuiutil.inl
bluetoothengine/btui/Ecom/src/BTUIBlockedDevicesView.cpp
bluetoothengine/btui/Ecom/src/BTUIDeviceContainer.cpp
bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp
bluetoothengine/btui/Ecom/src/BTUISap.cpp
bluetoothengine/btui/devmodel/src/btpairedmodel.cpp
bluetoothengine/btui/group/bld.inf
btservices_info/btservices_metadata/btservices_metadata.mrp
group/bld.inf
tsrc/public/basic/conf/obexservapitest.cfg
tsrc/public/basic/conf/test.xml
tsrc/public/basic/group/bld.inf
tsrc/public/basic/obexservapitest/Bmarm/ObexServAPItestU.DEF
tsrc/public/basic/obexservapitest/Bwins/ObexServAPItestU.DEF
tsrc/public/basic/obexservapitest/EABI/ObexServAPItestU.def
tsrc/public/basic/obexservapitest/group/bld.inf
tsrc/public/basic/obexservapitest/group/obexservapitest.mmp
tsrc/public/basic/obexservapitest/inc/ObexServAPItest.h
tsrc/public/basic/obexservapitest/inc/testlogger.h
tsrc/public/basic/obexservapitest/rom/obexservapitest.iby
tsrc/public/basic/obexservapitest/src/ObexServAPItest.cpp
tsrc/public/basic/obexservapitest/src/ObexServAPItestBlocks.cpp
tsrc/public/basic/obexservapitest/src/testlogger.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* 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 ?myapp
+*
+*/
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+
+#include "../modematplugin/group/bld.inf"
+#include "../lccustomplugin/group/bld.inf"
+
+PRJ_EXPORTS
+
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+
+PRJ_TESTEXPORTS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,29 @@
+/*
+* 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:  This file provides the information required for building the
+*                whole of DUN utilities
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+../rom/lccustomplugin.iby         CORE_MW_LAYER_IBY_EXPORT_PATH(lccustomplugin.iby)
+
+PRJ_MMPFILES
+lccustomplugin.mmp
+
+PRJ_TESTMMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/group/lccustomplugin.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,52 @@
+/*
+* 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:  Project definition file for project LCCustomPlugin
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET                  lccustomplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x20021360
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  proxy.cpp
+SOURCE                  lccustomplugin.cpp
+SOURCE                  lclistallcmd.cpp
+
+START RESOURCE          ../src/20021360.rss
+TARGET                  lccustomplugin.rsc
+END
+
+USERINCLUDE             ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+// Note:
+// The only other SYSTEMINCLUDE should you shall add are Symbian specific ones.
+// If there is a S60 header in the subdirectory then that should be
+// added into the include statements (like #include <phonebook/header.h>)
+//SYSTEMINCLUDE           /epoc32/include/ecom
+SYSTEMINCLUDE           /epoc32/include/ecom
+
+LIBRARY	ecom.lib
+LIBRARY euser.lib
+LIBRARY atextpluginbase.lib
+
+DEBUGLIBRARY flogger.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/inc/debug.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 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:  Logging definitions
+*
+*/
+
+
+#ifndef PRJ_LOGGING_H
+#define PRJ_LOGGING_H
+
+#include <e32base.h>
+#include "debugconfig.h"
+
+#ifdef PRJ_ENABLE_TRACE
+
+#ifdef PRJ_FILE_TRACE
+#include <flogger.h>
+#else
+#include <e32debug.h>
+#endif
+
+NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow
+    {
+public:
+    void Overflow(TDes16& /*aDes*/) {}
+    };
+
+NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow
+    {
+public:
+    void Overflow(TDes8& /*aDes*/) {}
+    };
+
+inline void Trace(TRefByValue<const TDesC16> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list,aFmt);
+#ifdef PRJ_FILE_TRACE
+    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list);
+#else
+    TBuf16<KMaxLogLineLength> theFinalString;
+    theFinalString.Append(KTracePrefix16);
+    TOverflowTruncate16 overflow;
+    theFinalString.AppendFormatList(aFmt,list,&overflow);
+    RDebug::Print(theFinalString);
+#endif
+    }
+
+inline void Trace(TRefByValue<const TDesC8> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list, aFmt);
+#ifdef PRJ_FILE_TRACE
+    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list);
+#else
+    TOverflowTruncate8 overflow;
+    TBuf8<KMaxLogLineLength> buf8;
+    buf8.Append(KTracePrefix8);
+    buf8.AppendFormatList(aFmt, list, &overflow);
+    TBuf16<KMaxLogLineLength> buf16(buf8.Length());
+    buf16.Copy(buf8);
+    TRefByValue<const TDesC> tmpFmt(_L("%S"));
+    RDebug::Print(tmpFmt, &buf16);
+#endif
+    }
+
+inline void TracePanic(
+    char* aFile,
+    TInt aLine,
+    TInt aPanicCode,
+    const TDesC& aPanicCategory)
+    {
+    TPtrC8 fullFileName((const TUint8*)aFile);
+    TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1);
+    TBuf8<KMaxLogLineLength> buf;
+    buf.Append(KPanicPrefix8);
+    buf.AppendFormat(_L8("%d at line %d in file %S"), aPanicCode, aLine, &fileName);
+    Trace(buf);
+    User::Panic(aPanicCategory, aPanicCode);
+    }
+
+inline void TraceLeave(char* aFile, TInt aLine, TInt aReason)
+    {
+    TPtrC8 fullFileName((const TUint8*)aFile);
+    TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1);
+    TBuf8<KMaxLogLineLength> buf;
+    buf.Append(KLeavePrefix8);
+    buf.AppendFormat(_L8("%d at line %d in file %S"), aReason, aLine, &fileName);
+    Trace(buf);
+    User::Leave(aReason);
+    }
+
+#define TRACE_INFO(p) {if(KTraceMask & KPRINTINFO) Trace p;}
+
+#define TRACE_ERROR(p) {if(KTraceMask & KPRINTERROR) Trace p;}
+
+#define TRACE_STATE(p) {if(KTraceMask & KPRINTSTATE) Trace p;}
+
+#define TRACE_WARNING(p) {if(KTraceMask & KPRINTWARNING) Trace p;}
+
+#define TRACE_INFO_SEG(p) {if(KTraceMask & KPRINTINFO) p;}
+
+#define TRACE_ASSERT(GUARD, CODE) {if (!(GUARD)) TracePanic(__FILE__, __LINE__, CODE, KPanicCategory);}
+
+#define PANIC(CODE) TracePanic(__FILE__, __LINE__, CODE, KPanicCategory)
+
+#define LEAVE_IF_ERROR(REASON) {if (REASON) TraceLeave(__FILE__, __LINE__, REASON);}
+
+#define LEAVE_IF_NULL(PTR) {if (!PTR) TraceLeave(__FILE__, __LINE__, PTR);}
+
+#define LEAVE(REASON) {TraceLeave(__FILE__, __LINE__, REASON);}
+
+#define TRACE_STATIC_FUNC_ENTRY {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncEntryFormat8, &ptr8);}}
+
+#define TRACE_FUNC_ENTRY {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncEntryThisFormat8, &ptr8, this);}}
+
+#define TRACE_FUNC_EXIT {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncExitFormat8, &ptr8);}}
+
+#define TRACE_STATIC_FUNC {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncFormat8, &ptr8);}}
+
+#define TRACE_FUNC {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncThisFormat8, &ptr8, this);}}
+
+#define RETURN_IF_ERR(ERR) {if(ERR) {TPtrC8 ptr8((TUint8*)__FILE__); Trace(_L8(" RETURN %d at file %S line %d"), ERR, &ptr8, __LINE__); return ERR;}}
+
+#else // PRJ_ENABLE_TRACE not defined
+
+#define TRACE_INFO(p)
+
+#define TRACE_ERROR(p)
+
+#define TRACE_STATE(p)
+
+#define TRACE_WARNING(p)
+
+#define TRACE_INFO_SEG(p)
+
+#define TRACE_ASSERT(GUARD, CODE)
+
+#define PANIC(CODE) {User::Panic(KPanicCategory, CODE);}
+
+#define LEAVE_IF_ERROR(REASON) {static_cast<void>(User::LeaveIfError(REASON));}
+
+#define LEAVE_IF_NULL(PTR) {static_cast<void>(User::LeaveIfNull(PTR));}
+
+#define LEAVE(REASON) {static_cast<void>(User::Leave(REASON));}
+
+#define TRACE_STATIC_FUNC_ENTRY
+
+#define TRACE_FUNC_ENTRY
+
+#define TRACE_FUNC_EXIT
+
+#define TRACE_STATIC_FUNC
+
+#define TRACE_FUNC
+
+#define RETURN_IF_ERR(ERR) {if(ERR) return ERR;}
+#endif // PRJ_ENABLE_TRACE
+
+#endif // PRJ_LOGGING_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/inc/debugconfig.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 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:  Logging configure file
+*
+*/
+
+
+#ifndef ATEXT_DEBUGCONFIG_H
+#define ATEXT_DEBUGCONFIG_H
+
+#include "prjconfig.h"
+
+/**
+ * Custom logging variations.
+ */
+#ifdef PRJ_FILE_TRACE
+_LIT(KLogFile,"lccustomplugin.txt");
+_LIT(KLogDir,"LCCUSTOMPLUGIN");
+#endif
+
+#ifdef PRJ_ENABLE_TRACE
+_LIT(KTracePrefix16, "[LCCUSTOMPLUGIN] ");
+_LIT8(KTracePrefix8, "[LCCUSTOMPLUGIN] ");
+_LIT8(KFuncFormat8, "><%S");
+_LIT8(KFuncThisFormat8, "><%S, [0x%08X]");
+_LIT8(KFuncEntryFormat8, ">%S");
+_LIT8(KFuncEntryThisFormat8, ">%S, [0x%08X]");
+_LIT8(KFuncExitFormat8, "<%S");
+
+_LIT(KPanicCategory, "lccustomplugin");
+_LIT8(KPanicPrefix8, "PANIC code ");
+_LIT8(KLeavePrefix8, "LEAVE code ");
+#endif
+
+const TInt KMaxLogLineLength = 512;
+
+#define KPRINTERROR        0x00000001 // Tracing level: error
+#define KPRINTINFO        0x00000002 // Tracing level: function trace
+#define KPRINTSTATE        0x00000004 // Tracing level: state machine info
+#define KPRINTWARNING   0x00000008 // Tracing level: warning
+
+const TInt KTraceMask = KPRINTERROR | KPRINTINFO | KPRINTSTATE | KPRINTWARNING;
+
+#endif // ATEXT_DEBUGCONFIG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/inc/lccustomplugin.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,476 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Main handler for incoming requests
+*
+*/
+
+#ifndef C_LCCUSTOMPLUGIN_H
+#define C_LCCUSTOMPLUGIN_H
+
+#include <atextpluginbase.h>
+
+class CLcCustomPlugin;
+
+/** Character types: carriage return, line feed or backspace */
+enum TCharacterTypes
+    {
+    ECharTypeCR,  // Carriage return
+    ECharTypeLF,  // Line feed
+    ECharTypeBS   // Backspace
+    };
+
+/** Type of modes (quiet, verbose) */
+enum TModeTypes
+    {
+    EModeTypeQuiet,   // Quiet mode
+    EModeTypeVerbose  // Verbose mode
+    };
+
+/**  Handler types for the four types */
+enum TCmdHandlerType
+    {
+    ECmdHandlerTypeUndefined = KErrNotFound,
+    ECmdHandlerTypeBase      = 0x01,  // For command "AT+COMMAND"
+    ECmdHandlerTypeSet       = 0x02,  // For command "AT+COMMAND="
+    ECmdHandlerTypeRead      = 0x04,  // For command "AT+COMMAND?"
+    ECmdHandlerTypeTest      = 0x08,  // For command "AT+COMMAND=?"
+    };
+
+/**  Detected commands */
+enum TDetectedCmd
+    {
+    EDetectedCmdUndefined,
+    EDetectedCmdCLAC  // For command "AT+CLAC"
+    };
+
+/**
+ *  Class for common AT command handler interface
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CLcCustomPluginBase )
+    {
+
+public:
+
+    virtual ~CLcCustomPluginBase() {};
+
+    /**
+     * Reports the support status of an AT command. This is a synchronous API.
+     *
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. E.g. in BT HFP case, the command may contain
+     *             a character carriage return (<cr>) in the end.
+     * @return ETrue if the command is supported; EFalse otherwise.
+     */
+    virtual TBool IsCommandSupported( const TDesC8& aCmd ) = 0;
+
+    /**
+     * Handles an AT command. Cancelling of the pending request is done by
+     * HandleCommandCancel(). The implementation in the extension plugin should
+     * be asynchronous.
+     *
+     * The extension plugin which accepts this command is responsible to supply
+     * the result codes and response and to format result codes properly, e.g.
+     * in BT HFP case, the format should be <cr><lf><result code><cr><lf>
+     *
+     * After an extension plugin has handled or decided to reject the given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with a proper
+     * error code.
+     *
+     * @since S60 5.0
+     * @param aCmd The AT command to be handled. Its format may vary depending
+     *             on the specification. E.g. in BT HFP case, the command may
+     *             contain a character carriage return (<cr>) in the end.
+     * @param aReply When passed in, contains the built in answer filled by
+     *               ATEXT if it is not empty; when command handling completes
+     *               successfully, contains the result codes and responses to
+     *               this command; Its ownership always belongs to ATEXT, plugin
+     *               may reallocate its space when needed.
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse,
+     *                     the aReply must not contain the reply, otherwise it
+     *                     must contain verbose or numeric reply (ATV0/1) or an
+     *                     empty string reply (with ATQ).
+     * @return None
+     */
+    virtual void HandleCommand( const TDesC8& aCmd,
+                                RBuf8& aReply,
+                                TBool aReplyNeeded ) = 0;
+
+    /**
+     * Cancels a pending HandleCommand request.
+     *
+     * @since S60 5.0
+     * @return None
+     */
+    virtual void HandleCommandCancel() = 0;
+
+    };
+
+/**
+ *  Class for accessing plugin information and common functionality
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( MLcCustomPlugin )
+    {
+
+public:
+
+    /**
+     * Creates an AT command reply based on the reply type and completes the
+     * request to ATEXT. Uses iReplyBuffer for reply storage.
+     *
+     * @since S60 5.0
+     * @param aReplyType Type of reply
+     * @param aSrcBuffer Source buffer; used only if aReplyType is EReplyTypeOther
+     * @param aError Completion code. If not KErrNone then other arguments are
+     *               ignored and the request is completed to ATEXT with
+     *               EReplyTypeUndefined.
+     * @return None
+     */
+    virtual TInt CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                         const TDesC8& aSrcBuffer=KNullDesC8,
+                                         TInt aError=KErrNone ) = 0;
+
+    /**
+     * Creates a buffer for "OK" or "ERROR" reply based on the line settings
+     *
+     * @since S60 5.0
+     * @param aReplyBuffer Destination buffer for the created reply
+     * @param aOkReply ETrue if "OK" reply needed,
+     *                 EFalse if "ERROR" reply needed
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                                       TBool aOkReply ) = 0;
+
+    /**
+     * Checks if the command is a base, set, read or test type of command
+     *
+     * @since TB9.2
+     * @param aCmdBase Base part of the command to check
+     * @param aCmdFull Full command to check
+     * @return Type of command
+     */
+    virtual TCmdHandlerType CheckCommandType( const TDesC8& aCmdBase,
+                                              const TDesC8& aCmdFull ) = 0;
+
+    /**
+     * Returns the array of supported commands
+     *
+     * @since S60 5.0
+     * @param aCmd Array of supported commands
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetSupportedCommands( RPointerArray<HBufC8>& aCmds ) = 0;
+
+    /**
+     * Returns plugin's character value settings (from CATExtPluginBase)
+     *
+     * @since S60 5.0
+     * @param aCharType Character's type
+     * @param aChar Character's value matching aCharType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar ) = 0;
+
+    /**
+     * Returns plugin's mode value settings (from CATExtPluginBase)
+     *
+     * @since S60 5.0
+     * @param aModeType Mode type
+     * @param aMode Mode value matching aModeType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetModeValue( TModeTypes aModeType, TBool& aMode ) = 0;
+
+    };
+
+/**
+ *  Class for selecting handlers for different AT commands
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CLcCustomPlugin ) : public CATExtPluginBase,
+                                       public MLcCustomPlugin
+    {
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @return Instance of self
+     */
+    static CLcCustomPlugin* NewL();
+
+    /**
+    * Destructor.
+    */
+    virtual ~CLcCustomPlugin();
+
+private:
+
+    CLcCustomPlugin();
+
+    void ConstructL();
+
+    /**
+     * Reports connection identifier name to the extension plugin.
+     *
+     * @since S60 5.0
+     * @param aName Connection identifier name
+     * @return None
+     */
+    void ReportConnectionName( const TDesC8& aName );
+
+    /**
+     * Reports the support status of an AT command. This is a synchronous API.
+     *
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. E.g. in BT HFP case, the command may contain
+     *             a character carriage return (<cr>) in the end.
+     * @return ETrue if the command is supported; EFalse otherwise.
+     */
+    TBool IsCommandSupported( const TDesC8& aCmd );
+
+    /**
+     * Handles an AT command. Cancelling of the pending request is done by
+     * HandleCommandCancel(). The implementation in the extension plugin should
+     * be asynchronous.
+     *
+     * The extension plugin which accepts this command is responsible to supply
+     * the result codes and response and to format result codes properly, e.g.
+     * in BT HFP case, the format should be <cr><lf><result code><cr><lf>
+     *
+     * After an extension plugin has handled or decided to reject the given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with a proper
+     * error code.
+     *
+     * @since S60 5.0
+     * @param aCmd The AT command to be handled. Its format may vary depending
+     *             on the specification. E.g. in BT HFP case, the command may
+     *             contain a character carriage return (<cr>) in the end.
+     * @param aReply When passed in, contains the built in answer filled by
+     *               ATEXT if it is not empty; when command handling completes
+     *               successfully, contains the result codes and responses to
+     *               this command; Its ownership always belongs to ATEXT, plugin
+     *               may reallocate its space when needed.
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse,
+     *                     the aReply must not contain the reply, otherwise it
+     *                     must contain verbose or numeric reply (ATV0/1) or an
+     *                     empty string reply (with ATQ).
+     * @return None
+     */
+    void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+
+    /**
+     * Cancels a pending HandleCommand request.
+     *
+     * @since S60 5.0
+     * @return None
+     */
+    void HandleCommandCancel();
+
+    /**
+     * Next reply part's length.
+     * The value must be equal or less than KDefaultCmdBufLength.
+     * When the reply from this method is zero, ATEXT stops calling
+     * GetNextPartOfReply().
+     *
+     * @since S60 5.0
+     * @return Next reply part's length if zero or positive
+     */
+    TInt NextReplyPartLength();
+
+    /**
+     * Gets the next part of reply initially set by HandleCommandComplete().
+     * Length of aNextReply must be equal or less than KDefaultCmdBufLength.
+     *
+     * @since S60 5.0
+     * @param aNextReply Next reply
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetNextPartOfReply( RBuf8& aNextReply );
+
+    /**
+     * Receives unsolicited results. Cancelling of the pending request is done
+     * by ReceiveUnsolicitedResultCancel(). The implementation in the extension
+     * plugin should be asynchronous.
+     *
+     * @since S60 5.0
+     * @return None
+     */
+    void ReceiveUnsolicitedResult();
+
+    /**
+     * Cancels a pending ReceiveUnsolicitedResult request.
+     *
+     * @since S60 5.0
+     * @return None
+     */
+    void ReceiveUnsolicitedResultCancel();
+
+    /**
+     * Reports NVRAM status change to the plugins.
+     *
+     * @since S60 5.0
+     * @param aNvram New NVRAM status. Each call of this function is a result
+     *               of DUN extracting the form notified by
+     *               CATExtCommonBase::SendNvramStatusChange(). Each of the
+     *               settings from SendNvramStatusChange() is separated to
+     *               one call of ReportNvramStatusChange().
+     * @return None
+     */
+    void ReportNvramStatusChange( const TDesC8& aNvram );
+
+    /**
+     * Reports about external handle command error condition.
+     * This is for cases when for example DUN decided the reply contained an
+     * error condition but the plugin is still handling the command internally.
+     * Example: in command line "AT+TEST;ATDT1234" was given. "AT+TEST" returns
+     * "OK" and "ATDT" returns "CONNECT". Because "OK" and "CONNECT" are
+     * different reply types the condition is "ERROR" and DUN ends processing.
+     * This solution keeps the pointer to the last AT command handling plugin
+     * inside ATEXT and calls this function there to report the error.
+     * It is to be noted that HandleCommandCancel() is not sufficient to stop
+     * the processing as the command handling has already finished.
+     *
+     * @since S60 5.0
+     * @return None
+     */
+    void ReportExternalHandleCommandError();
+
+    /**
+     * Creates part of reply from the global reply buffer to the destination
+     * buffer. Used with APIs which need the next part of reply in multipart
+     * reply requests.
+     *
+     * @since S60 5.0
+     * @param aDstBuffer Destination buffer; the next part of reply is stored to
+     *                   this buffer.
+     * @return None
+     */
+    TInt CreatePartOfReply( RBuf8& aDstBuffer );
+
+// from base class MLcCustomPlugin
+
+    /**
+     * From MLcCustomPlugin.
+     * Creates an AT command reply based on the reply type and completes the
+     * request to ATEXT. Uses iReplyBuffer for reply storage.
+     *
+     * @since S60 5.0
+     * @param aReplyType Type of reply
+     * @param aSrcBuffer Source buffer; used only if aReplyType is EReplyTypeOther
+     * @param aError Completion code. If not KErrNone then other arguments are
+     *               ignored and the request is completed to ATEXT with
+     *               EReplyTypeUndefined.
+     * @return None
+     */
+    TInt CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                 const TDesC8& aSrcBuffer=KNullDesC8,
+                                 TInt aError=KErrNone );
+
+    /**
+     * From MLcCustomPlugin.
+     * Creates a buffer for "OK" or "ERROR" reply based on the line settings
+     *
+     * @since S60 5.0
+     * @param aReplyBuffer Destination buffer for the created reply
+     * @param aOkReply ETrue if "OK" reply needed,
+     *                 EFalse if "ERROR" reply needed
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                               TBool aOkReply );
+
+    /**
+     * From MLcCustomPlugin.
+     * Checks if the command is a base, set, read or test type of command
+     *
+     * @since S60 5.0
+     * @param aCmdBase Base part of the command to check
+     * @param aCmdFull Full command to check
+     * @return Type of command
+     */
+    TCmdHandlerType CheckCommandType( const TDesC8& aCmdBase,
+                                      const TDesC8& aCmdFull );
+
+    /**
+     * From MLcCustomPlugin.
+     * Returns the array of supported commands
+     *
+     * @since S60 5.0
+     * @param aCmd Array of supported commands
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetSupportedCommands( RPointerArray<HBufC8>& aCmds );
+
+    /**
+     * From MLcCustomPlugin.
+     * Returns plugin's character value settings (from CATExtPluginBase)
+     *
+     * @since S60 5.0
+     * @param aCharType Character's type
+     * @param aChar Character's value matching aCharType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar );
+
+    /**
+     * From MLcCustomPlugin.
+     * Returns plugin's mode value settings (from CATExtPluginBase)
+     *
+     * @since S60 5.0
+     * @param aModeType Mode type
+     * @param aMode Mode value matching aModeType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetModeValue( TModeTypes aModeType, TBool& aMode );
+
+private:  // data
+
+    /**
+     * AT commands handler array. Used for mapping HandleCommand() to
+     * IsCommandSupported() and to limit the number of string comparisons.
+     */
+    RPointerArray<CLcCustomPluginBase> iHandlers;
+
+    /**
+     * Current AT command handler in iHandlers.
+     * Used when IsCommandSupported() detects a matching handler class.
+     */
+    CLcCustomPluginBase* iHandler;
+
+    /**
+     * Buffer for handle command's command
+     * Not own.
+     */
+    const TDesC8* iHcCmd;
+
+    /**
+     * Buffer for handle command reply
+     * Not own.
+     */
+    RBuf8* iHcReply;
+
+    /**
+     * Global reply buffer for the AT command replies
+     */
+    RBuf8 iReplyBuffer;
+
+    };
+
+#endif  // C_LCCUSTOMPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/inc/lclistallcmd.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,146 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Handles the commands "AT+CLAC=?" and "AT+CLAC"
+*
+*/
+
+#ifndef C_LCLISTALLCMD_H
+#define C_LCLISTALLCMD_H
+
+#include "lccustomplugin.h"
+
+/**
+ *  Class for handling commands "AT+CLAC=?" and "AT+CLAC"
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CLcListAllCmd ) : public CLcCustomPluginBase
+{
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @param aCallback Callback
+     * @return Instance of self
+     */
+    static CLcListAllCmd* NewL( MLcCustomPlugin* aCallback );
+
+    /**
+    * Destructor.
+    */
+    virtual ~CLcListAllCmd();
+
+private:
+
+    CLcListAllCmd( MLcCustomPlugin* aCallback );
+
+    void ConstructL();
+
+    /**
+     * Checks command types
+     *
+     * @since TB9.2
+     * @param aCmd Command to check
+     * @return ETrue if command understood, EFalse otherwise
+     */
+    TBool CheckCommand( const TDesC8& aCmd );
+
+    /**
+     * Main command handler (leaving version)
+     *
+     * @since TB9.2
+     * @return ETrue if command understood, EFalse otherwise
+     */
+    TBool HandleCommandL();
+
+// from base class MLcCustomPluginBase
+
+    /**
+     * Reports the support status of an AT command. This is a synchronous API.
+     *
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. E.g. in BT HFP case, the command may contain
+     *             a character carriage return (<cr>) in the end.
+     * @return ETrue if the command is supported; EFalse otherwise.
+     */
+    TBool IsCommandSupported( const TDesC8& aCmd );
+
+    /**
+     * Handles an AT command. Cancelling of the pending request is done by
+     * HandleCommandCancel(). The implementation in the extension plugin should
+     * be asynchronous.
+     *
+     * The extension plugin which accepts this command is responsible to supply
+     * the result codes and response and to format result codes properly, e.g.
+     * in BT HFP case, the format should be <cr><lf><result code><cr><lf>
+     *
+     * After an extension plugin has handled or decided to reject the given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with a proper
+     * error code.
+     *
+     * @since S60 5.0
+     * @param aCmd The AT command to be handled. Its format may vary depending
+     *             on the specification. E.g. in BT HFP case, the command may
+     *             contain a character carriage return (<cr>) in the end.
+     * @param aReply When passed in, contains the built in answer filled by
+     *               ATEXT if it is not empty; when command handling completes
+     *               successfully, contains the result codes and responses to
+     *               this command; Its ownership always belongs to ATEXT, plugin
+     *               may reallocate its space when needed.
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse,
+     *                     the aReply must not contain the reply, otherwise it
+     *                     must contain verbose or numeric reply (ATV0/1) or an
+     *                     empty string reply (with ATQ).
+     * @return None
+     */
+    void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+
+    /**
+     * Cancels a pending HandleCommand request.
+     *
+     * @since S60 5.0
+     * @return None
+     */
+    void HandleCommandCancel();
+
+    /**
+     * Creates a linearized list of supported commands
+     *
+     * @since S60 5.0
+     * @param aReply List of supported commands
+     * @return ETrue if "ERROR" condition detected, EFalse otherwise
+     */
+    TBool CreateSupportedList( RBuf8& aReply );
+
+private:  // data
+
+    /**
+     * Callback to call when accessing plugin information
+     */
+    MLcCustomPlugin* iCallback;
+
+    /**
+     * Handler type for the two AT commands
+     */
+    TCmdHandlerType iCmdHandlerType;
+
+    /**
+     * Detected command
+     */
+    TDetectedCmd iDetectedCmd;
+
+};
+
+#endif  // C_LCLISTALLCMD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/inc/prjconfig.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 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:  Project configure file
+*
+*/
+
+
+#ifndef ATEXT_PRJCONFIG_H
+#define ATEXT_PRJCONFIG_H
+
+/**
+ * Traces are enabled in _DEBUG build, by default.
+ */
+#ifdef _DEBUG
+#define PRJ_ENABLE_TRACE
+#endif
+
+/**
+ * traces to file if this is defined.
+ */
+//#define PRJ_FILE_TRACE
+
+
+/**
+ * build the project for module test purpose if this is defined
+ */
+//#define PRJ_MODULETEST_BUILD
+
+/**
+ * build the project using stubs to replace the dependencies if this is defined
+ */
+//#define PRJ_USE_STUB
+
+
+#endif // ATEXT_PRJCONFIG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/rom/lccustomplugin.iby	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* 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:  Image description file for project LCCustomPlugin
+*
+*/
+
+
+#ifndef __LCCUSTOMPLUGIN_IBY__
+#define __LCCUSTOMPLUGIN_IBY__
+
+ECOM_PLUGIN( lccustomplugin.dll, lccustomplugin.rsc )
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/src/20021360.rss	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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:  Resource definitions for project lccustomplugin
+*
+*/
+
+
+#include <atext_interfaceuid.h>
+#include <registryinfo.rh>
+
+// Declares info for two implementations
+RESOURCE REGISTRY_INFO theInfo
+	{
+	// UID for the DLL
+	dll_uid = 0x20021360;
+	// Declare array of interface info
+	interfaces =
+		{
+		INTERFACE_INFO
+			{
+			// UID of interface that is implemented
+			interface_uid = ATEXT_INTERFACE_DUN_UID; 
+			implementations =
+				{
+				// Info for BTSAC
+				IMPLEMENTATION_INFO
+					{
+					implementation_uid = 0x20021375;
+					version_no = 1;
+					display_name = "LC Custom Plugin DUN";
+					default_data=  "MAT+CLAC";
+					opaque_data = "";
+					}
+				};
+			},
+		INTERFACE_INFO
+			{
+			// UID of interface that is implemented
+			interface_uid = ATEXT_INTERFACE_HFP_UID; 
+			implementations =
+				{
+				// Info for BTSAC
+				IMPLEMENTATION_INFO
+					{
+					implementation_uid = 0x20021376;
+					version_no = 1;
+					display_name = "LC Custom Plugin HFP";
+					default_data=  "MAT+CLAC";
+					opaque_data = "";
+					}
+				};
+			}
+		};
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/src/lccustomplugin.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,476 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Main handler for incoming requests
+*
+*/
+
+#include "lccustomplugin.h"
+#include "lclistallcmd.h"
+#include "debug.h"
+
+const TInt KErrorReplyLength = 9;  // CR+LF+"ERROR"+CR+LF
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CLcCustomPlugin* CLcCustomPlugin::NewL()
+    {
+    CLcCustomPlugin* self = new (ELeave) CLcCustomPlugin();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CLcCustomPlugin::~CLcCustomPlugin()
+	{
+	iHandlers.ResetAndDestroy();
+	iHandlers.Close();
+    iReplyBuffer.Close();
+	}
+
+// ---------------------------------------------------------------------------
+// CLcCustomPlugin::CLcCustomPlugin
+// ---------------------------------------------------------------------------
+//
+CLcCustomPlugin::CLcCustomPlugin() : CATExtPluginBase()
+    {
+    iHandler = NULL;
+    iHcCmd = NULL;
+    iHcReply = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CLcCustomPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::ConstructL()
+    {
+    CLcCustomPluginBase* handler = NULL;
+    handler = CLcListAllCmd::NewL( this );
+    CleanupStack::PushL( handler );
+    iHandlers.AppendL( handler );
+    CleanupStack::Pop( handler );
+   	}
+
+// ---------------------------------------------------------------------------
+// Reports connection identifier name to the extension plugin.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::ReportConnectionName( const TDesC8& /*aName*/ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Reports the support status of an AT command. This is a synchronous API.
+// ---------------------------------------------------------------------------
+//
+TBool CLcCustomPlugin::IsCommandSupported( const TDesC8& aCmd )
+    {
+    TRACE_FUNC_ENTRY
+    iHcCmd = NULL;
+    iHcReply = NULL;
+    TInt i;
+    TInt count = iHandlers.Count();
+    for ( i=0; i<count; i++ )
+        {
+        CLcCustomPluginBase* handler = iHandlers[i];
+        TBool supported = handler->IsCommandSupported( aCmd );
+        if ( supported )
+            {
+            iHandler = handler;
+            TRACE_FUNC_EXIT
+            return ETrue;
+            }
+        }
+    iHandler = NULL;
+    TRACE_FUNC_EXIT
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles an AT command. Cancelling of the pending request is done by
+// HandleCommandCancel(). The implementation in the extension plugin should
+// be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::HandleCommand( const TDesC8& aCmd,
+                                     RBuf8& aReply,
+                                     TBool aReplyNeeded )
+	{
+	TRACE_FUNC_ENTRY
+	if ( iHandler )
+	    {
+	    iHcCmd = &aCmd;
+	    iHcReply = &aReply;
+	    iHandler->HandleCommand( aCmd, aReply, aReplyNeeded );
+	    }
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending HandleCommand request.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+	if ( iHandler )
+	    {
+	    iHandler->HandleCommandCancel();
+	    }
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Next reply part's length.
+// The value must be equal or less than KDefaultCmdBufLength.
+// When the reply from this method is zero, ATEXT stops calling
+// GetNextPartOfReply().
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::NextReplyPartLength()
+    {
+    TRACE_FUNC_ENTRY
+    if ( iReplyBuffer.Length() < KDefaultCmdBufLength )
+        {
+        TRACE_FUNC_EXIT
+        return iReplyBuffer.Length();
+        }
+    TRACE_FUNC_EXIT
+    return KDefaultCmdBufLength;
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the next part of reply initially set by HandleCommandComplete().
+// Length of aNextReply must be equal or less than KDefaultCmdBufLength.
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::GetNextPartOfReply( RBuf8& aNextReply )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = CreatePartOfReply( aNextReply );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// Receives unsolicited results. Cancelling of the pending request is done by
+// by ReceiveUnsolicitedResultCancel(). The implementation in the extension
+// plugin should be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::ReceiveUnsolicitedResult()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending ReceiveUnsolicitedResult request.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::ReceiveUnsolicitedResultCancel()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports NVRAM status change to the plugins.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::ReportNvramStatusChange( const TDesC8& /*aNvram*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports about external handle command error condition.
+// This is for cases when for example DUN decided the reply contained an
+// error condition but the plugin is still handling the command internally.
+// Example: "AT+TEST;+TEST2" was given in command line; "AT+TEST" returns
+// non-EReplyTypeError condition and "AT+TEST2" returns EReplyTypeError.
+// As the plugin(s) returning the non-EReplyTypeError may still have some
+// ongoing operation then these plugins are notified about the external
+// EReplyTypeError in command line processing. It is to be noted that
+// HandleCommandCancel() is not sufficient to stop the processing as the
+// command handling has already finished.
+// ---------------------------------------------------------------------------
+//
+void CLcCustomPlugin::ReportExternalHandleCommandError()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Creates part of reply from the global reply buffer to the destination
+// buffer. Used with APIs which need the next part of reply in multipart reply
+// requests.
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::CreatePartOfReply( RBuf8& aDstBuffer )
+    {
+    TRACE_FUNC_ENTRY
+    if ( iReplyBuffer.Length() <= 0 )
+        {
+        TRACE_FUNC_EXIT
+        return KErrGeneral;
+        }
+    TInt partLength = NextReplyPartLength();
+    if ( iReplyBuffer.Length() < partLength )
+        {
+        TRACE_FUNC_EXIT
+        return KErrNotFound;
+        }
+    aDstBuffer.Create( iReplyBuffer, partLength );
+    iReplyBuffer.Delete( 0, partLength );
+    if ( iReplyBuffer.Length() == 0 )
+        {
+        iReplyBuffer.Close();
+        }
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates an AT command reply based on the reply type and completes the
+// request to ATEXT. Uses iReplyBuffer for reply storage.
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                              const TDesC8& aSrcBuffer,
+											  TInt aError )
+    {
+    TRACE_FUNC_ENTRY
+    iReplyBuffer.Close();
+    if ( aError != KErrNone )
+        {
+        HandleCommandCompleted( aError, EReplyTypeUndefined );
+        iHcCmd = NULL;
+        iHcReply = NULL;
+        TRACE_FUNC_EXIT
+        return KErrNone;
+        }
+    if ( !iHcReply )
+        {
+        TRACE_FUNC_EXIT
+        return KErrGeneral;
+        }
+    switch ( aReplyType )
+        {
+        case EReplyTypeOther:
+            if ( iQuietMode )
+                {
+                iReplyBuffer.Create( KNullDesC8 );
+                }
+            else
+                {
+                iReplyBuffer.Create( aSrcBuffer );
+                }
+            break;
+        case EReplyTypeOk:
+            CreateOkOrErrorReply( iReplyBuffer, ETrue );
+            break;
+        case EReplyTypeError:
+            CreateOkOrErrorReply( iReplyBuffer, EFalse );
+            break;
+        default:
+            TRACE_FUNC_EXIT
+            return KErrGeneral;
+        }
+    CreatePartOfReply( *iHcReply );
+    HandleCommandCompleted( KErrNone, aReplyType );
+    iHcCmd = NULL;
+    iHcReply = NULL;
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates a buffer for "OK" or "ERROR" reply based on the line settings
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                                            TBool aOkReply )
+    {
+    TRACE_FUNC_ENTRY
+    if ( iQuietMode )
+        {
+        TRACE_FUNC_EXIT
+        return iReplyBuffer.Create( KNullDesC8 );
+        }
+    _LIT8( KErrorReplyVerbose, "ERROR" );
+    _LIT8( KOkReplyVerbose,    "OK" );
+    _LIT8( KErrorReplyNumeric, "4" );
+    _LIT8( KOkReplyNumeric,    "0" );
+    TBuf8<KErrorReplyLength> replyBuffer;
+    if ( iVerboseMode )
+        {
+        replyBuffer.Append( iCarriageReturn );
+        replyBuffer.Append( iLineFeed );
+        if ( aOkReply )
+            {
+            replyBuffer.Append( KOkReplyVerbose );
+            }
+        else
+            {
+            replyBuffer.Append( KErrorReplyVerbose );
+            }
+        replyBuffer.Append( iCarriageReturn );
+        replyBuffer.Append( iLineFeed );
+        }
+    else
+        {
+        if ( aOkReply )
+            {
+            replyBuffer.Append( KOkReplyNumeric );
+            }
+        else
+            {
+            replyBuffer.Append( KErrorReplyNumeric );
+            }
+        replyBuffer.Append( iCarriageReturn );
+        }
+    TInt retVal = aReplyBuffer.Create( replyBuffer );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Checks if the command is a base, set, read or test type of command
+// ---------------------------------------------------------------------------
+//
+TCmdHandlerType CLcCustomPlugin::CheckCommandType(
+    const TDesC8& aCmdBase,
+    const TDesC8& aCmdFull )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retTemp = KErrNone;
+    TBuf8<KDefaultCmdBufLength> atCmdBuffer;
+    atCmdBuffer.Copy( aCmdBase );
+    // Check "base" command ("AT+COMMAND")
+    retTemp = aCmdFull.Compare( atCmdBuffer );
+    if ( retTemp == 0 )
+        {
+        TRACE_FUNC_EXIT
+        return ECmdHandlerTypeBase;
+        }
+    // Check "read" command ("AT+COMMAND?")
+    // Add last question mark
+    atCmdBuffer.Append( '?' );
+    retTemp = aCmdFull.Compare( atCmdBuffer );
+    if ( retTemp == 0 )
+        {
+        TRACE_FUNC_EXIT
+        return ECmdHandlerTypeRead;
+        }
+    // Check "test" command ("AT+COMMAND=?")
+    // Add "=" before the question mark
+    _LIT8( KAssignmentMark, "=" );
+    atCmdBuffer.Insert( atCmdBuffer.Length()-1, KAssignmentMark );
+    retTemp = aCmdFull.Compare( atCmdBuffer );
+    if ( retTemp == 0 )
+        {
+        TRACE_FUNC_EXIT
+        return ECmdHandlerTypeTest;
+        }
+    // Check "set" command ("AT+COMMAND=")
+    // Remove last question mark
+    atCmdBuffer.SetLength( atCmdBuffer.Length() - 1 );
+    retTemp = aCmdFull.Compare( atCmdBuffer );
+    if ( retTemp == 0 )
+        {
+        TRACE_FUNC_EXIT
+        return ECmdHandlerTypeSet;
+        }
+    TRACE_FUNC_EXIT
+    return ECmdHandlerTypeUndefined;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Returns the array of supported commands
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::GetSupportedCommands( RPointerArray<HBufC8>& aCmds )
+    {
+    TRACE_FUNC_ENTRY
+    // Force superclass call here:
+    TInt retVal = CATExtPluginBase::GetSupportedCommands( aCmds );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Returns plugin's character value settings (from CATExtPluginBase)
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::GetCharacterValue( TCharacterTypes aCharType,
+                                         TChar& aChar )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = KErrNone;
+    switch ( aCharType )
+        {
+        case ECharTypeCR:
+            aChar = iCarriageReturn;
+            break;
+        case ECharTypeLF:
+            aChar = iLineFeed;
+            break;
+        case ECharTypeBS:
+            aChar = iBackspace;
+            break;
+        default:
+            retVal = KErrNotFound;
+            break;
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Returns plugin's mode value settings (from CATExtPluginBase)
+// ---------------------------------------------------------------------------
+//
+TInt CLcCustomPlugin::GetModeValue( TModeTypes aModeType, TBool& aMode )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = KErrNone;
+    switch ( aModeType )
+        {
+        case EModeTypeQuiet:
+            aMode = iQuietMode;
+            break;
+        case EModeTypeVerbose:
+            aMode = iVerboseMode;
+            break;
+        default:
+            retVal = KErrNotFound;
+            break;
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/src/lclistallcmd.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,239 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Handles the commands "AT+CLAC?" and "AT+CLAC"
+*
+*/
+
+#include "lclistallcmd.h"
+#include "debug.h"
+
+const TInt KCrLfLength    = 2;  // CR+LF
+const TInt KOkReplyLength = 6;  // CR+LF+"OK"+CR+LF
+
+_LIT8( KClacCmd, "AT+CLAC" );
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CLcListAllCmd* CLcListAllCmd::NewL( MLcCustomPlugin* aCallback )
+    {
+    CLcListAllCmd* self = new (ELeave) CLcListAllCmd( aCallback );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CLcListAllCmd::~CLcListAllCmd()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CLcListAllCmd::CLcListAllCmd
+// ---------------------------------------------------------------------------
+//
+CLcListAllCmd::CLcListAllCmd( MLcCustomPlugin* aCallback ) :
+    iCallback( aCallback )
+    {
+    iCmdHandlerType = ECmdHandlerTypeUndefined;
+    }
+
+// ---------------------------------------------------------------------------
+// CLcListAllCmd::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CLcListAllCmd::ConstructL()
+    {
+    if ( !iCallback )
+        {
+        User::Leave( KErrGeneral );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Checks command types
+// ---------------------------------------------------------------------------
+//
+TBool CLcListAllCmd::CheckCommand( const TDesC8& aCmd )
+    {
+    TRACE_FUNC_ENTRY
+    // The AT+CLAC command supports two types: base and test
+    iCmdHandlerType = iCallback->CheckCommandType( KClacCmd, aCmd );
+    if ( iCmdHandlerType==ECmdHandlerTypeBase ||
+         iCmdHandlerType==ECmdHandlerTypeTest )
+        {
+        iDetectedCmd = EDetectedCmdCLAC;
+        TRACE_FUNC_EXIT
+        return ETrue;
+        }
+    TRACE_FUNC_EXIT
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Reports the support status of an AT command. This is a synchronous API.
+// ---------------------------------------------------------------------------
+//
+TBool CLcListAllCmd::IsCommandSupported( const TDesC8& aCmd )
+    {
+    TRACE_FUNC_ENTRY
+    // Set all to undefined if either the command or its type is unknown
+    // HandleCommand() should be round only when both are set
+    TBool cmdUnderstood = CheckCommand( aCmd );
+    if ( cmdUnderstood )
+        {
+        TRACE_FUNC_EXIT
+        return ETrue;
+        }
+    iCmdHandlerType = ECmdHandlerTypeUndefined;
+    iDetectedCmd = EDetectedCmdUndefined;
+    TRACE_FUNC_EXIT
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles an AT command. Cancelling of the pending request is done by
+// HandleCommandCancel(). The implementation in the extension plugin should
+// be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CLcListAllCmd::HandleCommand( const TDesC8& /*aCmd*/,
+                                   RBuf8& /*aReply*/,
+                                   TBool aReplyNeeded )
+    {
+    TRACE_FUNC_ENTRY
+    if ( !aReplyNeeded )
+        {
+        TRACE_FUNC_EXIT
+        return;
+        }
+    if ( iCmdHandlerType == ECmdHandlerTypeTest )
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeOk );
+        TRACE_FUNC_EXIT
+        return;
+        }
+    // Else here means ECmdHandlerTypeBase
+    // First check the quiet mode and verbose mode.
+    // These are handled in CreateReplyAndComplete()
+    TInt retTemp;
+    TBool quietMode = EFalse;
+    retTemp  = iCallback->GetModeValue( EModeTypeQuiet, quietMode );
+    if ( retTemp != KErrNone )
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeError );
+        TRACE_FUNC_EXIT
+        return;
+        }
+    RBuf8 reply;
+    if ( quietMode )
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeOther, reply );
+        reply.Close();
+        TRACE_FUNC_EXIT
+        return;
+        }
+    TBool error = CreateSupportedList( reply );
+    if ( error )
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeError );
+        reply.Close();
+        TRACE_FUNC_EXIT
+        return;
+        }
+    RBuf8 okReply;
+    iCallback->CreateOkOrErrorReply( okReply, ETrue );
+    reply.Append( okReply );
+    okReply.Close();
+    iCallback->CreateReplyAndComplete( EReplyTypeOther, reply );
+    reply.Close();
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending HandleCommand request.
+// ---------------------------------------------------------------------------
+//
+void CLcListAllCmd::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Creates a linearized list of supported commands
+// ---------------------------------------------------------------------------
+//
+TBool CLcListAllCmd::CreateSupportedList( RBuf8& aReply )
+    {
+    TRACE_FUNC_ENTRY
+    // First get the unsorted list from ATEXT
+    RPointerArray<HBufC8> commands;
+    iCallback->GetSupportedCommands( commands );
+    // Next linearize the list for a reply
+    if ( commands.Count() <= 0 )
+        {
+        commands.Close();
+        TRACE_FUNC_EXIT
+        return EFalse;
+        }
+    TInt i;
+    TInt linearSize = KOkReplyLength;
+    TInt count = commands.Count();
+    for ( i=0; i<count; i++ )
+        {
+        linearSize += (*commands[i]).Length();
+        if ( i < count-1 )
+            {
+            linearSize += KCrLfLength;
+            }
+        }
+    linearSize += KCrLfLength;
+    // Now we have the length of the linear region,
+    // use that to create the reply
+    TChar carriageReturn;
+    TChar lineFeed;
+    TInt retTemp;
+    retTemp  = aReply.Create( linearSize );
+    retTemp |= iCallback->GetCharacterValue( ECharTypeCR, carriageReturn );
+    retTemp |= iCallback->GetCharacterValue( ECharTypeLF, lineFeed );
+    if ( retTemp != KErrNone )
+        {
+        commands.ResetAndDestroy();
+        commands.Close();
+        TRACE_FUNC_EXIT
+        return ETrue;
+        }
+    for ( i=0; i<count; i++ )
+        {
+        aReply.Append( *commands[i] );
+        if ( i < count-1 )
+            {
+            aReply.Append( carriageReturn );
+            aReply.Append( lineFeed );
+            }
+        }
+    aReply.Append( carriageReturn );
+    aReply.Append( lineFeed );
+    // Delete the array as it is no longer needed
+    commands.ResetAndDestroy();
+    commands.Close();
+    TRACE_FUNC_EXIT
+    return EFalse;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/lccustomplugin/src/proxy.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,49 @@
+/*
+* 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:  Export ECom interface implementations
+*
+*/
+
+
+#ifndef REFERENCE_ATEXT_H
+#define REFERENCE_ATEXT_H
+
+#include <e32base.h>
+#include <ecom/implementationproxy.h>
+#include "lccustomplugin.h"
+
+// ---------------------------------------------------------------------------
+// An array of TImplementationProxy objects which onnect each
+// implemeation with its instantiation function
+// ---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(0x20021375, CLcCustomPlugin::NewL),  // DUN
+	IMPLEMENTATION_PROXY_ENTRY(0x20021376, CLcCustomPlugin::NewL)   // HFP
+	};
+
+// ---------------------------------------------------------------------------
+// Exported proxy function to resolve instantiation methods for an Ecom
+// plug-in DLL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+	return ImplementationTable;
+	}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,29 @@
+/*
+* 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:  This file provides the information required for building the
+*                modem at plugin
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+../rom/modematplugin.iby         CORE_MW_LAYER_IBY_EXPORT_PATH(modematplugin.iby)
+
+PRJ_MMPFILES
+modematplugin.mmp
+
+PRJ_TESTMMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/group/modematplugin.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,51 @@
+/*
+* 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:  Project definition file for project modematplugin
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET                  modematplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x20029FBF 
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  proxy.cpp
+SOURCE                  modematplugin.cpp
+SOURCE                  atcopscmd.cpp
+
+START RESOURCE          ../src/20029fbf.rss  
+TARGET                  modematplugin.rsc
+END
+
+USERINCLUDE             ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE           /epoc32/include/ecom
+
+LIBRARY	ECom.lib
+LIBRARY euser.lib
+LIBRARY atextpluginbase.lib
+LIBRARY etelmm.lib 
+LIBRARY etel.lib
+LIBRARY etelpckt.lib
+LIBRARY customapi.lib
+
+DEBUGLIBRARY flogger.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/inc/atcopscmd.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,434 @@
+/*
+* 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:  Handles the commands "AT+COPS=..." and "AT+COPS?"
+*
+*/
+
+
+#ifndef C_CATCOPSCMD_H
+#define C_CATCOPSCMD_H
+
+#include <e32base.h>
+#include <e32cmn.h>
+#include <rmmcustomapi.h>
+#include <etelpckt.h>
+#include <etelmm.h>
+#include <mmretrieve.h>
+#include "modematplugin.h"
+
+class MCmdPluginObserver; 
+class CRetrieveMobilePhoneDetectedNetworks; 
+
+/**  Handler types for the AT commands */
+enum TCmdHandlerType
+    {
+    ECmdHandlerTypeUndefined,
+    ECmdHandlerTypeTest,  // For command "AT+COPS=?"
+    ECmdHandlerTypeRead,  // For command "AT+COPS?"
+    ECmdHandlerTypeSet    // For command "AT+COPS=..."
+    };
+
+/**  Keeps track of the current operation for the state machine */
+enum TCurrentOperation
+    {
+    EIdle 										= 0, 
+    EInspectModeAndProcessCommand 				= 1,
+    EAutomaticallyRegisterToNetwork 			= 2,
+    EManuallyRegisterToNetwork 					= 3,
+    EManuallyRegisterToNetworkAndChooseAccTech 	= 4,
+    EGetNetworkInfoOperatorName 				= 5, 
+    ESetSystemNetworkBand 						= 6, 
+    EUpdateAvailableNetworkOperators 			= 7, 
+    EListAvailableNetworkOperators 				= 8    
+    };
+
+/** These are in the same order as in 3GPP TS 27.007 V8.4.1  */ 
+enum TOperatorFormat
+    {
+    EFormatLong, 
+    EFormatShort, 
+    EFormatNumeric  
+    }; 
+
+/** These are in the same order as in 3GPP TS 27.007 V8.4.1  */ 
+enum TNetworkRegistrationMode
+    {
+    EModeAutomatic, 
+    EModeManual, 
+    EModeDeregister, 
+    EModeSetFormatParameter, 
+    EModeManualAutomatic, 
+    }; 
+
+/** Currently selected access technology for outgoing replies. 
+*		S60 uses definitions from RMobilePhone class, but they are 
+* 	in diffent order and cannot be used directly. 
+*		These are in the same order as in 3GPP TS 27.007 V8.4.1  */ 
+enum TAccessTechnology
+    {
+    EGSM 					= 0, 
+    EGSMCompact 			= 1,  
+    EUDMA 					= 2, 
+    EGSMwithEGPRS 			= 3, 
+    EHSDPA 					= 4, 
+    EHSUPA 					= 5,  
+    EUDMAwithHSDPAandHSUPA 	= 6, 
+    EAccTechNotSet 			= 255
+    }; 
+
+/**
+ *  Class for handling commands "AT+COPS?" and "AT+COPS=..."
+ *
+ *  @since TB9.2
+ */
+NONSHARABLE_CLASS( CATCOPSCmd ) : public CActive, public CATCommandHandlerBase    
+{
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @param aCallback Callback
+     * @return Instance of self
+     */
+    static CATCOPSCmd* NewL( MCmdPluginObserver* aCallback );
+
+    /**
+    * Destructor.
+    */
+    virtual ~CATCOPSCmd();
+
+protected:
+    /**
+    * From CActive. Called when asynchronous request completes.
+    * @since TB9.2
+    * @param None
+    * @return None
+    */
+    virtual void RunL();
+         
+    virtual void DoCancel();
+
+private:
+
+    CATCOPSCmd( MCmdPluginObserver* aCallback );
+
+    void ConstructL();
+
+    /**
+     * Reports the support status of an AT command. This is a synchronous API.
+     *
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. E.g. in BT HFP case, the command may contain
+     *             a character carriage return (<cr>) in the end.
+     * @return ETrue if the command is supported; EFalse otherwise.
+     */
+    TBool IsCommandSupported( const TDesC8& aCmd );
+
+    /**
+     * Handles an AT command. Cancelling of the pending request is done by
+     * HandleCommandCancel(). The implementation in the extension plugin should
+     * be asynchronous.
+     *
+     * The extension plugin which accepts this command is responsible to supply
+     * the result codes and response and to format result codes properly, e.g.
+     * in BT HFP case, the format should be <cr><lf><result code><cr><lf>
+     *
+     * After an extension plugin has handled or decided to reject the given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with a proper
+     * error code.
+     *
+     * @since TB9.2
+     * @param aCmd The AT command to be handled. Its format may vary depending
+     *             on the specification. E.g. in BT HFP case, the command may
+     *             contain a character carriage return (<cr>) in the end.
+     * @param aReply When passed in, contains the built in answer filled by
+     *               ATEXT if it is not empty; when command handling completes
+     *               successfully, contains the result codes and responses to
+     *               this command; Its ownership always belongs to ATEXT, plugin
+     *               may reallocate its space when needed.
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse,
+     *                     the aReply must not contain the reply, otherwise it
+     *                     must contain verbose or numeric reply (ATV0/1) or an
+     *                     empty string reply (with ATQ).
+     * @return None
+     */
+    void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+
+    /**
+     * Cancels a pending HandleCommand request.
+     *
+     * @since TB9.2
+     * @return None
+     */
+    void HandleCommandCancel();
+
+
+private: 
+
+
+    void HandleCommandTest( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    void HandleCommandRead( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    void HandleCommandSet( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+
+    void HandleError(); 
+
+    /**
+     * This method parses the parameter part of command and populates 
+     * iParamArray class member. Quotation marks are removed in process. 
+     *
+     * @since TB9.2
+     * @param aCmd The AT command. 
+     * @return Leaves in out of memory case. 
+     */
+    void ExtractParametersL(const TDesC8& aCmd); 
+
+    /**
+     * This method strips all quotation parms from the string passed in. 
+     *
+     * @since TB9.2
+     * @param aParameter one parameter from AT command as extracted by ExtractParametersL. 
+     * @return None
+     */
+    void RemoveQuotationMarks(TPtr8& aParameter); 
+
+    /**
+     * This method returns the selected mode in aMode. 
+     * It also checks that there are enough parameters for the mode in question. 
+     *
+     * @since TB9.2
+     * @param aParameter one parameter from AT command as extracted by ExtractParametersL. 
+     * @param aMode contains the converted parameter if method completed successfully. 
+     * @return 	KErrArgument if mode is invalid or there is not enough parameters. 
+     *					KErrNone if iParamArray contains all the parameters the mode requires. 
+     */
+    TInt GetModeAndCheckParameterCount(const TDesC8& aParameter, TNetworkRegistrationMode &aMode); 
+
+    /**
+     * This method converts an AT command parameter to numeric format value and checks it is valid. 
+     *
+     * @since TB9.2
+     * @param aParameter one parameter from AT command as extracted by ExtractParametersL. 
+     * @param aFormat contains the converted parameter if method completed successfully. 
+     * @return 	KErrArgument if format is invalid. 
+     *					KErrNone if format is valid. 
+     */
+    TInt GetFormatFromParameter(const TDesC8& aParameter, RMmCustomAPI::TOperatorNameType &aFormat);  
+
+    /**
+     * This method converts an AT command parameter to numeric access technology value and checks it is valid. 
+     *
+     * @since TB9.2
+     * @param aParameter one parameter from AT command as extracted by ExtractParametersL. 
+     * @param aAccTech contains the converted parameter if method completed successfully. 
+     * @return 	KErrArgument if acc. tech. is invalid. 
+     *					KErrNone if acc. tech. is valid. 
+     */
+    TInt GetAccTechFromParameter(const TDesC8& aParameter, TAccessTechnology &aAccTech); 
+    
+    /**
+     * This method converts an AT command parameter to ETel compatible operator values 
+     *
+     * @since TB9.2
+     * @param aDetectedNetworks contains the list of networks. May be NULL. 
+     * @param aFormat contains the format (numeric/text) of operator parameter. 
+     * @param aOperatorParameter contains the operator parameter string. 
+     * @param aMcc contains the converted parameter if method completed successfully. 
+     * @param aMnc contains the converted parameter if method completed successfully. 
+     * @return 	KErrArgument 	if operator parameter invalid, 
+     *					KErrNotFound 	if operator list exists but the operator is not in it, 
+     *												or the operator list is missing. (Required if aFormat is text.) 
+     *					KErrNone if conversion succeeds. aMcc and aMnc contain ETel compatible operator values. 
+     */
+    TInt ConvertOperatorToMccMnc(const CMobilePhoneNetworkListV2 *aDetectedNetworks,
+                                            const RMmCustomAPI::TOperatorNameType aFormat, 
+                                            const TBuf<KMaxOperatorNameLength>& aOperatorParameter, 
+                                            RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
+                                            RMobilePhone::TMobilePhoneNetworkIdentity& aMnc); 
+
+    /**
+     * This method initiates an automatic network registration.  
+     *
+     * @since TB9.2
+     * @return 	None
+     */
+    void AutomaticNetworkRegistration(); 
+
+    /**
+     * This method initiates a manual network registration.  
+     *
+     * @since TB9.2
+     * @param aMcc contains the country code part of ETel operator info. 
+     * @param aMnc contains the network code part of ETel operator info. 
+     * @return 	None
+     */
+    void ManualNetworkRegistration(const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
+                                   const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc); 
+
+    /**
+     * This method initiates a manual network registration and access technology selection.  
+     *
+     * @since TB9.2
+     * @param aMcc contains the country code part of ETel operator info. 
+     * @param aMnc contains the network code part of ETel operator info. 
+     * @param aAccTech contains the access technology in ETel compatible format. 
+     * @return 	None
+     */
+    void ManualNetworkRegistration(	const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
+                                    const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc, 
+                                    const TAccessTechnology aAccTech); 
+
+    /**
+     * This is a helper function used by RunL 
+     *
+     * @since TB9.2
+     * @return 	standard Symbian OS return code. 
+     */
+    TInt InspectModeAndProcessCommand(); 
+
+    /**
+     * This method contructs a response for the test command. 
+     *
+     * @since TB9.2
+     * @return 	None. Leaves with standar symbian OS error code on error.  
+     */
+    void ConstructNetworkListResponseL(); 
+
+    /**
+     * This method contructs a response for the read command. 
+     *
+     * @since TB9.2
+     * @return 	standard Symbian OS return code. 
+     */
+    TInt ConstructNetworkInfoResponse(); 
+
+    /**
+     * This helper method converts the ETel access technology into 
+     * 3GPP TS 27.007 V8.4.1 compatible format. 
+     *
+     * @since TB9.2
+     * @param aAccTech contains the access technology in ETel compatible format. 
+     * @return 	Standard Symbian OS return code. 
+     */
+    TInt SolveAccessTechnology(RMobilePhone::TMobilePhoneNetworkAccess &aAccessTech); 
+
+    /**
+     * This helper method finalises the response and sends it. 
+     *
+     * @since TB9.2
+     * @param aIsOK tells whether to create an OK or ERROR response. 
+     * @param aReply contains the response string to be sent before OK, if any. 
+     * @return 	None
+     */
+    void CreateReply(TBool aIsOK, const TDesC8 &aReply = KNullDesC8); 
+
+private:  // data
+
+    /**
+     * Callback to call when accessing plugin information
+     */
+    MCmdPluginObserver* iCallback;
+
+    /**
+     * Handler type for the three AT commands
+     */
+    TCmdHandlerType iCmdHandlerType;
+
+    /**
+     * Telephony server instance. 
+     */
+	RTelServer iServer;
+
+    /**
+     * Phone instance, used for network selection. 
+     */
+	RMobilePhone iPhone;
+
+	/**
+     * Telephony Custom API instance, used for setting 
+     * the access technology (only GSM and UDMA supported).  
+     */
+    RMmCustomAPI iCustomApi;
+
+    /**
+     * Current network info collected via the RMobilePhone is stored here.   
+     */
+    RMobilePhone::TMobilePhoneNetworkInfoV2 iNetworkInfo; 
+
+    /**
+     * The parameters extracted from the AT command are stored here. 
+     */
+	RPointerArray<HBufC8> iParamArray; 
+
+    /**
+     * Used for getting the static packet capabilities of the phone. 
+     * This is needed for supporting more detailed access technology. 
+     */
+	RPacketService iPacketService; 
+
+    /**
+     * The format of the operator parameter is stored here. 
+     * it is used both for interpreting the incoming operator and 
+     * responding with correctly formatted outgoing operator info. 
+     * this can be done because it is specified that the latest incoming 
+     * format info is also used for responses from that onwards. 
+     */
+	RMmCustomAPI::TOperatorNameType iFormat; 
+
+    /**
+     * The requested/current network registration mode is stored here. It is used 
+     * also when responding to the Read command. This can be done because the two 
+     * operations are completely independent. 
+     */
+	TNetworkRegistrationMode iRegistrationMode; 
+
+    /**
+     * The requested/current access tehcnology is stored here. It is used 
+     * also when responding to the Read and Test commands. This can be done 
+     * because the operations are completely independent. 
+     */
+	TAccessTechnology iAccTech; 
+
+    /**
+     * The incoming reply buffer is kept here. Not owned. 
+     */
+  RBuf8* iReply; 
+
+    /**
+     * The currently running operation is kept here. 
+     */
+  TCurrentOperation iCurrentOperation; 
+
+    /**
+     * The country code part of ETel compatible operator info. 
+     */
+    RMobilePhone::TMobilePhoneNetworkCountryCode iMcc;  
+
+    /**
+     * The network code part of ETel compatible operator info. 
+     */
+    RMobilePhone::TMobilePhoneNetworkIdentity iMnc; 
+
+    /**
+     * Used for retrieving a list of networks the phone detected. 
+     */
+    CRetrieveMobilePhoneDetectedNetworks *iRetrieveDetectedNetworks; 
+
+    /**
+     * Used for reading the list the CRetrieveMobilePhoneDetectedNetworks returned. 
+     */
+    CMobilePhoneNetworkListV2 *iDetectedNetworks; 
+}; 
+
+#endif  // C_LCLISTALLCMD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/inc/cmdpluginobserver.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,109 @@
+/*
+* 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:  Handles the commands "AT+COPS=..." and "AT+COPS?"
+*
+*/
+
+
+#ifndef M_CMDPLUGINOBSERVER_H
+#define M_CMDPLUGINOBSERVER_H
+
+
+enum TCharacterTypes
+    {
+    ECharTypeCR,  // Carriage return
+    ECharTypeLF,  // Line feed
+    ECharTypeBS   // Backspace
+    };
+
+enum TModeTypes
+    {
+    EModeTypeQuiet,   // Quiet mode
+    EModeTypeVerbose  // Verbose mode
+    };
+
+
+/**
+ *  Class for accessing plugin information and common functionality
+ *
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( MCmdPluginObserver )
+    {
+
+public:
+
+    /**
+     * Creates an AT command reply based on the reply type and completes the
+     * request to ATEXT. Uses iReplyBuffer for reply storage.
+     *
+     * @since TB9.2
+     * @param aReplyType Type of reply
+     * @param aDstBuffer Destination buffer; used for the API requiring the
+     *                   AT command reply
+     * @param aSrcBuffer Source buffer; used only if aReplyType is EReplyTypeOther
+     * @param aError Completion code. If not KErrNone then other arguments are
+     *               ignored and the request is completed to ATEXT with
+     *               EReplyTypeUndefined.
+     * @return None
+     */
+    virtual TInt CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                         const TDesC8& aSrcBuffer=KNullDesC8,
+                                         TInt aError=KErrNone ) = 0;
+
+    /**
+     * Creates a buffer for "OK" or "ERROR" reply based on the line settings
+     *
+     * @since TB9.2
+     * @param aReplyBuffer Destination buffer for the created reply
+     * @param aOkReply ETrue if "OK" reply needed,
+     *                 EFalse if "ERROR" reply needed
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                                       TBool aOkReply ) = 0;
+
+    /**
+     * Returns the array of supported commands
+     *
+     * @since TB9.2
+     * @param aCmd Array of supported commands
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetSupportedCommands( RPointerArray<HBufC8>& aCmds ) = 0;
+
+    /**
+     * Returns plugin's character value settings (from CATExtPluginBase)
+     *
+     * @since TB9.2
+     * @param aCharType Character's type
+     * @param aChar Character's value matching aCharType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar ) = 0;
+
+    /**
+     * Returns plugin's mode value settings (from CATExtPluginBase)
+     *
+     * @since TB9.2
+     * @param aModeType Mode type
+     * @param aMode Mode value matching aModeType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetModeValue( TModeTypes aModeType, TBool& aMode ) = 0;
+
+    };
+
+
+#endif  // M_CMDPLUGINOBSERVER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/inc/debug.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 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:  Logging definitions
+*
+*/
+
+
+#ifndef PRJ_LOGGING_H
+#define PRJ_LOGGING_H
+
+#include <e32base.h>
+#include "debugconfig.h"
+
+#ifdef PRJ_ENABLE_TRACE
+
+#ifdef PRJ_FILE_TRACE
+#include <flogger.h>
+#else
+#include <e32debug.h>
+#endif
+
+NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow
+    {
+public:
+    void Overflow(TDes16& /*aDes*/) {}
+    };
+
+NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow
+    {
+public:
+    void Overflow(TDes8& /*aDes*/) {}
+    };
+
+inline void Trace(TRefByValue<const TDesC16> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list,aFmt);
+#ifdef PRJ_FILE_TRACE
+    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list);
+#else
+    TBuf16<KMaxLogLineLength> theFinalString;
+    theFinalString.Append(KTracePrefix16);
+    TOverflowTruncate16 overflow;
+    theFinalString.AppendFormatList(aFmt,list,&overflow);
+    RDebug::Print(theFinalString);
+#endif
+    }
+
+inline void Trace(TRefByValue<const TDesC8> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list, aFmt);
+#ifdef PRJ_FILE_TRACE
+    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list);
+#else
+    TOverflowTruncate8 overflow;
+    TBuf8<KMaxLogLineLength> buf8;
+    buf8.Append(KTracePrefix8);
+    buf8.AppendFormatList(aFmt, list, &overflow);
+    TBuf16<KMaxLogLineLength> buf16(buf8.Length());
+    buf16.Copy(buf8);
+    TRefByValue<const TDesC> tmpFmt(_L("%S"));
+    RDebug::Print(tmpFmt, &buf16);
+#endif
+    }
+
+inline void TracePanic(
+    char* aFile,
+    TInt aLine,
+    TInt aPanicCode,
+    const TDesC& aPanicCategory)
+    {
+    TPtrC8 fullFileName((const TUint8*)aFile);
+    TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1);
+    TBuf8<KMaxLogLineLength> buf;
+    buf.Append(KPanicPrefix8);
+    buf.AppendFormat(_L8("%d at line %d in file %S"), aPanicCode, aLine, &fileName);
+    Trace(buf);
+    User::Panic(aPanicCategory, aPanicCode);
+    }
+
+inline void TraceLeave(char* aFile, TInt aLine, TInt aReason)
+    {
+    TPtrC8 fullFileName((const TUint8*)aFile);
+    TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1);
+    TBuf8<KMaxLogLineLength> buf;
+    buf.Append(KLeavePrefix8);
+    buf.AppendFormat(_L8("%d at line %d in file %S"), aReason, aLine, &fileName);
+    Trace(buf);
+    User::Leave(aReason);
+    }
+
+#define TRACE_INFO(p) {if(KTraceMask & KPRINTINFO) Trace p;}
+
+#define TRACE_ERROR(p) {if(KTraceMask & KPRINTERROR) Trace p;}
+
+#define TRACE_STATE(p) {if(KTraceMask & KPRINTSTATE) Trace p;}
+
+#define TRACE_WARNING(p) {if(KTraceMask & KPRINTWARNING) Trace p;}
+
+#define TRACE_INFO_SEG(p) {if(KTraceMask & KPRINTINFO) p;}
+
+#define TRACE_ASSERT(GUARD, CODE) {if (!(GUARD)) TracePanic(__FILE__, __LINE__, CODE, KPanicCategory);}
+
+#define PANIC(CODE) TracePanic(__FILE__, __LINE__, CODE, KPanicCategory)
+
+#define LEAVE_IF_ERROR(REASON) {if (REASON) TraceLeave(__FILE__, __LINE__, REASON);}
+
+#define LEAVE_IF_NULL(PTR) {if (!PTR) TraceLeave(__FILE__, __LINE__, PTR);}
+
+#define LEAVE(REASON) {TraceLeave(__FILE__, __LINE__, REASON);}
+
+#define TRACE_STATIC_FUNC_ENTRY {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncEntryFormat8, &ptr8);}}
+
+#define TRACE_FUNC_ENTRY {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncEntryThisFormat8, &ptr8, this);}}
+
+#define TRACE_FUNC_EXIT {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncExitFormat8, &ptr8);}}
+
+#define TRACE_STATIC_FUNC {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncFormat8, &ptr8);}}
+
+#define TRACE_FUNC {if(KTraceMask & KPRINTINFO) { TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); Trace(KFuncThisFormat8, &ptr8, this);}}
+
+#define RETURN_IF_ERR(ERR) {if(ERR) {TPtrC8 ptr8((TUint8*)__FILE__); Trace(_L8(" RETURN %d at file %S line %d"), ERR, &ptr8, __LINE__); return ERR;}}
+
+#else // PRJ_ENABLE_TRACE not defined
+
+#define TRACE_INFO(p)
+
+#define TRACE_ERROR(p)
+
+#define TRACE_STATE(p)
+
+#define TRACE_WARNING(p)
+
+#define TRACE_INFO_SEG(p)
+
+#define TRACE_ASSERT(GUARD, CODE)
+
+#define PANIC(CODE) {User::Panic(KPanicCategory, CODE);}
+
+#define LEAVE_IF_ERROR(REASON) {static_cast<void>(User::LeaveIfError(REASON));}
+
+#define LEAVE_IF_NULL(PTR) {static_cast<void>(User::LeaveIfNull(PTR));}
+
+#define LEAVE(REASON) {static_cast<void>(User::Leave(REASON));}
+
+#define TRACE_STATIC_FUNC_ENTRY
+
+#define TRACE_FUNC_ENTRY
+
+#define TRACE_FUNC_EXIT
+
+#define TRACE_STATIC_FUNC
+
+#define TRACE_FUNC
+
+#define RETURN_IF_ERR(ERR) {if(ERR) return ERR;}
+#endif // PRJ_ENABLE_TRACE
+
+#endif // PRJ_LOGGING_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/inc/debugconfig.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 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:  Logging configure file
+*
+*/
+
+
+#ifndef MODEMATPLUGIN_DEBUGCONFIG_H
+#define MODEMATPLUGIN_DEBUGCONFIG_H
+
+#include "prjconfig.h"
+
+/**
+ * Custom logging variations.
+ */
+#ifdef PRJ_FILE_TRACE
+_LIT(KLogFile,"modematplugin.txt");
+_LIT(KLogDir,"MODEMATPLUGIN");
+#endif
+
+#ifdef PRJ_ENABLE_TRACE
+_LIT(KTracePrefix16, "[MODEMATPLUGIN] ");
+_LIT8(KTracePrefix8, "[MODEMATPLUGIN] ");
+_LIT8(KFuncFormat8, "><%S");
+_LIT8(KFuncThisFormat8, "><%S, [0x%08X]");
+_LIT8(KFuncEntryFormat8, ">%S");
+_LIT8(KFuncEntryThisFormat8, ">%S, [0x%08X]");
+_LIT8(KFuncExitFormat8, "<%S");
+
+_LIT(KPanicCategory, "modematplugin");
+_LIT8(KPanicPrefix8, "PANIC code ");
+_LIT8(KLeavePrefix8, "LEAVE code ");
+#endif
+
+const TInt KMaxLogLineLength = 512;
+
+#define KPRINTERROR        0x00000001 // Tracing level: error
+#define KPRINTINFO        0x00000002 // Tracing level: function trace
+#define KPRINTSTATE        0x00000004 // Tracing level: state machine info
+#define KPRINTWARNING   0x00000008 // Tracing level: warning
+
+const TInt KTraceMask = KPRINTERROR | KPRINTINFO | KPRINTSTATE | KPRINTWARNING;
+
+#endif // MODEMATPLUGIN_DEBUGCONFIG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/inc/modematplugin.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,356 @@
+/*
+* 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:  Main handler for incoming requests
+*
+*/
+
+
+#ifndef C_MODEMATPLUGIN_H
+#define C_MODEMATPLUGIN_H
+
+#include <atextpluginbase.h>
+#include "cmdpluginobserver.h" 
+
+
+/**
+ *  Class for common AT command handler interface
+ *
+ *  @since S60 TB9.2 
+ */
+NONSHARABLE_CLASS( CATCommandHandlerBase )
+    {
+
+public:
+
+    virtual ~CATCommandHandlerBase() {};
+
+    /**
+     * Reports the support status of an AT command. This is a synchronous API.
+     *
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. E.g. in BT HFP case, the command may contain
+     *             a character carriage return (<cr>) in the end.
+     * @return ETrue if the command is supported; EFalse otherwise.
+     */
+    virtual TBool IsCommandSupported( const TDesC8& aCmd ) = 0;
+
+    /**
+     * Handles an AT command. Cancelling of the pending request is done by
+     * HandleCommandCancel(). The implementation in the extension plugin should
+     * be asynchronous.
+     *
+     * The extension plugin which accepts this command is responsible to supply
+     * the result codes and response and to format result codes properly, e.g.
+     * in BT HFP case, the format should be <cr><lf><result code><cr><lf>
+     *
+     * After an extension plugin has handled or decided to reject the given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with a proper
+     * error code.
+     *
+     * @since S60 TB9.2
+     * @param aCmd The AT command to be handled. Its format may vary depending
+     *             on the specification. E.g. in BT HFP case, the command may
+     *             contain a character carriage return (<cr>) in the end.
+     * @param aReply When passed in, contains the built in answer filled by
+     *               ATEXT if it is not empty; when command handling completes
+     *               successfully, contains the result codes and responses to
+     *               this command; Its ownership always belongs to ATEXT, plugin
+     *               may reallocate its space when needed.
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse,
+     *                     the aReply must not contain the reply, otherwise it
+     *                     must contain verbose or numeric reply (ATV0/1) or an
+     *                     empty string reply (with ATQ).
+     * @return None
+     */
+    virtual void HandleCommand( const TDesC8& aCmd,
+                                RBuf8& aReply,
+                                TBool aReplyNeeded ) = 0;
+
+    /**
+     * Cancels a pending HandleCommand request.
+     *
+     * @since S60 TB9.2
+     * @return None
+     */
+    virtual void HandleCommandCancel() = 0;
+
+    };
+
+
+/**
+ *  Class for selecting handlers for different AT commands
+ *
+ *  @since TB9.2 
+ */
+NONSHARABLE_CLASS( CModemAtPlugin ) : public CATExtPluginBase, public MCmdPluginObserver 
+    {
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @return Instance of self
+     */
+    static CModemAtPlugin* NewL();
+
+    /**
+    * Destructor.
+    */
+    virtual ~CModemAtPlugin();
+
+private:
+
+    CModemAtPlugin();
+
+    void ConstructL();
+
+    /**
+     * Reports connection identifier name to the extension plugin.
+     *
+     * @since TB9.2 
+     * @param aName Connection identifier name
+     * @return None
+     */
+    void ReportConnectionName( const TDesC8& aName );
+
+    /**
+     * Reports the support status of an AT command. This is a synchronous API.
+     *
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. E.g. in BT HFP case, the command may contain
+     *             a character carriage return (<cr>) in the end.
+     * @return ETrue if the command is supported; EFalse otherwise.
+     */
+    TBool IsCommandSupported( const TDesC8& aCmd );
+
+    /**
+     * Handles an AT command. Cancelling of the pending request is done by
+     * HandleCommandCancel(). The implementation in the extension plugin should
+     * be asynchronous.
+     *
+     * The extension plugin which accepts this command is responsible to supply
+     * the result codes and response and to format result codes properly, e.g.
+     * in BT HFP case, the format should be <cr><lf><result code><cr><lf>
+     *
+     * After an extension plugin has handled or decided to reject the given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with a proper
+     * error code.
+     *
+     * @since TB9.2 
+     * @param aCmd The AT command to be handled. Its format may vary depending
+     *             on the specification. E.g. in BT HFP case, the command may
+     *             contain a character carriage return (<cr>) in the end.
+     * @param aReply When passed in, contains the built in answer filled by
+     *               ATEXT if it is not empty; when command handling completes
+     *               successfully, contains the result codes and responses to
+     *               this command; Its ownership always belongs to ATEXT, plugin
+     *               may reallocate its space when needed.
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. If EFalse,
+     *                     the aReply must not contain the reply, otherwise it
+     *                     must contain verbose or numeric reply (ATV0/1) or an
+     *                     empty string reply (with ATQ).
+     * @return None
+     */
+    void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+
+    /**
+     * Cancels a pending HandleCommand request.
+     *
+     * @since TB9.2 
+     * @return None
+     */
+    void HandleCommandCancel();
+
+    /**
+     * Next reply part's length.
+     * The value must be equal or less than KDefaultCmdBufLength.
+     * When the reply from this method is zero, ATEXT stops calling
+     * GetNextPartOfReply().
+     *
+     * @since TB9.2 
+     * @return Next reply part's length if zero or positive
+     */
+    TInt NextReplyPartLength();
+
+    /**
+     * Gets the next part of reply initially set by HandleCommandComplete().
+     * Length of aNextReply must be equal or less than KDefaultCmdBufLength.
+     *
+     * @since TB9.2 
+     * @param aNextReply Next reply
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetNextPartOfReply( RBuf8& aNextReply );
+
+    /**
+     * Receives unsolicited results. Cancelling of the pending request is done
+     * by ReceiveUnsolicitedResultCancel(). The implementation in the extension
+     * plugin should be asynchronous.
+     *
+     * @since TB9.2 
+     * @return None
+     */
+    void ReceiveUnsolicitedResult();
+
+    /**
+     * Cancels a pending ReceiveUnsolicitedResult request.
+     *
+     * @since TB9.2 
+     * @return None
+     */
+    void ReceiveUnsolicitedResultCancel();
+
+    /**
+     * Reports NVRAM status change to the plugins.
+     *
+     * @since TB9.2 
+     * @param aNvram New NVRAM status. Each call of this function is a result
+     *               of DUN extracting the form notified by
+     *               CATExtCommonBase::SendNvramStatusChange(). Each of the
+     *               settings from SendNvramStatusChange() is separated to
+     *               one call of ReportNvramStatusChange().
+     * @return None
+     */
+    void ReportNvramStatusChange( const TDesC8& aNvram );
+
+    /**
+     * Reports about external handle command error condition.
+     * This is for cases when for example DUN decided the reply contained an
+     * error condition but the plugin is still handling the command internally.
+     * Example: in command line "AT+TEST;ATDT1234" was given. "AT+TEST" returns
+     * "OK" and "ATDT" returns "CONNECT". Because "OK" and "CONNECT" are
+     * different reply types the condition is "ERROR" and DUN ends processing.
+     * This solution keeps the pointer to the last AT command handling plugin
+     * inside ATEXT and calls this function there to report the error.
+     * It is to be noted that HandleCommandCancel() is not sufficient to stop
+     * the processing as the command handling has already finished.
+     *
+     * @since TB9.2 
+     * @return None
+     */
+    void ReportExternalHandleCommandError();
+
+    /**
+     * Creates part of reply from the global reply buffer to the destination
+     * buffer. Used with APIs which need the next part of reply in multipart
+     * reply requests.
+     *
+     * @since TB9.2 
+     * @param aDstBuffer Destination buffer; the next part of reply is stored to
+     *                   this buffer.
+     * @return None
+     */
+    TInt CreatePartOfReply( RBuf8& aDstBuffer );
+
+// from base class MCmdPluginObserver
+
+    /**
+     * From MCmdPluginObserver.
+     * Creates an AT command reply based on the reply type and completes the
+     * request to ATEXT. Uses iReplyBuffer for reply storage.
+     *
+     * @since TB9.2 
+     * @param aReplyType Type of reply
+     * @param aDstBuffer Destination buffer; used for the API requiring the
+     *                   AT command reply
+     * @param aSrcBuffer Source buffer; used only if aReplyType is EReplyTypeOther
+     * @param aError Completion code. If not KErrNone then other arguments are
+     *               ignored and the request is completed to ATEXT with
+     *               EReplyTypeUndefined.
+     * @return None
+     */
+    TInt CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                 const TDesC8& aSrcBuffer=KNullDesC8,
+                                 TInt aError=KErrNone );
+
+    /**
+     * From MCmdPluginObserver.
+     * Creates a buffer for "OK" or "ERROR" reply based on the line settings
+     *
+     * @since TB9.2 
+     * @param aReplyBuffer Destination buffer for the created reply
+     * @param aOkReply ETrue if "OK" reply needed,
+     *                 EFalse if "ERROR" reply needed
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                               TBool aOkReply );
+
+    /**
+     * From MCmdPluginObserver.
+     * Returns the array of supported commands
+     *
+     * @since TB9.2 
+     * @param aCmd Array of supported commands
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetSupportedCommands( RPointerArray<HBufC8>& aCmds );
+
+    /**
+     * From MCmdPluginObserver.
+     * Returns plugin's character value settings (from CATExtPluginBase)
+     *
+     * @since TB9.2 
+     * @param aCharType Character's type
+     * @param aChar Character's value matching aCharType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar );
+
+    /**
+     * From MCmdPluginObserver.
+     * Returns plugin's mode value settings (from CATExtPluginBase)
+     *
+     * @since TB9.2 
+     * @param aModeType Mode type
+     * @param aMode Mode value matching aModeType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt GetModeValue( TModeTypes aModeType, TBool& aMode );
+
+private:  // data
+
+    /**
+     * AT commands handler array. Used for mapping HandleCommand() to
+     * IsCommandSupported() and to limit the number of string comparisons.
+     */
+    RPointerArray<CATCommandHandlerBase> iHandlers;
+
+    /**
+     * Current AT command handler in iHandlers.
+     * Used when IsCommandSupported() detects a matching handler class.
+     */
+    CATCommandHandlerBase* iHandler;
+
+    /**
+     * Buffer for handle command's command
+     * Not own.
+     */
+    const TDesC8* iHcCmd;
+
+    /**
+     * Buffer for handle command reply
+     * Not own.
+     */
+    RBuf8* iHcReply;
+
+
+    /**
+     * Global reply buffer for the AT command replies
+     */
+    RBuf8 iReplyBuffer;
+
+    };
+
+#endif  // C_MODEMPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/inc/prjconfig.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 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:  Project configure file
+*
+*/
+
+
+#ifndef MODEMATPLUGIN_PRJCONFIG_H
+#define MODEMATPLUGIN_PRJCONFIG_H
+
+/**
+ * Traces are enabled in _DEBUG build, by default.
+ */
+#ifdef _DEBUG
+#define PRJ_ENABLE_TRACE
+#endif
+
+/**
+ * traces to file if this is defined.
+ */
+//#define PRJ_FILE_TRACE
+
+
+/**
+ * build the project for module test purpose if this is defined
+ */
+//#define PRJ_MODULETEST_BUILD
+
+/**
+ * build the project using stubs to replace the dependencies if this is defined
+ */
+//#define PRJ_USE_STUB
+
+
+#endif // MODEMATPLUGIN_PRJCONFIG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/rom/modematplugin.iby	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* 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:  Image description file for project modematplugin
+*
+*/
+
+
+#ifndef __MODEMATPLUGIN_IBY__
+#define __MODEMATPLUGIN_IBY__
+
+ECOM_PLUGIN( modematplugin.dll, modematplugin.rsc )
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/src/20029fbf.rss	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* 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:  Resource definitions for project modematplugin 
+*
+*/
+
+
+#include <registryinfo.rh>
+
+// Declares info for two implementations
+RESOURCE REGISTRY_INFO theInfo
+    {
+    // UID for the DLL
+    dll_uid = 0x20029FBF;
+    // Declare array of interface info
+    interfaces =
+        {
+        INTERFACE_INFO
+            {
+            // UID of interface that is implemented
+            interface_uid = 0x2001CBEE;  // ATEXT_INTERFACE_DUN_UID
+            implementations =
+                {
+                // Info for modematplugin
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2002B3EB; 
+                    version_no = 1;
+                    display_name = "Modem AT Plugin";
+                    default_data=  "MAT+COPS";
+                    opaque_data = "";
+                    }
+                };
+            }
+        };
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/src/atcopscmd.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,1120 @@
+/*
+* 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:  Handles the commands "AT+COPS?", "AT+COPS=?" and "AT+COPS=..."
+*
+*/
+
+
+#include <mmtsy_names.h>
+#include "atcopscmd.h"
+#include "cmdpluginobserver.h"
+#include "debug.h"
+
+_LIT8( KCOPSTestCmd, "AT+COPS=?");
+_LIT8( KCOPSReadCmd, "AT+COPS?");
+_LIT8( KCOPSSetCmd,  "AT+COPS=");
+
+_LIT8(KSupportedModesStr, ",(0,1,3,4)");
+_LIT8(KSupportedFormatsStr, ",(0,1,2)"); 
+
+// The parameters are in predefined indexes in an incoming AT command. 
+const TInt KModeParameterIndex     			= 0;  
+const TInt KFormatParameterIndex   			= 1;  
+const TInt KOperatorParameterIndex 			= 2;  
+const TInt KAccessTechnologyParameterIndex  = 3;  
+
+const TInt KMinimumParameterCountWhenModePresent       = 1;  
+const TInt KMinimumParameterCountWhenFormatPresent     = 2;  
+const TInt KMinimumParameterCountWhenOperatorPresent   = 3;  
+const TInt KMinimumParameterCountWhenAccTechPresent    = 4;  
+
+// These parameter lengths are derived from 3GPP TS 27.007 V8.4.1
+const TInt KShortOperatorNameFormatLength 			= 10; 
+const TInt KLongOperatorNameFormatLength 			= 20; 
+const TInt KNumericOperatorNameFormatLength 		= 5; 
+const TInt KMaxNetworkTestResponseAdditionalSize 	= 17; // The maximun length of parts of fixed length. 
+const TInt KMaxNetworkReadResponseAdditionalSize 	= 28 ; // The maximun length of parts fixed length.
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CATCOPSCmd* CATCOPSCmd::NewL( MCmdPluginObserver* aCallback )
+    {
+    CATCOPSCmd* self = new (ELeave) CATCOPSCmd( aCallback );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CATCOPSCmd::~CATCOPSCmd()
+    {
+    iParamArray.ResetAndDestroy(); 
+    iParamArray.Close(); 
+    iPacketService.Close(); 
+    iCustomApi.Close(); 
+    iPhone.Close(); 
+    iServer.Close();
+    delete iDetectedNetworks;
+    delete iRetrieveDetectedNetworks; 
+    }
+
+// ---------------------------------------------------------------------------
+// CATCOPSCmd::CATCOPSCmd
+// ---------------------------------------------------------------------------
+//
+CATCOPSCmd::CATCOPSCmd( MCmdPluginObserver* aCallback ) :
+    CActive(EPriorityStandard),
+    iCallback( aCallback ), 
+	iFormat(RMmCustomAPI::EOperatorNameMccMnc), 
+    iRegistrationMode(EModeAutomatic), 
+    iAccTech(EAccTechNotSet), 
+    iCurrentOperation(EIdle)
+    {
+    iCmdHandlerType = ECmdHandlerTypeUndefined;
+    }
+
+// ---------------------------------------------------------------------------
+// CATCOPSCmd::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::ConstructL()
+    {
+    if ( !iCallback )
+        {
+        User::Leave( KErrGeneral );
+        }
+    CActiveScheduler::Add(this);
+    LEAVE_IF_ERROR(iServer.Connect());
+    LEAVE_IF_ERROR(iServer.LoadPhoneModule(KMmTsyModuleName));
+    LEAVE_IF_ERROR(iPhone.Open(iServer, KMmTsyPhoneName));
+    LEAVE_IF_ERROR(iCustomApi.Open(iPhone));
+    LEAVE_IF_ERROR(iPacketService.Open(iPhone));
+    iRetrieveDetectedNetworks = CRetrieveMobilePhoneDetectedNetworks::NewL(iPhone); 
+    }
+
+// ---------------------------------------------------------------------------
+// Reports the support status of an AT command. This is a synchronous API.
+// ---------------------------------------------------------------------------
+//
+TBool CATCOPSCmd::IsCommandSupported( const TDesC8& aCmd )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retTemp = KErrNone;
+
+		// First test if "test" command, because the pattern is similar with the "set" command, 
+		// this is just one extra question mark longer than that. 
+    retTemp = aCmd.Compare( KCOPSTestCmd );
+    if ( retTemp == 0 )
+        {
+        iCmdHandlerType = ECmdHandlerTypeTest;
+        TRACE_FUNC_EXIT
+        return ETrue;
+        }
+
+    retTemp = aCmd.Compare( KCOPSReadCmd );
+    if ( retTemp == 0 )
+        {
+        iCmdHandlerType = ECmdHandlerTypeRead;
+        TRACE_FUNC_EXIT
+        return ETrue;
+        }
+
+	// Test if the beginning matches the test command pattern. We're skipping parameters 
+	// here on purpose, because "set" handler will create an error reply later if 
+	// parameters are not valid. 
+    retTemp = aCmd.Left(KCOPSSetCmd().Length()).Compare(KCOPSSetCmd);
+    if ( retTemp == 0 )
+        {
+        iCmdHandlerType = ECmdHandlerTypeSet;
+        TRACE_FUNC_EXIT
+        return ETrue;
+        }
+
+    iCmdHandlerType = ECmdHandlerTypeUndefined;
+    TRACE_FUNC_EXIT
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles an AT command. Cancelling of the pending request is done by
+// HandleCommandCancel(). The implementation in the extension plugin should
+// be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::HandleCommand( const TDesC8& aCmd,
+                                   RBuf8& aReply,
+                                   TBool aReplyNeeded )
+    {
+    TRACE_FUNC_ENTRY
+
+    if ( !aReplyNeeded )
+        {
+        TRACE_FUNC_EXIT
+        return;
+        }
+
+    if(iCurrentOperation != EIdle)  
+        {
+        // only one call at time allowed. If another one is passed in, 
+        // then cancel the previous and reply with an error.   
+        HandleCommandCancel(); 
+        CreateReply(EFalse); 
+        }
+    
+    if ( iCmdHandlerType == ECmdHandlerTypeUndefined )
+        {
+		CreateReply(EFalse); 
+		}
+
+    if ( iCmdHandlerType == ECmdHandlerTypeTest )
+        {
+        // Collect network data and complete in RunL 
+        iRetrieveDetectedNetworks->StartV2(iStatus); 
+        iCurrentOperation = EListAvailableNetworkOperators; 
+        SetActive(); 
+        TRACE_FUNC_EXIT
+        return;
+        }
+
+/*
+Read command returns the current mode, the currently selected operator 
+and the current Access Technology. If no operator is selected, <format>, 
+<oper> and < AcT>  are omitted.
+*/
+    if ( iCmdHandlerType == ECmdHandlerTypeRead )
+        {
+        // Collect data in two steps. First read operator name. Continue in RunL() 
+        RMobilePhone::TMobilePhoneNetworkSelectionV1 selection; 
+        RMobilePhone::TMobilePhoneNetworkSelectionV1Pckg nwSelectionSetting(selection); 
+        iPhone.GetNetworkSelectionSetting(nwSelectionSetting);
+        switch(selection.iMethod)
+            {
+            case RMobilePhone::ENetworkSelectionAutomatic: 
+                iRegistrationMode = EModeAutomatic;
+                break; 
+            case RMobilePhone::ENetworkSelectionManual: 
+                iRegistrationMode = EModeManual;
+                break; 
+            default: 
+                // Cannot get a known selection mode! 
+                TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- Cannot get a known selection mode!"));
+                CreateReply(EFalse); 
+                TRACE_FUNC_EXIT
+                return; 
+            }
+        RMobilePhone::TMobilePhoneNetworkInfoV2Pckg nwInfo(iNetworkInfo); 
+        iPhone.GetCurrentNetwork(iStatus, nwInfo); 
+        iCurrentOperation = EGetNetworkInfoOperatorName; 
+		SetActive(); 
+        TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
+        TRACE_FUNC_EXIT
+        return;
+        }
+
+    // Getting this far means ECmdHandlerTypeSet. There must be parameter(s), too.   
+    TRAPD(err, ExtractParametersL(aCmd)); 
+
+    // Check that we got some parameters, at least the "mode". If not, return an error: 
+	if(iParamArray.Count() < KMinimumParameterCountWhenModePresent) 
+        {
+        // Return error response, there were no parameters! 
+        TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- no parameters!"));
+        CreateReply(EFalse); 
+        TRACE_FUNC_EXIT
+        return; 
+        }
+
+	// At least the mode parameter is present at this point. Inspect it and check other parameters. 
+	TNetworkRegistrationMode mode; 
+	err = GetModeAndCheckParameterCount(iParamArray[KModeParameterIndex]->Des(), mode); 
+	if(err != KErrNone) 
+		{
+        // Return error response, invalid mode or other parameters! 
+		TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- invalid mode or other parameters!"));
+        CreateReply(EFalse); 
+	    TRACE_FUNC_EXIT
+        return; 
+		}
+
+    // At this point the iRegistrationMode is stored and the parameters are valid. 
+	iRegistrationMode = mode; 
+	TRACE_INFO(( _L("CATCOPSCmd::HandleCommand() mode stored (%d)"), iRegistrationMode));
+		
+	if(iParamArray.Count() > 1) 
+		{
+		// If also format is present, extract it and store for later reference. 
+        RMmCustomAPI::TOperatorNameType format;
+        err = GetFormatFromParameter(iParamArray[KFormatParameterIndex]->Des(), format); 
+		if(err != KErrNone) 
+		    {
+		    // Return an error, invalid format. 
+			// Previously set format is still in use. 
+	 		TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- invalid format!"));
+            CreateReply(EFalse); 
+	 		TRACE_FUNC_EXIT
+			return; 
+			}
+		// Format parameter is OK, keep it.
+		iFormat = format;  
+		TRACE_INFO(( _L("CATCOPSCmd::HandleCommand() format stored (%d)"), iFormat));
+		}
+
+	// We're done with the required parameters, it's time to start processing the command. 
+	// So do a self complete and continue in RunL(): 
+	iReply = &aReply;  // Store the reply for later reference in RunL. 
+	iCurrentOperation = EInspectModeAndProcessCommand; 
+	TRequestStatus *status = &iStatus;  
+	User::RequestComplete(status, KErrNone); 
+	SetActive(); 
+	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Parses the aCmd parameter and stores results in iParamArray.
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::ExtractParametersL(const TDesC8& aCmd) 
+	{
+    TRACE_FUNC_ENTRY
+
+    TRACE_INFO(( _L8("CATCOPSCmd::ExtractParameters() extracting (%S)"), &aCmd));
+
+    TPtrC8 parameters = aCmd.Right(aCmd.Length() - KCOPSSetCmd().Length()); 
+
+    iParamArray.ResetAndDestroy(); 
+
+    // Parse the parameters into the parameter array: 
+    TInt separatorPos;  
+    while((separatorPos = parameters.Locate(',')) != KErrNotFound)
+        {
+        TRACE_INFO(( _L("CATCOPSCmd::ExtractParameters() separator position (%d)"), separatorPos));
+        TPtrC8 param = parameters.Left(separatorPos);
+        parameters.Set(parameters.Right(parameters.Length() - (separatorPos + 1))); // Remove the extracted part + separator 
+        HBufC8 *heapParam = param.AllocL();    
+        CleanupStack::PushL( heapParam );
+        // Strip the quotation marks from the parameter: 
+        TPtr8 ptr = heapParam->Des(); 
+        RemoveQuotationMarks(ptr); 
+        TRACE_INFO(( _L8("CATCOPSCmd::ExtractParameters() appending (%S)"), &ptr));
+        iParamArray.Append(heapParam); 
+        CleanupStack::Pop( heapParam );
+        }
+
+    // Finally append the last piece of parameters: 
+    HBufC8 *param = parameters.AllocL(); 
+    CleanupStack::PushL( param );
+    TPtr8 ptr = param->Des(); 
+    RemoveQuotationMarks(ptr); 
+    TRACE_INFO(( _L8("CATCOPSCmd::ExtractParameters() appending (%S)"), &ptr));
+    iParamArray.Append(param); 
+    CleanupStack::Pop( param );
+
+    TRACE_FUNC_EXIT
+	}
+
+// ---------------------------------------------------------------------------
+// Strips all quotation parms from the string passed in. 
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::RemoveQuotationMarks(TPtr8& aParameter) 
+    {
+    TRACE_FUNC_ENTRY
+    // Strip the quotation marks from the parameter: 
+    TInt quotePos;  
+    while((quotePos = aParameter.Locate('"')) != KErrNotFound)
+    {
+        aParameter.Delete(quotePos,1); 
+    }
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// Returns the selected mode in aMode and checks the parameter count. 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::GetModeAndCheckParameterCount(const TDesC8& aParameter, TNetworkRegistrationMode &aMode) 
+	{
+  TRACE_FUNC_ENTRY
+	TLex8 lex;
+	lex.Assign(aParameter);
+	TInt mode(0); 
+
+	TInt err = lex.Val(mode); 
+	TRACE_INFO(( _L("CATCOPSCmd::GetModeAndCheckParameterCount() mode (%d)"), mode));
+
+	if( err != KErrNone )
+		{
+        TRACE_INFO(_L("CATCOPSCmd::GetModeAndCheckParameterCount() TLex error!)"));
+        TRACE_FUNC_EXIT
+        return KErrArgument; 
+		}			
+
+  if(mode < EModeAutomatic || mode > EModeManualAutomatic || mode == EModeDeregister)
+      {
+      // Not a valid mode. 
+      TRACE_FUNC_EXIT
+      return KErrArgument; 
+      }
+
+  if( (mode == EModeManual || mode == EModeManualAutomatic)  &&  iParamArray.Count() < KMinimumParameterCountWhenOperatorPresent )
+      {
+      // Valid modes but not enough parameters. At least format and operator needed.  
+      TRACE_INFO(( _L("CATCOPSCmd::GetModeAndCheckParameterCount() not enough parameters (%d)"), iParamArray.Count()));
+      TRACE_FUNC_EXIT
+      return KErrArgument; 
+      }
+  if( mode == EModeSetFormatParameter && iParamArray.Count() < KMinimumParameterCountWhenFormatPresent )
+      {
+      // Valid mode, but not enough parameters. Format is needed.  
+      TRACE_INFO(_L("CATCOPSCmd::GetModeAndCheckParameterCount() no format parameter)"));
+      TRACE_FUNC_EXIT
+      return KErrArgument; 
+      }
+
+  // Valid mode and enough parameters. 
+  aMode = static_cast<TNetworkRegistrationMode>(mode);
+
+	TRACE_FUNC_EXIT
+	return KErrNone; 
+	}
+
+// ---------------------------------------------------------------------------
+// Converts an AT command parameter to numeric format value and checks it is valid. 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::GetFormatFromParameter(const TDesC8& aParameter, RMmCustomAPI::TOperatorNameType &aFormat) 
+	{
+    TRACE_FUNC_ENTRY
+    TLex8 lex;
+    lex.Assign(aParameter);
+    TInt format(0); 
+    TInt err = lex.Val(format); 
+
+    if(err != KErrNone)
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument; 
+        }
+    switch(format)
+        {
+        case EFormatLong: // long by 3GPP TS 27.007 V8.4.1  
+            TRACE_INFO(_L("Format is long by 3GPP TS 27.007 V8.4.1"));
+            aFormat = RMmCustomAPI::EOperatorNameNitzFull; 
+            break; 
+        case EFormatShort: // short by 3GPP TS 27.007 V8.4.1 
+            TRACE_INFO(_L("Format is short by 3GPP TS 27.007 V8.4.1"));
+            aFormat = RMmCustomAPI::EOperatorNameNitzShort; 
+            break; 
+        case EFormatNumeric: // numeric by 3GPP TS 27.007 V8.4.1 
+            TRACE_INFO(_L("Format is numeric by 3GPP TS 27.007 V8.4.1"));
+            aFormat = RMmCustomAPI::EOperatorNameMccMnc; 
+            // Operator is numeric, conver it into S60 style. 
+            break; 
+        default: 
+            TRACE_FUNC_EXIT
+            return KErrArgument;
+        }
+
+    TRACE_FUNC_EXIT
+    return KErrNone; 
+    }
+
+// ---------------------------------------------------------------------------
+// Converts an AT command parameter to numeric access technology value and checks it is valid. 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::GetAccTechFromParameter(const TDesC8& aParameter, TAccessTechnology& aAccTech) 
+    {
+    TRACE_FUNC_ENTRY
+    TLex8 lex;
+    lex.Assign(aParameter);
+    TInt accTech(0); 
+    TInt err = lex.Val(accTech); 
+
+    if(err != KErrNone)
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument; 
+        }
+
+    if(accTech != EGSM && accTech != EUDMA) // The only allowed access technologies. 
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument; 
+        }
+ 
+    aAccTech = static_cast<TAccessTechnology>(accTech);
+
+    TRACE_FUNC_EXIT
+    return KErrNone; 
+    }
+
+// ---------------------------------------------------------------------------
+// Converts an AT command parameter to ETel compatible operator values 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::ConvertOperatorToMccMnc(const CMobilePhoneNetworkListV2 *aDetectedNetworks, 
+                                        const RMmCustomAPI::TOperatorNameType aFormat, 
+                                        const TBuf<KMaxOperatorNameLength>& aOperatorParameter, 
+                                        RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
+                                        RMobilePhone::TMobilePhoneNetworkIdentity& aMnc) 
+    {
+    TRACE_FUNC_ENTRY
+
+    if(aFormat == RMmCustomAPI::EOperatorNameMccMnc) 
+        {
+        // Check first that there are at least five characters passed in. 
+       	TChar nextChar; 
+        if(aOperatorParameter.Length() < 5)
+        	{
+			return KErrArgument; 
+        	}
+        for(int i = 0; i < 5; ++i)
+        	{
+            nextChar = aOperatorParameter[i]; 
+            if(!nextChar.IsDigit()) 
+                {
+                return KErrArgument; 
+                }
+      		}
+        // Operator is in three digit country code + two digit network code format.  
+	    // Must be converted to ETel style. The possible extra will be simply discarded. 
+     	TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() operator is all digits, convert it into ETel data types."));
+	    aMcc.Copy(aOperatorParameter.Left(3)); 
+	    aMnc.Copy(aOperatorParameter.Right(2)); 
+	    }
+    else  // The short or long text string formats. 
+        {
+        // Find the requested operator from the operator array.  
+        // If array is empty, return an error. 
+        if(!aDetectedNetworks)
+            {
+            TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() No detected networks!"));
+            TRACE_FUNC_EXIT
+            return KErrNotFound; 
+            }
+
+        RMobilePhone::TMobilePhoneNetworkInfoV2 nwInfo; 
+        for(TInt i=0; i < iDetectedNetworks->Enumerate(); ++i)
+            {
+            TRAPD(err, nwInfo = iDetectedNetworks->GetEntryL(i))  
+            if(err != KErrNone)
+                {
+                return KErrNotFound; 
+                }
+
+            if(aFormat == RMmCustomAPI::EOperatorNameNitzShort)
+                {
+                TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Operator is in short format, comparing."));
+                if(nwInfo.iShortName.Compare(aOperatorParameter) == 0)
+                    {
+                    TRACE_INFO(_L("Match found."));
+                    aMcc = nwInfo.iCountryCode; 
+                    aMnc = nwInfo.iNetworkId; 
+                    TRACE_FUNC_EXIT
+                    return KErrNone; 
+                    } 
+                }
+            else if(aFormat == RMmCustomAPI::EOperatorNameNitzFull)
+                {
+                TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Operator is in long format, comparing."));
+                if(nwInfo.iLongName.Compare(aOperatorParameter) == 0)
+                    {
+                    TRACE_INFO(_L("Match found."));
+                    aMcc = nwInfo.iCountryCode; 
+                    aMnc = nwInfo.iNetworkId; 
+                    TRACE_FUNC_EXIT
+                    return KErrNone; 
+                    } 
+                }
+            else        
+                {
+                TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Unknown operator format!"));
+                TRACE_FUNC_EXIT
+                return KErrArgument; 
+                }
+            }
+        TRACE_INFO(_L("CATCOPSCmd::ConvertOperatorToMccMnc() Operator was not found in list!"));
+        TRACE_FUNC_EXIT
+        return KErrNotFound; 
+        }
+
+    TRACE_FUNC_EXIT
+    return KErrNone; 
+    }
+
+
+// ---------------------------------------------------------------------------
+// Initiates an automatic network registration.  
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::AutomaticNetworkRegistration() 
+    {
+    TRACE_FUNC_ENTRY
+    RMobilePhone::TMobilePhoneNetworkManualSelection nwInfo; 
+	iCurrentOperation = EAutomaticallyRegisterToNetwork; 
+	nwInfo.iCountry = KNullDesC;
+	nwInfo.iNetwork = KNullDesC;
+	iPhone.SelectNetwork(iStatus, EFalse, nwInfo); 
+	SetActive();  // Response will be sent in RunL 
+	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
+	TRACE_FUNC_EXIT
+	}
+
+// ---------------------------------------------------------------------------
+// Initiates a manual network registration.  
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::ManualNetworkRegistration(const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
+                                           const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc) 
+    {
+	TRACE_FUNC_ENTRY
+	RMobilePhone::TMobilePhoneNetworkManualSelection nwInfo; 
+	iCurrentOperation = EManuallyRegisterToNetwork; 
+	nwInfo.iCountry.Append(aMcc);
+	nwInfo.iNetwork.Append(aMnc);
+	iPhone.SelectNetwork(iStatus, ETrue, nwInfo); 
+	SetActive(); 	// Response will be sent in RunL 
+	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Initiates a manual network registration and access technology selection.  
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::ManualNetworkRegistration(const RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc, 
+                                           const RMobilePhone::TMobilePhoneNetworkIdentity& aMnc, 
+                                           const TAccessTechnology aAccTech) 
+    {
+    TRACE_FUNC_ENTRY
+	// Store access technology for later reference: 
+    iAccTech = aAccTech; 
+	// Call another overload to start the first phase of the operation: 
+	ManualNetworkRegistration(aMcc, aMnc); 
+	// Set the state again so the RunL knows to launch the next phase: 
+	iCurrentOperation = EManuallyRegisterToNetworkAndChooseAccTech; 
+  	TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// CATCOPSCmd::RunL 
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::RunL()
+    {
+    TRACE_FUNC_ENTRY
+	TInt err = KErrNone; 
+	if(iStatus != KErrNone)   
+	    {
+        HandleError(); 
+	    TRACE_FUNC_EXIT
+        return; 
+	    }
+    // Proceed to next step or return a response if all is done.
+    switch(iCurrentOperation)
+        {
+        case EListAvailableNetworkOperators: 
+            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
+            if(iDetectedNetworks)
+                {
+                delete iDetectedNetworks;
+                iDetectedNetworks = NULL; 
+                }
+            iDetectedNetworks = iRetrieveDetectedNetworks->RetrieveListV2L(); 
+            // Then create a response. 
+            TRAP(err, ConstructNetworkListResponseL()); 
+            if(err != KErrNone)
+                {
+                // An error here means that no response has been sent. Reply with an error. 
+                CreateReply(EFalse); 
+                }
+            break; 
+        
+        case EInspectModeAndProcessCommand: 
+            // Check the mode and act accordingly 
+            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
+            err = InspectModeAndProcessCommand(); 
+            if(err != KErrNone)
+                {
+                CreateReply(EFalse); 
+                }
+            break; 
+
+        case EGetNetworkInfoOperatorName: 
+            if(ConstructNetworkInfoResponse() != KErrNone)
+                {
+                // An error means that no response has been sent. Reply with an error. 
+                CreateReply(EFalse); 
+                }
+            break; 
+
+        case EManuallyRegisterToNetworkAndChooseAccTech: 
+            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
+            switch(iAccTech)
+                {
+                case EGSM: 
+                    iCustomApi.SetSystemNetworkMode(iStatus, RMmCustomAPI::KCapsNetworkModeGsm);
+                    iCurrentOperation = ESetSystemNetworkBand; 
+                    SetActive(); 
+                    break; 
+                case EUDMA: 
+                    iCustomApi.SetSystemNetworkMode(iStatus, RMmCustomAPI::KCapsNetworkModeUmts);
+                    iCurrentOperation = ESetSystemNetworkBand; 
+                    SetActive(); 
+                    break; 
+                default:
+                    // No automatic registering requested, so send back an error response. 
+                    TRACE_INFO( _L("CATCOPSCmd::RunL() incorrect acc.tech., reply an error."));
+                    CreateReply(EFalse); 
+                }
+            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() starting operation (%d)"), iCurrentOperation));
+            break; 
+
+        case EManuallyRegisterToNetwork: 
+        case EAutomaticallyRegisterToNetwork: 
+        case ESetSystemNetworkBand: 
+            TRACE_INFO((_L("CATCOPSCmd::HandleCommand() completing operation (%d)"), iCurrentOperation));
+            // Last step completed successfully, so create OK response. 
+            CreateReply(ETrue); 
+            break; 
+
+        default: 
+            TRACE_INFO(( _L("CATCOPSCmd::RunL() default operation (%d)!"), iCurrentOperation));
+            break; 
+        }
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Handles an error in async call. 
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::HandleError()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_INFO(( _L("CATCOPSCmd::RunL() failure (%d) in operation (%d)!"), iStatus.Int(), iCurrentOperation));
+
+    // In case of failure check the operation. In some cases failures are OK.
+    switch(iCurrentOperation)
+        {
+        case EManuallyRegisterToNetwork: 
+            if(iRegistrationMode == EModeManualAutomatic)
+                {
+                // Manual registration failed, try automatic next. 
+                TRACE_INFO( _L("CATCOPSCmd::RunL() registration mode manual automatic, try automatic."));
+                AutomaticNetworkRegistration(); 
+                }
+            else 
+                {
+                // No automatic registering requested, so send back an error response. 
+                TRACE_INFO( _L("CATCOPSCmd::RunL() reply an error."));
+                CreateReply(EFalse); 
+                }
+            break; 
+        case ESetSystemNetworkBand: 
+        case EManuallyRegisterToNetworkAndChooseAccTech: 
+			if(iRegistrationMode == EModeManualAutomatic)
+                {
+                // Manual registration failed, try automatic next. 
+                TRACE_INFO( _L("CATCOPSCmd::RunL() registration mode manual automatic, try automatic."));
+                AutomaticNetworkRegistration(); 
+				break;
+                }
+            else 
+                {
+				// Cannot set the access technology, so set it back to EAccTechNotSet. 
+				// This prevents replying to queries with outdated or incorrect acc tech information. 
+				TRACE_INFO( _L("CATCOPSCmd::RunL() couldn't set system network band, so reset access tech."));
+				iAccTech = EAccTechNotSet; 
+				// Fall through to default, because these require an error response. 
+				}
+        default: 
+            // In all other cases send back an error response. 
+            TRACE_INFO( _L("CATCOPSCmd::RunL() reply an error."));
+            CreateReply(EFalse); 
+            break; 
+        }
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// Cancels a pending HandleCommand request.
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel(); 
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// CATCOPSCmd::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    switch(iCurrentOperation)
+        {
+        case EAutomaticallyRegisterToNetwork:
+        case EManuallyRegisterToNetwork:
+        case EManuallyRegisterToNetworkAndChooseAccTech:
+            iPhone.CancelAsyncRequest(EMobilePhoneSelectNetworkCancel);  
+            break; 
+        case EGetNetworkInfoOperatorName:
+            iPhone.CancelAsyncRequest(EMobilePhoneGetCurrentNetworkCancel);  
+            break; 
+        case ESetSystemNetworkBand:
+            iCustomApi.CancelAsyncRequest(ECustomSetSystemNetworkModeIPC); 
+            break; 
+        case EListAvailableNetworkOperators:
+            iRetrieveDetectedNetworks->Cancel();  
+            break; 
+        default: 
+            break; 
+        }
+
+    iCurrentOperation = EIdle; 
+
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Helper method for RunL() 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::InspectModeAndProcessCommand()
+    {
+    TRACE_FUNC_ENTRY
+    TBuf<KMaxOperatorNameLength> buf;
+    TInt err; 
+
+    switch (iRegistrationMode)
+        {
+        case EModeAutomatic: 
+            AutomaticNetworkRegistration(); 
+            break; 
+        case EModeManual: 
+        case EModeManualAutomatic: // see also RunL() 
+            if(iParamArray.Count() < KMinimumParameterCountWhenOperatorPresent)
+                {
+                TRACE_FUNC_EXIT
+                return KErrArgument; 
+                }
+            
+            // At least the operator is present, so convert it into S60 format. 
+            buf.Copy(iParamArray[KOperatorParameterIndex]->Des()); 
+            err = ConvertOperatorToMccMnc(iDetectedNetworks, iFormat, buf, iMcc, iMnc); 
+            if(err != KErrNone)
+                {
+                TRACE_INFO(_L("CATCOPSCmd::HandleCommand() -- operator conversion failed!"));
+                TRACE_FUNC_EXIT
+                return KErrArgument; 
+                }
+
+            if (iParamArray.Count() >= KMinimumParameterCountWhenAccTechPresent) 
+                {
+                // Also access tech. is present. Convert it to ETel compatible value.  
+                TAccessTechnology accTech; 
+                TInt err = GetAccTechFromParameter(iParamArray[KAccessTechnologyParameterIndex]->Des(), accTech); 
+                if(err != KErrNone)
+                    {
+                    // Parameter problem, return an error. 
+                    TRACE_FUNC_EXIT
+                    return KErrArgument; 
+                    }
+                // Register both operator and access technology manually.
+                ManualNetworkRegistration(iMcc, iMnc, accTech); 
+                }
+            else 
+                {
+                // No access technology parameter, so register just the operator. 
+                ManualNetworkRegistration(iMcc, iMnc); 
+                }
+            break; 
+        case EModeDeregister: // Deregister from network 
+            // Not supported, return an error. 
+			TRACE_FUNC_EXIT
+            return KErrArgument; 
+        case EModeSetFormatParameter: 
+            // Storing format parameter was done already, so just reply OK. 
+            CreateReply(ETrue); 
+			TRACE_FUNC_EXIT
+            return KErrNone; 
+        default: 
+            return KErrArgument; 
+        }
+    TRACE_FUNC_EXIT
+    return KErrNone; 
+    }
+
+// ---------------------------------------------------------------------------
+// Converts the ETel access technology into 3GPP TS 27.007 V8.4.1 compatible format. 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::SolveAccessTechnology(RMobilePhone::TMobilePhoneNetworkAccess &aAccessTech)
+    {
+    TRACE_FUNC_ENTRY
+
+    TUint caps;
+    if(iPacketService.GetStaticCaps(caps, RPacketContext::EPdpTypePPP) != KErrNone)
+        {
+        TRACE_FUNC_EXIT
+        return KErrGeneral;     
+        }
+
+    TRACE_INFO(( _L8("CATCOPSCmd::SolveAccessTechnology() static caps gotten (%b)"), caps));
+
+    switch(aAccessTech)
+        {
+        case RMobilePhone::ENetworkAccessGsm: 
+            if(caps & RPacketService::KCapsEGPRSSupported)
+                {
+                iAccTech = EGSMwithEGPRS; 
+                }
+            else 
+                {
+                iAccTech = EGSM; 
+                }
+            break; 
+        case RMobilePhone::ENetworkAccessGsmCompact: 
+            iAccTech = EGSMCompact; 
+            break; 
+        case RMobilePhone::ENetworkAccessUtran: 
+            if(caps & RPacketService::KCapsHSDPASupported) 
+                {
+                if(caps & RPacketService::KCapsHSUPASupported)
+                    {
+                    iAccTech = EUDMAwithHSDPAandHSUPA;  
+                    }
+                else 
+                    {
+                    iAccTech = EHSDPA;  
+                    }
+                }
+            else if(caps & RPacketService::KCapsHSUPASupported) 
+                {
+                iAccTech = EHSUPA;  
+                }
+            else 
+                {
+                iAccTech = EUDMA;  
+                }
+            break;
+        default: 
+            TRACE_INFO( _L("CATCOPSCmd::SolveAccessTechnology() unknown access tech!"));
+            iAccTech = EAccTechNotSet; 
+            return KErrArgument; 
+		}
+    TRACE_FUNC_EXIT
+    return KErrNone;  
+    }
+
+// ---------------------------------------------------------------------------
+// Contructs a response for the read command. 
+// ---------------------------------------------------------------------------
+//
+TInt CATCOPSCmd::ConstructNetworkInfoResponse()
+    {
+    TRACE_FUNC_ENTRY
+    RBuf8 reply;
+    TInt size(KMaxNetworkTestResponseAdditionalSize + KLongOperatorNameFormatLength);       
+    TChar carriageReturn;
+    TChar lineFeed;
+    TInt err;
+    err = reply.Create(size);
+	err |= iCallback->GetCharacterValue( ECharTypeCR, carriageReturn );
+	err |= iCallback->GetCharacterValue( ECharTypeLF, lineFeed );		
+	if(err != KErrNone) 
+		{
+		return err; 
+		}
+
+	// Some PC Software expects and extra CR+LF, hence those are added twice: 
+	reply.Append( carriageReturn ); 
+	reply.Append( lineFeed );
+    reply.Append( carriageReturn );
+    reply.Append( lineFeed );  
+    reply.Append(_L("+COPS: "));  
+    reply.AppendNum(iRegistrationMode);  
+    reply.Append(_L(","));  
+    switch(iFormat)
+        {
+        case RMmCustomAPI::EOperatorNameNitzFull:   
+            reply.AppendNum(EFormatLong);  
+            reply.Append(_L(",")); 
+            reply.Append(_L("\""));   
+            TRACE_INFO(( _L8("CATCOPSCmd::ConstructNetworkInfoResponse() appending (%S)"), 
+                    &iNetworkInfo.iLongName));
+            reply.Append(iNetworkInfo.iLongName);  
+            break; 
+        case RMmCustomAPI::EOperatorNameNitzShort:
+            reply.AppendNum(EFormatShort); 
+            reply.Append(_L(",")); 
+            reply.Append(_L("\"")); 
+            TRACE_INFO(( _L8("CATCOPSCmd::ConstructNetworkInfoResponse() appending (%S)"), 
+                    &iNetworkInfo.iShortName));
+            reply.Append(iNetworkInfo.iShortName); 
+            break; 
+        case RMmCustomAPI::EOperatorNameMccMnc: 
+            reply.AppendNum(EFormatNumeric); 
+            reply.Append(_L(",")); 
+            reply.Append(_L("\"")); 
+            TRACE_INFO(( _L8("CATCOPSCmd::ConstructNetworkInfoResponse() appending codes (%S) and (%S)"), 
+                            &iNetworkInfo.iCountryCode, &iNetworkInfo.iNetworkId));
+            reply.Append(iNetworkInfo.iCountryCode); 
+            reply.Append(iNetworkInfo.iNetworkId); 
+            break; 
+        }
+    reply.Append(_L("\"")); 
+
+    if(SolveAccessTechnology(iNetworkInfo.iAccess) == KErrNone && iAccTech != EAccTechNotSet) 
+        {
+        TRACE_INFO((_L("CATCOPSCmd::ConstructNetworkInfoResponse() appending acc. tech. (%d)"), 
+                            iAccTech));
+        reply.Append(_L(",")); 
+        reply.AppendNum(iAccTech); 
+        }
+
+    reply.Append( carriageReturn );
+    reply.Append( lineFeed );
+
+    CreateReply(ETrue, reply); 
+
+    TRACE_FUNC_EXIT
+    return KErrNone;  
+    }
+
+
+// ---------------------------------------------------------------------------
+// Contructs a response for the test command. 
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::ConstructNetworkListResponseL()
+    {
+    TRACE_FUNC_ENTRY
+    RBuf8 reply;
+    TChar carriageReturn;
+    TChar lineFeed;
+
+    TInt maxItemSize(KMaxNetworkReadResponseAdditionalSize  
+            + KShortOperatorNameFormatLength 
+            + KLongOperatorNameFormatLength 
+            + KNumericOperatorNameFormatLength
+            + KSupportedModesStr().Length()
+            + KSupportedFormatsStr().Length()); 
+
+    CleanupClosePushL(reply); 
+
+    User::LeaveIfNull(iDetectedNetworks); 
+    User::LeaveIfError(reply.Create( maxItemSize * iDetectedNetworks->Enumerate())); 
+    User::LeaveIfError(iCallback->GetCharacterValue( ECharTypeCR, carriageReturn ));
+    User::LeaveIfError(iCallback->GetCharacterValue( ECharTypeLF, lineFeed ));		
+
+    // Some PC Software expects and extra CR+LF, hence those are added twice: 
+    reply.Append( carriageReturn );
+    reply.Append( lineFeed );
+    reply.Append( carriageReturn );
+    reply.Append( lineFeed );
+    reply.Append( _L("+COPS: ") ); 
+
+    RMobilePhone::TMobilePhoneNetworkInfoV2 nwInfo; 
+    for(TInt i = 0; i < iDetectedNetworks->Enumerate(); ++i)
+        {
+		if(i > 0) // Add CR+LF after the first cycle. 
+			{
+            reply.Append( carriageReturn );
+            reply.Append( lineFeed );
+			}
+        nwInfo = iDetectedNetworks->GetEntryL(i);  
+
+        reply.Append(_L("(")); 
+        reply.AppendNum(nwInfo.iStatus); 
+        reply.Append(_L(",")); 
+		reply.Append(_L("\"")); 
+        reply.Append(nwInfo.iLongName); 
+		reply.Append(_L("\"")); 
+        reply.Append(_L(",")); 
+		reply.Append(_L("\"")); 
+        reply.Append(nwInfo.iShortName); 
+		reply.Append(_L("\"")); 
+        reply.Append(_L(",")); 
+		reply.Append(_L("\"")); 
+        reply.Append(nwInfo.iCountryCode); 
+        reply.Append(nwInfo.iNetworkId); 
+		reply.Append(_L("\"")); 
+        if(SolveAccessTechnology(nwInfo.iAccess) == KErrNone && iAccTech != EAccTechNotSet) 
+            {
+            TRACE_INFO((_L("CATCOPSCmd::ConstructNetworkListResponse() appending acc. tech. (%d)"), iAccTech));
+            reply.Append(_L(",")); 
+            reply.AppendNum(iAccTech); 
+            }
+        reply.Append(_L(")")); 
+        reply.Append(_L(",")); 
+		TRACE_INFO( _L("CATCOPSCmd::ConstructNetworkListResponse() -- entry added to reply."));
+        }
+    reply.Append(KSupportedModesStr); // Supported modes as defined in 3GPP TS 27.007 V8.4.1
+    reply.Append(KSupportedFormatsStr);  // Supported formats as defined in 3GPP TS 27.007 V8.4.1
+
+    reply.Append( carriageReturn );
+    reply.Append( lineFeed );
+
+		// Finally append the "OK". CreateOkOrErrorReply returns verbose or numeric version. 
+    RBuf8 okReply;
+    CleanupClosePushL(okReply); 
+    iCallback->CreateOkOrErrorReply( okReply, ETrue );
+    reply.Append( okReply);
+    CreateReply(ETrue, reply); 
+    CleanupStack::PopAndDestroy(&okReply);   
+    CleanupStack::PopAndDestroy(&reply);   
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Finalises the response and sends it. 
+// ---------------------------------------------------------------------------
+//
+void CATCOPSCmd::CreateReply(TBool aIsOK, const TDesC8 &aReply) 
+    {
+    if(aIsOK == EFalse)
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeError);
+        }
+    else 
+        {
+        if(aReply.Length() > 0)
+            {
+            iCallback->CreateReplyAndComplete( EReplyTypeOther,
+                                           aReply );
+            }
+        else 
+            {
+            iCallback->CreateReplyAndComplete( EReplyTypeOk);
+            }
+        }
+    iCurrentOperation = EIdle; 
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/src/modematplugin.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,429 @@
+/*
+* 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:  Main handler for incoming requests
+*
+*/
+
+
+#include "modematplugin.h"
+#include "atcopscmd.h"
+#include "debug.h"
+
+const TInt KErrorReplyLength = 9;  // CR+LF+"ERROR"+CR+LF
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CModemAtPlugin* CModemAtPlugin::NewL()
+    {
+    CModemAtPlugin* self = new (ELeave) CModemAtPlugin();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CModemAtPlugin::~CModemAtPlugin()
+	{
+    TRACE_FUNC_ENTRY
+	iHandlers.ResetAndDestroy();
+	iHandlers.Close();
+    iReplyBuffer.Close();
+    TRACE_FUNC_EXIT
+	}
+
+// ---------------------------------------------------------------------------
+// CModemAtPlugin::CModemAtPlugin
+// ---------------------------------------------------------------------------
+//
+CModemAtPlugin::CModemAtPlugin() : CATExtPluginBase()
+    {
+    TRACE_FUNC_ENTRY
+    iHandler = NULL;
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// CModemAtPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    CATCommandHandlerBase* handler = NULL;
+    handler = CATCOPSCmd::NewL( this );
+    CleanupStack::PushL( handler );
+    iHandlers.AppendL( handler );
+    CleanupStack::Pop( handler );
+    TRACE_FUNC_EXIT
+   	}
+
+// ---------------------------------------------------------------------------
+// Reports connection identifier name to the extension plugin.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::ReportConnectionName( const TDesC8& /*aName*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports the support status of an AT command. This is a synchronous API.
+// ---------------------------------------------------------------------------
+//
+TBool CModemAtPlugin::IsCommandSupported( const TDesC8& aCmd )
+    {
+    TRACE_FUNC_ENTRY
+    TInt i;
+    TInt count = iHandlers.Count();
+    for ( i=0; i<count; i++ )
+        {
+        CATCommandHandlerBase* handler = iHandlers[i]; 
+        TBool supported = handler->IsCommandSupported( aCmd );
+        if ( supported )
+            {
+            iHandler = handler;
+            TRACE_FUNC_EXIT
+            return ETrue;
+            }
+        }
+    iHandler = NULL;
+    TRACE_FUNC_EXIT
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles an AT command. Cancelling of the pending request is done by
+// HandleCommandCancel(). The implementation in the extension plugin should
+// be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::HandleCommand( const TDesC8& aCmd,
+                                     RBuf8& aReply,
+                                     TBool aReplyNeeded )
+	{
+	TRACE_FUNC_ENTRY
+	if ( iHandler )
+	    {
+        iHcCmd = &aCmd;
+        iHcReply = &aReply;
+	    iHandler->HandleCommand( aCmd, aReply, aReplyNeeded );
+	    }
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending HandleCommand request.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+	if ( iHandler )
+	    {
+	    iHandler->HandleCommandCancel();
+	    }
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Next reply part's length.
+// The value must be equal or less than KDefaultCmdBufLength.
+// When the reply from this method is zero, ATEXT stops calling
+// GetNextPartOfReply().
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::NextReplyPartLength()
+    {
+    TRACE_FUNC_ENTRY
+    if ( iReplyBuffer.Length() < KDefaultCmdBufLength )
+        {
+        TRACE_FUNC_EXIT
+        return iReplyBuffer.Length();
+        }
+    TRACE_FUNC_EXIT
+    return KDefaultCmdBufLength;
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the next part of reply initially set by HandleCommandComplete().
+// Length of aNextReply must be equal or less than KDefaultCmdBufLength.
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::GetNextPartOfReply( RBuf8& aNextReply )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = CreatePartOfReply( aNextReply );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// Receives unsolicited results. Cancelling of the pending request is done by
+// by ReceiveUnsolicitedResultCancel(). The implementation in the extension
+// plugin should be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::ReceiveUnsolicitedResult()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending ReceiveUnsolicitedResult request.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::ReceiveUnsolicitedResultCancel()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports NVRAM status change to the plugins.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::ReportNvramStatusChange( const TDesC8& /*aNvram*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports about external handle command error condition.
+// This is for cases when for example DUN decided the reply contained an
+// error condition but the plugin is still handling the command internally.
+// Example: in command line "AT+TEST;ATDT1234" was given. "AT+TEST" returns
+// "OK" and "ATDT" returns "CONNECT". Because "OK" and "CONNECT" are
+// different reply types the condition is "ERROR" and DUN ends processing.
+// This solution keeps the pointer to the last AT command handling plugin
+// inside ATEXT and calls this function there to report the error.
+// It is to be noted that HandleCommandCancel() is not sufficient to stop
+// the processing as the command handling has already finished.
+// ---------------------------------------------------------------------------
+//
+void CModemAtPlugin::ReportExternalHandleCommandError()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Creates part of reply from the global reply buffer to the destination
+// buffer. Used with APIs which need the next part of reply in multipart reply
+// requests.
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::CreatePartOfReply( RBuf8& aDstBuffer )
+    {
+    TRACE_FUNC_ENTRY
+    if ( iReplyBuffer.Length() <= 0 )
+        {
+        TRACE_FUNC_EXIT
+        return KErrGeneral;
+        }
+    TInt partLength = NextReplyPartLength();
+    if ( iReplyBuffer.Length() < partLength )
+        {
+        TRACE_FUNC_EXIT
+        return KErrNotFound;
+        }
+    aDstBuffer.Create( iReplyBuffer, partLength );
+    iReplyBuffer.Delete( 0, partLength );
+    if ( iReplyBuffer.Length() == 0 )
+        {
+        iReplyBuffer.Close();
+        }
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates an AT command reply based on the reply type and completes the
+// request to ATEXT. Uses iReplyBuffer for reply storage.
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                              const TDesC8& aSrcBuffer,
+                                              TInt aError )
+    {
+    TRACE_FUNC_ENTRY
+    iReplyBuffer.Close();
+    if ( aError != KErrNone )
+        {
+        HandleCommandCompleted( aError, EReplyTypeUndefined );
+        iHcCmd = NULL;
+        iHcReply = NULL;
+        TRACE_FUNC_EXIT
+        return KErrNone;
+        }
+    if ( !iHcReply )
+        {
+        TRACE_FUNC_EXIT
+        return KErrGeneral;
+        }
+    switch ( aReplyType )
+        {
+        case EReplyTypeOther:
+            if ( iQuietMode )  //  In quite mode there should be no response at all. 
+                {
+                iReplyBuffer.Create( KNullDesC8 );
+                }
+            else
+                {
+                iReplyBuffer.Create( aSrcBuffer ); 
+                }
+            break;
+        case EReplyTypeOk:
+            CreateOkOrErrorReply( iReplyBuffer, ETrue );
+            break;
+        case EReplyTypeError:
+            CreateOkOrErrorReply( iReplyBuffer, EFalse );
+            break;
+        default:
+            TRACE_FUNC_EXIT
+            return KErrGeneral;
+        }
+    CreatePartOfReply( *iHcReply );
+    HandleCommandCompleted( KErrNone, aReplyType );
+    iHcCmd = NULL;
+    iHcReply = NULL;
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates a buffer for "OK" or "ERROR" reply based on the line settings
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                                            TBool aOkReply )
+    {
+    TRACE_FUNC_ENTRY
+    if ( iQuietMode )
+        {
+        TRACE_FUNC_EXIT
+        return iReplyBuffer.Create( KNullDesC8 );
+        }
+    _LIT8( KErrorReplyVerbose, "ERROR" );
+    _LIT8( KOkReplyVerbose,    "OK" );
+    _LIT8( KErrorReplyNumeric, "4" );
+    _LIT8( KOkReplyNumeric,    "0" );
+    TBuf8<KErrorReplyLength> replyBuffer;
+    if ( iVerboseMode )
+        {
+        replyBuffer.Append( iCarriageReturn );
+        replyBuffer.Append( iLineFeed );
+        if ( aOkReply )
+            {
+            replyBuffer.Append( KOkReplyVerbose );
+            }
+        else
+            {
+            replyBuffer.Append( KErrorReplyVerbose );
+            }
+        replyBuffer.Append( iCarriageReturn );
+        replyBuffer.Append( iLineFeed );
+        }
+    else
+        {
+        if ( aOkReply )
+            {
+            replyBuffer.Append( KOkReplyNumeric );
+            }
+        else
+            {
+            replyBuffer.Append( KErrorReplyNumeric );
+            }
+        replyBuffer.Append( iCarriageReturn );
+        }
+    TInt retVal = aReplyBuffer.Create( replyBuffer );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Returns the array of supported commands
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::GetSupportedCommands( RPointerArray<HBufC8>& aCmds )
+    {
+    TRACE_FUNC_ENTRY
+    // Force superclass call here:
+    TInt retVal = CATExtPluginBase::GetSupportedCommands( aCmds );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Returns plugin's character value settings (from CATExtPluginBase)
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::GetCharacterValue( TCharacterTypes aCharType,
+                                         TChar& aChar )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = KErrNone;
+    switch ( aCharType )
+        {
+        case ECharTypeCR:
+            aChar = iCarriageReturn;
+            break;
+        case ECharTypeLF:
+            aChar = iLineFeed;
+            break;
+        case ECharTypeBS:
+            aChar = iBackspace;
+            break;
+        default:
+            retVal = KErrNotFound;
+            break;
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// From MLcCustomPlugin.
+// Returns plugin's mode value settings (from CATExtPluginBase)
+// ---------------------------------------------------------------------------
+//
+TInt CModemAtPlugin::GetModeValue( TModeTypes aModeType, TBool& aMode )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = KErrNone;
+    switch ( aModeType )
+        {
+        case EModeTypeQuiet:
+            aMode = iQuietMode;
+            break;
+        case EModeTypeVerbose:
+            aMode = iVerboseMode;
+            break;
+        default:
+            retVal = KErrNotFound;
+            break;
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atcommands/modematplugin/src/proxy.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,48 @@
+/*
+* 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:  Export ECom interface implementations
+*
+*/
+
+
+#ifndef REFERENCE_ATEXT_H
+#define REFERENCE_ATEXT_H
+
+#include <e32base.h>
+#include <ecom/implementationproxy.h>
+#include "modematplugin.h"
+
+// ---------------------------------------------------------------------------
+// An array of TImplementationProxy objects which onnect each
+// implemeation with its instantiation function
+// ---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(0x2002B3EB, CModemAtPlugin::NewL),  // DUN
+	};
+
+// ---------------------------------------------------------------------------
+// Exported proxy function to resolve instantiation methods for an Ecom
+// plug-in DLL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+	return ImplementationTable;
+	}
+
+#endif
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/group/remconbeareravrcp.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/group/remconbeareravrcp.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -64,7 +64,6 @@
 USERINCLUDE   ../../common
 
 MW_LAYER_SYSTEMINCLUDE_SYMBIAN
-USERINCLUDE ../../../../../../os/bt/bluetoothmgmt/btcommon/inc
 
 LIBRARY       avc.lib
 LIBRARY       ecom.lib
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpcommand.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpcommand.h	Fri Apr 16 15:08:36 2010 +0300
@@ -25,7 +25,7 @@
 #include <e32base.h>
 #include <bluetoothav.h>
 #include <bluetooth/avctptypes.h>
-#include "internaltypes.h"
+#include "avrcputils.h"
 
 class CAvrcpPlayerInfoManager;
 /**
@@ -68,9 +68,9 @@
 			const TBTDevAddr& aAddr);
 	
 public:
-	TBTDblQueLink	iHandlingLink;	// Used to form handling queue in command handlers
-	TBTDblQueLink	iReadyLink;		// Used to form ready command queue in CRemConBearerAvrcp
-	TBTDblQueLink	iSendLink;		// Used to form send queue in CRcpRouter
+	TAvrcpDblQueLink	iHandlingLink;	// Used to form handling queue in command handlers
+	TAvrcpDblQueLink	iReadyLink;		// Used to form ready command queue in CRemConBearerAvrcp
+	TAvrcpDblQueLink	iSendLink;		// Used to form send queue in CRcpRouter
 
 protected:
 	TUint							iRemConId;
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcputils.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcputils.h	Fri Apr 16 15:08:36 2010 +0300
@@ -170,4 +170,22 @@
 	CSpecificThreadCallBackBody*	iBody;
 	};
 
+/**
+An extended double queue link class to provide additional features.
+*/
+NONSHARABLE_CLASS(TAvrcpDblQueLink) : public TDblQueLink
+	{
+	public:
+		inline TBool IsQueued() const;
+	};
+
+/**
+Indicates whether the queue link is attached to a queue.
+@return True if the link is queued, false otherwise.
+*/
+inline TBool TAvrcpDblQueLink::IsQueued() const
+	{
+	return iNext ? ETrue : EFalse;
+	}
+
 #endif // AVRCPUTILS_H
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/bulkbearer.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/bulkbearer.h	Fri Apr 16 15:08:36 2010 +0300
@@ -46,6 +46,7 @@
 	void MrcciNewCommand(CAvrcpCommand& aCommand,const TRemConClientId& aClientId);
 	
 	TUint MrcciNewTransactionId();
+    void MrcciCommandExpired(TUint aTransactionId);
 	
 	TInt MrcbciSetAddressedClient(const TRemConAddress& aAddr, const TRemConClientId& aClient);
 	void MrcbciRemoveAddressing(const TRemConAddress& aAddr);
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h	Fri Apr 16 15:08:36 2010 +0300
@@ -59,6 +59,8 @@
 	void MrccciNewNotifyResponse(CControlCommand& aCommand);
 	
 	TUint MrcciNewTransactionId();
+    void MrcciCommandExpired(TUint aTransactionId);
+    
 	void MrccciSetAddressedClient(const TRemConClientId& aClient);
 
 private: // MRemConBearerInterfaceV3 functions called from RemCon
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlcommand.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlcommand.h	Fri Apr 16 15:08:36 2010 +0300
@@ -27,7 +27,6 @@
 #include <remconcoreapi.h>
 #include <remcon/remconbearerplugin.h>
 #include <remcon/clientid.h>
-#include "internaltypes.h"
 
 #include <avcframe.h>
 
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/remconcommandinterface.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/remconcommandinterface.h	Fri Apr 16 15:08:36 2010 +0300
@@ -31,6 +31,7 @@
 	virtual void MrcciNewCommand(CAvrcpCommand& aCommand, const TRemConClientId& aClientId) = 0;
 
 	virtual TUint MrcciNewTransactionId() = 0;
+	virtual void MrcciCommandExpired(TUint aTransactionId) = 0;
 	};
 
 NONSHARABLE_CLASS(MRemConBulkCommandInterface) : public MRemConCommandInterface
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/bulkbearer.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/bulkbearer.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -201,6 +201,12 @@
 	return iObserver->NewTransactionId();
 	}
 
+void CAvrcpBulkBearer::MrcciCommandExpired(TUint aTransactionId)
+    {
+    LOG_FUNC
+    iObserver->CommandExpired(aTransactionId);
+    }
+
 TInt CAvrcpBulkBearer::MrcbciSetAddressedClient(const TRemConAddress& aAddr, const TRemConClientId& aClient)
 	{
 	LOG_FUNC
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/controlcommand.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/controlcommand.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -608,6 +608,7 @@
 		{
 		case KErrNone:
 		case KErrCompletion:
+		case KErrAvrcpHandledInternallyRespondNow:
 			if (cType == AVC::EControl)
 				{
 				iFrame->SetType(AVC::EAccepted);
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/playerstatewatcher.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/playerstatewatcher.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -40,6 +40,9 @@
 	CInternalCommand* command = *iCommands.Find(aClientId);
 	__ASSERT_DEBUG(command, AVRCP_PANIC(ENotWatchingPlayer));
 
+	TUint transId = command->RemConCommandId();
+	iCommandInterface.MrcciCommandExpired(transId);
+
 	iCommands.Remove(aClientId);
 	command->DecrementUsers();
 	}
--- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/remconbeareravrcp.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/remconbeareravrcp.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -858,10 +858,15 @@
 	return Observer().NewTransactionId();
 	}
 
+void CRemConBearerAvrcp::MrcciCommandExpired(TUint aTransactionId)
+    {
+    LOG_FUNC
+    Observer().CommandExpired(aTransactionId);
+    }
+
 void CRemConBearerAvrcp::MrccciSetAddressedClient(const TRemConClientId& aClientId)
 	{
 	LOG_FUNC
-
 	Observer().SetRemoteAddressedClient(TUid::Uid(KRemConBearerAvrcpImplementationUid), aClientId);
 	}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btaudioman/btaccpanic.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies 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 authorisation notifier class.
+*
+*/
+
+#ifndef BTACCPANIC_H
+#define BTACCPANIC_H
+
+_LIT(KBtAccPanicName, "BtAcc Panic");
+
+enum TBtAccPanic
+    {
+    ENoShutdownTimer = 0,
+    };
+
+template <typename XAny>
+struct TBtAccPanicCodeTypeChecker
+    {
+    inline static void Check(XAny) { }
+    };
+
+#define BTACC_PANIC(CODE) \
+    TBtAccPanicCodeTypeChecker<TBtAccPanic>::Check(CODE), \
+    User::Panic(KBtAccPanicName, CODE)
+
+
+#endif // BTACCPANIC_H
+
+
--- a/bluetoothengine/btaudioman/data/10208970.rss	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/data/10208970.rss	Fri Apr 16 15:08:36 2010 +0300
@@ -37,7 +37,7 @@
                     {
                     implementation_uid = 0x1020897C;
                     version_no         = 1;
-                    display_name       = "0x1020897B";
+                    display_name       = "0x10208970";
                     default_data       = KACCESSORYPLUGINAPIMAINSERVICE;      
                     opaque_data        = "Heap=0x1000|Stack=0x1000";
                     rom_only           = 1;      
@@ -46,7 +46,7 @@
                     {
                     implementation_uid = 0x1020897D;
                     version_no         = 1;
-                    display_name       = "0x1020897B";
+                    display_name       = "0x10208970";
                     default_data       = KACCESSORYPLUGINAPIHANDLER;      
                     opaque_data        = "";
                     rom_only           = 1;
--- a/bluetoothengine/btaudioman/group/btaudioman.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/group/btaudioman.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -49,8 +49,6 @@
 SOURCE        BTAccSession.cpp
 SOURCE		  basrvpowercontrolagent.cpp
 SOURCE        basrvrvc.cpp
-SOURCE        BTAccSession_accfw_var.cpp
-SOURCE        basrvaccman_accfw_var.cpp
 SOURCE        basrvaccfwconn.cpp
 
 USERINCLUDE     ../inc
--- a/bluetoothengine/btaudioman/inc/BTAccClient.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/BTAccClient.h	Fri Apr 16 15:08:36 2010 +0300
@@ -93,34 +93,6 @@
     */
     void GetInfoOfConnectedAcc(TPckg<TAccInfo>& aInfoPckg, TRequestStatus& aStatus ); 
     
-
-    /**
-    * Transfer audio to phone
-    * @param    None
-    * @return   TInt indicating the success of call.      
-    */
-    TInt AudioToPhone();
-
-    /**
-    * Routes the audio paths from the phone to the accessory from which they
-    * have been earlier on moved to the phone with the audio to phone 
-    * operation. In practice also reconnects to the accessory.
-    * @param aStatus            When the request completes contains the 
-    *                           success status of the operation.
-    * @return                   None.
-    */
-    void AudioToAccessory( TRequestStatus& aStatus );
-
-    /**
-    * Cancels the audio to accessory operation.
-    * Note that if this request is made after the point when it is not 
-    * possible to cancel the actual operation any more, the audio paths 
-    * might still be routed to the accessory again.
-    * @param                    TRequestStatus status to be cancelled.
-    * @return                   None.
-    */
-    void CancelAudioToAccessory();
-    
 public: // Functions from base classes
 
     /**
--- a/bluetoothengine/btaudioman/inc/BTAccClientSrv.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/BTAccClientSrv.h	Fri Apr 16 15:08:36 2010 +0300
@@ -47,9 +47,6 @@
     EBTAccSrvCancelNotifyConnectionStatus,
     EBTAccSrvConnectionStatus,
     EBTAccSrvGetInfoOfConnectedAcc,
-    EBTAccSrvAudioToPhone,
-    EBTAccSrvAudioToAccessory,
-    EBTAccSrvCancelAudioToAccessory,
     EBTAccSrvInvalidIpc,
     };
 
--- a/bluetoothengine/btaudioman/inc/BTAccServer.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/BTAccServer.h	Fri Apr 16 15:08:36 2010 +0300
@@ -49,7 +49,7 @@
     
     void StartShutdownTimerIfNoSessions();
     
-    void ClientOpened(CBTAccSession& aSession);
+    void ClientOpenedL(CBTAccSession& aSession);
         
     void ClientClosed(CBTAccSession& aSession);
         
--- a/bluetoothengine/btaudioman/inc/BTAccSession.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/BTAccSession.h	Fri Apr 16 15:08:36 2010 +0300
@@ -58,13 +58,6 @@
 
     void NotifyClientNewProfile(TInt aProfile, const TBTDevAddr& aAddr);
     void NotifyClientNoProfile(TInt aProfile, const TBTDevAddr& aAddr);
-
-    // For DosServer version only
-    void AudioToPhone(const RMessage2& aMessage);
-    void AudioToAccessory(const RMessage2& aMessage);
-    void CancelAudioToAccessory();
-    void AudioToPhoneComplete();
-    void AudioToAccessoryComplete(TInt aErr);
         
 private:
     /**
@@ -114,10 +107,6 @@
     */
     CBTAccSession(CBasrvAccMan& aAccMan);
 
-    void HandleAudio4DosRequest(const RMessage2 &aMessage);
-
-    void DestructVariant();
-
     void UpdateProfileStatusCache(const TProfileStatus& aStatus);
 
 private:    // Data
--- a/bluetoothengine/btaudioman/inc/basrvaccman.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/basrvaccman.h	Fri Apr 16 15:08:36 2010 +0300
@@ -16,7 +16,7 @@
 *  Name        : basrvaccman.h
 *  Part of     : BTEng / Bluetooth Accessory Server
 *  Description : 
-*  Version     : %version: 3.1.4.1.2.2.11 %
+*  Version     : %version: 3.1.4.1.2.2.13 %
 *
 */
 
@@ -100,10 +100,6 @@
 
     TBTEngConnectionStatus ConnectionStatus4Client(const TBTDevAddr& aAddr) const;
 
-    // For DosServer version only
-    void AudioToPhone(CBasrvAudio4Dos& aAudio4Dos);
-    void AudioToAccessory(CBasrvAudio4Dos& aAudio4Dos);
-
     TBool IsAvrcpVolCTSupported();
     TBool IsAbsoluteVolumeSupported(const TBTDevAddr& aAddr);
     TBool DisconnectIfAudioOpenFails();
@@ -153,6 +149,9 @@
      */
     void CancelRequest(CBasrvActive& aActive);
 
+private:
+    void DoShowNoteL(TBTGenericInfoNoteType aNote, const TBTDevAddr& aAddr);
+    
 protected:
     /**
     * Default constructor
@@ -164,8 +163,6 @@
     void HandleNewAudioRequestL();
 
     void DoAudioRequestL();
-    
-    void DestructVariant();
 
     TInt FindAcc(const TBTDevAddr& aRemote) const;
 
--- a/bluetoothengine/btaudioman/inc/basrvaccstate.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/basrvaccstate.h	Fri Apr 16 15:08:36 2010 +0300
@@ -132,7 +132,7 @@
     /**
     * Default constructor
     */
-    CBasrvAccState(CBasrvAcc& aParent, TRequestStatus* aRequest);
+    CBasrvAccState(CBasrvAcc& aParent);
     
     /**
      * Gets the owner of the state machine
@@ -142,24 +142,6 @@
      */
     CBasrvAcc& Parent();
     
-    /**
-     * Completes the pending request in this state with specified error code 
-     * and then zero the pointer.
-     *
-     * @since S60 v3.1
-     * @param aErr the completion error code
-     */
-    void CompleteStateRequest(TInt aErr);
-    
-    /**
-     * Completes the give pending request with specified error code..
-     *
-     * @since S60 v3.1
-     * @param aRequest the request to be completed
-     * @param aErr the completion error code
-     */
-    void CompleteRequest(TRequestStatus* aRequest, TInt aErr);
-
     void StatePrint(const TDesC& aStateName);
 
     TAccInfo& AccInfo();
@@ -173,12 +155,6 @@
 protected:
 
     CBasrvAcc& iParent;
-
-    /**
-     * Possible to be NULL.
-     * The async request performed in this state if it is not NULL.
-     */
-    TRequestStatus* iRequest;
     };
 
 #endif      // C_BTASRVACCSTATE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btaudioman/inc/btaccpanic.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies 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 authorisation notifier class.
+*
+*/
+
+#ifndef BTACCPANIC_H
+#define BTACCPANIC_H
+
+_LIT(KBtAccPanicName, "BtAcc Panic");
+
+enum TBtAccPanic
+    {
+    ENoShutdownTimer = 0,
+    EMaxNumberOfConflictsExceeded = 1,
+    };
+
+template <typename XAny>
+struct TBtAccPanicCodeTypeChecker
+    {
+    inline static void Check(XAny) { }
+    };
+
+#define BTACC_PANIC(CODE) \
+    TBtAccPanicCodeTypeChecker<TBtAccPanic>::Check(CODE), \
+    User::Panic(KBtAccPanicName, CODE)
+
+
+#endif // BTACCPANIC_H
+
--- a/bluetoothengine/btaudioman/inc/btaudiomanplugin.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/btaudiomanplugin.h	Fri Apr 16 15:08:36 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -171,7 +171,10 @@
 
     void ConstructL();
 
-    TInt HandleAsyncRequest(const TBTDevAddr& aAddr, TInt aRequestId);
+    TInt PrepareAsyncRequest(const TBTDevAddr& aAddr, TInt aRequestId);
+
+    void NotifyConnectionStatus();
+    TInt ReconnectIfNeccessary();
 
     void ReportProfileConnectionEvents(const TBTDevAddr& aAddr, const TInt aProfiles, TBool aConnected);
 
@@ -187,6 +190,7 @@
     CBasrvActive* iActive4ProfileStatus;
     TProfileStatus iProfileStatus;
     TProfileStatusPckg iProfileStatusPckg;
+    TInt iNotifyConnectionStatusFailure;
     };
 
 
--- a/bluetoothengine/btaudioman/inc/debug.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/debug.h	Fri Apr 16 15:08:36 2010 +0300
@@ -22,6 +22,11 @@
 #include <e32base.h>
 #include "debugconfig.h"
 
+enum TPanic
+	{
+	EInvalidNullState = 1,
+	};
+
 #ifdef PRJ_ENABLE_TRACE
 
 #ifdef PRJ_FILE_TRACE
--- a/bluetoothengine/btaudioman/inc/debugconfig.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/inc/debugconfig.h	Fri Apr 16 15:08:36 2010 +0300
@@ -38,11 +38,12 @@
 _LIT8(KFuncEntryThisFormat8, ">%S, [0x%08X]");
 _LIT8(KFuncExitFormat8, "<%S");
 
-_LIT(KPanicCategory, "BTAccServer");    
 _LIT8(KPanicPrefix8, "PANIC code ");
 _LIT8(KLeavePrefix8, "LEAVE code ");
 #endif
 
+_LIT(KPanicCategory, "BTAccServer");	// need it also for release 
+
 const TInt KMaxLogLineLength = 512;
 
 #define KPRINTERROR        0x00000001 // Tracing level: error
--- a/bluetoothengine/btaudioman/src/BTAccClient.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/BTAccClient.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -164,32 +164,5 @@
     SendReceive(EBTAccSrvGetInfoOfConnectedAcc, TIpcArgs(&aInfoPckg),  aStatus);
     }
 
-// ---------------------------------------------------------
-// AudioToPhone
-// Dos Related functionality only. 
-// ---------------------------------------------------------
-//
-TInt RBTAccClient::AudioToPhone()
-    {
-    TRACE_FUNC
-    return SendReceive(EBTAccSrvAudioToPhone);
-    }
-
-// ---------------------------------------------------------
-// AudioToAccessory
-// Dos Related functionality only.
-// ---------------------------------------------------------
-//
-void RBTAccClient::AudioToAccessory( TRequestStatus& aStatus )
-    {
-    TRACE_FUNC
-    SendReceive(EBTAccSrvAudioToAccessory, aStatus);
-    }
-
-void RBTAccClient::CancelAudioToAccessory()
-    {
-    SendReceive(EBTAccSrvCancelAudioToAccessory);
-    }
-
     
 // End of File
--- a/bluetoothengine/btaudioman/src/BTAccServer.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/BTAccServer.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -30,6 +30,7 @@
 #include "btmanclient.h"         // TBTDevAddrPckgBug
 #include "basrvaccman.h"
 #include "BTAccInfo.h"
+#include "btaccpanic.h"
 
 /**  PubSub key read and write policies */
 _LIT_SECURITY_POLICY_C1( KBTEngPSKeyReadPolicy, 
@@ -78,33 +79,25 @@
     }
 
 void CBTAccServer::StartShutdownTimerIfNoSessions()
-	{
-	if (iSessions.Count() == 0 && (!iTimer || !iTimer->IsActive()))
-		{
-		if (!iTimer)
-		    {
-		    TRAP_IGNORE(iTimer = CPeriodic::NewL(CActive::EPriorityStandard));
-		    }
-		
-		if (iTimer)
-		    {
-		    iTimer->Start(KShutdownDelay, 0, TCallBack(CBTAccServer::TimerFired, this));
-		    }
-		
-	    TRACE_FUNC	
-		}
-	}
+    {
+    TRACE_FUNC	
+    __ASSERT_DEBUG(iTimer, BTACC_PANIC(ENoShutdownTimer));
+    if (iSessions.Count() == 0 && !iTimer->IsActive())
+        {
+        iTimer->Start(KShutdownDelay, 0, TCallBack(CBTAccServer::TimerFired, this));
+        }
+    }
 
-void CBTAccServer::ClientOpened(CBTAccSession& aSession)
-	{
-	TRACE_FUNC
-	
-	//cancel the timer to prevent the server from shutting down
+void CBTAccServer::ClientOpenedL(CBTAccSession& aSession)
+    {
+    TRACE_FUNC
+
+    //add the session to the array of sessions
+    iSessions.AppendL(&aSession);
+
+    //cancel the timer to prevent the server from shutting down
     CancelShutdownTimer();
-	
-	//add the session to the array of sessions
-	(void)iSessions.Append(&aSession);
-	}
+    }
 
 void CBTAccServer::ClientClosed(CBTAccSession& aSession)
 	{
@@ -148,8 +141,9 @@
 void CBTAccServer::ConstructL()
     {
     iAccMan = CBasrvAccMan::NewL();
-    iAccMan->LoadServicesL();
-    
+
+    iTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+
     User::LeaveIfError(RProperty::Define(KPSUidBluetoothEnginePrivateCategory,
                                          KBTHfpATCommand, RProperty::EByteArray,
                                          KBTEngPSKeyReadPolicy,
@@ -162,8 +156,7 @@
 
 void CBTAccServer::CancelShutdownTimer()
     {
-    delete iTimer;
-    iTimer = NULL;
+    iTimer->Cancel();
     }
 
 TInt CBTAccServer::TimerFired(TAny* /*aThis*/)
--- a/bluetoothengine/btaudioman/src/BTAccSession.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/BTAccSession.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -27,6 +27,7 @@
 #include "BTAccServer.h"
 #include "basrvaccman.h"
 #include "BTAccInfo.h"
+#include "btaccpanic.h"
 
 typedef TPckgBuf<TBTDevAddr> TBTDevAddrPckgBuf;
 
@@ -64,7 +65,6 @@
         iNotifyProfileMsg.Complete(KErrAbort);
         }
     iProfileStatusCache.Close();
-    DestructVariant();
     
     //clear the accessory managers pointer to this session if it has one
     iAccMan.ClearProfileNotifySession(*this);
@@ -78,7 +78,7 @@
     TRACE_FUNC
     //use CreateL instead of NewSessionL when using Server() to ensure the
     //session has been created correctly and Server() returns a valid pointer
-    Server().ClientOpened(*this);
+    Server().ClientOpenedL(*this);
     }
 
 void CBTAccSession::ConnectCompleted(TInt aErr, TInt aProfile, const RArray<TBTDevAddr>* aConflicts)
@@ -89,10 +89,24 @@
         TRACE_INFO((_L("CBTAccSession::ConnectCompleted err %d"), aErr))
         if (aConflicts)
             {
-            TBuf8<KBTDevAddrSize * 2> buf;
+            if (aErr == KErrNone)
+                {
+                //we need to error so the client knows there are conflicts which need handling
+                aErr = KErrGeneral; 
+                }
+            
+            const TInt KMaxNumberOfConflicts = 2;
+            
+            TBuf8<KBTDevAddrSize * KMaxNumberOfConflicts> buf;
             TInt count = aConflicts->Count();
+            __ASSERT_DEBUG(count <= KMaxNumberOfConflicts, BTACC_PANIC(EMaxNumberOfConflictsExceeded));
+            
             for (TInt i = 0; i < count; i++)
                 {
+                if(i >= KMaxNumberOfConflicts)
+                    {
+                    break; //prevent descriptor overflow
+                    }
                 buf.Append((*aConflicts)[i].Des());
                 }
             
@@ -101,10 +115,10 @@
                 iConnectMsg.Write(1, buf);
                 }
             }
-        else if (!aErr)
+        else if (aErr == KErrNone)
             {
             TPckgBuf<TInt> buf(aProfile);
-            iConnectMsg.Write(1, buf);
+            aErr = iConnectMsg.Write(1, buf);
             }
         iConnectMsg.Complete(aErr);
         }
@@ -116,10 +130,10 @@
     if (iDisconnectMsg.Handle())
         {
         TRACE_FUNC
-        if (!aErr)
+        if (aErr == KErrNone)
             {
             TPckgBuf<TInt> buf(aProfile);
-            iDisconnectMsg.Write(1, buf);
+            aErr = iDisconnectMsg.Write(1, buf);
             }
         iDisconnectMsg.Complete(aErr);
         }
@@ -239,6 +253,11 @@
         //finished with the accessory info array
         infos.Close();
         
+        if(buf.Length() <= 0)
+            {
+            ret = KErrNotFound;
+            }
+        
         //if there is no error and the buffer has something in,
         //write the buffer to the message
         if (ret == KErrNone)
@@ -451,13 +470,6 @@
             GetInfoOfConnectedAcc(aMessage);
             break;
             }
-        case EBTAccSrvAudioToPhone:
-        case EBTAccSrvAudioToAccessory:
-        case EBTAccSrvCancelAudioToAccessory:
-            {
-            HandleAudio4DosRequest(aMessage);
-            break;
-            }
         default:
             {
             PanicClient(aMessage, EBTAccBadRequest);
--- a/bluetoothengine/btaudioman/src/BTAccSession_accfw_var.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
-* 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:  Variants for Dos Server version
-* 
-*
-*/
-
-
-// INCLUDE FILES
-#include "BTAccSession.h"
-#include "debug.h"
-
-void CBTAccSession::HandleAudio4DosRequest(const RMessage2 &aMessage)
-    {
-    aMessage.Complete(KErrNotSupported);
-    }
-
-void CBTAccSession::DestructVariant()
-    {
-    }
-
-// End of File
--- a/bluetoothengine/btaudioman/src/basrvacc.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvacc.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -107,30 +107,35 @@
 void CBasrvAcc::AccOpenedAudio(TProfiles aProfile)
     {
     TRACE_FUNC
+    __ASSERT_ALWAYS(iState, User::Panic(KPanicCategory, EInvalidNullState));
     iState->AccOpenedAudio(aProfile);
     }
 
 void CBasrvAcc::AccClosedAudio(TProfiles aProfile)
     {
     TRACE_FUNC
+    __ASSERT_ALWAYS(iState, User::Panic(KPanicCategory, EInvalidNullState));
     iState->AccClosedAudio(aProfile);
     }
     
 void CBasrvAcc::AccessoryDisconnectedL(TProfiles aProfile)
     {
     TRACE_FUNC
+    __ASSERT_ALWAYS(iState, User::Panic(KPanicCategory, EInvalidNullState));
     iState->AccessoryDisconnectedL(aProfile);
     }
 
 void CBasrvAcc::OpenAudioL(TAccAudioType aType)
     {
     TRACE_FUNC
+    __ASSERT_ALWAYS(iState, User::Panic(KPanicCategory, EInvalidNullState));
     iState->OpenAudioL(aType);
     }
 
 void CBasrvAcc::CloseAudioL(TAccAudioType aType)
     {
     TRACE_FUNC
+    __ASSERT_ALWAYS(iState, User::Panic(KPanicCategory, EInvalidNullState));
     iState->CloseAudioL(aType);
     }
 
--- a/bluetoothengine/btaudioman/src/basrvaccman.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccman.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -12,13 +12,14 @@
 * Contributors:
 *
 * Description:  Implementation of an accessory management.
-*  Version     : %version:  14.1.8 %
+*  Version     : %version:  14.1.10 %
 *
 */
 
 
 // INCLUDE FILES
 #include <centralrepository.h>
+#include <btengdomaincrkeys.h>
 #include "basrvaccman.h"
 #include "BTAccSession.h"
 #include "BTAccClientSrv.h"
@@ -44,6 +45,28 @@
     return self;
     }
 
+void CBasrvAccMan::ConstructL()
+    {
+    iAsyncHandlingActive = 
+        CBasrvActive::NewL(*this, CActive::EPriorityStandard, KAsyncHandlingRequest);
+    
+    CRepository* cenrep = NULL;
+    TRAP_IGNORE(cenrep = CRepository::NewL(KCRUidBluetoothEngine));
+    TInt avrcpVol = EBTAvrcpVolCTNotSupported;
+    TInt autoDisconnect = EBTDisconnectIfAudioOpenFails;
+    if (cenrep)
+        {
+        cenrep->Get(KBTAvrcpVolCTLV, avrcpVol);
+        cenrep->Get(KBTDisconnectIfAudioOpenFailsLV, autoDisconnect);
+        delete cenrep;
+        }
+    iAvrcpVolCTSupported = (avrcpVol == EBTAvrcpVolCTSupported);
+    iDisconnectIfAudioOpenFails = (autoDisconnect == EBTDisconnectIfAudioOpenFails);
+    TRACE_INFO((_L("[AVRCP_Vol_CT] %d [DisconnectIfAudioOpenFails] %d"), 
+        iAvrcpVolCTSupported, iDisconnectIfAudioOpenFails))
+    LoadServicesL();
+    }
+
 CBasrvAccMan::~CBasrvAccMan()
     {
     delete iOpenListener;
@@ -77,7 +100,6 @@
     iNotifierArray.ResetAndDestroy();
     iNotifierArray.Close();
     iClientRequests.Close();
-    DestructVariant();
     TRACE_FUNC    
     }
 
@@ -152,7 +174,14 @@
         request.iRequest = EBTAccSrvDisconnectAccessory;
         request.iAddr = aAddr;
         iClientRequests.AppendL(request);
+        
+        //remove the last item from the RArray if a leave occurs later
+        TCleanupItem cleanupItem(CleanupLastItemFromClientRequestsArray, &iClientRequests);
+        CleanupStack::PushL(cleanupItem);
+        
         iAccs[idx]->DisconnectL();
+        
+        CleanupStack::Pop(&iClientRequests);
         }
     else
         {
@@ -416,14 +445,23 @@
 void CBasrvAccMan::ShowNote(TBTGenericInfoNoteType aNote, const TBTDevAddr& aAddr)
     {
     TRACE_INFO((_L("CBasrvAccMan::ShowNote %d"), aNote))
-    TRAPD(err, iNotifierArray.Append(CBasrvActiveNotifier::NewL(*this, CActive::EPriorityStandard, KShowNoteRequest, aAddr, aNote)));
-    if (err)
+    TRAPD(err, DoShowNoteL(aNote, aAddr));
+    if (err != KErrNone)
         {
         TRACE_ERROR((_L("could not construct active notifer object")))
         return;
         }
     }
 
+void CBasrvAccMan::DoShowNoteL(TBTGenericInfoNoteType aNote, const TBTDevAddr& aAddr)
+    {
+    CBasrvActiveNotifier* activeNotifier = CBasrvActiveNotifier::NewL(*this, CActive::EPriorityStandard, KShowNoteRequest, aAddr, aNote);
+    
+    CleanupStack::PushL(activeNotifier);
+    iNotifierArray.AppendL(activeNotifier);
+    CleanupStack::Pop(activeNotifier);
+    }
+
 void CBasrvAccMan::FilterProfileSupport(TAccInfo& aInfo)
     {
     TInt pluginbit = iPluginMan->AvailablePlugins();
@@ -729,8 +767,6 @@
         case KAsyncHandlingRequest:
             {
             DoAudioRequestL();
-            delete iAsyncHandlingActive;
-            iAsyncHandlingActive = NULL;
             break;
             }
         default:
@@ -760,7 +796,7 @@
 void CBasrvAccMan::DoAudioRequestL()
     {
     TRACE_FUNC
-    if (iAudioRequests.Count() && !iAudioRequests[0].iOngoing && (!iAsyncHandlingActive || !iAsyncHandlingActive->IsActive()))
+    if (iAudioRequests.Count() && !iAudioRequests[0].iOngoing && !iAsyncHandlingActive->IsActive())
         {
         iAudioRequests[0].iOngoing = ETrue;
         TInt err = KErrNotFound;
@@ -827,7 +863,7 @@
     req.iReqType = ERejectAudioOpenedByAcc;
     req.iOngoing = EFalse;
     TInt idx = 0;
-    if (iAudioRequests.Count() && iAudioRequests[0].iOngoing)
+    if (iAudioRequests.Count() && iAudioRequests[0].iOngoing && !iAsyncHandlingActive->IsActive())
         {
         idx = 1;
         }
@@ -839,18 +875,12 @@
         Trace(_L("[Audio Request buf] 2(Reject) %d at '%S', to index %d"), iCloseType, &buf, idx);
         });
 
-    if (!err && !iAsyncHandlingActive && !iAudioRequests[0].iOngoing)
+    if ((err == KErrNone) && !iAudioRequests[0].iOngoing)
         {
-        // Start rejection asynchronously
-        iAsyncHandlingActive = 
-            CBasrvActive::New(*this, CActive::EPriorityStandard, KAsyncHandlingRequest);
-        if (iAsyncHandlingActive)
-            {
-            iAsyncHandlingActive->iStatus = KRequestPending;
-            TRequestStatus* sta = &(iAsyncHandlingActive->iStatus);
-            User::RequestComplete(sta, KErrNone);
-            iAsyncHandlingActive->GoActive();
-            }
+        iAsyncHandlingActive->iStatus = KRequestPending;
+        TRequestStatus* sta = &(iAsyncHandlingActive->iStatus);
+        User::RequestComplete(sta, KErrNone);
+        iAsyncHandlingActive->GoActive();
         }
     }
 
--- a/bluetoothengine/btaudioman/src/basrvaccstate.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstate.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -27,7 +27,6 @@
 
 CBasrvAccState::~CBasrvAccState()
     {
-    CompleteStateRequest(KErrAbort);
     }
     
 CBasrvAccState* CBasrvAccState::ErrorOnEntry(TInt /*aReason*/)
@@ -102,8 +101,8 @@
     TRACE_FUNC
     }
 
-CBasrvAccState::CBasrvAccState(CBasrvAcc& aParent, TRequestStatus* aRequest)
-    : iParent(aParent), iRequest(aRequest)
+CBasrvAccState::CBasrvAccState(CBasrvAcc& aParent)
+    : iParent(aParent)
     {
     }
 
@@ -112,25 +111,6 @@
     return iParent;
     }
 
-void CBasrvAccState::CompleteStateRequest(TInt aErr)
-    {
-    if (iRequest)
-        {
-        User::RequestComplete(iRequest, aErr);
-        TRACE_INFO((_L("Request 0x%08X completed with %d"), iRequest, aErr))
-        iRequest = NULL;
-        }
-    }
-    
-void CBasrvAccState::CompleteRequest(TRequestStatus* aStatus, TInt aErr)
-    {
-    if (aStatus)
-        {
-        User::RequestComplete(aStatus, aErr);
-        TRACE_INFO((_L("Request 0x%08X completed with %d"), aStatus, aErr))
-        }
-    }
-
 void CBasrvAccState::StatePrint(const TDesC& aStateName)
     {
     TRACE_INFO_SEG(
--- a/bluetoothengine/btaudioman/src/basrvaccstateattach.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstateattach.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -126,7 +126,7 @@
     }
 
 CBasrvAccStateAttach::CBasrvAccStateAttach(CBasrvAcc& aParent, TBool aConnecting)
-    : CBasrvAccState(aParent, NULL), iConnecting(aConnecting)
+    : CBasrvAccState(aParent), iConnecting(aConnecting)
     {
     }
  
--- a/bluetoothengine/btaudioman/src/basrvaccstateattached.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstateattached.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  Implementation of Connected state.
-*  Version     : %version: 20 %
+*  Version     : %version: 21 %
 *
 */
 
@@ -385,7 +385,7 @@
     }
 
 CBasrvAccStateAttached::CBasrvAccStateAttached(CBasrvAcc& aParent, TBool aShowNote)
-    : CBasrvAccState(aParent, NULL), iShowNote(aShowNote)
+    : CBasrvAccState(aParent), iShowNote(aShowNote)
     {
     }
 
--- a/bluetoothengine/btaudioman/src/basrvaccstateconnect.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstateconnect.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -105,7 +105,7 @@
     }
 
 CBasrvAccStateConnect::CBasrvAccStateConnect(CBasrvAcc& aParent)
-    : CBasrvAccState(aParent, NULL)
+    : CBasrvAccState(aParent)
     {
     }
     
--- a/bluetoothengine/btaudioman/src/basrvaccstatedetach.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstatedetach.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -112,7 +112,7 @@
     }
 
 CBasrvAccStateDetach::CBasrvAccStateDetach(CBasrvAcc& aParent)
-    : CBasrvAccState(aParent, NULL)
+    : CBasrvAccState(aParent)
     {
     }
  
--- a/bluetoothengine/btaudioman/src/basrvaccstatedisconnect.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstatedisconnect.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -81,7 +81,7 @@
     }
 
 CBasrvAccStateDisconnect::CBasrvAccStateDisconnect(CBasrvAcc& aParent, TInt aConnErr)
-    : CBasrvAccState(aParent, NULL), iConnErr(aConnErr)
+    : CBasrvAccState(aParent), iConnErr(aConnErr)
     {
     }
  
--- a/bluetoothengine/btaudioman/src/basrvaccstatequery.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvaccstatequery.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -133,7 +133,7 @@
     if ( ( AccInfo().iConnProfiles & EHFP ) && 
          AccInfo().iSupportedFeatures[TAccInfo::EHFPIndex] == 0 )
         {
-        CBTAccPlugin* plugin = Parent().AccMan().PluginMan().Plugin(EHFP);;
+        CBTAccPlugin* plugin = Parent().AccMan().PluginMan().Plugin(EHFP);
         AccInfo().SetSupportedFeature((TUint16)plugin->GetRemoteSupportedFeature(), TAccInfo::EHFPIndex);
         }
     
@@ -192,7 +192,7 @@
     }
 
 CBasrvAccStateQuery::CBasrvAccStateQuery(CBasrvAcc& aParent, TBool aConnectingRequest)
-    : CBasrvAccState(aParent, NULL), iConnecting(aConnectingRequest)
+    : CBasrvAccState(aParent), iConnecting(aConnectingRequest)
     {
     }
 
--- a/bluetoothengine/btaudioman/src/basrvsdpquery.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/basrvsdpquery.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -67,23 +67,23 @@
     SF.iAttrValue = 0;
     SF.iUUID = KAudioSinkUUID;  
     SF.iAttrID = KSdpAttrIdSupportedFeatures;        
-    iServiceAttrs.Append(SF); // Advanced Audio Distribution Profile - BT Stereo Audio
+    iServiceAttrs.AppendL(SF); // Advanced Audio Distribution Profile - BT Stereo Audio
     
     SF.iUUID = 0x111e;   // HFP
     SF.iAttrID = KSdpAttrIdSupportedFeatures;
-    iServiceAttrs.Append(SF); // BT Handsfree Profile - BT Mono Audio
+    iServiceAttrs.AppendL(SF); // BT Handsfree Profile - BT Mono Audio
     
     SF.iUUID = 0x1108;   // HSP
     SF.iAttrID = 0x0302;  // Atti id of remote volume control
-    iServiceAttrs.Append(SF); // BT Headset Profile - BT Mono Audio 
+    iServiceAttrs.AppendL(SF); // BT Headset Profile - BT Mono Audio 
 
     SF.iUUID = KAVRemoteControlTargetUUID;
     SF.iAttrID = KSdpAttrIdSupportedFeatures;
-    iServiceAttrs.Append(SF);  // Audio Video Remote Control Profile
+    iServiceAttrs.AppendL(SF);  // Audio Video Remote Control Profile
     
     SF.iUUID = KAVRemoteControlTargetUUID;
     SF.iAttrID = KSdpAttrIdBluetoothProfileDescriptorList;
-    iServiceAttrs.Append(SF);  // Audio Video Remote Control Profile, to find out avrcp 1.4 support    
+    iServiceAttrs.AppendL(SF);  // Audio Video Remote Control Profile, to find out avrcp 1.4 support    
 
     
     /*****************************************************
@@ -100,7 +100,7 @@
     TUUID serviceUuid = TUUID((0x00005555),(0x00001000),(0x80000002),(0xEE000001)); // model number
     SF.iUUID = serviceUuid;  
     SF.iAttrID = 0x0300; // Attri id of device model number
-    iServiceAttrs.Append(SF); 
+    iServiceAttrs.AppendL(SF); 
     iCursor = 0;
     iTolerateSdpError = aTolerateSdpError;
     iSdpAgent = CSdpAgent::NewL(*this, iAddr);
@@ -134,13 +134,19 @@
         {
         case ECreateView:
             {
+            // if we're called with iResponse != NULL we're leaking memory.
+            __ASSERT_ALWAYS(!iResponse, User::Invariant());
+            
             iResponse = NULL;
             if (aActive.iStatus > KErrNone)
                 {
-    		    iResponse = CBTRegistryResponse::NewL(iReg);	
-    		    aActive.SetRequestId(EGetResponse);    
-    		    iResponse->Start(aActive.iStatus);
-        	    aActive.GoActive();
+                TRAP_IGNORE( iResponse = CBTRegistryResponse::NewL(iReg) ); 
+                if (iResponse)
+                    {
+                    aActive.SetRequestId(EGetResponse);    
+                    iResponse->Start(aActive.iStatus);
+                    aActive.GoActive();
+                    }
                 }
             else
                 {
@@ -172,15 +178,21 @@
 void CBasrvSdpQuery::QueryCompleteL(TInt aErr)
     {
     iSdpAgent->Cancel();
+
     delete iSdpAgent;
     iSdpAgent = NULL;
+
     delete iSdpSearchPattern;
     iSdpSearchPattern = NULL;
+
     TBTDeviceClass cod = TBTDeviceClass();
 	if ( iResponse && iResponse->Results().Count() > 0 )
     	{
     	cod = (iResponse->Results())[0]->DeviceClass();
     	}
+	delete iResponse;
+	iResponse = NULL;
+	
     if (!aErr)
         {
         TAccInfo info;
--- a/bluetoothengine/btaudioman/src/btaudiomanplugin.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btaudioman/src/btaudiomanplugin.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -70,23 +70,27 @@
 TInt CBtAudioManPlugin::Connect( const TBTDevAddr& aAddr )
     {
     TRACE_FUNC
-    return HandleAsyncRequest(aAddr, ERequestConnect);    
+    TInt err = PrepareAsyncRequest(aAddr, ERequestConnect);
+    if(!err)
+        {
+        iDiagnostic.Zero();
+        iClient.ConnectToAccessory(iActive4ClientReq->iStatus, iBTDevAddrPckgBuf, iDiagnostic);
+        iActive4ClientReq->GoActive();
+        }
+    return err;
     }
 
 void CBtAudioManPlugin::CancelConnect( const TBTDevAddr& aAddr )
     {
     if (iBTDevAddrPckgBuf() == aAddr &&
-        iActive4ClientReq &&
         iActive4ClientReq->IsActive() &&
         iActive4ClientReq->RequestId() == ERequestConnect )
         {
         TRACE_INFO(_L("CBtAudioManPlugin::CancelConnect KErrCancel"))
-        delete iActive4ClientReq;
-        iActive4ClientReq = NULL;
+        iActive4ClientReq->Cancel();
         if (iObserver)
             {
-            iObserver->ConnectComplete(iBTDevAddrPckgBuf(), 
-                EBTProfileHFP, KErrCancel);
+            iObserver->ConnectComplete(aAddr, EBTProfileHFP, KErrCancel);
             }
         }
     else
@@ -94,8 +98,7 @@
         TRACE_INFO(_L("CBtAudioManPlugin::CancelConnect KErrNotFound"))
         if (iObserver)
             {
-            iObserver->ConnectComplete(aAddr , 
-                EBTProfileHFP, KErrNotFound);
+            iObserver->ConnectComplete(aAddr, EBTProfileHFP, KErrNotFound);
             }
         }
 
@@ -107,12 +110,26 @@
     if (aAddr == TBTDevAddr())
         {
         req = ERequestDisconnectAll;
-        }    
-    return HandleAsyncRequest(aAddr, req);
+        }
+    TInt err = PrepareAsyncRequest(aAddr, req);
+    if (!err)
+        {
+        if (req == ERequestDisconnect)
+            {
+            iClient.DisconnectAccessory(iActive4ClientReq->iStatus, iBTDevAddrPckgBuf, iDiagnostic);
+            }
+        else // if (req == ERequestDisconnectAll)
+            {
+            iClient.DisconnectAllGracefully(iActive4ClientReq->iStatus);
+            }
+        iActive4ClientReq->GoActive();
+        }
+    return err;
     }
 
 void CBtAudioManPlugin::GetConnections( RBTDevAddrArray& aAddrArray, TBTProfile aConnectedProfile )
     {
+    TRACE_FUNC
     aAddrArray.Reset();
     TProfiles profile = EUnknownProfile;
     
@@ -133,7 +150,6 @@
     TInt numAddresses = 2;
     TInt count = numAddresses;
     RBuf8 addrbuf;
-    TPtrC8 ptr(addrbuf);
     
     do
         {
@@ -171,6 +187,8 @@
     //maybe another connection was established while this was taking place
     while (count > numAddresses);
     
+    TPtrC8 ptr(addrbuf);
+    
     //iterate through the addresses buffer
     while (ptr.Length() >= KBTDevAddrSize)
         {
@@ -207,22 +225,45 @@
 void CBtAudioManPlugin::RequestCompletedL(CBasrvActive& aActive)
     {
     TRACE_FUNC
+    TInt result = aActive.iStatus.Int();
     switch (aActive.RequestId())
         {
         case ENotifyProfileStatusChange:
             {
-            if (aActive.iStatus == KErrNone && iObserver)
+            // Notify any observer if one is present, and we got valid data (i.e. no error)
+            if (result == KErrNone && iObserver)
+                {
+                ReportProfileConnectionEvents(iProfileStatus.iAddr, iProfileStatus.iProfiles, iProfileStatus.iConnected);
+                }
+            // Handle resubscribing for future notifications
+            static const TInt KMaxFailedNotifyConnectionStatusAttempts = 3;
+            if (result == KErrNone)
+                {
+                iNotifyConnectionStatusFailure = 0; // reset failure count
+                NotifyConnectionStatus();
+                }
+            else if (result != KErrServerTerminated && iNotifyConnectionStatusFailure < KMaxFailedNotifyConnectionStatusAttempts)
                 {
-                ReportProfileConnectionEvents(iProfileStatus.iAddr, iProfileStatus.iProfiles,
-                    iProfileStatus.iConnected);
-                iClient.NotifyConnectionStatus(iProfileStatusPckg, aActive.iStatus);
-                aActive.GoActive();
+                TRACE_ERROR((_L8("Connection Status Notification failed (transiently): %d"), result))
+                ++iNotifyConnectionStatusFailure;
+                NotifyConnectionStatus();
+                }
+            else
+                {
+                // The server has died unexpectedly, or we've failed a number of times in succession so we cannot re-subscribe. 
+                // The lack of state here makes it diffcult to know how to report (handle?) this.  However, we are in
+                // no worse situation than before, plus the issue is now logged.
+                TRACE_ERROR((_L8("Connection Status Notification failed (terminally): %d"), result))
+                iClient.Close(); // clean the handle, this might kill outstanding disconnect/connect requests
+                                 // but it looks like the server is hosed anyway...
+                // In keeping with the existing logic we don't attempt to re-start the server.  That will only happen when an
+                // active request is made.
                 }
             break;
             }
         case ERequestConnect:
             {
-            if (iActive4ClientReq->iStatus.Int() != KErrNone) // might have conflicts, decode iDiagnostic
+            if (result != KErrNone) // might have conflicts, decode iDiagnostic
                 {
                 if (iDiagnostic.Length() >= KBTDevAddrSize)
                     {
@@ -238,14 +279,12 @@
                         TRACE_INFO((_L8("conflict <%S>"), &myPtr))
                         ptr.Set(ptr.Mid(KBTDevAddrSize));
                         }
-                    iObserver->ConnectComplete(iBTDevAddrPckgBuf(), 
-                        EBTProfileHFP, iActive4ClientReq->iStatus.Int(), &array);
+                    iObserver->ConnectComplete(iBTDevAddrPckgBuf(), EBTProfileHFP, result, &array);
                     CleanupStack::PopAndDestroy(&array);
                     }
                 else
                     {
-                    iObserver->ConnectComplete(iBTDevAddrPckgBuf(), 
-                        EBTProfileHFP, iActive4ClientReq->iStatus.Int());
+                    iObserver->ConnectComplete(iBTDevAddrPckgBuf(), EBTProfileHFP, result);
                     }
                 }
             else
@@ -258,16 +297,13 @@
                     }
                 ReportProfileConnectionEvents(iBTDevAddrPckgBuf(), profile, ETrue);
                 }
-            delete iActive4ClientReq;
-            iActive4ClientReq = NULL;
             break;
             }
         case ERequestDisconnect:
             {
-            if (iActive4ClientReq->iStatus.Int() != KErrNone)
+            if (result != KErrNone)
                 {
-                iObserver->DisconnectComplete(iBTDevAddrPckgBuf(), 
-                        EBTProfileHFP, iActive4ClientReq->iStatus.Int());
+                iObserver->DisconnectComplete(iBTDevAddrPckgBuf(), EBTProfileHFP, result);
                 }
             else
                 {
@@ -278,27 +314,24 @@
                     pckg.Copy(iDiagnostic.Mid(0, sizeof(TInt))); 
                     }
                 ReportProfileConnectionEvents(iBTDevAddrPckgBuf(), profile, EFalse);
-                }            
-            delete iActive4ClientReq;
-            iActive4ClientReq = NULL;
+                }
             break;
             }
         case ERequestDisconnectAll:
             {
-            iObserver->DisconnectComplete(iBTDevAddrPckgBuf(), 
-                        EBTProfileHFP, iActive4ClientReq->iStatus.Int());
-			break;
+            iObserver->DisconnectComplete(iBTDevAddrPckgBuf(), EBTProfileHFP, result);
+            break;
             }
         }
     }
     
 void CBtAudioManPlugin::CancelRequest(CBasrvActive& aActive)
     {
-    if (aActive.RequestId() == ENotifyProfileStatusChange )
+    if (aActive.RequestId() == ENotifyProfileStatusChange)
         {
         iClient.CancelNotifyConnectionStatus();
         }
-    else if (aActive.RequestId() == ERequestConnect )
+    else if (aActive.RequestId() == ERequestConnect)
         {
         iClient.CancelConnectToAccessory();
         }
@@ -312,51 +345,49 @@
 void CBtAudioManPlugin::ConstructL()
     {
     LEAVE_IF_ERROR(iClient.Connect());
+    // Create the handler for profile notifications
     iActive4ProfileStatus = CBasrvActive::NewL(*this, CActive::EPriorityStandard, ENotifyProfileStatusChange);
+    NotifyConnectionStatus();
+    // Create the handler for active requests (connect, disconnect, etc.)
+    iActive4ClientReq = CBasrvActive::New(*this, CActive::EPriorityStandard, ERequestConnect);
+    }
+
+void CBtAudioManPlugin::NotifyConnectionStatus()
+    {
     iClient.NotifyConnectionStatus(iProfileStatusPckg, iActive4ProfileStatus->iStatus);
     iActive4ProfileStatus->GoActive();
     }
 
-TInt CBtAudioManPlugin::HandleAsyncRequest(const TBTDevAddr& aAddr, TInt aRequestId)
+TInt CBtAudioManPlugin::ReconnectIfNeccessary()
     {
     TInt err = KErrNone;
-    if (! iClient.Handle() )
+    if (iClient.Handle() == KNullHandle)
         {
+        TRACE_INFO((_L8("Handle to Audio Man Server is not valid, connecting again...")))
         err = iClient.Connect();
+        TRACE_INFO((_L8("... reconnection result = %d"), err))
+        if(!err)
+            {
+            // Now reconnected, we should start status notifications again...
+            NotifyConnectionStatus();
+            }
         }
-    if ( err )
+    return err;
+    }
+
+TInt CBtAudioManPlugin::PrepareAsyncRequest(const TBTDevAddr& aAddr, TInt aRequestId)
+    {
+    TInt err = KErrNone;
+    err = ReconnectIfNeccessary();
+    if (!err && iActive4ClientReq->IsActive())
         {
-        return err;
-        }
-    if ( iActive4ClientReq )
-        {
+        // I would normally expect KErrInUse, so as to distinguish this failure from running out of message slots
         err = KErrServerBusy;
         }
     if (!err)
         {
-        iActive4ClientReq = CBasrvActive::New(*this, CActive::EPriorityStandard, aRequestId);
-        if (iActive4ClientReq)
-            {
-            iBTDevAddrPckgBuf() = aAddr;
-            if (aRequestId == ERequestConnect)
-                {
-                iDiagnostic.Zero();
-                iClient.ConnectToAccessory(iActive4ClientReq->iStatus, iBTDevAddrPckgBuf, iDiagnostic);
-                }
-            else if (aRequestId == ERequestDisconnect)
-                {
-                iClient.DisconnectAccessory(iActive4ClientReq->iStatus, iBTDevAddrPckgBuf, iDiagnostic);
-                }
-            else // if (aRequestId == ERequestDisconnectAll)
-            	{
-            	iClient.DisconnectAllGracefully(iActive4ClientReq->iStatus);
-            	}
-            iActive4ClientReq->GoActive();
-            }
-        else
-            {
-            err = KErrNoMemory;
-            }
+        iBTDevAddrPckgBuf() = aAddr;
+        iActive4ClientReq->SetRequestId(aRequestId);
         }
     return err;    
     }
@@ -365,7 +396,7 @@
     {
     TRACE_FUNC
     TRACE_INFO((_L("status %d profiles 0x%04X"), aConnected, aProfiles))
-	TBTEngConnectionStatus status = IsConnected(aAddr);
+    TBTEngConnectionStatus status = IsConnected(aAddr);
     if (iObserver)
         {
         if (aConnected)
@@ -385,21 +416,21 @@
             }
         else
             {
-			if(	status != EBTEngConnected )
-				{
-	            if (aProfiles & EHFP)
-	                {
-	                iObserver->DisconnectComplete(aAddr, EBTProfileHFP, KErrNone);
-	                }
-	            if (aProfiles & EHSP)
-	                {
-	                iObserver->DisconnectComplete(aAddr, EBTProfileHSP, KErrNone);
-	                }
-	            if (aProfiles & EStereo)
-	                {
-	                iObserver->DisconnectComplete(aAddr, EBTProfileA2DP, KErrNone);
-	                }
-				}
+            if (status != EBTEngConnected)
+                {
+                if (aProfiles & EHFP)
+                    {
+                    iObserver->DisconnectComplete(aAddr, EBTProfileHFP, KErrNone);
+                    }
+                if (aProfiles & EHSP)
+                    {
+                    iObserver->DisconnectComplete(aAddr, EBTProfileHSP, KErrNone);
+                    }
+                if (aProfiles & EStereo)
+                    {
+                    iObserver->DisconnectComplete(aAddr, EBTProfileA2DP, KErrNone);
+                    }
+                }
             }
         }
     }
--- a/bluetoothengine/bteng/btfeatures/btfeatures.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/btfeatures/btfeatures.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -16,19 +16,11 @@
 */
 
 
-#include <btfeaturescfg.h> 
-#include <featmgr/FeatureControl.h>
-#include <featmgr/FeatMgr.h>
+#include <btfeaturescfg.h>
 
-/**
-	Device supports bluetooth data profiles disabled.
-*/
-const TInt KFeatureIdTempFfBluetoothDataProfilesDisabled = 0x1000001;
-	
-/**
-	Device supports bluetooth disabled.
-*/
-const TInt KFeatureIdTempFfBluetoothDisabled = 0x1000002;
+#include <centralrepository.h> 
+
+#include "btengprivatecrkeys.h"
 
 
 EXPORT_C void BluetoothFeatures::SetEnterpriseEnablementL(BluetoothFeatures::TEnterpriseEnablementMode aMode)
@@ -40,54 +32,72 @@
 	if ( proc.SecureId() != KDcmoServerSecureUid )
 		{
 		User::Leave(KErrPermissionDenied);
-		}	
-
-	const TUid KBtDisabledUid = {KFeatureIdTempFfBluetoothDisabled};
-	const TUid KBtDataProfilesDisabledUid = {KFeatureIdTempFfBluetoothDataProfilesDisabled};
-
-	RFeatureControl featureControl;
-	User::LeaveIfError(featureControl.Connect());
-	CleanupClosePushL(featureControl);
-	switch ( aMode )
+		}
+	
+	// get ready to use the central repository.
+	CRepository* cenRep = CRepository::NewL(KCRUidBTEngPrivateSettings);
+	CleanupStack::PushL(cenRep);
+	
+	switch(aMode)
 		{
 	case EDisabled:
-		User::LeaveIfError(featureControl.EnableFeature(KBtDisabledUid));
-		User::LeaveIfError(featureControl.DisableFeature(KBtDataProfilesDisabledUid));
+		User::LeaveIfError(cenRep->Set(KBluetoothEnterpriseState, EBluetoothEnterpriseDisabled));
 		break;
 	case EDataProfilesDisabled:
-		User::LeaveIfError(featureControl.DisableFeature(KBtDisabledUid));
-		User::LeaveIfError(featureControl.EnableFeature(KBtDataProfilesDisabledUid));
+		User::LeaveIfError(cenRep->Set(KBluetoothEnterpriseState, EBluetoothEnterpriseDataProfilesDisabled));
 		break;
 	case EEnabled:
-		User::LeaveIfError(featureControl.DisableFeature(KBtDisabledUid));
-		User::LeaveIfError(featureControl.DisableFeature(KBtDataProfilesDisabledUid));
+		User::LeaveIfError(cenRep->Set(KBluetoothEnterpriseState, EBluetoothEnterpriseEnabled));
 		break;
 	default:
 		User::Leave(KErrArgument);
 		break;
 		}
-	CleanupStack::PopAndDestroy(&featureControl);
+	
+	CleanupStack::PopAndDestroy(cenRep);
 	}
 
 EXPORT_C BluetoothFeatures::TEnterpriseEnablementMode BluetoothFeatures::EnterpriseEnablementL()
 	{
-	TEnterpriseEnablementMode mode = EDisabled;
+	TEnterpriseEnablementMode mode = EEnabled;
+	TInt setting = EBluetoothEnterpriseEnabled;
+	
+	// get the value out of the repository.
+	CRepository* cenRep = CRepository::NewL(KCRUidBTEngPrivateSettings);
+	CleanupStack::PushL(cenRep);
 	
-	FeatureManager::InitializeLibL();
-    const TBool bluetoothDisabled = FeatureManager::FeatureSupported(KFeatureIdTempFfBluetoothDisabled);
-    if ( !bluetoothDisabled )
+	TInt err = cenRep->Get(KBluetoothEnterpriseState, setting);
+	if(err == KErrNotFound)
 		{
-		const TBool dataProfilesDisabled = FeatureManager::FeatureSupported(KFeatureIdTempFfBluetoothDataProfilesDisabled);
-		if ( dataProfilesDisabled )
+		// not found in repository, so assume enabled by default
+		mode = EEnabled;
+		}
+	else if(err == KErrNone)
+		{
+		// Got a value from repository, convert it as appropriate.
+		switch(setting)
 			{
+		case EBluetoothEnterpriseDisabled:
+			mode = EDisabled;
+			break;
+		case EBluetoothEnterpriseDataProfilesDisabled:
 			mode = EDataProfilesDisabled;
-			}
-		else
-			{
+			break;
+		case EBluetoothEnterpriseEnabled:
 			mode = EEnabled;
-			}	
+			break;
+		default:
+			User::Leave(KErrUnknown);
+			break;
+			}
 		}
-    FeatureManager::UnInitializeLib();
-    
+	else
+		{
+		// Some other error accessing the central repository.
+		User::Leave(err);
+		}
+	
+	CleanupStack::PopAndDestroy(cenRep);
+	
 	return mode;
 	}
--- a/bluetoothengine/bteng/btfeatures/btfeatures.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/btfeatures/btfeatures.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -28,9 +28,10 @@
 SOURCEPATH		.
 SOURCE			btfeatures.cpp
 
+USERINCLUDE		../../inc
 MW_LAYER_SYSTEMINCLUDE
 
 LIBRARY			euser.lib
-LIBRARY			featmgr.lib
+LIBRARY			centralrepository.lib
 
 deffile ~/btfeatures.def
--- a/bluetoothengine/bteng/bttoggle/inc/bttoggle.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/bttoggle/inc/bttoggle.h	Fri Apr 16 15:08:36 2010 +0300
@@ -143,10 +143,10 @@
 
     enum TToggleActiveNotifier
       {
-      ENoneQuery = 0,		    
+      ENoneQuery = 0,
       EPowerModeQuery,
       ECloseConnectionQuery, 
-      EFakeNotif
+      EPowerModeChangeNote
       };
 
   private: //Data	
--- a/bluetoothengine/bteng/bttoggle/src/bttoggle.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/bttoggle/src/bttoggle.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -177,21 +177,21 @@
     //BT Connected or error obtaining link count (in the case of error, we are cautious and assume BT is connected)
     if (errLinkCount || linkCount > 0)
       {
-      TRACE_INFO((_L("[BTENG][BTTOGGLE]Ongoing BT connection") ))								
+      TRACE_INFO((_L("[BTENG][BTTOGGLE]Ongoing BT connection") ))
       __ASSERT_DEBUG(iActiveNotifier == ENoneQuery, Panic(EBTToggleInvalidStateCloseConnectionQuery));
 
-      iActiveNotifier = ECloseConnectionQuery;						
+      iActiveNotifier = ECloseConnectionQuery;
       iPckgGenericQuery().iMessageType = EBTSwitchOffAnyway;
       iPckgGenericQuery().iNameExists = EFalse;
-      iNotifier.StartNotifierAndGetResponse(iStatus, KBTGenericQueryNotifierUid, iPckgGenericQuery, iConnQuery );			
-      SetActive();															
-      }	
+      iNotifier.StartNotifierAndGetResponse(iStatus, KBTGenericQueryNotifierUid, iPckgGenericQuery, iConnQuery );
+      SetActive();
+      }
     //No open connections
     else
       {
       TRACE_INFO((_L("[BTENG][BTTOGGLE] No BT connections") ))
       ChangeBtPowerMode(EBTPowerOff);
-      }					 
+      }
     }
   TRACE_FUNC_EXIT	
   }
@@ -241,20 +241,17 @@
   TRACE_FUNC_ENTRY
   __ASSERT_DEBUG(iActiveNotifier == ENoneQuery, Panic(EBTToggleInvalidStateChangeBtPowerMode));
 
-  TRequestStatus *stat = &iStatus; 
-  TInt errPower = iSettings->SetPowerState(aNewPowerState);					
-
+  TInt errPower = iSettings->SetPowerState(aNewPowerState);
   if (KErrNone == errPower)
     {
     ShowNotification( static_cast<TBool>(aNewPowerState) );
+    iActiveNotifier = EPowerModeChangeNote; 
+    iStatus = KRequestPending;
+    SetActive();
     }
-  iActiveNotifier = EFakeNotif; 
-  iStatus = KRequestPending;
-  User::RequestComplete(stat, KErrNone);
-  SetActive();
 
   TRACE_FUNC_EXIT
-  return errPower; 	
+  return errPower;
   }
 
 // ==========================================================
@@ -284,7 +281,7 @@
   Cancel();
 
   //Start new notification
-  iNotifier.StartNotifier(KBTGenericInfoNotifierUid, pckgGenericInfo, result);	
+  iNotifier.StartNotifierAndGetResponse(iStatus, KBTGenericInfoNotifierUid, pckgGenericInfo, result);	
 
   TRACE_FUNC_EXIT
   }
@@ -304,7 +301,11 @@
   else if ( ECloseConnectionQuery == iActiveNotifier ) 
     {
     iNotifier.CancelNotifier(KBTGenericQueryNotifierUid); 
-    }
+    }  
+  else if ( EPowerModeChangeNote == iActiveNotifier ) 
+      {
+      iNotifier.CancelNotifier(KBTGenericQueryNotifierUid); 
+      }
 
   // For all cancels, we must reset iActiveNotifier back to ENoneQuery
   // to permit another request to be made.
@@ -328,10 +329,10 @@
   // to permit another request to be made.
   switch (iActiveNotifier)
     {							
-    case EPowerModeQuery:				
+    case EPowerModeQuery:
       iActiveNotifier = ENoneQuery;
-      ShowNotification(ETrue);
-      CActiveScheduler::Stop();
+      ShowNotification(ETrue);    
+      SetActive();
       break; 			
     case ECloseConnectionQuery:							
       iActiveNotifier = ENoneQuery;
@@ -343,8 +344,8 @@
         {
         CActiveScheduler::Stop();
         }																				
-      break;											
-    default: //ENoneQuery or EFakeNotif
+      break;
+    default: //ENoneQuery or EPowerModeChangeNote
       iActiveNotifier = ENoneQuery;
       CActiveScheduler::Stop();
     }						
@@ -358,8 +359,9 @@
 // ==========================================================
 //
 TInt CBTToggle::RunError(TInt aError)
-  {	  
-  TRACE_INFO((_L("[BTENG][BTTOGGLE]RunL error %d"), aError ))		
-  CActiveScheduler::Stop();
-  return KErrNone;
-  }
+    {	  
+    TRACE_INFO((_L("[BTENG][BTTOGGLE] RunError %d"), aError ))	
+    iActiveNotifier = ENoneQuery;
+    CActiveScheduler::Stop();
+    return KErrNone;
+    }
Binary file bluetoothengine/bteng/cenrep/keys_bteng.xls has changed
Binary file bluetoothengine/bteng/conf/bteng.confml has changed
Binary file bluetoothengine/bteng/conf/bteng_10204DAC.crml has changed
--- a/bluetoothengine/bteng/data/btengsdp.rss	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/data/btengsdp.rss	Fri Apr 16 15:08:36 2010 +0300
@@ -879,7 +879,7 @@
                             elements = 
                                 {
                                 ELEMENT_UUID { uuid = SERVICE_CLASS_ID_HEADSET; },
-                                ELEMENT_WORD { value = 0x0100; }
+                                ELEMENT_WORD { value = 0x0102; }
                                 };
                             }
                         };
Binary file bluetoothengine/bteng/data/btrfs.txt has changed
--- a/bluetoothengine/bteng/data/bttoggle_reg.rss	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/data/bttoggle_reg.rss	Fri Apr 16 15:08:36 2010 +0300
@@ -24,7 +24,9 @@
 
 RESOURCE APP_REGISTRATION_INFO
     {
-    app_file = "bttoggle";	
+    app_file = "bttoggle";
+    hidden = KAppIsHidden;
+    launch = KAppLaunchInForeground;
     }
 
 
--- a/bluetoothengine/bteng/group/backup_registration.xml	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-<backup_registration>
-    <proxy_data_manager sid = "0x10202BE9" />
-    <dbms_backup policy="0x100069CC" /> 
-    <restore requires_reboot = "no"/>
-</backup_registration>
-  
\ No newline at end of file
--- a/bluetoothengine/bteng/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -39,11 +39,6 @@
 ../conf/bteng_10204DAB.crml 	            MW_LAYER_CRML(bteng_10204DAB.crml)
 ../conf/bteng_10204DAC.crml 	            MW_LAYER_CRML(bteng_10204DAC.crml)
 
-
-// Backup registration file
-backup_registration.xml  /epoc32/data/z/private/10005950/backup_registration.xml
-backup_registration.xml  /epoc32/release/winscw/udeb/z/private/10005950/backup_registration.xml
-backup_registration.xml  /epoc32/release/winscw/urel/z/private/10005950/backup_registration.xml
 ../data/btrfs.txt        /epoc32/data/z/resource/btrfs.txt
 ../data/btrfs.txt        /epoc32/release/winscw/udeb/z/resource/btrfs.txt
 ../data/btrfs.txt        /epoc32/release/winscw/urel/z/resource/btrfs.txt
--- a/bluetoothengine/bteng/group/bteng.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/group/bteng.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -35,11 +35,11 @@
 SOURCE                  btengsrvbbconnectionmgr.cpp
 SOURCE                  btengsdpdbhandler.cpp
 SOURCE                  btengsrvkeywatcher.cpp
-SOURCE                  btengactive.cpp
 SOURCE                  btengpairman.cpp
 SOURCE                  btengpairbase.cpp
 SOURCE                  btengincpair.cpp 
 SOURCE                  btengotgpair.cpp
+SOURCE                  btengsrvsettingsmgr.cpp
 START RESOURCE          ../data/btengsdp.rss
 HEADER
 TARGETPATH              RESOURCE_FILES_DIR
@@ -64,6 +64,10 @@
 LIBRARY                 aknnotify.lib
 LIBRARY                 btfeatures.lib
 
+#ifndef SETLOCALNAME
+LIBRARY                 btengsettings.lib
+#endif
+
 LIBRARY                 btpowercontrol.lib
 #ifndef __WINS__
 LIBRARY                 dutmode.lib
--- a/bluetoothengine/bteng/group/btengconnman.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/group/btengconnman.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -31,7 +31,6 @@
 SOURCE                  btengconnhandler.cpp
 SOURCEPATH              ../src
 SOURCE                  btengclient.cpp
-SOURCE                  btengactive.cpp
 
 USERINCLUDE             ../inc
 USERINCLUDE             ../btengconnman/inc
--- a/bluetoothengine/bteng/group/btengdiscovery.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/group/btengdiscovery.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -32,7 +32,6 @@
 SOURCE                  btengsdpattrparser.cpp
 SOURCE                  btengdevicesearch.cpp
 SOURCEPATH              ../src
-SOURCE                  btengactive.cpp
 SOURCE                  btengsdpdbhandler.cpp
 
 USERINCLUDE             ../inc
--- a/bluetoothengine/bteng/group/btengsettings.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/group/btengsettings.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -30,7 +30,6 @@
 SOURCE                  btengsettings.cpp
 SOURCE                  btengsettingsnotify.cpp
 SOURCEPATH              ../src
-SOURCE                  btengactive.cpp
 SOURCE                  btengclient.cpp
 
 USERINCLUDE             ../inc
--- a/bluetoothengine/bteng/inc/btengactive.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengactive.h	Fri Apr 16 15:08:36 2010 +0300
@@ -86,10 +86,12 @@
      * @since S60 v3.2
      * @param aObserver Pointer to callback interface that receives notification
      *                  that the request has been completed.
+     * @param aId Identifier for the CBTEngActive instance.
+     * @param aPriority The priority of the active object.
      * @return Pointer to the constructed CBTEngActive object.
      */
-    static CBTEngActive* NewL( MBTEngActiveObserver& aObserver, 
-                                TInt aId, TInt aPriority );
+    static CBTEngActive* NewL( MBTEngActiveObserver& aObserver, TInt aId,
+                                TInt aPriority = CActive::EPriorityStandard );
 
     /**
      * Destructor
--- a/bluetoothengine/bteng/inc/btengactive.inl	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengactive.inl	Fri Apr 16 15:08:36 2010 +0300
@@ -16,6 +16,66 @@
 */
 
 
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+inline CBTEngActive::CBTEngActive(  MBTEngActiveObserver& aObserver, TInt aId, 
+    TInt aPriority )
+:   CActive( aPriority ),
+    iRequestId( aId ),
+    iObserver( aObserver )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd-phase constructor
+// ---------------------------------------------------------------------------
+//
+inline void CBTEngActive::ConstructL()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+inline CBTEngActive* CBTEngActive::NewL( MBTEngActiveObserver& aObserver, 
+    TInt aId, TInt aPriority )
+    {
+    CBTEngActive* self = new( ELeave ) CBTEngActive( aObserver, aId, aPriority );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+inline CBTEngActive::~CBTEngActive()
+    {
+    Cancel();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// Called by the active scheduler when the request has been cancelled.
+// ---------------------------------------------------------------------------
+//
+inline void CBTEngActive::DoCancel()
+    {
+    }
+
+
 
 // -----------------------------------------------------------------------------
 // Get the identifier of this instance.
@@ -65,3 +125,26 @@
     {
     return iStatus;
     }
+
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// Called by the active scheduler when the request has been completed.
+// ---------------------------------------------------------------------------
+//
+inline void CBTEngActive::RunL()
+    {
+    iObserver.RequestCompletedL( this, iRequestId, iStatus.Int() );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// Called by the active scheduler when an error in RunL has occurred.
+// ---------------------------------------------------------------------------
+//
+inline TInt CBTEngActive::RunError( TInt aError )
+    {
+    iObserver.HandleError( this, iRequestId, aError );
+    return KErrNone;
+    }
--- a/bluetoothengine/bteng/inc/btengincpair.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengincpair.h	Fri Apr 16 15:08:36 2010 +0300
@@ -176,6 +176,7 @@
      */
     RTimer iPairingOkTimer;
     CBTEngActive* iActivePairingOk;
+    TBool iUserAwarePairing;
     };
 
 #endif /*BTENGINCPAIR_H_*/
--- a/bluetoothengine/bteng/inc/btengpairman.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengpairman.h	Fri Apr 16 15:08:36 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -61,12 +61,6 @@
     void ProcessCommandL( const RMessage2& aMessage );
     
     /**
-     * Cancels an outstanding command.
-     * @param aOpcode the identifier of the command to be cancelled.
-     */
-    void CancelCommand( TInt aOpCode );
-    
-    /**
      * Handle a change in BTRegistry remote device table.
      *
      * @since S60 v5.1
@@ -103,6 +97,14 @@
     void OutgoingPairCompleted( TInt aErr );
     
     /**
+     * Be informed that a session will be closed.
+     *
+     * @since Symbian^3
+     * @param aSession the session to be cloased.
+     */
+    void SessionClosed(CSession2* aSession );
+    
+    /**
      * Unpair a device via registry
      */
     void UnpairDevice( const TBTDevAddr& aAddr );
@@ -165,6 +167,16 @@
     void ConstructL();
 
     /**
+     * Initialiases the paired devices list
+     */
+    void InitPairedDevicesList();
+
+    /**
+     * Initialises the paired devices list (second stage)
+     */
+    void DoInitPairedDevicesList();
+
+    /**
      * Activate / deactivate a pair observer
      */
     TInt SetPairObserver(const TBTDevAddr& aAddr, TBool aActivate);
@@ -313,6 +325,31 @@
      * Own.
      */
     CBTEngPairBase* iPairer;
+    
+    /**
+     * Client-server message for power change requests.
+     */
+    RMessage2 iMessage;
+
+    /**
+     * AO for local address updates.
+     */
+    CBTEngActive* iLocalAddrActive;
+
+    /**
+     * Provides access to the BT local device address.
+     */
+    RProperty iPropertyLocalAddr;
+
+    /**
+     * Records whether or not this CBTEngPairMan has ever been involed in a pairing operaton.
+     */
+    TBool iPairingOperationAttempted;
+
+    /**
+     * Counter of unhandled paired device view initialisation requests.
+     */
+    TInt iNotHandledInitEventCounter;
     };
 
 #endif /*BTENGPAIRMANAGER_H_*/
--- a/bluetoothengine/bteng/inc/btengprivatecrkeys.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengprivatecrkeys.h	Fri Apr 16 15:08:36 2010 +0300
@@ -79,8 +79,6 @@
  */
 const TUint32 KBTSapEnabled	= 0x00000003;
 
-const TUint32 KBtHidKeyboardLayout = 0x00000004;
-
 /**  Enumeration for Bluetooth SAP setting */
 enum TBTSapMode
     {
@@ -88,5 +86,16 @@
     EBTSapEnabled
     };
 
+const TUint32 KBtHidKeyboardLayout = 0x00000004;
+
+const TUint32 KBluetoothEnterpriseState = 0x00000005;
+
+enum TBluetoothEnterpriseState
+	{
+	EBluetoothEnterpriseDisabled = 0,
+	EBluetoothEnterpriseDataProfilesDisabled = 1,
+	EBluetoothEnterpriseEnabled = 2,
+	};
+
 
 #endif // BTENG_PRIVATE_CR_KEYS_H
--- a/bluetoothengine/bteng/inc/btengserver.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengserver.h	Fri Apr 16 15:08:36 2010 +0300
@@ -20,13 +20,10 @@
 #define BTENGSERVER_H
 
 #include <bluetooth/btpowercontrol.h>
-#ifndef __WINS__
-#include <bluetooth/dutmode.h>
-#endif  //__WINS__  
 #include <bt_sock.h>
 #include <bttypes.h>
-#include <btfeaturescfg.h>
-#include "btengdomaincrkeys.h"
+#include <btserversdkcrkeys.h>
+
 #include "btengconstants.h"
 
 class CBTEngSrvState;
@@ -40,6 +37,7 @@
 class TEComResolverParams;
 class CImplementationInformation;
 class CDeltaTimer;
+class CBTEngSrvSettingsMgr;
 
 /**
  * Main function in which the server is running.
@@ -75,7 +73,8 @@
     EBTEngPanicArgumentIsNull,
     EBTEngPanicMemberVarIsNull,
     EBTEngPanicCorrupt,
-    EBTEngPanicCorruptSettings
+    EBTEngPanicCorruptSettings,
+    EBTEngPanicExpectSetPowerOpcode,
     };
 
 
@@ -90,43 +89,114 @@
 NONSHARABLE_CLASS( CBTEngServer ) : public CPolicyServer
     {
 
-    friend class CBTEngSrvSession;
-    friend class CBTEngSrvState;
     friend class CBTEngSrvPluginMgr;
-    friend class CBTEngSrvKeyWatcher;
     friend class CBTEngPairMan;
 
 public:
 
+    /**  Enumeration of bitmask for keeping track of different timers. */
+    enum TTimerQueued
+        {
+        ENone               = 0x00,
+        EScanModeTimer      = 0x01,
+        EIdleTimer          = 0x02,
+        EAutoPowerOffTimer  = 0x04,
+        ESspDebugModeTimer  = 0x08 
+        };
+
+    /**
+     * Two-phased constructor.
+     */
     static CBTEngServer* NewLC();
 
+    /**
+     * Destructor.
+     */
     virtual ~CBTEngServer();
 
     /**
-     * ?description
+     * Getter for power change state machine instance.
+     *
+     * @since Symbian^3
+     * @return Pointer to instance of state machine.
+     */
+    inline CBTEngSrvState* StateMachine() const
+            { return iServerState; }
+
+    /**
+     * Getter for settings manager instance.
+     *
+     * @since Symbian^3
+     * @return Pointer to instance of settings manager.
+     */
+    inline CBTEngSrvSettingsMgr* SettingsManager() const
+            { return iSettingsMgr; }
+
+    /**
+     * Getter for plug-in manager instance.
+     *
+     * @since Symbian^3
+     * @return Pointer to instance of plug-in manager.
+     */
+    inline CBTEngSrvPluginMgr* PluginManager() const
+            { return iPluginMgr; }
+
+    /**
+     * Getter for baseband connection manager instance.
+     *
+     * @since Symbian^3
+     * @return Pointer to instance of baseband connection manager.
+     */
+    inline CBTEngSrvBBConnMgr* BasebandConnectionManager() const
+            { return iBBConnMgr; }
+
+    /**
+     * Getter for pairing manager. Ownership is not transferred.
+     *
+     * @since Symbian^3
+     * @return Pointer to instance of baseband connection manager.
+     */
+    inline CBTEngPairMan* PairManager() const
+            { return iPairMan; }
+
+    /**
+     * Getter for socket server session.
+     * This handle can be used for creating subsessions.
+     *
+     * @since Symbian^3
+     * @return Reference to session with the socket server.
+     */
+    inline RSocketServ& SocketServer()
+            { return  iSocketServ; }
+
+    /**
+     * Getter for registry server session.
+     * This handle can be used for creating subsessions.
+     *
+     * @since Symbian^3
+     * @return Reference to session with the registry server.
+     */
+    inline RBTRegServ& RegistrServer()
+            { return iBTRegServ; }
+
+    /**
+     * Set Bluetooth on or off
      *
      * @since S60 v3.2
      * @param aState The new power state.
-     * @param aTemp Turn BT off after use (ETrue) or not (EFalse).
+     * @param aTemporary Turn BT off after use (ETrue) or not (EFalse).
      */
-    void SetPowerStateL( TBTPowerStateValue aState, TBool aTemporary );
+    void SetPowerStateL( TBTPowerState aState, TBool aTemporary );
 
     /**
-     * ?description
+     * Set Bluetooth on or off upon a client power management request.
+     * This function is only for power management request from clients of bteng server.
      *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
+     * @since Symbian^3
+     * @param aMessage The message containing the detail of power management request.
      */
-    void SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime );
+    void SetPowerStateL( const RMessage2 aMessage );
     
-     /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void UpdateVisibilityModeL( TInt aStackScanMode );
-
     /**
      * ?description
      *
@@ -141,23 +211,7 @@
      * @since S60 v3.2
      * @param ?arg1 ?description
      */
-    void SetDutMode( TInt aDutMode );
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void ScanModeTimerCompletedL();
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-     void DisconnectAllCompleted();
+    void DisconnectAllCompleted();
 
     /**
      * ?description
@@ -172,86 +226,89 @@
      *
      * @since S60 v3.2
      */
-     void AddSession();
+    void AddSession();
 
     /**
      * Decrement the session count.
      *
-     * @since S60 v3.2
+     * @since Symbian^3
+     * @param aSession the session to be cloased.
      * @param aAutoOff Indicator if this session had requested BT temporary on.
      */
-     void RemoveSession( TBool aAutoOff );
-     
-     /**
-     * ?description
+    void RemoveSession(CSession2* aSession, TBool aAutoOff );
+
+    /**
+     * Queue a new timer.
+     *
+     * @since Symbian^3
+     * @param aTimer Identifier for the timer to be queued.
+     * @param aInterval The interval for timer callback.
+     */
+    void QueueTimer( CBTEngServer::TTimerQueued aTimer, TInt64 aInterval );
+
+    /**
+     * Remove a queued timer.
+     *
+     * @since Symbian^3
+     * @param aTimer Identifier for the timer to be removed.
+     */
+    void RemoveTimer( CBTEngServer::TTimerQueued aTimer );
+
+    /**
+     * Check if a specific timer is currently queued.
+     *
+     * @since Symbian^3
+     * @param aTimer Identifier for the timer to check.
+     */
+    inline TBool IsTimerQueued( CBTEngServer::TTimerQueued aTimer ) const
+            { return ( iTimerQueued & aTimer ); }
+
+    /**
+     * Returns the service (limited to services managed in bteng scope)
+     * level connection status of the specified device.
+     *
+     * @param aAddr the address of the device
+     * @return one of TBTEngConnectionStatus enums
+     */
+    TBTEngConnectionStatus IsDeviceConnected( const TBTDevAddr& aAddr );
+
+    /**
+     * Checks if power is off and no session are connected, and
+     * starts a shutdown timer if so.
      *
      * @since S60 v3.2
      * @param ?arg1 ?description
      */
-     void SetUiIndicatorsL();
-     
-     /**
+    void CheckIdle();
+
+    /**
      * ?description
      *
      * @since S60 v3.2
      * @param ?arg1 ?description
      */
-     void SetIndicatorStateL( const TInt aIndicator, const TInt aState );
-
-    /**
-     * Check whether BT should be turned off automatically.
-     *
-     * @since S60 v5.0
-     */
-     void CheckAutoPowerOffL();
+    void ManageDIServiceL( TBool aState );
 
     /**
-     * Utility to get HW power state.
-     *
-     * @since S60 v5.1
-     * @param aState On return, this will contain the current HW power state.
-     * @return KErrNone if successful, otherwise one of the system-wide error codes.
-     */
-    TInt GetHwPowerState( TBTPowerStateValue& aState );
-
-     /**
-     * queue a timer if Simple Pairing debug mode has been enabled.
+     * Callback function for completion of disconnecting all 
+     * Bluetoooth Baseband links.
      *
      * @since S60 v3.2
-     * @param aDebugMode State of Simple Pairing debug mode.
+     * @param aPtr Pointer to ourselves.
+     * @return Result
      */
-     void CheckSspDebugModeL( TBool aDebugMode );
-     
-     /**
-      * Gets the access to pairing manager. Ownership is not transferred.
-      * @return the pairing manager
-      */
-     CBTEngPairMan& PairManager();
-     
-     /**
-      * Be informed when registry remote device table is changed
-      */
-     void RemoteRegistryChangeDetected();
+    static TInt DisconnectAllCallBack( TAny* aPtr );
 
-     /**
-      * gets the reference of socket server session
-      */
-     RSocketServ& SocketServ();
-     
-     /**
-      * gets the reference of registry session.
-      */
-     RBTRegServ& BTRegServ();
-     
-     /**
-      * Returns the service (limited to services managed in bteng scope)
-      * level connection status of the specified device.
-      *
-      * @param aAddr the address of the device
-      * @return one of TBTEngConnectionStatus enums
-      */
-     TBTEngConnectionStatus IsDeviceConnected( const TBTDevAddr& aAddr );
-     
+    /**
+     * Callback function for turning BT off automatically after all
+     * connections are gone.
+     *
+     * @since S60 v5.0
+     * @param aPtr Pointer to ourselves.
+     * @return Result
+     */
+    static TInt AutoPowerOffCallBack( TAny* aPtr );
+
 // from base class CPolicyServer
 
     /**
@@ -264,10 +321,6 @@
     virtual CSession2* NewSessionL( const TVersion& aVersion, 
                                      const RMessage2& aMessage ) const;
 
-// from base class MBTPowerManagerObserver
-
-    BluetoothFeatures::TEnterpriseEnablementMode EnterpriseEnablementMode() const;
-    
 private:
 
     CBTEngServer();
@@ -275,81 +328,6 @@
     void ConstructL();
 
     /**
-     * Checks if power is off and no session are connected, and
-     * starts a shutdown timer if so.
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-     void CheckIdle();
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    TInt SetPowerState( TBool aState );
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    TInt SetLocalNameL();
-    
-    TInt GetLocalNameFromRegistryL(TDes& aName);
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void SetClassOfDeviceL();
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void InitBTStackL();
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void StopBTStackL();
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void UpdateCenRepPowerKeyL( TBTPowerStateValue aValue );
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void LoadBTPowerManagerL();
-
-    /**
-     * ?description
-     *
-     * @since S60 v3.2
-     * @param ?arg1 ?description
-     */
-    void ManageDIServiceL( TBool aState );
-    
-    /**
      * Reads the product-specific IDs for this phone from central repository.
      * These values are used in the BT Device Information profile.
      *
@@ -358,19 +336,6 @@
      * @param aProductId On return, holds the product ID for this phone.
      */
     void GetProductIdsL( TInt& aVendorId, TInt& aProductId );
-    
-	/**
-     * Checks if a client requests temporary power on/off, and keeps track 
-     * of the number of clients requesting that.
-     *
-     * @since S60 v5.0
-     * @param aCurrentState On return, will contain the current power state.
-     * @param aNewState The requested power state.
-     * @param aTemporary Indicates if this is about a tempororary state change.
-     */
-    void CheckTemporaryPowerStateL( TBTPowerStateValue& aCurrentState, 
-                                     TBTPowerStateValue aNewState, 
-                                     TBool aTemporary );
 
     /**
      * Callback function for expiry of CDeltaTimer timer of temporary 
@@ -383,16 +348,6 @@
     static TInt ScanModeTimerCallBack( TAny* aPtr );
     
     /**
-     * Callback function for completion of disconnecting all 
-     * Bluetoooth Baseband links.
-     *
-     * @since S60 v3.2
-     * @param aPtr Pointer to ourselves.
-     * @return Result
-     */
-    static TInt DisconnectAllCallBack( TAny* aPtr );
-    
-    /**
      * Callback function for expiriy CDeltaTimer timer of server idle timeout.
      *
      * @since S60 v3.2
@@ -410,17 +365,7 @@
      * @return Result
      */
     static TInt DebugModeTimerCallBack( TAny* aPtr );
-    
-    /**
-     * Callback function for turning BT off automatically after all
-     * connections are gone.
-     *
-     * @since S60 v5.0
-     * @param aPtr Pointer to ourselves.
-     * @return Result
-     */
-    static TInt AutoPowerOffCallBack( TAny* aPtr );
-	
+
 private: // data
 
     /**
@@ -436,28 +381,6 @@
     TUint32 iDiSdpRecHandle;
 
     /**
-     * Flag indicating if BT is going to be switched off automatically.
-     */
-    TBool iAutoSwitchOff;
-
-    /**
-     * Number of clients that are using BT temporarily.
-     * Note that this is equal or less than the active number of links.
-     */
-    TInt iAutoOffClients;
-
-    /**
-     * Flag indicating hidden mode has been set for temporary power on.
-     */
-    TBool iRestoreVisibility;
-
-    /**
-    * To decide wether DUT mode should be enabled in power mode
-    * change callback.
-    */   
-    TBool iEnableDutMode;
-
-    /**
      * Remember which timer has been queued. (CDeltaTimer does not 
      * provide this information).
      */
@@ -477,24 +400,13 @@
      * Callback for expiry of idle timer.
      */
     TDeltaTimerEntry iIdleCallBack;
+
     /**
      * Callback for expiry of Simple Pairing debug mode.
      */
     TDeltaTimerEntry iDebugModeCallBack;
 
     /**
-     * Handle to BT Power Manager library; this handle must exist 
-     * for the lifetime of the loaded library.
-     */
-    RLibrary iPowerMgrLib;
-#ifndef __WINS__
-    /**
-     *  Handle for DUT mode API
-     */
-    RBluetoothDutMode iDutMode;
-#endif  //__WINS__  
-
-    /**
      * Pairing manager.
      */
     CBTEngPairMan* iPairMan;
@@ -503,20 +415,25 @@
     * Socket Server instance for this and other classes to access Bluetooth socket APIs.
     */   
     RSocketServ iSocketServ;
-    
-    
+
     /**
     * Registry Server instance for bteng to access Bluetooth registry APIs.
     */      
     RBTRegServ iBTRegServ;
-     
+
     /**
-     * BT Power Manager.
+     * Our state machine for handling power on/off.
      * Own.
      */
     CBTEngSrvState* iServerState;
 
     /**
+     * Hardware and stack settings manager.
+     * Own.
+     */
+    CBTEngSrvSettingsMgr* iSettingsMgr;
+
+    /**
      * ECOM plugin manager.
      * Own.
      */
@@ -535,18 +452,6 @@
     CBTEngSrvKeyWatcher* iWatcher;
 
     /**
-     * BT Power Manager (HCIv2 version).
-     */
-    RBTPowerControl iPowerMgr;
-
-#ifdef __WINS__
-    /**
-     * Current BT power state (power manager is not used in emulator).
-     */
-    TBTPowerState iPowerState;
-#endif  //__WINS__
-
-    /**
      * SDP database handler.
      * Own.
      */
@@ -558,7 +463,6 @@
      */
     CDeltaTimer* iTimer;
 
-    BluetoothFeatures::TEnterpriseEnablementMode iEnterpriseEnablementMode;
     };
 
 
--- a/bluetoothengine/bteng/inc/btengsrvsession.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengsrvsession.h	Fri Apr 16 15:08:36 2010 +0300
@@ -73,12 +73,6 @@
                                  TBTEngConnectionStatus aConnStatus, 
                                  RBTDevAddrArray* aArray, TInt aErr );
 
-    /**
-     * Completes client's pairing request.
-     * @param aResult the resultof pairing the client will receive.
-     */
-    TInt CompletePairRequest( TInt aResult );
-    
 private: // from base class CSession2
 
     /**
@@ -131,22 +125,22 @@
     void DispatchMessageL( const RMessage2& aMessage );
 
     /**
-     * Cancels outstanding pairing request.
+     * Cancels outstanding request.
      */
-    void CancelPairRequest();
-    
+    void CancelRequest();
+
+    /**
+     * Checks if power is on, and leaves with error KErrNotReady if not.
+     */
+    void CheckPowerOnL();
+
 private: // data
+
     /**
      * Client-server message containing the thread handle of the client.
      * For connection notifications.
      */
     RMessage2 iNotifyConnMessage;
-
-    /**
-     * For connection notifications.
-     * For outgoing pairing request.
-     */
-    RMessage2 iPairMessage;
     
     /**
      * Flag indicating if this client requested BT to be switched on temporarily.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/bteng/inc/btengsrvsettingsmgr.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,312 @@
+/*
+* 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:  Class to manage Bluetooth hardware and stack settings.
+*
+*/
+
+#ifndef BTENGSRVSETTINGSMGR_H
+#define BTENGSRVSETTINGSMGR_H
+
+#include <bluetooth/btpowercontrol.h>
+#include <btfeaturescfg.h>
+#ifndef __WINS__
+#include <bluetooth/dutmode.h>
+#endif  //__WINS__  
+
+#include "btengprivatecrkeys.h"
+#include "btengconstants.h"
+#include "btengactive.h"
+
+class CBTEngServer;
+
+
+/**
+ *  ?one_line_short_description
+ *  ?more_complete_description
+ *
+ *  @code
+ *   ?good_class_usage_example(s)
+ *  @endcode
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+NONSHARABLE_CLASS( CBTEngSrvSettingsMgr ) : public CBase,
+                                            public MBTEngActiveObserver
+    {
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @param aServer Pointer to server instance.
+     */
+    static CBTEngSrvSettingsMgr* NewL( CBTEngServer* aServer );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CBTEngSrvSettingsMgr();
+
+    /**
+     * Utility to get the Bluetooth hardware power state.
+     *
+     * @since Symbian^3
+     * @param aState On return, this will contain the current HW power state.
+     * @return KErrNone if successful, otherwise one of the system-wide error codes.
+     */
+    TInt GetHwPowerState( TBTPowerState& aState );
+
+    /**
+     * Set the Bluetooth hardware power state.
+     *
+     * @since Symbian^3
+     * @param aState The new power state.
+     */
+    TInt SetHwPowerState( TBTPowerState aState );
+
+    /**
+     * Set Bluetooth on or off. This function is for internal classes of bteng server
+     * for power management.
+     *
+     * @since Symbian^3
+     * @param aState The new power state.
+     * @param aTemporary Turn BT off after use (ETrue) or not (EFalse).
+     */
+    void SetPowerStateL( TBTPowerState aState, TBool aTemporary );
+    
+    /**
+     * Set Bluetooth on or off upon a client power management request.
+     * This function is only for power management request from clients of bteng server.
+     *
+     * @since Symbian^3
+     * @param aState The new power state.
+     * @param aTemporary Turn BT off after use (ETrue) or not (EFalse).
+     */
+    void SetPowerStateL( const RMessage2 aMessage );
+    
+    /**
+     * Initialize Bluetooth stack settings.
+     *
+     * @since S60 v3.2
+     * @param ?arg1 ?description
+     */
+    void InitBTStackL();
+
+    /**
+     * Reset settings and disconnect all links.
+     *
+     * @since Symbian^3
+     */
+    void StopBTStackL();
+
+    /**
+     * Update the central repository key for Bluetooth power state.
+     *
+     * @since Symbian^3
+     * @param aValue The new Bluetooth power state.
+     */
+    void UpdateCenRepPowerKeyL( TBTPowerState aValue );
+
+    /**
+    * ?description
+    *
+    * @since S60 v3.2
+    * @param ?arg1 ?description
+    */
+    void SetUiIndicatorsL();
+    
+    /**
+    * ?description
+    *
+    * @since S60 v3.2
+    * @param ?arg1 ?description
+    */
+    void SetIndicatorStateL( const TInt aIndicator, const TInt aState );
+
+    /**
+     * Update the Bluetooth visibility mode.
+     *
+     * @since Symbian^3
+     * @param ?arg1 ?description
+     */
+    void SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime );
+
+    /**
+     * Update the Bluetooth visibility mode.
+     *
+     * @since Symbian^3
+     * @param ?arg1 ?description
+     */
+    void UpdateVisibilityModeL( TInt aStackScanMode );
+
+    /**
+     * Set Device Under Test mode.
+     *
+     * @since Symbian^3
+     * @param aDutMode The mode to be set (DUT mode on or off).
+     */
+    void SetDutMode( TInt aDutMode );
+
+    /**
+     * Timed visible mode has expired. 
+     *
+     * @since Symbian^3
+     */
+    void ScanModeTimerCompletedL();
+
+    /**
+     * Check whether BT should be turned off automatically.
+     *
+     * @since Symbian^3
+     */
+    void CheckAutoPowerOffL();
+
+    /**
+     * Queue a timer if secure simple pairing debug mode has been enabled.
+     *
+     * @since Symbian^3
+     * @param aDebugMode State of Simple Pairing debug mode.
+     */
+    void CheckSspDebugModeL( TBool aDebugMode );
+
+    /**
+     * Be informed that a session will be closed.
+     *
+     * @since Symbian^3
+     * @param aSession the session to be cloased.
+     */
+    void SessionClosed(CSession2* aSession );
+    
+private:
+    
+// from base class MBTEngActiveObserver
+
+    /**
+     * From MBTEngActiveObserver.
+     * Callback to notify that an outstanding request has completed.
+     *
+     * @since Symbian^3
+     * @param aActive Pointer to the active object that completed.
+     * @param aId The ID that identifies the outstanding request.
+     * @param aStatus The status of the completed request.
+     */
+    virtual void RequestCompletedL( CBTEngActive* aActive, TInt aId, TInt aStatus );
+
+    /**
+     * From MBTEngActiveObserver.
+     * Callback to notify that an error has occurred in RunL.
+     *
+     * @since Symbian^3
+     * @param aActive Pointer to the active object that completed.
+     * @param aId The ID that identifies the outstanding request.
+     * @param aStatus The status of the completed request.
+     */
+    virtual void HandleError( CBTEngActive* aActive, TInt aId, TInt aError );
+
+private:
+
+    /**
+     * C++ default constructor.
+     */
+    CBTEngSrvSettingsMgr( CBTEngServer* aServer );
+
+    /**
+     * Symbian second-phase constructor.
+     */
+    void ConstructL();
+
+    /**
+     * Open a handle to the Bluetooth power manager, and 
+     * initialize the power to off.
+     *
+     * @since Symbian^3
+     */
+    void LoadBTPowerManagerL();
+
+    /**
+     * Checks if a client requests temporary power on/off, and keeps track 
+     * of the number of clients requesting that.
+     *
+     * @since Symbian^3
+     * @param aCurrentState On return, will contain the current power state.
+     * @param aNewState The requested power state.
+     * @param aTemporary Indicates if this is about a tempororary state change.
+     */
+    void CheckTemporaryPowerStateL( TBTPowerState& aCurrentState,
+                                     TBTPowerState aNewState, TBool aTemporary );
+
+    /**
+     * Set the Class of Device.
+     *
+     * @since Symbian^3
+     */
+    void SetClassOfDeviceL();
+
+private: // data
+
+#ifdef __WINS__
+    /**
+     * Current BT power state (power manager is not used in emulator).
+     */
+    TBTPowerState iPowerState;
+#endif  //__WINS__
+
+    /**
+     * Flag indicating if BT is allowed to be turned on.
+     */
+    BluetoothFeatures::TEnterpriseEnablementMode iEnterpriseEnablementMode;
+
+    /**
+     * Flag indicating if BT is going to be switched off automatically.
+     */
+    TBool iAutoSwitchOff;
+
+    /**
+     * Number of clients that are using BT temporarily.
+     * Note that this is equal or less than the active number of links.
+     */
+    TInt iAutoOffClients;
+
+    /**
+     * Flag indicating hidden mode has been set for temporary power on.
+     */
+    TBool iRestoreVisibility;
+
+    /**
+     * BT power control.
+     */
+    RBTPowerControl iPowerMgr;
+
+    /**
+     * Active object helper.
+     * Own.
+     */
+    CBTEngActive* iActive;
+
+    /**
+     * The server instance.
+     * Not own.
+     */
+    CBTEngServer* iServer;
+    
+    /**
+     * Client-server message for power change requests.
+     */
+    RMessage2 iMessage;
+    
+    };
+
+
+#endif // BTENGSRVSETTINGS_H
--- a/bluetoothengine/bteng/inc/btengsrvstate.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/inc/btengsrvstate.h	Fri Apr 16 15:08:36 2010 +0300
@@ -20,18 +20,13 @@
 #ifndef BTENGSRVSTATE_H
 #define BTENGSRVSTATE_H
 
-
-//#include <?include_file>
+#include <bluetooth/hci/hcitypes.h>
 
 #include "btengactive.h"
-#include "btserversdkcrkeys.h"
 
 class MBTEngActiveObserver;
 class CBTEngServer;
 
-/**  ?description */
-//const ?type ?constant_var = ?constant;
-
 
 /**
  *  Class CBTEngSrvState
@@ -93,32 +88,26 @@
     virtual ~CBTEngSrvState();
 
     /**
-     * ?description
+     * Getter for the current operation.
      *
      * @since S60 v3.2
-     * @param ?arg1 ?description
-     * @param ?arg2 ?description
-     * @return ?description
+     * @return The current operation.
      */
     CBTEngSrvState::TBTEngSrvOperation CurrentOperation();
 
     /**
-     * ?description
+     * Start the state machine. If the state machine was already running,
+     * it is simply restarted.
      *
      * @since S60 v3.2
      * @param ?arg1 ?description
-     * @param ?arg2 ?description
-     * @return ?description
      */
-    void StartStateMachineL( TBool aState );
+    void StartStateMachineL( TBTPowerState aState );
 
     /**
-     * ?description
+     * Schedule the next state operation.
      *
      * @since S60 v3.2
-     * @param ?arg1 ?description
-     * @param ?arg2 ?description
-     * @return ?description
      */
     void ChangeState();    
 
@@ -133,11 +122,20 @@
      * Symbian 2nd-phase constructor
      */
     void ConstructL();
-    
+
+    /**
+     * Callback function for asynchronous cycle.
+     */
     static TInt ChangeStateCb(TAny* aThis);
-    
+
+    /**
+     * Execute the next state operation.
+     */
     void RequestCompletedL();
-    
+
+    /**
+     * Handle an error that occurred during a state operation.
+     */
     void HandleError(TInt aError);
 
 private: // data
--- a/bluetoothengine/bteng/rom/bteng.iby	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/rom/bteng.iby	Fri Apr 16 15:08:36 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2003-2006 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -29,9 +29,7 @@
 file=ABI_DIR\BUILD_DIR\btengdiscovery.dll         SHARED_LIB_DIR\btengdiscovery.dll
 file=ABI_DIR\BUILD_DIR\btfeatures.dll             SHARED_LIB_DIR\btfeatures.dll
 file=ABI_DIR\BUILD_DIR\btengsettings.dll          SHARED_LIB_DIR\btengsettings.dll
-data=ZPRIVATE\10005950\backup_registration.xml	private\10005950\backup_registration.xml
-data=ZPRIVATE\10003A3F\APPS\bttoggle_reg.rsc 	Private\10003a3f\apps\bttoggle_reg.rsc
-
+data=ZPRIVATE\10003A3F\APPS\bttoggle_reg.rsc 			Private\10003a3f\apps\bttoggle_reg.rsc
 data=DATAZ_\RESOURCE_FILES_DIR\btengsdp.rsc       RESOURCE_FILES_DIR\btengsdp.rsc
 data=DATAZ_\RESOURCE_FILES_DIR\btrfs.txt       RESOURCE_FILES_DIR\btrfs.txt
 
--- a/bluetoothengine/bteng/src/btengactive.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
-* 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:  Active object helper class.
-*
-*/
-
-
-
-#include <e32base.h>
-
-#include "btengactive.h"
-
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// C++ default constructor
-// ---------------------------------------------------------------------------
-//
-CBTEngActive::CBTEngActive(  MBTEngActiveObserver& aObserver, TInt aId, 
-    TInt aPriority )
-:   CActive( aPriority ),
-    iRequestId( aId ),
-    iObserver( aObserver )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-
-// ---------------------------------------------------------------------------
-// Symbian 2nd-phase constructor
-// ---------------------------------------------------------------------------
-//
-void CBTEngActive::ConstructL()
-    {
-    }
-
-
-// ---------------------------------------------------------------------------
-// NewLC
-// ---------------------------------------------------------------------------
-//
-CBTEngActive* CBTEngActive::NewL( MBTEngActiveObserver& aObserver, 
-    TInt aId, TInt aPriority )
-    {
-    CBTEngActive* self = new( ELeave ) CBTEngActive( aObserver, aId, aPriority );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-
-// ---------------------------------------------------------------------------
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CBTEngActive::~CBTEngActive()
-    {
-    Cancel();
-    }
-
-
-// ---------------------------------------------------------------------------
-// From class CActive.
-// Called by the active scheduler when the request has been cancelled.
-// ---------------------------------------------------------------------------
-//
-void CBTEngActive::DoCancel()
-    {
-    }
-
-
-// ---------------------------------------------------------------------------
-// From class CActive.
-// Called by the active scheduler when the request has been completed.
-// ---------------------------------------------------------------------------
-//
-void CBTEngActive::RunL()
-    {
-    iObserver.RequestCompletedL( this, iRequestId, iStatus.Int() );
-    }
-
-
-// ---------------------------------------------------------------------------
-// From class CActive.
-// Called by the active scheduler when an error in RunL has occurred.
-// ---------------------------------------------------------------------------
-//
-TInt CBTEngActive::RunError( TInt aError )
-    {
-    iObserver.HandleError( this, iRequestId, aError );
-    return KErrNone;
-    }
--- a/bluetoothengine/bteng/src/btengincpair.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengincpair.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -99,6 +99,8 @@
     if ( iAddr == aAddr )
         {
         err = KErrNone;
+        iUserAwarePairing = ETrue; // This function is called by a notifier, which means the UI has been involved
+        // Therefore we can display it in the paired devices list
         if ( !iActive->IsActive() && !OpenPhysicalLinkAdaptor() )
             {
             // If we are observing physical link, or showing user a note,
@@ -171,46 +173,46 @@
         iActivePairingOk->CancelRequest();
         UnSetPairResult();  // we might have set it before (if the link went down) so we want to reset it.   
         }
-    switch ( aDev.LinkKeyType() )
-        {
-        case ELinkKeyUnauthenticatedNonUpgradable:
-            {
-            // If an application uses btengconnman API to connect a service of 
-            // this device and JW pairing occurred as part of security enforcement,
-            // it shall be a user aware pairing, and we shall add this device in paired
-            // view. In this way, user is able to disconnect the device from our UI.
-            // Otherwise the link key has been created by a device without IO requesting 
-            // a service connection with phone. We won't take any action (e.g. remove 
-            // link key) in this case. As the result, this device can't be seen in our UI, 
-            // however other applications are still freely to use its services.
-            TRACE_INFO(_L("[BTEng]: CBTEngIncPair: JW pairing with no IO device" ) )
-            TBTEngConnectionStatus status = iParent.IsDeviceConnected( aDev.Address() );
-            if ( status == EBTEngConnecting || status == EBTEngConnected )
-                {
-                // the return error is ingore as we can not have other proper 
-                // exception handling option:
-                (void) iParent.AddUiCookieJustWorksPaired( aDev );
-                }
-            iParent.RenewPairer( NULL );
-            break;
-            }
-        case ELinkKeyUnauthenticatedUpgradable:
-            {
-            // The linkkey has been created  by an incoming OBEX service request
-            // which resulted a pairing event received from pair server.
-            TRACE_INFO(_L("[BTEng]: CBTEngIncPair: JW pairing with IO device" ) )
-            iParent.RenewPairer( NULL );
-            break;
-            }
-        default:
-            {
-            // Other pairing model than Just Works:
-            CancelPlaNotification();
-            SetPairResult( KErrNone );
-            ShowPairingNoteAndAuthorizeQuery();
-            break;
-            }
-        }
+    if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable && !iUserAwarePairing)
+		{
+		// If an application uses btengconnman API to connect a service of 
+		// this device and JW pairing occurred as part of security enforcement,
+		// it shall be a user aware pairing, and we shall add this device in paired
+		// view. In this way, user is able to disconnect the device from our UI.
+		// Otherwise the link key has been created by a device without IO requesting 
+		// a service connection with phone. We won't take any action (e.g. remove 
+		// link key) in this case. As the result, this device can't be seen in our UI, 
+		// however other applications are still freely to use its services.
+		TRACE_INFO(_L("[BTEng]: CBTEngIncPair: JW pairing with no IO device" ) )
+		TBTEngConnectionStatus status = iParent.IsDeviceConnected( aDev.Address() );
+		if ( status == EBTEngConnecting || status == EBTEngConnected )
+			{
+			// the return error is ingore as we can not have other proper 
+			// exception handling option:
+			(void) iParent.AddUiCookieJustWorksPaired( aDev );
+			}
+		iParent.RenewPairer( NULL );
+		}
+    else if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedUpgradable && !iUserAwarePairing)
+		{
+		// The linkkey has been created  by an incoming OBEX service request
+		// which resulted a pairing event received from pair server.
+		TRACE_INFO(_L("[BTEng]: CBTEngIncPair: JW pairing with IO device" ) )
+		iParent.RenewPairer( NULL );
+		}
+    else
+		{
+		if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable || aDev.LinkKeyType() == ELinkKeyUnauthenticatedUpgradable)
+			{
+			// The user was involved in the pairing, so display in the paired devices list
+			(void) iParent.AddUiCookieJustWorksPaired(aDev);
+			}
+		TRACE_INFO(_L("[BTEng]: CBTEngIncPair: Non-JW pairing"))
+		// Other pairing model than Just Works:
+		CancelPlaNotification();
+		SetPairResult( KErrNone );
+		ShowPairingNoteAndAuthorizeQuery();
+		}
     TRACE_FUNC_EXIT
     }
 
--- a/bluetoothengine/bteng/src/btengpairman.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengpairman.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -33,6 +33,7 @@
     ERegistryPairedDevicesNewView,
     ERegistryInitiatePairedDevicesList,
     ERegistryGetPairedDevices,
+    ERegistryGetLocalAddress,
     };
 
 /**  The message argument which holds the Bluetooth address. */
@@ -81,16 +82,20 @@
         User::LeaveIfError( iAuthenResult.Open( *iPairingServ ) );
         iSSPResultActive = CBTEngActive::NewL( *this, ESimplePairingResult, CActive::EPriorityStandard );
         iAuthenResultActive = CBTEngActive::NewL( *this, EAuthenticationResult, CActive::EPriorityStandard );        
-        SubscribeSspPairingResult();
-        SubscribeAuthenticateResult();
         }
 
+    // RProperty for accessing the local device address
+    User::LeaveIfError( iPropertyLocalAddr.Attach(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetLocalDeviceAddress) );
+
     // connect to registry
     User::LeaveIfError( iBTRegistry.Open( BTRegServ() ) );    
     iRegistryActive = CBTEngActive::NewL( *this, ERegistryInitiatePairedDevicesView, CActive::EPriorityStandard );
-    // Start to get the list of all paired devices.
-    CreatePairedDevicesView( ERegistryInitiatePairedDevicesView );
-    iPairedDevices = new (ELeave) RArray<TBTNamelessDevice>;
+    iPairedDevices = new (ELeave) RArray<TBTNamelessDevice>; 
+
+    // Initialise paired devices list
+    iLocalAddrActive = CBTEngActive::NewL( *this, ERegistryGetLocalAddress, CActive::EPriorityStandard );
+    InitPairedDevicesList();
+ 
     TRACE_FUNC_EXIT
     }
 
@@ -134,6 +139,89 @@
         iPairingServ->Close();
         delete iPairingServ;
         }
+    if ( !iMessage.IsNull() )
+        {
+        iMessage.Complete( KErrCancel );
+        }
+    iPropertyLocalAddr.Cancel();
+    iPropertyLocalAddr.Close();
+    delete iLocalAddrActive;
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Initialises the paired devices list.
+// If the local address is not available from the P&S key 
+// KPropertyKeyBluetoothGetLocalDeviceAddress, then the list may need to be 
+// updated once the H/W is switched on. This is so that any registry update 
+// from a restore operation can be included in the list, without mistaking the 
+// new devices for new pairings.
+// ---------------------------------------------------------------------------
+//
+void CBTEngPairMan::InitPairedDevicesList()
+    {
+    TRACE_FUNC_ENTRY
+
+    // Check that we have the Bluetooth local address. If we don't then initialise anyway, but subscribe for an update.
+    // This allows us to refresh our paired devices list to include updates made to the remote devices table of the 
+    // Bluetooth registry from a restore operation. We need to include these devices without mistaking them for new 
+    // pairings. We look solely at the P&S key for the address to avoid the condition whereby the address has been
+    // entered into the reigstry but the Bluetooth Manager server has not begun the restore process yet. The signalling
+    // of the P&S key will cause Bluetooth Manager to update the registry with any restored devices before fulfilling
+    // any further requests.
+
+    // Subscribe to local address property in case we need an update.
+    iPropertyLocalAddr.Subscribe( iLocalAddrActive->iStatus );
+    iLocalAddrActive->SetRequestId( ERegistryGetLocalAddress );
+    iLocalAddrActive->GoActive();
+
+    // Attempt to read address from P&S key.
+    TBuf8<KBTDevAddrSize> btAddrDes;
+    TInt err = iPropertyLocalAddr.Get( btAddrDes );
+
+    // Is the P&S key defined yet? (if not, stack not up yet)
+    if ( err == KErrNone )
+        {
+        // P&S key defined, is local address set? (if not, H/W not initialised yet)
+        if ( btAddrDes.Length() == KBTDevAddrSize )
+            {
+            TBTDevAddr btAddr = btAddrDes;
+
+            if ( btAddr != TBTDevAddr() )
+                {
+                // Non-zero local address is available.
+                iPropertyLocalAddr.Cancel();
+                iLocalAddrActive->CancelRequest();
+                }
+            }
+        }
+
+    // Perform initialisation of the paired devices list.
+    DoInitPairedDevicesList();
+
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Initialises the paired devices list (second stage)
+// This method performs the actual initialisation, now that the local BT H/W
+// address had been made available.
+// ---------------------------------------------------------------------------
+//
+void CBTEngPairMan::DoInitPairedDevicesList()
+    {
+    TRACE_FUNC_ENTRY
+
+    if ( !iRegistryActive->IsActive() )
+        {
+        // Start to get the list of all paired devices.
+        CreatePairedDevicesView( ERegistryInitiatePairedDevicesView );
+        }
+    else
+        {
+        iNotHandledInitEventCounter++;
+        }
+
     TRACE_FUNC_EXIT
     }
 
@@ -156,14 +244,24 @@
             }
         case EBTEngPairDevice:
             {
+            if ( !iMessage.IsNull() )
+                {
+                User::Leave( KErrServerBusy );
+                }
             TBTDevAddrPckgBuf addrPkg;
             aMessage.ReadL( KBTEngAddrSlot, addrPkg );
             PairDeviceL( addrPkg(), aMessage.Int1() );
+            iMessage = RMessage2( aMessage );
             break;
             }
         case EBTEngCancelPairDevice:
             {
-            CancelCommand( opcode );
+            // Only the client who requested pairing can cancel it:
+            if ( !iMessage.IsNull() && aMessage.Session() == iMessage.Session() )
+                {
+                iPairer->CancelOutgoingPair();
+                iMessage.Complete( KErrCancel );
+                }
             break;
             }
         default:
@@ -177,27 +275,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// Cancels outgoing pairing requests
-// ---------------------------------------------------------------------------
-//
-void CBTEngPairMan::CancelCommand( TInt aOpCode )
-    {
-    switch( aOpCode )
-        {
-        case EBTEngPairDevice:
-            {
-            TRACE_FUNC_ENTRY
-            if ( iPairer )
-                {
-                iPairer->CancelOutgoingPair();
-                }
-            TRACE_FUNC_EXIT
-            break;
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
 // Handle a change in BTRegistry remote devices table.
 // ---------------------------------------------------------------------------
 //
@@ -228,7 +305,7 @@
 //
 RSocketServ& CBTEngPairMan::SocketServ()
     {
-    return iServer.SocketServ();
+    return iServer.SocketServer();
     }
 
 // ---------------------------------------------------------------------------
@@ -237,7 +314,7 @@
 //
 RBTRegServ& CBTEngPairMan::BTRegServ()
     {
-    return iServer.BTRegServ();
+    return iServer.RegistrServer();
     }
 
 // ---------------------------------------------------------------------------
@@ -265,13 +342,23 @@
         aErr = KErrNone;
         }
     // we must complete client's pairing request:
-    iServer.iSessionIter.SetToLast();
-    CBTEngSrvSession* session = (CBTEngSrvSession*) iServer.iSessionIter--;
-    TInt ret( KErrNotFound );
-    while( session && ret )
+    if ( !iMessage.IsNull()  )
         {
-        ret = session->CompletePairRequest( aErr );
-        session = (CBTEngSrvSession*) iServer.iSessionIter--;
+        iMessage.Complete( aErr );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// A session will be ended, completes the pending request for this session.
+// ---------------------------------------------------------------------------
+//
+void CBTEngPairMan::SessionClosed( CSession2* aSession )
+    {
+    TRACE_FUNC_ARG( ( _L( " session %x"), aSession ) )
+    if ( !iMessage.IsNull() && iMessage.Session() == aSession )
+        {
+        iMessage.Complete( KErrCancel );
         }
     TRACE_FUNC_EXIT
     }
@@ -291,30 +378,41 @@
     if ( index > KErrNotFound )
         {
         dev = (*iPairedDevices)[index];
-        TBTDeviceSecurity security = dev.GlobalSecurity();
-        // Clear trust setting so that correct icon will be shown in ui applications.
-        security.SetNoAuthenticate(EFalse );
-        security.SetNoAuthorise(EFalse );
-        dev.SetGlobalSecurity(security);
-        dev.DeleteLinkKey();
-        if ( dev.IsValidUiCookie() && 
-             ( dev.UiCookie() & EBTUiCookieJustWorksPaired ) )
+        
+        TRequestStatus status( KRequestPending );
+        // Unpair the device in registry (synchronously)
+        iBTRegistry.UnpairDevice( dev.Address(), status );
+        User::WaitForRequest( status );
+        TRACE_INFO( ( _L( "Delete link key, res %d"), status.Int() ) )
+        
+        if ( status == KErrNone )
             {
-            // Remove the UI cookie bit for Just Works pairing.
-            TInt32 cookie = dev.UiCookie() & ~EBTUiCookieJustWorksPaired;
-            dev.SetUiCookie( cookie );
-            TRACE_INFO( ( _L( "UI cookie %x cleared"), EBTUiCookieJustWorksPaired ) );
+            TBTDeviceSecurity security = dev.GlobalSecurity();
+            // Clear trust setting so that correct icon will be shown in ui applications.
+            security.SetNoAuthenticate(EFalse );
+            security.SetNoAuthorise(EFalse );
+            dev.SetGlobalSecurity(security);
+            dev.DeleteLinkKey();
+            if ( dev.IsValidUiCookie() && 
+                 ( dev.UiCookie() & EBTUiCookieJustWorksPaired ) )
+                {
+                // Remove the UI cookie bit for Just Works pairing.
+                TInt32 cookie = dev.UiCookie() & ~EBTUiCookieJustWorksPaired;
+                dev.SetUiCookie( cookie );
+                TRACE_INFO( ( _L( "UI cookie %x cleared"), EBTUiCookieJustWorksPaired ) );
+                }
+            // modify the device in registry synchronously
+            // status.Int() could be -1 if the device is not in registry 
+            // which is totally fine for us.
+            (void) UpdateRegDevice( dev );
             }
-        // modify the device in registry synchronously
-        // status.Int() could be -1 if the device is not in registry 
-        // which is totally fine for us.
-        (void) UpdateRegDevice( dev );
         }
     TRACE_FUNC_EXIT
     }
 
 TInt CBTEngPairMan::AddUiCookieJustWorksPaired( const TBTNamelessDevice& aDev )
     {
+	TRACE_FUNC_ENTRY
     TInt err( KErrNone );
     // There might be UI cookies used by other applications,
     // we should not overwrite them. 
@@ -329,6 +427,7 @@
         err = UpdateRegDevice( dev );
         TRACE_INFO( ( _L( "[BTENG] CBTEngOtgPair write Ui cookie ret %d"), err ) );
         }
+    TRACE_FUNC_EXIT
     return err;
     }
 
@@ -393,11 +492,26 @@
             break;
             }
         case ERegistryInitiatePairedDevicesList:
+            {			
+			if (iSSPResultActive && iAuthenResultActive)
+				{
+				SubscribeSspPairingResult();
+				SubscribeAuthenticateResult();
+				}
+            HandleGetPairedDevicesCompletedL( aStatus, aId );
+            break;
+            }
         case ERegistryGetPairedDevices:    
             {
             HandleGetPairedDevicesCompletedL( aStatus, aId );
             break;
             }
+        case ERegistryGetLocalAddress:
+            {
+            // Refresh paired devices list to include any restored devices.
+            DoInitPairedDevicesList();
+            break;
+            }
         default:
                 // Should not be possible, but no need for handling.
             TRACE_INFO( (_L("[BTEng]: CBTEngPairMan::RequestCompletedL unhandled event!!") ) )
@@ -431,6 +545,7 @@
     {
     TRACE_FUNC_ARG( ( _L( "%d" ), aActivate ) )
     TRACE_BDADDR( aAddr )
+    iPairingOperationAttempted = ETrue;
     TInt err( KErrNone );
     if ( !aActivate )
         {
@@ -463,6 +578,7 @@
 //
 void CBTEngPairMan::PairDeviceL( const TBTDevAddr& aAddr, TUint32 aCod )
     {
+    iPairingOperationAttempted = ETrue;
     if ( !iPairer)
         {
         // no existing pair handling, create one:
@@ -496,27 +612,35 @@
     }
 
 // ---------------------------------------------------------------------------
-// Subscribes to simple pairing result from Pairing Server
+// Subscribes to simple pairing result from Pairing Server (if not already 
+// subscribed).
 // ---------------------------------------------------------------------------
 //
 void CBTEngPairMan::SubscribeSspPairingResult()
     {
     TRACE_FUNC_ENTRY
-    iPairingResult.SimplePairingResult( iSimplePairingRemote, iSSPResultActive->RequestStatus() );
-    iSSPResultActive->GoActive();
+    if ( !iSSPResultActive->IsActive() )
+        {
+        iPairingResult.SimplePairingResult( iSimplePairingRemote, iSSPResultActive->RequestStatus() );
+        iSSPResultActive->GoActive();
+        }
     TRACE_FUNC_EXIT
     }
 
 // ---------------------------------------------------------------------------
-// Subscribes to authentication result from Pairing Server
+// Subscribes to authentication result from Pairing Server (if not already
+// subscribed).
 // ---------------------------------------------------------------------------
 //
 void CBTEngPairMan::SubscribeAuthenticateResult()
     {
     TRACE_FUNC_ENTRY
-    // Subscribe authentication result (which requires pairing for unpaired devices)
-    iAuthenResult.AuthenticationResult( iAuthenticateRemote, iAuthenResultActive->RequestStatus() );
-    iAuthenResultActive->GoActive();
+    if ( !iAuthenResultActive->IsActive() )
+        {
+        // Subscribe authentication result (which requires pairing for unpaired devices)
+        iAuthenResult.AuthenticationResult( iAuthenticateRemote, iAuthenResultActive->RequestStatus() );
+        iAuthenResultActive->GoActive();
+        }
     TRACE_FUNC_EXIT
     }
 
@@ -567,7 +691,14 @@
 void CBTEngPairMan::CreatePairedDevicesView( TInt aReqId )
     {
     TRACE_FUNC_ENTRY
-    iNotHandledRegEventCounter = 0;
+    if ( aReqId == ERegistryInitiatePairedDevicesView )
+        {
+        iNotHandledInitEventCounter = 0;
+        }
+    else
+        {
+        iNotHandledRegEventCounter = 0;
+        }
     TBTRegistrySearch searchPattern;
     searchPattern.FindBonded();
     iRegistryActive->SetRequestId( aReqId );
@@ -605,8 +736,14 @@
     TRACE_FUNC_ENTRY
 
     if ( aReqId == ERegistryInitiatePairedDevicesView )
-        {// Initialization phase, list paired devices if there are.
-        if ( aStatus > KErrNone )
+        {// Initialization phase, list paired devices if there are any.
+        if ( iNotHandledInitEventCounter )
+            {
+            // Reinitialisaton detected, create paired device view again:
+            (void) iBTRegistry.CloseView();
+            CreatePairedDevicesView( ERegistryInitiatePairedDevicesView );
+            }
+        else if ( aStatus > KErrNone )
             {
             GetPairedDevices( ERegistryInitiatePairedDevicesList );
             }
@@ -617,7 +754,25 @@
         }
     else
         {
-        if (iNotHandledRegEventCounter)
+        if ( iNotHandledInitEventCounter )
+            {
+            // We need to reinitialise but we may be pairing.
+            // This situation is not expected to arise, as reinitialisation means
+            // that the H/W was only just switched on.
+            // If we have ever started to take part in a pairing, then prioritise that
+            // pairing.
+            (void) iBTRegistry.CloseView();
+            if ( iPairingOperationAttempted )
+                {
+                iNotHandledInitEventCounter = 0;
+                CreatePairedDevicesView( ERegistryPairedDevicesNewView );
+                }
+            else
+                {
+                CreatePairedDevicesView( ERegistryInitiatePairedDevicesView );
+                }
+            }
+        else if (iNotHandledRegEventCounter)
             { // more registry change detected, create paired device view again:
             (void) iBTRegistry.CloseView();
             CreatePairedDevicesView( ERegistryPairedDevicesNewView );
@@ -647,19 +802,46 @@
     (void) iBTRegistry.CloseView();
     if ( aReqId == ERegistryInitiatePairedDevicesList )
         {
-        // We completed the initialization of paired device list, 
-        // move all paired devices to the array:
-        UpdatePairedDeviceListL();
+        if ( iNotHandledInitEventCounter )
+            {
+            // Reinitialisation required, create paired device view again:
+            CreatePairedDevicesView( ERegistryInitiatePairedDevicesView );
+            }
+        else
+            {
+            // We completed the initialisation of paired device list, 
+            // move all paired devices to the array:
+            UpdatePairedDeviceListL();
+            }
         }
-    
-    if (iNotHandledRegEventCounter)
-        { // more registry change detected, create paired device view again:
-        CreatePairedDevicesView( ERegistryPairedDevicesNewView );
-        }
-    else if ( aReqId == ERegistryGetPairedDevices)
+    else
         {
-        // no more registry change detected, find new pairings:
-        CheckPairEventL();
+        if (iNotHandledInitEventCounter)
+            {
+            // We need to reinitialise but we may be pairing.
+            // This situation is not expected to arise, as reinitialisation means
+            // that the H/W was only just switched on.
+            // If we have ever started to take part in a pairing, then prioritise that
+            // pairing.
+            if ( iPairingOperationAttempted )
+                {
+                iNotHandledInitEventCounter = 0;
+                CreatePairedDevicesView( ERegistryPairedDevicesNewView );
+                }
+            else
+                {
+                CreatePairedDevicesView( ERegistryInitiatePairedDevicesView );
+                }		
+            }     
+        else if (iNotHandledRegEventCounter)
+            { // more registry change detected, create paired device view again:
+            CreatePairedDevicesView( ERegistryPairedDevicesNewView );
+            }
+        else if ( aReqId == ERegistryGetPairedDevices)
+           {
+            // no more registry change detected, find new pairings:
+            CheckPairEventL();
+           }
         }
 
     TRACE_FUNC_EXIT
@@ -718,9 +900,10 @@
         TRACE_BDADDR( dev.Address() );
         if ( newPaired && !iPairer)
             {
+            iPairingOperationAttempted = ETrue;
             iPairer = CBTEngIncPair::NewL( *this, dev.Address() );
             }
-        if ( iPairer )
+        if ( newPaired && iPairer )
             {
             // Ask pair handler to decide what to do:
             iPairer->HandleRegistryNewPairedEvent( dev );
--- a/bluetoothengine/bteng/src/btengserver.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengserver.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -16,12 +16,6 @@
 */
 
 
-
-#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
-#include <bthci.h>
-#include <bt_subscribe_partner.h>
-#endif
-
 #include <e32base.h>
 #include <btmanclient.h>
 #include <es_sock.h>
@@ -29,20 +23,18 @@
 #include <utf.h>
 #include <ecom/ecom.h>
 #include <centralrepository.h>
-#include <featmgr.h>
-#include <AknSmallIndicator.h>
-#include <avkon.hrh>
+#include <btengdomaincrkeys.h>
 #include <bt_subscribe.h>
 #include "btengserver.h"
 #include "btengsrvstate.h"
 #include "btengsrvsession.h"
 #include "btengsrvpluginmgr.h"
 #include "btengsrvbbconnectionmgr.h"
+#include "btengsrvsettingsmgr.h"
 #include "btengsrvkeywatcher.h"
 #include "btengsdpdbhandler.h"
 #include "btengclientserver.h"
 #include "btengsecpolicy.h"
-#include "btengprivatecrkeys.h"
 #include "btengprivatepskeys.h"
 #include "btengplugin.h"
 #include "btengpairman.h"
@@ -50,43 +42,12 @@
 
 /**  Bluetooth Engine server thread name */
 _LIT( KBTEngThreadName, "BTEngine" );
-
-/**  Constant for converting minutes to microseconds */
-const TInt64 KMinutesInMicroSecs = MAKE_TINT64( 0, 60000000 );
-
-/**  Idle timeout for shutting down the server (when power is off, 
- *   and no clients are connected). The value is 3 seconds.
- */
+/**  Timeout (3 sec) for shutting down the server (when power is off and no clients connected). */
 const TInt KBTEngSrvIdleTimeout = 3000000;
-
-/**  Timeout for disabling Simple Pairing debug mode. The value is 30 minutes. */
-const TInt KBTEngSspDebugModeTimeout = 1800000000;
-
-/**  Timeout for determining that BT is not turned off automatically. 
- *   The value is 10.5 seconds.
- */
-const TInt KBTEngBtAutoOffTimeout = 10500000;
+/**  PubSub key read and write policies */
+_LIT_SECURITY_POLICY_C2( KBTEngPSKeyReadPolicy, ECapabilityLocalServices, ECapabilityReadDeviceData );
+_LIT_SECURITY_POLICY_C2( KBTEngPSKeyWritePolicy, ECapabilityLocalServices, ECapabilityWriteDeviceData );
 
-/**  Enumeration of bitmask for keeping track of different timers. */
-enum TTimerQueued
-    {
-    ENone               = 0x00,
-    EScanModeTimer      = 0x01,
-    EIdleTimer          = 0x02,
-    EAutoPowerOffTimer  = 0x04,
-    ESspDebugModeTimer  = 0x08 
-    };
-
-/**  PubSub key read and write policies */
-_LIT_SECURITY_POLICY_C2( KBTEngPSKeyReadPolicy, 
-                          ECapabilityLocalServices, ECapabilityReadDeviceData );
-_LIT_SECURITY_POLICY_C2( KBTEngPSKeyWritePolicy, 
-                          ECapabilityLocalServices, ECapabilityWriteDeviceData );
-
-// Default values for Major and Minor Device Class
-const TUint16 KCoDDefaultServiceClass = EMajorServiceTelephony | EMajorServiceObjectTransfer | EMajorServiceNetworking;
-const TUint8 KCoDDefaultMajorDeviceClass = EMajorDevicePhone;
-const TUint8 KCoDDefaultMinorDeviceClass = EMinorDevicePhoneSmartPhone;
 
 // ======== LOCAL FUNCTIONS ========
 
@@ -149,7 +110,6 @@
 CBTEngServer::CBTEngServer()
 :   CPolicyServer( EPriorityHigh, KBTEngServerPolicy )
     {
-    iEnableDutMode = EFalse;
     }
 
 
@@ -190,7 +150,6 @@
                                             RProperty::EInt,
                                             KBTEngPSKeyReadPolicy,
                                             KBTEngPSKeyWritePolicy) );
-    
     User::LeaveIfError( RProperty::Define( KPSUidBluetoothEnginePrivateCategory,
                                             KBTNotifierLocks,
                                             RProperty::EByteArray,
@@ -198,18 +157,19 @@
                                             KBTEngPSKeyWritePolicy) );    
     
     User::LeaveIfError( iSocketServ.Connect() );
-    LoadBTPowerManagerL();
+
         // The server is only started by its client, so leave the state 
         // machine in Init state. A request to turn power on will follow 
         // usually immediately.
     iServerState = CBTEngSrvState::NewL( this );
     iWatcher = CBTEngSrvKeyWatcher::NewL( this );
+    iSettingsMgr = CBTEngSrvSettingsMgr::NewL( this );
     iPluginMgr = CBTEngSrvPluginMgr::NewL( this );
     iBBConnMgr = CBTEngSrvBBConnMgr::NewL( iSocketServ );
-    
+
     User::LeaveIfError( iBTRegServ.Connect() );
     iPairMan = CBTEngPairMan::NewL( *this );
-    
+
     TCallBack idleCb( IdleTimerCallBack, this );
     iIdleCallBack.Set( idleCb );
     TCallBack sspCb( DebugModeTimerCallBack, this );
@@ -219,14 +179,6 @@
     TCallBack powerOffCb( AutoPowerOffCallBack, this );
     iPowerOffCallBack.Set( powerOffCb );
     iTimer = CDeltaTimer::NewL(CActive::EPriorityLow);
-    
-    iEnterpriseEnablementMode = BluetoothFeatures::EnterpriseEnablementL();
-	TRACE_INFO( ( _L( "iEnterpriseEnablementMode = %d" ), iEnterpriseEnablementMode) )
-    if ( iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
-        {
-        SetVisibilityModeL( EBTVisibilityModeNoScans, 0 );
-        }
-    
     TRACE_FUNC_EXIT
     }
 
@@ -256,7 +208,7 @@
         iTimerQueued = ENone;
         iTimer->Remove( iScanModeCallBack );
         iTimer->Remove( iPowerOffCallBack );
-        iTimer->Remove( iIdleCallBack);
+        iTimer->Remove( iIdleCallBack );
         iTimer->Remove( iDebugModeCallBack );
         }
     RProperty::Delete( KPSUidBluetoothTestingMode, KBTDutEnabled );
@@ -269,171 +221,34 @@
     delete iTimer;
     delete iSdpDbHandler;
     delete iWatcher;
+    delete iSettingsMgr;
     delete iPluginMgr;
     delete iBBConnMgr;
     delete iServerState;
     delete iPairMan;
-    iPowerMgr.Close();
     iSocketServ.Close();
     iBTRegServ.Close();
     }
 
-
 // ---------------------------------------------------------------------------
 // Turn BT on or off.
 // ---------------------------------------------------------------------------
 //
-void CBTEngServer::SetPowerStateL( TBTPowerStateValue aState, TBool aTemporary )
+void CBTEngServer::SetPowerStateL( TBTPowerState aState, TBool aTemporary )
     {
-    TRACE_FUNC_ARG( ( _L( "setting power state %d" ), (TInt) aState ) )
-    if ( aState == EBTPowerOn && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
-        {
-        TRACE_INFO( ( _L( "\tno we're not... Bluetooth is enterprise-IT-disabled" ) ) )
-        User::Leave(KErrNotSupported);
-        }
-    
-    TBTPowerStateValue currentState = EBTPowerOff;
-    CheckTemporaryPowerStateL( currentState, aState, aTemporary );
-
-    if( ( currentState == aState || ( aTemporary && aState == EBTPowerOff ) ) && iServerState->CurrentOperation() == CBTEngSrvState::ESrvOpIdle )
-        {
-		// The requested power state is already active, ignore silently.
-		// We don't return an error here, as there is no error situation.
-        TRACE_INFO( ( _L( "SetPowerStateL: nothing to do" ) ) )
-        if(currentState == aState)
-            {
-            // Make sure that the CenRep key is in sync.
-            // During boot-up, the pwoer is set from the CenRep key, so we could 
-            // end up out-of-sync.
-            TRACE_INFO( ( _L( "SetPowerStateL: currentState == aState" ) ) )
-            UpdateCenRepPowerKeyL( aState );
-            } 
-        return;
-        }
-    if( aState )
-        {
-            // Hardware power on is the first step.
-        User::LeaveIfError( SetPowerState( aState ) );
-        }
-    else
-        {
-        //Prevent BT visibility in the situation when we turn OFF BT Engine 
-        //but FM Radio is still alive
-        SetVisibilityModeL( EBTVisibilityModeNoScans, 0 );
-            // Hardware power off is the last step.
-            // First disconnect all plug-ins.
-        iPluginMgr->DisconnectAllPlugins();
-        }
-        // We only signal that BT is on after everything has completed (through 
-        // the CenRep power state key), so that all services are initialized.
-        // We signal that BT is off immediately though, so that our clients will 
-        // not try to use BT during power down.
-    iServerState->StartStateMachineL( (TBool) aState );
+    TRACE_FUNC_ARG( ( _L( "setting power state %d (temporary=%d" ), (TInt) aState, aTemporary ) )
+    iSettingsMgr->SetPowerStateL( aState, aTemporary );
     TRACE_FUNC_EXIT
     }
 
-
 // ---------------------------------------------------------------------------
-// ?implementation_description
+// Turn BT on or off.
 // ---------------------------------------------------------------------------
 //
-void CBTEngServer::SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime )
+void CBTEngServer::SetPowerStateL(const RMessage2 aMessage )
     {
     TRACE_FUNC_ENTRY
-    
-    if ( aMode != EBTVisibilityModeNoScans && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
-        {
-        TRACE_INFO( ( _L( "\tnot changing anything... Bluetooth is enterprise-IT-disabled" ) ) )
-        User::Leave(KErrNotSupported);
-        }
-
-    TInt err = KErrNone;
-    iTimerQueued &= ~EScanModeTimer;
-    iTimer->Remove( iScanModeCallBack );
-    if( aMode != EBTVisibilityModeNoScans )
-        {
-        CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
-        err = cenRep->Set( KBTDiscoverable, aMode );
-        delete cenRep;
-        }
-    if( !err && aMode == EBTVisibilityModeTemporary )
-        {
-            // We need TInt64 here, as the max. time in microseconds for the 
-            // max. value (1 hour) is larger than KMaxTInt32.
-        TInt64 timeMicroSec = MAKE_TINT64( 0, aTime );
-        timeMicroSec = timeMicroSec * KMinutesInMicroSecs;
-        TTimeIntervalMicroSeconds interval( timeMicroSec );
-            // Queue callback to set the visibility back to hidden.
-        err = iTimer->QueueLong( interval, iScanModeCallBack );
-        iTimerQueued |= EScanModeTimer;
-        aMode = EBTVisibilityModeGeneral;
-		}
-    else if( !err && iRestoreVisibility )
-        {
-            // The user overrides, do not restore visibility mode anymore.
-        iRestoreVisibility = EFalse;
-        }
-    if( !err )
-        {
-        err = RProperty::Set( KUidSystemCategory, 
-                               KPropertyKeyBluetoothSetScanningStatus, aMode );
-        }
-    TBool hiddenMode = ( aMode == EBTVisibilityModeHidden );
-    if( !err && aMode != EBTVisibilityModeNoScans )
-        {
-            // In hidden mode, we only accept connections from paired devices.
-        err = RProperty::Set( KUidSystemCategory, 
-                               KPropertyKeyBluetoothSetAcceptPairedOnlyMode, 
-                               hiddenMode );
-        }
-
-    User::LeaveIfError( err );  // To communicate the result to the client.
-    TRACE_FUNC_EXIT
-    }
-    
-// ---------------------------------------------------------------------------
-// The method is called when BT stack scanning mode P&S key is changed
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::UpdateVisibilityModeL( TInt aStackScanMode )
-    {
-    TRACE_FUNC_ENTRY
-    TRACE_INFO( ( _L( "[BTEng]\t aStackScanMode: %d" ), aStackScanMode ) )
-    TBTVisibilityMode currentMode;
-    
-    CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
-    User::LeaveIfError( cenRep->Get( KBTDiscoverable, (TInt&) currentMode ) );
-    
-        // In case we are in temp visibility mode, we cannot always know whether the BT stack
-        // scan mode key was set by some external party or by us in SetVisibilityModeL above.
-        // Therefore we cannot stop the timer in case aMode is EBTVisibilityModeGeneral and 
-        // currentmode is EBTVisibilityModeTemporary
-    if( !( currentMode == EBTVisibilityModeTemporary && aStackScanMode == EBTVisibilityModeGeneral ) )
-        {
-            // Cancel the timer and queue it again if needed.
-        iTimerQueued &= ~EScanModeTimer;
-        iTimer->Remove( iScanModeCallBack );
-        if( currentMode != aStackScanMode )
-            {
-            if( aStackScanMode == EPageScanOnly || aStackScanMode == EInquiryAndPageScan )
-                {
-                User::LeaveIfError( cenRep->Set( KBTDiscoverable, aStackScanMode ) );
-                }
-            else if( aStackScanMode == EInquiryScanOnly )
-                {
-                    // We don't support ENoScansEnabled nor EInquiryScanOnly mode
-                    // -> Consider these as same as Hidden 
-                User::LeaveIfError( cenRep->Set( KBTDiscoverable, EBTVisibilityModeHidden ) );
-                }
-            else if( aStackScanMode == ENoScansEnabled )
-                {
-                //We don't change KBTDiscoverable here, because ENoScansEnabled
-                //indicates BT/SYSTEM shutdown is happening
-                }
-            }
-        }
-    SetUiIndicatorsL();
-    CleanupStack::PopAndDestroy( cenRep );
+    iSettingsMgr->SetPowerStateL( aMessage );
     TRACE_FUNC_EXIT
     }
 
@@ -454,90 +269,13 @@
 // ?implementation_description
 // ---------------------------------------------------------------------------
 //
-void CBTEngServer::SetDutMode( TInt aDutMode )
-    {
-    TRACE_FUNC_ARG( ( _L( "DUT mode %d" ), aDutMode ) )
-
-    if (aDutMode == EBTDutOff)
-        {
-        return;
-        }
-
-    TInt powerState = EBTPowerOff;
-    CRepository* cenrep = NULL;
-    
-    TRAPD(err, cenrep = CRepository::NewL(KCRUidBluetoothPowerState));
-    
-    if (!err && cenrep)
-        {
-        cenrep->Get(KBTPowerState, powerState);
-        delete cenrep;
-        cenrep = NULL;
-        }
-    else
-        {
-        return;
-        }
-
-    if (powerState == EBTPowerOn)
-        {
-
-#ifndef __WINS__
-
-        TInt err = iDutMode.Open();
-        TRACE_FUNC_ARG( ( _L( "Open DUT mode handle err %d" ), err) )
-        if(!err) 
-            {
-            iDutMode.ActivateDutMode();
-            iDutMode.Close();
-            }
-#endif  //__WINS__                        
-        }
-        iEnableDutMode = EFalse;    
-    }
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::ScanModeTimerCompletedL()
-    {
-    TRACE_FUNC_ENTRY
-    // The timer has completed, so remove our reference as well.
-    iTimerQueued &= ~EScanModeTimer;
-    iTimer->Remove( iScanModeCallBack );
-    SetVisibilityModeL( EBTVisibilityModeHidden, 0 );
-    TBTPowerStateValue power = EBTPowerOff;
-    TInt err = GetHwPowerState( (TBTPowerStateValue&) power );
-    if( !err && power )
-        {
-        // Show a notification to the user
-        TBTGenericInfoNotiferParamsPckg pckg;
-        pckg().iMessageType = EBTVisibilityTimeout;
-        
-        RNotifier notifier;
-        TInt err = notifier.Connect();
-        if( !err )
-            {
-            err = notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg );
-            notifier.Close();
-            }
-        }
-    TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
-    }
-
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
 void CBTEngServer::DisconnectAllCompleted()
     {
         // Check if we are powering off. Otherwise we have just been 
         // requested to disconnect all, e.g. for system shutdown.
     if( iServerState->CurrentOperation() == CBTEngSrvState::EPowerOff )
         {
-        (void) SetPowerState( EFalse );
+        (void) iSettingsMgr->SetHwPowerState( EBTOff );
             // Put the state machine into idle state.
         iServerState->ChangeState();
         }
@@ -568,18 +306,20 @@
 
 
 // ---------------------------------------------------------------------------
-// A session has been ended, update the session count.
+// A session has been ended, update the session count and inform others.
 // ---------------------------------------------------------------------------
 //
-void CBTEngServer::RemoveSession( TBool aAutoOff )
+void CBTEngServer::RemoveSession( CSession2* aSession, TBool aAutoOff )
     {
 	TRACE_FUNC_ENTRY
 	TRACE_INFO( ( _L( "[CBTEngServer]\t aAutoOff %d"), aAutoOff ))
 	TRACE_INFO( ( _L( "[CBTEngServer]\t iSessionCount %d"), iSessionCount ))
     iSessionCount--;
+	iSettingsMgr->SessionClosed( aSession );
+	iPairMan->SessionClosed( aSession );
     if( aAutoOff )
         {
-        TRAP_IGNORE( SetPowerStateL( EBTPowerOff, ETrue ) );
+        TRAP_IGNORE( SetPowerStateL( EBTOff, ETrue ) );
         }
     else
         {
@@ -588,6 +328,69 @@
 	TRACE_FUNC_EXIT
     }
 
+// ---------------------------------------------------------------------------
+// Queue a new timer.
+// ---------------------------------------------------------------------------
+//
+void CBTEngServer::QueueTimer( CBTEngServer::TTimerQueued aTimer, TInt64 aInterval )
+    {
+    TRACE_FUNC_ARG( ( _L( "queueing timer %d" ), (TInt) aTimer ) )
+    __ASSERT_DEBUG( iTimer, PanicServer( EBTEngPanicMemberVarIsNull ) );
+    iTimerQueued |= aTimer;
+    TTimeIntervalMicroSeconds interval( aInterval );
+    switch( aTimer )
+        {
+        case EScanModeTimer:
+            (void) iTimer->QueueLong( interval, iScanModeCallBack );
+            break;
+        case EIdleTimer:
+            iTimer->QueueLong( aInterval, iIdleCallBack );
+            break;
+        case EAutoPowerOffTimer:
+            iTimer->QueueLong( aInterval, iPowerOffCallBack );
+            break;
+        case ESspDebugModeTimer:
+            iTimer->QueueLong( aInterval, iDebugModeCallBack );
+            break;
+        default:
+            PanicServer( EBTEngPanicCorrupt );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Remove a queued timer.
+// ---------------------------------------------------------------------------
+//
+void CBTEngServer::RemoveTimer( CBTEngServer::TTimerQueued aTimer )
+    {
+    TRACE_FUNC_ARG( ( _L( "removing timer %d" ), (TInt) aTimer ) )
+    if(!iTimer)
+        {
+        return; // not fully constructed yet, don't do anything
+        }
+    iTimerQueued &= ~aTimer;
+    // Timers can be removed without being queued, no need to check.
+    switch( aTimer )
+        {
+        case EScanModeTimer:
+            iTimer->Remove( iScanModeCallBack );
+            break;
+        case EIdleTimer:
+            iTimer->Remove( iIdleCallBack );
+            break;
+        case EAutoPowerOffTimer:
+            iTimer->Remove( iPowerOffCallBack );
+            break;
+        case ESspDebugModeTimer:
+            iTimer->Remove( iDebugModeCallBack );
+            break;
+        default:
+            PanicServer( EBTEngPanicCorrupt );
+        }
+    TRACE_FUNC_EXIT
+    }
+
 
 // ---------------------------------------------------------------------------
 // From class CPolicyServer.
@@ -628,10 +431,10 @@
     if( iSessionCount <= 0 )
         {
             // No more sessions, check the power state.
-        TBTPowerStateValue pwr = EBTPowerOff;
-        TInt err = GetHwPowerState( pwr );
-        TRACE_INFO( ( _L( "[BTEng]\t No sessions; power state: %d" ), pwr ) )
-        if( !err &&!pwr 
+        TBTPowerState power = EBTOff;
+        TInt err = iSettingsMgr->GetHwPowerState( power );
+        TRACE_INFO( ( _L( "[BTEng]\t No sessions; power state: %d" ), power ) )
+        if( !err && power == EBTOff
             && iServerState->CurrentOperation() == CBTEngSrvState::ESrvOpIdle )
             {
             TRACE_INFO( ( _L( "[BTEng]\t Power off; starting shutdown timer" ) ) )
@@ -648,259 +451,6 @@
 // ?implementation_description
 // ---------------------------------------------------------------------------
 //
-TInt CBTEngServer::SetPowerState( TBool aState )
-    {
-    TRACE_FUNC_ENTRY
-    TInt err = KErrNone;
-    // HCIv2 power state type is inverted from BTPM-defined type...
-    TBTPowerState powerState = (TBTPowerState) !aState;
-    TRequestStatus status;
-    
-#ifndef __WINS__
-    iPowerMgr.SetPower( powerState, NULL, status );
-    User::WaitForRequest( status );
-    err = status.Int();
-#else   //__WINS__
-    iPowerState = powerState;
-    err = KErrNone;
-#endif  //__WINS__
-
-   if( !err && aState )
-        {
-        TInt dutMode;
-        err = RProperty::Get( KPSUidBluetoothTestingMode, KBTDutEnabled, dutMode );
-        if( !err && dutMode == EBTDutOn )
-            {
-                // Set the DUT mode key to OFF since DUT mode is disabled at this point
-            err = RProperty::Set( KPSUidBluetoothTestingMode, KBTDutEnabled, EBTDutOff );
-            }
-            // Set the local name straight away, so that an error 
-            // in the loading of the BT stack will be detected here.
-            // Note that the HCIv2 power manager already loads the BT stack, 
-            // so we do not need to do that here.
-        TRAP(err,SetLocalNameL());
-        }
-    if( err )
-        {
-        // Power off if an error occurred during power on sequence.
-#ifndef __WINS__
-            // This cannot happen in emulator environment.
-        iPowerMgr.SetPower( EBTOff, NULL, status );
-        User::WaitForRequest( status );
-#endif  //__WINS__
-        } 
-    TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
-    return err;
-    }
-
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-TInt CBTEngServer::SetLocalNameL()
-    {
-    TRACE_FUNC_ENTRY
-    RHostResolver hostResolver;
-    TBuf<KMaxBluetoothNameLen> name;
-    name.Zero();
-    TBuf<KMaxBluetoothNameLen> tmpName;
-    
-    TInt err = RProperty::Get(KPropertyUidBluetoothCategory, 
-                                KPropertyKeyBluetoothGetDeviceName, name);
-    if(err == KErrNone)
-        {
-        err = RProperty::Get(KPropertyUidBluetoothCategory, 
-                               KPropertyKeyBluetoothSetDeviceName, tmpName);
-        if (tmpName.Compare(name))
-            {
-            // The name has not yet been updated. Use the new one.
-            name.Copy(tmpName);
-            }
-        }
-    // if name hasn't been set, check whats in the registry
-    if (err || !name.Length())
-        {
-        GetLocalNameFromRegistryL(name);
-        }
-
-    TRACE_INFO( ( _L( "[CBTEngServer]\t localDev.DeviceName(): '%S'" ), &name))
-    
-    CleanupClosePushL(hostResolver);
-    User::LeaveIfError(hostResolver.Open(iSocketServ, KBTAddrFamily, KBTLinkManager));
-    User::LeaveIfError(hostResolver.SetHostName(name));    
-    CleanupStack::PopAndDestroy(&hostResolver);
-
-    return KErrNone;
-    }
-
-
-// ---------------------------------------------------------------------------
-// Checks whats written in the registry in order to set host name 
-// ---------------------------------------------------------------------------
-//
-TInt CBTEngServer::GetLocalNameFromRegistryL(TDes& aName)
-    {
-    TRACE_FUNC_ENTRY
-    RBTRegServ btRegServ;
-    RBTLocalDevice btReg;
-    TBTLocalDevice localDev;
-    
-    CleanupClosePushL(btRegServ);
-    CleanupClosePushL(btReg);
-    
-    // In case of error, read local name from registry
-    aName.Zero();
-    User::LeaveIfError(btRegServ.Connect());
-    User::LeaveIfError(btReg.Open(btRegServ));
-    
-    // Read the BT local name from BT Registry.
-    User::LeaveIfError(btReg.Get(localDev));       
-
-    CleanupStack::PopAndDestroy(2,&btRegServ);
- 
-    // BT registry keeps the device name in UTF-8 format, convert to unicode.
-    // The error can be > 0 if there are unconverted characters.
-    TInt err = CnvUtfConverter::ConvertToUnicodeFromUtf8(aName, localDev.DeviceName());
-    if (err != KErrNone)
-        User::Leave(err);
-    return KErrNone; 
-    }
-
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::SetClassOfDeviceL()
-    {
-    TRACE_FUNC_ENTRY
-    TUint16 serviceClass = KCoDDefaultServiceClass;
-        // Check from feature manager if stereo audio is enabled.
-    FeatureManager::InitializeLibL();
-    TBool supported = FeatureManager::FeatureSupported( KFeatureIdBtStereoAudio );
-    FeatureManager::UnInitializeLib();
-    if( supported )
-        {
-        // A2DP spec says we should set this bit as we are a SRC
-        serviceClass |= EMajorServiceCapturing;
-        }
-        // These values may nayway be overridden by HCI
-    TBTDeviceClass cod( serviceClass, KCoDDefaultMajorDeviceClass, 
-                         KCoDDefaultMinorDeviceClass );
-        // Ignore error, it is non-critical
-    (void) RProperty::Set( KPropertyUidBluetoothControlCategory, 
-                            KPropertyKeyBluetoothSetDeviceClass, cod.DeviceClass() );
-    TRACE_FUNC_EXIT
-    }
-
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::InitBTStackL()
-    {
-    TRACE_FUNC_ENTRY
-    iBBConnMgr->Subscribe();
-    TBTVisibilityMode visibility = EBTVisibilityModeHidden;
-    CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
-    TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility );
-    delete cenRep;
-    if (iRestoreVisibility == EFalse)
-        {
-        if( err || visibility == EBTVisibilityModeTemporary && !( iTimerQueued & EScanModeTimer ) )
-            {
-            visibility = EBTVisibilityModeHidden;
-            }
-        SetVisibilityModeL( visibility, 0 );
-        }
-    SetClassOfDeviceL();
-    TBool sspDebugMode = EFalse;
-    (void) RProperty::Get( KPropertyUidBluetoothCategory, 
-                            KPropertyKeyBluetoothGetSimplePairingDebugMode, 
-                            (TInt&) sspDebugMode );
-        // Only set debug mode to off if it is on, to prevent a loop notifications.
-    if( sspDebugMode )
-        {
-        sspDebugMode = EFalse;
-        // Add LeaveIfError if unsuccessful
-        (void) RProperty::Set(KPropertyUidBluetoothCategory, 
-                               KPropertyKeyBluetoothSetSimplePairingDebugMode,
-                               (TInt) sspDebugMode );
-        }
-    TRACE_FUNC_EXIT
-    }
-
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::StopBTStackL()
-    {
-    TRACE_FUNC_ENTRY
-    TBTVisibilityMode visibility = EBTVisibilityModeHidden;
-    CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
-          // Ignore error here; if we can't read it, likely we can't set it either.
-    (void) cenRep->Get( KBTDiscoverable, (TInt&) visibility );
-    delete cenRep;
-    if( visibility == EBTVisibilityModeTemporary )
-        {
-        visibility = EBTVisibilityModeHidden;
-        SetVisibilityModeL( visibility, 0 );    // Also cancels scan mode timer.
-        }
-
-        // Stop listening to events
-    iBBConnMgr->Unsubscribe();
-        // Disconnect all links
-    TCallBack cb( DisconnectAllCallBack, this );
-    iBBConnMgr->DisconnectAllLinksL( cb );
-        // Results in a callback (which is called directly when there are no links).
-    TRACE_FUNC_EXIT
-    }
-
-
-// ---------------------------------------------------------------------------
-// Update the power state CenRep key.
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::UpdateCenRepPowerKeyL( TBTPowerStateValue aState )
-    {
-    TRACE_FUNC_ENTRY
-    CRepository* cenrep = CRepository::NewLC( KCRUidBluetoothPowerState );
-    User::LeaveIfError( cenrep->Set( KBTPowerState, (TInt) aState ) );
-    CleanupStack::PopAndDestroy( cenrep );
-    TRACE_FUNC_EXIT
-    }
-
-
-// ---------------------------------------------------------------------------
-// Loads the BT Power Manager; leaves if it cannot be loaded.
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::LoadBTPowerManagerL()
-    {
-    TRACE_FUNC_ENTRY
-    TRACE_INFO( ( _L( "[CBTEngServer]\t Using HCI API v2 power manager" ) ) )
-    User::LeaveIfError( iPowerMgr.Open() );
-#ifndef __WINS__
-    TRequestStatus status( KRequestPending );
-    iPowerMgr.SetPower( EBTOff, NULL, status );
-    User::WaitForRequest( status );
-    status = ( status.Int() == KErrAlreadyExists ? KErrNone : status.Int() ); 
-    User::LeaveIfError( status.Int() );
-#else   //__WINS__
-    iPowerState = EBTOff;
-#endif  //__WINS__
-    TRACE_FUNC_EXIT
-    }
-
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
 void CBTEngServer::ManageDIServiceL( TBool aState )
     {
     TRACE_FUNC_ENTRY
@@ -959,353 +509,6 @@
     CleanupStack::PopAndDestroy( cenRep );  //cenRep
     }
 
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::SetUiIndicatorsL()
-    {
-    TRACE_FUNC_ENTRY
-    TInt powerState = EBTPowerOff;
-    TBTVisibilityMode visibilityMode = EBTVisibilityModeHidden;
-    CRepository* cenrep = NULL;
-    TInt phys = 0;
-    TInt connecting = 0;
-    
-    cenrep = CRepository::NewLC( KCRUidBluetoothPowerState );
-    User::LeaveIfError( cenrep->Get( KBTPowerState, powerState ) );
-    CleanupStack::PopAndDestroy( cenrep );  
-    
-    if( powerState == EBTPowerOff )
-        {
-        SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
-        SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
-        SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
-        SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
-        }
-    else if( powerState == EBTPowerOn )
-        {
-        RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount, phys );
-        RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothConnecting, connecting );
-        
-        cenrep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
-        User::LeaveIfError( cenrep->Get( KBTDiscoverable, (TInt&) visibilityMode ) );
-        CleanupStack::PopAndDestroy( cenrep );
-        
-        if( visibilityMode == EBTVisibilityModeHidden )
-            {
-             if ( connecting ) // BT connecting and hidden
-                {
-                SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
-                SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateAnimate );
-                }
-            else if ( phys > 0 ) // BT connection active and hidden     
-                {
-                SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
-                SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOn );
-                }
-            else  // BT connection not active and hidden
-                {
-                SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOn );
-                SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
-                }
-            SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
-            SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
-            }           
-        else if( visibilityMode == EBTVisibilityModeGeneral || visibilityMode == EBTVisibilityModeTemporary )
-            {     
-            if ( connecting ) // BT connecting and visible
-                {
-                SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
-                SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateAnimate );
-                }
-            else if ( phys > 0 ) // BT connection active and visible 
-                {
-                SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
-                SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOn );
-                }
-            else  // BT connection not active and visible
-                {
-                SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOn );
-                SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
-                }
-            SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
-            SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
-            }
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::SetIndicatorStateL( const TInt aIndicator, const TInt aState )
-    {
-    CAknSmallIndicator* indicator = CAknSmallIndicator::NewLC( TUid::Uid( aIndicator ) );
-    indicator->SetIndicatorStateL( aState );
-    CleanupStack::PopAndDestroy( indicator ); //indicator
-    }
-
-// ---------------------------------------------------------------------------
-// Gets the current HW power state.
-// For now this is a separate method to isolate the different variations.
-// ---------------------------------------------------------------------------
-//
-TInt CBTEngServer::GetHwPowerState( TBTPowerStateValue& aState )
-    {
-    TRACE_FUNC_ENTRY
-    TInt err = KErrNone;
-    
-#ifndef __WINS__
-    err = iPowerMgr.GetPower( (TBTPowerState&) aState, NULL );
-#else   //__WINS__
-    aState = (TBTPowerStateValue) iPowerState;
-#endif  //__WINS__
-    
-        // HCIv2 power state type is inverted from BTPM-defined type...
-    aState = (TBTPowerStateValue) !aState;
-    TRACE_FUNC_ARG( ( _L( "Power state is %d, result %d" ), (TInt) aState, err ) )
-    return err;
-    }
-
-// ---------------------------------------------------------------------------
-// Check the power state and if BT gets turned off automatically.
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::CheckTemporaryPowerStateL( TBTPowerStateValue& aCurrentState, 
-    TBTPowerStateValue aNewState, TBool aTemporary )
-    {
-	TRACE_FUNC_ENTRY
-    User::LeaveIfError( GetHwPowerState( aCurrentState ) );
-    if( !aTemporary )
-        {
-            // Force the new power state, so clear all auto switch off flags.
-            // If power is off, this will anyway be ignored.
-        iAutoOffClients = 0;
-        iAutoSwitchOff = EFalse;
-        TCallBack cb;
-        iBBConnMgr->SetAutoSwitchOff( EFalse, cb );
-        if( iRestoreVisibility && aCurrentState == EBTPowerOn )
-            {
-                // Set visibility mode back to the value selected by the user.
-            SetVisibilityModeL( EBTVisibilityModeGeneral, 0 );
-            iRestoreVisibility = EFalse;
-            }
-        }
-    else
-        {
-        if( aCurrentState == aNewState )
-            {
-            if( iAutoSwitchOff && aNewState == EBTPowerOn )
-                {
-                iAutoOffClients++;
-                if( iTimerQueued & EAutoPowerOffTimer )
-                   {
-                   iTimer->Remove( iPowerOffCallBack );
-                   iTimerQueued &= ~EAutoPowerOffTimer;
-                   }
-                }
-            }
-        else if( iAutoSwitchOff || aNewState == EBTPowerOn )
-            {
-            aNewState == EBTPowerOff ? iAutoOffClients-- : iAutoOffClients++;
-            iAutoSwitchOff = ETrue;
-            if( aNewState == EBTPowerOff && iAutoOffClients <= 0 )
-                {
-                TCallBack powerOffCb( AutoPowerOffCallBack, this );
-                iBBConnMgr->SetAutoSwitchOff( ETrue, powerOffCb );
-                iTimer->Queue( KBTEngBtAutoOffTimeout, iPowerOffCallBack );
-                iTimerQueued |= EAutoPowerOffTimer;
-                }
-            else if( aNewState == EBTPowerOn )
-                {
-                CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
-                TBTVisibilityMode visibility = EBTVisibilityModeGeneral;
-                TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility );
-                CleanupStack::PopAndDestroy( cenRep );
-                if( !err && visibility == EBTVisibilityModeGeneral )
-                    {
-                    SetVisibilityModeL( EBTVisibilityModeHidden, 0 );
-                    iRestoreVisibility = ETrue;
-                    }
-                if( iTimerQueued & EAutoPowerOffTimer )
-                   {
-                   iTimer->Remove( iPowerOffCallBack );
-                   iTimerQueued &= ~EAutoPowerOffTimer;
-                   }
-                }
-            }
-        }
-    if( iAutoOffClients < 0 )
-        {
-        iAutoOffClients = 0;
-        }
-	TRACE_FUNC_EXIT	
-    }
-
-// ---------------------------------------------------------------------------
-// Check the power state and if BT gets turned off automatically.
-// This method is invoked either when the timer has expired, or
-// if there are no more connections while the timer was running.
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::CheckAutoPowerOffL()
-    {
-   	TRACE_FUNC_ENTRY
-	if ( iAutoOffClients > 0 )
-	{
-	TRACE_INFO( ( _L( "[CBTEngServer]\t iAutoOffClients %d"), iAutoOffClients ))
-	return;
-	}
-    TInt linkCount = 0;
-    TInt err = RProperty::Get( KPropertyUidBluetoothCategory, 
-                                KPropertyKeyBluetoothGetPHYCount, linkCount );
-    if( !err && !linkCount )
-        {
-        TRACE_INFO( ( _L( "[CBTEngServer]\t SetPowerStateL( EBTPowerOff, EFalse );")))
-        SetPowerStateL( EBTPowerOff, EFalse );
-        }
-    else
-        {
-        if( iRestoreVisibility )
-            {
-                // Set visibility mode back to the value selected by the user.
-            SetVisibilityModeL( EBTVisibilityModeGeneral, 0 );
-            iRestoreVisibility = EFalse;
-            }
-            // show note if non-audio connection exists
-        if ( !iPluginMgr->CheckAudioConnectionsL() )
-            {
-	        RNotifier notifier;
-	        TInt err = notifier.Connect();
-	        if( !err )
-	            {
-				TRequestStatus status;
-				TBTGenericInfoNotiferParamsPckg pckg;
-				pckg().iMessageType = EBTStayPowerOn;
-				TBuf8<sizeof(TInt)> result;
-	            //notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg, result );
-				notifier.StartNotifierAndGetResponse( status, 
-                                                  KBTGenericInfoNotifierUid, 
-                                                  pckg, result );   // Reply buffer not used.
-				User::WaitForRequest( status );
-	            notifier.Close();
-		        }
-            }
-        iAutoOffClients = 0;
-        iAutoSwitchOff = EFalse;
-        TCallBack cb;
-        iBBConnMgr->SetAutoSwitchOff( EFalse, cb );
-        }
-	TRACE_FUNC_EXIT	
-    }
-
-// ---------------------------------------------------------------------------
-// ?implementation_description
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::CheckSspDebugModeL( TBool aDebugMode )
-    {
-    TRACE_FUNC_ARG( ( _L( "SSP debug mode state %d" ), (TInt) aDebugMode ) )
-    TBTPowerState pwr = EBTOff;
-    TBool currentMode = EFalse;
-    TInt err = RProperty::Get( KPropertyUidBluetoothCategory, 
-                                KPropertyKeyBluetoothGetSimplePairingDebugMode, 
-                                (TInt&) currentMode );
-#ifndef __WINS__
-    err = iPowerMgr.GetPower( pwr, NULL ); // Treat error as power off.
-#else   //__WINS__
-    pwr = iPowerState;
-#endif  //__WINS__
-    if( err || pwr == EBTOff )
-        {
-        iTimerQueued &= ~ESspDebugModeTimer;
-        iTimer->Remove( iDebugModeCallBack );
-            // Only set debug mode to off if it is on, to prevent a loop notifications.
-        if( currentMode )
-            {
-            (void) RProperty::Set( KPropertyUidBluetoothCategory, 
-                                    KPropertyKeyBluetoothSetSimplePairingDebugMode,
-                                    (TInt) aDebugMode );
-            }
-            // In case of an error in getting the power state, turn BT off. 
-            // If BT is already off, this call will be ignored.
-        SetPowerStateL( EBTPowerOff, EFalse );
-        }
-    else if( aDebugMode )
-        {
-            // Ignore if there already is a timer queued.
-        if( !( iTimerQueued & ESspDebugModeTimer ) )
-            {
-            iTimer->Queue( TTimeIntervalMicroSeconds32( KBTEngSspDebugModeTimeout ), 
-                            iDebugModeCallBack );
-            iTimerQueued &= ESspDebugModeTimer;
-            err =  RProperty::Set(KPropertyUidBluetoothCategory, 
-                                   KPropertyKeyBluetoothSetSimplePairingDebugMode, 
-                                   (TInt) aDebugMode );
-            }
-        }
-    else
-        {
-            // Power is on, and debug mode is set to off.
-        TInt linkCount = 0;
-        err = RProperty::Get( KPropertyUidBluetoothCategory, 
-                               KPropertyKeyBluetoothGetPHYCount, linkCount );
-        if( err || !linkCount )
-            {
-            (void) RProperty::Set(KPropertyUidBluetoothCategory, 
-                                   KPropertyKeyBluetoothSetSimplePairingDebugMode,
-                                   (TInt) aDebugMode );
-            SetPowerStateL( EBTPowerOff, EFalse );
-            }
-        else
-            {
-                // There are still existing connections, queue the 
-                // timer again for half the period.
-            iTimer->Queue( TTimeIntervalMicroSeconds32( KBTEngSspDebugModeTimeout / 2 ), 
-                            iDebugModeCallBack );
-            iTimerQueued &= ESspDebugModeTimer;
-            }
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// returns the reference of pairing manager
-// ---------------------------------------------------------------------------
-//
-CBTEngPairMan& CBTEngServer::PairManager()
-    {
-    return *iPairMan;
-    }
-
-// ---------------------------------------------------------------------------
-// Delegate the information to pairing manager
-// ---------------------------------------------------------------------------
-//
-void CBTEngServer::RemoteRegistryChangeDetected()
-    {
-    iPairMan->RemoteRegistryChangeDetected();
-    }
-
-// ---------------------------------------------------------------------------
-// Access the reference of RSockServ
-// ---------------------------------------------------------------------------
-//
-RSocketServ& CBTEngServer::SocketServ()
-    {
-    return iSocketServ;
-    }
-
-// ---------------------------------------------------------------------------
-// Access the reference of RBTRegSrv
-// ---------------------------------------------------------------------------
-//
-RBTRegServ& CBTEngServer::BTRegServ()
-    {
-    return iBTRegServ;
-    }
 
 // ---------------------------------------------------------------------------
 // Ask plugin manager the connection status of the specified device
@@ -1321,6 +524,7 @@
     return status;
     }
 
+
 // ---------------------------------------------------------------------------
 // Static callback for temporary visibility mode.
 // ---------------------------------------------------------------------------
@@ -1328,10 +532,14 @@
 TInt CBTEngServer::ScanModeTimerCallBack( TAny* aPtr )
     {
     __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) );
-    TRAPD( err, ( (CBTEngServer*) aPtr )->ScanModeTimerCompletedL() );
+    // The timer has completed, so remove our reference as well.
+    CBTEngServer* server = (CBTEngServer*) aPtr;
+    server->RemoveTimer( EScanModeTimer );
+    TRAPD( err, server->SettingsManager()->ScanModeTimerCompletedL() );
     return err;
     }
 
+
 // ---------------------------------------------------------------------------
 // Static callback for disconnecting all Baseband connections.
 // ---------------------------------------------------------------------------
@@ -1355,6 +563,7 @@
     return KErrNone;
     }
 
+
 // ---------------------------------------------------------------------------
 // Static callback for idle timer timeout. Turn off BT to get it out of 
 // debug mode. If there are existing connections, queue the timer again.
@@ -1362,35 +571,29 @@
 //
 TInt CBTEngServer::DebugModeTimerCallBack( TAny* aPtr )
     {
+    __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) );
     // Set our internal debug mode key to off. Ignore error, not critical here.
     (void) RProperty::Set( KPSUidBluetoothTestingMode, KBTSspDebugmode, EFalse );
-    
-    __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) );
-    
-    TRAP_IGNORE( ( (CBTEngServer*) aPtr )->CheckSspDebugModeL( EFalse ) );
+    CBTEngServer* server = (CBTEngServer*) aPtr;
+    TRAP_IGNORE( server->SettingsManager()->CheckSspDebugModeL( EFalse ) );
     return KErrNone;
     }
 
+
 // ---------------------------------------------------------------------------
 // Static callback for auto power off.
 // ---------------------------------------------------------------------------
 //
 TInt CBTEngServer::AutoPowerOffCallBack( TAny* aPtr )
     {
-	TRACE_FUNC_ENTRY
-	
-	__ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) );
-	
+    __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) );
+    // The timer has completed, so remove our reference as well.
     CBTEngServer* server = (CBTEngServer*) aPtr;
-    server->iTimerQueued &= ~EAutoPowerOffTimer;
-    TRAPD( err, server->CheckAutoPowerOffL() );
+    server->RemoveTimer( EAutoPowerOffTimer );
+    TRAPD( err, server->SettingsManager()->CheckAutoPowerOffL() );
     return err;
     }
 
-BluetoothFeatures::TEnterpriseEnablementMode CBTEngServer::EnterpriseEnablementMode() const
-    {
-    return iEnterpriseEnablementMode;
-    }
 
 // ======== GLOBAL FUNCTIONS ========
 
--- a/bluetoothengine/bteng/src/btengsrvkeywatcher.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengsrvkeywatcher.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -26,6 +26,8 @@
 #include "btengsrvkeywatcher.h"
 #include "btengserver.h"
 #include "btengsrvpluginmgr.h"
+#include "btengsrvsettingsmgr.h"
+#include "btengpairman.h"
 #include "btengprivatepskeys.h"
 #include "btengprivatecrkeys.h"
 #include "debug.h"
@@ -302,7 +304,7 @@
             aActive->GoActive();
             if( !aStatus && !iDutModeKey.Get( val ) )
                 {
-                iServer->SetDutMode( val );
+                iServer->SettingsManager()->SetDutMode( val );
                 }
             }
             break;
@@ -316,7 +318,7 @@
             remoteLockVal = ERemoteLocked;
             if( !aStatus && !iPhoneLockKey.Get( val ) && val == remoteLockVal )
                 {
-                iServer->SetPowerStateL( EBTPowerOff, EFalse );
+                iServer->SetPowerStateL( EBTOff, EFalse );
                 }
 #endif  //RD_REMOTELOCK
             }
@@ -329,7 +331,7 @@
             if( !aStatus && !iSystemStateKey.Get( val ) && 
                  val == ESwStateShuttingDown )
                 {
-                iServer->SetVisibilityModeL( EBTVisibilityModeNoScans , 0 );
+                iServer->SettingsManager()->SetVisibilityModeL( EBTVisibilityModeNoScans , 0 );
                 iServer->DisconnectAllL();   
                 }
             }
@@ -339,7 +341,7 @@
             TRACE_INFO( ( _L( "PHY count key changed" ) ) )
             iPHYCountKey.Subscribe( aActive->RequestStatus() );
             aActive->GoActive();
-            iServer->SetUiIndicatorsL();
+            iServer->SettingsManager()->SetUiIndicatorsL();
             }
             break;
         case KBTEngBtConnectionWatcher:
@@ -347,7 +349,7 @@
             TRACE_INFO( ( _L( "BT connection key changed" ) ) )
             iBtConnectionKey.Subscribe( aActive->RequestStatus() );
             aActive->GoActive();
-            iServer->SetUiIndicatorsL();
+            iServer->SettingsManager()->SetUiIndicatorsL();
             }
             break;        
         case KBTEngScanningWatcher:
@@ -357,7 +359,7 @@
             aActive->GoActive();
             if ( !iBtScanningKey.Get( val ) )
                 {
-                iServer->UpdateVisibilityModeL( val );
+                iServer->SettingsManager()->UpdateVisibilityModeL( val );
                 }
             }
             break;
@@ -369,7 +371,7 @@
             if( !aStatus && !iEmergencyCallKey.Get( val ) && val )
                 {
                 // An emergency call initiated -> Close SAP connection if it's active
-                iServer->iPluginMgr->DisconnectProfile( EBTProfileSAP );
+                iServer->PluginManager()->DisconnectProfile( EBTProfileSAP );
                 }
             }
             break;
@@ -380,7 +382,7 @@
             aActive->GoActive();
             if( !aStatus && !iSspDebugModeKey.Get( val ) )
                 {
-                iServer->CheckSspDebugModeL( (TBool) val );
+                iServer->SettingsManager()->CheckSspDebugModeL( (TBool) val );
                 }
             break;
             }
@@ -396,7 +398,7 @@
             if( !err && myChangedTable == KRegistryChangeRemoteTable )
             	{
             	TRACE_INFO( ( _L("BT Remote registry key changed") ) )
-            	iServer->RemoteRegistryChangeDetected();            	
+            	iServer->PairManager()->RemoteRegistryChangeDetected();
             	}
         	break;
         	}    
@@ -407,18 +409,18 @@
             aActive->GoActive();
             iSapKeyCenRep->Get( KBTSapEnabled, val );
             
-            TBTPowerStateValue powerState = EBTPowerOff;
-            User::LeaveIfError( iServer->GetHwPowerState( (TBTPowerStateValue&) powerState ) );
-            if( aStatus >= 0 && powerState )
+            TBTPowerState powerState = EBTOff;
+            User::LeaveIfError( iServer->SettingsManager()->GetHwPowerState( powerState ) );
+            if( aStatus >= 0 && powerState == EBTOn )
                 {
                 // Relevant only if BT is on
                 if( val == EBTSapEnabled )
                     {
-                    iServer->iPluginMgr->LoadBTSapPluginL();
+                    iServer->PluginManager()->LoadBTSapPluginL();
                     }
                 else
                     {
-                    iServer->iPluginMgr->UnloadBTSapPlugin();
+                    iServer->PluginManager()->UnloadBTSapPlugin();
                     }
                 }
             }
--- a/bluetoothengine/bteng/src/btengsrvpluginmgr.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengsrvpluginmgr.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -229,7 +229,7 @@
 	{
 	TRACE_FUNC_ENTRY
 	TBool want = EFalse;
-	switch ( iServer->EnterpriseEnablementMode() )
+	switch ( BluetoothFeatures::EnterpriseEnablementL() )
 		{
 	case BluetoothFeatures::EDisabled:
 		// In Disabled mode all plugins are filtered out.
@@ -322,7 +322,7 @@
     TRACE_FUNC_ENTRY
 
 	// SAP is supported in neither Data Profiles Disabled nor Disabled mode.
-    if ( iServer->EnterpriseEnablementMode() != BluetoothFeatures::EEnabled )
+    if ( BluetoothFeatures::EnterpriseEnablementL() != BluetoothFeatures::EEnabled )
         {
         TRACE_INFO( ( _L( "\tno we're not... Bluetooth is enterprise-IT-disabled" ) ) )
         User::Leave(KErrNotSupported);
--- a/bluetoothengine/bteng/src/btengsrvsession.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengsrvsession.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -22,6 +22,7 @@
 #include "btengserver.h"
 #include "btengsrvbbconnectionmgr.h"
 #include "btengpairman.h"
+#include "btengsrvsettingsmgr.h"
 #include "btengclientserver.h"
 #include "debug.h"
 
@@ -79,14 +80,11 @@
         {
         iNotifyConnMessage.Complete( KErrCancel );
         }
-    CancelPairRequest();
     if( Server() )
         {
-        Server()->RemoveSession( iAutoSwitchOff );
+        Server()->RemoveSession(this, iAutoSwitchOff );
         }
-    
     delete iConnectionEventQueue;
-    
     TRACE_FUNC_EXIT
     }
 
@@ -150,20 +148,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// Comfirm the caller if pairing request is completed in this invoke. 
-// ---------------------------------------------------------------------------
-//
-TInt CBTEngSrvSession::CompletePairRequest( TInt aResult )
-    {
-    if ( !iPairMessage.IsNull())
-        {
-        iPairMessage.Complete( aResult );
-        return KErrNone;
-        }
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
 // From class CSession2
 // Handles servicing of a client request that has been passed to the server.
 // ---------------------------------------------------------------------------
@@ -171,11 +155,11 @@
 void CBTEngSrvSession::ServiceL( const RMessage2& aMessage )
     {
     TRAPD( err, DispatchMessageL( aMessage ) );
-
     if( !aMessage.IsNull() &&
         ( err || 
           ( aMessage.Function() != EBTEngNotifyConnectionEvents && 
-            aMessage.Function() != EBTEngPairDevice ) ) )
+            aMessage.Function() != EBTEngPairDevice &&
+            aMessage.Function() != EBTEngSetPowerState ) ) )
         {
             // Return the error code to the client.
         aMessage.Complete( err );
@@ -206,15 +190,13 @@
         {
         case EBTEngSetPowerState:
             {
-            iAutoSwitchOff = (TBool) aMessage.Int1();
-            Server()->SetPowerStateL( (TBTPowerStateValue) aMessage.Int0(), 
-                                       iAutoSwitchOff );
+            Server()->SetPowerStateL( aMessage );
             }
             break;
         case EBTEngSetVisibilityMode:
             {
-            Server()->SetVisibilityModeL( (TBTVisibilityMode) aMessage.Int0(),
-                                           aMessage.Int1() );
+            Server()->SettingsManager()->SetVisibilityModeL(
+                        (TBTVisibilityMode) aMessage.Int0(),aMessage.Int1() );
             }
             break;
         case EBTEngNotifyConnectionEvents:
@@ -229,7 +211,6 @@
                 {
                 User::Leave(KErrInUse);
                 }
-            
             //save the client message
             iNotifyConnMessage = RMessage2(aMessage);
             
@@ -261,17 +242,9 @@
         case EBTEngIsDeviceConnected:
         case EBTEngGetConnectedAddresses:
             {
-            TBTPowerStateValue pwr = EBTPowerOff;
-            Server()->GetHwPowerState( pwr );
-            if( pwr )
-                {
-                    // Simply forward it to the plug-in manager
-                Server()->DispatchPluginMessageL( aMessage );
-                }
-            else
-                {
-                User::Leave( KErrNotReady );
-                }
+            CheckPowerOnL();
+            // Simply forward it to the plug-in manager
+            Server()->DispatchPluginMessageL( aMessage );
             }
             break;    
         case EBTEngIsDeviceConnectable:
@@ -282,38 +255,31 @@
         case EBTEngPrepareDiscovery:
             {
             aMessage.Complete( KErrNone );  // Client does not have to wait.
-            Server()->iBBConnMgr->ManageTopology( ETrue );
+            Server()->BasebandConnectionManager()->ManageTopology( ETrue );
             }
             break;
         case EBTEngSetPairingObserver:
+            {
+            CheckPowerOnL();
+            // Simply forward it to the pairing manager
+            Server()->PairManager()->ProcessCommandL( aMessage );
+            break;
+            }
         case EBTEngPairDevice:
             {
-            TBTPowerStateValue pwr = EBTPowerOff;
-            (void) Server()->GetHwPowerState( pwr );
-            if( pwr )
-                {
-                // Simply forward it to the pairing manager
-                Server()->PairManager().ProcessCommandL( aMessage );
-                if ( opcode == EBTEngPairDevice )
-                    {
-                    iPairMessage = RMessage2( aMessage );
-                    }
-                }
-            else
-                {
-                User::Leave( KErrNotReady );
-                }
+            CheckPowerOnL();
+            // Simply forward it to the pairing manager
+            Server()->PairManager()->ProcessCommandL( aMessage );
             break;
             }
         case EBTEngCancelPairDevice:
             {
-            CancelPairRequest();
+            Server()->PairManager()->ProcessCommandL( aMessage );
             break;
             }
         default:
             {
-            TRACE_INFO( ( _L( "[BTENG]\t DispatchMessageL: bad request (%d)" ), 
-                                aMessage.Function() ) )
+            TRACE_INFO( ( _L( "[BTENG]\t DispatchMessageL: bad request (%d)" ), aMessage.Function() ) )
             User::Leave( KErrArgument );
             }
             break;
@@ -322,14 +288,15 @@
     }
 
 // ---------------------------------------------------------------------------
-// Only the originator of pairing can cancel the pairing request.
+// Check if power is on, and leave if it is not.
 // ---------------------------------------------------------------------------
 //
-void CBTEngSrvSession::CancelPairRequest()
+void CBTEngSrvSession::CheckPowerOnL()
     {
-    if ( !iPairMessage.IsNull() )
+    TBTPowerState power = EBTOff;
+    (void) Server()->SettingsManager()->GetHwPowerState( power );
+    if ( power == EBTOff )
         {
-        Server()->PairManager().CancelCommand( iPairMessage.Function() );
-        iPairMessage.Complete( KErrCancel );
+        User::Leave( KErrNotReady );
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,943 @@
+/*
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Class to manage Bluetooth hardware and stack settings.
+*
+*/
+
+#include "btengsrvsettingsmgr.h"
+#include <bthci.h>
+#include <bt_subscribe_partner.h>
+#include <btnotif.h>
+#include <btengdomainpskeys.h>
+#include <centralrepository.h>
+#include <featmgr.h>
+#include <AknSmallIndicator.h>
+#include <avkon.hrh>
+
+#include "btengserver.h"
+#include "btengsrvpluginmgr.h"
+#include "btengsrvbbconnectionmgr.h"
+#include "btengsrvstate.h"
+#include "debug.h"
+
+#ifndef SETLOCALNAME
+#include <btengsettings.h>
+#endif
+
+/** ID of active object helper */
+const TInt KBTEngSettingsActive = 30;
+/** Constant for converting minutes to microseconds */
+//const TInt64 KMinutesInMicroSecs = 60000000;
+const TInt64 KMinutesInMicroSecs = MAKE_TINT64( 0, 60000000 );
+/**  Timeout for disabling Simple Pairing debug mode. The value is 30 minutes. */
+//const TInt KBTEngSspDebugModeTimeout = 1800000000;
+const TInt64 KBTEngSspDebugModeTimeout = MAKE_TINT64( 0, 1800000000 );
+/**  Timeout for turning BT off automatically. The value is 10.5 seconds. */
+const TInt KBTEngBtAutoOffTimeout = 10500000;
+/**  Default values for Major Service Class */
+const TUint16 KCoDDefaultServiceClass = EMajorServiceTelephony | EMajorServiceObjectTransfer | EMajorServiceNetworking;
+/**  Default values for Major Device Class */
+const TUint8 KCoDDefaultMajorDeviceClass = EMajorDevicePhone;
+/**  Default values for Minor Device Class */
+const TUint8 KCoDDefaultMinorDeviceClass = EMinorDevicePhoneSmartPhone;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+CBTEngSrvSettingsMgr::CBTEngSrvSettingsMgr( CBTEngServer* aServer )
+:   iServer( aServer )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// Symbian second-phase constructor
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    iActive = CBTEngActive::NewL( *this, KBTEngSettingsActive );
+    LoadBTPowerManagerL();
+    iEnterpriseEnablementMode = BluetoothFeatures::EnterpriseEnablementL();
+    TRACE_INFO( ( _L( "iEnterpriseEnablementMode = %d" ), iEnterpriseEnablementMode) )
+    if ( iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
+        {
+        SetVisibilityModeL( EBTVisibilityModeNoScans, 0 );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CBTEngSrvSettingsMgr* CBTEngSrvSettingsMgr::NewL( CBTEngServer* aServer )
+    {
+    CBTEngSrvSettingsMgr* self = new( ELeave ) CBTEngSrvSettingsMgr( aServer );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBTEngSrvSettingsMgr::~CBTEngSrvSettingsMgr()
+    {
+    if( iActive && iActive->IsActive() )
+        {
+        // Cancel the outstanding request.
+        iPowerMgr.Cancel();
+        }
+    delete iActive;  
+    iPowerMgr.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Power Bluetooth hardware on or off.
+// ---------------------------------------------------------------------------
+//
+TInt CBTEngSrvSettingsMgr::SetHwPowerState( TBTPowerState aState )
+    {
+    TRACE_FUNC_ENTRY
+    TInt err = KErrNone;
+#ifndef __WINS__
+    if( iActive->IsActive() )
+        {
+        // Cancel the outstanding request.
+        iPowerMgr.Cancel();
+        iActive->Cancel();
+        }
+    iPowerMgr.SetPower( aState, NULL, iActive->RequestStatus() );
+    iActive->GoActive();
+#else   //__WINS__
+    iPowerState = aState;
+#endif  //__WINS__
+
+   if( !err && aState == EBTOn )
+        {
+        TInt dutMode = EBTDutOff;
+        err = RProperty::Get( KPSUidBluetoothTestingMode, KBTDutEnabled, dutMode );
+        if( !err && dutMode == EBTDutOn )
+            {
+            // Set the DUT mode key to OFF since DUT mode is disabled at this point
+            err = RProperty::Set( KPSUidBluetoothTestingMode, KBTDutEnabled, EBTDutOff );
+            }
+        }
+    if( err )
+        {
+        // Power off if an error occurred during power on sequence.
+#ifndef __WINS__
+            // This cannot happen in emulator environment.
+        iPowerMgr.Cancel();
+        iActive->Cancel();
+        iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() );
+        User::WaitForRequest( iActive->RequestStatus() );
+        // Result will be communicated through the caller of this function (by leaving).
+#else   //__WINS__
+        iPowerState = EBTOff;
+#endif  //__WINS__
+        } 
+    TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
+    return err;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Turn BT on or off.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetPowerStateL( TBTPowerState aState, TBool aTemporary )
+    {
+    TRACE_FUNC_ARG( ( _L( "%d (temporary=%d" ), aState, aTemporary ) )
+    if ( aState == EBTOn && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
+        {
+        TRACE_INFO( ( _L( "no we're not... Bluetooth is enterprise-IT-disabled" ) ) )
+        User::Leave(KErrNotSupported);
+        }
+    TBool idle = ( iServer->StateMachine()->CurrentOperation() == CBTEngSrvState::ESrvOpIdle );
+    TBTPowerState currentState = EBTOff;
+    CheckTemporaryPowerStateL( currentState, aState, aTemporary );
+
+    if ( ( currentState == aState || ( aTemporary && aState == EBTOff ) ) && idle )
+        {
+        // The requested power state is already active, ignore silently.
+        // We don't return an error here, as there is no error situation.
+        TRACE_INFO( ( _L( "SetPowerStateL: nothing to do" ) ) )
+        if ( currentState == aState )
+            {
+            // Make sure that the CenRep key is in sync.
+            // During boot-up, the pwoer is set from the CenRep key, so we could 
+            // end up out-of-sync.
+            TRACE_INFO( ( _L( "SetPowerStateL: currentState == aState" ) ) )
+            UpdateCenRepPowerKeyL( aState );
+            } 
+        return;
+        }
+    if ( aState == EBTOn )
+        {
+        // Hardware power on is the first step.
+        User::LeaveIfError( SetHwPowerState( aState ) );
+        }
+    else
+        {
+        //Prevent BT visibility in the situation when we turn OFF BT Engine 
+        //but FM Radio is still alive
+        SetVisibilityModeL( EBTVisibilityModeNoScans, 0 );
+        // Hardware power off is the last step.
+        // First disconnect all plug-ins.
+        iServer->PluginManager()->DisconnectAllPlugins();
+        }
+    // We only signal that BT is on after everything has completed (through 
+    // the CenRep power state key), so that all services are initialized.
+    // We signal that BT is off immediately though, so that our clients will 
+    // not try to use BT during power down.
+    iServer->StateMachine()->StartStateMachineL( aState );
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Turn BT on or off.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetPowerStateL(const RMessage2 aMessage )
+    {
+    TRACE_FUNC_ENTRY
+    __ASSERT_ALWAYS( aMessage.Function() == EBTEngSetPowerState, 
+            PanicServer( EBTEngPanicExpectSetPowerOpcode ) );
+    if ( !iMessage.IsNull() )
+        {
+        // A power management request from a client is outstanding.
+        User::Leave( KErrAlreadyExists );
+        }
+ 
+    TBTPowerStateValue arg = (TBTPowerStateValue) aMessage.Int0();
+    // TBTPowerState power state type is inverted from TBTPowerStateValue,
+    // which is used by the client to pass the parameter...
+    TBTPowerState reqedPowerState( EBTOff );
+    if ( arg == EBTPowerOn )
+        {
+        reqedPowerState = EBTOn;
+        }
+    TBool tempPowerOn = (TBool) aMessage.Int1();
+    
+    SetPowerStateL( reqedPowerState, tempPowerOn );
+    if ( iServer->StateMachine()->CurrentOperation() == CBTEngSrvState::ESrvOpIdle )
+        {
+        // The request is accepted but the state machine is not running. This means the
+        // requested power state is already active. Request is done.
+        aMessage.Complete( KErrNone );
+        }
+    else
+        {
+        iMessage = RMessage2( aMessage );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Initialize Bluetooth stack settings.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::InitBTStackL()
+    {
+    TRACE_FUNC_ENTRY
+    iServer->BasebandConnectionManager()->Subscribe();
+    TBTVisibilityMode visibility = EBTVisibilityModeHidden;
+    CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
+    TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility );
+    delete cenRep;
+    if (iRestoreVisibility == EFalse)
+        {
+        if( err || visibility == EBTVisibilityModeTemporary &&
+            !( iServer->IsTimerQueued( CBTEngServer::EScanModeTimer ) ) )
+            {
+            visibility = EBTVisibilityModeHidden;
+            }
+        SetVisibilityModeL( visibility, 0 );
+        }
+
+    TBool sspDebugMode = EFalse;
+    (void) RProperty::Get( KPropertyUidBluetoothCategory,
+                KPropertyKeyBluetoothGetSimplePairingDebugMode, (TInt&) sspDebugMode );
+        // Only set debug mode to off if it is on, to prevent a loop notifications.
+    if( sspDebugMode )
+        {
+        sspDebugMode = EFalse;
+        // Add LeaveIfError if unsuccessful
+        (void) RProperty::Set(KPropertyUidBluetoothCategory,
+                    KPropertyKeyBluetoothSetSimplePairingDebugMode, (TInt) sspDebugMode );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// Reset settings and disconnect all links.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::StopBTStackL()
+    {
+    TRACE_FUNC_ENTRY
+    TBTVisibilityMode visibility = EBTVisibilityModeHidden;
+    CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
+          // Ignore error here; if we can't read it, likely we can't set it either.
+    (void) cenRep->Get( KBTDiscoverable, (TInt&) visibility );
+    delete cenRep;
+    if( visibility == EBTVisibilityModeTemporary )
+        {
+        visibility = EBTVisibilityModeHidden;
+        SetVisibilityModeL( visibility, 0 );    // Also cancels scan mode timer.
+        }
+
+        // Stop listening to events
+    iServer->BasebandConnectionManager()->Unsubscribe();
+        // Disconnect all links
+    TCallBack cb( CBTEngServer::DisconnectAllCallBack, iServer );
+    iServer->BasebandConnectionManager()->DisconnectAllLinksL( cb );
+        // Results in a callback (which is called directly when there are no links).
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// Update the power state CenRep key.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::UpdateCenRepPowerKeyL( TBTPowerState aState )
+    {
+    TRACE_FUNC_ENTRY
+    CRepository* cenrep = CRepository::NewLC( KCRUidBluetoothPowerState );
+    // TBTPowerState power state type is inverted from TBTPowerStateValue...
+    TBTPowerStateValue power = (TBTPowerStateValue) !aState;
+    User::LeaveIfError( cenrep->Set( KBTPowerState, (TInt) power ) );
+    CleanupStack::PopAndDestroy( cenrep );
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime )
+    {
+    TRACE_FUNC_ARG( ( _L( "[aMode: %d" ), aMode ) )
+    if ( aMode != EBTVisibilityModeNoScans && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
+        {
+        TRACE_INFO( ( _L( "\tnot changing anything... Bluetooth is enterprise-IT-disabled" ) ) )
+        User::Leave( KErrNotSupported );
+        }
+
+    TInt err = KErrNone;
+    iServer->RemoveTimer( CBTEngServer::EScanModeTimer );
+    if( aMode != EBTVisibilityModeNoScans )
+        {
+        CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
+        err = cenRep->Set( KBTDiscoverable, aMode );
+        delete cenRep;
+        }
+    if( !err && aMode == EBTVisibilityModeTemporary )
+        {
+            // We need TInt64 here, as the max. time in microseconds for the 
+            // max. value (1 hour) is larger than KMaxTInt32.
+        TInt64 timeMicroSec = MAKE_TINT64( 0, aTime );
+        timeMicroSec = timeMicroSec * KMinutesInMicroSecs;
+            // Queue callback to set the visibility back to hidden.
+        iServer->QueueTimer( CBTEngServer::EScanModeTimer, (TInt64) timeMicroSec );
+        aMode = EBTVisibilityModeGeneral;
+        }
+    else if( !err && iRestoreVisibility )
+        {
+            // The user overrides, do not restore visibility mode anymore.
+        iRestoreVisibility = EFalse;
+        }
+    if( !err )
+        {
+        err = RProperty::Set( KUidSystemCategory, 
+                               KPropertyKeyBluetoothSetScanningStatus, aMode );
+        }
+    TBool hiddenMode = ( aMode == EBTVisibilityModeHidden );
+    if( !err && aMode != EBTVisibilityModeNoScans )
+        {
+            // In hidden mode, we only accept connections from paired devices.
+        err = RProperty::Set( KUidSystemCategory, 
+                               KPropertyKeyBluetoothSetAcceptPairedOnlyMode, 
+                               hiddenMode );
+        }
+
+    User::LeaveIfError( err );  // To communicate the result to the client.
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// Timed visible mode has expired.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::ScanModeTimerCompletedL()
+    {
+    TRACE_FUNC_ENTRY
+    SetVisibilityModeL( EBTVisibilityModeHidden, 0 );
+    TBTPowerState power = EBTOff;
+    TInt err = GetHwPowerState( power );
+    // See p2.1.2.1.2 of the UI spec
+    // NB:  Please distinguish between TBTPowerState::EBTOff (defined in hcitypes.h)
+    //      and TBTPowerStateValue::EBTPowerOff (defined in btserversdkcrkeys.h)
+    //      because they have the opposite values
+    if( !err && (power != EBTOff))
+        {
+        // Show a notification to the user
+        TBTGenericInfoNotiferParamsPckg pckg;
+        pckg().iMessageType = EBTVisibilityTimeout;
+        
+        RNotifier notifier;
+        TInt err = notifier.Connect();
+        if( !err )
+            {
+            err = notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg );
+            notifier.Close();
+            }
+        }
+    TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
+    }
+
+
+// ---------------------------------------------------------------------------
+// Check the secure simple pairing debug mode and turn it off if needed.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::CheckSspDebugModeL( TBool aDebugMode )
+    {
+    TRACE_FUNC_ARG( ( _L( "SSP debug mode state %d" ), (TInt) aDebugMode ) )
+    TBTPowerState pwr = EBTOff;
+    TBool currentMode = EFalse;
+    TInt err = RProperty::Get( KPropertyUidBluetoothCategory, 
+                                KPropertyKeyBluetoothGetSimplePairingDebugMode, 
+                                (TInt&) currentMode );
+#ifndef __WINS__
+    err = iPowerMgr.GetPower( pwr, NULL ); // Treat error as power off.
+#else   //__WINS__
+    pwr = iPowerState;
+#endif  //__WINS__
+    if( err || pwr == EBTOff )
+        {
+        iServer->RemoveTimer( CBTEngServer::ESspDebugModeTimer );
+            // Only set debug mode to off if it is on, to prevent a loop notifications.
+        if( currentMode )
+            {
+            (void) RProperty::Set( KPropertyUidBluetoothCategory, 
+                                    KPropertyKeyBluetoothSetSimplePairingDebugMode,
+                                    (TInt) aDebugMode );
+            }
+            // In case of an error in getting the power state, turn BT off. 
+            // If BT is already off, this call will be ignored.
+        SetPowerStateL( EBTOff, EFalse );
+        }
+    else if( aDebugMode )
+        {
+            // Ignore if there already is a timer queued.
+        if( !( iServer->IsTimerQueued( CBTEngServer::ESspDebugModeTimer ) ) )
+            {
+            iServer->QueueTimer( CBTEngServer::ESspDebugModeTimer, (TInt64) KBTEngSspDebugModeTimeout );
+            err =  RProperty::Set(KPropertyUidBluetoothCategory, 
+                                   KPropertyKeyBluetoothSetSimplePairingDebugMode, 
+                                   (TInt) aDebugMode );
+            }
+        }
+    else
+        {
+            // Power is on, and debug mode is set to off.
+        TInt linkCount = 0;
+        err = RProperty::Get( KPropertyUidBluetoothCategory, 
+                               KPropertyKeyBluetoothGetPHYCount, linkCount );
+        if( err || !linkCount )
+            {
+            (void) RProperty::Set(KPropertyUidBluetoothCategory, 
+                                   KPropertyKeyBluetoothSetSimplePairingDebugMode,
+                                   (TInt) aDebugMode );
+            SetPowerStateL( EBTOff, EFalse );
+            }
+        else
+            {
+            // There are still existing connections, queue the
+            // timer again for half the period.
+            TInt64 interval = KBTEngSspDebugModeTimeout / 2;
+            iServer->QueueTimer( CBTEngServer::ESspDebugModeTimer, interval );
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// A session will be ended, completes the pending request for this session.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SessionClosed( CSession2* aSession )
+    {
+    TRACE_FUNC_ARG( ( _L( " session %x"), aSession ) )
+    if ( !iMessage.IsNull() && iMessage.Session() == aSession )
+        {
+        iMessage.Complete( KErrCancel );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Check the power state and if BT gets turned off automatically.
+// This method is invoked either when the timer has expired, or
+// if there are no more connections while the timer was running.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::CheckAutoPowerOffL()
+    {
+    TRACE_FUNC_ENTRY
+    if ( iAutoOffClients > 0 )
+        {
+        TRACE_INFO( ( _L( "[CBTEngServer]\t iAutoOffClients %d"), iAutoOffClients ) )
+        return;
+        }
+    TInt linkCount = 0;
+    TInt err = RProperty::Get( KPropertyUidBluetoothCategory, 
+                                KPropertyKeyBluetoothGetPHYCount, linkCount );
+    if( !err && !linkCount )
+        {
+        TRACE_INFO( ( _L( "[CBTEngServer]\t SetPowerStateL( EBTOff, EFalse );")))
+        SetPowerStateL( EBTOff, EFalse );
+        }
+    else
+        {
+        if( iRestoreVisibility )
+            {
+                // Set visibility mode back to the value selected by the user.
+            SetVisibilityModeL( EBTVisibilityModeGeneral, 0 );
+            iRestoreVisibility = EFalse;
+            }
+            // show note if non-audio connection exists
+        if ( !iServer->PluginManager()->CheckAudioConnectionsL() )
+            {
+            RNotifier notifier;
+            TInt err = notifier.Connect();
+            if( !err )
+                {
+                TRequestStatus status;
+                TBTGenericInfoNotiferParamsPckg pckg;
+                pckg().iMessageType = EBTStayPowerOn;
+                TBuf8<sizeof(TInt)> result;
+                //notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg, result );
+                notifier.StartNotifierAndGetResponse( status, 
+                                                  KBTGenericInfoNotifierUid, 
+                                                  pckg, result );   // Reply buffer not used.
+                User::WaitForRequest( status );
+                notifier.Close();
+                }
+            }
+        iAutoOffClients = 0;
+        iAutoSwitchOff = EFalse;
+        TCallBack cb;
+        iServer->BasebandConnectionManager()->SetAutoSwitchOff( EFalse, cb );
+        }
+    TRACE_FUNC_EXIT 
+    }
+
+
+// ---------------------------------------------------------------------------
+// The method is called when BT stack scanning mode P&S key is changed
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::UpdateVisibilityModeL( TInt aStackScanMode )
+    {
+    TRACE_FUNC_ARG( ( _L( "[aStackScanMode: %d" ), aStackScanMode ) )
+    TBTVisibilityMode currentMode;
+
+    CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
+    User::LeaveIfError( cenRep->Get( KBTDiscoverable, (TInt&) currentMode ) );
+
+        // In case we are in temp visibility mode, we cannot always know whether the BT stack
+        // scan mode key was set by some external party or by us in SetVisibilityModeL above.
+        // Therefore we cannot stop the timer in case aMode is EBTVisibilityModeGeneral and 
+        // currentmode is EBTVisibilityModeTemporary
+    if( !( currentMode == EBTVisibilityModeTemporary && aStackScanMode == EBTVisibilityModeGeneral ) )
+        {
+            // Cancel the timer and queue it again if needed.
+        iServer->RemoveTimer( CBTEngServer::EScanModeTimer );
+        if( currentMode != aStackScanMode )
+            {
+            if( aStackScanMode == EPageScanOnly || aStackScanMode == EInquiryAndPageScan )
+                {
+                User::LeaveIfError( cenRep->Set( KBTDiscoverable, aStackScanMode ) );
+                }
+            else if( aStackScanMode == EInquiryScanOnly )
+                {
+                    // We don't support ENoScansEnabled nor EInquiryScanOnly mode
+                    // -> Consider these as same as Hidden 
+                User::LeaveIfError( cenRep->Set( KBTDiscoverable, EBTVisibilityModeHidden ) );
+                }
+            else if( aStackScanMode == ENoScansEnabled )
+                {
+                //We don't change KBTDiscoverable here, because ENoScansEnabled
+                //indicates BT/SYSTEM shutdown is happening
+                }
+            }
+        }
+    SetUiIndicatorsL();
+    CleanupStack::PopAndDestroy( cenRep );
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// Set Device Under Test mode.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetDutMode( TInt aDutMode )
+    {
+    TRACE_FUNC_ARG( ( _L( "DUT mode %d" ), aDutMode ) )
+
+    if (aDutMode == EBTDutOff)
+        {
+        return;
+        }
+
+    TInt powerState = EBTOff;
+    CRepository* cenrep = NULL;
+    
+    TRAPD(err, cenrep = CRepository::NewL(KCRUidBluetoothPowerState));
+    
+    if (!err && cenrep)
+        {
+        cenrep->Get(KBTPowerState, powerState);
+        delete cenrep;
+        cenrep = NULL;
+        }
+    else
+        {
+        return;
+        }
+
+    if (powerState == EBTPowerOn)
+        {
+
+#ifndef __WINS__
+        RBluetoothDutMode dutMode;
+        TInt err = dutMode.Open();
+        TRACE_FUNC_ARG( ( _L( "Open DUT mode handle err %d" ), err) )
+        if(!err) 
+            {
+            dutMode.ActivateDutMode();
+            dutMode.Close();
+            }
+#endif  //__WINS__                        
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MBTEngActiveObserver.
+// Callback to notify that an outstanding request has completed.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::RequestCompletedL( CBTEngActive* aActive, TInt aId, TInt aStatus )
+    {
+    __ASSERT_ALWAYS( aId == KBTEngSettingsActive, PanicServer( EBTEngPanicCorrupt ) );
+    TRACE_FUNC_ENTRY
+    (void) aActive;
+    if ( aStatus != KErrNone && aStatus != KErrAlreadyExists && aStatus != KErrCancel )
+        {
+        // Something went wrong, so we turn BT off again.
+        SetPowerStateL( EBTOff, EFalse );
+        }
+    else
+        {
+        // Write CoD only when the hardware has fully powered up.
+        TBTPowerState currState ( EBTOff );
+        (void) GetHwPowerState( currState );
+        if ( currState == EBTOn )
+            {
+            SetClassOfDeviceL();
+#ifndef SETLOCALNAME 
+            // the macro SETLOCALNAME is used as a workaround to tackle the BT name 
+            // could not be saved to BT chip before chip initialization completed for the first time,
+            // which is one of the regression after improving the BT boot up time. 
+            // To be removed once the final solution is in place. 
+            CBTEngSettings* settings = CBTEngSettings::NewL();
+            TBTDeviceName localName;           
+            localName.Zero();
+            TInt err = settings->GetLocalName(localName);
+            if (err == KErrNone)
+                {
+                settings->SetLocalName(localName);
+                }
+            delete settings;
+#endif
+            }
+        }
+    if ( !iMessage.IsNull())
+        {
+        iMessage.Complete( aStatus );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MBTEngActiveObserver.
+// Callback to notify that an error has occurred in RunL.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::HandleError( CBTEngActive* aActive, TInt aId, TInt aError )
+    {
+    (void) aActive;
+    (void) aId;
+    if ( !iMessage.IsNull())
+        {
+        iMessage.Complete( aError );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Loads the BT Power Manager; leaves if it cannot be loaded.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::LoadBTPowerManagerL()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_INFO( ( _L( "[CBTEngSrvSettingsMgr]\t Using HCI API v2 power manager" ) ) )
+    User::LeaveIfError( iPowerMgr.Open() );
+#ifndef __WINS__
+    iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() );
+    User::WaitForRequest( iActive->RequestStatus() );
+    TInt status = ( iActive->RequestStatus().Int() == KErrAlreadyExists ? KErrNone : iActive->RequestStatus().Int() ); 
+    User::LeaveIfError( status );
+#else   //__WINS__
+    iPowerState = EBTOff;
+#endif  //__WINS__
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetUiIndicatorsL()
+    {
+    TRACE_FUNC_ENTRY
+    TBTPowerStateValue powerState = EBTPowerOff;
+    TBTVisibilityMode visibilityMode = EBTVisibilityModeHidden;
+    CRepository* cenrep = NULL;
+    TInt phys = 0;
+    TInt connecting = 0;
+
+    cenrep = CRepository::NewLC( KCRUidBluetoothPowerState );
+    User::LeaveIfError( cenrep->Get( KBTPowerState, (TInt&) powerState ) );
+    CleanupStack::PopAndDestroy( cenrep );
+    
+    if( powerState == EBTPowerOff )
+        {
+        SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
+        SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
+        SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
+        SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
+        }
+    else
+        {
+        // Power is on.
+        RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount, phys );
+        RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothConnecting, connecting );
+        
+        cenrep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
+        User::LeaveIfError( cenrep->Get( KBTDiscoverable, (TInt&) visibilityMode ) );
+        CleanupStack::PopAndDestroy( cenrep );
+        
+        if( visibilityMode == EBTVisibilityModeHidden )
+            {
+             if ( connecting ) // BT connecting and hidden
+                {
+                SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
+                SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateAnimate );
+                }
+            else if ( phys > 0 ) // BT connection active and hidden     
+                {
+                SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
+                SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOn );
+                }
+            else  // BT connection not active and hidden
+                {
+                SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOn );
+                SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
+                }
+            SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
+            SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
+            }           
+        else if( visibilityMode == EBTVisibilityModeGeneral || visibilityMode == EBTVisibilityModeTemporary )
+            {     
+            if ( connecting ) // BT connecting and visible
+                {
+                SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
+                SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateAnimate );
+                }
+            else if ( phys > 0 ) // BT connection active and visible 
+                {
+                SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
+                SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOn );
+                }
+            else  // BT connection not active and visible
+                {
+                SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOn );
+                SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
+                }
+            SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
+            SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetIndicatorStateL( const TInt aIndicator, const TInt aState )
+    {
+    CAknSmallIndicator* indicator = CAknSmallIndicator::NewLC( TUid::Uid( aIndicator ) );
+    indicator->SetIndicatorStateL( aState );
+    CleanupStack::PopAndDestroy( indicator ); //indicator
+    }
+
+
+// ---------------------------------------------------------------------------
+// Gets the current HW power state.
+// For now this is a separate method to isolate the different variations.
+// ---------------------------------------------------------------------------
+//
+TInt CBTEngSrvSettingsMgr::GetHwPowerState( TBTPowerState& aState )
+    {
+    TRACE_FUNC_ENTRY
+    TInt err = KErrNone;
+    
+#ifndef __WINS__
+    err = iPowerMgr.GetPower( aState, NULL );
+#else   //__WINS__
+    aState = iPowerState;
+#endif  //__WINS__
+    TRACE_FUNC_ARG( ( _L( "Power state is %d, result %d" ), (TInt) aState, err ) )
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// Check the power state and if BT gets turned off automatically.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::CheckTemporaryPowerStateL( TBTPowerState& aCurrentState, 
+    TBTPowerState aNewState, TBool aTemporary )
+    {
+    TRACE_FUNC_ENTRY
+    User::LeaveIfError( GetHwPowerState( aCurrentState ) );
+    if( !aTemporary )
+        {
+            // Force the new power state, so clear all auto switch off flags.
+            // If power is off, this will anyway be ignored.
+        iAutoOffClients = 0;
+        iAutoSwitchOff = EFalse;
+        TCallBack cb;
+        iServer->BasebandConnectionManager()->SetAutoSwitchOff( EFalse, cb );
+        if( iRestoreVisibility && aCurrentState == EBTOn )
+            {
+                // Set visibility mode back to the value selected by the user.
+            SetVisibilityModeL( EBTVisibilityModeGeneral, 0 );
+            iRestoreVisibility = EFalse;
+            }
+        }
+    else
+        {
+        if( aCurrentState == aNewState )
+            {
+            if( iAutoSwitchOff && aNewState == EBTOn )
+                {
+                iAutoOffClients++;
+                iServer->RemoveTimer( CBTEngServer::EAutoPowerOffTimer );
+                }
+            }
+        else if( iAutoSwitchOff || aNewState == EBTOn )
+            {
+            aNewState == EBTOff ? iAutoOffClients-- : iAutoOffClients++;
+            iAutoSwitchOff = ETrue;
+            if( aNewState == EBTOff && iAutoOffClients <= 0 )
+                {
+                TCallBack powerOffCb( CBTEngServer::AutoPowerOffCallBack, iServer );
+                iServer->BasebandConnectionManager()->SetAutoSwitchOff( ETrue, powerOffCb );
+                TInt64 interval = KBTEngBtAutoOffTimeout;
+                iServer->QueueTimer( CBTEngServer::EAutoPowerOffTimer, interval );
+                }
+            else if( aNewState == EBTOn )
+                {
+                CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
+                TBTVisibilityMode visibility = EBTVisibilityModeGeneral;
+                TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility );
+                CleanupStack::PopAndDestroy( cenRep );
+                if( !err && visibility == EBTVisibilityModeGeneral )
+                    {
+                    SetVisibilityModeL( EBTVisibilityModeHidden, 0 );
+                    iRestoreVisibility = ETrue;
+                   }
+                iServer->RemoveTimer( CBTEngServer::EAutoPowerOffTimer );
+                }
+            }
+        }
+    if( iAutoOffClients < 0 )
+        {
+        iAutoOffClients = 0;
+        }
+    TRACE_FUNC_EXIT 
+    }
+
+
+// ---------------------------------------------------------------------------
+// Set the Class of Device.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvSettingsMgr::SetClassOfDeviceL()
+    {
+    TRACE_FUNC_ENTRY
+    TUint16 serviceClass = KCoDDefaultServiceClass;
+        // Check from feature manager if stereo audio is enabled.
+    FeatureManager::InitializeLibL();
+    TBool supported = FeatureManager::FeatureSupported( KFeatureIdBtStereoAudio );
+    FeatureManager::UnInitializeLib();
+    if( supported )
+        {
+        // A2DP spec says we should set this bit as we are a SRC
+        serviceClass |= EMajorServiceCapturing;
+        }
+        // These values may nayway be overridden by HCI
+    TBTDeviceClass cod( serviceClass, KCoDDefaultMajorDeviceClass, 
+                         KCoDDefaultMinorDeviceClass );
+        // Ignore error, it is non-critical
+    (void) RProperty::Set( KPropertyUidBluetoothControlCategory, 
+                            KPropertyKeyBluetoothSetDeviceClass, cod.DeviceClass() );
+    TRACE_FUNC_EXIT
+    }
--- a/bluetoothengine/bteng/src/btengsrvstate.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bteng/src/btengsrvstate.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -22,6 +22,7 @@
 #include "btengsrvstate.h"
 #include "btengserver.h"
 #include "btengsrvpluginmgr.h"
+#include "btengsrvsettingsmgr.h"
 #include "debug.h"
 
 
@@ -93,10 +94,10 @@
 // ?implementation_description
 // ---------------------------------------------------------------------------
 //
-void CBTEngSrvState::StartStateMachineL( TBool aState )
+void CBTEngSrvState::StartStateMachineL( TBTPowerState aState )
     {
     TRACE_FUNC_ENTRY
-    if( aState )
+    if( aState == EBTOn )
         {
         // Power on; starting state is initializing the stack
         iState = EInitBTStack;
@@ -107,8 +108,8 @@
         // Power off, starting state is to disconnect the plug-ins
         iState = EDisconnectPlugins;
         iOperation = EPowerOff;
-        iServer->UpdateCenRepPowerKeyL( EBTPowerOff );
-        iServer->SetUiIndicatorsL();
+        iServer->SettingsManager()->UpdateCenRepPowerKeyL( EBTOff );
+        iServer->SettingsManager()->SetUiIndicatorsL();
         }
     ChangeState();
     }
@@ -121,10 +122,7 @@
 void CBTEngSrvState::ChangeState()
     {
     TRACE_FUNC_ENTRY
-    if(!iAsyncCallback->IsActive())
-        {
-        iAsyncCallback->CallBack();
-        }
+    iAsyncCallback->CallBack();
     }
 
 // ---------------------------------------------------------------------------
@@ -153,7 +151,7 @@
         case EInitBTStack:
             {
             iState = ELoadDIService;
-            iServer->InitBTStackL();
+            iServer->SettingsManager()->InitBTStackL();
             }
             break;
         case ELoadDIService:
@@ -166,13 +164,13 @@
             {
             iState = ELoadNextPlugin;
             TEComResolverParams params;
-            iServer->iPluginMgr->LoadProfilePluginsL( params );
+            iServer->PluginManager()->LoadProfilePluginsL( params );
             }
             break;
         case ELoadNextPlugin:
             {
                 // Only change the state when all plug-ins are loaded
-            if( iServer->iPluginMgr->LoadPluginL() <= 0 )
+            if( iServer->PluginManager()->LoadPluginL() <= 0 )
                 {
                 iState = EIdle;
                 }
@@ -181,7 +179,7 @@
         case EStopBTStack:
             {
             iState = EWaitingForPowerOff;
-            iServer->StopBTStackL();
+            iServer->SettingsManager()->StopBTStackL();
             }
             break;
         case EUnloadDIService:
@@ -193,7 +191,7 @@
         case EUnloadPlugins:
             {
             iState = EUnloadDIService;
-            iServer->iPluginMgr->UnloadProfilePlugins();
+            iServer->PluginManager()->UnloadProfilePlugins();
             }
             break;
         case EDisconnectPlugins:
@@ -214,8 +212,8 @@
             {
             if( iOperation == EPowerOn )
                 {
-                iServer->UpdateCenRepPowerKeyL( EBTPowerOn );
-                iServer->SetUiIndicatorsL();
+                iServer->SettingsManager()->UpdateCenRepPowerKeyL( EBTOn );
+                iServer->SettingsManager()->SetUiIndicatorsL();
                 }
             iOperation = ESrvOpIdle;
             iServer->CheckIdle();
--- a/bluetoothengine/bthid/bthidclient/eabi/bthidclientu.def	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidclient/eabi/bthidclientu.def	Fri Apr 16 15:08:36 2010 +0300
@@ -8,4 +8,5 @@
 	_ZN12RBTHidClient7ConnectEv @ 7 NONAME
 	_ZNK12RBTHidClient19CancelConnectDeviceEv @ 8 NONAME
 	_ZNK12RBTHidClient24CancelNotifyStatusChangeEv @ 9 NONAME
+	_ZNK12RBTHidClient7VersionEv @ 10 NONAME
 
--- a/bluetoothengine/bthid/bthidclient/inc/bthidclient.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidclient/inc/bthidclient.h	Fri Apr 16 15:08:36 2010 +0300
@@ -31,6 +31,7 @@
 enum TBTHidConnState
     {
     EBTDeviceConnected, /*!< Device connected */
+    EBTDeviceConnectedFromRemote, /*!< Device connected from remote HID device */
     EBTDeviceLinkLost, /*!< Device link lost */
     EBTDeviceLinkRestored, /*!< Device link restored */
     EBTDeviceDisconnected, /*!< Device disconnected */
--- a/bluetoothengine/bthid/bthidclient/src/bthidclient.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidclient/src/bthidclient.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -57,7 +57,7 @@
 // Defines server version number
 // ---------------------------------------------------------
 //
-TVersion RBTHidClient::Version() const
+EXPORT_C TVersion RBTHidClient::Version() const
     {
     return (TVersion(KBTHIDServMajorVersionNumber,
             KBTHIDServMinorVersionNumber, KBTHIDServBuildVersionNumber));
--- a/bluetoothengine/bthid/bthidengplugin/src/bthidengplugin.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidengplugin/src/bthidengplugin.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -137,7 +137,8 @@
         THIDStateUpdate& HIDStateUpdate = iHIDStateUpdatePckg();
 
         if (HIDStateUpdate.iState == EBTDeviceConnected
-                || HIDStateUpdate.iState == EBTDeviceLinkRestored)
+                || HIDStateUpdate.iState == EBTDeviceLinkRestored
+                || HIDStateUpdate.iState == EBTDeviceConnectedFromRemote)
             {
             retStatus = ETrue;
             ReportProfileConnectionEvents(HIDStateUpdate.iDeviceAddress,
--- a/bluetoothengine/bthid/bthidserver/inc/btconnectionobserver.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidserver/inc/btconnectionobserver.h	Fri Apr 16 15:08:36 2010 +0300
@@ -56,6 +56,19 @@
      @param aStatus KErrNone, or system error code.
      */
     virtual void FirstTimeConnectionComplete(TInt aConnID, TInt aStatus) = 0;
+    
+    /*!
+     Report a change in the connection status
+     @param aConnID connection id
+     @param aStatus KErrNone, or system error code.
+     */
+    virtual void FirstTimeConnectionCompleteFromRemote(TInt aConnID, TInt aStatus) = 0;
+    
+    /*!
+     Start SDP on remote HID device
+     @param aConnID connection id
+     */
+    virtual void StartSDPSearch(TInt aConnID) = 0;
 
     /*!
      Reports that a connection has entered the link loss state
--- a/bluetoothengine/bthid/bthidserver/inc/bthidconnection.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidserver/inc/bthidconnection.h	Fri Apr 16 15:08:36 2010 +0300
@@ -57,7 +57,8 @@
     EHostReconnecting, /*!< Host is reconnecting to the device */
     EHIDReconnecting, /*!< The device is reconnection to the host */
     EDisconnecting, /*!< The connection is being closed */
-    EConnecting
+    EConnecting,      /*!< The connection is being set up from phone side */
+    EHIDInitConnecting /*!< The connection is being set up from remote HID */
     };
 
 /*!
--- a/bluetoothengine/bthid/bthidserver/inc/bthidserver.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidserver/inc/bthidserver.h	Fri Apr 16 15:08:36 2010 +0300
@@ -37,12 +37,15 @@
 #include "genericserver.h"
 #include "hidlayoutids.h"
 #include "genericactive.h"
+#include "hidsdpobserver.h"
+#include "bthidconnection.h"
 
 class CBTConnection;
 class CSocketListener;
 class CBTHidConnection;
 class CBTHidDevice;
 class CGenericHid;
+class CHidSdpClient;
 class CBTHidNotifierHelper;
 
 /**
@@ -53,7 +56,8 @@
 class CBTHidServer : public CGenericServer,
         public MBTConnectionObserver,
         public MListenerObserver,
-        public MTransportLayer
+        public MTransportLayer,
+        public MHidSdpObserver
     {
 public:
 
@@ -117,7 +121,7 @@
      Asks the server to create a new connection object.
      @result ID for the connection
      */
-    TInt NewConnectionL();
+    TInt NewConnectionL(TBTConnectionState aConnectionState);
 
     /*!
      Asks the server to do a first-time connection to a device.
@@ -151,7 +155,15 @@
      @result TBTEngConnectionStatus
      */
     TBTEngConnectionStatus ConnectStatus(const TBTDevAddr& aAddress);
-
+    
+    /*!
+     Finds out the connection status for a given Bluetooth address connected with HID profile
+     @param aBDAddr reference to TBTAddr that is checked from Bluetooth registry
+     @result ETrue  device is found from Container
+             EFalse  device is not found from Container
+         */    
+    TBool DeviceExistInContainer(const TBTDevAddr& aAddress);
+    
     /*!
      Panic the server.
      @param aPanic panic code
@@ -177,6 +189,8 @@
     void HandleInterruptData(TInt aConnID, const TDesC8& aBuffer);
 
     void FirstTimeConnectionComplete(TInt aConnID, TInt aStatus);
+    
+    void FirstTimeConnectionCompleteFromRemote(TInt aConnID, TInt aStatus);
 
     void LinkLost(TInt aConnID);
 
@@ -185,10 +199,17 @@
     void Disconnected(TInt aConnID);
 
     void Unplugged(TInt aConnID);
+    
+    void StartSDPSearch(TInt aConnID);
 
 public:
     //from MListenerObserver
     void SocketAccepted(TUint aPort, TInt aErrorCode);
+    
+public:
+    // from MHidSdpObserver
+
+    void HidSdpSearchComplete(TInt aResult);
 
 public:
     //from MTransportLayer
@@ -363,7 +384,12 @@
     RNotifier iNotifier;
 
     RPointerArray<CBTHidNotifierHelper> iReqs;
-
+    
+    /*! The ID given to this connection */
+    TInt iConnID;
+    
+    /*! A hid sdp client */
+    CHidSdpClient* iHidSdpClient;
     };
 
 
--- a/bluetoothengine/bthid/bthidserver/src/bthidconnection.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidserver/src/bthidconnection.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -103,7 +103,9 @@
     {
     // We shouldn't be trying to set the id for this connection
     // after it is connected.
-    __ASSERT_DEBUG(iConnectionState == ENotConnected || iConnectionState == EConnecting,
+    __ASSERT_DEBUG(iConnectionState == ENotConnected || 
+	               iConnectionState == EConnecting   || 
+				   iConnectionState == EHIDInitConnecting ,
             User::Panic(KPanicBTConnection, ESocketsBadState));
 
     iConnID = aConnID;
@@ -214,7 +216,7 @@
     (_L("[BTHID]\tCBTHidConnection::OfferControlSocket"));
     if (aAddress == iDevice->iAddress)
         {
-        __ASSERT_DEBUG((iConnectionState == ELinkLost) ||
+        __ASSERT_DEBUG((iConnectionState == ELinkLost) || (iConnectionState == EHIDInitConnecting) ||
                 (iConnectionState == EHIDReconnecting),
                 User::Panic(KPanicBTConnection, ESocketsBadState));
 
@@ -223,8 +225,11 @@
         iControlSocket = aSocket;
         aSocket = 0;
 
-        // Mark that the HID Device is reconnecting to us.
-        ChangeState(EHIDReconnecting);
+        // Mark that the HID Device is reconnecting to us. Skip the state change if an initial connection from HID device. 
+        if (iConnectionState != EHIDInitConnecting) 
+            {
+            ChangeState(EHIDReconnecting);
+            }
         }
     }
 
@@ -236,7 +241,7 @@
 
     if (aAddress == iDevice->iAddress)
         {
-        __ASSERT_DEBUG((iConnectionState == EHIDReconnecting), //||(iConnectionState == ELinkLost) ,
+        __ASSERT_DEBUG((iConnectionState == EHIDReconnecting) ||(iConnectionState == EHIDInitConnecting) ,
                 User::Panic(KPanicBTConnection, ESocketsBadState));
 
         // Take ownership of this socket
@@ -248,18 +253,35 @@
         if (KErrNone == error)
             {
             // Mark that we are now reconnected.
-
+            TBTConnectionState prevState = iConnectionState; 
             ChangeState(EConnected);
 
-            // Inform the observer that the connection has been restored.
-            iObserver.LinkRestored(iConnID);
-
+            if (prevState == EHIDInitConnecting)
+                {
+                // If this was an remote HID initial connection, start the SDP Search. 
+                iObserver.StartSDPSearch(iConnID);
+                }
+            else
+                {
+                // Inform the observer that the connection has been restored.
+                iObserver.LinkRestored(iConnID);
+                }
             }
         else
             {
             // Close the sockets as they can't be used
             CloseChannels();
-            ChangeState(ELinkLost);
+           
+            if (iConnectionState == EHIDInitConnecting)
+                {
+                 ChangeState(ENotConnected);
+                // If this was an remote HID initial connection inform the observer
+                iObserver.FirstTimeConnectionCompleteFromRemote(iConnID, error);
+                }
+            else
+                {
+                ChangeState(ELinkLost);
+                }
             }
         }
     }
--- a/bluetoothengine/bthid/bthidserver/src/bthidserver.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidserver/src/bthidserver.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -38,6 +38,7 @@
 #include "hidgeneric.h"
 #include "hidlayoutids.h"
 #include "bthidPsKey.h"
+#include "hidsdpclient.h"
 
 
 #ifndef DBG
@@ -98,6 +99,8 @@
     
     delete iGenHID;
     
+    delete iHidSdpClient;
+    
     RProperty::Delete( KPSUidBthidSrv, KBTMouseCursorState );
     }
 
@@ -241,8 +244,11 @@
         const CBTHidDevice& aDeviceDetails, TBTHidConnState aState)
     {
         TRACE_INFO( (_L("[BTHID]\tCBTHidServer::InformClientsOfStatusChange, state=%d"),aState) );
-    if (aState == EBTDeviceConnected || aState == EBTDeviceLinkRestored
-            || aState == EBTDeviceLinkLost || aState == EBTDeviceDisconnected)
+        if (aState == EBTDeviceConnected || 
+	     aState == EBTDeviceLinkRestored || 
+		 aState == EBTDeviceLinkLost     || 
+		 aState == EBTDeviceDisconnected || 
+		 aState == EBTDeviceConnectedFromRemote)
         {
         iLastUsedAddr = aDeviceDetails.iAddress;
         iActiveState = ETrue;
@@ -286,6 +292,7 @@
     switch (aState)
         {
         case EBTDeviceLinkRestored:
+        case EBTDeviceConnectedFromRemote:
             {
             HandleAsyncRequest(aDeviceAddr, EBTConnected);
             break;
@@ -484,10 +491,11 @@
                 foundItem = ETrue;
                 TBTConnectionState HidConnectionStatus =
                         connection->ConnectStatus();
-                if (EFirstConnection == HidConnectionStatus || EConnecting
-                        == HidConnectionStatus || EHIDReconnecting
-                        == HidConnectionStatus || EHostReconnecting
-                        == HidConnectionStatus)
+                if ( (EFirstConnection   == HidConnectionStatus) || 
+				     (EConnecting        == HidConnectionStatus) || 
+                     (EHIDReconnecting   == HidConnectionStatus) || 
+                     (EHostReconnecting  == HidConnectionStatus) || 
+                     (EHIDInitConnecting == HidConnectionStatus) )
                     {
                     retVal = EBTEngConnecting;
                     }
@@ -504,6 +512,33 @@
     return retVal;
     }
 
+TBool CBTHidServer::DeviceExistInContainer(const TBTDevAddr& aAddress)
+    {
+    TInt i = 0;
+    TBool foundItem = EFalse;
+    TInt BTConnectionObjCount = iBTConnContainer->Count();
+
+    TRACE_INFO(_L("[BTHID]\tCBTHidServer::DeviceExistInContainer()"));
+    while ((i < BTConnectionObjCount) && (!foundItem))
+        {
+        CBTHidConnection *connection =
+                static_cast<CBTHidConnection*> ((*iBTConnContainer)[i]);
+
+        if (connection)
+            {
+            CBTHidDevice& devDetails = connection->DeviceDetails();
+
+            if (devDetails.iAddress == aAddress)
+                {
+                foundItem = ETrue;                
+                }
+            }
+        i++;
+        }
+
+    return foundItem;
+    }
+
 TBool CBTHidServer::GetConnectionAddress(TDes8& aAddressBuf)
     {
     TInt i = 0;
@@ -549,8 +584,9 @@
             CBTHidDevice& devDetails = connection->DeviceDetails();
             TBTConnectionState HidConnectionStatus =
                     connection->ConnectStatus();
-            if (connection->IsConnected() || HidConnectionStatus
-                    == EHIDReconnecting)
+            if (connection->IsConnected() || 
+			      HidConnectionStatus == EHIDReconnecting || 
+				  HidConnectionStatus == EHIDInitConnecting)
                 {
                 if ((IsKeyboard(aDeviceSubClass) && IsKeyboard(
                         devDetails.iDeviceSubClass)) || (IsPointer(
@@ -597,7 +633,7 @@
     TInt BTConnectionObjCount = iBTConnContainer->Count();
 
     TUint deviceSubClass = GetDeviceSubClass(aDevAddr);
-        TRACE_INFO(_L("[BTHID]\tCBTHidServer::IsAllowToConnectFromClientSide()"));
+    TRACE_INFO( (_L("[BTHID]\tCBTHidServer::IsAllowToConnectFromClientSide() BTConnectionObjCount = %d"), BTConnectionObjCount) );
     while ((i < BTConnectionObjCount) && retVal)
         {
         CBTHidConnection *connection =
@@ -608,16 +644,18 @@
             CBTHidDevice& devDetails = connection->DeviceDetails();
             TBTConnectionState HidConnectionStatus =
                     connection->ConnectStatus();
-            if (connection->IsConnected() || HidConnectionStatus
-                    == EConnecting)
+            if (connection->IsConnected() || 
+			       HidConnectionStatus == EConnecting || 
+				   HidConnectionStatus == EHIDInitConnecting)
                 {
                 if (devDetails.iAddress != aDevAddr)
-                    {
+                    {                    
                     if ((IsKeyboard(deviceSubClass) && IsKeyboard(
                             devDetails.iDeviceSubClass)) || (IsPointer(
                             deviceSubClass) && IsPointer(
                             devDetails.iDeviceSubClass)))
                         {
+                        TRACE_INFO(_L("[BTHID]\tCBTHidServer::() NO connection allowed, connection exist already!"));
                         retVal = EFalse;
                         iConflictAddr = devDetails.iAddress;
                         }
@@ -699,11 +737,14 @@
     return;
     } 
 
-TInt CBTHidServer::NewConnectionL()
+TInt CBTHidServer::NewConnectionL(TBTConnectionState aConnectionStatus)
     {
         TRACE_INFO(_L("[BTHID]\tCBTHidServer::NewConnectionL"));
+     __ASSERT_DEBUG( aConnectionStatus == EConnecting || aConnectionStatus == EHIDInitConnecting ,
+                               CBTHidServer::PanicServer(EBadState));
+     
     CBTHidConnection *connection = CBTHidConnection::NewLC(iSocketServ,
-            *this, EConnecting);
+            *this, aConnectionStatus);
     // Add to the connection container object.
     iBTConnContainer->AddL(connection);
     CleanupStack::Pop(); // connection
@@ -1012,6 +1053,132 @@
         }
     }
 
+void CBTHidServer::FirstTimeConnectionCompleteFromRemote(TInt aConnID, TInt aStatus)
+    {
+        TRACE_INFO( (_L("[BTHID]\tCBTHidServer::FirstTimeConnectionCompleteFromRemote(%d)"), aStatus));
+    TInt error = aStatus;
+
+    CBTHidConnection* connection =
+            static_cast<CBTHidConnection*> (iBTConnIndex->At(aConnID));
+    __ASSERT_ALWAYS(connection, PanicServer(EInvalidHandle));
+
+    if (error == KErrNone)
+        {
+        TBool genHidConnected = EFalse;
+
+            TRAP( error,
+                    // Inform the Generic HID of the Connection
+                    GenericHIDConnectL(connection, ETrue);
+
+                    // Record that we got as far as informing the Generic HID.
+                    genHidConnected = ETrue;
+
+                    // Try to start monitoring the channels.
+                    connection->StartMonitoringChannelsL();
+            )
+
+        if (error != KErrNone)
+            {
+            // If we informed the Generic HID of the connection, then
+            // we must also disconnect.
+            if (genHidConnected)
+                {
+                iGenHID->Disconnected(aConnID);
+                }
+
+            // Delete the connection object.
+            //Quietly refuse the remote initialized connection in case of error. 
+            //No need to bother user.
+            iBTConnIndex->Remove(aConnID);
+            }
+        else
+            {
+            // Update the stored devices, as we could have power off
+            // and no clean shutdown.
+            // Use the non-leaving version.
+            CleanOldConnection(aConnID);
+            StoreVirtuallyCabledDevices(KFileStore);
+            InformClientsOfStatusChange(connection->DeviceDetails(),
+                    EBTDeviceConnectedFromRemote);
+            }
+        }
+    else
+        {
+        //Quietly refuse the remote initialized connection in case of error.
+        //No need to bother user.
+        iBTConnIndex->Remove(aConnID);
+        }
+    }
+
+void CBTHidServer::StartSDPSearch(TInt aConnID)
+    {
+    iConnID = aConnID;
+    TRACE_INFO( (_L("[BTHID]\tCBTHidServer::StartSDPSearch aConnID= (%d)"), aConnID));
+    CBTHidConnection* connection =
+            static_cast<CBTHidConnection*> (iBTConnIndex->At(iConnID));
+    __ASSERT_ALWAYS(connection, PanicServer(EInvalidHandle));
+    
+    TRAPD( res,
+                // Retrieve the hid device object for this new connection
+                CBTHidDevice &devDetails =
+                ConnectionDetailsL(iConnID);
+
+                // Create a new HID Sdp Client
+                // Its only used here so it doesn't matter if we leave.
+                delete iHidSdpClient;
+                iHidSdpClient = 0;
+                //Create a new hid sdp client using the hid device object.
+                iHidSdpClient = CHidSdpClient::NewL(devDetails, *this);
+
+                // Start the hid sdp client
+                iHidSdpClient->StartL();
+        )
+    
+    if (res != KErrNone)
+        {
+        // Get the server to delete the new connection object
+        DeleteNewConnection(iConnID);
+        }
+    }
+
+void CBTHidServer::HidSdpSearchComplete(TInt aResult)
+    {
+    TRACE_FUNC(_L("[BTHID]\tCBTHidServer::HidSdpSearchComplete"));
+    // This is a callback from the Hid SDP client so we can't delete it here
+    // Get it to destroy itself when its convenient.
+    iHidSdpClient->Kill();
+    // Deleted outside destructor.
+    iHidSdpClient = 0;
+
+    // If the SDP search was a success
+    if (aResult == KErrNone)
+        {       
+        // Try to connect to the device as a HID
+        CBTHidConnection* connection =
+                static_cast<CBTHidConnection*> (iBTConnIndex->At(iConnID));
+        __ASSERT_ALWAYS(connection, PanicServer(EInvalidHandle));
+        if (connection)
+            {
+            CBTHidDevice& devDetails = connection->DeviceDetails();
+            
+            //Only after SDP search complete, do we know the CoD which is needed
+            //to tell if the incoming connection is allowed or not.
+            //ETrue , establish the connection.
+            //EFalse, refuse the remote connecion sliently
+            if (IsAllowToConnectFromClientSide(devDetails.iAddress))
+                {
+                FirstTimeConnectionCompleteFromRemote(iConnID, aResult);
+                }
+            else
+                {
+                FirstTimeConnectionCompleteFromRemote(iConnID, KErrAlreadyExists);
+                }
+            }
+        
+        }
+    }
+
+
 void CBTHidServer::LinkLost(TInt aConnID)
     {
         TRACE_INFO( (_L("[BTHID]\tCBTHidServer::LinkLost(%d)"), aConnID));
@@ -1126,9 +1293,10 @@
     else
         {
         TInt i = 0;
-        TInt count = iBTConnContainer->Count();
+        
         TInt err = KErrNone;
 
+        TInt connectingID = 0;
         // Check which port has accepted a connection
         switch (aPort)
             {
@@ -1137,8 +1305,32 @@
                 // Get the BT address of the device that has connected
                 iTempControl->RemoteName(sockAddr);
                 devAddr = sockAddr.BTAddr();
+                // incoming HID connection is allowed
+                if (!DeviceExistInContainer(devAddr))
+                    {                    
+                    TRAPD( res,                            
+                           // to be created as New if device not yet listed in container
+                           connectingID = NewConnectionL(EHIDInitConnecting);
+                    
+                           // Retrieve the hid device object for this new connection
+                           CBTHidDevice &devDetails =
+                           ConnectionDetailsL(connectingID);
+
+                           // Fill in the information we got from the client
+                           devDetails.iAddress = devAddr;
+                           devDetails.iUseSecurity = ETrue;
+                           )
+
+                     if (res != KErrNone && connectingID != 0)
+                         {
+                         // Get the server to delete the new connection object
+                         DeleteNewConnection(connectingID);
+                         }
+                     }
+
                 if (IsAllowToConnectFromClientSide(devAddr))
                     {
+                    TInt count = iBTConnContainer->Count();
                     while ((i < count) && (iTempControl))
                         {
                         CBTHidConnection
@@ -1184,7 +1376,7 @@
                         TRACE_INFO(_L("[BTHID]\tCBTHidServer::SocketAccepted, control channel failed, shutdown listener"));
                     ShutdownListeners(err);
                     }
-
+                
                 break;
 
                 // The HID Interrupt Channel
@@ -1194,6 +1386,7 @@
                 devAddr = sockAddr.BTAddr();
                 if (IsAllowToConnectFromClientSide(devAddr))
                     {
+                    TInt count = iBTConnContainer->Count();
                     while ((i < count) && (iTempInterrupt))
                         {
                         CBTHidConnection
--- a/bluetoothengine/bthid/bthidserver/src/bthidsession.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/bthidserver/src/bthidsession.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -19,6 +19,7 @@
 #include <e32svr.h>
 #include <bttypes.h>
 #include "bthidsession.h"
+#include "bthidconnection.h"
 #include "bthidserver.h"
 #include "bthidclientsrv.h"
 #include "hidsdpclient.h"
@@ -193,10 +194,10 @@
         TPckg<TBTDevAddr> addrPack(addr);
 
         iConnectionMessage.ReadL(0, addrPack);
+        
         // Ask the server to create a new connection object
-
-
-        iConnectingID = iServer.NewConnectionL();
+        iConnectingID = iServer.NewConnectionL(EConnecting);
+        
         TRAPD( res,
                 // Retrieve the hid device object for this new connection
                 CBTHidDevice &devDetails =
--- a/bluetoothengine/bthid/mouse/PaintCursor/data/paintcursor_reg.rss	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/data/paintcursor_reg.rss	Fri Apr 16 15:08:36 2010 +0300
@@ -25,9 +25,8 @@
 RESOURCE APP_REGISTRATION_INFO
     {
     app_file = "paintcursor";
-	localisable_resource_file = APP_RESOURCE_DIR"\\paintcursor";
-	localisable_resource_id = R_PAINTCURSOR_LOCALISABLE_APP_INFO;
-//	hidden = KAppIsHidden;
+    hidden = KAppIsHidden;
+    launch = KAppLaunchInForeground;
     }
 
 // End of File
--- a/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappui.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappui.h	Fri Apr 16 15:08:36 2010 +0300
@@ -77,6 +77,8 @@
     void SendToBackground();
 
     void EndTask();
+    
+    void HandleForegroundEventL(TBool aForeground);
 
 private:
     CPaintCursorAppView* iAppView;
--- a/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappview.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappview.h	Fri Apr 16 15:08:36 2010 +0300
@@ -33,7 +33,8 @@
 /*!
  An instance of the CPaintCursorAppView View object for PaintCursor application
  */
-class CPaintCursorAppView : public CCoeControl
+class CPaintCursorAppView : public CCoeControl,  public MCoeControlObserver
+
     {
 public:
 
@@ -55,17 +56,28 @@
      Destroy the object and release all memory objects
      */
     ~CPaintCursorAppView();
+    
+    void HideCursor();
 
+    void ShowCursor();
+	
 public:
     // from CCoeControl
 
     void SizeChanged();
 
     void Draw(const TRect& aRect) const;
+	
+public:
+    /**
+    * From MCoeControlObserver, HandleControlEventL.
+    */
+    // event handling section
+    // e.g Listbox events
+    void HandleControlEventL( CCoeControl* aControl, TCoeEvent aEventType );
 
-    void HideCursor();
+    void HandleResourceChange( TInt aType );
 
-    void ShowCursor();
 private:
 
     /*!
--- a/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursordocument.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursordocument.h	Fri Apr 16 15:08:36 2010 +0300
@@ -20,6 +20,7 @@
 #define PaintCursorDOCUMENT_H
 
 #include <AknDoc.h>
+#include <apgwgnam.h>
 
 class CEikAppUi;
 
@@ -54,6 +55,8 @@
      * From CEikDocument, create CPaintCursorAppUi "App UI" object.
      */
     CEikAppUi* CreateAppUiL();
+    
+    void UpdateTaskNameL(CApaWindowGroupName* aWgName);
     };
 
 #endif
--- a/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappui.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappui.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -20,6 +20,7 @@
 #include <eikmenup.h>
 #include <e32property.h>
 #include <paintcursor.rsg>
+#include <apgwgnam.h>
 
 #include "paintcursorapp.h"
 #include "paintcursorappui.h"
@@ -131,6 +132,7 @@
         case ECursorHide:
             {
             iAppView->HideCursor();
+            EndTask();
             break;
             }
         case ECursorNotInitialized:
@@ -159,3 +161,26 @@
     task.EndTask();
     }
 
+void CPaintCursorAppUi::HandleForegroundEventL(TBool aForeground)
+    {
+    if(aForeground)
+        {
+        TInt wgId = iEikonEnv->RootWin().Identifier();
+
+        TApaTask self( iCoeEnv->WsSession() );
+
+        self.SetWgId( wgId );
+        self.SendToBackground();
+
+        RWsSession session = iEikonEnv->WsSession();
+
+        CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC(session, wgId);
+
+        wgName->SetHidden(ETrue);
+
+        wgName->SetWindowGroupName(iEikonEnv->RootWin());
+
+        CleanupStack::PopAndDestroy(); // wgName
+        }
+    }
+
--- a/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappview.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappview.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -15,7 +15,7 @@
 *
 */
 
-
+#include <coecntrl.h>
 #include "paintcursorappview.h"
 #include "pointmsgqueue.h"
 #include "debug.h"
@@ -155,3 +155,25 @@
     iMouseInitialized = ETrue;
     }
 
+void CPaintCursorAppView::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+        SetRect( mainPaneRect );
+        DrawNow();
+        if (iMouseInitialized)
+            {
+            iClientCommander.ImageCommand( KRedrawBTCursorAnim );
+            }
+        }
+    }
+
+void CPaintCursorAppView::HandleControlEventL(
+    CCoeControl* /*aControl*/, TCoeEvent /*aEventType*/ )
+    {
+    }
+
+
--- a/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursordocument.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursordocument.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -15,7 +15,7 @@
 *
 */
 
-
+#include <apgwgnam.h>
 #include "paintcursordocument.h"
 #include "paintcursorappui.h"
 
@@ -45,3 +45,9 @@
     return new (ELeave) CPaintCursorAppUi;
     }
 
+void CPaintCursorDocument::UpdateTaskNameL(CApaWindowGroupName* aWgName) 
+    { 
+    aWgName->SetHidden(ETrue); 
+    } 
+
+
Binary file bluetoothengine/bthid/mouse/Sesame_client/data/Thumbs.db has changed
Binary file bluetoothengine/bthid/mouse/Sesame_client/data/cursormask.bmp has changed
--- a/bluetoothengine/bthid/mouse/Sesame_client/inc/pointmsgqueue.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/Sesame_client/inc/pointmsgqueue.h	Fri Apr 16 15:08:36 2010 +0300
@@ -39,7 +39,8 @@
     KStartBTCursorAnim = 1,
     KStopBTCursorAnim = 2,
     KChangeCursor = 3,
-    KSendRawEvent = 4
+    KSendRawEvent = 4,
+    KRedrawBTCursorAnim = 5
     };
 
 class TPointBuffer
--- a/bluetoothengine/bthid/mouse/Sesame_client/src/clientimagecommander.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/Sesame_client/src/clientimagecommander.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -175,6 +175,11 @@
     {
     // Could optionally decode the commands here
     DBG(RDebug::Print(_L("RImageCommander::ImageCommand %d"), aCommand));
+    if ( aCommand == KRedrawBTCursorAnim ) 
+        {
+        //reset the current location to avoid sudden jumping 
+        iCurrentPoint.SetXY(0,0);
+        }
 
     RAnim::Command( aCommand );
     
@@ -230,7 +235,6 @@
     return KErrNone;
     }
 
-
 TBool RImageCommander::RestrictPos()
     {
     TBool notInScreen(EFalse);
@@ -242,6 +246,12 @@
         TInt mode(screen->CurrentScreenMode());
         screen->GetScreenModeSizeAndRotation(mode, sizeAndRotation);
         }
+    
+    DBG(
+        RDebug::Print(_L("RImageCommander::RestrictPos sizeAndRotation.iPixelSize (%d,%d)"), sizeAndRotation.iPixelSize.iWidth, sizeAndRotation.iPixelSize.iHeight);
+        RDebug::Print(_L("RImageCommander::RestrictPos sizeAndRotation.iRotation (%d)"), sizeAndRotation.iRotation);
+        )
+
     TRect validRect(sizeAndRotation.iPixelSize);
     if (! validRect.Contains(iCurrentPoint))
         {
@@ -268,7 +278,11 @@
     DBG(
     if (outSide)
         {
-       RDebug::Print(_L("RImageCommander::CheckCurrentPoint not in screen (%d,%d)"), pos.iX, pos.iY);
+       RDebug::Print(_L("RImageCommander::CheckCurrentPoint NOT in screen (%d,%d)"), pos.iX, pos.iY);
+        }
+    else
+        {
+       RDebug::Print(_L("RImageCommander::CheckCurrentPoint DOES in screen (%d,%d)"), pos.iX, pos.iY);
         }
     )
     return outSide;
--- a/bluetoothengine/bthid/mouse/Sesame_server/bwins/btcursor_serveru.def	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-EXPORTS
-	?CreateCAnimDllL@@YAPAVCAnimDll@@XZ @ 1 NONAME ; class CAnimDll * CreateCAnimDllL(void)
-	?CreateInstanceL@CMouseCursorSrv@@UAEPAVCAnim@@H@Z @ 2 NONAME ; class CAnim * CMouseCursorSrv::CreateInstanceL(int)
-
--- a/bluetoothengine/bthid/mouse/Sesame_server/eabi/btcursor_serveru.def	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-EXPORTS
-	_Z15CreateCAnimDllLv @ 1 NONAME
-	_ZTI15CMouseCursorSrv @ 2 NONAME ; #<TI>#
-	_ZTI6CImage @ 3 NONAME ; #<TI>#
-	_ZTV15CMouseCursorSrv @ 4 NONAME ; #<VT>#
-	_ZTV6CImage @ 5 NONAME ; #<VT>#
-
--- a/bluetoothengine/bthid/mouse/Sesame_server/group/animation_server.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/Sesame_server/group/animation_server.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -21,13 +21,11 @@
 TARGETTYPE      ani
 
 // The second one is the UID of the server, different than main program's UID
-UID 0x10003b22 0x2001FE5A
+UID      0x10003B22 0x2001FE5A
 
 CAPABILITY      CAP_CLIENT_DLL
 VENDORID        VID_DEFAULT
 
-DEFFILE btcursor_server.def
-
 SECUREID	    0xA000022E
 EPOCSTACKSIZE	0x5000
 
--- a/bluetoothengine/bthid/mouse/Sesame_server/inc/mousecursorsrv.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/Sesame_server/inc/mousecursorsrv.h	Fri Apr 16 15:08:36 2010 +0300
@@ -49,9 +49,15 @@
      * Create an instance of the Animation Server image aType.
      * @param aType KAnimationSquare implies "construct a bouncing square"
      */
-    IMPORT_C CAnim* CreateInstanceL(TInt aType);
+    CAnim* CreateInstanceL(TInt aType);
 
     };
 
+/**
+ * Entry point function to Create the animation plugin
+ * Returns the object of the CMouseCursorSrv class
+ */
+IMPORT_C CAnimDll* CreateCAnimDllL();
+
 #endif // __MOUSECURSORSRV_H__
 // End of File
--- a/bluetoothengine/bthid/mouse/Sesame_server/src/mousecursorimage.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/bthid/mouse/Sesame_server/src/mousecursorimage.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -189,6 +189,18 @@
             iSpriteFunctions->Activate(EFalse);
             }
         break;
+        
+        case KRedrawBTCursorAnim:
+            {
+            iSpriteFunctions->Activate(EFalse);
+            iSpriteGc->Reset();
+            iSpriteFunctions->SetPosition(TPoint());
+            iSpriteFunctions->SizeChangedL();
+            iSpriteFunctions->Activate(ETrue);
+            DrawCursor();
+            }
+        break;
+        
         case KChangeCursor:
             {
             TPoint pos = *(TPoint *)aArgs;
--- a/bluetoothengine/btmac/BWINS/BTMonoCmdHandlerU.DEF	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/BWINS/BTMonoCmdHandlerU.DEF	Fri Apr 16 15:08:36 2010 +0300
@@ -1,10 +1,10 @@
 EXPORTS
-	??1CBtmcHandlerApi@@UAE@XZ @ 1 NONAME ; CBtmcHandlerApi::~CBtmcHandlerApi(void)
+	?NewL@CBtmcHandlerApi@@SAPAV1@AAVMBtmcObserver@@W4TBtmcProfileId@@ABVTDesC8@@H@Z @ 1 NONAME ; class CBtmcHandlerApi * CBtmcHandlerApi::NewL(class MBtmcObserver &, enum TBtmcProfileId, class TDesC8 const &, int)
 	?HandleNrecCompletedL@CBtmcHandlerApi@@QAEXH@Z @ 2 NONAME ; void CBtmcHandlerApi::HandleNrecCompletedL(int)
-	?HandleProtocolDataL@CBtmcHandlerApi@@QAEXABVTDesC8@@@Z @ 3 NONAME ; void CBtmcHandlerApi::HandleProtocolDataL(class TDesC8 const &)
-	?NewL@CBtmcHandlerApi@@SAPAV1@AAVMBtmcObserver@@W4TBtmcProfileId@@ABVTDesC8@@H@Z @ 4 NONAME ; class CBtmcHandlerApi * CBtmcHandlerApi::NewL(class MBtmcObserver &, enum TBtmcProfileId, class TDesC8 const &, int)
-	?ActivateRemoteVolumeControl@CBtmcHandlerApi@@QAEXXZ @ 5 NONAME ; void CBtmcHandlerApi::ActivateRemoteVolumeControl(void)
-	?DeActivateRemoteVolumeControl@CBtmcHandlerApi@@QAEXXZ @ 6 NONAME ; void CBtmcHandlerApi::DeActivateRemoteVolumeControl(void)
-	?GetRemoteSupportedFeature@CBtmcHandlerApi@@QAEHXZ @ 7 NONAME ; int CBtmcHandlerApi::GetRemoteSupportedFeature(void)
-	?SetHspRvcSupported@CBtmcHandlerApi@@QAEXH@Z @ 8 NONAME ; void CBtmcHandlerApi::SetHspRvcSupported(int)
+	?ActivateRemoteVolumeControl@CBtmcHandlerApi@@QAEXXZ @ 3 NONAME ; void CBtmcHandlerApi::ActivateRemoteVolumeControl(void)
+	?GetRemoteSupportedFeature@CBtmcHandlerApi@@QAEHXZ @ 4 NONAME ; int CBtmcHandlerApi::GetRemoteSupportedFeature(void)
+	?SetHspRvcSupported@CBtmcHandlerApi@@QAEXH@Z @ 5 NONAME ; void CBtmcHandlerApi::SetHspRvcSupported(int)
+	?HandleProtocolDataL@CBtmcHandlerApi@@QAEXABVTDesC8@@@Z @ 6 NONAME ; void CBtmcHandlerApi::HandleProtocolDataL(class TDesC8 const &)
+	?DeActivateRemoteVolumeControl@CBtmcHandlerApi@@QAEXXZ @ 7 NONAME ; void CBtmcHandlerApi::DeActivateRemoteVolumeControl(void)
+	??1CBtmcHandlerApi@@UAE@XZ @ 8 NONAME ; CBtmcHandlerApi::~CBtmcHandlerApi(void)
 
--- a/bluetoothengine/btmac/eabi/BTMonoCmdHandleru.DEF	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/eabi/BTMonoCmdHandleru.DEF	Fri Apr 16 15:08:36 2010 +0300
@@ -1,12 +1,12 @@
 EXPORTS
-	_ZN15CBtmcHandlerApi19HandleProtocolDataLERK6TDesC8 @ 1 NONAME
-	_ZN15CBtmcHandlerApi20HandleNrecCompletedLEi @ 2 NONAME
-	_ZN15CBtmcHandlerApi4NewLER13MBtmcObserver14TBtmcProfileIdRK6TDesC8i @ 3 NONAME
-	_ZN15CBtmcHandlerApiD0Ev @ 4 NONAME
-	_ZN15CBtmcHandlerApiD1Ev @ 5 NONAME
-	_ZN15CBtmcHandlerApiD2Ev @ 6 NONAME
-	_ZN15CBtmcHandlerApi27ActivateRemoteVolumeControlEv @ 7 NONAME
-	_ZN15CBtmcHandlerApi29DeActivateRemoteVolumeControlEv @ 8 NONAME
-	_ZN15CBtmcHandlerApi25GetRemoteSupportedFeatureEv @ 9 NONAME
-	_ZN15CBtmcHandlerApi18SetHspRvcSupportedEi @ 10 NONAME
+	_ZN15CBtmcHandlerApi18SetHspRvcSupportedEi @ 1 NONAME
+	_ZN15CBtmcHandlerApi19HandleProtocolDataLERK6TDesC8 @ 2 NONAME
+	_ZN15CBtmcHandlerApi20HandleNrecCompletedLEi @ 3 NONAME
+	_ZN15CBtmcHandlerApi25GetRemoteSupportedFeatureEv @ 4 NONAME
+	_ZN15CBtmcHandlerApi27ActivateRemoteVolumeControlEv @ 5 NONAME
+	_ZN15CBtmcHandlerApi29DeActivateRemoteVolumeControlEv @ 6 NONAME
+	_ZN15CBtmcHandlerApi4NewLER13MBtmcObserver14TBtmcProfileIdRK6TDesC8i @ 7 NONAME
+	_ZN15CBtmcHandlerApiD0Ev @ 8 NONAME
+	_ZN15CBtmcHandlerApiD1Ev @ 9 NONAME
+	_ZN15CBtmcHandlerApiD2Ev @ 10 NONAME
 
--- a/bluetoothengine/btmac/group/BTMonoCmdHandler.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/group/BTMonoCmdHandler.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -57,7 +57,9 @@
 USERINCLUDE   ../../inc 
 USERINCLUDE   ../../../inc
 
+#ifdef NO101APPDEPFIXES
 APP_LAYER_SYSTEMINCLUDE
+#endif  //NO101APPDEPFIXES
 MW_LAYER_SYSTEMINCLUDE
 
 LIBRARY euser.lib
--- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmc_defs.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmc_defs.h	Fri Apr 16 15:08:36 2010 +0300
@@ -35,6 +35,16 @@
     EBTMonoVoiceRecognitionDeactivatedByRemote,
     };
 
+#ifndef NO101APPDEPFIXES
+// Local definition of application-layer PubSub key 
+// (TSINDKeys::ERecognitionState, in KSINDUID = KUidSystemCategoryValue):
+const TInt KBTMonoVoiceRecognitionStateKey = 0;
+
+// Local definition of application-layer key value
+// (TRecognitionStateValues::ERecognitionStarted):
+const TInt KBTMonoVoiceRecognitionStarted = 0;
+#endif  //NO101APPDEPFIXES
+
 enum TBTMonoATPhoneIndicatorId
     {
     EBTMonoATNetworkIndicator = 1,
--- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcnumber.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcnumber.h	Fri Apr 16 15:08:36 2010 +0300
@@ -34,6 +34,18 @@
     {
     public:
     
+    	/** CBtmcNumber states.
+    	*/
+    	enum BtmcNumberState
+    		{
+    		/** Not valid */
+    		EStateNull = 0,
+    		/** Getting the MSISDN - getting store info*/
+    		EStateGettingMsisdnStoreInfo = 1,
+    		/** Getting the MSISDN - getting store entry*/
+    		EStateGettingMsisdnStoreEntry = 2,
+    		};
+    	
         /**
         * Two-phased constructor.
         */
@@ -76,6 +88,14 @@
             TInt aServiceId);
     
         void ConstructL();
+        /**
+        * Gets MSISDN store info to check how many numbers are stored on SIM
+        */
+        void GetMsisdnStoreInfo();
+        /**
+        * Gets single MSISDN store entry
+        */
+        void GetMsisdnStoreEntry();
 
     private:
         CBtmcProtocol& iProtocol;
@@ -84,7 +104,21 @@
         RMobileONStore iStore;
 		RMobileONStore::TMobileONEntryV1 iEntry;
 		RMobileONStore::TMobileONEntryV1Pckg iPckg;
+		RMobileONStore::TMobileONStoreInfoV1Pckg iOnStoreInfoPckg;
+		RMobileONStore::TMobileONStoreInfoV1 iOnStoreInfo;
+        /**
+        * Defines current CBtmcNumber state
+        */
+		BtmcNumberState iState;
+        /**
+        * Index which is used to get MSISDN entries
+        */
+		TInt iUsedEntriesCount;
+        /**
+        * Count of correct numbers returned by MSISDN
+        */
+		TInt iCorrectNumbersCount;
     };
 
 
-#endif
\ No newline at end of file
+#endif
--- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcoperator.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcoperator.h	Fri Apr 16 15:08:36 2010 +0300
@@ -86,7 +86,6 @@
         CBtmcProtocol& iProtocol;
         RTelServer iServer;
         RMobilePhone iPhone;
-		RMobileONStore iStore;
         RMmCustomAPI iCustomApi;
         RMmCustomAPI::TOperatorNameInfo iInfo;
     };
--- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcphonestatus.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcphonestatus.h	Fri Apr 16 15:08:36 2010 +0300
@@ -82,8 +82,6 @@
         
         TInt GetRssiStrength();
         
-        TInt GetVolumeStatus();
-        
         TInt GetBatteryCharge();
         
         void SetRecognitionInitiator(TBTMonoVoiceRecognitionInitiator aInitiator);
--- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcprotocol.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcprotocol.h	Fri Apr 16 15:08:36 2010 +0300
@@ -164,7 +164,6 @@
         TBool iHandleCmdPending;
         CDesC8ArrayFlat* iOutgoPacketQueue; // owned
         TInt iCredit; // How many commands are allowed to acc
-        TBool iVolumeSyncFromAccessory;
         TBool iAccessoryInitiated; // who initiated the connection
         RMobilePhone::TMobilePhoneIdentityV1 iIdentity; // holds IMEI etc
         RMobilePhone::TMobilePhoneSubscriberId iId; // holds id
--- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcvolume.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcvolume.h	Fri Apr 16 15:08:36 2010 +0300
@@ -88,6 +88,8 @@
 
         TInt GetNewPhoneVol();
 
+        TBool IsActiveRemoteVolumeControl();
+        
     private:
         enum TVolSyncAction
             {
@@ -109,8 +111,6 @@
 		TInt iMaxSpkrVol; // Maximum volume level of the phone
 		TInt iStep;
         TVolSyncAction iAction;
-    	
-    	TBool iVolCtrlActivated;
     };
 
 
--- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallstatus.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallstatus.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -620,6 +620,14 @@
 void CBtmcCallStatus::ReportCallEventL(TInt aPrevStatus, TInt aNewStatus, TBool /*aOutgoing*/)
     {
     TRACE_FUNC_ENTRY
+    if ( iProtocol.ProtocolStatus().iProfile == EBtmcHSP)
+        {
+        // HSP 1.2 requires either RING indicator or in-band ringing
+        // tone, but not both.
+        TRACE_INFO((_L(" HSP connection, no call indicator")))  
+        return;
+        }
+    
     // CCWA
     if (iProtocol.ProtocolStatus().iCallWaitingNotif == EBTMonoATCallWaitingNotifEnabled && 
         (!(aPrevStatus & KCallRingingBit) && (aNewStatus & KCallRingingBit)) &&
--- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcnumber.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcnumber.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -57,10 +57,33 @@
 void CBtmcNumber::GoActive()
     {
     TRACE_ASSERT(!IsActive(), KErrGeneral);
-    iEntry.iIndex = 1;
+    GetMsisdnStoreInfo();
+    TRACE_FUNC
+    }
+
+// -------------------------------------------------------------------------------
+// CBtmcNumber::GetMsisdnStoreInfo
+// -------------------------------------------------------------------------------
+void CBtmcNumber::GetMsisdnStoreInfo()
+    {
+    TRACE_FUNC_ENTRY
+    iState = EStateGettingMsisdnStoreInfo;
+    iStore.GetInfo(iStatus, iOnStoreInfoPckg);
+    SetActive();
+    TRACE_FUNC_EXIT
+    }
+
+// -------------------------------------------------------------------------------
+// CBtmcNumber::GetMsisdnStoreEntry
+// -------------------------------------------------------------------------------
+void CBtmcNumber::GetMsisdnStoreEntry()
+    {
+    TRACE_FUNC_ENTRY
+    iState = EStateGettingMsisdnStoreEntry;
+    iEntry.iIndex = iUsedEntriesCount++;
     iStore.Read(iStatus, iPckg);
     SetActive();
-    TRACE_FUNC
+    TRACE_FUNC_EXIT
     }
 
 // -------------------------------------------------------------------------------
@@ -70,56 +93,104 @@
     {
     TRACE_FUNC_ENTRY
     
-    RATResultPtrArray resarr;
-    ATObjArrayCleanupResetAndDestroyPushL(resarr);
-    CATResult* okerr = NULL;
-    if (iStatus == KErrNone)
+    switch (iState)
         {
-        TBuf8<RMobileONStore::KOwnNumberTextSize> nameBuf;
-        nameBuf.Copy(iEntry.iNumber.iTelNumber);
-        
-        TRACE_INFO((_L8("ao status %d, phonebook returned %S"), iStatus.Int(), &nameBuf))
-        RATParamArray params;
-        CleanupClosePushL(params);
-        LEAVE_IF_ERROR(params.Append(TATParam()))
-        LEAVE_IF_ERROR(params.Append(TATParam(nameBuf, EATDQStringParam)))  
-         
-        TBTMonoATPhoneNumberType numType;
-        if (nameBuf.Length() == 0)
+        case EStateGettingMsisdnStoreEntry:
             {
-            numType = EBTMonoATPhoneNumberUnavailable;
-            }
-        else if(nameBuf.Locate('+') == 0)
-            {
-            numType = EBTMonoATPhoneNumberInternational;
+            if (iStatus == KErrNone)
+                {
+                if(iEntry.iNumber.iTelNumber.Length() == 0)
+                    {
+                    GetMsisdnStoreEntry();
+                    break;
+                    }
+              
+                iCorrectNumbersCount++;
+
+                RATResultPtrArray resarr;
+                ATObjArrayCleanupResetAndDestroyPushL(resarr);
+                
+                TBuf8<RMobileONStore::KOwnNumberTextSize> telnumberBuf;
+                telnumberBuf.Copy(iEntry.iNumber.iTelNumber);
+                
+                TRACE_INFO((_L8("ao status %d, phonebook returned %S"), iStatus.Int(), &telnumberBuf))
+                RATParamArray params;
+                CleanupClosePushL(params);
+                LEAVE_IF_ERROR(params.Append(TATParam()))
+                LEAVE_IF_ERROR(params.Append(TATParam(telnumberBuf, EATDQStringParam)))  
+                 
+                TBTMonoATPhoneNumberType numType;
+                if(telnumberBuf.Locate('+') == 0)
+                    {
+                    numType = EBTMonoATPhoneNumberInternational;
+                    }
+                else
+                    {
+                    numType = EBTMonoATPhoneNumberNational;
+                    }
+                LEAVE_IF_ERROR(params.Append(TATParam(numType)))
+                LEAVE_IF_ERROR(params.Append(TATParam()))
+                LEAVE_IF_ERROR(params.Append(TATParam(4)))
+                CATResult* code = CATResult::NewL(EATCNUM, EATActionResult, &params);
+                CleanupStack::PushL(code);
+                resarr.AppendL(code);
+                CleanupStack::Pop(code);
+                CleanupStack::PopAndDestroy(&params);
+                
+                if(iCorrectNumbersCount == iOnStoreInfo.iUsedEntries)
+                    {
+                    CATResult* okerr = CATResult::NewL(EATOK);
+                    CleanupStack::PushL(okerr);
+                    resarr.AppendL(okerr);
+                    CleanupStack::Pop(okerr);
+                    iProtocol.SendResponseL(resarr);
+                    CleanupStack::PopAndDestroy(&resarr);
+                    Observer().RequestCompletedL(*this, iStatus.Int());  
+                    }
+                else
+                    {
+                    iProtocol.SendResponseL(resarr);
+                    CleanupStack::PopAndDestroy(&resarr);
+                    GetMsisdnStoreEntry();
+                    }
+                }
+            else
+                {
+                CATResult* okerr = CATResult::NewL(EATERROR);
+                CleanupStack::PushL(okerr);
+                iProtocol.SendResponseL(*okerr);
+                CleanupStack::PopAndDestroy(okerr);
+                Observer().RequestCompletedL(*this, iStatus.Int());  
+                }
+
+            break;
             }
-        else
+        case EStateGettingMsisdnStoreInfo:
             {
-            numType = EBTMonoATPhoneNumberNational;
+            if(iStatus==KErrNone && iOnStoreInfo.iUsedEntries>0 && 
+                    (iOnStoreInfo.iCaps & RMobilePhoneStore::KCapsIndividualEntry))
+                {
+                GetMsisdnStoreEntry();
+                }
+            else
+                {
+                CATResult* okerr = CATResult::NewL(EATOK);
+                CleanupStack::PushL(okerr);
+                iProtocol.SendResponseL(*okerr);
+                CleanupStack::PopAndDestroy(okerr);
+                Observer().RequestCompletedL(*this, iStatus.Int());  
+                }
+            break;
             }
-        LEAVE_IF_ERROR(params.Append(TATParam(numType)))
-        LEAVE_IF_ERROR(params.Append(TATParam()))
-        LEAVE_IF_ERROR(params.Append(TATParam(4)))
-        CATResult* code = CATResult::NewL(EATCNUM, EATActionResult, &params);
-        CleanupStack::PushL(code);
-        resarr.AppendL(code);
-        CleanupStack::Pop(code);
-        CleanupStack::PopAndDestroy(&params);
-        okerr = CATResult::NewL(EATOK);
+            
+        default:
+            break;        
         }
-    else
-        {
-        okerr = CATResult::NewL(EATERROR);
-        }
-    CleanupStack::PushL(okerr);
-    resarr.AppendL(okerr);
-    CleanupStack::Pop(okerr);
-    iProtocol.SendResponseL(resarr);
-    CleanupStack::PopAndDestroy(&resarr);
-    Observer().RequestCompletedL(*this, iStatus.Int());    
+    
     TRACE_FUNC_EXIT
     }
 
+
 // -------------------------------------------------------------------------------
 // CBtmcNumber::DoCancel
 // -------------------------------------------------------------------------------
@@ -147,7 +218,8 @@
     CBtmcProtocol& aProtocol, 
     CActive::TPriority aPriority, 
     TInt aServiceId)
-    : CBtmcActive(aObserver, aPriority, aServiceId), iProtocol(aProtocol), iPckg(iEntry)
+    : CBtmcActive(aObserver, aPriority, aServiceId), iProtocol(aProtocol), iPckg(iEntry),
+    iOnStoreInfoPckg(iOnStoreInfo), iState(EStateNull), iUsedEntriesCount(1), iCorrectNumbersCount(0)
     {
     }
 
--- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcoperator.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcoperator.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -122,7 +122,6 @@
 void CBtmcOperator::DoCancel()
     {
     TRACE_FUNC
-	iStore.CancelAsyncRequest(EMobilePhoneStoreRead);
     }
 
 // -------------------------------------------------------------------------------
--- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcphonestatus.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcphonestatus.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -19,7 +19,9 @@
 // INCLUDE FILES
 
 #include "btmcphonestatus.h"
+#ifdef NO101APPDEPFIXES
 #include <nssvascoreconstant.h>
+#endif  //NO101APPDEPFIXES
 #include <etelmm.h>
 #include "atcodec.h"
 #include "btmcprotocol.h"
@@ -100,7 +102,11 @@
     if (aEnabled && !iVoiceRecognitionEnabled)
         {
         // AO for Voice Dial
+#ifdef NO101APPDEPFIXES
         LEAVE_IF_ERROR(iVoiceDialProperty.Attach(KSINDUID, ERecognitionState))
+#else   //NO101APPDEPFIXES
+        LEAVE_IF_ERROR(iVoiceDialProperty.Attach(KUidSystemCategory, KBTMonoVoiceRecognitionStateKey))
+#endif  //NO101APPDEPFIXES
         CBtmcActive* ao = CBtmcActive::NewLC(*this, CActive::EPriorityStandard, KVoiceDialSubscribe);
         iActives.AppendL(ao);
         iVoiceDialProperty.Subscribe(ao->iStatus);
@@ -207,7 +213,11 @@
     TRACE_INFO((_L("Voice dial Initiator %d, Voice dial event %d"), iVoiceRecogInitiator, aEnabled))
     TBTMonoATVoiceRecognition value = EBTMonoATVoiceRecognitionOff;    
     
+#ifdef NO101APPDEPFIXES
     if (iVoiceRecogInitiator != EBTMonoVoiceRecognitionActivatedByRemote && aEnabled == ERecognitionStarted)
+#else   //NO101APPDEPFIXES
+    if (iVoiceRecogInitiator != EBTMonoVoiceRecognitionActivatedByRemote && aEnabled == KBTMonoVoiceRecognitionStarted)
+#endif  //NO101APPDEPFIXES
         {// phone activated or headset deactivated voice recognition, informs headset status change
         value = EBTMonoATVoiceRecognitionOn;
         }
@@ -302,14 +312,6 @@
         }
     }
 
-TInt CBtmcPhoneStatus::GetVolumeStatus()
-	{
-	if(iVol)
-		return iVol->GetVolume();
-	else
-		return 0;
-	}
-
 // -----------------------------------------------------------------------------
 // CBtmcPhoneStatus::CBtmcPhoneStatus
 // -----------------------------------------------------------------------------
--- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -389,7 +389,6 @@
         {
         iCallStatus->ReportCallStatusL();
         }
-    iVolumeSyncFromAccessory = EFalse;
     TRACE_FUNC_EXIT
     }
 
@@ -938,12 +937,15 @@
             LEAVE_IF_ERROR(aCmd.Parameter(0, param))
             TInt value;
             LEAVE_IF_ERROR(param.Int(value))
-            if (!iPhoneStatus)
+            // In HFP, AT+VGS is not valid before service level connection
+            // has established.
+            // In HSP, AT+VGS is allowed at any time.
+            if (!iPhoneStatus && iProtocolStatus->iProfile == EBtmcHSP )
                 {
                 iPhoneStatus = CBtmcPhoneStatus::NewL(*this, iPhone, iProtocolStatus->iProfile);
                 iPhoneStatus->SetVolumeControlFeatureL(ETrue);
                 }
-            if(iVolumeSyncFromAccessory)
+            if(iPhoneStatus)
                 {
                 iPhoneStatus->SetSpeakerVolumeL(value);
                 }
@@ -1025,37 +1027,9 @@
     CleanupStack::Pop(ok);
     SendResponseL(resarr);
     CleanupStack::PopAndDestroy(&resarr);
-    
-    // solution to volume sync - phone will always send its volume status back to accessory
-    
-    if( (aCmd.Id() == EATVGS) && (iVolumeSyncFromAccessory == EFalse) )
-    	{
-    	iVolumeSyncFromAccessory = ETrue;
-    	TInt vol(KErrNotFound);
-
-        if(iPhoneStatus)
-            {
-            vol = iPhoneStatus->GetVolumeStatus();
-            }
-
-    	if(vol > KErrNotFound) // volume exists
-    		{
-        TATParam param = TATParam();
-        LEAVE_IF_ERROR(aCmd.Parameter(0, param))
-        TInt value;
-        LEAVE_IF_ERROR(param.Int(value))
-        if(value != vol)
-    			{
-    			CATResult* event = CATResult::NewLC(EATVGS, EATUnsolicitedResult, vol);
-    			SendUnsoltResultL(*event);
-    			CleanupStack::PopAndDestroy(event);
-    			}
-    		}
-    	}
     CmdHandlingCompletedL();    
     }
 
-
 // -----------------------------------------------------------------------------
 // CBtmcProtocol::HandleActionCommandL
 // 
--- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcvolume.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcvolume.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -60,11 +60,13 @@
 void CBtmcVolume::SetSpeakerVolumeL(TInt aHfVol)
     {
     TRACE_FUNC
-    TRACE_INFO((_L("phone vol %d, acc vol %d"), iPhnSpkrVol, iAccSpkrVol))
+    TRACE_INFO((_L("current vols phone %d, acc %d"), iPhnSpkrVol, iAccSpkrVol))
+    // Store the new volume setting of headset regardless of 
+    // whether volume control is active or not currently
     iAccSpkrVol = HfToPhoneVolScale(aHfVol);
-    if (iVolCtrlActivated)
+    TRACE_INFO((_L("new acc vol %d"), iAccSpkrVol))
+    if ( IsActiveRemoteVolumeControl() )
         {
-        TRACE_INFO((_L("to new vol %d"), iAccSpkrVol))
         TInt vol = GetNewPhoneVol();
         if (vol != KNoAudioStreaming)
             {
@@ -73,10 +75,6 @@
             DoSetSpeakerVolL( prevPhVol );
             }
         }
-    else
-        {
-        TRACE_INFO((_L("volume control inactive!")))
-        }
     }
 
 void CBtmcVolume::SetMicrophoneVolumeL(TInt /*aHfVol*/)
@@ -86,13 +84,11 @@
 
 void CBtmcVolume::ActivateRemoteVolumeControl()
     {
-    if (!iVolCtrlActivated)
+    TRACE_FUNC
+    if (!IsActiveRemoteVolumeControl() )
         {
-        TRACE_FUNC
 		iVolLevelProperty.Subscribe(iActive->iStatus);     
         iActive->GoActive();
-
-        iVolCtrlActivated = ETrue;
         TInt vol = GetNewPhoneVol();
         TRACE_INFO((_L("current phone vol %d, acc vol %d"), vol, iAccSpkrVol))
         if (vol != KNoAudioStreaming)
@@ -109,11 +105,7 @@
 
 void CBtmcVolume::DeActivateRemoteVolumeControl()
     {
-    if (iVolCtrlActivated)
-        {
-        iVolCtrlActivated = EFalse;
-        iActive->Cancel();
-        }
+    iActive->Cancel();
     TRACE_FUNC
     }
 
@@ -211,11 +203,15 @@
         diff1 = Abs( aPrevPhVol - iAccSpkrVol );
         diff2 = Abs( iPhnSpkrVol - iAccSpkrVol );
         
-        if( diff2 >= diff1  )
+        if (diff2 > diff1)
             {
             // the previous phone volume is closer to current headset volume setting
             volClick = ( aPrevPhVol < iPhnSpkrVol ) ? KPSVolumeDownClicked : KPSVolumeUpClicked;
             }
+        else if ( (diff2 == diff1) && (diff1 !=0) )
+            {
+            volClick = ( aPrevPhVol < iPhnSpkrVol ) ? KPSVolumeDownClicked : KPSVolumeUpClicked;
+            }
         // otherwise we have roughly synchronized vol in both ends.
         }
     else if( iAccSpkrVol != iPhnSpkrVol )
@@ -242,21 +238,15 @@
             volClick = (iAccSpkrVol > iPhnSpkrVol) ? KPSVolumeUpClicked : KPSVolumeDownClicked;
             }        
         }
-     
+    TInt err( KErrNotFound );
     if( volClick )
         {
-        iAction = ESpeakerVolSet;
-        TInt err = iVolKeyEventProperty.Set( volClick );
-        if( err )
-            {
-            iAction = ESpeakerVolSubscribe;
-            TRACE_ERROR((_L("Set KMediaKeysVolumeKeyEvent err %d"), err));
-            }
+        err = iVolKeyEventProperty.Set( volClick );
+        TRACE_INFO((_L("Set KMediaKeysVolumeKeyEvent click %d err %d"), volClick, err));
         }
-    else
-        {        
-        iAction = ESpeakerVolSubscribe;
-        }
+    
+    iAction = err ? ESpeakerVolSubscribe : ESpeakerVolSet;
+
     TRACE_FUNC_EXIT 
     }
 
@@ -313,4 +303,9 @@
 	return iPhnSpkrVol;
 	}
 
+TBool CBtmcVolume::IsActiveRemoteVolumeControl()
+    {
+    return iActive->IsActive();
+    }
+
 // End of file
--- a/bluetoothengine/btmac/src/btmac/btmrfcommsock.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btmac/src/btmac/btmrfcommsock.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -229,16 +229,20 @@
     {
     TRACE_FUNC_ENTRY
     TRACE_INFO((_L("err %d"), aErr))
-
+    
+    if (aErr == KErrNone)
+    	{
+		TBTSockAddr sockAddr;
+		iDataSocket->RemoteName(sockAddr);
+		iRemote = sockAddr.BTAddr();
+    	}
+    
     // Process the connect complete before issuing a receive request to ensure that
     // we are ready to process the data when it is received.
     iObserver->RfcommConnectCompletedL(aErr);
 
-    if (!aErr)
+    if (aErr == KErrNone)
         {
-        TBTSockAddr sockAddr;
-        iDataSocket->RemoteName(sockAddr);
-        iRemote = sockAddr.BTAddr();
         iInData.ReAllocL(256);
         RequestMasterRole();
         TInt err = iAda.Open(iServer, iRemote);
@@ -256,17 +260,20 @@
     {
     TRACE_FUNC_ENTRY
 
-    iRemoteHasConnected = ETrue;
+    if (aErr == KErrNone)
+    	{
+		iRemoteHasConnected = ETrue;
+		TBTSockAddr sockAddr;
+		iDataSocket->RemoteName(sockAddr);
+		iRemote = sockAddr.BTAddr();
+    	}
 
     // Process the accept complete before issuing a receive request to ensure that
     // we are ready to process the data when it is received.
     iObserver->RfcommAcceptCompletedL(aErr, iService);
 
-   if (!aErr)
+   if (aErr == KErrNone)
         {
-        TBTSockAddr sockAddr;
-        iDataSocket->RemoteName(sockAddr);
-        iRemote = sockAddr.BTAddr();
         iInData.ReAllocL(256);
         RequestMasterRole();
         TInt err = iAda.Open(iServer, iRemote);
--- a/bluetoothengine/btnotif/ecom/BtnotifWrapper.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/ecom/BtnotifWrapper.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -27,6 +27,10 @@
 #endif
 #include <btnotif.h>			// notifier id for power mode setting 
 
+// @todo remove this declaration once both stack and UI layers are in codeline
+const TUid KBTUserConfirmationNotifierUidCopyForWrapper={0x2002E224};
+
+
 const TInt KMaxSynchReplyBufLength = 256;  //what should be?
 
 const TUid KBTInquiryChannel            = {0x00000601}; // Channel for inquiry notifier
@@ -45,6 +49,7 @@
 const TInt KBTGenericQueryNotifierPriority = MEikSrvNotifierBase2::ENotifierPriorityHigh;
 const TInt KBTNumericComparisonPriority     = MEikSrvNotifierBase2::ENotifierPriorityVHigh;  // for SSP
 const TInt KBTPasskeyEntryNotifierPriority = MEikSrvNotifierBase2::ENotifierPriorityVHigh;   // for SSP
+const TInt KBTUserConfirmationNotifierPriority = MEikSrvNotifierBase2::ENotifierPriorityVHigh;   // for SSP
 const TInt KBTPairedDeviceSettingPriority = MEikSrvNotifierBase2::ENotifierPriorityVHigh;   
 const TInt KBTEnterpriseItSecurityInfoNotifierPriority = MEikSrvNotifierBase2::ENotifierPriorityHigh;
 
@@ -78,64 +83,109 @@
                                    KBTInquiryPriority,
                                    _L("BTNotif.dll"),
                                    KMaxSynchReplyBufLength);
-	  		   
+
+    CleanupStack::PushL( master );
     subjects->AppendL( master );
-    
-   // Notifiers using masters session 
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTManAuthNotifierUid,
-                                   			 				KBTAuthorisationChannel,
-                                   			 				KBTAuthorisationPriority));
-    
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTPinCodeEntryNotifierUid,
-                                   			 				KBTAuthenticationChannel,
-                                   			 				KBTAuthenticationPriority));
-                                   			 				                               
-	subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTObexPasskeyQueryNotifierUid,
-                                   			 				KBTObexPINChannel,
-                                   			 				KBTObexPinPriority));
-        
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KPowerModeSettingNotifierUid,
-                                   			 				KBTPowerModeChannel,
-                                   			 				KBTPowerModePriority));                               			 				
-                                   			 				
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTGenericInfoNotifierUid,
-                                   			 				KBTGenericInfoNotifierUid,
-                                   			 				KBTGenericInfoNotifierPriority));
+    CleanupStack::Pop( master );
+
+    // Notifiers using masters session
+    CAknNotifierWrapperLight* notif = NULL;
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTManAuthNotifierUid,
+                                                  KBTAuthorisationChannel,
+                                                  KBTAuthorisationPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTPinCodeEntryNotifierUid,
+                                                  KBTAuthenticationChannel,
+                                                  KBTAuthenticationPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTObexPasskeyQueryNotifierUid,
+                                                  KBTObexPINChannel,
+                                                  KBTObexPinPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KPowerModeSettingNotifierUid,
+                                                  KBTPowerModeChannel,
+                                                  KBTPowerModePriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTGenericInfoNotifierUid,
+                                                  KBTGenericInfoNotifierUid,
+                                                  KBTGenericInfoNotifierPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
 
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTGenericQueryNotifierUid,
-                                   			 				KBTGenericQueryNotifierUid,
-                                   			 				KBTGenericQueryNotifierPriority));
-    
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KPbapAuthNotifierUid,
-                                   			 				KBTObexPINChannel,
-                                   			 				KBTObexPinPriority));   
-    
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTPairedDeviceSettingNotifierUid,
-                                                            KBTPairedDeviceSettingChannel,
-                                                            KBTPairedDeviceSettingPriority));   
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTGenericQueryNotifierUid,
+                                                  KBTGenericQueryNotifierUid,
+                                                  KBTGenericQueryNotifierPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KPbapAuthNotifierUid,
+                                                  KBTObexPINChannel,
+                                                  KBTObexPinPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTPairedDeviceSettingNotifierUid,
+                                                  KBTPairedDeviceSettingChannel,
+                                                  KBTPairedDeviceSettingPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
 
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTNumericComparisonNotifierUid,
-                                                            KBTNumericComparisonNotifierUid,
-                                                            KBTNumericComparisonPriority));       
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTNumericComparisonNotifierUid,
+                                                  KBTNumericComparisonNotifierUid,
+                                                  KBTNumericComparisonPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTPasskeyDisplayNotifierUid,
+                                                  KBTPasskeyDisplayNotifierUid,
+                                                  KBTPasskeyEntryNotifierPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
+
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTUserConfirmationNotifierUidCopyForWrapper,
+                                                  KBTUserConfirmationNotifierUidCopyForWrapper,
+                                                  KBTUserConfirmationNotifierPriority);
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );    
     
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master,
-                                                            KBTPasskeyDisplayNotifierUid,
-                                                            KBTPasskeyDisplayNotifierUid,
-                                                            KBTPasskeyEntryNotifierPriority)); 
+    notif = new (ELeave) CAknNotifierWrapperLight(*master,
+                                                  KBTEnterpriseItSecurityInfoNotifierUid,
+                                                  KBTEnterpriseItSecurityInfoNotifierUid,
+                                                  KBTEnterpriseItSecurityInfoNotifierPriority);
 
-    subjects->AppendL(new (ELeave) CAknNotifierWrapperLight(*master, 
-                                                            KBTEnterpriseItSecurityInfoNotifierUid,
-                                   			 				KBTEnterpriseItSecurityInfoNotifierUid,
-                                   			 				KBTEnterpriseItSecurityInfoNotifierPriority));
+    CleanupStack::PushL( notif );
+    subjects->AppendL( notif );
+    CleanupStack::Pop( notif );
 
     CleanupStack::Pop();	// array cleanup
     return(subjects);
--- a/bluetoothengine/btnotif/group/BTNotif.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/group/BTNotif.mmp	Fri Apr 16 15:08:36 2010 +0300
@@ -40,6 +40,7 @@
 SOURCE          btnpaireddevsettnotifier.cpp
 SOURCE          btnssppasskeyentrynotifier.cpp
 SOURCE          btnumcmpnotifier.cpp
+SOURCE          btuserconfnotifier.cpp
 SOURCE          btnotifuiutil.cpp
 SOURCE          btnotifactive.cpp
 SOURCE          btnpairnotifier.cpp
--- a/bluetoothengine/btnotif/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -33,7 +33,10 @@
 OPTION TARGETFILE btnotif.mif
 OPTION HEADERFILE btnotif.mbg
 OPTION SOURCES -c8,8 qgn_note_bt_popup -c8,8 qgn_note_bt_popup_2 \
-		           -c8,8 qgn_note_bt_popup_3 -c8,8 qgn_indi_bt_blocked
+		           -c8,8 qgn_note_bt_popup_3 -c8,8 qgn_indi_bt_blocked \
+		           -c8,8 qgn_indi_bt_signal_good_add \
+		           -c8,8 qgn_indi_bt_signal_low_add \
+		           -c8,8 qgn_indi_bt_signal_med_add
 END
 
 PRJ_MMPFILES
--- a/bluetoothengine/btnotif/inc/BTNGenericInfoNotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/BTNGenericInfoNotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -80,7 +80,7 @@
 		* @param aBuffer A package buffer containing received parameters.
         * @return None.
         */
-		void ProcessParamBufferL(const TDesC8& aBuffer);
+		void ProcessParamBufferL(const TDesC8& aBuffer, TBool aSyncCall);
 		
         /**
         * C++ default constructor.
@@ -90,10 +90,10 @@
         /**
          * Show Information note and complete message. 
          */
-        void ShowNoteAndCompleteL();
+        void ShowNoteAndCompleteL(TBool aSyncCall);
         
     private:
-        HBufC*	iQueryMessage;
+        RBuf	iQueryMessage;
 	    TInt 	iMessageResourceId;
 	    TSecondaryDisplayBTnotifDialogs iSecondaryDisplayCommand;
     };
--- a/bluetoothengine/btnotif/inc/BTNGenericQueryNotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/BTNGenericQueryNotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -95,14 +95,14 @@
                 
     private:
     	
-        HBufC*				iQueryMessage;
-		HBufC*				iQueryHeader;  		      
+        RBuf				iQueryMessage;
+		HBufC*				iQueryHeader;
         HBufC*				iName;
 
 	    TInt 		iMessageResourceId;
 	    TSecondaryDisplayBTnotifDialogs	iSecondaryDisplayCommand;
 		TBool 		iIsMessageQuery;
-		TBool 		iIsNameQuery; 
+		TBool 		iIsNameQuery;
     };
 
 #endif
--- a/bluetoothengine/btnotif/inc/btnotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -293,8 +293,12 @@
         TBTDevAddr                  iBTAddr; // Gotten from PckBuffer, constant no matter how iDevice changes.
         CBTNotifUIUtil*             iNotifUiUtil;           // Utility to show UI notes & queries
         CBTEngSettings*             iBTEngSettings;
+        TBool                       iIsCoverUI;
+
     private:
         CBTEngDevMan*               iDevMan;  // for BT registry manipulation
+
+
         
     };
 
--- a/bluetoothengine/btnotif/inc/btnotifuiutil.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnotifuiutil.h	Fri Apr 16 15:08:36 2010 +0300
@@ -21,7 +21,7 @@
 #include <data_caging_path_literals.hrh> 
 #include <AknQueryDialog.h>
 #include <AknWaitDialog.h>
-#include <secondarydisplay/BTnotifSecondaryDisplayAPI.h>
+#include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
 
 // CONSTANTS
 // Literals for resource and bitmap files ( drive, directory, filename(s) )
--- a/bluetoothengine/btnotif/inc/btnpaireddevsettnotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnpaireddevsettnotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -83,11 +83,6 @@
     private:
 
 		/**
-		 * Leave function called by non-leave btengdevman callback function HandleGetDevicesComplete().
-		 *@param aErr. Passed by caller.
-		 */
-
-		/**
         * Parse the data out of the message that is sent by the client of the notifier. 
 		* @param aBuffer A package buffer containing received parameters.
         * @return None.
--- a/bluetoothengine/btnotif/inc/btnpairnotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnpairnotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -84,8 +84,9 @@
         
         /**
          * Generate prompt based on subclass's own needs.
+         * @param aRBuf the descriptor to which the prompt will be loaded.
          */
-        virtual HBufC* GenerateQueryPromoptLC();
+        virtual void GenerateQueryPromptL( RBuf& aRBuf );
         
     private:
         /**
--- a/bluetoothengine/btnotif/inc/btnpinnotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnpinnotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -72,8 +72,9 @@
         /**
         * From CBTNPairNotifierBase
         * Generate prompt in Pin query dialog.
+        * @param aRBuf the descriptor to which the prompt will be loaded.
         */      
-        HBufC* GenerateQueryPromoptLC(); 
+        void GenerateQueryPromptL(RBuf& aRBuf); 
 
     private:
 
--- a/bluetoothengine/btnotif/inc/btnssppasskeyentrynotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnssppasskeyentrynotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -77,10 +77,9 @@
     
         /**
         * Generate prompt for passkey entry query.
-        * @param None.
-        * @return None.
+        * @param aRBuf the descriptor to which the prompt will be loaded.
         */
-        HBufC* GenerateQueryPromoptLC();
+        void GenerateQueryPromptL( RBuf& aRBuf );
         
     private:
 
--- a/bluetoothengine/btnotif/inc/btnumcmpnotifier.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/inc/btnumcmpnotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -75,10 +75,9 @@
         
         /**
         * From CBTNPairNotifierBase
-        * @param None.
-        * @return None.
+        * @param aRBuf the descriptor to which the prompt will be loaded.
         */
-        HBufC* GenerateQueryPromoptLC();
+        void GenerateQueryPromptL( RBuf& aRBuf );
 
     private:
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btnotif/inc/btuserconfnotifier.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies 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 User confirmation notifier for Secure Simle Pairing 
+*
+*/
+
+
+#ifndef BTUSERCONFNOTIFIER_H
+#define BTUSERCONFNOTIFIER_H
+
+// INCLUDES
+
+#include "btnpairnotifier.h" // Base class
+
+// These declarations are here temporarily so the submission of the notifiers and the stack do not have to be synchronised.
+// Should be removed once all submissions are in.
+
+const TUid KBTUserConfirmationNotifierUidCopy={0x2002E224};
+
+NONSHARABLE_CLASS(TBTNotifierParams2Copy)	
+	{
+public:
+	inline TBTDevAddr DeviceAddress() const { return iBDAddr; };
+	inline TPtrC DeviceName() const { return iName; };
+private:
+	TBTDevAddr		iBDAddr;
+	TBTDeviceName	iName;	
+	
+	// This data padding has been added to help prevent future binary compatibility breaks	
+	// Neither iPadding1 nor iPadding2 have been zero'd because they are currently not used
+	TUint32	iPadding1; 
+	TUint32	iPadding2; 
+	};
+
+NONSHARABLE_CLASS(TBTUserConfirmationParamsCopy)
+	: public TBTNotifierParams2Copy
+	{	
+public:
+	inline TBool LocallyInitiated() const { return iLocallyInitiated; };
+private:
+	TBool				iLocallyInitiated;
+	
+	// This data padding has been added to help prevent future binary compatibility breaks	
+	// Neither iPadding1 nor iPadding2 have been zero'd because they are currently not used
+	TUint32	iPadding1;
+	TUint32 iPadding2;
+	};
+
+typedef TPckgBuf<TBTUserConfirmationParamsCopy> TBTUserConfirmationParamsPckgCopy;
+
+// CLASS DECLARATION
+/**
+* This class is used to ask user to compare passcode in two devices.
+*/
+
+
+NONSHARABLE_CLASS(CBTUserConfNotifier): public CBTNPairNotifierBase
+    {
+    public: // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        */
+        static CBTUserConfNotifier* NewL();  // Constructor (public)
+
+        /**
+        * Destructor.
+        */
+        virtual ~CBTUserConfNotifier();      // Destructor
+
+    private:
+        /**
+        * From CBTNotifierBase Called when a notifier is first loaded 
+        * to allow any initial construction that is required.
+        * @param None.
+        * @return A structure containing priority and channel info.
+        */
+        TNotifierInfo RegisterL();
+
+        
+        /**
+        * From CBTNotifierBase Used in asynchronous notifier launch to 
+        * store received parameters into members variables and 
+        * make needed initializations.
+        * @param aBuffer A buffer containing received parameters
+        * @param aReturnVal The return value to be passed back.
+        * @param aMessage Should be completed when the notifier is deactivated.
+        * @return None.
+        */
+        void GetParamsL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage); // Get input parameters
+                                         
+        /**
+        * From CBTNotifierBase
+        * Show notes to ask user response and return to Notifier caller by completing message.
+        */      
+        void HandleGetDeviceCompletedL(const CBTDevice* aDev);        
+        
+    private:
+
+        /**
+        * C++ default constructor.
+        */
+        CBTUserConfNotifier();               // Default constructor
+    };
+
+#endif
+
+// End of File
--- a/bluetoothengine/btnotif/src/BTNAuthNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNAuthNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -17,7 +17,6 @@
 
 
 // INCLUDE FILES
-#include <StringLoader.h>    // Localisation stringloader
 #include <BTNotif.rsg>       // Own resources
 #include "btnauthnotifier.h" // Own class definition
 #include "btNotifDebug.h"    // Debugging macros
@@ -39,6 +38,7 @@
 #include <hlplch.h>
 #include <csxhelp/bt.hlp.hrh> // The bt hrh info is needed, for help launching
 #endif
+#include <bluetoothuiutil.h>
 #include "btnotifnameutils.h"
 
 
@@ -120,30 +120,31 @@
         {
         User::Leave(KErrInUse);
         }
-    else if ( AutoLockOnL() )
+
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+
+    if ( AutoLockOnL() )
         {
         // The phone is locked, access denied.
         // Write results back to caller and complete message.	
-		CompleteMessage(EFalse, KErrNone);	
+	CompleteMessage(EFalse, KErrNone);	
         return;
         }
     
-	TBTAuthorisationParams param;
- 	TPckgC<TBTAuthorisationParams> pckg(param);
- 	pckg.Set(aBuffer);
+    TBTAuthorisationParams param;
+    TPckgC<TBTAuthorisationParams> pckg(param);
+    pckg.Set(aBuffer);
 
- 	iServiceUid = pckg().iUid.iUid;  // Pick up service uid from message
- 	iBTAddr = pckg().iBDAddr;
- 	if ( OtherOutgoPairing( iBTAddr ) )
+    iServiceUid = pckg().iUid.iUid;  // Pick up service uid from message
+    iBTAddr = pckg().iBDAddr;
+    if ( OtherOutgoPairing( iBTAddr ) )
         {
         // We won't allow connection request from another device during outgoing pairing:
         FLOG(_L("[BTNOTIF]\t CBTAuthNotifier: outgoing pair in progress, reject request from other device"));
         CompleteMessage(KErrCancel);
         return;
-        }
- 	
-    iMessage = aMessage;
-    iReplySlot = aReplySlot;
+        }	
  	
     // create iDevice so that the name won't be lost if the device does
     // not exist in registry.
@@ -201,9 +202,12 @@
         if ( !iDevice->IsValidFriendlyName() && iDevice->IsValidDeviceName())
             {
             // Create new prompt string with new device name
-            HBufC* stringholder = StringLoader::LoadL( iStrResourceId, BTDeviceNameConverter::ToUnicodeL(iDevice->DeviceName()));
-            CleanupStack::PushL( stringholder );
-            iNotifUiUtil->UpdateQueryDlgL( *stringholder );
+            RBuf stringholder;
+            CleanupClosePushL( stringholder );
+            BluetoothUiUtil::LoadResourceAndSubstringL( 
+                    stringholder, iStrResourceId, 
+                    BTDeviceNameConverter::ToUnicodeL(iDevice->DeviceName()), 0 );
+            iNotifUiUtil->UpdateQueryDlgL( stringholder );
             iNotifUiUtil->UpdateCoverUiL( iDevice->DeviceName() );
             CleanupStack::PopAndDestroy();  // stringholder
             }
@@ -500,8 +504,11 @@
 
     TBTDeviceName tempDeviceName; 
     BtNotifNameUtils::GetDeviceDisplayName(tempDeviceName, iDevice);
-    HBufC* stringholder = StringLoader::LoadLC( iStrResourceId, tempDeviceName);
-    TInt keypress = iNotifUiUtil->ShowQueryL( *stringholder, R_BT_AUTHORISATION_QUERY, 
+    RBuf stringholder;
+    CleanupClosePushL( stringholder );
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            stringholder, iStrResourceId, tempDeviceName, 0);
+    TInt keypress = iNotifUiUtil->ShowQueryL( stringholder, R_BT_AUTHORISATION_QUERY, 
             iCoverUiDlgId, tempDeviceName, CAknQueryDialog::EConfirmationTone );
     CleanupStack::PopAndDestroy();  // stringholder
     // If this notifier is cancelled by the caller, no need to perform the rest operation:
--- a/bluetoothengine/btnotif/src/BTNGenericInfoNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNGenericInfoNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -24,6 +24,7 @@
 #include "btNotifDebug.h"       // Debugging macros
 #include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
 #include <e32cmn.h>
+#include <bluetoothuiutil.h>
 #include "btnotifnameutils.h"
 
 // ================= MEMBER FUNCTIONS =======================
@@ -59,7 +60,7 @@
 CBTGenericInfoNotifier::~CBTGenericInfoNotifier()
     {
     Cancel();   // Free own resources
-    delete iQueryMessage; 
+    iQueryMessage.Close(); 
     }
 
 // ----------------------------------------------------------
@@ -84,10 +85,13 @@
 TPtrC8 CBTGenericInfoNotifier::StartL( const TDesC8& aBuffer )
     {
     FLOG(_L("[BTNOTIF]\t CBTGenericInfoNotifier::StartL()"));
- 	ProcessParamBufferL(aBuffer);
+    if( !iNotifUiUtil )
+        {
+        iNotifUiUtil = CBTNotifUIUtil::NewL( iIsCoverUI );
+        }
+    ProcessParamBufferL(aBuffer, ETrue);
+    FLOG(_L("[BTNOTIF]\t CBTGenericInfoNotifier::StartL() completed"));
 
-	FLOG(_L("[BTNOTIF]\t CBTGenericInfoNotifier::StartL() completed"));
-	
     TPtrC8 ret(KNullDesC8);
     return (ret);
     }
@@ -108,7 +112,7 @@
 	    return;
 	    }
     iMessage = aMessage;
- 	ProcessParamBufferL(aBuffer);
+ 	ProcessParamBufferL(aBuffer, EFalse);
     }
 
 // ----------------------------------------------------------
@@ -116,10 +120,10 @@
 // Parse the data out of the message that is sent by the
 // client of the notifier.
 // ----------------------------------------------------------
-void CBTGenericInfoNotifier::ProcessParamBufferL(const TDesC8& aBuffer)
+void CBTGenericInfoNotifier::ProcessParamBufferL(const TDesC8& aBuffer, TBool aSyncCall)
 	{
 	TBTGenericInfoNotifierParams bParams;
-	TPckgC<TBTGenericInfoNotifierParams> bPckg(bParams);	
+	TPckgC<TBTGenericInfoNotifierParams> bPckg(bParams);
 		
 	bPckg.Set( aBuffer );
 	iSecondaryDisplayCommand = ECmdBTnotifUnavailable;
@@ -203,18 +207,25 @@
 			User::Leave(KErrNotFound);		
 		}
     
-	// if the logic string contains substitute indicator "%U", replace it with device name:	
-	iQueryMessage = StringLoader::LoadL( iMessageResourceId);
-	_LIT(PU,"%U");
-	if( iQueryMessage->Find(PU) != KErrNotFound)
+	// if the logic string contains substitute indicator "%U", replace it with device name:
+	HBufC* buf = StringLoader::LoadL( iMessageResourceId);
+	iQueryMessage.Assign( buf );
+	
+    TInt keyLen;
+    TInt pos = BluetoothUiUtil::GetStringSubstringKeyPos( 
+            iQueryMessage, 0, keyLen );
+    if( pos > KErrNotFound)
 		{
 		iBTAddr = TBTDevAddr( bPckg().iRemoteAddr );
-        iDevice = CBTDevice::NewL(iBTAddr);
+		if( !iDevice )
+		    {
+            iDevice = CBTDevice::NewL(iBTAddr);
+		    }
 	    GetDeviceFromRegL( iBTAddr );
 		}
 	else
 	    {
-	    ShowNoteAndCompleteL();
+	    ShowNoteAndCompleteL(aSyncCall);
 	    }
 	}
 	
@@ -223,10 +234,13 @@
 // Shows the notifier in backround 
 // ----------------------------------------------------------
 //
-void CBTGenericInfoNotifier::ShowNoteAndCompleteL()
+void CBTGenericInfoNotifier::ShowNoteAndCompleteL(TBool aSyncCall)
 	{
-	iNotifUiUtil->ShowInfoNoteL( *iQueryMessage, iSecondaryDisplayCommand );
-    CompleteMessage(KErrNone);
+	iNotifUiUtil->ShowInfoNoteL( iQueryMessage, iSecondaryDisplayCommand );
+	if (!aSyncCall)
+		{
+        CompleteMessage(KErrNone);
+        }
     FLOG(_L("[BTNOTIF]\t CBTGenericInfoNotifier::ShowNoteAndComplete() complete"));
 	}
 
@@ -234,14 +248,13 @@
     {
     FLOG(_L("[BTNOTIF]\t CBTGenericInfoNotifier::HandleGetDeviceCompleted()"));
     
-    delete iQueryMessage;
-    iQueryMessage=NULL;
-    
     TBTDeviceName name;
     BtNotifNameUtils::GetDeviceDisplayName(name, iDevice);
-    iQueryMessage = StringLoader::LoadL( iMessageResourceId, name);            
+    iQueryMessage.Zero();
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            iQueryMessage, iMessageResourceId, name, 0);      
     
-    ShowNoteAndCompleteL();
+    ShowNoteAndCompleteL(EFalse);
 
     FLOG(_L("[BTNOTIF]\t CBTGenericInfoNotifier::HandleGetDeviceComplete() Complete"));        
     }
--- a/bluetoothengine/btnotif/src/BTNGenericQueryNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNGenericQueryNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -23,6 +23,7 @@
 #include <e32cmn.h>
 #include <BTNotif.rsg>          // Own resources
 #include <btengsettings.h>
+#include <bluetoothuiutil.h>
 #include "BTNGenericQueryNotifier.h"      // Own class definition
 #include "btNotifDebug.h"       // Debugging macros
 
@@ -65,7 +66,7 @@
     {
     Cancel();   // Free own resources
     delete iName; 
-    delete iQueryMessage; 
+    iQueryMessage.Close(); 
 	delete iQueryHeader;
     }
 
@@ -226,14 +227,15 @@
 		}
 	
 	// if the logic string contains substitute indicator "%U", replace it with device name:
-	//		
-	iQueryMessage = StringLoader::LoadL( iMessageResourceId);
-	_LIT(PU,"%U");
-	if( iQueryMessage->Find(PU) != KErrNotFound)
+	//
+	HBufC* buf = StringLoader::LoadL( iMessageResourceId);
+	iQueryMessage.Assign( buf );
+
+	TInt keyLen;
+	TInt pos = BluetoothUiUtil::GetStringSubstringKeyPos( 
+	        iQueryMessage, 0, keyLen );
+	if( pos > KErrNotFound)
 		{		
-		delete iQueryMessage;
-		iQueryMessage=NULL;
-		
 		//if no device name provided, default name will be used:
 		if( !bPckg().iNameExists )			
 			iName=StringLoader::LoadL(R_BT_DIALOG_DEF_NAME);
@@ -242,7 +244,8 @@
 			iName=HBufC::NewL(bPckg().iName.Length() );
 			iName->Des().Copy(bPckg().iName);
 			}
-		iQueryMessage = StringLoader::LoadL( iMessageResourceId,*iName);		
+		BluetoothUiUtil::LoadResourceAndSubstringL( 
+		        iQueryMessage, iMessageResourceId, *iName, 0);
 		}
 	else
 		{
@@ -258,18 +261,16 @@
 TPtrC8 CBTGenericQueryNotifier::UpdateL(const TDesC8& aBuffer)
 	{
    	FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::UpdateL")); 
-    delete iQueryMessage;
-    iQueryMessage = NULL;
 	ProcessParamBufferL(aBuffer);
 	if( !iNotifUiUtil->IsQueryReleased() )
 		{
 		if(iIsMessageQuery )
 		    {
-		    iNotifUiUtil->UpdateMessageQueryDlgL(*iQueryMessage);
+		    iNotifUiUtil->UpdateMessageQueryDlgL(iQueryMessage);
 		    }
 		else
 		    {
-		    iNotifUiUtil->UpdateQueryDlgL(*iQueryMessage);
+		    iNotifUiUtil->UpdateQueryDlgL(iQueryMessage);
 		    }
 		}
    	FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::UpdateL complete")); 	
@@ -325,12 +326,12 @@
     if( iIsMessageQuery	)
 		{
 		
-        keypress = iNotifUiUtil->ShowMessageQueryL(*iQueryMessage, *iQueryHeader, 
+        keypress = iNotifUiUtil->ShowMessageQueryL(iQueryMessage, *iQueryHeader, 
                         R_BT_GENERIC_MESSAGE_QUERY, CAknQueryDialog::EConfirmationTone );        
 		}
 	else
     	{
-    	keypress = iNotifUiUtil->ShowQueryL( *iQueryMessage, R_BT_GENERIC_QUERY, 
+    	keypress = iNotifUiUtil->ShowQueryL( iQueryMessage, R_BT_GENERIC_QUERY, 
     	        iSecondaryDisplayCommand, name, CAknQueryDialog::EConfirmationTone );
     	}
 	
--- a/bluetoothengine/btnotif/src/BTNInqNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNInqNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -59,6 +59,7 @@
     {
     FLOG(_L("[BTNOTIF]\t CBTInqNotifier::~CBTInqNotifier()"));
     delete iUi;
+    iUi = NULL;
     FLOG(_L("[BTNOTIF]\t CBTInqNotifier::~CBTInqNotifier() completed"));
     }
 
@@ -84,7 +85,7 @@
     {
     FLOG(_L("[BTNOTIF]\t CBTInqNotifier::GetParamsL()"));
 
-    if( iUi || iReplySlot!=NULL || !iMessage.IsNull() )
+    if( !iMessage.IsNull() )
         {
         aMessage.Complete(KErrInUse);
         return;
@@ -124,6 +125,8 @@
     if( iUi )
         {
         iUi->Cancel();
+        delete iUi;
+        iUi = NULL;
         }
     CBTNotifierBase::Cancel();
     FLOG(_L("[BTNOTIF]\t CBTInqNotifier::Cancel() completed"));
--- a/bluetoothengine/btnotif/src/BTNInqUI.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNInqUI.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -22,7 +22,6 @@
 #include <aknlists.h>
 #include <aknPopup.h>
 #include <avkon.mbg>
-#include <StringLoader.h>       // Localisation stringloader
 #include <wlaninternalpskeys.h> // For WLAN state checking
 #include <ctsydomainpskeys.h>
 #include <AknNotiferAppServerApplication.h> 
@@ -30,9 +29,9 @@
 #include <BTNotif.rsg>          // Own resources
 #include <bt_subscribe.h>
 #include <btnotif.mbg>
-#include <wlanplugin.mbg>       // Borrow WLan signal strenth bar to show RSSI  
 #include <devui_const.h>
 #include <btengutil.h>
+#include <bluetoothuiutil.h>
 #include "btninqui.h"           // Own class definition
 #include "btNotifDebug.h"       // Debugging macros
 #include "btnotifnameutils.h"
@@ -46,8 +45,7 @@
 const TInt KHighStrength = 82;
 const TUint32 ExcludePairedDeviceMask = 0x800000;
 const TUint32 ResetExcludePairedDeviceMask = 0xFF7FFFFF;
-_LIT(KBtnotifBmpFileName,"btnotif.mbm");
-_LIT(KWLanBmpFileName,"wlanplugin.mif");
+_LIT(KBtnotifBmpFileName,"btnotif.mif"); //mif is target file under resource folder
 
 // ================= MEMBER FUNCTIONS =======================
 
@@ -727,23 +725,18 @@
 	GetColorIconL( bmpFilename, KAknsIIDQgnIndiBtBlocked, 
 	                EMbmBtnotifQgn_indi_bt_blocked, 
 	                EMbmBtnotifQgn_indi_bt_blocked_mask, iconList );
-	
-	bmpFilename.Zero();
-	bmpFilename.Append( KFileDrive );
-	bmpFilename.Append( KDC_APP_BITMAP_DIR );
-	bmpFilename.Append( KWLanBmpFileName );
+
+    GetColorIconL( bmpFilename, KAknsIIDQgnIndiBtSignalLowAdd, 
+                    EMbmBtnotifQgn_indi_bt_signal_low_add, 
+                    EMbmBtnotifQgn_indi_bt_signal_low_add_mask, iconList);
 	
-    GetColorIconL( bmpFilename, KAknsIIDQgnIndiWlanSignalLowAdd, 
-	                EMbmWlanpluginQgn_indi_wlan_signal_low_add, 
-	                EMbmWlanpluginQgn_indi_wlan_signal_low_add_mask, iconList);
-	
-    GetColorIconL( bmpFilename, KAknsIIDQgnIndiWlanSignalMedAdd, 
-                    EMbmWlanpluginQgn_indi_wlan_signal_med_add, 
-                    EMbmWlanpluginQgn_indi_wlan_signal_med_add_mask, iconList );
+    GetColorIconL( bmpFilename, KAknsIIDQgnIndiBtSignalMedAdd, 
+                    EMbmBtnotifQgn_indi_bt_signal_med_add, 
+                    EMbmBtnotifQgn_indi_bt_signal_med_add_mask, iconList );
 
-    GetColorIconL( bmpFilename, KAknsIIDQgnIndiWlanSignalGoodAdd, 
-                    EMbmWlanpluginQgn_indi_wlan_signal_good_add, 
-                    EMbmWlanpluginQgn_indi_wlan_signal_good_add_mask, iconList );
+    GetColorIconL( bmpFilename, KAknsIIDQgnIndiBtSignalGoodAdd, 
+                    EMbmBtnotifQgn_indi_bt_signal_good_add, 
+                    EMbmBtnotifQgn_indi_bt_signal_good_add_mask, iconList );
 	
 	// Transfer iconlist ownership to the listbox
 	//
@@ -1047,21 +1040,14 @@
 TInt CBTInqUI::QueryUnblockDeviceL(CBTDevice* aDevice)
 	{
 	FLOG(_L("[BTNOTIF]\t CBTInqUI::QueryUnblockDeviceL()"));
-
-    HBufC* stringholder = NULL;
-
-    if (aDevice->IsValidFriendlyName())
-       	{
-        stringholder = StringLoader::LoadLC(R_BT_UNBLOCK_DEVICE, aDevice->FriendlyName());
-        }
-    else
-        {  	
-        stringholder = StringLoader::LoadLC(R_BT_UNBLOCK_DEVICE, BTDeviceNameConverter::ToUnicodeL(aDevice->DeviceName()));
-        }
-
-    TBTDeviceName name(KNullDesC);
+	RBuf stringholder;
+	stringholder.CleanupClosePushL();
+    TBTDeviceName name;
+    BtNotifNameUtils::GetDeviceDisplayName( name, aDevice );
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            stringholder, R_BT_UNBLOCK_DEVICE, name, 0 );
     TInt keypress(0);
-    keypress = iUiUtil->ShowQueryL( *stringholder, R_BT_UNBLOCK_QUERY, 
+    keypress = iUiUtil->ShowQueryL( stringholder, R_BT_UNBLOCK_QUERY, 
             ECmdBTnotifUnavailable, name, CAknQueryDialog::EConfirmationTone );
     CleanupStack::PopAndDestroy();  // stringholder
     FTRACE(FPrint(_L("[BTNOTIF]\t CBTInqUI::QueryUnblockDeviceL()  keypress= %d"),keypress));    
--- a/bluetoothengine/btnotif/src/BTNMain.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNMain.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -32,6 +32,7 @@
 #include "btnpaireddevsettnotifier.h"
 #include "btnssppasskeyentrynotifier.h"
 #include "btnumcmpnotifier.h"
+#include "btuserconfnotifier.h"
 #include "btnenterpriseitsecurityinfonotifier.h"
 
 // CONSTANTS
@@ -105,6 +106,12 @@
     aNotifiers->AppendL( numCmpNotifier );
     CleanupStack::Pop( numCmpNotifier );
 
+    CBTUserConfNotifier* userConfNotifier = CBTUserConfNotifier::NewL();
+    CleanupStack::PushL(userConfNotifier);
+    aNotifiers->AppendL( userConfNotifier );
+    CleanupStack::Pop( userConfNotifier );
+
+    
     CBTEnterpriseItSecurityInfoNotifier* enterpriseItSecurityNotifier = CBTEnterpriseItSecurityInfoNotifier::NewL();
     CleanupStack::PushL(enterpriseItSecurityNotifier);
     aNotifiers->AppendL(enterpriseItSecurityNotifier);
--- a/bluetoothengine/btnotif/src/BTNObexPinNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNObexPinNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -84,17 +84,18 @@
         {
         User::Leave(KErrInUse);
         }
-    else if ( AutoLockOnL() )
+
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+
+    if ( AutoLockOnL() )
         {
         // The phone is locked, access denied.
         //
         CompleteMessage(KErrCancel);
         return;
         }
-        
-    iMessage = aMessage;
-    iReplySlot = aReplySlot;
-    
+ 
     ShowNoteCompleteMessageL();
 
     FLOG(_L("[BTNOTIF]\t CBTObexPinNotifier::GetParamsL() completed"));
--- a/bluetoothengine/btnotif/src/BTNPBAPPinNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNPBAPPinNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -92,16 +92,17 @@
         {
         User::Leave(KErrInUse);
         }
-    else if ( AutoLockOnL() )
+    
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+    
+    if ( AutoLockOnL() )
         {
         // The phone is locked, access denied.
         //
         CompleteMessage(KErrCancel);
         return;
         }
-        
-    iMessage = aMessage;
-    iReplySlot = aReplySlot;
 
     ShowNoteCompleteMessageL();
 
--- a/bluetoothengine/btnotif/src/BTNPinNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNPinNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -24,6 +24,7 @@
 #include <btotgpairpub.inl>
 #include <btextnotifiers.h>
 #include <BTNotif.rsg>       // Own resources
+#include <bluetoothuiutil.h>
 #include "btnotif.hrh"       // Own resource header
 #include "btnpinnotifier.h"  // Own class definition
 #include "btNotifDebug.h"    // Debugging macros
@@ -167,11 +168,12 @@
  	FOREVER
 	 	{
 	    TBuf<KBTPassKeyMaxLength> tempResultBuffer;
-	    
-	    HBufC* prompt = GenerateQueryPromoptLC(); // prompt still in stack.
-        TInt keypress = iNotifUiUtil->ShowTextInputQueryL(tempResultBuffer, *prompt, R_BT_ENTER_PASSKEY_QUERY, 
+	    RBuf prompt;
+	    prompt.CleanupClosePushL();
+	    GenerateQueryPromptL( prompt );
+        TInt keypress = iNotifUiUtil->ShowTextInputQueryL(tempResultBuffer, prompt, R_BT_ENTER_PASSKEY_QUERY, 
                 ECmdShowBtOpenCoverNote, CAknQueryDialog::EConfirmationTone );
-        CleanupStack::PopAndDestroy( prompt );
+        CleanupStack::PopAndDestroy( &prompt );
 
         if( keypress ) // OK pressed
         	{
@@ -248,35 +250,32 @@
     }
 
 // ----------------------------------------------------------
-// CBTPinNotifier::GenerateQueryPromoptLC
+// CBTPinNotifier::GenerateQueryPromptL
 // ---------------------------------------------------------- 
-HBufC* CBTPinNotifier::GenerateQueryPromoptLC()
+void CBTPinNotifier::GenerateQueryPromptL( RBuf& aRBuf )
     {
-    FLOG(_L("[BTNOTIF]\t CBTPinNotifier::GenerateQueryPromoptLC() >>"));
-    HBufC* prompt = NULL;
-
+    FLOG(_L("[BTNOTIF]\t CBTPinNotifier::GenerateQueryPromptLC() >>"));
     TBTDeviceName devName;
-    BtNotifNameUtils::GetDeviceDisplayName( devName, iDevice );
+    BtNotifNameUtils::GetDeviceDisplayName( devName, iDevice ); 
     if (iPasskeyLength > 0)  //Minimum length passkey is defined
         {
-        CDesCArray* stringArray = new ( ELeave ) CDesCArrayFlat( 1 );
-        CleanupStack::PushL( stringArray );
-        CArrayFix<TInt>* indexArray = new(ELeave) CArrayFixFlat<TInt>(1);
-        CleanupStack::PushL( indexArray ); 
+        BluetoothUiUtil::LoadResourceAndSubstringL( 
+                aRBuf, R_BT_MIN_PASSKEY_PROMPT, devName, 1 );
 
-        stringArray->AppendL( BTDeviceNameConverter::ToUnicodeL(iDevice->DeviceName()) );   
-        indexArray->AppendL( iPasskeyLength);   
-        prompt = StringLoader::LoadL( R_BT_MIN_PASSKEY_PROMPT, *stringArray, *indexArray );
-
-        CleanupStack::PopAndDestroy( indexArray );
-        CleanupStack::PopAndDestroy( stringArray );
-        CleanupStack::PushL( prompt );
+        RBuf tmpBuf;
+        tmpBuf.CleanupClosePushL();
+        tmpBuf.Swap( aRBuf );
+        aRBuf.ReAllocL( aRBuf.MaxLength() + sizeof(TUint));
+        aRBuf.Zero();
+        // Passkey length should be localized, hope StringLoader can make it:
+        StringLoader::Format( aRBuf, tmpBuf, 0, iPasskeyLength );
+        CleanupStack::PopAndDestroy( &tmpBuf );
         }
     else
         {
-        prompt = StringLoader::LoadLC( R_BT_PASSKEY_PROMPT, devName );
+        BluetoothUiUtil::LoadResourceAndSubstringL( 
+                aRBuf, R_BT_PASSKEY_PROMPT, devName, 0 );
         }
-    FLOG(_L("[BTNOTIF]\t CBTPinNotifier::GenerateQueryPromoptLC() <<"));
-    return prompt;
+    FLOG(_L("[BTNOTIF]\t CBTPinNotifier::GenerateQueryPromptLC() <<"));
     }
 // End of File
--- a/bluetoothengine/btnotif/src/BTNotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/BTNotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -31,7 +31,7 @@
 #include <BTNotif.rsg>       // Own resources
 #include <featmgr.h>            // Feature Manager API
 #include <utf.h>             // CnvUtfConverter
-
+#include <bluetoothuiutil.h>
 #include "btnotifier.h"      // Own class definition
 #include "btNotifDebug.h"    // Debugging macros
 #include "btnotiflock.h"
@@ -85,14 +85,14 @@
     {
 	// Sets up TLS, must be done before FeatureManager is used.
 	FeatureManager::InitializeLibL();
-	TBool isCoverUI = ( FeatureManager::FeatureSupported( KFeatureIdCoverDisplay ) ) 
+	iIsCoverUI = ( FeatureManager::FeatureSupported( KFeatureIdCoverDisplay ) ) 
                     ? ETrue : EFalse; 	
 	// Frees the TLS. Must be done after FeatureManager is used.
     FeatureManager::UnInitializeLib(); 
 
     iBTEngSettings = CBTEngSettings::NewL();
     iDevMan = CBTEngDevMan::NewL( this );
-    iNotifUiUtil = CBTNotifUIUtil::NewL( isCoverUI );
+    iNotifUiUtil = CBTNotifUIUtil::NewL( iIsCoverUI );
     }
 
 // ----------------------------------------------------------
@@ -145,6 +145,11 @@
 //
 void CBTNotifierBase::StartL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage)
     {
+    if( !iNotifUiUtil )
+        {
+        iNotifUiUtil = CBTNotifUIUtil::NewL( iIsCoverUI );    
+        }
+    
     TRAPD(err, GetParamsL(aBuffer, aReplySlot, aMessage));
     if (err)
         {
@@ -423,6 +428,10 @@
     TBTRegistrySearch mySearch;
     mySearch.FindAddress( aAddr );
     iDeviceArray = new (ELeave) CBTDeviceArray(1);
+    if( !iDevMan )
+        {
+        iDevMan = CBTEngDevMan::NewL( this );    
+        }
     TInt err = iDevMan->GetDevices( mySearch, iDeviceArray );
     if(err)
         {
@@ -449,12 +458,14 @@
     TInt resId = IsUserAwarePaired( iDevice->AsNamelessDevice() ) ? 
         R_BT_BLOCK_PAIRED_DEVICE_NOHELP : R_BT_BLOCK_DEVICE_NOHELP;
 	
-	HBufC* stringHolder = StringLoader::LoadLC( resId, bName );
+    RBuf stringholder;
+    stringholder.CleanupClosePushL();
+    BluetoothUiUtil::LoadResourceAndSubstringL( stringholder, resId, bName, 0 );
 
-	TInt keypress = iNotifUiUtil->ShowMessageQueryL( *stringHolder, *header, 
+	TInt keypress = iNotifUiUtil->ShowMessageQueryL( stringholder, *header, 
 	        R_BT_GENERIC_MESSAGE_QUERY, CAknQueryDialog::EConfirmationTone );
     
-    CleanupStack::PopAndDestroy(stringHolder);                   
+    CleanupStack::PopAndDestroy(&stringholder);                   
     CleanupStack::PopAndDestroy(header);  
 
     if( keypress )// user replied "Yes"
@@ -479,12 +490,20 @@
     iDevice->DeleteLinkKey();
  
     iBTRegistryQueryState = ESetDeviceBlocked;
-    TInt devManErr = iDevMan->ModifyDevice( *iDevice );     
-            
-    // if error, complete message, otherwise waiting for devman callback
-    //
-    if(devManErr != KErrNone)
-        CompleteMessage(devManErr); 
+    TInt err = KErrNone;
+    if( !iDevMan )
+        {
+        TRAP(err, iDevMan = CBTEngDevMan::NewL( this ));    
+        }
+    if( !err )
+        {
+        err = iDevMan->ModifyDevice( *iDevice );
+        }
+    if( err )
+        {
+        // if error, complete message, otherwise waiting for devman callback
+        CompleteMessage(err); 
+        }
     }
 
 void CBTNotifierBase::ChangeAuthorizeState( TBool aTrust )
@@ -496,13 +515,19 @@
     iDevice->SetGlobalSecurity(sec);
  
     iBTRegistryQueryState = ESetDeviceAuthorizeState;
-    TInt devManErr = iDevMan->ModifyDevice( *iDevice );     
-            
-    // if error, complete message, otherwise waiting for devman callback
-    //
-    if(devManErr != KErrNone)
+    TInt err = KErrNone;
+    if( !iDevMan )
+        {    
+        TRAP(err, iDevMan = CBTEngDevMan::NewL( this ));
+        }
+    if( !err )
         {
-        CompleteMessage(devManErr); 
+        err = iDevMan->ModifyDevice( *iDevice );
+        }
+    if( err )
+        {
+        // if error, complete message, otherwise waiting for devman callback        
+        CompleteMessage(err); 
         TBTNotifLockPublish::DeleteNotifLocks( 
                 EBTNotiferLockPairedDeviceSetting, iDevice->BDAddr() );
         }
--- a/bluetoothengine/btnotif/src/btnenterpriseitsecurityinfonotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/btnenterpriseitsecurityinfonotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -18,7 +18,7 @@
 // INCLUDE FILES
 #include <BTNotif.rsg>								// Own resources
 #include "btnenterpriseitsecurityinfonotifier.h"	// Own class definition
-#include "BTNotifDebug.h"							// Debugging macros
+#include "btNotifDebug.h"							// Debugging macros
 #include <tulstringresourcereader.h>
 #include <e32cmn.h>
 #include <dcmo.rsg>
--- a/bluetoothengine/btnotif/src/btnotifuiutil.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/btnotifuiutil.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -17,12 +17,12 @@
 
 #include <bautils.h>         // BAFL utils (for language file)
 #include "btnotifuiutil.h"
-#include "BTNotifDebug.h"    // Debugging macros
-#include <stringloader.h>    // Localisation stringloader
-#include <AknNoteWrappers.h> // Information note
+#include "btNotifDebug.h"    // Debugging macros
+#include <StringLoader.h>    // Localisation stringloader
+#include <aknnotewrappers.h> // Information note
 #include <aknmessagequerydialog.h> // for the blocking query
-#include <aknmediatorfacade.h>  // CoverUI 
-#include <CoreApplicationUIsDomainPSKeys.h>  // Backlight control
+#include <AknMediatorFacade.h>  // CoverUI 
+#include <coreapplicationuisdomainpskeys.h>  // Backlight control
 #include <AknNotiferAppServerApplication.h>  // Application Key enable/disable
 
 CBTNotifUIUtil* CBTNotifUIUtil::NewL( TBool aCoverDisplayEnabled )
--- a/bluetoothengine/btnotif/src/btnpaireddevsettnotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/btnpaireddevsettnotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -18,22 +18,22 @@
 
 // INCLUDE FILES
 
-#include <stringloader.h>       // Localisation stringloader
 #include <BTNotif.rsg>          // Own resources
 #include <btnotif.h>
+#include <bluetoothuiutil.h>
 #include "btnotiflock.h"
-#include "btnpaireddevsettNotifier.h"      // Own class definition
-#include "BTNotifDebug.h"       // Debugging macros
+#include "btnpaireddevsettnotifier.h"      // Own class definition
+#include "btNotifDebug.h"       // Debugging macros
 #include <bluetooth/hci/hcierrors.h>
 #include "btnotifnameutils.h"
 
-#include <secondarydisplay/BTnotifSecondaryDisplayAPI.h>
+#include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
 
 #include <e32cmn.h>
-#include <aknmediatorfacade.h>  // CoverUI 
+#include <AknMediatorFacade.h>  // CoverUI 
 
 #ifdef __SERIES60_HELP
-#include <HLPLCH.H>
+#include <hlplch.h>
 #include <csxhelp/bt.hlp.hrh> // The bt hrh info is needed, for help launching
 #endif
 
@@ -127,26 +127,23 @@
     TBTDeviceName name;
     BtNotifNameUtils::GetDeviceDisplayName(name, iDevice);
     
+    RBuf stringholder;
+    stringholder.CleanupClosePushL();
+    
     // 1. Show pairing status note
     FTRACE(FPrint(_L("[BTNOTIF]\t CBTPairedDevSettNotifier iPairingStatus: %d"), iPairingStatus));
     TInt resourceId = ProcessPairingErrorCode( iPairingStatus );    
-    HBufC* stringholder = StringLoader::LoadLC( resourceId );
-    _LIT(PU,"%U");
-    if( stringholder->Find(PU) != KErrNotFound)
-        {
-        CleanupStack::PopAndDestroy( stringholder );
-        stringholder = StringLoader::LoadLC( resourceId, name );
-        }   
-    
+    BluetoothUiUtil::LoadResourceAndSubstringL( stringholder, resourceId, name, 0 );
+
     if (!iPairingStatus)
         {
-        iNotifUiUtil->ShowConfirmationNoteL( ETrue, *stringholder, iSecondaryDisplayCommand, name );
+        iNotifUiUtil->ShowConfirmationNoteL( ETrue, stringholder, iSecondaryDisplayCommand, name );
         }
     else
         {
-        iNotifUiUtil->ShowErrorNoteL( ETrue, *stringholder, iSecondaryDisplayCommand, name );
+        iNotifUiUtil->ShowErrorNoteL( EFalse, stringholder, iSecondaryDisplayCommand, name );
         }
-    CleanupStack::PopAndDestroy( stringholder ); // stringholder
+    CleanupStack::PopAndDestroy( &stringholder );
       
     if( iPairingStatus || (iDevice && iDevice->GlobalSecurity().Banned() ) )
         {
--- a/bluetoothengine/btnotif/src/btnpairnotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/btnpairnotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -22,10 +22,10 @@
 #include <btextnotifierspartner.h> // new file introduced by xSymbian
 #endif
 
-#include <StringLoader.h>    // Localisation stringloader
 #include <utf.h>             // Unicode character conversion utilities
 #include <btengconnman.h>
 #include <BTNotif.rsg>       // Own resources
+#include <bluetoothuiutil.h>
 #include "btnpairnotifier.h"
 #include "btNotifDebug.h"
 #include "btnotifnameutils.h"
@@ -80,16 +80,17 @@
         {
         User::Leave(KErrInUse);
         }
-    else if ( AutoLockOnL() )
+
+    iMessage = (RMessage2)aMessage;
+    iReplySlot = aReplySlot;
+
+    if ( AutoLockOnL() )
         {
         // The phone is locked, access denied.
         //
         CompleteMessage(KErrCancel);
-        return;
         }
 
-    iMessage = (RMessage2)aMessage;
-    iReplySlot = aReplySlot;
     }
 
 // ----------------------------------------------------------
@@ -127,9 +128,11 @@
     // and user has not given a alias for device.   
         if( !iNotifUiUtil->IsQueryReleased() && !iDevice->IsValidFriendlyName() )
             {
-            HBufC* prompt = GenerateQueryPromoptLC();
-            iNotifUiUtil->UpdateQueryDlgL( *prompt );
-            CleanupStack::PopAndDestroy( prompt );
+            RBuf prompt;
+            prompt.CleanupClosePushL();
+            GenerateQueryPromptL( prompt );
+            iNotifUiUtil->UpdateQueryDlgL( prompt );
+            CleanupStack::PopAndDestroy( &prompt );
             }
         }
 
@@ -203,13 +206,16 @@
     
     TBTDeviceName devName;
     BtNotifNameUtils::GetDeviceDisplayName( devName, iDevice );
-    HBufC* prompt = StringLoader::LoadLC( R_BT_ACCEPT_PAIRING_REQUEST, devName );   
+    RBuf prompt;
+    prompt.CleanupClosePushL();
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            prompt, R_BT_ACCEPT_PAIRING_REQUEST, devName, 0 );
 
-    TBTDeviceName nameCoverUi( KNullDesC );
+    devName.Zero();
     // Show query for use to accept/reject incoming pairing request
-    TInt keypress = iNotifUiUtil->ShowQueryL( *prompt, R_BT_GENERIC_QUERY, 
-             ECmdBTnotifUnavailable, nameCoverUi, CAknQueryDialog::EConfirmationTone );
-    CleanupStack::PopAndDestroy( prompt );
+    TInt keypress = iNotifUiUtil->ShowQueryL( prompt, R_BT_GENERIC_QUERY, 
+             ECmdBTnotifUnavailable, devName, CAknQueryDialog::EConfirmationTone );
+    CleanupStack::PopAndDestroy( &prompt );
 
     if( iMessage.IsNull() ) // cancelled by the stack
         {
@@ -236,11 +242,12 @@
     }
 
 // ----------------------------------------------------------
-// CBTNPairNotifierBase::GenerateQueryPromoptLC
+// CBTNPairNotifierBase::GenerateQueryPromptL
 // To be implemented in derived classes.
 // ----------------------------------------------------------
 //
-HBufC* CBTNPairNotifierBase::GenerateQueryPromoptLC()
+void CBTNPairNotifierBase::GenerateQueryPromptL(  RBuf& aRBuf )
     {
-    return NULL;
+    FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::GenerateQueryPromptL WARNING "));
+    (void) aRBuf;
     }
--- a/bluetoothengine/btnotif/src/btnssppasskeyentrynotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/btnssppasskeyentrynotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -31,7 +31,7 @@
 #endif
 #include <BTNotif.rsg>       // Own resources
 #include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
-
+#include <bluetoothuiutil.h>
 #include "btnotif.hrh"       // Own resource header
 #include "btnssppasskeyentrynotifier.h"  // Own class definition
 #include "btNotifDebug.h"    // Debugging macros
@@ -184,9 +184,11 @@
         }
     if ( !iNotifUiUtil->IsQueryReleased() )
         {
-        HBufC* update = GenerateQueryPromoptLC();
-        iNotifUiUtil->UpdateQueryDlgL( *update );
-        CleanupStack::PopAndDestroy( update ); 
+        RBuf prompt;
+        prompt.CleanupClosePushL();
+        GenerateQueryPromptL( prompt );
+        iNotifUiUtil->UpdateQueryDlgL( prompt );
+        CleanupStack::PopAndDestroy( &prompt ); 
         }        
     
     FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::UpdateL() completed"));
@@ -226,11 +228,14 @@
     iBuf.Zero();
     iBuf.Append(iPasskey);
     iBuf.Append(_L("    "));
-    HBufC* prompt = GenerateQueryPromoptLC();
     
-    TInt answer = iNotifUiUtil->ShowQueryL( *prompt, R_BT_PASSKEY_QUERY, 
+    RBuf prompt;
+    prompt.CleanupClosePushL();
+    GenerateQueryPromptL( prompt );
+    
+    TInt answer = iNotifUiUtil->ShowQueryL( prompt, R_BT_PASSKEY_QUERY, 
             ECmdBTnotifUnavailable, nameCoverUi );    
-    CleanupStack::PopAndDestroy( prompt );  
+    CleanupStack::PopAndDestroy( &prompt );  
 
     if( iAnswer ) // user pressed entry key from remote keyboard.
         {
@@ -260,23 +265,18 @@
     }
 
 // ----------------------------------------------------------
-// CBTSSPPasskeyEntryNotifier::GenerateQueryPromoptLC
+// CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL
 // ----------------------------------------------------------
 //
-HBufC* CBTSSPPasskeyEntryNotifier::GenerateQueryPromoptLC()
+void CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL(  RBuf& aRBuf )
     {
-    FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GenerateQueryPromoptLC()"));
+    FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL()"));
     TBTDeviceName devName; 
     BtNotifNameUtils::GetDeviceDisplayName(devName, iDevice);   
-    
-    CPtrCArray* subsPrompt = new (ELeave) CPtrCArray(2);
-    CleanupStack::PushL( subsPrompt );
-    subsPrompt->AppendL( devName );
-    subsPrompt->AppendL( iBuf );
-    HBufC* prompt = StringLoader::LoadL( R_BT_SSP_PASSKEY_ENTRY , *subsPrompt );
-    CleanupStack::PopAndDestroy( subsPrompt );
-    CleanupStack::PushL( prompt );
-    FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GenerateQueryPromoptLC() << "));
-    return prompt;
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            aRBuf, R_BT_SSP_PASSKEY_ENTRY, devName, 0 );
+    BluetoothUiUtil::AddSubstringL( aRBuf, iBuf, 1 );
+    FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL() << "));
+
     }
 // End of File
--- a/bluetoothengine/btnotif/src/btnumcmpnotifier.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btnotif/src/btnumcmpnotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -33,6 +33,7 @@
 #include <btotgpairpub.inl>
 #include <btengconnman.h>
 #include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
+#include <bluetoothuiutil.h>
 #include "btnotifnameutils.h"
 
 #ifdef __SERIES60_HELP
@@ -154,9 +155,11 @@
 	// For outgoing pairing request or accepted incoming pairing request,
 	// ask user to compare the pincodes in two devices.
 	TBTDeviceName nameCoverUi( KNullDesC );
-	HBufC* prompt = GenerateQueryPromoptLC(); 
-    TInt answer = iNotifUiUtil->ShowQueryL( *prompt, R_BT_GENERIC_QUERY, ECmdShowBtOpenCoverNote, nameCoverUi );   
-	CleanupStack::PopAndDestroy( prompt ); 
+    RBuf prompt;
+    prompt.CleanupClosePushL();
+    GenerateQueryPromptL( prompt );
+    TInt answer = iNotifUiUtil->ShowQueryL( prompt, R_BT_GENERIC_QUERY, ECmdShowBtOpenCoverNote, nameCoverUi );   
+	CleanupStack::PopAndDestroy( &prompt ); 
 	
     if( answer )
         {
@@ -187,20 +190,18 @@
     }
 
 // ----------------------------------------------------------
-// CBTNumCmpNotifier::GenerateQueryPromoptLC
+// CBTNumCmpNotifier::GenerateQueryPromptL
 // Generate prompt for Numeric Comparison query and return.
 // ----------------------------------------------------------
 //
-HBufC* CBTNumCmpNotifier::GenerateQueryPromoptLC()
+void CBTNumCmpNotifier::GenerateQueryPromptL( RBuf& aRBuf )
     {
-    FLOG(_L("[BTNOTIF]\t CBTNumCmpNotifier::GenerateQueryPromoptLC()"));
+    FLOG(_L("[BTNOTIF]\t CBTNumCmpNotifier::GenerateQueryPromptL()"));
     TBTDeviceName devName;
     BtNotifNameUtils::GetDeviceDisplayName( devName, iDevice );
-    
-    CPtrCArray* subs = new (ELeave) CPtrCArray(2);
-    CleanupStack::PushL( subs );
     TBuf<KBTDeviceShortNameLength> shortName;
     
+    TPtrC namePtr;
     // Cut the name and put ellipsis in the middle if necessary
     // By example "SampleSymbianDevice" after this operation will be shown in
     // the dialog as "Sam...ice"(for 7 chars device name limit)
@@ -215,18 +216,20 @@
         //adding only end of the name to the final string
         shortName.Append( devName.Right( shortName.MaxLength() - 
                           shortName.Length() ) );
-        subs->AppendL( shortName );
+        namePtr.Set( shortName );
         }
     else
         {
-        subs->AppendL( devName );
+        namePtr.Set( devName );
         }
-    subs->AppendL( iPasskeyToShow );
-    HBufC* prompt = StringLoader::LoadL( R_BT_SSP_PASSKEY_COMPARISON_PROMPT, *subs );
-    CleanupStack::PopAndDestroy( subs );
-    CleanupStack::PushL( prompt );
-    FLOG(_L("[BTNOTIF]\t CBTNumCmpNotifier::GenerateQueryPromoptLC() <<"));
-    return prompt;
+
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            aRBuf, R_BT_SSP_PASSKEY_COMPARISON_PROMPT, namePtr, 0 );
+    // Numeric comparison key shall not be localized either, use our own
+    // string loading:
+    BluetoothUiUtil::AddSubstringL( aRBuf, iPasskeyToShow, 1);
+    FLOG(_L("[BTNOTIF]\t CBTNumCmpNotifier::GenerateQueryPromptL() <<"));
+
     }
 
 // End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btnotif/src/btuserconfnotifier.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,153 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies 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 User confirmation notifier for Secure Simle Pairing 
+*
+*/
+
+
+// INCLUDE FILES
+#include <StringLoader.h>    // Localisation stringloader
+#include <utf.h>             // Unicode character conversion utilities
+#include <avkon.mbg>
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <btextnotifiers.h>
+#else
+#include <btextnotifiers.h>
+#include <btextnotifierspartner.h>
+#endif
+#include <BTNotif.rsg>       // Own resources
+#include "btnotif.hrh"       // Own resource header
+#include "btuserconfnotifier.h"  // Own class definition
+#include "btNotifDebug.h"    // Debugging macros
+#include <btotgpairpub.inl>
+#include <btengconnman.h>
+#include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
+#include <bluetoothuiutil.h>
+#include "btnotifnameutils.h"
+
+#ifdef __SERIES60_HELP
+#include <hlplch.h>
+#include <csxhelp/bt.hlp.hrh> // The bt hrh info is needed, for help launching
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------
+// CBTUserConfNotifier::NewL
+// Two-phased constructor.
+// ----------------------------------------------------------
+//
+CBTUserConfNotifier* CBTUserConfNotifier::NewL()
+    {
+    CBTUserConfNotifier* self=new (ELeave) CBTUserConfNotifier();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ----------------------------------------------------------
+// CBTUserConfNotifier::CBTUserConfNotifier
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------
+//
+CBTUserConfNotifier::CBTUserConfNotifier()
+    {
+    
+    }
+
+// ----------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------
+//
+CBTUserConfNotifier::~CBTUserConfNotifier()
+    {
+    }
+
+// ----------------------------------------------------------
+// CBTUserConfNotifier::RegisterL
+// Register notifier.
+// ----------------------------------------------------------
+//
+CBTUserConfNotifier::TNotifierInfo CBTUserConfNotifier::RegisterL()
+    {
+    iInfo.iUid = KBTUserConfirmationNotifierUidCopy;
+    iInfo.iChannel = KBTUserConfirmationNotifierUidCopy;
+    iInfo.iPriority=ENotifierPriorityVHigh;
+    return iInfo;
+    }
+
+// ----------------------------------------------------------
+// CBTUserConfNotifier::GetParamsL
+// Initialize parameters and check if device is already
+// in registry. Jump to RunL as soon as possible.
+// ----------------------------------------------------------
+//
+void CBTUserConfNotifier::GetParamsL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage)
+    {
+    FLOG(_L("[BTNOTIF]\t CBTUserConfNotifier::GetParamsL()"));
+
+    CBTNPairNotifierBase::GetParamsL( aBuffer, aReplySlot, aMessage );
+    
+    TBTUserConfirmationParamsPckgCopy pckg;
+ 	pckg.Copy(aBuffer);
+ 	iBTAddr = pckg().DeviceAddress();
+    if ( OtherOutgoPairing( iBTAddr) )
+        {
+        // We won't allow incoming pairing during outgoing pairing:
+        FLOG(_L("[BTNOTIF]\t CBTUserConfNotifier: outgoing pair in progress, reject incoming pair"));
+        CompleteMessage(KErrCancel);
+        return;
+        }
+    
+	iLocallyInitiated = pckg().LocallyInitiated(); 
+
+	// base class
+	ProcessParamsGetDeviceL( iBTAddr, pckg().DeviceName() );
+	
+	FLOG(_L("[BTNOTIF]\t CBTUserConfNotifier::GetParamsL() completed"));
+    }
+
+// ----------------------------------------------------------
+// CBTUserConfNotifier::HandleGetDeviceCompletedL
+// Ask user response and return it to caller.
+// Store device into registry if user has accepted pairing.
+// ----------------------------------------------------------
+//
+void CBTUserConfNotifier::HandleGetDeviceCompletedL(const CBTDevice* /*aDev*/)
+    {
+    FLOG(_L("[BTNOTIF]\t CBTUserConfNotifier::HandleGetDeviceCompletedL()"));
+    
+    // Check if blocked device. 
+    if( CheckBlockedDeviceL() )
+        return;
+    
+    // Turn lights on and deactivate apps -key
+    iNotifUiUtil->TurnLightsOn();
+
+   	// For incoming pairing request
+    TBool answer = AuthoriseIncomingPairingL();
+    if( !answer ) 
+        {
+        //User rejects the incoming pairing, complete message in QueryBlockDevice.
+        FLOG(_L("[BTNOTIF]\t CBTUserConfNotifier::HandleGetDeviceCompletedL() <<"));
+        return;
+        }
+    CompleteMessage(answer, KErrNone);
+
+    FLOG(_L("[BTNOTIF]\t CBTUserConfNotifier::HandleGetDeviceCompletedL() completed"));
+    }
+
+// End of File
--- a/bluetoothengine/btsac/btrcc/inc/btrccLinker.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btsac/btrcc/inc/btrccLinker.h	Fri Apr 16 15:08:36 2010 +0300
@@ -319,7 +319,6 @@
         
         CBTRCCVolumeLevelControllerBase* iVolController;
         CBTRCCVolumeLevelControllerBase* iAbsoluteVolController;
-        CBTRCCVolumeLevelControllerBase* iLegacyVolController;
         
         TInt iRegisterVolumeChangeNotificationCounter;//Counter for re-register for remote volume control notification
 };
--- a/bluetoothengine/btsac/btrcc/inc/btrccplayerstarter.h	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btsac/btrcc/inc/btrccplayerstarter.h	Fri Apr 16 15:08:36 2010 +0300
@@ -125,6 +125,11 @@
         TBool IsMusicPlayerRunning();
         
         /**
+         * Tells if Video player is running or not.
+         */
+        TBool IsVideoPlayerRunning();
+
+        /**
          * Launch MPX player.
          */
         void LaunchMusicPlayerL();
--- a/bluetoothengine/btsac/btrcc/src/btrccLinker.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btsac/btrcc/src/btrccLinker.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -25,7 +25,6 @@
 #include <apacmdln.h>
 #include <apgcli.h>
 #include "btaudioremconpskeys.h"
-#include "btrccLegacyVolumeLevelController.h"
 #include "btrccAbsoluteVolumeLevelController.h"
 #include "btrccLinker.h"
 #include "btrccplayerstarter.h"
@@ -87,7 +86,6 @@
     if (iAccObserver.IsAvrcpVolCTSupported())
         {
         iAbsoluteVolController = CBTRCCAbsoluteVolumeLevelController::NewL(*iInterfaceSelector, *this);
-        iLegacyVolController = CBTRCCLegacyVolumeLevelController::NewL(*iInterfaceSelector, *this);
         }
     else 
    		{
@@ -101,8 +99,6 @@
 
     iRemConBatteryTgt = CRemConBatteryApiTarget::NewL(*iInterfaceSelector, *this);
 
-//    iBrowsingAdapter = CBTRCCBrowsingAdapter::NewL(*iInterfaceSelector); 
-    
     if (iAccObserver.IsAvrcpVolCTSupported()) 
         {
         iInterfaceSelector->OpenControllerL();
@@ -129,7 +125,6 @@
         User::RequestComplete(iClientRequest, KErrAbort);
 	
     delete iAbsoluteVolController;
-    delete iLegacyVolController;
 	delete iPlayerStarter;
 	Cancel();
     iStateArray.ResetAndDestroy();
@@ -437,17 +432,18 @@
     if (iAccObserver.IsAvrcpVolCTSupported())
         {
         // Choose based on SDP result whether to create 
-        // absolute controller or legacy controller.
+        // absolute controller or not.
         if(!iVolController)
             {
             if (iAccObserver.IsAbsoluteVolumeSupported(iRemoteAddr))
                 {
                 iVolController = iAbsoluteVolController;
+                TRACE_INFO(_L("Absolute volume supported, taking it into use."))
                 }
             else 
-                {
-                iVolController = iLegacyVolController;
-                }
+            	{
+                TRACE_INFO(_L("No absolute volume supported, so no volume control."))
+            	}
             }
         }
     if (iVolController)
@@ -466,6 +462,7 @@
     if (iVolController)
         {
         iVolController->Stop();
+        iVolController = NULL; 
         }
     }
 
--- a/bluetoothengine/btsac/btrcc/src/btrccplayerstarter.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btsac/btrcc/src/btrccplayerstarter.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -33,6 +33,7 @@
 _LIT(KMpxPlayerExeName, "mpx.exe");
 
 _LIT(KMpxPlayerSearchPatternBySID, "*102072c3*");
+_LIT(KVideoPlayerSearchPatternBySID, "*200159B2*");
 
 static const TInt KPlayCmdToPlayerDelay = 6000000; // value will be tuned later 
 
@@ -243,7 +244,7 @@
         {
         return;
         }
-    if (!IsMusicPlayerRunning())
+    if (!IsMusicPlayerRunning() && !IsVideoPlayerRunning())
          {
          TRAPD(err, LaunchMusicPlayerL());
          // Send the response of play command to remote device
@@ -269,6 +270,22 @@
     return running;
     }
 
+TBool CPlayerStarter::IsVideoPlayerRunning()
+    {
+    TRACE_FUNC
+    // Video player is running if we can find a thread whose name contains 
+    // Video Player's SID.
+    TFindThread findt(KVideoPlayerSearchPatternBySID);
+    TFullName result;
+    TBool running(EFalse);
+    if (!findt.Next(result))
+        {
+        TRACE_INFO((_L("Thread '%S'is found"), &result));
+        running = ETrue;
+        }
+    return running;
+    }
+
 void CPlayerStarter::LaunchMusicPlayerL()
     {
     RApaLsSession ls;
--- a/bluetoothengine/btui/Ecom/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/Ecom/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -20,10 +20,8 @@
 
 PRJ_PLATFORMS
 
-
 PRJ_EXPORTS
 
-
 PRJ_MMPFILES
 ./BtuiPlugin.mmp 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/Ecom/inc/bluetoothuiutil.h	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,92 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   This provides utility for loading a BT device name without
+* localised to a string to be shown in GUI.
+*
+*/
+#include <StringLoader.h>
+
+class BluetoothUiUtil
+    {
+public:
+
+/*
+ * Gets the starting position of a key whose pattern matches
+ * '%'{(0)*|<n>}<aKey> where 0 and <n> is the decimal value 
+ * of the specified position and <aKey> is the symbol of the key, 
+ * either 'U' or 'N'.
+ * 
+ * For example, if the specified position of a number key 
+ * is 0, both "%N" and "%0N" match, 
+ * but "%1N" doesn't. If the position n is greater than 0, 
+ * only "%<n>N" matches.
+ * @param aDes the descriptor where a key parameter will be searched.
+ * @param aKey the specified key, 'U' or 'N'
+ * @param aKeyPos the position of the key. position starts from 0.
+ * @param aKeyLength the length of the key at return if the key exists.
+ * @return the start position of the key in aDes. KErrNotFound if the key
+ *          is not available.
+ */
+inline static TInt GetSubstringKeyPos( const TDes& aDes, const TDesC& aKey, 
+        TInt aKeyPos, TInt& aKeyLength );
+
+/*
+ * Gets the starting position of a string key whose pattern matches
+ * '%'{(0)*|<n>}'U' where 0 and <n> is the decimal value 
+ * of the specified position. 
+ * 
+ * For example, if the specified position is 0, both "%U" and "%0U" match, 
+ * but "%1U" doesn't. If the position n is greater than 0, 
+ * only "%<n>U" matches.
+ * @param aDes the descriptor in which a string key will be searched.
+ * @param aKeyPos the position of the string key. position starts from 0.
+ * @param aKeyLength the length of the string key at return if the key exists.
+ * @return the start position of the string key in aDes. KErrNotFound if the key
+ *          is not available.
+ */
+inline static TInt GetStringSubstringKeyPos( const TDes& aDes, TInt aKeyPos, TInt& aKeyLength );
+
+/*
+ * Add a substring to the specified RBuf descriptor.
+ * ( Replace "%<n>U" at the specified position withe the given string.
+ * @param aBuf the RBuf descriptor in which a "%<n>U" will be replaced.
+ * @param aSub the substring that will replace a "%<n>U".
+ * @param aSubPos the position of the "%U" to be replaced. Position starts from 0.
+ */
+inline static void AddSubstringL( RBuf& aBuf, const TDesC& aSub, TInt aSubPos);
+
+/*
+ * Load a string specified by the given resource ID, 
+ * remove substrings that match "[" and ends with "]" and finally
+ * replace the "%U" or "%<n>U" at the specified position with the
+ * given substring.
+ * 
+ * This function is intended for adding a Bluetooth device name to a UI 
+ * string but without localizing this name.
+ * 
+ * (Using StringLoader will get the device name localized in some variants. 
+ * This is a workaround to tackle the unwanted localization.)
+ * 
+ * @param aBuf the RBuf descriptor in which a "%<n>U" will be replaced.
+ * @param aSub the substring that will replace a "%<n>U".
+ * @param aSubPos the position of the "%U" to be replaced. Position starts from 0.
+ */
+inline static void LoadResourceAndSubstringL(RBuf& aBuf,
+        TInt aResourceId, const TDesC& aSub, TInt aSubPos );
+    };
+
+#include "bluetoothuiutil.inl"
+
+// End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/Ecom/inc/bluetoothuiutil.inl	Fri Apr 16 15:08:36 2010 +0300
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   This provides utility for loading a BT device name without
+* localised to a string to be shown in GUI.
+*
+*/
+
+inline TInt BluetoothUiUtil::GetSubstringKeyPos( 
+        const TDes& aDes, const TDesC& aKey, 
+        TInt aKeyPos, TInt& aKeyLength )
+    {
+    ASSERT( aKeyPos > KErrNotFound );
+    _LIT(KPercentSymbol, "%" );
+    // 32 would be to fit any key substring in practice:
+    TBuf<32> key;
+    TInt pos( KErrNotFound );
+    // if the specified position is 0, check if "%<aKey>" (%U or %N) exists.
+    if ( aKeyPos == 0 )
+        {
+        key.Copy( KPercentSymbol );
+        key.Append(aKey);
+        pos = aDes.Find( key );
+        }
+    // Either the key is not found, or aKeyPos is not 0.
+    if ( pos == KErrNotFound )
+        {
+        key.Copy( KPercentSymbol );
+        key.AppendNum( aKeyPos );
+        key.Append( aKey );
+        pos = aDes.Find( key );
+        }
+    if ( pos > KErrNotFound )
+        {
+        aKeyLength = key.Length();
+        }
+    return pos;
+    }
+
+inline TInt BluetoothUiUtil::GetStringSubstringKeyPos( 
+        const TDes& aDes, TInt aKeyPos, TInt& aKeyLength )
+    {
+    _LIT(KStringKeyword,"U");
+    TPtrC ptr( KStringKeyword );
+    return GetSubstringKeyPos(aDes, ptr, aKeyPos, aKeyLength );
+    }
+
+inline void BluetoothUiUtil::AddSubstringL( 
+        RBuf& aBuf, const TDesC& aSub, TInt aSubPos)
+    {
+    // Find the position of the specified "%U" or %[0-9]U in aBuf.
+    TInt keyLength;
+    TInt pos = GetStringSubstringKeyPos( aBuf, aSubPos, keyLength );
+    if ( pos == KErrNotFound )
+        {
+        User::Leave( pos );
+        }
+    // Enlarge the max length of aBuf if needed:
+    TInt reqedLen = aBuf.Length() - keyLength + aSub.Length();
+    if ( aBuf.MaxLength() <  reqedLen )
+        {
+        aBuf.ReAllocL( reqedLen );
+        }
+    aBuf.Replace( pos, keyLength, aSub );
+    }
+
+inline void BluetoothUiUtil::LoadResourceAndSubstringL(RBuf& aBuf,
+        TInt aResourceId, const TDesC& aSub, TInt aSubPos )
+    {
+    HBufC* string = StringLoader::LoadL( aResourceId );
+    aBuf.Assign( string );
+    // Logical loc strings may contain redundant "[<chars>]" for some reason.
+    // This sub-string should be removed in our ad hoc parameter loading method.
+    _LIT( KLeftSquareBracket,"[" );
+    _LIT( KRightSquareBracket,"]" );
+    while ( 1 )
+        {
+        TInt lpos = aBuf.Find( KLeftSquareBracket );
+        TInt rpos = aBuf.Find( KRightSquareBracket );
+        if ( lpos > KErrNotFound && rpos > KErrNotFound && ( rpos > lpos ) )
+            {
+            aBuf.Delete(lpos, rpos - lpos + 1 );
+            continue;
+            }
+        // No sub-strings that match "[" and ends with "]". Done
+        break;
+        }
+    // Add the substring to this string loaded from resource:
+    AddSubstringL( aBuf,  aSub, aSubPos );
+    }
+
+// End of File
+
--- a/bluetoothengine/btui/Ecom/src/BTUIBlockedDevicesView.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/Ecom/src/BTUIBlockedDevicesView.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -36,7 +36,9 @@
 
 #include <gstabhelper.h>
 #include <btui.mbg>						// Tab icon for General Setting
+#include <bluetoothuiutil.h>
 #include "BTUIMainView.h" 				// base View.
+
 // ---------------------------------------------------------
 // CBTUIBlockedDevicesView::ConstructL
 // Symbian 2nd phase constructor can leave.
@@ -177,12 +179,16 @@
         	TBTDevice device;
             device.iIndex = bItemIndex;
         	iModel->GetDevice(device);
-        	        	
+        	
+        	RBuf s;
+        	CleanupClosePushL( s );
+        	BluetoothUiUtil::LoadResourceAndSubstringL(
+        	        s, R_BT_WARN_ERASE_BLOCKED, device.iName, 0);
+        	
         	CAknQueryDialog* dialog = CAknQueryDialog::NewL(CAknQueryDialog::EConfirmationTone);
-        	HBufC* s = StringLoader::LoadLC(R_BT_WARN_ERASE_BLOCKED,device.iName);
-			TInt keypress = dialog->ExecuteLD(R_BT_GENERIC_QUERY, *s);
+			TInt keypress = dialog->ExecuteLD(R_BT_GENERIC_QUERY, s);
 
-			CleanupStack::PopAndDestroy(s);
+			CleanupStack::PopAndDestroy(&s);
 
 			if(keypress)  // User has accepted the dialog
 			    {
--- a/bluetoothengine/btui/Ecom/src/BTUIDeviceContainer.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/Ecom/src/BTUIDeviceContainer.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -32,7 +32,7 @@
 #include "debug.h"               
 #include "btui.h" // Global declarations
 
-const TInt KBTNumberOfIcons = 13;    // Number of class of device icons
+const TInt KBTNumberOfIcons = 14;    // Number of class of device icons + extra one DEV_STATUS_AUTHORIZED
 	
 _LIT( DEV_TYPE_COMPUTER,"0\t");
 _LIT( DEV_TYPE_PHONE,"1\t");
--- a/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -48,8 +48,10 @@
 
 #include <gstabhelper.h>
 #include <btui.mbg>						// Tab icon for General Setting
+#include <bluetoothuiutil.h>
 #include "BTUIMainView.h" 				// base View.
 
+
 const TInt KAutoConnect2ndTry = 1;
 const TUint32 SetExcludePairedDeviceMask = 0x800000;
 
@@ -287,6 +289,11 @@
             TBTDevice device;
             device.iIndex = iContainer->CurrentItemIndex();
             iModel->GetDevice(device);
+            if ( device.iStatus & EStatusBtuiConnected )
+                {
+                // If device is already connected, we do nothing here. 
+                break;
+                }
             device.iOperation = EOpConnect;
             ConnectL( device, ETrue );
 	        break;            	
@@ -620,20 +627,15 @@
     device.iIndex = index;
     iModel->GetDevice(device);
 
-    HBufC* stringholder = NULL;
+    RBuf stringholder;
+    CleanupClosePushL( stringholder );
 
 	TInt tmp=EStatusBtuiConnected|EStatusPhysicallyConnected;
     // Choose confirmation phrase
-    //
-    if ( device.iStatus & tmp )
-        {
-        stringholder = StringLoader::LoadLC(R_BT_WARN_ERASE_CONNECTED, 
-        	device.iName);
-        }
-    else
-        {
-        stringholder = StringLoader::LoadLC(R_BT_WARN_ERASE, device.iName );
-        }    
+    TInt resourceId = ( device.iStatus & tmp ) ? R_BT_WARN_ERASE_CONNECTED :
+        R_BT_WARN_ERASE;
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            stringholder, resourceId, device.iName, 0 );
 
     // Create confirmation query
     //
@@ -653,9 +655,9 @@
 		    covercl->BufStream().CommitL(); // no more data to send so commit buf
 		    }  
 		}
-    TInt keypress = dlg->ExecuteLD(R_BT_WARN_ERASE_QUERY, *stringholder);
+    TInt keypress = dlg->ExecuteLD(R_BT_WARN_ERASE_QUERY, stringholder);
 
-    CleanupStack::PopAndDestroy(stringholder);  // stringholder
+    CleanupStack::PopAndDestroy(&stringholder);  // stringholder
 
     if(keypress)  // User has accepted the dialog
         {
@@ -772,19 +774,23 @@
 		
 	HBufC* header= iCoeEnv->AllocReadResourceLC(R_BT_OPTION_BLOCK_DEVICE_HEADER); 
 	
-	HBufC* stringHolder = NULL;
+	RBuf stringHolder;
+	CleanupClosePushL( stringHolder );
+	TInt resouseId;
 	if (device.iStatus & (EStatusBtuiConnected|EStatusPhysicallyConnected) )
-		 stringHolder = StringLoader::LoadLC(
-		 (iHelpEnabled? R_BT_OPTION_BLOCK_CONNECTED_PAIRED_DEVICES_HELP:
-		  R_BT_OPTION_BLOCK_CONNECTED_PAIRED_DEVICES_NOHELP ), 
-		 device.iName);
+	    {
+	    resouseId = iHelpEnabled? R_BT_OPTION_BLOCK_PAIRED_DEVICE_HELP : 
+            R_BT_OPTION_BLOCK_PAIRED_DEVICE_NOHELP;
+	    }
 	else
-		stringHolder = StringLoader::LoadLC(
-		 (iHelpEnabled?R_BT_OPTION_BLOCK_PAIRED_DEVICE_HELP:R_BT_OPTION_BLOCK_PAIRED_DEVICE_NOHELP),
-		 device.iName);
+	    {
+	    resouseId = iHelpEnabled ? R_BT_OPTION_BLOCK_PAIRED_DEVICE_HELP :
+            R_BT_OPTION_BLOCK_PAIRED_DEVICE_NOHELP;
+	    }
+	BluetoothUiUtil::LoadResourceAndSubstringL( 
+	        stringHolder, resouseId, device.iName, 0 );
 	
-	
-	CAknMessageQueryDialog *queryDialog = CAknMessageQueryDialog::NewL (*stringHolder, 
+	CAknMessageQueryDialog *queryDialog = CAknMessageQueryDialog::NewL (stringHolder, 
 	  CAknQueryDialog::EConfirmationTone);		
 	queryDialog->PrepareLC(R_BT_MESSAGE_QUERY);
 	
@@ -816,7 +822,7 @@
         keypress = queryDialog->RunLD();
         }
 	
-	CleanupStack::PopAndDestroy(stringHolder);  				 
+	CleanupStack::PopAndDestroy(&stringHolder);  				 
 	CleanupStack::PopAndDestroy(header);
 	        
 	if(keypress)
@@ -978,11 +984,14 @@
 		TSecondaryDisplayBtuiDialogs aSec,const TDesC& aDevName)
 	{
 	TRAPD(err,
-		HBufC* stringholder = StringLoader::LoadLC(aNoteTextResource , aDevName );
+	        RBuf stringholder;
+	        CleanupClosePushL( stringholder );
+	        BluetoothUiUtil::LoadResourceAndSubstringL( 
+	                stringholder, aNoteTextResource, aDevName, 0 );
 	    aWaitDialog = new (ELeave) CAknWaitDialog(
                     reinterpret_cast<CEikDialog**>(&aWaitDialog), ETrue);
 	    aWaitDialog->PrepareLC(aNoteResource);
-	    aWaitDialog->SetTextL(*stringholder);
+	    aWaitDialog->SetTextL(stringholder);
 
 	    if(iCoverDisplayEnabled)
 	        {
@@ -998,7 +1007,7 @@
 	    aWaitDialog->SetCallback(this); // for capturing Cancel keypress	            
 	    aWaitDialog->RunLD();
 	    
-    	CleanupStack::PopAndDestroy(stringholder); // stringholder
+    	CleanupStack::PopAndDestroy(&stringholder); // stringholder
     );
     // if the above functions leaves the iWaitNote is deleted, but
     // not set to NULL. This will cause a problem, when
@@ -1065,11 +1074,21 @@
     TBTDevice device;
     device.iIndex = index;
     iModel->GetDevice(device);
+    
+    if ( !( device.iStatus & EStatusBtuiConnected) )
+        {
+        // If device is already disconnected, return immediately.
+        return;
+        }
+    
 	iDisconnectQueryDevice = device;//remember device related with query dialog
 
     // Create confirmation query
-    HBufC* stringholder = StringLoader::LoadLC(R_BT_DISCONNECT_FROM, device.iName);
-    if (!iDisconnectQueryDlg)
+    RBuf stringholder;
+    CleanupClosePushL( stringholder );
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            stringholder, R_BT_DISCONNECT_FROM, device.iName, 0 );
+    if ( !iDisconnectQueryDlg )
         {
         iDisconnectQueryDlg = CAknQueryDialog::NewL();
         }
@@ -1086,9 +1105,9 @@
 		    }  
 		}
 			
-    TInt keypress = iDisconnectQueryDlg->ExecuteLD(R_BT_DISCONNECT_FROM_QUERY, *stringholder);
+    TInt keypress = iDisconnectQueryDlg->ExecuteLD(R_BT_DISCONNECT_FROM_QUERY, stringholder);
 
-    CleanupStack::PopAndDestroy(stringholder);  // stringholder
+    CleanupStack::PopAndDestroy(&stringholder);  // stringholder
 
 	iDisconnectQueryDlg = NULL;
     if(keypress)  // User has accepted the dialog
@@ -1189,22 +1208,22 @@
             break;
         case KErrAlreadyExists:	// connection exists allready
         	{
-          	HBufC* stringholder = NULL;
+          	RBuf stringholder;
+          	CleanupClosePushL( stringholder );
           	if(aConflictingDeviceNames && aConflictingDeviceNames->Count()> 0)
         		{        		
         		if(aConflictingDeviceNames->Count() == 1)
         			{
-        			stringholder=StringLoader::LoadLC(R_BT_DISCONNECT_FIRST_PROMPT,
-        			  *(*aConflictingDeviceNames)[0],iCoeEnv );	
+        			BluetoothUiUtil::LoadResourceAndSubstringL( stringholder, 
+        			        R_BT_DISCONNECT_FIRST_PROMPT, 
+        			        *(*aConflictingDeviceNames)[0], 0 );
         			}
         		else
         			{
-        			CPtrC16Array* aa=new(ELeave) CPtrC16Array(1+1);
-       				aa->InsertL(0, *(*aConflictingDeviceNames)[0] );
-        			aa->InsertL(1, *(*aConflictingDeviceNames)[1] );
-        			stringholder=StringLoader::LoadLC(R_BT_DISCONNECT_FIRST_STEREO_PROMPT ,
-        			  *aa,iCoeEnv);
-        			delete(aa);        					
+        			BluetoothUiUtil::LoadResourceAndSubstringL( stringholder, 
+                        R_BT_DISCONNECT_FIRST_STEREO_PROMPT, 
+                        *(*aConflictingDeviceNames)[0], 0 );
+        			BluetoothUiUtil::AddSubstringL( stringholder, *(*aConflictingDeviceNames)[1], 1 );       					
         			}
         		TRACE_INFO(_L("KErrAllreadyExists"))      	  		  
           		}
@@ -1235,8 +1254,8 @@
 			    	}  
 				}
 		
-        	note->ExecuteLD(*stringholder);
-        	CleanupStack::PopAndDestroy(stringholder);
+        	note->ExecuteLD(stringholder);
+        	CleanupStack::PopAndDestroy(&stringholder);
         	}
         	break;	
 		case KErrServerBusy:
@@ -1261,68 +1280,28 @@
             //          
 			CAknInformationNote* notePtr = new (ELeave) CAknInformationNote();
 
-            HBufC* stringHolder = NULL;
+            RBuf stringHolder;
+            CleanupClosePushL( stringHolder );
+            
+            BluetoothUiUtil::LoadResourceAndSubstringL( stringHolder,
+                    R_BT_CONF_CONNECTED_PROMPT, aDevice.iName, 0 );
             
-			if (!FeatureManager::FeatureSupported(KFeatureIdAccessoryFw))
-				{
-            	if (CallOnGoing())
-                	{
-                	stringHolder = StringLoader::LoadLC(R_BT_AUDIOS_ACCESSORY_PROMPT); // qtn_bt_audio_accessory "Audio routed to BT handsfree"            
-                	
-                	if(iCoverDisplayEnabled)
-						{
-						CleanupStack::PushL(notePtr); 			
-				    	notePtr->PublishDialogL(ECmdBtuiShowBtAudioAccessory, KUidCoverUiCategoryBtui); // initializes cover support    
-						CleanupStack::Pop(notePtr); 
-						}
-					
-					notePtr->ExecuteLD(*stringHolder);
-	                }
-	            else
-	                {
-	                TRACE_INFO(_L("No call ongoing. Connected to"))
-	                stringHolder = StringLoader::LoadLC(R_BT_CONF_CONNECTED_PROMPT, aDevice.iName); // "Connected to %U"
-	                
-	                if(iCoverDisplayEnabled)
-						{
-						CleanupStack::PushL(notePtr); 			
-				    	notePtr->PublishDialogL(ECmdBtuiShowBtConfConnected, KUidCoverUiCategoryBtui); // initializes cover support    
-						CleanupStack::Pop(notePtr); 
+            if(iCoverDisplayEnabled)
+                    {
+                    CleanupStack::PushL(notePtr); 			
+                    notePtr->PublishDialogL(ECmdBtuiShowBtConfConnected, KUidCoverUiCategoryBtui); // initializes cover support    
+                    CleanupStack::Pop(notePtr); 
 
-						CAknMediatorFacade* covercl = AknMediatorFacade(notePtr); // uses MOP, so control provided 
-						if (covercl) // returns null if __COVER_DISPLAY is not defined
-					    	{	
-							  covercl->BufStream() <<  BTDeviceNameConverter::ToUTF8L(aDevice.iName);	
-							  covercl->BufStream().CommitL(); // no more data to send so commit buf
-					    	}  
-						}
-	                
-	                notePtr->ExecuteLD(*stringHolder);
-	                }           				
-                }
-            else
-                {
-                TRACE_INFO(_L("AccFW Supported. Connected to"))
-                stringHolder = StringLoader::LoadLC(R_BT_CONF_CONNECTED_PROMPT, aDevice.iName);
+                    CAknMediatorFacade* covercl = AknMediatorFacade(notePtr); // uses MOP, so control provided 
+                    if (covercl) // returns null if __COVER_DISPLAY is not defined
+                        {	
+                            covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(aDevice.iName);	
+                          covercl->BufStream().CommitL(); // no more data to send so commit buf
+                        }  
+                    }
                 
-                if(iCoverDisplayEnabled)
-						{
-						CleanupStack::PushL(notePtr); 			
-				    	notePtr->PublishDialogL(ECmdBtuiShowBtConfConnected, KUidCoverUiCategoryBtui); // initializes cover support    
-						CleanupStack::Pop(notePtr); 
-
-						CAknMediatorFacade* covercl = AknMediatorFacade(notePtr); // uses MOP, so control provided 
-						if (covercl) // returns null if __COVER_DISPLAY is not defined
-					    	{	
-								covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(aDevice.iName);	
-							  covercl->BufStream().CommitL(); // no more data to send so commit buf
-					    	}  
-						}
-	                
-	            notePtr->ExecuteLD(*stringHolder);
-                }           
-                
-            CleanupStack::PopAndDestroy(stringHolder);
+            notePtr->ExecuteLD(stringHolder);        
+            CleanupStack::PopAndDestroy(&stringHolder);
             }
             
             TRAP_IGNORE(LaunchSettingViewL();)
@@ -1330,13 +1309,17 @@
 
         case KErrNotSupported:
             {
-            TRACE_INFO(_L("error = KErrNotSupported"))			
-			
+            TRACE_INFO(_L("error = KErrNotSupported"))
+            
+            RBuf stringHolder;
+            CleanupClosePushL( stringHolder );
+            
+            BluetoothUiUtil::LoadResourceAndSubstringL( stringHolder,
+                    R_BT_DEVICE_NOT_SUPPORTED, aDevice.iName, 0 );
 			
 			// create note
 			//
 			CAknInformationNote* note = new (ELeave) CAknInformationNote();
-            HBufC* stringHolder = StringLoader::LoadLC(R_BT_DEVICE_NOT_SUPPORTED,aDevice.iName);
             
 			if(iCoverDisplayEnabled)
 				{
@@ -1351,8 +1334,8 @@
 						covercl->BufStream().CommitL(); // no more data to send so commit buf
 			    	}  
 				}
-			note->ExecuteLD(*stringHolder);
-        	CleanupStack::PopAndDestroy(stringHolder);
+			note->ExecuteLD(stringHolder);
+        	CleanupStack::PopAndDestroy(&stringHolder);
             }
             break;
 
@@ -1613,14 +1596,17 @@
         }
 	TRACE_FUNC_EXIT		
 	}
+
+
 // ------------------------------------------------------
 // CBTUIPairedDevicesView::ShowDisconnecNote
 // ------------------------------------------------------	
 void CBTUIPairedDevicesView::ShowDisconnecNoteL(TBTDevice *aDevice)
     {
-    HBufC* stringholder = StringLoader::LoadLC(
-      R_BT_DISCONNECT_FIRST_PROMPT, aDevice->iName);
-
+    RBuf stringholder;
+    CleanupClosePushL( stringholder );
+    BluetoothUiUtil::LoadResourceAndSubstringL( 
+            stringholder, R_BT_DISCONNECT_FIRST_PROMPT, aDevice->iName, 0 );
     // Launch a waiting confirmation note
     //
     CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote(ETrue);
@@ -1639,9 +1625,9 @@
         CleanupStack::Pop(note); 				
     	}
 
-    note->ExecuteLD(*stringholder);
+    note->ExecuteLD(stringholder);
 
-    CleanupStack::PopAndDestroy(stringholder); // stringholder    
+    CleanupStack::PopAndDestroy(&stringholder); // stringholder    
     
     }
 
--- a/bluetoothengine/btui/Ecom/src/BTUISap.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/Ecom/src/BTUISap.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -18,7 +18,6 @@
 
 #include <aknnotewrappers.h>
 #include <aknradiobuttonsettingpage.h>
-#include <StringLoader.h>	// localisation stringloader
 #include <BtuiViewResources.rsg>		// Compiled resource ids
 #include <BTSapDomainPSKeys.h>	
 #include <centralrepository.h> 
@@ -29,13 +28,13 @@
 #include <SecondaryDisplay/BtuiSecondaryDisplayAPI.h>
 #include <btfeaturescfg.h>					// For EnterpriseEnablementL()
 #include <btnotif.h>
-
+#include <utf.h>
+#include <bluetoothuiutil.h>
 #include "btdevmodel.h"
 
 #include "debug.h"
 #include "BTUIMainView.h"
 
-#include <utf.h>
 // ----------------------------------------------------
 // CBTUIMainView::SetSapStatusL
 // ----------------------------------------------------
@@ -72,26 +71,28 @@
 				{
 
 				// Create confirmation query
-				HBufC* stringholder = StringLoader::LoadLC( R_BT_DISCONNECT_FROM, connectedSap );
+				RBuf stringholder;
+				CleanupClosePushL( stringholder );
+				BluetoothUiUtil::LoadResourceAndSubstringL( stringholder, 
+				        R_BT_DISCONNECT_FROM, connectedSap, 0 );
 				CAknQueryDialog* dlg = CAknQueryDialog::NewL();
 
 				if(iCoverDisplayEnabled)
 					{
 					CleanupStack::PushL(dlg); 						
 				    dlg->PublishDialogL(ECmdShowDisconnectQuery, KUidCoverUiCategoryBtui); // initializes cover support    
-					CleanupStack::Pop(dlg); 						
-
 					CAknMediatorFacade* covercl = AknMediatorFacade(dlg); // uses MOP, so control provided 
 					if (covercl) // returns null if __COVER_DISPLAY is not defined
 					    {	    
 					    covercl->BufStream() << BTDeviceNameConverter::ToUTF8L(connectedSap);// takes copy so consts are ok too
 					    covercl->BufStream().CommitL(); // no more data to send so commit buf
-					    }  
+					    }
+					CleanupStack::Pop(dlg);
 					}
 					
-				TInt keypress = dlg->ExecuteLD( R_BT_DISCONNECT_FROM_QUERY, *stringholder );
+				TInt keypress = dlg->ExecuteLD( R_BT_DISCONNECT_FROM_QUERY, stringholder );
 
-				CleanupStack::PopAndDestroy(stringholder);	// stringholder
+				CleanupStack::PopAndDestroy(&stringholder);	// stringholder
 
 				if( keypress )	// User has accepted the dialog
 					{
--- a/bluetoothengine/btui/devmodel/src/btpairedmodel.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/devmodel/src/btpairedmodel.cpp	Fri Apr 16 15:08:36 2010 +0300
@@ -419,12 +419,35 @@
             if(di >=0 )
             	{
             	nameArray.Append(&iDeviceArray[di]->iName);
-            	}            	
+            	}
             }
-        if(iObserver )
-        	{
-    		iObserver->NotifyChangeDeviceComplete(aErr, connectedDevice, &nameArray);        	
-        	}            
+
+        // we will unset the connect status of the device if connection failed &
+            // it is found in paired devices.
+        if( index >= 0 )
+            {
+            // add EStatusBtuiConnected status if the device has a profile connection
+            TBTEngConnectionStatus connStatus;
+            iConnMan->IsConnected(connectedDevice.iAddr, connStatus);
+   
+            if (connStatus != EBTEngConnecting && connStatus != EBTEngConnected)
+                {
+                TRACE_INFO(_L("Unset EStatusBtuiConnected"))
+                UnsetStatusFlags(iDeviceArray[index]->iStatus,EStatusBtuiConnected );
+                }
+            }
+        
+        if(iObserver)
+            {
+            //Show only phone issued request complete notes
+            //Do not show notes for device issued request when BTUI is active
+            if ( requestIssuedFromPhone ) 
+                {
+                iObserver->NotifyChangeDeviceComplete(aErr, connectedDevice, &nameArray);
+                }
+               
+            SendRefreshIfNoError(aErr);
+            }
         nameArray.Reset();
         }
     else 
--- a/bluetoothengine/btui/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ b/bluetoothengine/btui/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -28,6 +28,8 @@
 ../rom/BtuiResources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(BtuiResources.iby)
 ../inc/BtuiPluginInterface.h |../../inc/BtuiPluginInterface.h
 ../inc/BtuiPluginInterface.inl |../../inc/BtuiPluginInterface.inl
+../Ecom/inc/bluetoothuiutil.h   |../../inc/bluetoothuiutil.h
+../Ecom/inc/bluetoothuiutil.inl |../../inc/bluetoothuiutil.inl
 // Help exports
 #include "../help/group/bld.inf"
 
--- a/btservices_info/btservices_metadata/btservices_metadata.mrp	Tue Feb 02 00:20:42 2010 +0200
+++ b/btservices_info/btservices_metadata/btservices_metadata.mrp	Fri Apr 16 15:08:36 2010 +0300
@@ -1,3 +1,19 @@
+#
+# 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: 
+#
+
 component           btservices_metadata
 source   \sf\mw\btservices\btservices_info\btservices_metadata 
 source   \sf\mw\btservices\package_definition.xml
--- a/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ b/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -21,6 +21,7 @@
 #include "../btservices_plat/group/bld.inf"
 #include "../btservices_pub/group/bld.inf"
 #include "../bluetoothengine/group/bld.inf"
+#include "../atcommands/group/bld.inf"
 
 PRJ_EXPORTS
 
--- a/tsrc/public/basic/conf/obexservapitest.cfg	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-[Test]
-title Get file system status
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester GetFileSystemStatus
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Get MMC file system status
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester GetMmcFileSystemStatus
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Get message center drive
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester GetMessageCentreDriveL
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Create default mtm service
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester CreateDefaultMtmServiceL
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Get cenrep key int value
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester GetCenRepKeyIntValueL
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Get PubSub key int value
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester GetPubSubKeyIntValue
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Create and remove outpox entry
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester CreateOutBoxEntry
-Message_Handler_Tester RemoveOutBoxEntry
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Crate and remove outpox entry
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester SaveObjToInbox
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Save object to inbox
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester SaveObjToInbox
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Create and save attacment
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester CreateEntryToInbox
-Message_Handler_Tester SaveRFileObjectToInbox
-delete Message_Handler_Tester
-[Endtest] 
-[Test]
-title Create and Remove attacment
-create obexservapitest Message_Handler_Tester
-Message_Handler_Tester CreateEntryToInbox
-Message_Handler_Tester RemoveObjectFromInbox
-delete Message_Handler_Tester
-[Endtest] 
-
--- a/tsrc/public/basic/conf/test.xml	Tue Feb 02 00:20:42 2010 +0200
+++ b/tsrc/public/basic/conf/test.xml	Fri Apr 16 15:08:36 2010 +0300
@@ -34,24 +34,7 @@
                             <param component-path="LCDo_APITestDrop/general"/>
                         </params>
                     </step>
-                    <step id="1.1.1.1.1.3" name="Install obex service test module" harness="STIF" significant="false">
-                        <command>install</command>
-                        <params>
-                            <param type="binary"/>
-                            <param src="obexservapitest.dll"/>
-                            <param dst="c:\sys\bin\obexservapitest.dll"/>
-                            <param component-path="LCDo_APITestDrop/components"/>
-                        </params>
-                    </step> 
-                    <step id="1.1.1.1.1.4" name="Install obex service test script" harness="STIF" enabled="true" passrate="100" significant="false">
-                        <command>install</command>
-                        <params>
-                            <param src="obexservapitest.cfg"/>
-                            <param dst="e:\testing\obexservapitest.cfg"/>
-                            <param component-path="LCDo_APITestDrop/general"/>
-                        </params>
-                    </step>
-                    <step id="1.1.1.1.1.5" name="Install AT EXT plugin API test module" harness="STIF" significant="false">
+                    <step id="1.1.1.1.1.3" name="Install AT EXT plugin API test module" harness="STIF" significant="false">
                         <command>install</command>
                         <params>
                             <param type="binary"/>
@@ -61,7 +44,7 @@
                         </params>
                     </step> 
                     
-                    <step id="1.1.1.1.1.6" name="Install AT EXT plugin API test script" harness="STIF" enabled="true" passrate="100" significant="false">
+                    <step id="1.1.1.1.1.4" name="Install AT EXT plugin API test script" harness="STIF" enabled="true" passrate="100" significant="false">
                         <command>install</command>
                         <params>
                             <param src="atextpluginapi_scripter.cfg"/>
@@ -70,7 +53,7 @@
                         </params>
                     </step>   
                     
-                    <step id="1.1.1.1.1.7" name="Install AT EXT plugin STUB" harness="STIF" significant="false">
+                    <step id="1.1.1.1.1.5" name="Install AT EXT plugin STUB" harness="STIF" significant="false">
                         <command>install</command>
                         <params>
                             <param type="binary"/>
@@ -79,7 +62,7 @@
                             <param component-path="LCDo_APITestDrop/components"/>
                         </params>
                     </step>
-                    <step id="1.1.1.1.1.8" name="Install AT EXT plugin STUB rsc" harness="STIF" significant="false">
+                    <step id="1.1.1.1.1.6" name="Install AT EXT plugin STUB rsc" harness="STIF" significant="false">
                         <command>install</command>
                         <params>
                             <param src="atextpluginstub.rsc"/>
@@ -89,39 +72,25 @@
                     </step>                    
                     
                                         
-										<step id="1.1.1.1.1.9" name="Create CTC log dir" harness="STIF" enabled="true" passrate="100" significant="false">
+										<step id="1.1.1.1.1.7" name="Create CTC log dir" harness="STIF" enabled="true" passrate="100" significant="false">
 												<command>makedir</command>
 														<params>
 																<param dir="c:\data\ctc\"/>
 														</params>
 										</step>
-                		<step id="1.1.1.1.1.10" name="Make logging dir" harness="STIF" enabled="true" passrate="100" significant="false">
+                		<step id="1.1.1.1.1.8" name="Make logging dir" harness="STIF" enabled="true" passrate="100" significant="false">
                     		<command>makedir</command>
                     		<params>
                         		<param dir="e:\logs\btengapitest"/>
                     		</params>
-                		</step>
-                		<step id="1.1.1.1.1.11" name="Make logging dir" harness="STIF" enabled="true" passrate="100" significant="false">
-                    		<command>makedir</command>
-                    		<params>
-                        		<param dir="e:\logs\ObexServAPItest"/>
-                    		</params>
-                		</step>         
-                		<step id="1.1.1.1.1.12" name="Make logging dir" harness="STIF" enabled="true" passrate="100" significant="false">
+                		</step>       
+                		<step id="1.1.1.1.1.9" name="Make logging dir" harness="STIF" enabled="true" passrate="100" significant="false">
                     		<command>makedir</command>
                     		<params>
                         		<param dir="e:\logs\atextpluginapitest"/>
                     		</params>
                 		</step>                    		       		
-		                <step id="1.1.1.1.1.101" name="Test obex service APIs" harness="STIF" enabled="true" passrate="100" significant="true">
-		                    <command>run-cases</command>
-		                    <params>
-		        							<param module="TestScripter"/>
-		        							<param testcase-file="e:\testing\obexservapitest.cfg"/>
-		        							<param timeout="6000"/>
-		                    </params>
-		                </step>	
-		                <step id="1.1.1.1.1.102" name="Test bteng APIs" harness="STIF" enabled="true" passrate="100" significant="true">
+		                <step id="1.1.1.1.1.101" name="Test bteng APIs" harness="STIF" enabled="true" passrate="100" significant="true">
 		                    <command>run-cases</command>
 		                    <params>
 		        							<param module="TestScripter"/>
@@ -129,7 +98,7 @@
 		        							<param timeout="6000"/>		        							
 		                    </params>
 		                </step>
-		                <step id="1.1.1.1.1.103" name="Test AT EXT Plugin APIs" harness="STIF" enabled="true" passrate="100" significant="true">
+		                <step id="1.1.1.1.1.102" name="Test AT EXT Plugin APIs" harness="STIF" enabled="true" passrate="100" significant="true">
 		                    <command>run-cases</command>
 		                    <params>
 		        							<param module="TestScripter"/>
@@ -162,18 +131,11 @@
                     <step id="1.1.1.1.1.203" name="Fetch test results" harness="STIF" enabled="true" passrate="100" significant="false">
                        <command>fetch-log</command>
                            <params>
-                               <param path="e:\logs\ObexServAPItest\*"/>
-                               <param delete="true"/>
-                           </params>                                                 
-                   </step>
-                    <step id="1.1.1.1.1.204" name="Fetch test results" harness="STIF" enabled="true" passrate="100" significant="false">
-                       <command>fetch-log</command>
-                           <params>
                                <param path="e:\logs\atextpluginapitest\*"/>
                                <param delete="true"/>
                            </params>                                                     
                    </step>          
-                    <step id="1.1.1.1.1.205" name="Fetch test results" harness="STIF" enabled="true" passrate="100" significant="false">
+                    <step id="1.1.1.1.1.204" name="Fetch test results" harness="STIF" enabled="true" passrate="100" significant="false">
                        <command>fetch-log</command>
                            <params>
                                <param path="c:\data\ctc\ctcdata.txt"/>
@@ -188,12 +150,10 @@
     		<file>LCDo_APITestDrop/images/LCDo_test_API_rnd.fpsx</file>
         <file>LCDo_APITestDrop/images/LCDo_test_API_rnd_erase.fpsx</file>
         <file>LCDo_APITestDrop/components/armv5_urel/btengapitest.dll</file>
-        <file>LCDo_APITestDrop/components/armv5_urel/obexservapitest.dll</file>
         <file>LCDo_APITestDrop/components/armv5_urel/atextpluginapitest.dll</file>
         <file>LCDo_APITestDrop/components/armv5_urel/atextpluginstub.dll</file>        
         <file>LCDo_APITestDrop/general/atextpluginstub.rsc</file>
         <file>LCDo_APITestDrop/general/btengapi_scripter.cfg</file>
-        <file>LCDo_APITestDrop/general/obexservapitest.cfg</file>
         <file>LCDo_APITestDrop/general/atextpluginapi_scripter.cfg</file>
     </files>
 
--- a/tsrc/public/basic/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ b/tsrc/public/basic/group/bld.inf	Fri Apr 16 15:08:36 2010 +0300
@@ -19,7 +19,6 @@
 PRJ_PLATFORMS
 DEFAULT
 #include "../btengapitest/group/bld.inf"
-#include "../obexservapitest/group/bld.inf"
 #include "../atextpluginapitest/group/bld.inf"
 
 //build files for shortlinkconn
--- a/tsrc/public/basic/obexservapitest/Bmarm/ObexServAPItestU.DEF	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-EXPORTS
-	LibEntryL__FR13CTestModuleIf @ 1 NONAME R3UNUSED ; LibEntryL(CTestModuleIf &)
-
--- a/tsrc/public/basic/obexservapitest/Bwins/ObexServAPItestU.DEF	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-EXPORTS
-	?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * __cdecl LibEntryL(class CTestModuleIf &)
-
--- a/tsrc/public/basic/obexservapitest/EABI/ObexServAPItestU.def	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-EXPORTS
-	_Z9LibEntryLR13CTestModuleIf @ 1 NONAME
-
--- a/tsrc/public/basic/obexservapitest/group/bld.inf	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
-* 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:  ?Description
-*
-*/
-
-
-
-PRJ_PLATFORMS
-// specify the platforms your component needs to be built for here
-// defaults to WINS MARM so you can ignore this if you just build these
-DEFAULT
-
-PRJ_TESTEXPORTS
-// NOTE: If using ARS requirements all export operations should be done under this.
-// 'abld test export'
-
-PRJ_EXPORTS
-// Specify the source file followed by its destination here
-// copy will be used to copy the source file to its destination
-// If there's no destination then the source file will be copied
-// to the same name in /epoc32/include
-// Example: 
-/*
-/agnmodel/inc/AGMCOMON.H
-*/
-
-PRJ_TESTMMPFILES
-// NOTE: If using ARS requirements .mmp file operation should be done under this.
-// 'abld test build'
-
-PRJ_MMPFILES
-// Specify the .mmp files required for building the important component
-// releasables.
-//
-// Specify "tidy" if the component you need to build doesn't need to be
-// released. Specify "ignore" if the MMP file exists but should be
-// ignored.
-// Example:
-/*
-/agnmodel/group/agnmodel.mmp
-#if defined(MARM)
-/agnmodel/group/agsvexe.mmp
-#endif
-*/
-obexservapitest.mmp
-
-//  End of File
\ No newline at end of file
--- a/tsrc/public/basic/obexservapitest/group/obexservapitest.mmp	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*TYPE TESTCLASS*/
-/*
-* 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:  ?Description
-*
-*/
-
-
-#if defined(__S60_)
-        // To get the OS_LAYER_SYSTEMINCLUDE-definition
-        #include <platform_paths.hrh>
-#endif
-
-TARGET          obexservapitest.dll
-TARGETTYPE      dll
-UID             0x1000008D 0x101FB3E3
-
-CAPABILITY      ALL -TCB
-/* Remove comments and replace 0x00000000 with correct vendor id */
-// VENDORID     0x00000000
-/* Remove comments and replace 0x00000000 with correct secure id */
-// SECUREID     0x00000000
-
-//TARGETPATH      ?target_path
-DEFFILE         ObexServAPItest.def
-
-SOURCEPATH      ../src
-SOURCE          ObexServAPItest.cpp
-SOURCE          ObexServAPItestBlocks.cpp
-SOURCE          testlogger.cpp
-
-
-USERINCLUDE     ../inc 
-
-MW_LAYER_SYSTEMINCLUDE
-
-
-LIBRARY         euser.lib
-LIBRARY         stiftestinterface.lib
-LIBRARY         sysutil.lib
-LIBRARY         obexutils.lib
-LIBRARY         irobex.lib
-LIBRARY         efsrv.lib
-
-LANG            SC
-
-// End of File
--- a/tsrc/public/basic/obexservapitest/inc/ObexServAPItest.h	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-/*
-* 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:  ?Description
-*
-*/
-
-
-
-#ifndef OBEXSERVAPITEST_H
-#define OBEXSERVAPITEST_H
-
-//  INCLUDES
-#include <StifLogger.h>
-#include <TestScripterInternal.h>
-#include <StifTestModule.h>
-#include <ObexUtilsMessageHandler.h>
-#include "testlogger.h"
-
-
-// FORWARD DECLARATIONS
-class CObexServAPItest;
-
-
-// CLASS DECLARATION
-
-/**
-*  CObexServAPItest test class for STIF Test Framework TestScripter.
-*/
-NONSHARABLE_CLASS(CObexServAPItest) : public CScriptBase
-    {
-    public:  // Constructors and destructor
-
-        /**
-        * Two-phased constructor.
-        */
-        static CObexServAPItest* NewL( CTestModuleIf& aTestModuleIf );
-
-        /**
-        * Destructor.
-        */
-        virtual ~CObexServAPItest();
-
-    public: // New functions
-
-       
-
-    public: // Functions from base classes
-
-        /**
-        * From CScriptBase Runs a script line.
-        * @since ?Series60_version
-        * @param aItem Script line containing method name and parameters
-        * @return Symbian OS error code
-        */
-        virtual TInt RunMethodL( CStifItemParser& aItem );
-
-    
-
-    private:
-
-        /**
-        * C++ default constructor.
-        */
-        CObexServAPItest( CTestModuleIf& aTestModuleIf );
-
-        /**
-        * By default Symbian 2nd phase constructor is private.
-        */
-        void ConstructL();
-
-        // Prohibit copy constructor if not deriving from CBase.
-        // ?classname( const ?classname& );
-        // Prohibit assigment operator if not deriving from CBase.
-        // ?classname& operator=( const ?classname& );
-
-        /**
-        * Frees all resources allocated from test methods.
-        * @since ?Series60_version
-        */
-        void Delete();
-        
-        void TestCompleted( TInt aErr, const TUint8* aFunc, const TDesC& aArg );
-
-        /**
-        * Test methods are listed below. 
-        */
-
-        /**
-        * Test code for getting file system status.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt GetFileSystemStatusL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for getting mmc file system status.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt GetMmcFileSystemStatusL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for getting message center drive. 
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt GetMessageCentreDriveL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for creating Default MTM services.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt CreateDefaultMtmServiceL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for Getting CenRep key.    .    
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt GetCenRepKeyIntValueL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for Getting PubSub key.    
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt GetPubSubKeyIntValueL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for Creating outbox entry.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt CreateOutBoxEntryL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for removing outbox entry.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt RemoveOutBoxEntryL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for save received file to inbox. 
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt SaveObjToInboxL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for creating entry to inbox.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt CreateEntryToInboxL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for creating entry to inbox.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt SaveRFileObjectToInboxL( CStifItemParser& aItem );
-        
-        /**
-        * Test code for removing entry to inbox.
-        * @since ?Series60_version
-        * @param aItem Script line containing parameters.
-        * @return Symbian OS error code.
-        */
-        virtual TInt RemoveObjectL( CStifItemParser& aItem );
-        
-     
-
-    private:    // Data
-        
-        
-        
-         TMsvId           iMessageServerIndex;
-         CObexBufObject*  iObexObject; 
-         RFile            iFile;
-         CBufFlat*        iBuf; 
-         CObexTestLogger* iTestLogger;
-
-    };
-
-#endif      // OBEXSERVAPITEST_H
-
-// End of File
--- a/tsrc/public/basic/obexservapitest/inc/testlogger.h	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
-* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies 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 BTTESTLOGGER_H
-#define BTTESTLOGGER_H
-
-// INCLUDES
-#include <e32base.h>
-
-// FORWARD DECLARATIONS
-class CStifLogger;
-class CTestModuleIf;
-
-#define TLFUNCLOG (TUint8*) __FUNCTION__
-
-// CLASS DECLARATION
-
-NONSHARABLE_CLASS( CObexTestLogger ) : public CBase
-{
-	public:
-	
-		static CObexTestLogger* NewL(const CTestModuleIf* aTestModuleIf);
-		virtual ~CObexTestLogger();
-
-	public: // Data used by functions
-
-		enum TLogLevel {ETLError, ETLResult, ETLInfo, ETLDebug};
-
-	public: // New functions
-	
-		TBool GetEnabled() const;
-		CStifLogger* GetLogger() const;
-		const CTestModuleIf* GetTestModuleIf() const;
-		TInt Log(TLogLevel aLevel, TRefByValue<const TDesC8> aLogText, ...) const;
-		TInt Log(const TDesC& aCategory, TRefByValue<const TDesC8> aLogText, ...) const;
-		TInt Log(TLogLevel aLevel, TRefByValue<const TDesC16> aLogText, ...) const;
-		TInt Log(const TDesC& aCategory, TRefByValue<const TDesC16> aLogText, ...) const;
-		TInt LogResult( const TDesC8& aFunc, const TDesC& aArg, TInt aRes ) const;
-		TInt LogNewLine() const;
-		void SetEnabled(TBool aEnabled);
-		void SetLogger(CStifLogger* aLog);
-		void SetTestModuleIf(const CTestModuleIf* aTestModuleIf);
-
-	public: // Functions from base classes
-
-	private:  // New functions
-
-		TInt WriteLog(TLogLevel aLevel, TDes16& aLog) const;
-		TInt WriteLog(const TDesC16& aCategory, const TDesC16& aLog) const;
-		static TPtrC GetPrefix(TLogLevel aLevel);
-		TInt CheckLogFile();
-		void LogHeadSectionL();
-		void LogTimeStampL(TDes& aBuf, TBool aTime = ETrue) const;
-
-	private:  // Constructors
-	
-		CObexTestLogger(const CTestModuleIf* aTestModuleIf);
-		void ConstructL();
-
-	public:     // Data
-		static const TInt KPrefixLength;
-
-	private:    // Data
-
-		TBool iEnabled;
-		CStifLogger* iLog;
-		const CTestModuleIf* iTestModuleIf;
-	};
-
-#endif // BTTESTLOGGER_H
-
--- a/tsrc/public/basic/obexservapitest/rom/obexservapitest.iby	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
-* Copyright (c) 2007-2007 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies 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 description file for project bteng
-*
-*/
-
-#ifndef BTENGAPITEST_IBY
-#define BTENGAPITEST_IBY
-
-#include <data_caging_paths_for_iby.hrh>
-
-file=ABI_DIR\BUILD_DIR\ObexServAPItest.dll			SHARED_LIB_DIR\ObexServAPItest.dll
-
-#endif // BTENGAPITEST_IBY
--- a/tsrc/public/basic/obexservapitest/src/ObexServAPItest.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-/*
-* 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:  ?Description
-*
-*/
-
-
-
-// INCLUDE FILES
-#include <Stiftestinterface.h>
-#include "ObexServAPItest.h"
-
-// EXTERNAL DATA STRUCTURES
-//extern  ?external_data;
-
-// EXTERNAL FUNCTION PROTOTYPES  
-//extern ?external_function( ?arg_type,?arg_type );
-
-// CONSTANTS
-//const ?type ?constant_var = ?constant;
-
-// MACROS
-//#define ?macro ?macro_def
-
-// LOCAL CONSTANTS AND MACROS
-//const ?type ?constant_var = ?constant;
-//#define ?macro_name ?macro_def
-
-// MODULE DATA STRUCTURES
-//enum ?declaration
-//typedef ?declaration
-
-// LOCAL FUNCTION PROTOTYPES
-//?type ?function_name( ?arg_type, ?arg_type );
-
-// FORWARD DECLARATIONS
-//class ?FORWARD_CLASSNAME;
-
-// ============================= LOCAL FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// ?function_name ?description.
-// ?description
-// Returns: ?value_1: ?description
-//          ?value_n: ?description_line1
-//                    ?description_line2
-// -----------------------------------------------------------------------------
-//
-/*
-?type ?function_name(
-    ?arg_type arg,  // ?description
-    ?arg_type arg)  // ?description
-    {
-
-    ?code  // ?comment
-
-    // ?comment
-    ?code
-    }
-*/
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::CObexServAPItest
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CObexServAPItest::CObexServAPItest( 
-    CTestModuleIf& aTestModuleIf ):
-        CScriptBase( aTestModuleIf )
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CObexServAPItest::ConstructL()
-    {
-    
-    iTestLogger = CObexTestLogger::NewL( &TestModuleIf() );         
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CObexServAPItest* CObexServAPItest::NewL( 
-    CTestModuleIf& aTestModuleIf )
-    {
-    CObexServAPItest* self = new (ELeave) CObexServAPItest( aTestModuleIf );
-
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-
-    return self;
-
-    }
-
-// Destructor
-CObexServAPItest::~CObexServAPItest()
-    { 
-
-    // Delete resources allocated from test methods
-    Delete();
-
-    // Delete logger
-    delete iTestLogger; 
-    iTestLogger = NULL;
-    }
-
-// ========================== OTHER EXPORTED FUNCTIONS =========================
-
-// -----------------------------------------------------------------------------
-// LibEntryL is a polymorphic Dll entry point.
-// Returns: CScriptBase: New CScriptBase derived object
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CScriptBase* LibEntryL( 
-    CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
-    {
-
-    return ( CScriptBase* ) CObexServAPItest::NewL( aTestModuleIf );
-
-    }
-
-
-//  End of File
--- a/tsrc/public/basic/obexservapitest/src/ObexServAPItestBlocks.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,412 +0,0 @@
-/*
-* 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:  ?Description
-*
-*/
-
-
-
-// INCLUDE FILES
-#include <e32svr.h>
-#include <StifParser.h>
-#include <Stiftestinterface.h>
-#include <btmsgtypeuid.h>
-#include <UiklafInternalCRKeys.h>
-#include <UikonInternalPSKeys.h>
-#include <obexutils.rsg>
-#include <obex.h>
-#include "testlogger.h"
-#include "ObexServAPItest.h"
-
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::Delete
-// Delete here all resources allocated and opened from test methods. 
-// Called from destructor. 
-// -----------------------------------------------------------------------------
-//
-void CObexServAPItest::Delete() 
-    {
-    delete iObexObject;
-    iObexObject = NULL;
-    delete iBuf;
-    iBuf = NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::RunMethodL
-// Run specified method. Contains also table of test mothods and their names.
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::RunMethodL( 
-    CStifItemParser& aItem ) 
-    {
-
-    static TStifFunctionInfo const KFunctions[] =
-        {  
-        // Copy this line for every implemented function.
-        // First string is the function name used in TestScripter script file.
-        // Second is the actual implementation member function. 
-        ENTRY( "GetFileSystemStatus", CObexServAPItest::GetFileSystemStatusL ),
-        ENTRY( "GetMmcFileSystemStatus", CObexServAPItest::GetMmcFileSystemStatusL ),
-        ENTRY( "GetMessageCentreDriveL", CObexServAPItest::GetMessageCentreDriveL ),
-        ENTRY( "CreateDefaultMtmServiceL", CObexServAPItest::CreateDefaultMtmServiceL ),
-        ENTRY( "GetCenRepKeyIntValueL", CObexServAPItest::GetCenRepKeyIntValueL ),
-        ENTRY( "GetPubSubKeyIntValue", CObexServAPItest::GetPubSubKeyIntValueL ),
-        ENTRY( "CreateOutBoxEntry", CObexServAPItest::CreateOutBoxEntryL ),
-        ENTRY( "RemoveOutBoxEntry", CObexServAPItest::RemoveOutBoxEntryL ),
-        ENTRY( "SaveObjToInbox", CObexServAPItest::SaveObjToInboxL ),
-        ENTRY( "CreateEntryToInbox", CObexServAPItest::CreateEntryToInboxL ),
-        ENTRY( "SaveRFileObjectToInbox", CObexServAPItest::SaveRFileObjectToInboxL ),
-        ENTRY( "RemoveObjectFromInbox", CObexServAPItest::RemoveObjectL ),
-        };
-
-    const TInt count = sizeof( KFunctions ) / 
-                        sizeof( TStifFunctionInfo );
-
-    return RunInternalL( KFunctions, count, aItem );
-
-    }
-    
- // -----------------------------------------------------------------------------
-// CBtApiTest::TestCompleted
-// -----------------------------------------------------------------------------
-//  
-void CObexServAPItest::TestCompleted( TInt aErr, const TUint8* aFunc, const TDesC& aArg )
-    {
-    iTestLogger->LogResult( (TPtrC8( aFunc )), aArg, aErr );
-    Signal( aErr );
-    }
-       
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::GetFileSystemStatusL
-// Test code for getting file system status.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::GetFileSystemStatusL( CStifItemParser& /*aItem*/ )
-    {
-    // Print to log file
-    TInt retVal=TObexUtilsMessageHandler::GetFileSystemStatus();
-    if (retVal == 0 || retVal == KErrDiskFull)
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("GetFileSystemStatusL"));
-        }
-    else
-        {
-        TestCompleted( retVal, TLFUNCLOG, _L("Error getting files ystem status"));    
-        }    
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::GetMmcFileSystemStatusL
-// Test code for getting mmc file system status.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::GetMmcFileSystemStatusL( CStifItemParser& /*aItem*/ )
-    {
-    TInt retVal=TObexUtilsMessageHandler::GetMmcFileSystemStatus();
-    if (retVal == 0 || retVal == KErrDiskFull)
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("GetFileSystemStatusL"));
-        }
-    else
-        {
-        TestCompleted( retVal, TLFUNCLOG, _L("Error getting files ystem status"));    
-        }    
-
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::GetMessageCentreDriveL
-// Test code for getting message center drive. 
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::GetMessageCentreDriveL( CStifItemParser& /*aItem*/ )
-    {
-    
-    TInt retVal = TObexUtilsMessageHandler::GetMessageCentreDriveL();
-    if (retVal >= 0 )
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("GetMessageCentreDrive"));
-        }
-    else
-        {
-        TestCompleted( retVal, TLFUNCLOG, _L("GetMessageCentreDrive failed"));    
-        }    
-
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::CreateDefaultMtmServiceL
-// Test code for creating Default MTM services.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::CreateDefaultMtmServiceL( CStifItemParser& /*aItem*/ )
-    {
-
-    TRAPD(error, TObexUtilsMessageHandler::CreateDefaultMtmServiceL(KUidMsgTypeBt) );
-    if (error == KErrNone)
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("CreateDefaultMtmServiceL"));        
-        }
-    else
-        {
-        TestCompleted( error, TLFUNCLOG, _L("CreateDefaultMtmServiceL"));                       
-        }
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::GetCenRepKeyIntValueL
-// Test code for Getting CenRep key.    
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::GetCenRepKeyIntValueL( CStifItemParser&  /*aItem*/ )
-    {
-    TInt limit=0;    
-    TInt error=0;
-    TRAPD(leaveVal, error = TObexUtilsMessageHandler::GetCenRepKeyIntValueL(KCRUidUiklaf,
-                                                                KUikOODDiskCriticalThreshold,
-                                                                limit));
-    if( leaveVal != KErrNone ) 
-        {
-        TestCompleted( leaveVal, TLFUNCLOG, _L("GetCenRepKeyIntValueL leaves"));                       
-        }    
-    else if (error == KErrNone)
-        {
-        TestCompleted( leaveVal, TLFUNCLOG, _L("GetCenRepKeyIntValue return error"));                       
-        }   
-    else
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("GetCenRepKeyIntValueL"));                           
-        }    
-    
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::GetPubSubKeyIntValueL
-// Test code for Getting PubSub key.    
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::GetPubSubKeyIntValueL( CStifItemParser& /*aItem*/ )
-    {
-    TInt status = KErrNone;
-    TInt retVal = KErrNone;
-    
-    TRAPD(leaveVal, retVal = TObexUtilsMessageHandler::GetPubSubKeyIntValue(KPSUidUikon, KUikFFSFreeLevel, status));
-    
-    if( leaveVal != KErrNone ) 
-        {
-        TestCompleted( leaveVal, TLFUNCLOG, _L("GetPubSubKeyIntValueL leaves"));                       
-        }    
-    else if (retVal == KErrNone)
-        {
-        TestCompleted( retVal, TLFUNCLOG, _L("GetPubSubKeyIntValueL return error"));                       
-        }   
-    else
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("GetPubSubKeyIntValue"));                           
-        }  
-
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::OutBoxEntryL
-// Test code for Creating outbox entry.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::CreateOutBoxEntryL( CStifItemParser& /*aItem*/ )
-    {    
-    TRAPD(error, iMessageServerIndex = TObexUtilsMessageHandler::CreateOutboxEntryL( KUidMsgTypeBt, R_BT_SEND_OUTBOX_SENDING ));  
-    if( error != KErrNone)
-        {
-        TestCompleted( error, TLFUNCLOG, _L("CreateOutBoxEntryL leaves")); 
-        }
-    else     
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("CreateOutBoxEntryL"));     
-        }
-
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::OutBoxEntryL
-// Test code for removing outbox entry.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::RemoveOutBoxEntryL( CStifItemParser& /*aItem*/ )
-    {   
-    
-    TRAPD(error, TObexUtilsMessageHandler::DeleteOutboxEntryL( iMessageServerIndex ));
-    if( error != KErrNone)
-        {
-        TestCompleted( error, TLFUNCLOG, _L("RemoveOutBoxEntryL leaves")); 
-        }
-    else     
-        {
-        TestCompleted( KErrNone, TLFUNCLOG, _L("RemoveOutBoxEntryL"));     
-        }
-    return KErrNone;
-
-    }
-    
-// -----------------------------------------------------------------------------
-// CObexServAPItest::SaveObjToInboxL
-// Test code for save received file to inbox. 
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::SaveObjToInboxL( CStifItemParser& /*aItem*/ )
-    {   
-    
-    CObexBufObject* obexobject = CObexBufObject::NewL( NULL );
-    CleanupStack::PushL(obexobject);    
-    
-    TRAP_IGNORE(TObexUtilsMessageHandler::SaveObjToInboxL(obexobject ,
-                                              KNullDesC, 
-                                              KUidMsgTypeBt ));
-    TestCompleted( KErrNone, TLFUNCLOG, _L("SaveObjToInboxL leaves")); 
-    
-    CleanupStack::PopAndDestroy(obexobject);
-    return KErrNone;
-
-    }
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::CreateAndSaveObjectL
-// Test code for creating entry to inbox.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::CreateEntryToInboxL( CStifItemParser& /*aItem*/ )
-    {
-    iFile = RFile();
-    
-    if ( iObexObject)
-        {
-        delete iObexObject;
-        iObexObject = NULL;
-        }
-        
-    iObexObject = CObexBufObject::NewL( NULL );
-    
-    TRAPD( error, TObexUtilsMessageHandler::CreateInboxAttachmentL( iObexObject,
-                                                      KUidMsgTypeBt,
-                                                      iMessageServerIndex,
-                                                      iFile));
-                                                      
-                                                      
-    iBuf = CBufFlat::NewL(1024);
-    iBuf->ResizeL(1024);
-    
-    TObexRFileBackedBuffer bufferdetails(*iBuf,iFile,CObexBufObject::EDoubleBuffering);    
-    
-    TRAP_IGNORE( iObexObject->SetDataBufL( bufferdetails) );
-    
-                                                      
-                                                      
-    iFile.Write(_L8("test"));    
-    iObexObject->SetNameL(_L("test.txt"));        
-    
-    if( error != KErrNone)
-        {
-        TestCompleted( error, TLFUNCLOG, _L("CreateEntryToInboxL leaves")); 
-        }    
-    else     
-        {
-        TestCompleted( error, TLFUNCLOG, _L("CreateEntryToInboxL"));     
-        }         
-    return KErrNone;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CObexServAPItest::CreateAndSaveObjectL
-// Test code for creating entry to inbox.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::SaveRFileObjectToInboxL( CStifItemParser& /*aItem*/ )
-    {
-    TRAPD( error, TObexUtilsMessageHandler::SaveObjToInboxL(
-            iObexObject,
-            iFile,
-            iMessageServerIndex));
-    
-    delete iBuf;
-    iBuf = NULL;
-    if( error != KErrNone)
-        {
-        TestCompleted( error, TLFUNCLOG, _L("SaveObjToInboxL leaves")); 
-        }
-    else     
-        {
-        TestCompleted( error, TLFUNCLOG, _L("SaveObjToInboxL"));     
-        }                                          
-    
-    return KErrNone;
-    }
-    
-// -----------------------------------------------------------------------------
-// CObexServAPItest::RemoveObjectL
-// Test code for removing entry to inbox.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CObexServAPItest::RemoveObjectL( CStifItemParser& /*aItem*/ )
-    {
-    TRAPD(error,TObexUtilsMessageHandler::RemoveInboxEntriesL(iObexObject, iMessageServerIndex));    
-    delete iBuf;
-    iBuf = NULL;
-    if( error != KErrNone)
-        {
-        TestCompleted( error, TLFUNCLOG, _L("SaveObjToInboxL leaves")); 
-        }
-    else     
-        {
-        TestCompleted( error, TLFUNCLOG, _L("SaveObjToInboxL"));     
-        }                                              
-    return KErrNone;
-    }
-
-
-// ========================== OTHER EXPORTED FUNCTIONS =========================
-// None
-
-//  End of File
--- a/tsrc/public/basic/obexservapitest/src/testlogger.cpp	Tue Feb 02 00:20:42 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,530 +0,0 @@
-/*
-* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-// INCLUDES
-
-#include "testlogger.h"
-
-#include <StifTestModule.h>
-#include <StifLogger.h>
-
-#include <e32std.h>
-#include <f32file.h>
-#include <sysutil.h>
-
-// RDebug
-#include <e32debug.h>
-
-const TInt CObexTestLogger::KPrefixLength = 8;
-// Timestamp string length
-const TInt KTimeStampStrLen = 21;
-// Extended Timestamp string length
-const TInt KExtTimeStampStrLen = 40;
-// Extended time stamp
-typedef TBuf<KExtTimeStampStrLen> TExtTimeStamp;
-// Logging path
-_LIT( KObexServAPITestSystemLogPath, "e:\\logs\\ObexServAPItest\\" );
-// Log file
-_LIT( KObexServAPITestSystemLogFile, "ObexServAPItest.html" );
-// Log file
-_LIT( KObexServAPITestSystemLogFullName, "\\logs\\ObexServAPItest\\ObexServAPItest%x.html" );
-// Time stamp format string
-_LIT( KFormatTimeStamp, "<br/>[%H:%T:%S.%*C4] " );
-// Date format string
-_LIT( KFormatDate, "%F%D %N %Y" );
-// HTML header section
-_LIT( KHtmlHeadSection, "<html>\n<head>\n<title>Obex Message Handler Test System results</title>\n<style type=\"text/css\">\n.res, .case { display: inline; }\n</style>\n</head>\n\n<body onLoad=\"FormatResults();\">\n\n" );
-// HTML code which will display the statistics
-_LIT( KHtmlStatSection, "<p>Logfile created on %S at %S<br />\nS60 version %S</p>\n\n<div id=\"stats\"></div>\n<br />\n\n" );
-// HTML identifier for test case start
-_LIT( KHtmlTestCaseStart, "<div class=\"case\">" );
-// Test case result logging
-_LIT( KTestCaseResult, "Test completed; function %S, parameter %S, result <div class=\"res\">%d</div></div>" );
-// JavaScript function for calculating test result
-#define KJSSECTION _L( "<script type=\"text/javascript\">\nfunction FormatResults() { \
-\n\tvar tl = document.getElementsByTagName( \"div\" );\n\tvar passed = 0, failed = 0, testcases = 0; \
-\n\tfor( var i = 0; i < tl.length; i++ ) {\n\t\tif( tl[i].className == \"case\" ) {\n\t\t\ttestcases++;\n\t\t\t} \
-\n\t\tif( tl[i].className == \"res\" ) {\n\t\t\tif( tl[i].innerHTML == 0 ) {\n\t\t\t\tpassed++;\n\t\t\t\t} \
-\n\t\t\telse {\n\t\t\t\tfailed++;\n\t\t\t\ttl[i].parentNode.style.color = \"red\";\n\t\t\t\t} } } \
-\n\tvar stat = document.getElementById( \"stats\" );\n\tvar passrate = Math.round( ( passed / testcases ) * 10000 ) / 100; \
-\n\tstat.innerHTML = \"Test cases run: \" + testcases + \"<br />Passed: \" + passed \
-+\"<br />Failed: \" + failed + \"<br /><b>Passrate: \" + passrate + \"%%</b>\";\n\t}\n</script>" )
-
-// Construction and destruction.
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::NewL
-// Static constructor to constructor builder objects.
-// -----------------------------------------------------------------------------
-//
-CObexTestLogger* CObexTestLogger::NewL(const CTestModuleIf* aTestModuleIf)
-	{
-	CObexTestLogger* self = new (ELeave) CObexTestLogger(aTestModuleIf);
-
-	CleanupStack::PushL( self );
-	self->ConstructL();
-	CleanupStack::Pop(self);
-
-	return self;
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::CObexTestLogger
-// Constructor.
-// -----------------------------------------------------------------------------
-//
-CObexTestLogger::CObexTestLogger(const CTestModuleIf* aTestModuleIf)
-	: CBase(),
-	  iEnabled(ETrue),
-	  iTestModuleIf(aTestModuleIf)
-	{
-	}
-
-// -----------------------------------------------------------------------------
-// CTestLogger::ConstructL
-// 2nd phase constructor.
-// -----------------------------------------------------------------------------
-//
-void CObexTestLogger::ConstructL()
-    {
-    TInt err = CheckLogFile();
-    iLog = CStifLogger::NewL( KObexServAPITestSystemLogPath, KObexServAPITestSystemLogFile,
-                              CStifLogger::ETxt, CStifLogger::EFile, EFalse, EFalse );
-    if( err == KErrNotFound )
-        {   // Add info & HTML markup to the beginning of the log file.
-        LogHeadSectionL();
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::~CObexTestLogger
-// Destructor.
-// -----------------------------------------------------------------------------
-//
-CObexTestLogger::~CObexTestLogger()
-	{
-	delete iLog;
-	}
-
-// Member functions.
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::GetLogger
-// Returns a pointer to current STIF logger.
-// -----------------------------------------------------------------------------
-//
-CStifLogger* CObexTestLogger::GetLogger() const
-	{
-	return iLog;
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::GetTestModuleIf
-// Returns a pointer to current STIF test module interface.
-// -----------------------------------------------------------------------------
-//
-const CTestModuleIf* CObexTestLogger::GetTestModuleIf() const
-	{
-	return iTestModuleIf;
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::Log
-// Logs 8 bit data to screen and file.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::Log(TLogLevel aLevel, TRefByValue<const TDesC8> aLogText, ...) const
-    {
-    if (!iEnabled)
-        {
-        return KErrNone;
-        }
-
-    const TDesC8& actualData = aLogText;
-
-    // Check that user does not try to output too much data.
-    if (actualData.Length() > KMaxLogData - KPrefixLength)
-        {
-        return KErrTooBig;
-        }
-
-    // Buffer to convert 8 bit data to to 16 bit.
-    TLogInfo8 converter;
-
-    // Create variable argument list.
-    VA_LIST args;
-    VA_START(args, aLogText);
-
-    // Format the argument list to the output buffer.
-    converter.FormatList( aLogText, args );
-
-    // Free the variable argument list
-    VA_END(args);
-
-    TLogInfo buffer;
-    buffer.Copy( converter );
-
-    // Append log prefix to the output buffer.
-    buffer.Insert( 0, GetPrefix( aLevel ) );
-
-    // Log a timestamp
-    TTimeStamp8 time;
-    TRAP_IGNORE( LogTimeStampL( time ) );
-    buffer.Insert( 0, time );
-
-    // Write log.
-    return WriteLog(aLevel, buffer);
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::Log
-// Logs 8 bit data to screen and file.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::Log(const TDesC& aCategory, TRefByValue<const TDesC8> aLogText, ...) const
-    {
-    if (!iEnabled)
-	    {
-        return KErrNone;
-        }
-
-    const TDesC8& actualData = aLogText;
-
-    // Check that user does not try to output too much data.
-    if (actualData.Length() > KMaxLogData - KPrefixLength)
-        {
-        return KErrTooBig;
-        }
-
-    // Buffer to convert 8 bit data to to 16 bit.
-    TLogInfo8 converter;
-
-    // Create variable argument list.
-    VA_LIST args;
-    VA_START(args, aLogText);
-
-    // Format the argument list to the output buffer.
-    converter.FormatList(aLogText, args);
-
-    // Free the variable argument list
-    VA_END(args);
-
-    TLogInfo buffer;
-    buffer.Copy( converter );
-
-    // Log a timestamp
-    TTimeStamp8 time;
-    TRAP_IGNORE( LogTimeStampL( time ) );
-    buffer.Insert( 0, time );
-
-    // Write log.
-    return WriteLog(aCategory, buffer);
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::Log
-// Logs 16 bit data to screen and file.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::Log(TLogLevel aLevel, TRefByValue<const TDesC16> aLogText, ...) const
-	{
-	if (!iEnabled)
-		{
-		return KErrNone;
-		}
-
-	const TDesC16& actualData = aLogText;
-	// Check that user does not try to output too much data.
-	if (actualData.Length() + KPrefixLength > KMaxLogData)
-		{
-		return KErrTooBig;
-		}
-
-	TLogInfo buffer;
-
-	// Log a timestamp
-	TRAP_IGNORE( LogTimeStampL( buffer ) );
-
-	// Create variable argument list.
-	VA_LIST args;
-	VA_START(args, aLogText);
-
-	// Format the argument list to the output buffer.
-	buffer.AppendFormatList(aLogText, args);
-
-	// Free the variable argument list
-	VA_END(args);
-
-	// Write log.
-	return WriteLog(aLevel, buffer);
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::Log
-// Logs 16 bit data to screen and file.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::Log(const TDesC& aCategory, TRefByValue<const TDesC16> aLogText, ...) const
-	{
-	if (!iEnabled)
-		{
-		return KErrNone;
-		}
-
-	const TDesC16& actualData = aLogText;
-	// Check that user does not try to output too much data.
-	if (actualData.Length() + KPrefixLength > KMaxLogData)
-		{
-		return KErrTooBig;
-		}
-
-	TLogInfo buffer;
-
-	// Log a timestamp
-	TRAP_IGNORE( LogTimeStampL( buffer ) );
-
-	// Create variable argument list.
-	VA_LIST args;
-	VA_START(args, aLogText);
-
-	// Format the argument list to the output buffer.
-	buffer.AppendFormatList(aLogText, args);
-
-	// Free the variable argument list
-	VA_END(args);
-
-	// Write log.
-	return WriteLog(aCategory, buffer);
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::LogNewLine
-// Logs an HTML  newline and timestamp.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::LogResult( const TDesC8& aFunc, const TDesC& aArg, TInt aRes ) const
-    {
-    TExtTimeStamp func;
-    func.Copy( aFunc ); // Copy 8-bit string to 16-bit buffer
-
-    Log( CObexTestLogger::ETLResult, KTestCaseResult, &func, &aArg, aRes );
-    return KErrNone;
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::LogNewLine
-// Logs an HTML  newline and timestamp.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::LogNewLine() const
-    {
-    if (!iEnabled)
-        {
-        return KErrNone;
-        }
-    TExtTimeStamp time;
-    TRAPD( err, LogTimeStampL( time ) );
-    if( !err )
-        {
-        time.Insert( 0, KHtmlTestCaseStart );
-        err = iLog->Log( time );
-        }
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::SetEnabled
-// Returns a pointer to current STIF logger.
-// -----------------------------------------------------------------------------
-//
-void CObexTestLogger::SetEnabled(TBool aEnabled)
-	{
-	iEnabled = aEnabled;
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::SetLogger
-// Sets a pointer to current STIF logger.
-// -----------------------------------------------------------------------------
-//
-void CObexTestLogger::SetLogger(CStifLogger* aLog)
-	{
-	iLog = aLog;
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::SetTestModuleIf
-// Sets a pointer to current STIF test module.
-// -----------------------------------------------------------------------------
-//
-void CObexTestLogger::SetTestModuleIf(const CTestModuleIf* aTestModuleIf)
-	{
-	iTestModuleIf = aTestModuleIf;
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::WriteLog
-// Writes log.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::WriteLog(TLogLevel aLevel, TDes16& aLog) const
-    {
-    // Write log to file if file logger is available.
-    if (iLog != 0)
-        {
-        iLog->Log(aLog);
-        }
-    // Remove the timestamp from the logging data.
-    TPtrC16 log( aLog.Mid( KTimeStampStrLen ) );
-
-    // Write log with RDebug.
-    RDebug::Print(log);
-
-    // Write log to screen if test module interface is available.
-	if (iTestModuleIf != 0)
-        {
-        CTestModuleIf* nonStaticLogger = const_cast<CTestModuleIf*>(iTestModuleIf);
-        nonStaticLogger->Printf(aLevel, _L(""), log);
-        }
-
-    return KErrNone;
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::WriteLog
-// Writes log.
-// -----------------------------------------------------------------------------
-//
-TInt  CObexTestLogger::WriteLog(const TDesC16& aCategory, const TDesC16& aLog) const
-    {
-    // Write log to file if file logger is available.
-    if (iLog != 0)
-        {
-        iLog->Log(aLog);
-        }
-    // Remove the timestamp from the logging data.
-    TPtrC16 log( aLog.Mid( KTimeStampStrLen ) );
-
-    // Write log with RDebug.
-    RDebug::Print(log);
-
-    // Write log to screen if test module interface is available.
-    if (iTestModuleIf != 0)
-        {
-        CTestModuleIf* nonStaticLogger = const_cast<CTestModuleIf*>(iTestModuleIf);
-        nonStaticLogger->Printf(0, aCategory, log);
-        }
-
-    return KErrNone;
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::GetPrefix
-// Returns the prefix for a given logging level.
-// -----------------------------------------------------------------------------
-//
-TPtrC CObexTestLogger::GetPrefix(TLogLevel aLevel)
-	{
-	// Select a prefix for a log level and return a pointer to it.
-	switch(aLevel)
-		{
-		case ETLError:
-			{
-			TPtrC logPrefix = _L("ERROR : ");
-			return logPrefix;
-			}
-		case ETLInfo:
-		case ETLResult: 
-			{
-			TPtrC logPrefix = _L("INFO  : ");
-			return logPrefix;
-			}
-		case ETLDebug:
-			{
-			TPtrC logPrefix = _L("DEBUG : ");
-			return logPrefix;
-			}
-		default:
-			{
-			// Return a null pointer.
-			return TPtrC();
-			}
-
-		}
-	}
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::CheckLogFile
-// Check if a log file is already existing, otherwise HTML formatting 
-// should be added.
-// -----------------------------------------------------------------------------
-//
-TInt CObexTestLogger::CheckLogFile()
-    {
-    RThread thread;
-    TInt id = thread.Id();
-    TBuf<KMaxFileName > file;
-    file.Format( KObexServAPITestSystemLogFullName, id );
-    RFs fs;
-    TInt err = fs.Connect();
-    TBool open = EFalse;
-    if( !err )
-        {
-        err = fs.IsFileOpen( file, open );
-        }
-    fs.Close();
-    return err;
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::LogTimeStamp
-// Log HTML head section and general information in a newly created logfile.
-// -----------------------------------------------------------------------------
-//
-void CObexTestLogger::LogHeadSectionL()
-    {
-    iLog->Log( KHtmlHeadSection );
-    iLog->Log( KJSSECTION );
-    TBuf<KSysUtilVersionTextLength> version( _L( "Version unknown!" ) );
-    (void) SysUtil::GetSWVersion( version );
-    TTimeStamp8 date;
-    LogTimeStampL( date, EFalse );
-    TTimeStamp8 time;
-    LogTimeStampL( time );
-    TPtrC timePtr( time.Mid( 6, 13 ) );
-    iLog->Log( KHtmlStatSection, &date, &timePtr, &version );
-    }
-
-// -----------------------------------------------------------------------------
-// CObexTestLogger::LogTimeStamp
-// Format a timestamp for logging.
-// If aTime is set to false, the (formatted) date is returned.
-// -----------------------------------------------------------------------------
-//
-void CObexTestLogger::LogTimeStampL(TDes& aBuf, TBool aTime) const
-    {
-    TTime time;
-    time.HomeTime();    // Get time and format it
-    if( aTime )
-        {
-        time.FormatL( aBuf, KFormatTimeStamp );
-        }
-    else
-        {
-        time.FormatL( aBuf, KFormatDate );
-        }
-    }