Revert incorrect RCL_3 drop: RCL_3 PDK_3.0.2
authorPat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:38:54 +0100
branchRCL_3
changeset 24 e9b924a62a66
parent 23 5b153be919d4
child 25 99439b07e980
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035
atext/client/src/atextclient.cpp
atext/plugins/group/bld.inf
atext/plugins/limitedpdpplugin/group/bld.inf
atext/plugins/limitedpdpplugin/group/limitedpdpplugin.mmp
atext/plugins/limitedpdpplugin/inc/debug.h
atext/plugins/limitedpdpplugin/inc/debugconfig.h
atext/plugins/limitedpdpplugin/inc/limitedpdpplugin.h
atext/plugins/limitedpdpplugin/inc/limitedpdpplugincopiedkeys.h
atext/plugins/limitedpdpplugin/inc/prjconfig.h
atext/plugins/limitedpdpplugin/rom/limitedpdpplugin.iby
atext/plugins/limitedpdpplugin/src/20031617.rss
atext/plugins/limitedpdpplugin/src/limitedpdpplugin.cpp
atext/plugins/limitedpdpplugin/src/proxy.cpp
atext/server/inc/atextmetadata.h
atext/server/src/atextmetadata.cpp
atext/server/src/atextsession.cpp
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_CIT_P581_BtExcluded.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_CIT_P581_BtIncluded.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_INC_ROMCONFIG_RSOCKETSERV_002.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_MANAGER_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_MANAGER_002.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_PAN_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RBTPHYLNKADAPT_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RCOMMSERV_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_REMCON_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_REMCON_002.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RHOSTRESOLVER_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_002.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_003.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKET_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_SDPAGENT_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_SDP_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_001.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_002.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_003.script
bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_004.script
bluetooth/btextnotifiers/inc/BTExtNotifiersPartner.h
bluetooth/btsdp/server/epocsvr.cpp
bluetooth/btstack/avctp/avctpPacketMgr.cpp
bluetooth/btstack/avctp/avctpmuxer.cpp
bluetooth/btstack/l2cap/l2capSigStates.cpp
bluetooth/btstack/linkmgr/AclDataQController.cpp
bluetooth/btstack/linkmgr/ProxySAP.cpp
bluetooth/btstack/linkmgr/Subscribers.cpp
bluetooth/btstack/linkmgr/SyncSap.cpp
bluetooth/btstack/linkmgr/basebandsap.cpp
bluetooth/btstack/linkmgr/hostresolver.h
bluetooth/btstack/secman/SecManNotifiers.h
bluetooth/btstack/secman/pairingserver.cpp
bluetooth/btstack/secman/pairingserver.h
bluetooth/btstack/secman/public/pairingservershared.h
bluetooth/gavdp/group/bld.inf
bluetooth/gavdp/test/activecallbackconsole.cpp
bluetooth/gavdp/test/activecallbackconsole.h
bluetooth/gavdp/test/bld.inf
bluetooth/gavdp/test/tavsrc.cpp
bluetooth/gavdp/test/tavsrc.h
bluetooth/gavdp/test/tavsrc.mmp
bluetooth/gavdp/test/tavsrcAbsoluteVolume.cpp
bluetooth/gavdp/test/tavsrcAbsoluteVolume.h
bluetooth/gavdp/test/tavsrcConsole.cpp
bluetooth/gavdp/test/tavsrcConsole.h
bluetooth/gavdp/test/tavsrcController.cpp
bluetooth/gavdp/test/tavsrcController.h
bluetooth/gavdp/test/tavsrcOperations.cpp
bluetooth/gavdp/test/tavsrcOperations.h
bluetooth/gavdp/test/tavsrcSDP.cpp
bluetooth/gavdp/test/tavsrcSock.cpp
bluetooth/gavdp/test/tavsrcSock.h
bluetooth/gavdp/test/tavsrcStreamer.cpp
bluetooth/gavdp/test/tavsrcStreamer.h
bluetooth/gavdp/test/tavsrcStreamerUser.h
bluetooth/gavdp/test/tavsrcTimer.cpp
bluetooth/gavdp/test/tavsrcTimer.h
bluetooth/gavdp/test/tavsrcUI.cpp
bluetooth/gavdp/test/tavsrcUI.h
bluetooth/gavdp/test/tavsrcUtils.cpp
bluetooth/gavdp/test/tavsrcUtils.h
bluetooth/gavdp/test/tavsrcmtupdaterdatabaseaware.cpp
bluetooth/gavdp/test/tavsrcmtupdaterdatabaseaware.h
bluetooth/gavdp/test/tavsrcmtupdaterdatabaseunaware.cpp
bluetooth/gavdp/test/tavsrcmtupdaterdatabaseunaware.h
bluetoothcommsprofiles/btpan/group/btpan.iby
bluetoothmgmt/bluetoothclientlib/avlib/avdtpTypes.cpp
bluetoothmgmt/bluetoothclientlib/btlib/btbaseband.cpp
bluetoothmgmt/bluetoothclientlib/inc/bttypes.h
bluetoothmgmt/bluetoothclientlib/inc/pairing.h
bluetoothmgmt/btmgr/BTManServer/btmanserverburmgr.cpp
bluetoothmgmt/btrom/bluetooth.iby
bluetoothmgmt/btrom/hci.iby
bthci/bthci2/corehci/interface/hcitypes.h
bthci/bthci2/group/hci_framework.iby
bthci/hci2implementations/group/bld.inf
bthci/hci2implementations/group/hci_implementation.iby
bthci/hci2implementations/group/hci_implementation_reference.iby
btsimulator/btaudioadaptation_stub/EABI/btaudioadaptationU.DEF
btsimulator/btaudioadaptation_stub/bwins/btaudioadaptationU.DEF
btsimulator/btaudioadaptation_stub/group/bld.inf
btsimulator/btaudioadaptation_stub/group/btaudiostreaminputadaptation.mmp
btsimulator/btaudioadaptation_stub/inc/btaudioadaptationdebug.h
btsimulator/btaudioadaptation_stub/inc/btaudiostreaminputadaptation.h
btsimulator/btaudioadaptation_stub/layers.sysdef.xml
btsimulator/btaudioadaptation_stub/rom/btaudioadaptation.iby
btsimulator/btaudioadaptation_stub/src/btaudiostreaminputadaptation.cpp
btsimulator/btaudioadaptation_stub/sysdef_1_4_0.dtd
package_definition.xml
package_map.xml
--- a/atext/client/src/atextclient.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/atext/client/src/atextclient.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -274,6 +274,7 @@
 EXPORT_C TInt RATExt::CancelReceiveEcomPluginChange()
     {
     TRACE_FUNC_ENTRY
+    TRACE_INFO((_L("CancelReceiveEcomPluginChange, Thread ID %Lu"), RThread().Id().Id()))
     if ( !Handle() )
         {
         TRACE_FUNC_EXIT
--- a/atext/plugins/group/bld.inf	Tue Aug 31 16:20:16 2010 +0300
+++ b/atext/plugins/group/bld.inf	Wed Sep 01 12:38:54 2010 +0100
@@ -24,5 +24,6 @@
 
 PRJ_MMPFILES
 #include "../legacymodemplugin/group/bld.inf"
+#include "../limitedpdpplugin/group/bld.inf"
 
 PRJ_TESTMMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/group/bld.inf	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,29 @@
+/*
+* 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 file provides the information required for building the
+*               whole of limitedpdpplugin
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+../rom/limitedpdpplugin.iby     CORE_OS_LAYER_IBY_EXPORT_PATH(limitedpdpplugin.iby)
+
+PRJ_MMPFILES
+limitedpdpplugin.mmp
+
+PRJ_TESTMMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/group/limitedpdpplugin.mmp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,51 @@
+/*
+* 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:  Project definition file for project limitedpdpplugin
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET                  limitedpdpplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x20031617
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  proxy.cpp
+SOURCE                  limitedpdpplugin.cpp
+
+START RESOURCE          ../src/20031617.rss
+TARGET                  limitedpdpplugin.rsc
+END
+
+USERINCLUDE             ../inc
+
+OS_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
+
+LIBRARY	ecom.lib
+LIBRARY euser.lib
+LIBRARY atextpluginbase.lib
+LIBRARY centralrepository.lib
+
+DEBUGLIBRARY flogger.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/inc/debug.h	Wed Sep 01 12:38:54 2010 +0100
@@ -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/atext/plugins/limitedpdpplugin/inc/debugconfig.h	Wed Sep 01 12:38:54 2010 +0100
@@ -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 LIMITEDPDPPLUGIN_DEBUGCONFIG_H
+#define LIMITEDPDPPLUGIN_DEBUGCONFIG_H
+
+#include "prjconfig.h"
+
+/**
+ * Custom logging variations.
+ */
+#ifdef PRJ_FILE_TRACE
+_LIT(KLogFile,"limitedpdpplugin.txt");
+_LIT(KLogDir,"LIMITEDPDPPLUGIN");
+#endif
+
+#ifdef PRJ_ENABLE_TRACE
+_LIT(KTracePrefix16, "[LIMITEDPDPPLUGIN] ");
+_LIT8(KTracePrefix8, "[LIMITEDPDPPLUGIN] ");
+_LIT8(KFuncFormat8, "><%S");
+_LIT8(KFuncThisFormat8, "><%S, [0x%08X]");
+_LIT8(KFuncEntryFormat8, ">%S");
+_LIT8(KFuncEntryThisFormat8, ">%S, [0x%08X]");
+_LIT8(KFuncExitFormat8, "<%S");
+
+_LIT(KPanicCategory, "limitedpdpplugin");
+_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 // LIMITEDPDPPLUGIN_DEBUGCONFIG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/inc/limitedpdpplugin.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,226 @@
+/*
+ * 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_LIMITEDPDPPLUGIN_H
+#define C_LIMITEDPDPPLUGIN_H
+
+#include <atextpluginbase.h>
+#include <e32base.h>
+#include <e32property.h>
+
+/**
+ *  Class for selecting handlers for different AT commands
+ *
+ *  @since TB9.2
+ */
+NONSHARABLE_CLASS( CLimitedPdpPlugin ) : public CATExtPluginBase
+    {
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @return Instance of self
+     */
+    static CLimitedPdpPlugin* NewL();
+
+    /**
+     * Destructor.
+     */
+    virtual ~CLimitedPdpPlugin();
+
+private:
+
+    CLimitedPdpPlugin();
+
+    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 synchronous API.
+     *
+     * @since TB9.2
+     * @param aCmd The AT command. Its format may vary depending on the
+     *             specification. 
+     *             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. However, in this case, WE MUST IMPLEMENT THE 
+     * PLUGIN synchronously and BLOCK ATEXT THREAD WHILE EXISTING CONNECTIONS
+     * ARE BEING CLOSED. This is due to the fact that this plugin is an 
+     * observer and the modem AT command handler is issued immediately after
+     * this command returns. This has a couple of drawbacks:
+     * 1. ATEXT thread is blocked, which is against the requirements
+     * 2. Cancelling of this operation is not supported.
+     * 
+     * The extension plugin which accepts this command is responsible to
+     * supply result codes and response and to format result codes properly.
+     *
+     * After an extension plugin has handled or decided to reject given AT
+     * command, it must inform ATEXT by HandleCommandCompleted() with proper
+     * error code.
+     *
+     * @since TB9.2
+     * @param aCmd The AT command to be handled. 
+     * @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 
+     * @param aReplyNeeded Reply needed if ETrue, no reply otherwise. 
+     * @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 pending request is done
+     * by ReceiveUnsolicitedResultCancel(). The implementation in 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 plugin is still handling the command internally.
+     * 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();
+
+    /**
+     * Checks whether this feature is on or off. Reads the value from CenRep
+     * and stores it to the internal variable.
+     *
+     * @since TB9.2
+     * @return ETrue if enabled, EFalse otherwise
+     */
+    TBool CheckFeatureEnablement();
+
+    /**
+     * Closes existing connections by setting PS key to ConnMon
+     *
+     * @since TB9.2
+     * @return KErrNone if successful, otherwise Symbian error code
+     */
+    TInt CloseExistingConnections();
+
+    /**
+     * Blocks thread until ConnMon indicates that existing packet data
+     * connections are closed. Operation is guarded by a timeout.
+     *
+     * @since TB9.2
+     * @return KErrNone if successful, otherwise Symbian error code
+     */
+    TInt BlockThreadUntilConnectionsClosed();
+
+private:
+    // data
+
+    /**
+     * Property handle used for communication with Connection monitor
+     */
+    RProperty iProperty;
+
+    /**
+     * Timer handle used for timeouting the ongoinging operation. Used for
+     * cancelling the closing of existing PDP contexts in case the operation
+     * takes too long.
+     */
+    RTimer iCancelTimer;
+
+    /**
+     * Value indicating whether this feature is enabled
+     */
+    TBool iFeatureSupported;
+
+    };
+
+#endif  // C_LIMITEDPDPPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/inc/limitedpdpplugincopiedkeys.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,65 @@
+/*
+ * 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:  Redefinition of used CenRep and PS keys.
+ *
+ */
+
+#ifndef LIMITEDPDPPLUGINCOPYKEYS_H
+#define LIMITEDPDPPLUGINCOPYKEYS_H
+
+/**
+ * NOTE: THIS FILE CONTAINS COPIES OF CENREP AND PS KEYS DEFINED
+ *       IN IPCONNMGMT PACKAGE. DO NOT CHANGE!!!
+ * 
+ * These needs to be copied to avoid dependency from OS layer (this module)
+ * to middleware layer (ipconnmgmt). Bad design choices...
+ */
+
+/**
+ * UID of CmManager repository
+ */
+const TUid KCopyOfCRUidCmManager =
+    {
+    0x10207376
+    };
+
+/**
+ * Dial-up override setting.
+ */
+const TUint32 KCopyOfDialUpOverride = 0x00000002;
+
+/**
+ * Connection Monitor RProperty category.
+ */
+const TUid KCopyOfConnectionMonitorPS =
+    {
+    0x101F6CF0
+    };
+
+/**
+ * Dial-Up override key.
+ */
+const TUint KCopyOfDialUpConnection = 0x00000001;
+
+/**
+ * Values for KDialUpConnection key.
+ */
+enum TCopyOfDialUpStates
+    {
+    EConnMonDialUpClosed,
+    EConnMonDialUpInit,
+    EConnMonReady
+    };
+
+#endif // LIMITEDPDPPLUGINCOPYKEYS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/inc/prjconfig.h	Wed Sep 01 12:38:54 2010 +0100
@@ -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/atext/plugins/limitedpdpplugin/rom/limitedpdpplugin.iby	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,24 @@
+/*
+* 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:  Image description file for project limitedpdpplugin
+*
+*/
+
+
+#ifndef __LIMITEDPDPPLUGIN_IBY__
+#define __LIMITEDPDPPLUGIN_IBY__
+
+ECOM_PLUGIN( limitedpdpplugin.dll, limitedpdpplugin.rsc )
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/src/20031617.rss	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,47 @@
+/*
+* 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:  Resource definitions for project limitedpdpplugin
+*
+*/
+
+
+#include <atext_interfaceuid.h>
+#include <registryinfo.rh>
+
+// Declares info for two implementations
+RESOURCE REGISTRY_INFO theInfo
+	{
+	// UID for the DLL
+    dll_uid = 0x20031617;
+	// Declare array of interface info
+	interfaces =
+		{
+		INTERFACE_INFO
+			{
+			// UID of interface that is implemented
+			interface_uid = ATEXT_INTERFACE_DUN_UID;
+			implementations =
+				{
+				IMPLEMENTATION_INFO
+					{
+					implementation_uid = 0x20031618;
+					version_no = 1;
+					display_name = "Limited PDP Plugin";
+					default_data=  "OATD*";
+					opaque_data = "";
+					}
+				};
+			}
+		};
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/src/limitedpdpplugin.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,420 @@
+/*
+ * 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 "limitedpdpplugin.h"
+#include <centralrepository.h>
+#include "limitedpdpplugincopiedkeys.h"
+#include "debug.h"
+
+// Internal constants
+const TInt KDialupOverrideEnabled = 1;
+const TInt KCloseTimeoutInterval = 15000000; // 15 secs
+const TInt KCleanUpWaitTimeout = 300000; // 300 ms
+#ifdef _DEBUG 
+const TInt KUsecToMSecDivider = 1000;
+#endif
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CLimitedPdpPlugin* CLimitedPdpPlugin::NewL()
+    {
+    CLimitedPdpPlugin* self = new ( ELeave ) CLimitedPdpPlugin();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CLimitedPdpPlugin::~CLimitedPdpPlugin()
+    {
+    TRACE_FUNC_ENTRY
+
+    // Check validity of handles so that Cancel functions can be called
+    if ( iProperty.Handle() != NULL )
+        {
+        // Cancel just in case in spite of the fact that with current
+        // architecture cancelling of the operation is not possible
+        iProperty.Cancel();
+        iProperty.Close();
+        }
+    if ( iCancelTimer.Handle() != NULL )
+        {
+        iCancelTimer.Cancel();
+        iCancelTimer.Close();
+        }
+
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// CLimitedPdpPlugin::CLimitedPdpPlugin
+// ---------------------------------------------------------------------------
+//
+CLimitedPdpPlugin::CLimitedPdpPlugin() :
+    CATExtPluginBase()
+    {
+    // Nothing to do here, resources are initialized in ConstructL
+    }
+
+// ---------------------------------------------------------------------------
+// CLimitedPdpPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+
+    // No need to use cleanup stack here, since these will be closed in
+    // destructor anyway.
+    User::LeaveIfError( iCancelTimer.CreateLocal() );
+    User::LeaveIfError( iProperty.Attach( KCopyOfConnectionMonitorPS,
+                                          KCopyOfDialUpConnection ) );
+    iFeatureSupported = EFalse;
+    iFeatureSupported = CheckFeatureEnablement();
+
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports connection identifier name to the extension plugin.
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::ReportConnectionName( const TDesC8& /*aName*/)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Reports the support status of an AT command. This is a synchronous API.
+// ---------------------------------------------------------------------------
+//
+TBool CLimitedPdpPlugin::IsCommandSupported( const TDesC8& /*aCmd*/)
+    {
+    TRACE_FUNC_ENTRY
+    // Set the return value according to feature support
+    TRACE_INFO(( _L("Returning feature support value %d"),
+                    static_cast<TInt>(iFeatureSupported)));
+    TRACE_FUNC_EXIT
+    return iFeatureSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles an AT command. Cancelling of the pending request is done by
+// HandleCommandCancel(). The implementation in the extension plugin should
+// be asynchronous, but in this case we must use blocking behavior. This has
+// a couple of drawbacks. First, the ATEXT thread is blocked and possible,
+// which is against the requirements, and secondly and more importantly, the
+// cancelling of this operation is not supported.
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::HandleCommand( const TDesC8& /*aCmd*/,
+                                       RBuf8& /*aReply*/,
+                                       TBool /*aReplyNeeded*/)
+    {
+    TRACE_FUNC_ENTRY
+
+    // Double check that we are actually supporting the feature
+    if ( iFeatureSupported )
+        {
+        // Request ConnMon to close existing packet data connections
+        TInt retTemp = CloseExistingConnections();
+        if ( retTemp == KErrNone )
+            {
+            retTemp = BlockThreadUntilConnectionsClosed();
+            if ( retTemp == KErrNone )
+                {
+                // Internal connections closed. We need to wait for a while
+                // to make sure that lower layer resources are properly 
+                // cleaned in order to avoid conflicts in resource
+                // allocation. Again thread needs to be blocked, therefore
+                // User::After.
+                // NOTE: This is definitely a bad workaround and unreliable
+                // approach, but there aren't too many options...
+                TRACE_INFO(( _L("Block for %d ms for resource cleanup"),
+                                ( KCleanUpWaitTimeout / KUsecToMSecDivider )));
+                User::After( KCleanUpWaitTimeout );
+                TRACE_INFO(( _L("Cleanup wait completed, exit")));
+                }
+            }
+        }
+
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending HandleCommand request.
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    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 CLimitedPdpPlugin::NextReplyPartLength()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the next part of reply initially set by HandleCommandComplete().
+// Length of aNextReply must be equal or less than KDefaultCmdBufLength.
+// ---------------------------------------------------------------------------
+//
+TInt CLimitedPdpPlugin::GetNextPartOfReply( RBuf8& /*aNextReply*/)
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// Receives unsolicited results. Cancelling of the pending request is done by
+// by ReceiveUnsolicitedResultCancel(). The implementation in the extension
+// plugin should be asynchronous.
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::ReceiveUnsolicitedResult()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Cancels a pending ReceiveUnsolicitedResult request.
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::ReceiveUnsolicitedResultCancel()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reports NVRAM status change to the plugins.
+// ---------------------------------------------------------------------------
+//
+void CLimitedPdpPlugin::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 CLimitedPdpPlugin::ReportExternalHandleCommandError()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// Reads CenRep key to check whether requested functionality is active.
+// ---------------------------------------------------------------------------
+//
+TBool CLimitedPdpPlugin::CheckFeatureEnablement()
+    {
+    TRACE_FUNC_ENTRY
+    TBool enabled( EFalse );
+    CRepository* cmRepository = NULL;
+    TRAP_IGNORE( cmRepository = CRepository::NewL ( KCopyOfCRUidCmManager ) );
+    if ( cmRepository )
+        {
+        TInt overrideValue = KErrNotFound;
+        TInt retTemp = cmRepository->Get( KCopyOfDialUpOverride,
+                                          overrideValue );
+
+        if ( ( retTemp == KErrNone ) && ( overrideValue
+                == KDialupOverrideEnabled ) )
+            {
+            enabled = ETrue;
+            TRACE_INFO(( _L("Dialup override feature enabled")));
+            }
+        }
+    delete cmRepository;
+    TRACE_FUNC_EXIT
+    return enabled;
+    }
+
+// ---------------------------------------------------------------------------
+// Ask ConnMon to close all existing packet data connections
+// ---------------------------------------------------------------------------
+//
+TInt CLimitedPdpPlugin::CloseExistingConnections()
+    {
+    TRACE_FUNC_ENTRY
+
+    TInt dialupState( EConnMonReady );
+    TInt retVal( KErrNone );
+
+    retVal = iProperty.Get( dialupState );
+    if ( retVal == KErrNone )
+        {
+        TRACE_INFO(( _L("Current dialup connection PS key value %d"),
+                        dialupState ));
+        if ( dialupState != EConnMonDialUpInit )
+            {
+            TRACE_INFO(( _L("Setting dialup connection PS key to value %d"),
+                            EConnMonDialUpInit ));
+            retVal = iProperty.Set( EConnMonDialUpInit );
+            }
+        else
+            {
+            // Error situation, we should not end up to this function if
+            // the connection closing is already in init state.
+            retVal = KErrNotReady;
+            }
+        }
+    TRACE_INFO(( _L("Closing existing connections done with status %d"),
+                    retVal ));
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// Synchronously block thread until ConnMon indicates that connections are
+// closed or operation timeouts.
+// ---------------------------------------------------------------------------
+//
+TInt CLimitedPdpPlugin::BlockThreadUntilConnectionsClosed()
+    {
+    TRACE_FUNC_ENTRY
+
+    TInt dialupState( EConnMonDialUpInit );
+    TInt retVal( KErrNone );
+
+    // Read the dialup value just to check if ConnMon has been able to update
+    // it already to reflect correct state.
+    retVal = iProperty.Get( dialupState );
+
+    if ( retVal == KErrNone )
+        {
+        TRACE_INFO(( _L("Dialup connection PS key value before wait: %d"),
+                        dialupState ));
+        if ( dialupState == EConnMonDialUpInit )
+            {
+            // Block thread until value changes
+            TRequestStatus propertyStatus;
+            TRequestStatus timeoutStatus;
+            // Set operation to timeout if closing internal contexts fails.
+            // If timeout expires before PS key is updated, this plugin
+            // will pass the ATD*99# command to modem. Most probably
+            // that will fail due to lack of resources. However, if
+            // internal connections are not closed within this timeframe
+            // there will be problems anyway. So this is only to hasten
+            // end user feedback on error situation. 
+            iCancelTimer.After( timeoutStatus, KCloseTimeoutInterval );
+
+            // Loop for property subscription just in case the ConnMon does
+            // not set correct value in first attempt. The loop exiting is
+            // done separately below, but this condition is better than using
+            // while ( ETrue )
+            while ( dialupState != EConnMonReady )
+                {
+                iProperty.Subscribe( propertyStatus );
+
+                TRACE_INFO(( _L("Blocking thread to wait connection closing") ));
+                User::WaitForRequest( propertyStatus, timeoutStatus );
+
+                // Wait completed, check which condition was valid
+                if ( propertyStatus != KRequestPending )
+                    {
+                    if ( propertyStatus == KErrNone )
+                        {
+                        // ConnMon changed the value, check if it is valid
+                        TInt retVal = iProperty.Get( dialupState );
+                        if ( retVal == KErrNone )
+                            {
+                            if ( dialupState == EConnMonReady )
+                                {
+                                TRACE_INFO(( _L("Existing connections closed successfully") ));
+                                }
+                            else
+                                {
+                                // Otherwise retry
+                                TRACE_INFO(( _L("Wrong internal connection state (%d), retry"),
+                                                dialupState ));
+                                continue;
+                                }
+                            }
+                        }
+                    else
+                        {
+                        retVal = propertyStatus.Int();
+                        }
+                    // We should exit the loop, either due success of error
+                    // Cancel and wait for timeout request to complete
+                    TRACE_INFO((_L("Existing connections closed (status: %d), cancel timer"),
+                                    retVal ));
+                    iCancelTimer.Cancel();
+                    // Wait... If the completion of Cancel() is not waited
+                    // here, CActiveScheduler will panic due to stray signal
+                    // (E32USER-CBase panic code 46)
+                    User::WaitForRequest( timeoutStatus );
+                    TRACE_INFO(( _L("Timeout cancelled (timeoutStatus: %d), exit wait"),
+                                    timeoutStatus.Int() ));
+                    break;
+                    }
+                else if ( timeoutStatus != KRequestPending )
+                    {
+                    // Timeout or error, exit
+                    TRACE_INFO(( _L("Wait for existing connections timeouted (status: %d)"),
+                                    timeoutStatus.Int() ));
+                    // Cancel PS subscription and wait for its completion
+                    iProperty.Cancel();
+                    User::WaitForRequest( propertyStatus );
+                    retVal = iProperty.Set( EConnMonDialUpClosed );
+                    TRACE_INFO(( _L("Subscription cancelled (status: %d) and state reset, exit"),
+                                    propertyStatus.Int() ));
+                    retVal = KErrTimedOut;
+                    break;
+                    }
+                }
+            }
+        }
+    // All done, exit
+    TRACE_INFO(( _L("Exiting from wait with status %d"), retVal ));
+
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/atext/plugins/limitedpdpplugin/src/proxy.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -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 LIMITEDPDPPLUGIN_H
+#define LIMITEDPDPPLUGIN_H
+
+#include <e32base.h>
+#include <ecom/implementationproxy.h>
+#include "limitedpdpplugin.h"
+
+// ---------------------------------------------------------------------------
+// An array of TImplementationProxy objects which onnect each
+// implemeation with its instantiation function
+// ---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(0x20031618, CLimitedPdpPlugin::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  // LIMITEDPDPPLUGIN_H
--- a/atext/server/inc/atextmetadata.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/atext/server/inc/atextmetadata.h	Wed Sep 01 12:38:54 2010 +0100
@@ -324,7 +324,7 @@
 public:
 
     TATExtEntrySupport( TDesC8& aAtCmdFull,
-                        const RMessage2& aMessage,
+                        RMessage2& aMessage,
                         CArrayFixFlat<TATExtOneCmdSupport>* aSupport ) :
                         iAtCmdFull( aAtCmdFull ),
                         iMessage( aMessage ),
@@ -333,6 +333,8 @@
                         iStartIndex( KErrNotFound ),
                         iSupportFound( EFalse ){}
 
+    TATExtEntrySupport& operator=( TATExtEntrySupport& aEntrySupport );
+    
     /**
      * Full AT command for which to check the support
      * (base part + parameters)
@@ -342,7 +344,7 @@
     /**
      * Client request message for reading
      */
-    const RMessage2& iMessage;
+    RMessage2& iMessage;
 
     /**
      * AT command's plugin entry support data.
@@ -365,7 +367,7 @@
      * Found plugin support for HandlePartialAndMasterPluginSupportL().
      */
     TBool iSupportFound;
-
+    
     };
 
 /**
--- a/atext/server/src/atextmetadata.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/atext/server/src/atextmetadata.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -2049,7 +2049,9 @@
         TRACE_FUNC_EXIT
         return;
         }
-    TATExtEntrySupport entrySupport( aAtCmdFull, aMessage, support );
+    TATExtEntrySupport entrySupport( aAtCmdFull,
+                                     const_cast<RMessage2&>(aMessage),
+                                     support );
     TInt i;
     aComplInfo.iProcessed = EFalse;
     TInt count = support->Count();
@@ -2141,11 +2143,14 @@
     HBufC8* atCmdFull = HBufC8::NewMaxLC( aEntrySupport.iAtCmdFull.Length() );
     TPtr8 atCmdFullPtr = atCmdFull->Des();
     atCmdFullPtr.Copy( aEntrySupport.iAtCmdFull );
+    // First send the entry to the observers
+    TATExtEntrySupport handleCommandEntry = aEntrySupport;
+    aEntrySupport.iStartIndex = aStartIndex;
+    SendToMultipleObserverL( aEntrySupport, atCmdFull );
+    aEntrySupport = handleCommandEntry;
     // Now execute the HandleCommand()
     iCmdData.iReplyExpected = ETrue;  // Set before HandleCommandL()
     HandleCommandL( aEntrySupport, ETrue );
-    aEntrySupport.iStartIndex = aStartIndex;
-    SendToMultipleObserverL( aEntrySupport, atCmdFull );
     CleanupStack::PopAndDestroy( atCmdFull );
     aReplyExpected = ETrue;
     TRACE_FUNC_EXIT
@@ -2187,8 +2192,8 @@
         TPtr8 atCmdFullPtr = atCmdFull->Des();
         atCmdFullPtr.Copy( aEntrySupport.iAtCmdFull );
         // Now execute the HandleCommand()
+        SendToMultipleObserverL( nextSupport, atCmdFull );
         HandleCommandL( aEntrySupport, EFalse );
-        SendToMultipleObserverL( nextSupport, atCmdFull );
         CleanupStack::PopAndDestroy( atCmdFull );
         }
     else
@@ -2727,3 +2732,22 @@
     TRACE_FUNC_EXIT
     return KErrNone;
     }
+
+// ---------------------------------------------------------------------------
+// Assignment operator for ease of usage
+// ---------------------------------------------------------------------------
+//
+TATExtEntrySupport& TATExtEntrySupport::operator=( TATExtEntrySupport& aEntrySupport )
+    {
+    if ( &aEntrySupport == this )
+        {
+        return aEntrySupport;
+        }
+    iAtCmdFull = aEntrySupport.iAtCmdFull;
+    iMessage = aEntrySupport.iMessage;
+    iSupport = aEntrySupport.iSupport;
+    iEntry = aEntrySupport.iEntry;
+    iStartIndex = aEntrySupport.iStartIndex;
+    iSupportFound = aEntrySupport.iSupportFound;
+    return *this;
+    }
--- a/atext/server/src/atextsession.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/atext/server/src/atextsession.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -898,6 +898,7 @@
     if ( iEComSession )
         {
         iEComSession->Close();
+        iEComSession = NULL; 
         }
     if ( !aSyncClose )
         {
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_CIT_P581_BtExcluded.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_CIT_P581_BtExcluded.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -14,7 +14,7 @@
 //
 
 // Run all the BT_ROMCONFIG_* tests
-// Expects a ROM to be built without BT i.e. __BT has NOT been specified
+// Expects a ROM to be built without BT i.e. SYMBIAN_EXCLUDE_BLUETOOTH has been specified
 
 RUN_SCRIPT c:\scripts\btromconfig\BT_ROMCONFIG_MANAGER_001.script
 
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_CIT_P581_BtIncluded.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_CIT_P581_BtIncluded.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -14,7 +14,7 @@
 //
 
 // Run all the BT_INC_ROMCONFIG_* tests
-// Expects a ROM to be built with BT i.e. __BT has been specified
+// Expects a ROM to be built with BT i.e. SYMBIAN_EXCLUDE_BLUETOOTH has NOT been specified
 
 RUN_SCRIPT c:\scripts\btromconfig\BT_INC_ROMCONFIG_MANAGER_001.script
 
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_INC_ROMCONFIG_RSOCKETSERV_002.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_INC_ROMCONFIG_RSOCKETSERV_002.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-INC-ROMCONFIG-RSocketServ-002
 //! @SYMTestCaseID BT-INC-ROMCONFIG-RSocketServ-002
 //! @SYMTestCaseDesc RSocketServ::StartProtocol should succeed for Bluetooth protocols
-//! on a __BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 3
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_MANAGER_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_MANAGER_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-MANAGER-001
 //! @SYMTestCaseID BT-ROMCONFIG-MANAGER-001
 //! @SYMTestCaseDesc Cannot conenct to RBTMan
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_MANAGER_002.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_MANAGER_002.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-MANAGER-002
 //! @SYMTestCaseID BT-ROMCONFIG-MANAGER-002
 //! @SYMTestCaseDesc Cannot connect to RBTRegServ
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_PAN_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_PAN_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -24,7 +24,7 @@
 START_TESTCASE BT-ROMCONFIG-PAN-001
 //! @SYMTestCaseID BT-ROMCONFIG-PAN-001
 //! @SYMTestCaseDesc Cannot start a BT PAN RConnection
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RBTPHYLNKADAPT_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RBTPHYLNKADAPT_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RBTPHYLNKADAPT-001
 //! @SYMTestCaseID BT-ROMCONFIG-RBTPHYLNKADAPT-001
 //! @SYMTestCaseDesc Cannot open RBTPhysicalLinkAdapter
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RCOMMSERV_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RCOMMSERV_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RCommServ-001
 //! @SYMTestCaseID BT-ROMCONFIG-RCommServ-001
 //! @SYMTestCaseDesc RCommServ::LoadCommModule should fail for Bluetooth
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_INFRARED ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_REMCON_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_REMCON_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-REMCON-001
 //! @SYMTestCaseID BT-ROMCONFIG-REMCON-001
 //! @SYMTestCaseDesc Cannot open CRemConInterfaceSelector as Controller
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_REMCON_002.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_REMCON_002.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-REMCON-002
 //! @SYMTestCaseID BT-ROMCONFIG-REMCON-002
 //! @SYMTestCaseDesc Cannot open CRemConInterfaceSelector as Target
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RHOSTRESOLVER_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RHOSTRESOLVER_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RHostResolver-001
 //! @SYMTestCaseID BT-ROMCONFIG-RHostResolver-001
 //! @SYMTestCaseDesc RHostResolver::Open should fail for Bluetooth protocols
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RSocketServ-001
 //! @SYMTestCaseID BT-ROMCONFIG-RSocketServ-001
 //! @SYMTestCaseDesc RSocketServ::FindProtocol should fail for Bluetooth protocols
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_002.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_002.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RSocketServ-002
 //! @SYMTestCaseID BT-ROMCONFIG-RSocketServ-002
 //! @SYMTestCaseDesc RSocketServ::StartProtocol should fail for Bluetooth protocols
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_003.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKETSERV_003.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RSocketServ-003
 //! @SYMTestCaseID BT-ROMCONFIG-RSocketServ-003
 //! @SYMTestCaseDesc RSocketServ::GetProtocolInfo should not find Bluetooth protocols
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKET_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_RSOCKET_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-RSocket-001
 //! @SYMTestCaseID BT-ROMCONFIG-RSocket-0001
 //! @SYMTestCaseDesc RSocket::Open should fail for Infra-Red protocols
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_SDPAGENT_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_SDPAGENT_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-SDPAGENT-001
 //! @SYMTestCaseID BT-ROMCONFIG-SDPAGENT-001
 //! @SYMTestCaseDesc Cannot use SdpAgent
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_SDP_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_SDP_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-SDP-001
 //! @SYMTestCaseID BT-ROMCONFIG-SDP-001
 //! @SYMTestCaseDesc Cannot connect to RSdp
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_001.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_001.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-USER-001
 //! @SYMTestCaseID BT-ROMCONFIG-USER-001
 //! @SYMTestCaseDesc CBluetoothPhysicalLinks cannot be constructed
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_002.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_002.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-USER-002
 //! @SYMTestCaseID BT-ROMCONFIG-USER-002
 //! @SYMTestCaseDesc CBluetoothSocket cannot be constructed
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_003.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_003.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-USER-003
 //! @SYMTestCaseID BT-ROMCONFIG-USER-003
 //! @SYMTestCaseDesc CBluetoothSynchronousLink cannot be used
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_004.script	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btexample/test/cit/ROMConfig/scripts/BT_ROMCONFIG_USER_004.script	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -18,7 +18,7 @@
 START_TESTCASE BT-ROMCONFIG-USER-004
 //! @SYMTestCaseID BT-ROMCONFIG-USER-004
 //! @SYMTestCaseDesc RHCIDirectAccess cannot be opened
-//! on a !__BT ROM
+//! on a SYMBIAN_EXCLUDE_BLUETOOTH ROM
 //! @SYMREQ 5413
 //! @SYMTestType CIT
 //! @SYMTestPriority 1
--- a/bluetooth/btextnotifiers/inc/BTExtNotifiersPartner.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btextnotifiers/inc/BTExtNotifiersPartner.h	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2001-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"
@@ -19,7 +19,6 @@
 #include <btextnotifiersconsts.h>
 #include <bttypes.h>
 #include <btdevice.h>
-#include <bluetooth/hci/hcitypes.h>
 
 /**
 @publishedPartner
--- a/bluetooth/btsdp/server/epocsvr.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btsdp/server/epocsvr.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -967,7 +967,12 @@
 				// we wouldn't want to remove the record if an error did occur,
 				// which is very unlikely as typically only 1 or 2 records are
 				// added per session.
-				(void)iSessionRecords.Append(newRecord);
+				err = iSessionRecords.Append(newRecord);
+				if(err != KErrNone)
+				    {
+				    //if append fails delete the service record created above and return the error code
+				    Server().DeleteServiceRecord(newRecord);
+				    }
 				}
 			aMessage.Complete(err);
 			}
--- a/bluetooth/btstack/avctp/avctpPacketMgr.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/avctp/avctpPacketMgr.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -31,6 +31,10 @@
 _LIT8(KLogComponent, LOG_COMPONENT_AVCTP);
 #endif
 
+#ifdef _DEBUG
+PANICCATEGORY("pktmgr");
+#endif
+
 using namespace SymbianAvctp;
 
 /**
--- a/bluetooth/btstack/avctp/avctpmuxer.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/avctp/avctpmuxer.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -37,6 +37,10 @@
 _LIT8(KLogComponent, LOG_COMPONENT_AVCTP);
 #endif
 
+#ifdef _DEBUG
+PANICCATEGORY("avctpmux");
+#endif
+
 using namespace SymbianAvctp;
 
 #ifdef __FLOG_ACTIVE	
--- a/bluetooth/btstack/l2cap/l2capSigStates.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/l2cap/l2capSigStates.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -898,6 +898,9 @@
 void TL2CAPSigStateWaitConfig::Enter(CL2CapSAPSignalHandler& aSignalHandler) const
 	{
 	LOG_FUNC
+	// Cancel the Config timer if it's running
+	aSignalHandler.CancelTimer();
+	
 	// First start the ConfigReq sending delay timer (see DelayConfigRequest() for why).
 	// It's short lived, we'll start the proper L2CAP config timer when it expires.
 	aSignalHandler.StartConfigRequestDelayTimer();
--- a/bluetooth/btstack/linkmgr/AclDataQController.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/linkmgr/AclDataQController.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -20,7 +20,6 @@
 //
 
 #include <bluetooth/logger.h>
-#include <bluetooth/hci/hciconsts.h>
 #include "AclDataQController.h"
 #include "linkmgr.h"
 #include "AclDataQ.h"
--- a/bluetooth/btstack/linkmgr/ProxySAP.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/linkmgr/ProxySAP.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-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"
@@ -26,7 +26,6 @@
 #include "linkmgr.h"
 
 #include <bluetooth/hci/aclpacketconsts.h>
-#include <bluetooth/hci/hciconsts.h>
 
 #ifdef __FLOG_ACTIVE
 _LIT8(KLogComponent, LOG_COMPONENT_LINKMGR);
--- a/bluetooth/btstack/linkmgr/Subscribers.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/linkmgr/Subscribers.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -18,7 +18,6 @@
 #include <bt_subscribe.h>
 #include <bt_sock.h>
 #include <utf.h>
-#include <bluetooth/hci/hciconsts.h>
 #include "Subscribers.h"
 #include "linkmgr.h"
 #include "physicallinksmanager.h"
--- a/bluetooth/btstack/linkmgr/SyncSap.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/linkmgr/SyncSap.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-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"
@@ -17,7 +17,6 @@
 
 #include <bluetooth/logger.h>
 #include <bt_sock.h>
-#include <bluetooth/hci/hciconsts.h>
 #include "SCOSAP.h"
 #include "physicallinksmanager.h"
 #include "physicallinks.h"
--- a/bluetooth/btstack/linkmgr/basebandsap.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/linkmgr/basebandsap.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-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"
@@ -16,7 +16,6 @@
 //
 
 #include <bluetooth/logger.h>
-#include <bluetooth/hci/hciconsts.h>
 #include "basebandsap.h"
 #include "physicallinksmanager.h"
 #include "physicallinks.h"
--- a/bluetooth/btstack/linkmgr/hostresolver.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/linkmgr/hostresolver.h	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-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"
@@ -24,8 +24,6 @@
 #include <es_prot.h>
 #include <bluetooth/hcicommandqueue.h>
 #include <bluetooth/hcicommandqueueclient.h>
-#include <bluetooth/hci/hcitypes.h>
-#include <bluetooth/hci/hciconsts.h>
 
 // BT1.1: Could make these runtime configurable.
 
--- a/bluetooth/btstack/secman/SecManNotifiers.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/secman/SecManNotifiers.h	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-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"
@@ -17,7 +17,6 @@
 #define _SECMANNOTIFIERS_H
 
 #include <e32base.h>
-#include <bluetooth/hci/hcitypes.h>
 
 class TBTDevAddr;
 
--- a/bluetooth/btstack/secman/pairingserver.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/secman/pairingserver.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -639,7 +639,6 @@
 		}
 	}
 
-
 void COobDataSession::XoldoLocalOobDataRetrieved(TInt aResult, const TBluetoothSimplePairingHash& aHash, const TBluetoothSimplePairingRandomizer& aRandomizer)
 	{
 	LOG_FUNC
@@ -702,8 +701,8 @@
 	{
 	LOG_FUNC
 	iPhysicalLinksManager.SecMan().CancelRequest(*this);
-	delete iProxySap;
-	if(iStartBondingMsg.Handle())
+	delete iProxySap; // cannot do an immediate shutdown as the semantics for that kill the phy
+	if(!iStartBondingMsg.IsNull())
 		{
 		iStartBondingMsg.Complete(KErrCancel);
 		}
@@ -718,6 +717,7 @@
 	case EPairingServerStartDedicatedBond:
 		StartBondingL(aMessage);
 		break;
+		
 	default:
 		CPairingSubSession::DispatchSubSessMessageL(aMessage);
 		break;
@@ -727,9 +727,18 @@
 void CDedicatedBondingSession::Complete(TInt aError)
 	{
 	LOG_FUNC
-	iState = EShutdown;
-	iAsyncShutdown->CallBack();
-	iStartBondingMsg.Complete(aError);
+	if(!iStartBondingMsg.IsNull())
+		{
+		__ASSERT_DEBUG(!ShuttingDown(), PANIC(KPairingServerFaultCat, EPairingServerBadShutdownState));
+		iState = EShutdownRequested;
+		iAsyncShutdown->CallBack();
+		iPhysicalLinksManager.SecMan().CancelRequest(*this); // we don't want the result anymore (if it's still pending).
+		iStartBondingMsg.Complete(aError); 
+		}
+	else
+		{
+		__ASSERT_DEBUG(ShuttingDown(), PANIC(KPairingServerFaultCat, EPairingServerBadShutdownState));
+		}
 	}
 
 TInt CDedicatedBondingSession::StaticShutdown(TAny* aDedBond)
@@ -742,42 +751,49 @@
 void CDedicatedBondingSession::Shutdown()
 	{
 	LOG_FUNC
-	__ASSERT_DEBUG(iState == EShutdown, PANIC(KPairingServerFaultCat, EPairingServerBadShutdownState));
-	iState = EInvalid;
+	__ASSERT_DEBUG(iState == EShutdownRequested, PANIC(KPairingServerFaultCat, EPairingServerBadShutdownState));
+	__ASSERT_DEBUG(iStartBondingMsg.IsNull(), PANIC(KPairingServerFaultCat, EPairingServerMessageShouldBeNull));
+	iState = EShutdownPending;
 	iProxySap->Shutdown(CServProviderBase::ENormal);
 	}
+	
+TBool CDedicatedBondingSession::ShuttingDown() const
+	{
+	return iState == EShutdownRequested || iState == EShutdownPending;
+	}
 
 void CDedicatedBondingSession::StartBondingL(const RMessage2& aMessage)
 	{
 	LOG_FUNC
 
-	if(!iStartBondingMsg.IsNull() || iState != EInvalid)
+	if(iState != EMintCondition)
 		{
 		aMessage.Panic(KPairingServerPanicCat, EPairingServerDedicatedBondAlreadyInProgress);
 		return;
 		}
-
+	__ASSERT_DEBUG(iStartBondingMsg.IsNull(), PANIC(KPairingServerFaultCat, EPairingServerMessageShouldBeNull));
+	
+	// Now we've been initiated, no turning back for this object.
+	iState = EInitiated;
+	
 	TPckgBuf<TBTDevAddr> addrBuf;
 	TInt addrLen = aMessage.GetDesLengthL(0);
 	if(addrLen != sizeof(TBTDevAddr))
 		{
-		// If the length is correct then the address has been packaged incorrect for the
+		// If the length is incorrect then the address has been packaged incorrectly for the
 		// IPC operation.
 		LEAVEL(KErrBadDescriptor);
 		}
 	aMessage.ReadL(0, addrBuf);
 
-	iStartBondingMsg = aMessage;
-	CleanupStack::PushL(TCleanupItem(CleanupStartMessage, this));
-
 	TBTSockAddr addr;
 	addr.SetBTAddr(addrBuf());
 	iProxySap = CBTProxySAP::NewL(iPhysicalLinksManager, NULL);
-
-	CleanupStack::Pop(this); // the start message cleaner
 	
+	iStartBondingMsg = aMessage;
 	// Now we've entered the realm of not leaving with an error, since the connection
 	// process has started.  Errors from now on must be via the Error() function call.
+	
 	iState = EInitialConnectionPending;
 	iProxySap->SetNotify(this);
 	iProxySap->SetRemName(addr);
@@ -789,13 +805,6 @@
 		}
 	}
 
-void CDedicatedBondingSession::CleanupStartMessage(TAny* aPtr)
-	{
-	LOG_STATIC_FUNC
-	CDedicatedBondingSession* session = reinterpret_cast<CDedicatedBondingSession*>(aPtr);
-	session->iStartBondingMsg = RMessage2(); // blat the old one
-	}
-
 void CDedicatedBondingSession::DoAccessRequestL()
 	{
 	LOG_FUNC
@@ -833,7 +842,7 @@
 		// fall-through...
 	case EInitialConnection:
 		ASSERT_DEBUG(aResult != EBTSecManAccessDeferred); // Should have been disconnected if we receive
-													// this - I don't expect this to happen.
+														  // this - I don't expect this to happen.
 		// fall-through...
 	case EFinalConnection:
 		completed = ETrue; // in the final connection any complete is errored.
@@ -842,12 +851,15 @@
 			err = KErrAccessDenied;
 			}
 		break;
+		
 	case EInitialConnectionPending:
+		// fall-through deliberate
 	case EFinalConnectionPending:
 		// Access request shouldn't successfully complete if the connection is still pending
 		__ASSERT_DEBUG(aResult != EBTSecManAccessGranted,  PANIC(KPairingServerFaultCat, EPairingServerUnexpectedAccessCallback));
 		// We should get the MSocketNotify::Error callback, so don't do anything else
 		break;
+		
 	default:
 		LOG1(_L("Unexpected Access Request Complete in state %d"), iState);
 		__ASSERT_DEBUG(EFalse, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedAccessCallback));
@@ -885,15 +897,21 @@
 	case EFinalConnectionPending:
 		iState = EFinalConnection;
 		break;
+		
 	case EInitialConnection:
+		// fall-through deliberate
 	case EFinalConnection:
 		// Apparently multiple connect completes are allowed by CSocket
 		break;
-	case EShutdown:
+		
+	case EShutdownRequested:
+		// fall-through deliberate
+	case EShutdownPending:
 		// If an error occurred just after the connection request then we
 		// might receive a connection complete before the async shutdown request
-		// has been executed.
+		// has been executed or completed.
 		break;
+		
 	default:
 		LOG1(_L("Unexpected Connect Complete in state %d"), iState);
 		__ASSERT_DEBUG(EFalse, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedSocketCallback));
@@ -924,6 +942,9 @@
 void CDedicatedBondingSession::CanClose(TDelete aDelete)
 	{
 	LOG_FUNC
+	__ASSERT_DEBUG(iState == EShutdownPending, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedSocketCallback));
+	__ASSERT_DEBUG(iStartBondingMsg.IsNull(), PANIC(KPairingServerFaultCat, EPairingServerMessageShouldBeNull));
+	iState = EShutdown;
 	if (aDelete == EDelete)
 		{
 		delete iProxySap; iProxySap = NULL;
@@ -951,12 +972,17 @@
 		// enter the zombie state and wait for the access requester to complete.
 		iState = EZombie;
 		break;
+		
 	case EFinalConnection:
 		Error(KErrDisconnected);
 		break;
-	case EShutdown:
+		
+	case EShutdownRequested:
+		// fall-through deliberate
+	case EShutdownPending:
 		// Already closing down.
 		break;
+		
 	default:
 		LOG1(_L("Unexpected Disconnect in state %d"), iState);
 		__ASSERT_DEBUG(EFalse, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedSocketCallback));
--- a/bluetooth/btstack/secman/pairingserver.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/secman/pairingserver.h	Wed Sep 01 12:38:54 2010 +0100
@@ -218,8 +218,8 @@
 
 	void Complete(TInt aError);
 
-	static void CleanupStartMessage(TAny* aPtr);
 	static TInt StaticShutdown(TAny* aPtr);
+	TBool ShuttingDown() const;
 
 private: // from CPairingSubSession
 	void DispatchSubSessMessageL(const RMessage2& aMessage);
@@ -246,12 +246,15 @@
 private:
 	enum TState
 		{
-		EInvalid,
+		EMintCondition,
+		EInitiated,
 		EInitialConnectionPending,
 		EInitialConnection,
 		EZombie,
 		EFinalConnectionPending,
 		EFinalConnection,
+		EShutdownRequested,
+		EShutdownPending,
 		EShutdown,
 		};
 
--- a/bluetooth/btstack/secman/public/pairingservershared.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/btstack/secman/public/pairingservershared.h	Wed Sep 01 12:38:54 2010 +0100
@@ -71,6 +71,7 @@
 	EPairingServerUnexpectedSocketCallback,
 	EPairingServerUnexpectedAccessCallback,
 	EPairingServerBadShutdownState,
+	EPairingServerMessageShouldBeNull,
 	};
 
 #endif // PAIRINGSERVERSHARED_H
--- a/bluetooth/gavdp/group/bld.inf	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetooth/gavdp/group/bld.inf	Wed Sep 01 12:38:54 2010 +0100
@@ -14,6 +14,7 @@
 // BLD.INF for GAVDP user library
 // 
 
+#include "../test/bld.inf"
 
 PRJ_EXPORTS
 ../public/gavdp.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(gavdp.h)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/activecallbackconsole.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,74 @@
+// 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:
+//
+
+#include "activecallbackconsole.h"
+
+CActiveCallBackConsole::CActiveCallBackConsole(TInt(*aFunction)(TAny *aPtr, TChar aKey), TAny* aPtr)
+	: CActive(EPriorityStandard), iFunction(aFunction), iPtr(aPtr)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+
+CActiveCallBackConsole::~CActiveCallBackConsole()
+	{
+	Cancel();
+	delete iConsole;
+	}
+
+CActiveCallBackConsole* CActiveCallBackConsole::NewL(TInt(*aFunction)(TAny *aPtr, TChar aKey), TAny* aPtr, const TDesC& aTitle,const TSize& aSize)
+	{
+	CActiveCallBackConsole* console = new (ELeave) CActiveCallBackConsole(aFunction, aPtr);
+	CleanupStack::PushL(console);
+	console->ConstructL(aTitle,aSize);
+	CleanupStack::Pop();
+	return console;
+	}
+
+void CActiveCallBackConsole::ConstructL(const TDesC& aTitle,const TSize& aSize)
+	{
+	iConsole = Console::NewL(aTitle,aSize);
+	}
+
+void CActiveCallBackConsole::DoCancel()
+	{
+	iConsole->ReadCancel();
+	}
+
+void CActiveCallBackConsole::RequestKey()
+	{
+	DrawCursor();
+	iConsole->Read(iStatus);
+	SetActive();
+	}
+
+void CActiveCallBackConsole::DrawCursor()
+	{
+	iConsole->Printf(_L(">>"));
+	}
+
+void CActiveCallBackConsole::RunL()
+	{
+	// key has been pressed
+	TChar ch = iConsole->KeyCode();
+	(*iFunction)(iPtr, ch);
+	}
+
+TInt CActiveCallBackConsole::RunError(TInt aError)
+	{
+	iConsole->Printf(_L("Console error %d\nTrying again...\n"), aError);
+	RequestKey();
+	return KErrNone;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/activecallbackconsole.h	Wed Sep 01 12:38:54 2010 +0100
@@ -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:
+//
+
+#ifndef ACTIVECALLBACKCONSOLE_H
+#define ACTIVECALLBACKCONSOLE_H
+
+#include <e32base.h>
+#include <e32cons.h>
+
+
+
+class CActiveCallBackConsole : public CActive
+	{
+public:
+	static CActiveCallBackConsole* NewL(TInt(*aFunction)(TAny *aPtr, TChar aKey), TAny* aPtr, const TDesC& aTitle,const TSize& aSize);
+	void RequestKey();
+	
+	inline CConsoleBase& Console() const 
+		{
+		return *iConsole;
+		};
+
+	~CActiveCallBackConsole();
+
+private:
+	void RunL();
+	TInt RunError(TInt aError);
+	void DoCancel();
+	void DrawCursor();
+	CActiveCallBackConsole(TInt(*aFunction)(TAny *aPtr, TChar aKey), TAny* aPtr);
+	void ConstructL(const TDesC& aTitle,const TSize& aSize);
+
+private:
+	CConsoleBase*	iConsole;
+	TInt(*iFunction)(TAny *aPtr, TChar aKey);
+	TAny* iPtr;
+	};
+
+#endif //ACTIVECALLBACKCONSOLE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/bld.inf	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,18 @@
+// 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:
+//
+
+PRJ_TESTMMPFILES
+
+tavsrc.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrc.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,2678 @@
+// Copyright (c) 2005-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:
+//
+
+#include "tavsrc.h"
+#include "tavsrcUtils.h"
+#include "tavsrcSock.h"
+#include "tavsrcController.h"
+#include "tavsrcStreamer.h"
+
+#include <es_sock.h>
+#include <bt_sock.h>
+#include <bluetoothav.h>
+#include <btsdp.h>
+#include <flogger.h>
+#include <btmanclient.h>
+#include <remconinterfaceselector.h>
+#include <remconcoreapitarget.h>
+#include <remcontrackinfotarget.h>
+#include <remconabsvoltarget.h>
+#include <remconmediainformationtargetobserver.h>
+#include <remconinterfaceselector.h>
+#include <remconaddress.h>
+#include <bacline.h> 
+#ifdef DBAWARE
+#include "tavsrcmtupdaterdatabaseaware.h"
+#else
+#include "tavsrcmtupdaterdatabaseunaware.h"
+#endif
+#include "tavsrcAbsoluteVolume.h"
+
+#ifdef __WINS__
+static const TSize KMainConsole(75,30);
+static const TSize KLogConsole(75,30);
+#else
+static const TSize KMainConsole(KConsFullScreen,KConsFullScreen);
+static const TSize KLogConsole(KConsFullScreen,KConsFullScreen);
+#endif
+
+using namespace SymbianBluetoothAV;
+using namespace SymbianSBC;
+
+void CAVTestApp::PreventLowPowerModes()
+	{
+	// Prevent any other application from setting to low power mode
+	TInt err = iPhy.PreventLowPowerModes(EAnyLowPowerMode);
+	__LOG(_L("Low power mode prevented, result %d\n"), err);
+	}
+
+void CAVTestApp::AllowLowPowerModes()
+	{
+	// Allow any other application to set to low power mode
+	TInt err = iPhy.AllowLowPowerModes(EAnyLowPowerMode);
+	__LOG(_L("Low power mode allowed, result %d\n"), err);
+	}
+
+void CAVTestApp::EchoStorm()
+	{
+	//UPF test
+	//connect phy
+	CBluetoothPhysicalLinks* phys = NULL;
+	TRAP_IGNORE(phys = CBluetoothPhysicalLinks::NewL(*this, iSockServ));
+	if (phys)
+		{
+		phys->CreateConnection(iDevAddr);
+		}
+	}
+
+ void CAVTestApp::HandleCreateConnectionCompleteL(TInt /*aErr*/)
+ 	{
+ 	TBuf8<32> echo;
+ 	RSocket sock;
+ 	
+ 	sock.Open(iSockServ, _L("L2CAP"));
+ 	TL2CAPSockAddr addr;
+ 	addr.SetBTAddr(iDevAddr);
+ 	addr.SetPort(1);
+ 	
+ 	TRequestStatus status;
+ 	
+ 	__LOG(_L("Connecting l2cap"));
+ 	sock.Connect(addr, status);
+ 	User::WaitForRequest(status);
+
+	echo.SetMax();
+	echo.Fill('!');
+	__LOG(_L("Echooing"));
+	FOREVER
+		{
+ 		sock.Ioctl(KL2CAPEchoRequestIoctl, status, &echo, KSolBtL2CAP);
+ 		User::WaitForRequest(status);
+		}
+ 	}
+ 	
+void CAVTestApp::HandleDisconnectCompleteL(TInt /*aErr*/)
+ 	{ 	
+ 	}
+ 	
+void CAVTestApp::HandleDisconnectAllCompleteL(TInt /*aErr*/)
+	{
+	}
+
+void CAVTestApp::CreateStreamerL(RSocketArray aSockets)
+	{
+	__LOG(_L("Creating new streamer\n"));
+	iStreamer = CActiveStreamer::NewL(aSockets,iLogConsole->Console(), *this, iDisplayMode, iPreloadFile);
+	__LOG(_L("OK\n"));		
+	}
+
+void CAVTestApp::Abort()
+	{
+	__PRINT(_L("\n (!ABORT!) Enter remote SEID to ABORT"));
+	TInt seid = TTavsrcUtils::GetIntFromUser(iActiveConsole->Console());
+	__PRINT(_L("\n"));
+	__LOG(_L("Aborting SEID &d...\n"),seid);
+	iGavdp.AbortStream(TSEID(seid, EFalse));	
+	}
+
+void CAVTestApp::SendSecurityControl()
+	{
+	__PRINT(_L("\n Enter remote SEID to Send Security Control"));
+	TInt seid = TTavsrcUtils::GetIntFromUser(iActiveConsole->Console());
+	__PRINT(_L("\n"));
+	__LOG(_L("Sending security control to SEID %d...\n"),seid);
+	
+	TBuf8<20> secBuf(_L8("Danger!\n"));
+	
+	iGavdp.SendSecurityControl(TSEID(seid, EFalse), secBuf);	
+	}
+	
+void CAVTestApp::GetCapabilities()
+	{
+	if (!iLocalReconfigure) // Don't change the remote SEID if we're reconfiguring
+		{
+		if (iAutoStream)
+			{
+			// start at first in shortlisted sep array
+			iCurrentSEID = iShortlistedSEIDs[0];
+			iShortlistedSEIDs.Remove(0); // so next time around, take head again
+			}
+		else
+			{		
+			__PRINT(_L("\n Enter remote SEID to get caps for"));		
+			iCurrentSEID = TSEID(TTavsrcUtils::GetIntFromUser(iActiveConsole->Console()), EFalse);
+			}
+		}
+		
+	__PRINT(_L("\n"));
+	__LOG(_L("Getting Capabilities for SEID %d...\n"),iCurrentSEID.Value());
+	
+	iSEPCapabilities.ResetAndDestroy(); //clear what's already there
+	
+	// we're interested in all caps as we are *TEST CODE*
+	// some GCs should only register interest in the capabilities they might select
+	TAvdtpServiceCategories caps;
+	caps.SetCapability(EAllServiceCategories);
+	
+	iGavdp.GetRemoteSEPCapabilities(iCurrentSEID, caps);
+	}
+	
+
+void CAVTestApp::GAVDP_SEPCapability(TAvdtpServiceCapability* aCapability)
+	{
+	TInt err;
+	PrettyPrint(*aCapability);
+	
+	// we own cap, stash it in our RPointerArray for owning and later use
+	err = iSEPCapabilities.Append(aCapability);
+	
+	if(err == KErrNone)
+		{
+		// check if remote does SBC
+		if (aCapability->Category() == EServiceCategoryMediaCodec)
+			{
+			if (static_cast<TAvdtpMediaCodecCapabilities*>(aCapability)->MediaCodecType() == EAudioCodecSBC)
+				{
+				iChosenSEP = ETrue;
+				__LOG(_L("Found remote suitable SEP with SEID %d\n"), iCurrentSEID.SEID());
+				}
+			}
+		}
+	else
+		{
+		delete aCapability;
+		}
+	}
+				
+
+void CAVTestApp::GAVDP_SEPDiscoveryComplete()
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpDiscoverSEPs, KErrNone);
+	
+	__LOG(_L("GAVDP:SEP Discovery complete.\n"));
+	
+	if (iAutoStream)
+		{
+		// go through all the shortlisted SEPs to find the SBC one
+		GetCapabilities();
+		}
+	TestMenu();
+	}
+
+void CAVTestApp::GAVDP_SEPCapabilityComplete()
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpGetCapabilities, KErrNone);
+
+	__LOG(_L("GAVDP:SEP has no more capabilities.\n"));
+
+	if ((iAutoStream && iChosenSEP) || iLocalReconfigure)
+		{
+		// configure iCurrentSEID
+		TRAPD(err, ConfigureSEPL());
+		if (err != KErrNone)
+			{
+			__LOG(_L("Error configuring remote SEP: %d\n"), err);
+			}
+		}
+	else if (iAutoStream && !iShortlistedSEIDs.Count())
+		{
+		__LOG(_L("Error: Remote does not have SBC codec available\n"));
+		}
+	else if (iAutoStream)
+		{
+		//try next sep
+		GetCapabilities();
+		}
+	TestMenu();
+	}
+
+void CAVTestApp::GAVDP_ConnectConfirm(const TBTDevAddr& aAddr)
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpConnect, KErrNone);
+	
+	// update our tiny state...
+	iGavdpState = ESigConnected;	
+	
+	// hack :o)
+	iDevAddr = aAddr;
+	__LOG(_L("Signalling channel connected = GAVDP ready\n"));
+	
+	// Open RBTPhysicalLinkAdapter for prevention of low power modes during streaming
+	TInt err = iPhy.Open(iSockServ, iDevAddr);
+	__LOG(_L("Opened iPhy, result %d\n"), err);
+
+	TestMenu();
+	}
+
+void CAVTestApp::GAVDP_SEPDiscovered(const TAvdtpSEPInfo& aSEPInfo)
+	{
+	// this test code at present doesnt "remember" the SEPs
+	switch (aSEPInfo.MediaType())
+		{
+		case EAvdtpMediaTypeAudio:
+			__LOG(_L("Audio"));
+			break;
+		case EAvdtpMediaTypeVideo:
+			__LOG(_L("Video"));
+			break;
+		case EAvdtpMediaTypeMultimedia:
+			__LOG(_L("Multimedia"));
+			break;
+		}
+		
+	if (aSEPInfo.IsSink())
+		{
+		__LOG(_L(" Sink"));
+		}
+	else 
+		{
+		__LOG(_L(" Source"));
+		}
+	
+	__LOG(_L(" SEP (SEID %d)"), aSEPInfo.SEID().Value());
+	
+	if (aSEPInfo.InUse()) 
+		{
+		__LOG(_L("[In use]"));
+		}
+
+	// as we intend streaming audio, we need a free audio sink sep							
+	if (aSEPInfo.MediaType()==EAvdtpMediaTypeAudio && aSEPInfo.IsSink() && !aSEPInfo.InUse())
+			{
+			 __LOG(_L("<-- Shortlisted SEP"));
+			(void)iShortlistedSEIDs.Append(aSEPInfo.SEID());
+			}
+			
+	__LOG(_L("\n"));
+	TestMenu();
+	}
+	
+	
+void CAVTestApp::GAVDP_AbortStreamConfirm()
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpAbort, KErrNone);
+
+	__LOG(_L("GAVDP:Aborted\n"));
+	delete iStreamer;
+	iStreamer = NULL;
+
+	AllowLowPowerModes();
+
+	TestMenu();
+	}
+	
+void CAVTestApp::GAVDP_SecurityControlConfirm(const TDesC8& aResponseData)
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpContentProtection, KErrNone);
+
+	__LOG(_L("GAVDP:Security control complete\n"));
+	__LOG(_L("GAVDP:Security control rsp=%S\n"), &aResponseData);
+	
+	TestMenu();
+	}
+	
+void CAVTestApp::GAVDP_StartStreamsConfirm()
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpStartStreams, KErrNone);
+
+	__LOG(_L("GAVDP: StartStreamConfirm: now ready for use\n"));
+	
+	RThread().SetPriority(EPriorityRealTime);
+	
+	if (iLocalReconfigure)
+		{
+		iStreamer->ReStream();
+		iStreamState = EStreaming;
+
+		iOperations->EndOperation(KTavsrcOpStream, KErrNone);
+		iLocalReconfigure = EFalse;
+		}
+	else if (iAutoStream)
+		{
+		//this maynot be true as SNK can be INT (but tavsrc only looks for remote SNKs)
+		iStreamer->Stream(CurrentSEIDIsSink());
+		iStreamState = EStreaming;
+
+		iOperations->EndOperation(KTavsrcOpStream, KErrNone);
+		}
+		
+	iAutoStream = EFalse;	// done
+	iLocalReconfigure = EFalse;
+
+	PreventLowPowerModes();
+
+	TestMenu();
+	}
+	
+void CAVTestApp::GAVDP_SuspendStreamsConfirm()
+	{
+	// complete the operation
+	iOperations->EndOperation(KTavsrcOpSuspendStreams, KErrNone);
+
+	iGavdpState = ESuspended;
+
+	__LOG(_L("Suspending stream!\n"));
+	iStreamer->Suspend();
+	iStreamState = EPaused;
+	
+	// we might be doing a reconfigure due to a request from the streamer
+	if (iLocalReconfigure)
+		{
+		GetCapabilities();
+		}
+
+	AllowLowPowerModes();
+
+	TestMenu();
+	}
+	
+void CAVTestApp::GAVDP_ConfigurationConfirm()
+	{ 
+	// complete the operation
+	if (iRegisteringLocalSEP)
+		{
+		__LOG(_L("SEP [SEID %d]: Local Configuration complete\n"), iCurrentSEID.SEID());
+		iOperations->EndOperation(KTavsrcOpRegisterSEP, KErrNone);
+		
+		iRegisteringLocalSEP = EFalse;
+		
+		// time to listen now SEP  registered, ignore error, logged in Listen()
+		Listen();		
+		}
+	else
+		{
+		__LOG(_L("SEP [SEID %d]: Remote Configuration complete\n"), iCurrentSEID.SEID());
+		iOperations->EndOperation(KTavsrcOpConfigureSEP, KErrNone);
+
+		// we might be doing a reconfigure due to a request from the streamer	
+		if (iLocalReconfigure)
+			{
+			StartStreams();
+			}
+		// if we;re doing autoCSR stuff we choose to go straight to open
+		else if (iAutoStream)
+			{
+			CreateBearers();
+			}
+		}
+
+	TestMenu();
+	}
+	
+void CAVTestApp::GAVDP_Error(TInt aError, const TDesC8& /*aErrorData*/)
+	{
+	__LOG(_L("GAVDP: **Error**: %d:\n"), aError);
+	
+	// complete the outstanding operation with an error
+	iOperations->EndOperation(0, aError);
+	
+	switch (aError)
+		{
+		case KErrAvdtpBaseError-KErrAvdtpRequestTimeout: 
+			{
+			__LOG(_L("AVDTP Request timed out\n"));
+			break;
+			}
+		case -6305:
+		case KErrDisconnected:
+			{
+			iPhy.Close();
+			__LOG(_L("Closed iPhy\n"));
+
+			__LOG(_L("Signalling disconnected\nTest code is going to Re-listen...\n"));
+			aError = Listen();
+
+			iAutoStream = EFalse;
+			if (iStreamer)
+				{
+				iStreamer->Stop();
+				}
+			iStreamState = EStopped;
+
+			// reset the state
+			iOperations->EndOperation(KTavsrcOpDisconnectSrc, aError);
+			break;
+			}
+
+		// Errors we can't match to a specific command
+		case EAvdtpBadHeaderFormat:
+		case EAvdtpBadLength:
+		case EAvdtpBadACPSEID:
+		case EAvdtpBadPayloadFormat:
+		case EAvdtpNotSupportedCommand:
+		case EAvdtpBadState:
+			{
+			__LOG(_L("Couldn't determine operation that caused error\n"));
+			break;
+			}
+		
+		// Errors on SetConfig/Reconfig
+		case EAvdtpSEPInUse:
+		case EAvdtpSepNotInUse:
+		case EAvdtpBadServCategory:
+		case EAvdtpInvalidCapabilities:
+		case EAvdtpBadRecoveryType:	
+		case EAvdtpBadMediaTransportFormat:	
+		case EAvdtpBadReportingFormat:			
+		case EAvdtpBadRecoveryFormat:
+		case EAvdtpBadRohcFormat:
+		case EAvdtpBadCpFormat:
+		case EAvdtpBadMultiplexingFormat:
+		case EAvdtpUnsupportedConfiguration:	
+		case EGavdpBadService:	
+		case EGavdpInsufficientResource:
+		case EA2dpInvalidCodec:
+		case EA2dpNotSupportedCodec:
+		case EA2dpInvalidSamplingFrequency:
+		case EA2dpNotSupportedSamplingFrequency:
+		case EA2dpInvalidChannelMode:
+		case EA2dpNotSupportedChannelMode:
+		case EA2dpInvalidSubbands:
+		case EA2dpNotSupportedSubbands:
+		case EA2dpInvalidAllocationMethod:
+		case EA2dpNotSupportedAllocationMethod:
+		case EA2dpInvalidMinimumBitPoolValue:
+		case EA2dpNotSupportedMinimumBitPoolValue:
+		case EA2dpInvalidMaximumBitPoolValue:
+		case EA2dpNotSupportedMaximumBitPoolValue:
+		case EA2dpInvalidLayer:
+		case EA2dpNotSupportedLayer:
+		case EA2dpNotSupportedCRC:
+		case EA2dpNotSupportedMPF:
+		case EA2dpNotSupportedVBR:
+		case EA2dpInvalidBitRate:
+		case EA2dpNotSupportedBitRate:
+		case EA2dpInvalidObjectType:
+		case EA2dpNotSupportedObjectType:
+		case EA2dpInvalidChannels:
+		case EA2dpNotSupportedChannels:
+		case EA2dpInvalidVersion:
+		case EA2dpNotSupportedVersion:
+		case EA2dpNotSupportedSUL:
+		case EA2dpInvalidBlockLength:
+		case EA2dpInvalidCPType:
+		case EA2dpInvalidCPFormat:
+			{
+			__LOG(_L("Error setting configuration\n"));
+			break;
+			};
+		}
+
+	TestMenu();
+	}
+	
+// passive gubbins
+void CAVTestApp::GAVDP_ConfigurationStartIndication(TSEID aLocalSEID, TSEID aRemoteSEID)
+	{
+	// ah - remote is attempting to confuigure us
+	// we need to set our state
+	__LOG(_L("Remote SEP [SEID %d] is configuring Local SEP [SEID %d]\n"), aRemoteSEID.Value(), aLocalSEID.Value());
+
+	
+	// the seid has already been checked, but we could see which of our endpoints this refers to
+	iGavdpState = ERemoteReconfiguring;
+	iCurrentSEID = aRemoteSEID;
+	iCurrentLocalSEID = aLocalSEID;
+	}
+
+TInt CAVTestApp::GAVDP_ConfigurationIndication(TAvdtpServiceCapability* aCapability)
+	{
+	// the new capability proposed by remote
+	__LOG(_L("Configuration proposed: category %d\n"), aCapability->Category());
+	
+	// for this test code we currently accept everything
+	//** A REAL GC SHOULD THINK ABOUT WHAT THE REMOTE IS PROPOSING
+	PrettyPrint(*aCapability);
+		
+	TInt ret = KErrNone;
+	if (aCapability->Category() == EServiceCategoryRecovery)
+		{
+		TAvdtpRecoveryCapabilities* recCap = static_cast<TAvdtpRecoveryCapabilities*>(aCapability);
+		if (static_cast<TInt>(recCap->RecoveryType()) == 0xff)
+			{
+			ret = ConvertToSymbianError::AvdtpError(EAvdtpBadRecoveryType);
+			}
+
+		}
+
+	
+	if (ret == KErrNone)
+		{
+		delete aCapability;
+		}
+
+	return ret;
+	}
+	
+	
+TInt CAVTestApp::GAVDP_ConfigurationEndIndication()
+	{
+	// just accept all we saw
+	__LOG(_L("GAVDP: Remote configuration proposals now finished"));
+	__LOG(_L(" - we are replying that all is OK\n"));
+	
+	// real GC should think about what remote has said!!
+
+	return KErrNone;
+	}
+
+TInt CAVTestApp::GAVDP_StartIndication(TSEID aLocalSEID)
+	{
+	__LOG(_L("Start indication for Local SEID %d\n"), aLocalSEID.SEID());
+	TInt err = KErrNone;
+	
+	if(iStreamer)
+		{
+		__LOG(_L("Starting streamer (passively!)\n"));
+		
+		TBool sink = EFalse;
+		
+		for (TInt i=0; i<iLocallyRegisteredSEPs.Count(); i++)
+			{
+			// see if we are being a sink or source
+			if (aLocalSEID==iLocallyRegisteredSEPs[i].SEID())
+				{
+				sink = iLocallyRegisteredSEPs[i].IsSink();
+				}
+			}
+		iCurrentLocalSEID = aLocalSEID;
+		iStreamer->Stream(sink);
+		iStreamState = EStreaming;
+		
+		iOperations->EndOperation(KTavsrcOpStream, KErrNone);
+
+		PreventLowPowerModes();
+		}
+	else
+		{
+		__LOG(_L("No streamer! Rejecting start\n"));
+		err = KErrNotReady;
+		}
+	TestMenu();
+	return err;
+	}
+	
+void CAVTestApp::GAVDP_AbortIndication(TSEID aSEID)
+	{
+	__LOG(_L("GAVDP:Stream %d ABORTED by peer\n"), aSEID.SEID());
+	
+	iOperations->EndOperation(KTavsrcOpAbort, KErrNone);
+	
+	delete iStreamer;
+	iStreamer = NULL;
+
+	iPhy.Close();
+	__LOG(_L("Closed iPhy\n"));
+
+	TestMenu();
+	}
+
+void CAVTestApp::GAVDP_ReleaseIndication(TSEID aSEID)
+	{
+	__LOG(_L("GAVDP:Stream %d RELEASED by peer\n"), aSEID.SEID());
+
+	AllowLowPowerModes();
+	}
+
+	
+TInt CAVTestApp::GAVDP_SuspendIndication(TSEID aSEID)
+	{
+	__LOG(_L("GAVDP:Stream %d SUSPENDED by peer\n"), aSEID.SEID());
+
+	iStreamer->Suspend();
+	// should ask the streamer object what SEID it is streaming really
+	
+	// as test code we always consume this for now
+	iOperations->EndOperation(KTavsrcOpSuspendStreams, KErrNone);
+	
+	AllowLowPowerModes();
+	
+	TestMenu();
+	return KErrNone;
+	}
+	
+TInt CAVTestApp::GAVDP_SecurityControlIndication(TSEID aSEID, TDes8& aSecurityData)
+	{
+	__LOG(_L("GAVDP:Got security control data length %d for SEID %d\n"), aSecurityData.Length(), aSEID.Value());
+
+	TBool identical = TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(), _L("Security control data: respond identically?"));
+	if (!identical)
+		{
+		aSecurityData[0]^='!';
+		}
+
+	return KErrNone;
+	}
+
+void CAVTestApp::GAVDP_BearerReady(RSocket aNewSocket, const TAvdtpSockAddr& aAddr)
+	{
+	// wrap socket with active wrapper...
+	__LOG(_L("Got a bearer, for session %d\n"), aAddr.Session());
+
+	// we'll make a streamer now (easy way to keep this socket)
+	// set the PHY to be AV friendly!
+	switch(aAddr.Session())
+		{
+	case EMedia:
+		{
+		iPendingSockets[0] = aNewSocket;				
+
+		// complete the operation
+		iOperations->EndOperation(KTavsrcOpCreateBearers, KErrNone);
+
+		iGavdpState = EOpen;
+
+		// all bearers ready!
+		__LOG(_L("Got all bearers, can now start\n"));
+		
+		RBTPhysicalLinkAdapter phy;
+		
+		// AV sockets don't foward opts yet so use addr version
+		TInt err = phy.Open(iSockServ, iDevAddr);
+		TUint16 packets = EPacketsDH1|EPacketsDH3|EPacketsDH5;
+		err = phy.RequestChangeSupportedPacketTypes(packets);
+		__LOG(_L("Modified PHY, result %d\n"), err);
+		TRAP(err, CreateStreamerL(iPendingSockets)); //FIXME arrange array better for different #bearers
+		if(err)
+			{
+			__LOG(_L("Creating streamer failed with err %d, closing socket\n"), err);
+			aNewSocket.Close();
+			}
+				
+		if (iAutoStream)
+			{
+			StartStreams();
+			}
+		// but not start streaming until manually started
+		
+		TestMenu();
+		break;
+		}
+	case EReporting:
+		{
+		iPendingSockets[1] = aNewSocket;
+#ifdef CHANNEL_BINDING_DEBUG_CHECK
+			TInt err(KErrNone);
+			// Create the active socket reader
+			TRAP(err,iRepReader = CActiveSockReader::NewL(iPendingSockets[1], EReporting));
+			if (err != KErrNone)
+				{
+				__LOG(_L("Creating active socket reader failed with error %d"),err);
+				}
+			else
+				{
+				iRepReader->Start();
+				}
+			// Create the active socket writer
+			TRAP(err,iRepWriter = CActiveSockWriter::NewL(iPendingSockets[1], EReporting));
+			if (err != KErrNone)
+				{
+				__LOG(_L("Creating active socket writer failed with error %d"),err);
+				}
+			else
+				{
+				iRepWriter->Send();		
+				}
+#endif
+		}
+		break;
+		
+	case ERecovery:
+		{
+		iPendingSockets[2] = aNewSocket;
+#ifdef CHANNEL_BINDING_DEBUG_CHECK
+			TInt err(KErrNone);
+			// Create the active socket reader
+			TRAP(err,iRecvReader = CActiveSockReader::NewL(iPendingSockets[2], ERecovery));
+			if (err != KErrNone)
+				{
+				__LOG(_L("Creating active socket reader failed with error %d"),err);
+				}
+			else
+				{
+				iRecvReader->Start();
+				}
+			// Create the active socket writer
+			TRAP(err,iRecvWriter = CActiveSockWriter::NewL(iPendingSockets[2], ERecovery));
+			if (err != KErrNone)
+				{
+				__LOG(_L("Creating active socket writer failed with error %d"),err);
+				}
+			else
+				{
+				iRecvWriter->Send();		
+				}
+#endif
+		}
+		break;
+	default:
+		__DEBUGGER();
+		break;
+		}
+	}
+		
+void CAVTestApp::PrettyPrint(TAvdtpServiceCapability& aCapability)
+	{
+	__LOG(_L("Capability = "));
+	
+	switch (aCapability.Category())
+		{
+	case EServiceCategoryMediaTransport:
+		__LOG(_L("Media Transport\n"));
+		break;
+
+	case EServiceCategoryReporting:
+		__LOG(_L("Reporting\n"));
+		break;
+
+	case EServiceCategoryRecovery:
+		__LOG(_L("Recovery\n"));
+		break;
+
+	case EServiceCategoryContentProtection:
+		__LOG(_L("Content Protection: Type %d\n"), static_cast<TAvdtpContentProtectionCapabilities&>(aCapability).ContentProtectionType());
+		break;
+
+	case EServiceCategoryHeaderCompression:
+		__LOG(_L("Header Compression\n"));
+		break;
+
+	case EServiceCategoryMultiplexing:
+		__LOG(_L("Multiplexing\n"));
+		break;
+
+	case EServiceCategoryMediaCodec:
+		__LOG(_L("Media Codec\n-----------\n"));
+		// print name of codec
+		TAvdtpMediaCodecCapabilities& codecCaps = static_cast<TAvdtpMediaCodecCapabilities&>(aCapability);
+		switch (codecCaps.MediaType())
+			{
+		case EAvdtpMediaTypeAudio:
+			__LOG(_L("Audio:"));
+			break;
+		case EAvdtpMediaTypeVideo:
+			__LOG(_L("Video:"));
+			break;
+		case EAvdtpMediaTypeMultimedia:
+			__LOG(_L("Multimedia:"));
+			break;
+			}
+
+		if (codecCaps.MediaCodecType() == EAudioCodecSBC) 
+			{
+			__LOG(_L("SBC\n"));
+		
+			TSBCCodecCapabilities& sbcCaps = static_cast<TSBCCodecCapabilities&>(aCapability);
+			__LOG(_L("Sampling frequencies: "));
+			if (sbcCaps.SamplingFrequencies() & E48kHz) __LOG(_L("48kHz "));
+			if (sbcCaps.SamplingFrequencies() & E44100Hz) __LOG(_L("44.1kHz "));
+			if (sbcCaps.SamplingFrequencies() & E32kHz) __LOG(_L("32kHz "));
+			if (sbcCaps.SamplingFrequencies() & E16kHz) __LOG(_L("16kHz"));
+			__LOG(_L("\nChannel modes: "));
+			if (sbcCaps.ChannelModes() & EMono) __LOG(_L("Mono "));
+			if (sbcCaps.ChannelModes() & EStereo) __LOG(_L("Stereo "));
+			if (sbcCaps.ChannelModes() & EJointStereo) __LOG(_L("JointStereo "));
+			if (sbcCaps.ChannelModes() & EDualChannel) __LOG(_L("DualChannel"));
+			__LOG(_L("\nBlockLengths: "));
+			if (sbcCaps.BlockLengths() & EBlockLenFour) __LOG(_L("4 "));
+			if (sbcCaps.BlockLengths() & EBlockLenEight) __LOG(_L("8 "));
+			if (sbcCaps.BlockLengths() & EBlockLenTwelve) __LOG(_L("12 "));
+			if (sbcCaps.BlockLengths() & EBlockLenSixteen) __LOG(_L("16"));					
+			__LOG(_L("\nSubbands: "));
+			if (sbcCaps.Subbands() & EFourSubbands) __LOG(_L("4 "));
+			if (sbcCaps.Subbands() & EEightSubbands) __LOG(_L("8"));
+			__LOG(_L("\nAllocation: "));
+			if (sbcCaps.AllocationMethods() & ELoudness) __LOG(_L("Loudness "));
+			if (sbcCaps.AllocationMethods() & ESNR) __LOG(_L("SNR"));
+			__LOG(_L("\nMinBitpool: %d"), sbcCaps.MinBitpoolValue());
+			__LOG(_L("\nMaxBitpool: %d\n"), sbcCaps.MaxBitpoolValue());
+			}
+		else 
+			{
+			TNonSBCCodecCapabilities& nonSbcCaps = static_cast<TNonSBCCodecCapabilities&>(aCapability);
+			TPtrC8 codecData = nonSbcCaps.CodecData();
+			
+			switch (codecCaps.MediaCodecType())
+				{
+			case EAudioCodecMPEG12Audio:
+				__LOG(_L("MPEG1,2 Audio\n"));
+				__LOG(_L("Manually parsing caps of length %d\n"), codecData.Length());
+				__LOG(_L("Layers: "));
+				if (codecData[0] & 0x80) __LOG(_L("mp1"));
+				if (codecData[0] & 0x40) __LOG(_L("mp2"));
+				if (codecData[0] & 0x20) __LOG(_L("mp3"));
+				__LOG(_L("\nCRC protection: "));
+				codecData[0] & 0x10 ? __LOG(_L("yes")) : __LOG(_L("no"));
+				__LOG(_L("\nChannel modes: "));
+				if (codecData[0] & 0x08) __LOG(_L("Mono "));
+				if (codecData[0] & 0x04) __LOG(_L("DualChannel "));
+				if (codecData[0] & 0x02) __LOG(_L("Stereo "));
+				if (codecData[0] & 0x01) __LOG(_L("JointStereo"));
+				__LOG(_L("\nMPF: %d"), codecData[1] & 0x40 ? 1 : 0);
+				__LOG(_L("\nSampling frequencies: "));
+				if (codecData[1] & 0x20) __LOG(_L("16kHz "));
+				if (codecData[1] & 0x10) __LOG(_L("22.05kHz "));
+				if (codecData[1] & 0x08) __LOG(_L("24kHz "));
+				if (codecData[1] & 0x04) __LOG(_L("32kHz "));
+				if (codecData[1] & 0x02) __LOG(_L("44.1kHz "));
+				if (codecData[1] & 0x01) __LOG(_L("48kHz"));
+				__LOG(_L("\nVBR: "));
+				codecData[2] & 0x80 ? __LOG(_L("yes")) : __LOG(_L("no"));
+				__LOG(_L("\nBit rate index: %b\n"), codecData[3]+((codecData[2] & 0x7f)<<8));
+				break;
+			case EAudioCodecMPEG24AAC:
+				__LOG(_L("MPEG 2,4 AAC\n"));
+				__LOG(_L("Not parsing caps of length %d\n"), nonSbcCaps.CodecData().Length());
+				break;
+			case EAudioCodecATRAC:
+				__LOG(_L("ATRAC\n"));
+				__LOG(_L("Not parsing caps of length %d\n"), nonSbcCaps.CodecData().Length());
+				break;
+
+			default:
+				__LOG(_L("Unknown codec, Type %d\n"), codecCaps.MediaCodecType());
+				}
+			}
+		}
+	}
+
+TInt CAVTestApp::Listen()
+	{
+	TInt err = iGavdp.Listen();
+	__LOG(_L("Listening (result %d)\n"), err);
+	return err;
+	}
+	
+void CAVTestApp::StartStreams()
+	{
+	iGavdpState = EOpen;
+	TSEID seid;
+	
+	if (iAutoStream)
+		{
+		seid = iCurrentSEID;
+		}
+	else
+		{
+		__PRINT(_L("\n Enter remote SEID to start streaming"));
+		seid = TSEID(TTavsrcUtils::GetIntFromUser(iActiveConsole->Console()),EFalse);
+		}
+	
+	__PRINT(_L("\n"));
+	__LOG(_L("Starting remoteSEP %d streaming...\n"),seid.SEID());
+	
+	iGavdp.StartStream(seid);
+	}
+	
+void CAVTestApp::SuspendStreams()
+	{
+	TSEID seid;
+	
+	if (iAutoStream)
+		{
+		seid = iCurrentSEID;
+		}
+	else
+		{
+		__PRINT(_L("\n Enter remote SEID to suspend streaming"));
+		seid = TSEID(TTavsrcUtils::GetIntFromUser(iActiveConsole->Console()),EFalse);
+		}
+	
+	__PRINT(_L("\n"));
+	__LOG(_L("Suspending remoteSEP %d streaming...\n"),seid.SEID());
+	
+	iGavdp.SuspendStream(seid);
+	iGavdpState = EOpen; 
+	}
+
+TSBCCodecCapabilities CAVTestApp::InteractiveSBCMediaCodecConfig(TSBCCodecCapabilities& caps)
+	{
+	TSBCCodecCapabilities res;
+	
+	TSBCSamplingFrequencyBitmask freqs = caps.SamplingFrequencies();
+	TBool resp = EFalse;
+	
+	if (freqs)
+		{
+		__PRINT(_L("\nFreqs: Remote Supports: "));
+		if (freqs & E48kHz && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("48kHz Use"));
+			if (resp)
+				{
+				res.SetSamplingFrequencies(E48kHz);
+				}
+			}
+		if (freqs & E44100Hz && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n44.1kHz Use"));
+			if (resp)
+				{
+				res.SetSamplingFrequencies(E44100Hz);
+				}
+			}
+		if (freqs & E32kHz && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n32kHz Use"));
+			if (resp)
+				{
+				res.SetSamplingFrequencies(E32kHz);
+				}
+			}
+		if (freqs & E16kHz && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n16kHz Use"));
+			if (resp)
+				{
+				res.SetSamplingFrequencies(E16kHz);
+				}
+			}
+		}
+	
+	resp = EFalse;
+	TSBCChannelModeBitmask chmodes = caps.ChannelModes();
+	if (chmodes)
+		{
+		__PRINT(_L("\nChModes: remote supports:"));
+		if (chmodes & EJointStereo && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nJointStereo Use"));
+			if (resp)
+				{
+				res.SetChannelModes(EJointStereo);
+				}
+			}
+		if (chmodes & EStereo && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nStereo Use"));
+			if (resp)
+				{
+				res.SetChannelModes(EStereo);
+				}
+			}
+		if (chmodes & EDualChannel && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nDual Ch Use"));
+			if (resp)
+				{
+				res.SetChannelModes(EDualChannel);
+				}
+			}
+		if (chmodes & EMono && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nMono Use"));
+			if (resp)
+				{
+				res.SetChannelModes(EMono);
+				}
+			}
+		}
+
+	TSBCBlockLengthBitmask blockLens = caps.BlockLengths();
+	resp = EFalse;
+	
+	if (blockLens)
+		{
+		__PRINT(_L("\nBlockLens: remote supports:"));
+		if (blockLens & EBlockLenFour && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n4 Use"));
+			if (resp)
+				{
+				res.SetBlockLengths(EBlockLenFour);
+				}
+			}
+		if (blockLens & EBlockLenEight && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n8 Use"));
+			if (resp)
+				{
+				res.SetBlockLengths(EBlockLenEight);
+				}
+			}
+		if (blockLens & EBlockLenTwelve && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n12 Use"));
+			if (resp)
+				{
+				res.SetBlockLengths(EBlockLenTwelve);
+				}
+			}
+		if (blockLens & EBlockLenSixteen && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n16 Use"));
+			if (resp)
+				{
+				res.SetBlockLengths(EBlockLenSixteen);
+				}
+			}
+		}
+
+	resp = EFalse;
+	TSBCSubbandsBitmask subbands = caps.Subbands();
+	if (subbands)
+		{
+		__PRINT(_L("\nSubbands: remote supports:"));
+		if (subbands & EFourSubbands && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n4 Use"));
+			if (resp)
+				{
+				res.SetSubbands(EFourSubbands);
+				}
+			}
+		if (subbands & EEightSubbands && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\n8 Use"));
+			if (resp)
+				{
+				res.SetSubbands(EEightSubbands);
+				}
+			}
+		}
+		
+		
+	resp = EFalse;
+	TSBCAllocationMethodBitmask allocs = caps.AllocationMethods();
+	if (allocs)
+		{
+		__PRINT(_L("\nAllocation methods: remote supports:"));
+		if (allocs & ESNR && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nSNR Use"));
+			if (resp)
+				{
+				res.SetAllocationMethods(ESNR);
+				}
+			}
+		if (allocs & ELoudness && !resp)
+			{
+			resp=TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nLoudness Use"));
+			if (resp)
+				{
+				res.SetAllocationMethods(ELoudness);
+				}
+			}
+		}
+
+	// cat2 test	
+	//res.SetSamplingFrequencies(freqs);	
+	//res.SetBlockLengths(4);
+	//res.SetSubbands(1);
+	//res.SetAllocMethods(1);
+
+	// set bitpool to whatever they said - ok to set range - see 4.3.2.6 A2DP
+	res.SetMaxBitpoolValue(caps.MaxBitpoolValue());
+	res.SetMinBitpoolValue(caps.MinBitpoolValue());
+
+	//dodgy iWish needs to select one
+	//res.SetMinBitpoolValue(42);
+	//res.SetMaxBitpoolValue(42);
+	
+	return res;
+	}
+
+TBool CAVTestApp::CurrentSEIDIsSink()
+	{
+	TBool sink = EFalse;
+	TUint localSEPIndex = iCurrentLocalSEID.Value();
+	
+	//Get the current local SEP index in iLocallyRegisteredSEPs, by screening out flags
+	localSEPIndex &= 0x3f;
+
+	sink = iLocallyRegisteredSEPs[localSEPIndex-1].IsSink();
+	
+	return sink;
+	}
+
+void CAVTestApp::ConfigureSEPL()
+	{
+	TInt res;
+	
+	// user for test code gets to choose "right" local sep to connect to remote sep
+	TSEID localSEPtoUse(1, ETrue); // settings for iAutoStream
+	if (!iAutoStream)
+		{
+		__PRINT(_L("Choose local SEP to use for Stream"));
+		localSEPtoUse.Set(TTavsrcUtils::GetIntFromUser(iActiveConsole->Console())); // it *is* local		
+		}
+	//Record the SEID of chosen local SEP
+	iCurrentLocalSEID = localSEPtoUse;
+	
+	TSEID remoteSEPtoUse = iCurrentSEID; // settings for iAutoStream
+	if (!iAutoStream)
+		{
+		__PRINT(_L("\nChoose remote SEP to use for Stream"));
+		remoteSEPtoUse.Set(TTavsrcUtils::GetIntFromUser(iActiveConsole->Console()));
+		
+		if (remoteSEPtoUse != iCurrentSEID)
+			{
+			__PRINT(_L("\nWARNING: Do not have the capabilities of the selected remote SEP, "));
+			__PRINT(_L("\nthis may lead to sending incorrect configuration information. To"));
+			__PRINT(_L("\nfix this Get Capabilities for selected remote SEP first and then"));	
+			if (!TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),
+					_L("\nconfigure. \nDo you still wish to continue this configuration?")))
+				{
+				User::Leave(KErrAbort);
+				}
+			}
+		}
+
+	// we have to choose which of our seps to bind with the remote
+	// this test code assumes the local SEP to use has SEID 1.
+	// real code would have better code to fathom a good binding based on caps etc
+	res = iGavdp.BeginConfiguringRemoteSEP(remoteSEPtoUse, localSEPtoUse);
+	
+	__LOG(_L("Begin configuring remote SEP returned %d\n"), res);
+	User::LeaveIfError(res);
+	
+	for (TInt index=0; index<iSEPCapabilities.Count(); index++)		
+		{
+		TAvdtpServiceCapability* cap = iSEPCapabilities[index];
+		
+		TAvdtpServiceCategory cat = cap->Category();
+		
+		TBool use = EFalse;
+		
+		if (cat==EServiceCategoryMediaTransport)
+			{
+			if (iAutoStream)
+				{
+				use = ETrue;
+				}
+			else
+				{
+				use = (TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nSEP Does Media Transport - use?")));
+				}
+			if (use)
+				{
+				res = iGavdp.AddSEPCapability(*cap);
+				__LOG(_L("completed: %d"),res);
+				}
+			}
+		if (cat==EServiceCategoryReporting)
+			{
+			if (iAutoStream)
+				{
+				use = /*ETrue*/EFalse;
+				}
+			else
+				{
+				use = TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nSEP Does Reporting - use?"));
+				}
+			if (use)
+				{
+				res = iGavdp.AddSEPCapability(*cap);
+				__LOG(_L("completed: %d"),res);
+				}
+			}
+		if (cat==EServiceCategoryRecovery)
+			{
+			if (iAutoStream)
+				{
+				use = /*ETrue*/EFalse;
+				}
+			else
+				{
+				use = (TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nSEP Does Recovery - use?")));
+				}
+			if (use)
+				{
+				res = iGavdp.AddSEPCapability(*cap);
+				__LOG(_L("completed: %d"),res);
+				}
+			}
+		
+		if (cat==EServiceCategoryContentProtection)
+			{
+			if (iAutoStream)
+				{
+				use = EFalse;
+				}
+			else
+				{
+				use = (TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nSEP Does Content Protection - use?")));			
+				}
+				
+			if (use)
+				{
+				res = iGavdp.AddSEPCapability(*cap);
+				__LOG(_L("completed: %d"),res);
+				}
+			}
+			
+		if (cat==EServiceCategoryMediaCodec)
+			{
+			if (iAutoStream)
+				{
+				use = ETrue;
+				}
+			else
+				{
+				use = (TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nConfigure Media Codec?")));
+				}
+			
+			if (use)
+				{
+				if (static_cast<TBluetoothAudioCodecType>(static_cast<TAvdtpMediaCodecCapabilities*>(cap)->MediaCodecType())==EAudioCodecSBC)
+					{
+					const TSBCCodecCapabilities& available = *static_cast<TSBCCodecCapabilities*>(cap);
+					TSBCCodecCapabilities cfg;
+
+					if (iAutoStream || TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(),_L("\nAutomatically Configure Media Codec?")))
+						{
+						// we might be doing a reconfigure due to a request from the streamer
+						if (iLocalReconfigure)
+							{
+							cfg = iReconfigInfo;
+							}
+						else
+							{
+							// CSR board ignores the configuration
+							// which makes playlisting quite easy
+							// will need to fix this to playlist to boards that do care
+							TInt err, numChannels, chMode, numSubbands, blkLen, bitPool, freq, allocMethod;
+							err = TTavsrcUtils::GetCodecSettingsFromSBCFile(iFilename, chMode, numChannels, numSubbands, blkLen, bitPool, freq, allocMethod);
+							
+							if (err != KErrNone)
+								{
+								__LOG(_L("Problem accessing SBC file: %d\n"), err);
+								__LOG(_L("Warning - Codec settings not obtained\n"));
+								}
+							else
+								{
+								TSBCSubbandsBitmask subbands = numSubbands == 8 ? EEightSubbands : EFourSubbands;
+								TSBCAllocationMethodBitmask alloc = allocMethod == 0 ? ELoudness : ESNR;
+								
+								TSBCSamplingFrequencyBitmask freqs(0);
+								if (freq == 48000) freqs = E48kHz;
+								else if (freq == 44100) freqs = E44100Hz; // note else if now as only select one
+								else if (freq == 32000) freqs = E32kHz;
+								else if (freq == 16000) freqs = E16kHz;
+								
+								TSBCChannelModeBitmask chs(0); // set it to anything to prevent warning
+								if (chMode == 0) chs=EMono; 
+								else if (chMode == 1) chs=EDualChannel; 
+								else if (chMode == 2) chs=EStereo; 
+								else if (chMode == 3) chs=EJointStereo; 
+								
+								TSBCBlockLengthBitmask blkLens(0); // set it to anything to prevent warning
+								if (blkLen == 4) blkLens = EBlockLenFour;
+								else if (blkLen == 8) blkLens = EBlockLenEight;
+								else if (blkLen == 12) blkLens = EBlockLenTwelve;
+								else if (blkLen == 16) blkLens = EBlockLenSixteen;
+								
+								cfg.SetSamplingFrequencies(freqs);
+								cfg.SetChannelModes(chs);
+								cfg.SetBlockLengths(blkLens);
+								cfg.SetSubbands(subbands);
+								cfg.SetAllocationMethods(alloc);
+								
+								}
+							}
+							
+						// use the available bitpool
+						cfg.SetMaxBitpoolValue(available.MaxBitpoolValue());
+						cfg.SetMinBitpoolValue(available.MinBitpoolValue());
+						}
+					else if (use && !iAutoStream)
+						{
+						cfg = InteractiveSBCMediaCodecConfig(*static_cast<TSBCCodecCapabilities*>(cap));
+						}
+					
+						
+					res = iGavdp.AddSEPCapability(cfg);
+					__LOG(_L("Add SEP Capability completed: %d"),res);
+					}
+				else
+					{
+					__LOG(_L("MP3 codec, choosing fixed configuration...\n"));
+					// assume mp3 for now
+					// testing with blueant, just choose stereo, 44.1khz
+					TBuf8<4> mp3Cfg;
+					mp3Cfg.SetLength(4);
+					mp3Cfg[0]=0x32;
+					mp3Cfg[1]=0x02;
+					mp3Cfg[2]=0x00;
+					mp3Cfg[3]=0x02;
+					
+					TNonSBCCodecCapabilities mp3codecCaps(EAvdtpMediaTypeAudio,EAudioCodecMPEG12Audio);
+					mp3codecCaps.SetCodecData(mp3Cfg);
+					res = iGavdp.AddSEPCapability(mp3codecCaps);
+					}
+				}
+			}
+		}// for			
+
+	__LOG(_L("\nCommiting configuration...\n"));
+	iGavdp.CommitSEPConfiguration();
+	}
+
+
+TInt CAVTestApp::StartSrc()
+	{
+	TBool failed = EFalse;
+	
+	// register source/sink records in sdp
+	__LOG(_L("Registering A2DP Sink SDP Record"));
+	TRAPD(err, TTavsrcUtils::RegisterSinkSDPRecordL(iSdpDB, iSnkHandle, ETrue, ETrue, ETrue, ETrue));
+	if (err != KErrNone)
+		{
+		__LOG(_L("Failed to Register A2DP Sink SDP Record: %d"), err);
+		__DEBUGGER();
+		failed = ETrue;
+		}
+	
+	__LOG(_L("Registering A2DP Source SDP Record"));
+	TRAP(err, TTavsrcUtils::RegisterSourceSDPRecordL(iSdpDB, iSrcHandle, ETrue, ETrue, ETrue, ETrue));
+	if (err != KErrNone)
+		{
+		__LOG(_L("Failed to Register A2DP Source SDP Record: %d"), err);
+		__DEBUGGER();
+		failed = ETrue;
+		}
+
+	__LOG(_L("Opening GAVDP Session"));
+	err = iGavdp.Open(*this, iSockServ);
+	if (err == KErrNone)
+		{
+		RHostResolver hostResolver;
+		err = hostResolver.Open( iSockServ, KBTAddrFamily, KBTLinkManager);
+		if (err == KErrNone)
+			{
+			err = hostResolver.SetHostName(_L("Boom Box!")); 
+			hostResolver.Close();
+			}
+		iActiveConsole->Console().Printf(_L("Set Host Name (ret:%d)\r\n"),err);
+		
+		iGavdpState = EIdle;
+		}
+	else
+		{
+		__LOG(_L("Failed to Open GAVDP Session: %d"), err);
+		__DEBUGGER();
+		failed = ETrue;
+		}
+	err = RegisterSEP();
+	if (err != KErrNone)
+		{
+		__LOG(_L("Failed to Register SEP: %d"), err);
+		__DEBUGGER();
+		failed = ETrue;
+		}
+	
+	TRAP(err, CreateRemConInterfacesL());
+	if (err != KErrNone)
+		{
+		__LOG(_L("Failed to Register RemCon interfaces: %d"), err);
+		__DEBUGGER();
+		failed = ETrue;
+		}
+	
+	if(failed)
+		{
+		return KErrGeneral;
+		}
+    return KErrNone;
+	}
+	
+void CAVTestApp::StopSrc()
+	{
+	// Close RBTPhysicalLinkAdapter
+	iPhy.Close();
+	__LOG(_L("Closed iPhy\n"));
+
+	iSdpDB.DeleteRecord(iSrcHandle);
+	iSdpDB.DeleteRecord(iSnkHandle);
+	delete iStreamer;
+	iStreamer = NULL;
+	iGavdp.Close();
+	iAutoStream = EFalse;
+	
+	iGavdpState = ENoClientOpen;
+
+	}
+	
+void CAVTestApp::DisconnectSrc()
+	{
+	// Close RBTPhysicalLinkAdapter
+	iPhy.Close();
+	__LOG(_L("Closed iPhy\n"));
+
+	delete iStreamer;
+	iStreamer = NULL;
+	iGavdp.Shutdown();
+	iAutoStream = EFalse;
+	
+	iGavdpState = EIdle;
+	Listen();
+	}
+
+void CAVTestApp::Connect()
+	{
+	__LOG(_L("Connecting...\n"));
+	iGavdp.Connect(iDevAddr);
+	}
+
+void CAVTestApp::CreateBearers()
+	{
+	TInt ret = KErrNone;
+	TSEID seid;
+	
+	if (iAutoStream)
+		{
+		seid = iCurrentSEID;
+		}
+	else
+		{
+		__PRINT(_L("\n-> Create bearers for remote SEID"));
+		seid = TSEID(TTavsrcUtils::GetIntFromUser(iActiveConsole->Console()), EFalse);
+		}
+
+	ret = iGavdp.CreateBearerSockets(seid);
+	__LOG(_L("Asking for Bearers..(sync_result) %d.\n"), ret);
+	}
+
+void CAVTestApp::CloseBearers()
+	{
+	__LOG(_L("Closing Bearer 0 (via Streamer dtor)...\n\r"));
+
+	delete iStreamer;
+	iStreamer = NULL;	
+
+	__LOG(_L("Bearer closed (via Streamer dtor)...\n\r"));
+
+	AllowLowPowerModes();
+	}
+
+void CAVTestApp::DiscoverSEPs()
+	{
+	__LOG(_L("Sending SEP Discovery...\n\r"));
+	
+	iGavdp.DiscoverRemoteSEPs();
+	}
+	
+CAVTestApp::CAVTestApp()
+	{
+	}
+
+CAVTestApp::~CAVTestApp()
+	{
+	StopSrc();
+	delete iActiveConsole;
+	delete iLogConsole;
+	delete iMtUpdater;
+	delete iTavsrcAbsoluteVolume;
+	delete iStreamer;
+	delete iRemConInterfaceSelector;
+	delete iController;
+	delete iPacketDropIoctl;
+	delete iOperations;
+	
+#ifdef CHANNEL_BINDING_DEBUG_CHECK
+	delete iRepReader;
+	delete iRepWriter;
+	delete iRecvReader;
+	delete iRecvWriter;
+#endif
+	
+	iFilename.Close();	
+	iLocallyRegisteredSEPs.Close();
+	iSockServ.Close();
+	iSdpDB.Close();
+	iSdp.Close();
+	iSEPCapabilities.ResetAndDestroy();
+	iShortlistedSEIDs.Close();
+	}
+
+CAVTestApp* CAVTestApp::NewL()
+	{
+	CAVTestApp* thisapp = new (ELeave) CAVTestApp;
+	CleanupStack::PushL(thisapp);
+	thisapp->ConstructL();
+	CleanupStack::Pop();
+	return thisapp;
+	}
+
+void CAVTestApp::ConstructL()
+	{
+	iLogConsole = CActiveConsole::NewL(*this,_L("Event Log"),KLogConsole);
+	iActiveConsole = CActiveConsole::NewL(*this,_L(" Boom Box "),KMainConsole);
+	
+	User::LeaveIfError(iSockServ.Connect());
+	}
+
+void CAVTestApp::CreateRemConInterfacesL()
+	{
+	iRemConInterfaceSelector = CRemConInterfaceSelector::NewL();
+	
+	RArray<TRemConCoreApiOperationId> coreFeatures;
+	for(TInt i = 0; i<0x76; i++)
+		{
+		coreFeatures.Append(static_cast<TRemConCoreApiOperationId>(i));
+		}
+	
+	if(iRemConInterfaces & ECoreApiTarget)
+		{
+		iRemConTarget = CRemConCoreApiTarget::NewL(*iRemConInterfaceSelector, *this, coreFeatures);
+		}
+	coreFeatures.Close();
+	
+	if(iRemConInterfaces & EGroupNavigation)
+		{
+		iGroupNavigation = CRemConGroupNavigationApiTarget::NewL(*iRemConInterfaceSelector, *this, ETrue, ETrue);
+		}
+	
+	if(iRemConInterfaces & EMediaInformation)
+		{
+		iMediaInformation = CRemConMediaInformationTarget::NewL(*iRemConInterfaceSelector, *this);
+		}
+
+	if(iRemConInterfaces & EBatteryStatus)
+		{
+		iBatteryStatus = CRemConBatteryApiTarget::NewL(*iRemConInterfaceSelector, *this);
+		}
+
+	if(iRemConInterfaces & (EAbsoluteVolumeTarget | EAbsoluteVolumeController))
+		{
+		iTavsrcAbsoluteVolume = CTavsrcAbsoluteVolume::NewL(*iRemConInterfaceSelector);
+		}
+
+	if(iRemConInterfaces & EVendorTrackInfoTarget)
+		{
+		iTrackInfo = CRemConTrackInfoTarget::NewL(*iRemConInterfaceSelector, *this);
+		}
+	
+	if(iRemConInterfaces & (EPlayerInformation | ENowPlaying | EMediaBrowse ))
+		{
+		iMtUpdater = CTavsrcMtUpdater::NewL(*iRemConInterfaceSelector, iRemConInterfaces);
+		}
+
+	if(iRemConInterfaces & EVendorAbsoluteVolumeTarget)
+		{
+		iAbsoluteVolume = CRemConAbsVolTarget::NewL(*iRemConInterfaceSelector, *this);
+		}
+
+	iController = CTavsrcController::NewL(*iRemConInterfaceSelector, *iLogConsole);
+
+	_LIT8(KTavsrcName, "Tavsrc");
+	iRemConInterfaceSelector->OpenTargetL(ERemConAudioPlayer, ERemConNoSubType, KTavsrcName);
+	
+	iRemConInterfaceSelector->OpenControllerL();
+	iOperations = CTavsrcOperations::NewL();
+	}
+
+void CAVTestApp::DisplayHelp()
+	{
+	__LOG(_L("\nUsage: tavsrc [-A <Remote BT Addr>] [-D <Display Mode>] [-P] [-H]\n"));
+	__LOG(_L("\n-A <Remote BT Addr>: Optional argument to specify remote\n"));
+	__LOG(_L("Bluetooth address. If not specified then you will be prompted\n"));
+	__LOG(_L("using notifiers.\n"));
+	__LOG(_L("\n-D <Display Mode>: Optional argument to specify the display mode\n"));
+	__LOG(_L("to use. The possible values are a logical AND of the following:\n"));
+	__LOG(_L("	0x00: Status and Command windows only\n"));
+	__LOG(_L("	0x01: Streamer Info window\n"));
+	__LOG(_L("	0x02: Progress Bar window\n"));
+	__LOG(_L("	0x04: Playlist window\n"));
+	__LOG(_L("	0x08: Chunky Icon window\n"));
+	__LOG(_L("For example, for all the windows except the Progress Bar: -D d\n"));	
+	__LOG(_L("Default value is 1 - Status, Command and Streamer Info windows\n"));
+	__LOG(_L("\n-P: Preload SBC file before streaming.\n"));
+	__LOG(_L("\n-H: Display this help information.\n"));
+	__LOG(_L("\n-R <RemCon interfaces>: Optional argument to specify what interfaces to use:\n"));
+	__LOG(_L("		ECoreApiTarget = 1 << 0\n"));
+	__LOG(_L("		ECoreApiController = 1 << 1\n"));
+	__LOG(_L("		EGroupNavigation = 1 << 2\n"));
+	__LOG(_L("		EMediaInformation = 1 << 3\n"));
+	__LOG(_L("		EBatteryStatus = 1 << 4\n"));
+	__LOG(_L("		EAbsoluteVolumeTarget = 1 << 5\n"));
+	__LOG(_L("		EAbsoluteVolumeController = 1 << 6\n"));
+	__LOG(_L("		EPlayerInformation = 1 << 7\n"));
+	__LOG(_L("		ENowPlaying = 1 << 8\n"));
+	__LOG(_L("		EMediaBrowse = 1 << 9\n"));
+	__LOG(_L("		EDatabaseAware = 1 << 10\n"));
+	__LOG(_L("		ESeparateThreadForBrowse = 1 << 11\n"));
+	__LOG(_L("		EVendorTrackInfoTarget = 1 << 12\n"));
+	__LOG(_L("		EVendorAbsoluteVolumeTarget = 1 << 13\n"));
+	}
+
+void CAVTestApp::ParseCommandLineL()
+	{
+	CCommandLineArguments *cmdLine = CCommandLineArguments::NewL();
+	CleanupStack::PushL(cmdLine);
+
+	// set defaults
+	iDisplayMode = 0x01;
+	iPreloadFile = EFalse;
+	
+	TBool btAddrFound = EFalse;
+	TBool remConInterfacesFound = EFalse;
+	TBuf<20> arg;
+	for (TInt argIndex = 1; argIndex < cmdLine->Count(); argIndex++)
+		{
+		arg = cmdLine->Arg(argIndex);
+		arg.UpperCase();
+		
+		// look for help
+		if (arg.FindF(_L("-H")) != KErrNotFound)
+			{
+			DisplayHelp();
+			User::Leave(KErrArgument);
+			}
+
+		// look for preload file
+		if (arg.FindF(_L("-P")) != KErrNotFound)
+			{
+			iPreloadFile = ETrue;
+			continue;
+			}
+
+		// look for remote device address
+		if (arg.FindF(_L("-A")) != KErrNotFound)
+			{
+			if (argIndex != cmdLine->Count() - 1)
+				{
+				btAddrFound = ETrue;
+				iDevAddr.SetReadable(cmdLine->Arg(++argIndex));
+				continue;
+				}
+			else
+				{
+				__LOG(_L("No address found for -A option\n"));
+				DisplayHelp();
+				User::Leave(KErrArgument);
+				}
+			}
+
+		// look for display mode
+		if (arg.FindF(_L("-D")) != KErrNotFound)
+			{
+			if(argIndex != cmdLine->Count() - 1)
+				{
+				TLex lex(cmdLine->Arg(++argIndex));
+				lex.Val(iDisplayMode, EHex);
+				continue;
+				}
+			else
+				{
+				__LOG(_L("No display mode found for -D option\n"));
+				DisplayHelp();
+				User::Leave(KErrArgument);
+				}
+			}
+		
+		// look for remcon interfaces
+		if (arg.FindF(_L("-R")) != KErrNotFound)
+			{
+			if(argIndex != cmdLine->Count() - 1)
+				{
+				TLex lex(cmdLine->Arg(++argIndex));
+				TInt err = lex.Val(iRemConInterfaces, EHex);
+				if(!err)
+					{
+					remConInterfacesFound = ETrue;
+					}
+				else
+					{
+					__LOG(_L("Badly formatted interface bitmask\n"));
+					}
+				continue;
+				}
+			else
+				{
+				__LOG(_L("No remconinterfaces found for -R option\n"));
+				DisplayHelp();
+				User::Leave(KErrArgument);
+				}
+			}
+
+		// if we got here it means that we have an unhandled argument
+		__LOG(_L("Unrecognised argument\n"));
+		DisplayHelp();
+		User::Leave(KErrArgument);
+		}
+	CleanupStack::PopAndDestroy(); // cmdLine
+
+	if (!btAddrFound)
+		{
+		__LOG(_L("No address found on command line - please enter an address\n"));
+		TTavsrcUtils::GetDeviceAddressL(iDevAddr);
+		}
+
+	if(!remConInterfacesFound)
+		{
+		__LOG(_L("No interfaces found on command line, defaulting to all interfaces\n"));
+		iRemConInterfaces = 0xFFFFFFFF;
+		}
+	}
+
+void CAVTestApp::StartL()
+	{
+	// connect to sdp
+	__LOG(_L("Connecting to ESOCK\n"));
+	User::LeaveIfError(iSockServ.Connect());
+	__LOG(_L("Connecting to SDP Server\n"));
+
+	__LOG(_L("Connecting to SDP Server\n"));
+	User::LeaveIfError(iSdp.Connect());
+	__LOG(_L("Opening subsession on SDP Server\n"));
+
+	__LOG(_L("Opening subsession on SDP Server\n"));
+	User::LeaveIfError(iSdpDB.Open(iSdp));
+	TBuf<512> cmdline;
+	
+	// ensure that we have something to stream
+	RFs fs;
+	CDir* files;
+	User::LeaveIfError(fs.Connect());
+
+	TInt err = fs.GetDir(KSBCFiles, KEntryAttNormal, ESortByName, files);
+
+	fs.Close();
+
+	if (err != KErrNone)
+		{
+		__LOG(_L("Error getting files %S: %d \n"), &KSBCFiles, err);		
+		User::Leave(err);		
+		}
+		
+	if (files->Count() > 0)
+		{
+		// store the filename for registering the SEP later
+		iFilename.Create(KMaxFileName);	
+		iFilename.Append(KSBCFileRoot);
+		iFilename.Append(files->operator[](0).iName);
+		delete files;
+		}
+	else
+		{
+		__LOG(_L("\nNo files matching %S found, at least one is required,\n"), &KSBCFiles);
+		__LOG(_L("please add files and restart the application\n"));
+		delete files;
+		User::Leave(KErrNotFound);
+		}
+
+	TRAP(err, ParseCommandLineL());
+	if (err != KErrNone)
+		{
+		iActiveConsole->Console().ClearScreen();
+		iActiveConsole->Console().Printf(_L("\nProblem with Command Line arguments, see status window for"));
+		iActiveConsole->Console().Printf(_L("\nmore information or press ESC to exit.\n"));
+		iActiveConsole->RequestKey();
+		}
+	else
+		{
+		err = StartSrc();
+		if(err == KErrNone)
+			{
+			TestMenu();
+			}
+		else
+			{
+			iActiveConsole->Console().ClearScreen();
+			iActiveConsole->Console().Printf(_L("\nProblem starting source, see status window for"));
+			iActiveConsole->Console().Printf(_L("\nmore information or press ESC to exit.\n"));
+			iActiveConsole->RequestKey();
+			}
+		}
+	CActiveScheduler::Start();
+	}
+
+void CAVTestApp::Stop()
+	{
+	CActiveScheduler::Stop();
+	}
+	
+//remcon
+ void CAVTestApp::MrccatoCommand(TRemConCoreApiOperationId aOperationId, 
+		TRemConCoreApiButtonAction aButtonAct)
+ 	{
+ 	__LOG(_L("RemCon::Command received 0x%02x\t Button Act %d\n"), aOperationId, aButtonAct);
+ 	if((aOperationId == ERemConCoreApiStop) &&
+ 	   (aButtonAct == ERemConCoreApiButtonClick || aButtonAct == ERemConCoreApiButtonPress) )
+ 		{
+	 	__LOG(_L("RemCon::Stop received\n"));
+		iAutoStream = EFalse;
+		if (iStreamer)
+			{
+			iStreamer->Stop();
+			}
+		iStreamState = EStopped;
+		iOperations->EndOperation(KTavsrcOpStopStream, KErrNone);
+ 		}
+ 	else if (((aOperationId == ERemConCoreApiBackward) || (aOperationId == ERemConCoreApiRewind)) && iStreamer)
+ 		{
+ 		if (aButtonAct == ERemConCoreApiButtonClick)
+ 			{
+			iStreamer->PrevTrack();
+ 			}
+ 		else if ((aButtonAct == ERemConCoreApiButtonPress) && (iStreamState == EStreaming))
+ 			{
+			iStreamer->Backward();
+			iStreamer->Faster();
+ 			}
+ 		else if ((aButtonAct == ERemConCoreApiButtonRelease) && (iStreamState == EStreaming))
+ 			{
+			iStreamer->Forward();
+			iStreamer->Slower();
+ 			}
+ 		}
+ 	else if (((aOperationId == ERemConCoreApiForward) || (aOperationId == ERemConCoreApiFastForward)) && iStreamer)
+ 		{
+ 		if (aButtonAct == ERemConCoreApiButtonClick)
+ 			{
+			iStreamer->NextTrack();
+ 			}
+ 		else if ((aButtonAct == ERemConCoreApiButtonPress) && (iStreamState == EStreaming))
+ 			{
+ 			iStreamer->Faster();
+ 			}
+ 		else if ((aButtonAct == ERemConCoreApiButtonRelease) && (iStreamState == EStreaming))
+ 			{
+			iStreamer->Slower();
+ 			}
+ 		}
+ 	else if ((aOperationId == ERemConCoreApiPause) && (aButtonAct != ERemConCoreApiButtonRelease))
+ 		{
+ 		TInt operation = KTavsrcOpStream;
+ 		
+		if (iStreamState == EStreaming)
+			{
+			// this demo app doesn't suspend GAVDP, just the streamer
+			if (iStreamer)
+				{
+				iStreamer->Suspend();
+				}
+			iStreamState = EPaused;
+			operation = KTavsrcOpStopStream;
+			}
+		iOperations->EndOperation(operation, KErrNone);
+ 		}	
+
+ 	if (iStreamState == EStreaming)
+ 		{
+ 		PreventLowPowerModes();
+ 		}
+
+ 	TestMenu();
+ 	}
+ 	
+ void CAVTestApp::MrccatoPlay(TRemConCoreApiPlaybackSpeed /*aSpeed*/, 
+		TRemConCoreApiButtonAction aButtonAct)
+ 	{
+ 	__LOG(_L("RemCon::Play received\t Button Act %d\n"), aButtonAct);
+ 	if((aButtonAct == ERemConCoreApiButtonClick || aButtonAct == ERemConCoreApiButtonPress))
+ 	   	{
+ 	   	TInt operation = KTavsrcOpStream;
+ 	   	
+   		// kick everything off
+	   	if (iGavdpState == ESigConnected)
+			{			
+			// auto
+			iAutoStream = ETrue;
+			// kick off
+			DiscoverSEPs();
+			}
+ 		else if (iGavdpState == ESuspended)
+ 			{
+			if (iStreamer)
+				iStreamer->ReStream();
+			iStreamState = EStreaming;
+			}
+		else if (iGavdpState == EOpen)
+			{
+			if (iStreamState == EPaused)
+	 			{
+				// this demo app doesn't unsuspend GAVDP, just the streamer
+				if (iStreamer)
+					iStreamer->ReStream();
+				iStreamState = EStreaming;
+				}
+			else if (iStreamState == EStopped)
+				{
+				// this demo app doesn't unsuspend GAVDP, just the streamer
+				if (iStreamer)
+					iStreamer->Stream(CurrentSEIDIsSink()); //could be source or sink
+				iStreamState = EStreaming;
+				}
+			else if (iStreamState == EClosed)
+				{
+				if (iStreamer)
+					iStreamer->Stream(CurrentSEIDIsSink());
+				iStreamState = EStreaming;
+				}
+			}
+		iOperations->EndOperation(operation, KErrNone);
+
+	 	if (iStreamState == EStreaming)
+	 		{
+	 		PreventLowPowerModes();
+	 		}
+
+	 	TestMenu();
+ 	   	}
+ 	}
+ 
+void CAVTestApp::MediaCodecConfigurationRequired(TSBCCodecCapabilities& aConfig)
+	{
+	if (!iLocalReconfigure)
+		{
+		// set the reconfigure information
+		iReconfigInfo = aConfig;
+		iLocalReconfigure = ETrue;
+
+		// start streaming automatically after the reconfigure
+		iAutoStream = ETrue;
+		
+		SuspendStreams();
+		}	
+	}
+
+void CAVTestApp::PrintCommandOption(TChar aOperation, TPtrC aDesc)
+	{
+	if (iOperations->IsOperationAllowed(aOperation))
+		{		
+		iActiveConsole->Console().Printf(_L("%c%s"), aOperation.IsUpper() ? aOperation.GetUpperCase() : aOperation.GetLowerCase(), aDesc.Ptr());
+		}
+	else
+		{
+		iActiveConsole->Console().Printf(_L(" %s"), aDesc.Ptr());	
+		}
+	}
+
+// from MRemConMediaInformationTargetObserver
+void CAVTestApp::MrcmitoGetCurrentlyPlayingMetadata( TMediaAttributeIter& aAttributeIter )
+	{
+	iActiveConsole->Console().Printf(_L("Got MrcpitoGetElementAttributes \n") );	
+
+	// Make sure total of these defines is greater than KAVCMaxFrame (512 bytes)
+	// to ensure that fragmentation is performed on this response
+	_LIT8(KMediaTitle,     "Frederic Chopin (1810-1849): Ballade for Piano #1 in A flat major, Opus 23, CT 2 - Largo allegretto, Moderato con brio vivace, Presto con fuoco");
+	_LIT8(KArtistName,     "Maurizio Pollini and the London Philharmonic Orchestra, conducted by Sir Colin Davis, recorded live at the Royal Albert Hall at the 1987 Proms season");
+	_LIT8(KAlbumName,      "Frederic Chopin (1810-1849): Four Ballades, Two Preludes, the Valse in D-flat major - Op. 64 No. 1 and the Andante Spianato & Grand Polonaise Brillante Op. 22");
+	_LIT8(KTrackNumber,    "10345");
+	_LIT8(KNumberOfTracks, "6876436456");
+	_LIT8(KGenre,          "Alternative super cool Classical Music with a lemon twist and a hint of progressive rock");
+	_LIT8(KPlayingTime,    "150000");
+	
+	TBuf8<255> buffer;
+	
+	// for each element requested
+	TMediaAttributeId id;
+	while (aAttributeIter.Next(id))
+		{
+		switch(id)
+			{
+			case ETitleOfMedia:
+				buffer.Copy(KMediaTitle);
+				break;
+			case ENameOfArtist:
+				buffer.Copy(KArtistName);
+				break;
+			case ENameOfAlbum:
+				buffer.Copy(KAlbumName);
+				break;
+			case ETrackNumber:
+				buffer.Copy(KTrackNumber);
+				break;
+			case ENumberOfTracks:
+				buffer.Copy(KNumberOfTracks);
+				break;
+			case EGenre:
+				buffer.Copy(KGenre);
+				break;
+			case EPlayingTime:
+				buffer.Copy(KPlayingTime);
+				break;
+			default:
+				__DEBUGGER();
+				break;
+			}
+		
+		// return the element value
+		iMediaInformation->AttributeValue( id, buffer );
+		
+		// convert the element value to unicode for display
+		TBuf16<255> buf16;
+		buf16.Copy(buffer);
+		buf16.ZeroTerminate();
+		iActiveConsole->Console().Printf(_L("Element:%d value:%s \n"),  id, buf16.Ptr() );	
+		}
+
+	// send response complete
+	iMediaInformation->Completed();
+		
+	}
+
+
+TInt CAVTestApp::MrcmtcGetElementAttributes(TUint64 /* aElement */, TUint32 aAttribute, HBufC8*& aOutValueOwnershipTransferred)
+	{
+//
+//	__DEBUGGER(); //try this out
+	iActiveConsole->Console().Printf(_L("Got GEA, attrib %d!\n"), aAttribute);	
+
+	aOutValueOwnershipTransferred = HBufC8::New(20);
+	if (aOutValueOwnershipTransferred)
+		{
+		aOutValueOwnershipTransferred->Des() = _L8("Hello");
+		}
+		
+	return KErrNone;	
+	}
+
+void CAVTestApp::MrcncRegisterPlaybackStatusChangedNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: PlayStatusChanged!\n"));	
+	}
+	
+void CAVTestApp::MrcncRegisterTrackChangedNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: TrackChanged!\n"));	
+	}
+
+void CAVTestApp::MrcncRegisterTrackReachedEndNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: TrackReachedEnd!\n"));	
+	}
+
+void CAVTestApp::MrcncRegisterTrackReachedStartNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: TrackReachedStart!\n"));	
+	}
+
+void CAVTestApp::MrcncRegisterPositionChangedNotification(TUint32 aInterval)
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: PositionChanged (0x%08x)!\n"), aInterval);	
+	}
+
+void CAVTestApp::MrcncRegisterBatteryStatusChangedNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: BatteryStatusChanged!\n"));	
+	}
+
+void CAVTestApp::MrcncRegisterSystemStatusChangedNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: SystemStatusChanged!\n"));	
+	}
+
+void CAVTestApp::MrcncRegisterPlayerApplicationStatusChangedNotification()
+	{
+	iActiveConsole->Console().Printf(_L("Queued notify: PlayerAppStatusChanged!\n"));	
+	}
+	
+void CAVTestApp::MrcbstoBatteryStatus(TControllerBatteryStatus&  aBatteryStatus )
+	{
+	switch(aBatteryStatus)
+		{
+		case ENormal:
+			iActiveConsole->Console().Printf(_L("Battery status: Normal \n"));	
+			break;
+		case EWarning:   
+			iActiveConsole->Console().Printf(_L("Battery status: Warning \n"));	
+			break;
+		case ECritical:  
+			iActiveConsole->Console().Printf(_L("Battery status: Critical \n"));	
+			break;
+		case EExternal:  
+			iActiveConsole->Console().Printf(_L("Battery status: External \n"));	
+			break;
+		case EFullCharge:
+			iActiveConsole->Console().Printf(_L("Battery status: FullCharge \n"));	
+			break;
+		default:
+			iActiveConsole->Console().Printf(_L("Battery status: %d \n"), aBatteryStatus);	
+			break;
+		}
+	}
+
+void CAVTestApp::MrcgntoNextGroup(TRemConCoreApiButtonAction aButtonAct )
+	{
+	switch(aButtonAct)
+		{
+		case ERemConCoreApiButtonPress:
+			iActiveConsole->Console().Printf(_L("Got NextGroup! Button Press \n"));	
+			break;
+		case ERemConCoreApiButtonRelease:
+			iActiveConsole->Console().Printf(_L("Got NextGroup! Button Release \n"));	
+			break;
+		case ERemConCoreApiButtonClick:
+			iActiveConsole->Console().Printf(_L("Got NextGroup! Button Click \n"));	
+			break;
+		default:
+			iActiveConsole->Console().Printf(_L("Got NextGroup! Button ??? \n"));	
+			break;
+		}
+		
+	// for testing return an error	
+	TRequestStatus status;
+	TRequestStatus* ptrStatus = &status;
+	iGroupNavigation->NextGroupResponse( ptrStatus, KErrNone);
+	User::WaitForRequest(status);
+	
+	}
+	
+void CAVTestApp::MrcgntoPreviousGroup(TRemConCoreApiButtonAction  aButtonAct )
+	{
+	switch(aButtonAct)
+		{
+		case ERemConCoreApiButtonPress:
+			iActiveConsole->Console().Printf(_L("Got PreviousGroup! Button Press \n"));	
+			break;
+		case ERemConCoreApiButtonRelease:
+			iActiveConsole->Console().Printf(_L("Got PreviousGroup! Button Release \n"));	
+			break;
+		case ERemConCoreApiButtonClick:
+			iActiveConsole->Console().Printf(_L("Got PreviousGroup! Button Click \n"));	
+			break;
+		default:
+			iActiveConsole->Console().Printf(_L("Got PreviousGroup! Button ??? \n"));	
+			break;
+		}
+		
+	// return success	
+	TRequestStatus status;
+	TRequestStatus* ptrStatus = &status;
+	iGroupNavigation->PreviousGroupResponse( ptrStatus, KErrNone );
+	User::WaitForRequest(status);
+	}
+
+void CAVTestApp::MrcavtoGetAbsoluteVolume()
+	{
+	TRequestStatus status;
+	iAbsoluteVolume->GetAbsoluteVolumeResponse(status, 1, 2, KErrNone);
+	User::WaitForRequest(status);
+	}
+
+void CAVTestApp::MrcavtoSetAbsoluteVolume(TUint /*aAbsVol*/, TUint /*aMaxVol*/)
+	{
+	TRequestStatus status;
+	iAbsoluteVolume->SetAbsoluteVolumeResponse(status, KErrNone);
+	User::WaitForRequest(status);
+	}
+
+void CAVTestApp::MrctitoGetTrackName()
+	{
+	TRequestStatus status;
+	_LIT(KTrackName, "trackname");
+	iTrackInfo->GetTrackNameResponse(status, KTrackName, KErrNone);
+	User::WaitForRequest(status);
+	}
+
+void CAVTestApp::MrctitoGetArtist()
+	{
+	TRequestStatus status;
+	_LIT(KArtist, "artist");
+	iTrackInfo->GetArtistResponse(status, KArtist, KErrNone);
+	User::WaitForRequest(status);
+	}
+
+void CAVTestApp::MrctitoGetTrackDuration()
+	{
+	TRequestStatus status;
+	_LIT(KTrackDuration, "0.2.56");
+	TTime trackDuration(KTrackDuration);
+	iTrackInfo->GetTrackDurationResponse(status, trackDuration, KErrNone);
+	User::WaitForRequest(status);
+	}
+
+_LIT(KOn, "On");
+_LIT(KOff, "Off");
+
+void CAVTestApp::TestMenu()
+	{
+	iActiveConsole->Console().ClearScreen();
+
+	iActiveConsole->Console().Printf(_L("Safe Mode: %S\n"), iOperations->SafeMode() ? &KOn() : &KOff());
+
+	if (iGavdpState!=EIdle)
+		{
+		iActiveConsole->Console().Printf(_L("Connected \n\r"));	
+		}
+	else
+		{
+		iActiveConsole->Console().Printf(_L("          \n\r"));	
+		}
+	
+	RProperty property;
+	TBuf8<6> addr;
+
+	TInt err = property.Get(KPropertyUidBluetoothCategory,
+					KPropertyKeyBluetoothGetLocalDeviceAddress, addr);
+
+	if ((err) || (addr.Length()!=6))
+		{
+		iActiveConsole->Console().Printf(_L("P&S: ERROR retrieving local address\n"));
+		}
+	else
+		{
+		TBTDevAddr localAddress(addr);
+		TBuf<20> dispBuf;
+		localAddress.GetReadable(dispBuf);
+		TBuf<20> rBuf;
+		iDevAddr.GetReadable(rBuf);
+		iActiveConsole->Console().Printf(_L("Local address = 0x%S; Using Remote Addr = 0x%S\n"),&dispBuf,&rBuf);
+		}
+	
+	iActiveConsole->Console().Printf(_L("\n"));
+
+	switch (iGavdpState)
+		{
+		case ENoClientOpen:
+			PrintCommandOption(KTavsrcOpStartSrc, _L(". Open GAVDP for Src\n"));
+			break;
+		case EIdle:
+			PrintCommandOption(KTavsrcOpConnect, _L(". Connect\n"));
+			PrintCommandOption(KTavsrcOpCancel, _L(". Cancel\n"));
+			PrintCommandOption(KTavsrcOpRegisterSEP, _L(". Register SEP\n"));
+			break;
+		case ESigConnected:
+		case EOpen:
+		case ESuspended:
+		case ERemoteReconfiguring:
+			PrintCommandOption(KTavsrcOpAutoStream, _L(". Auto Stream\n"));
+			PrintCommandOption(KTavsrcOpDiscoverSEPs, _L(". Discover remote SEPs             "));
+			PrintCommandOption(KTavsrcOpCreateBearers, _L(". Create Bearers\n"));
+			
+			PrintCommandOption(KTavsrcOpGetCapabilities, _L(". Get Remote SEP Capabilites       "));
+			PrintCommandOption(KTavsrcOpCloseBearers, _L(". Close Bearers\n"));
+			
+			PrintCommandOption(KTavsrcOpStartStreams, _L(". Start Stream                     "));
+			PrintCommandOption(KTavsrcOpSuspendStreams, _L(". Suspend Stream\n"));
+
+			PrintCommandOption(KTavsrcOpContentProtection, _L(". Content Protection               "));
+			PrintCommandOption(KTavsrcOpAbort, _L(". Abort Stream\n"));
+
+			PrintCommandOption(KTavsrcOpConfigureSEP, _L(". Select Remote SEP (configure the doofer)\n"));
+
+			PrintCommandOption(KTavsrcOpStream, _L(". Start Streamer                   "));
+			PrintCommandOption(KTavsrcOpStopStream, _L(". Stop Streamer\n\n"));
+
+			PrintCommandOption(KTavsrcOpPacketDropIoctl, _L(". Send \"Notify Media Packet Dropped\" IOCTL\n\n"));
+
+			PrintCommandOption(KTavsrcOpDisconnectSrc, _L(". Disconnect GAVDP - don't close\n"));
+			PrintCommandOption(KTavsrcOpStopSrc, _L(". Close GAVDP\n"));			
+			break;
+		}
+
+	iActiveConsole->Console().Printf(_L("\n"));
+	
+	PrintCommandOption(KTavsrcOpPlay, _L(". AVRCP Play                       "));
+	PrintCommandOption(KTavsrcOpStop, _L(". AVRCP Stop\n"));
+
+	iActiveConsole->Console().Printf(_L("Up. AVRCP Volume Up                 "));
+	iActiveConsole->Console().Printf(_L("Down. AVRCP Volume Down\n"));
+
+	iActiveConsole->Console().Printf(_L("Left. AVRCP Backwards               "));
+	iActiveConsole->Console().Printf(_L("Right. AVRCP Forwards\n"));
+
+	iActiveConsole->Console().Printf(_L("\n"));
+
+	PrintCommandOption(KTavsrcOpToggleSafeMode, _L(".\tToggle Safe Mode\n"));
+	iActiveConsole->Console().Printf(_L("Esc.\tStop\n"));
+	
+	if (!iActiveConsole->IsActive())
+		{
+		iActiveConsole->RequestKey();
+		}
+	}
+
+void CAVTestApp::KeyPressed(TChar aKey)
+	{
+	TInt beginOperation = iOperations->BeginOperation(aKey);
+
+	if (beginOperation == KErrNone)
+		{
+		switch (aKey)
+			{
+		case KTavsrcOpConnect:
+			{
+			Connect();
+			break;
+			}
+		case KTavsrcOpCancel:
+			{
+			iOperations->EndOperation(KTavsrcOpCancel, KErrCancel);
+
+			iGavdp.Cancel();
+			__LOG(_L("Current Request Cancelled \n"));
+			break;
+			}
+		case KTavsrcOpDiscoverSEPs:
+			{
+			DiscoverSEPs();
+			break;
+			}
+		case KTavsrcOpCreateBearers:
+			{
+			CreateBearers();
+			break;
+			}
+		case KTavsrcOpCloseBearers:
+			{
+			iOperations->EndOperation(KTavsrcOpCloseBearers, KErrNone);
+
+			CloseBearers();
+			break;
+			}
+		case KTavsrcOpContentProtection:
+			{
+			SendSecurityControl();
+			break;
+			}
+		case KTavsrcOpGetCapabilities:
+			{
+			GetCapabilities();
+			break;
+			}
+		case KTavsrcOpStartStreams:
+			{
+			StartStreams();
+			break;
+			}
+		case KTavsrcOpSuspendStreams:
+			{
+			SuspendStreams();
+			break;
+			}
+		case KTavsrcOpEchoStorm:
+			{
+			iOperations->EndOperation(KTavsrcOpEchoStorm, KErrNone);
+
+			EchoStorm();
+			break;
+			}
+		case KTavsrcOpAbort:
+			{
+			Abort();
+			break;
+			}
+		case KTavsrcOpStream:
+			{
+			iOperations->EndOperation(KTavsrcOpStream, KErrNone);
+
+			iStreamer->Stream(CurrentSEIDIsSink());
+			iStreamState = EStreaming;
+			}
+			break;		
+		case KTavsrcOpStreamFaster:
+			{
+			iOperations->EndOperation(KTavsrcOpStreamFaster, KErrNone);
+
+			iStreamer->Faster();
+			break;
+			}
+			
+		case KTavsrcOpStreamSlower:
+			{
+			iOperations->EndOperation(KTavsrcOpStreamSlower, KErrNone);
+
+			iStreamer->Slower();
+			break;
+			}
+			
+		case KTavsrcOpAutoStream:
+			{
+			// auto
+			iAutoStream = ETrue;
+			// kick off
+			DiscoverSEPs();
+			}
+			break;
+
+		case KTavsrcOpStopStream:
+			{
+			iOperations->EndOperation(KTavsrcOpStopStream, KErrNone);
+
+			__LOG(_L("Stopping streaming... \n"));
+			iStreamState = EPaused;
+			iStreamer->Suspend();
+			}
+			break;
+		case KTavsrcOpRegisterSEP:
+			{
+			iOperations->EndOperation(KTavsrcOpRegisterSEP, KErrNone);
+
+			RegisterSEP();
+			break;
+			}
+		case KTavsrcOpRegisterMultipleSEPs:
+			{		
+			iOperations->EndOperation(KTavsrcOpRegisterMultipleSEPs, KErrNone);
+
+			for (TInt i=0; i<=40; i++)
+				{
+				TAvdtpSEPInfo info; iGavdp.RegisterSEP(info);
+				}
+			break;
+			}
+		case KTavsrcOpStartSrc:
+			{
+			iOperations->EndOperation(KTavsrcOpStartSrc, KErrNone);
+
+			//reopen GAVDP
+			StartSrc();
+			break;
+			}
+				
+		case KTavsrcOpStopSrc:
+			{
+			iOperations->EndOperation(KTavsrcOpStopSrc, KErrNone);
+
+			StopSrc();
+			break;
+			}	
+		case KTavsrcOpDisconnectSrc:
+			{
+			iOperations->EndOperation(KTavsrcOpDisconnectSrc, KErrNone);
+
+			DisconnectSrc();
+			break;
+			}	
+		case KTavsrcOpConfigureSEP:
+			{
+			TRAPD(err, ConfigureSEPL());
+			if (err != KErrNone)
+				{
+				iOperations->EndOperation(KTavsrcOpConfigureSEP, err);
+				}
+			break;
+			}
+	
+		case KTavsrcOpPacketDropIoctl:
+			{
+			iOperations->EndOperation(KTavsrcOpPacketDropIoctl, KErrNone);
+
+			__LOG(_L("Sending packet drop IOCTL\n"));
+			iPacketDropIoctl = CActivePacketDropIoctl::NewL(iLogConsole, iPendingSockets);//Qualified
+			iPacketDropIoctl->Start();
+			break;
+			}
+	
+		case KTavsrcOpVolumeUp:
+			{
+			iOperations->EndOperation(KTavsrcOpVolumeUp, KErrNone);
+
+			iController->Command(ERemConCoreApiVolumeUp);
+			break;
+			}
+			
+		case KTavsrcOpVolumeDown:
+			{
+			iOperations->EndOperation(KTavsrcOpVolumeDown, KErrNone);
+			
+			iController->Command(ERemConCoreApiVolumeDown);
+			break;
+			}
+			
+		case KTavsrcOpBackwards:
+			{
+			iOperations->EndOperation(KTavsrcOpBackwards, KErrNone);
+
+			iController->Command(ERemConCoreApiBackward);
+			break;
+			}
+			
+		case KTavsrcOpForwards:
+			{
+			iOperations->EndOperation(KTavsrcOpForwards, KErrNone);
+
+			iController->Command(ERemConCoreApiForward);
+			break;
+			}
+			
+		case KTavsrcOpPlay:
+			{
+			iOperations->EndOperation(KTavsrcOpPlay, KErrNone);
+
+			iController->Command(ERemConCoreApiPlay);
+			break;
+			}
+			
+		case KTavsrcOpStop:
+			{
+			iOperations->EndOperation(KTavsrcOpStop, KErrNone);
+
+			iController->Command(ERemConCoreApiStop);
+			break;
+			}
+			
+		case KTavsrcOpExit:
+			{
+			iOperations->EndOperation(KTavsrcOpExit, KErrNone);
+
+			Stop();
+			return;
+			}
+
+		case KTavsrcOpToggleSafeMode:
+			{
+			iOperations->EndOperation(KTavsrcOpToggleSafeMode, KErrNone);
+			
+			iOperations->SetSafeMode(!iOperations->SafeMode());
+			break;
+			}
+
+		default:
+			iActiveConsole->Console().Printf(_L("Unknown command\r\n"));
+			}
+		}
+	else
+		{
+		__LOG(_L("Operation not allowed: %d\r\n"), beginOperation);		
+		}
+	
+	TestMenu();
+
+	}
+
+TInt CAVTestApp::RegisterSEP()
+	{
+	TInt err;
+	
+	TAvdtpSEPInfo info;
+	info.SetIsSink(TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(), _L("Sink ")));
+	info.SetMediaType(TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(), _L("Audio ")) ?
+									EAvdtpMediaTypeAudio :
+									EAvdtpMediaTypeVideo);
+	err = iGavdp.RegisterSEP(info);
+		
+	if (err==KErrNone)
+		{
+		iLocallyRegisteredSEPs.Append(info);
+		}
+	__LOG(_L("Registering SEP [SEID %d] - completed with error %d\n"), info.SEID().SEID(), err);
+
+	if (err==KErrNone)
+		{
+		iCurrentLocalSEID = info.SEID();
+
+		// add some caps, not to all though for testing!
+		err = iGavdp.BeginConfiguringLocalSEP(info.SEID());
+		
+		__LOG(_L("Begin config Local SEP [SEID %d] - completed with error %d\n"), info.SEID().SEID(), err);
+		
+		TAvdtpMediaTransportCapabilities media;
+		err = iGavdp.AddSEPCapability(media);
+		__LOG(_L("Add configuration [Category %d] - completed with error %d\n"), media.Category(), err);
+/*
+		TAvdtpReportingCapabilities rep;
+		err = iGavdp.AddSEPCapability(rep);
+		__LOG(_L("Add configuration [Category %d] - completed with error %d\n"), rep.Category(), err);
+
+		TAvdtpRecoveryCapabilities rec;
+		rec.SetRecoveryType(ERFC2733Recovery);
+		rec.SetMaxWindowSize(5);
+		rec.SetMinWindowSize(1);
+		err = iGavdp.AddSEPCapability(rec);
+		__LOG(_L("Add configuration [Category %d] - completed with error %d\n"), rec.Category(), err);
+
+		TAvdtpContentProtectionCapabilities cp;
+		cp.SetContentProtectionType(0x1234);
+		cp.SetContentProtectionData(_L8("A test content protection method"));
+		err = iGavdp.AddSEPCapability(cp);
+	*/	
+		if(TTavsrcUtils::GetYNFromUser(iActiveConsole->Console(), _L("SBC ")))
+			{
+			TSBCCodecCapabilities sbc;
+			sbc.SetSamplingFrequencies(E48kHz|E44100Hz|E32kHz|E16kHz);
+			sbc.SetBlockLengths(EBlockLenFour | EBlockLenEight | EBlockLenTwelve | EBlockLenSixteen);
+			sbc.SetMinBitpoolValue(2);
+			sbc.SetMaxBitpoolValue(250);
+			sbc.SetChannelModes(EJointStereo | EStereo | EMono | EDualChannel);
+			sbc.SetSubbands(EFourSubbands|EEightSubbands);
+			sbc.SetAllocationMethods(ELoudness | ESNR);
+			
+			// crazy stuff testing
+			/*
+			sbc.SetSamplingFrequencies(E16kHz);
+			sbc.SetBlockLengths(EBlockLenTwelve);
+			sbc.SetChannelModes(EJointStereo);
+			sbc.SetSubbands(EFourSubbands);
+			*/		
+			err = iGavdp.AddSEPCapability(sbc);
+			
+			__LOG(_L("Add configuration [Category %d] - completed with error %d\n"), sbc.Category(), err);
+			}
+		else
+			{
+			TNonSBCCodecCapabilities codec(SymbianBluetoothAV::EAvdtpMediaTypeAudio, SymbianBluetoothAV::EAudioCodecMPEG24AAC);
+			TBuf8<18> mpeg2aacData;
+			mpeg2aacData.Append(0x80);		// MPEG2 AAC LC
+			mpeg2aacData.Append(0x01);		// 44.1 kHz		
+			mpeg2aacData.Append(0x80);		// 48.0 kHz, Channels 1 & 2
+			mpeg2aacData.Append(0x80);		// VBR, unknown bitrate
+			mpeg2aacData.Append(0x00);		// unknown bitrate
+			mpeg2aacData.Append(0x00);		// unknown bitrate
+	
+			codec.SetCodecData(mpeg2aacData);
+			
+			err = iGavdp.AddSEPCapability(codec);
+			
+			__LOG(_L("Add configuration [Category %d] - completed with error %d\n"), codec.Category(), err);
+			}
+
+		iRegisteringLocalSEP = ETrue;
+		iGavdp.CommitSEPConfiguration();
+		
+		__LOG(_L("Commit configuration [SEID %d]\n"), info.SEID().SEID());	
+		}
+	return err;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrc.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,305 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRC_H
+#define TAVSRC_H
+
+//only use define CHANNEL_BINDING_DEBUG_CHECK when checking channel binding
+//#define CHANNEL_BINDING_DEBUG_CHECK
+
+#define __PRINT iActiveConsole->Console().Printf
+#define __LOG iLogConsole->Console().Printf /*RDebug::Print*/
+
+#include "tavsrcConsole.h"
+#include "tavsrcStreamerUser.h"
+#include "tavsrcOperations.h"
+
+#include <f32file.h>
+#include <btsdp.h>
+#include <rtp.h>
+#include <gavdp.h>
+#include <remconcoreapitargetobserver.h>
+#include <remcongroupnavigationtarget.h>
+#include <remcongroupnavigationtargetobserver.h>
+
+#include <remconmediainformationtarget.h>
+#include <remconmediainformationtargetobserver.h>
+
+#include <remconbatterytarget.h>
+#include <remconbatterytargetobserver.h>
+
+#include <playerinformationtarget.h>
+#include <playerinformationtargetobserver.h>
+
+#include <remconabsvoltargetobserver.h>
+#include <remcontrackinfotargetobserver.h>
+
+enum TRemConInterfaces
+	{
+	ECoreApiTarget = 1 << 0,
+	ECoreApiController = 1 << 1,
+	EGroupNavigation = 1 << 2,
+	EMediaInformation = 1 << 3,
+	EBatteryStatus = 1 << 4,
+	EAbsoluteVolumeTarget = 1 << 5,
+	EAbsoluteVolumeController = 1 << 6,
+	EPlayerInformation = 1 << 7,
+	ENowPlaying = 1 << 8,
+	EMediaBrowse = 1 << 9,
+	EDatabaseAware = 1 << 10,
+	ESeparateThreadForBrowse = 1 << 11,
+	EVendorTrackInfoTarget = 1 << 12,
+	EVendorAbsoluteVolumeTarget = 1 << 13,
+	};
+
+
+typedef TFixedArray<RSocket, 3> RSocketArray;
+
+class CActivePacketDropIoctl;
+class CActiveSockReader;
+class CActiveSockWriter;
+class CRemMetadataTransferTarget;
+class CAVTestApp;
+class CActiveStreamer;
+class CTavsrcController;
+class CRemConInterfaceSelector;	
+class CRemConCoreApiTarget;
+class CRemConTrackInfoTarget;
+class CRemConAbsVolTarget;
+class CTavsrcMtUpdater;
+class CTavsrcAbsoluteVolume;
+class CAVTestApp : public CBase, public MActiveConsoleNotify,
+						public MGavdpUser, public MBluetoothPhysicalLinksNotifier,
+						public MRemConCoreApiTargetObserver,
+						public MActiveStreamerUser,
+						public MRemConMediaInformationTargetObserver,
+						public MRemConGroupNavigationTargetObserver,
+						public MRemConBatteryTargetObserver,
+						public MRemConTrackInfoTargetObserver,
+						public MRemConAbsVolTargetObserver
+	{
+private:
+	enum TTavsrcServiceCategory
+		{
+		ETavsrcServiceCategoryNull				=0x00,
+		ETavsrcServiceCategoryMediaTransport 	=0x01,
+		ETavsrcServiceCategoryReporting			=0x02,
+		ETavsrcServiceCategoryRecovery			=0x04,
+		ETavsrcServiceCategoryContentProtection	=0x08,
+		ETavsrcServiceCategoryHeaderCompression	=0x10,
+		ETavsrcServiceCategoryMultiplexing		=0x20,
+		ETavsrcServiceCategoryMediaCodec		=0x40,
+		};
+public:
+	static CAVTestApp* NewL();
+	void EchoStorm();
+
+	void StartL();
+	void Stop();
+	~CAVTestApp();
+	void TestMenu();
+
+	void KeyPressed(TChar aKey);
+
+	TInt StartSrc();
+	void StopSrc();
+	void DisconnectSrc();
+
+	// echo test
+	virtual void HandleCreateConnectionCompleteL(TInt aErr);
+	virtual void HandleDisconnectCompleteL(TInt aErr);
+	virtual void HandleDisconnectAllCompleteL(TInt aErr);
+
+private:
+	void PreventLowPowerModes();
+	void AllowLowPowerModes();
+	void CreateBearers();
+	void CloseBearers();
+	void ConfigureSEPL();
+	void Abort();
+	void DiscoverSEPs();
+	void StartStreams();
+	void SuspendStreams();
+	void GetCapabilities();
+	void SendSecurityControl();
+	TSBCCodecCapabilities InteractiveSBCMediaCodecConfig(TSBCCodecCapabilities& caps);
+	
+	void PrintCommandOption(TChar aOperation, TPtrC aDesc);
+	
+	void CreateStreamerL(RSocketArray aSockets);
+	void CreateRemConInterfacesL();
+
+	void Connect();
+	TInt Listen();
+	TInt RegisterSEP();
+	
+	CAVTestApp();
+	void ConstructL();
+
+	//return ETrue if current SEP is sink, EFalse otherwise
+	TBool CurrentSEIDIsSink();
+
+	void DisplayHelp();
+	void ParseCommandLineL();
+	
+private:
+	// GAVDP callbacks
+	virtual void GAVDP_SEPDiscovered(const TAvdtpSEPInfo& aSEP);
+	virtual void GAVDP_SEPDiscoveryComplete();
+	virtual void GAVDP_SEPCapability(TAvdtpServiceCapability* aCapability);	
+	virtual void GAVDP_SEPCapabilityComplete();
+	virtual void GAVDP_AbortStreamConfirm();
+	virtual void GAVDP_StartStreamsConfirm();
+	virtual void GAVDP_SuspendStreamsConfirm();
+	virtual void GAVDP_SecurityControlConfirm(const TDesC8& aResponseData);
+	virtual void GAVDP_ConfigurationConfirm();	// configuration complete and SEP selected *AND* reconfigure confirm
+	virtual void GAVDP_Error(TInt aError, const TDesC8& aErrorData);
+	virtual void GAVDP_ConnectConfirm(const TBTDevAddr& aAddr);
+
+	virtual void GAVDP_ConfigurationStartIndication(TSEID aLocalSEID, TSEID aRemoteSEID);	
+	virtual TInt GAVDP_ConfigurationIndication(TAvdtpServiceCapability* aCapability);
+	virtual TInt GAVDP_ConfigurationEndIndication();
+
+	virtual TInt GAVDP_StartIndication(TSEID aSEID);
+	virtual TInt GAVDP_SuspendIndication(TSEID aSEID);
+	virtual TInt GAVDP_SecurityControlIndication(TSEID aSEID, TDes8& aSecurityData);
+	virtual void GAVDP_AbortIndication(TSEID aSEID);
+	virtual void GAVDP_ReleaseIndication(TSEID aSEID);
+	virtual void GAVDP_BearerReady(RSocket aNewSocket, const TAvdtpSockAddr& aAddr);
+	
+	void PrettyPrint(TAvdtpServiceCapability& aCapability);
+	
+private:
+	// RemConCoreApiTarget callbacks
+	virtual void MrccatoCommand(TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct);
+	virtual void MrccatoPlay(TRemConCoreApiPlaybackSpeed aSpeed, TRemConCoreApiButtonAction aButtonAct);
+
+private:
+	// from MActiveStreamerUser
+	virtual void MediaCodecConfigurationRequired(TSBCCodecCapabilities& aConfig);
+
+	virtual TInt MrcmtcGetElementAttributes(TUint64 aElement, TUint32 aAttribute, HBufC8*& aOutValueOwnershipTransferred);
+
+	// from MRemConGroupNavigationTargetObserver	
+	virtual void MrcgntoNextGroup(TRemConCoreApiButtonAction aButtonAct);
+	virtual void MrcgntoPreviousGroup(TRemConCoreApiButtonAction aButtonAct);
+	virtual void MrcbstoBatteryStatus(TControllerBatteryStatus& aBatteryStatus);
+
+	// from MRemConMediaInformationTargetObserver	
+	virtual void MrcmitoGetCurrentlyPlayingMetadata( TMediaAttributeIter& aAttributeIter );
+
+	virtual void MrcncRegisterPlaybackStatusChangedNotification();
+	virtual void MrcncRegisterTrackChangedNotification();
+	virtual void MrcncRegisterTrackReachedEndNotification();
+	virtual void MrcncRegisterTrackReachedStartNotification();
+	virtual void MrcncRegisterPositionChangedNotification(TUint32 aInterval);
+	virtual void MrcncRegisterBatteryStatusChangedNotification();
+	virtual void MrcncRegisterSystemStatusChangedNotification();
+	virtual void MrcncRegisterPlayerApplicationStatusChangedNotification();
+	
+	virtual void MrcavtoGetAbsoluteVolume();
+	virtual void MrcavtoSetAbsoluteVolume(TUint /*aAbsVol*/, TUint /*aMaxVol*/);
+	
+	virtual void MrctitoGetTrackName();
+	virtual void MrctitoGetArtist();
+	virtual void MrctitoGetTrackDuration();
+
+private:
+	CActiveConsole* iActiveConsole;
+	CActiveConsole* iLogConsole;
+	CTavsrcMtUpdater*			iMtUpdater;
+		
+	RSocketServ iSockServ;
+	
+#ifdef CHANNEL_BINDING_DEBUG_CHECK
+	CActiveSockReader* iRepReader;
+	CActiveSockWriter* iRepWriter;
+	CActiveSockReader* iRecvReader;
+	CActiveSockWriter* iRecvWriter;
+#endif
+	
+	CActivePacketDropIoctl* iPacketDropIoctl;
+
+	RGavdp iGavdp;	
+	
+	TSEID iCurrentSEID; // Current Remote SEID
+	TSEID iCurrentLocalSEID; // Current Local SEID
+
+	RPointerArray<TAvdtpServiceCapability> iSEPCapabilities; // only held for one SEP at a time in this test code
+
+	RArray<TSEID> iShortlistedSEIDs;	// for finding good remote SEP
+	TBool iChosenSEP;
+	
+	RArray<TAvdtpSEPInfo> iLocallyRegisteredSEPs;
+	TBool iRegisteringLocalSEP;
+	
+	CActiveStreamer* iStreamer;
+	RSocketArray iPendingSockets;
+	
+	CRemConInterfaceSelector* iRemConInterfaceSelector;
+	CRemConCoreApiTarget* iRemConTarget;
+	CRemConGroupNavigationApiTarget* iGroupNavigation;
+	CRemConMediaInformationTarget* iMediaInformation;
+	CRemConBatteryApiTarget* iBatteryStatus;
+	CRemConTrackInfoTarget* iTrackInfo;
+	CRemConAbsVolTarget* iAbsoluteVolume;
+	CTavsrcAbsoluteVolume* iTavsrcAbsoluteVolume;
+
+	RSdp iSdp;
+	RSdpDatabase iSdpDB;
+	TSdpServRecordHandle iSrcHandle;
+	TSdpServRecordHandle iSnkHandle;
+	
+	TBool iAutoStream;
+	
+	enum TGavdpState
+		{
+		ENoClientOpen,
+		EIdle,
+		ESigConnected,
+		EOpen,
+		ESuspended,
+		ERemoteReconfiguring,
+		};
+
+	enum TStreamState
+		{
+		EClosed,
+		EStreaming,
+		EPaused,
+		EStopped,
+		};
+		
+	TGavdpState iGavdpState;
+	TStreamState iStreamState;
+	
+	TSBCCodecCapabilities iReconfigInfo;
+	TBool iLocalReconfigure;
+	
+	TUint iDisplayMode;
+	TBool iPreloadFile;
+	
+	CTavsrcController* iController;
+	TBTDevAddr iDevAddr;
+
+	CTavsrcOperations* iOperations;
+	
+	RBuf iFilename;
+	RBTPhysicalLinkAdapter iPhy;
+		
+	TUint iRemConInterfaces;
+	};
+
+#endif // TAVSRC_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrc.mmp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,78 @@
+// Copyright (c) 2008-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:
+// tavrsc.mmp
+// 
+//
+
+#define DBAWARE
+MACRO DBAWARE
+
+
+TARGET tavsrc.exe
+TARGETTYPE exe
+UID 0
+
+SOURCEPATH .              
+SOURCE tavsrc.cpp
+SOURCE tavsrcUI.cpp
+SOURCE tavsrcConsole.cpp
+SOURCE tavsrcController.cpp
+SOURCE tavsrcSock.cpp
+SOURCE tavsrcStreamer.cpp
+SOURCE tavsrcTimer.cpp
+SOURCE tavsrcUtils.cpp
+SOURCE tavsrcOperations.cpp
+SOURCE tavsrcAbsoluteVolume.cpp 
+SOURCE activecallbackconsole.cpp
+
+#ifdef DBAWARE
+SOURCE tavsrcmtupdaterdatabaseaware.cpp
+#else 
+SOURCE tavsrcmtupdaterdatabaseunaware.cpp
+#endif
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+MW_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+USERINCLUDE ../../../../../mw/btservices/bluetoothappprofiles/avrcp/common  
+
+LIBRARY euser.lib esock.lib bluetooth.lib bluetoothav.lib gavdp.lib
+LIBRARY	sdpdatabase.lib
+LIBRARY flogger.lib efsrv.lib rtp.lib
+LIBRARY remconcoreapi.lib
+LIBRARY remconclient.lib
+LIBRARY remcontypes.lib
+LIBRARY remconinterfacebase.lib
+LIBRARY econs.lib
+LIBRARY c32.lib
+LIBRARY hal.lib
+LIBRARY btextnotifiers.lib
+LIBRARY bafl.lib
+
+LIBRARY remcongroupnavigationapi.lib
+LIBRARY remconmediainformationapi.lib
+LIBRARY remconbatterystatusapi.lib
+LIBRARY remconplayerinformation.lib 
+LIBRARY remconextapi1.lib
+LIBRARY remconnowplayingapi.lib
+LIBRARY remconmediabrowseapi.lib
+LIBRARY remconabsolutevolume.lib
+
+#include <bluetooth/btlogger.mmh>
+
+EPOCHEAPSIZE	1024000 4096000
+CAPABILITY ALL -TCB
+VENDORID 0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcAbsoluteVolume.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,171 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcAbsoluteVolume.h"
+#include <absolutevolumeapicontroller.h>
+#include <absolutevolumeapitarget.h>
+
+#ifdef __WINS__
+GLDEF_D TSize gAbsoluteVolumeConsole(75,30);
+#else
+GLDEF_D TSize gAbsoluteVolumeConsole(KConsFullScreen,KConsFullScreen);
+#endif
+
+	
+CTavsrcAbsoluteVolume* CTavsrcAbsoluteVolume::NewL(CRemConInterfaceSelector& aIfSel)
+	{
+	CTavsrcAbsoluteVolume* self = new (ELeave) CTavsrcAbsoluteVolume();
+	CleanupStack::PushL(self);
+	self->ConstructL(aIfSel);
+	CleanupStack::Pop();
+	return self;
+	}
+
+CTavsrcAbsoluteVolume::~CTavsrcAbsoluteVolume()
+	{
+	Cancel();
+	delete iMtAbsoluteVolumeConsole;
+	}
+
+CTavsrcAbsoluteVolume::CTavsrcAbsoluteVolume()
+	: CActive(EPriorityStandard)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CTavsrcAbsoluteVolume::ConstructL(CRemConInterfaceSelector& aIfSel)
+	{
+	iAbsoluteVolumeTarget = CRemConAbsoluteVolumeTarget::NewL(aIfSel, *this, KInitialVolume, KMaxTgVolume);
+	iAbsoluteVolumeController = CRemConAbsoluteVolumeController::NewL(aIfSel, *this, KMaxCtVolume);
+	iMtAbsoluteVolumeConsole = CActiveConsole::NewL(*this,_L("AbsoluteVolume"),gAbsoluteVolumeConsole);
+	MtMenu();
+	}
+
+void CTavsrcAbsoluteVolume::MtMenu()
+	{
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("1.\tCT SetAbsoluteVolume \n"));
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("2.\tCT Cancel SetAbsoluteVolume \n"));
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("3.\tCT RegisterAbsoluteVolumeNotification \n"));
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("4.\tCT CancelAbsoluteVolumeNotification\n"));
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("5.\tTG SetAbsoluteVolumeResponse\n"));
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("6.\tTG AbsoluteVolumeChanged\n"));
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("\n"));
+	
+	iMtAbsoluteVolumeConsole->RequestKey();
+	}
+
+void CTavsrcAbsoluteVolume::KeyPressed(TChar aKey)
+	{
+	switch(aKey)
+			{
+		case '1':
+			{
+			TRequestStatus status;
+			iAbsoluteVolumeController->SetAbsoluteVolume(iStatus, GetVolume(), iNumRemotes);
+			SetActive();
+			break;
+			}
+		case '2':
+			{
+			iAbsoluteVolumeController->CancelSetAbsoluteVolume();
+			iMtAbsoluteVolumeConsole->Console().Printf(_L("CT Cancelled Set Absolute Volume\n"));
+			break;
+			}
+
+		case '3':
+			{
+			TRequestStatus status;
+			iAbsoluteVolumeController->RegisterAbsoluteVolumeNotification();
+			iMtAbsoluteVolumeConsole->Console().Printf(_L("CT Registered Absolute Volume Notification \n"));
+			break;
+			}
+		case '4':
+			{
+			iAbsoluteVolumeController->CancelAbsoluteVolumeNotification();
+			iMtAbsoluteVolumeConsole->Console().Printf(_L("CT Cancelled Absolute Volume Notification  \n"));
+			break;
+			}
+		case '5':
+			{
+			iAbsoluteVolumeTarget->SetAbsoluteVolumeResponse(GetVolume(), KErrNone);
+			iMtAbsoluteVolumeConsole->Console().Printf(_L("TG SetAbsoluteVolumeResponse \n"));
+			break;
+			}
+		case '6':
+			{
+			iAbsoluteVolumeTarget->AbsoluteVolumeChanged(GetVolume());
+			iMtAbsoluteVolumeConsole->Console().Printf(_L("TG AbsoluteVolumeChanged \n"));
+			break;
+			}
+		default:
+			iMtAbsoluteVolumeConsole->Console().Printf(_L("No such command\n"));
+			break;
+			};
+			
+	MtMenu();
+	}
+	
+void CTavsrcAbsoluteVolume::MrcavtoSetAbsoluteVolumeRequest(TUint32 aVolume, 
+		TUint32 aMaxVolume)
+	{
+	TUint32 scaledVolume = (aVolume * 10)/(aMaxVolume);
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("MrcavtoSetAbsoluteVolumeRequest vol= %d, maxVol= %d, setting volume  = %d\n"), aVolume, aMaxVolume, scaledVolume);
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("Provide volume for response relative to local max volume (%d)\n"), KMaxTgVolume);
+	iAbsoluteVolumeTarget->SetAbsoluteVolumeResponse(GetVolume(), KErrNone); 
+	}
+	
+void CTavsrcAbsoluteVolume::MrcavcoCurrentVolume(TUint32 aVolume, 
+		TUint32 aMaxVolume,
+		TInt aError)
+	{
+	iMtAbsoluteVolumeConsole->Console().Printf(
+			_L("MrcavcoCurrentVolume vol= %d, maxVol= %d, err= %d\n"), 
+			aVolume, aMaxVolume, aError);
+	}
+
+void CTavsrcAbsoluteVolume::MrcavcoAbsoluteVolumeNotificationError()
+	{
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("MrcavcoAbsoluteVolumeNotificationError\n"));
+	}
+
+void CTavsrcAbsoluteVolume::MrcavcoSetAbsoluteVolumeResponse(TUint32 aVolume,
+		TUint32 aMaxVolume,
+		TInt aError)
+	{
+	iMtAbsoluteVolumeConsole->Console().Printf(
+			_L("MrcavcoSetAbsoluteVolumeResponse vol= %d, maxVol= %d, err= %d\n"), 
+			aVolume, aMaxVolume, aError);
+	}
+
+void CTavsrcAbsoluteVolume::RunL()
+	{
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("CT SetAbsoluteVolume Sent %d to %u remotes\n"), iStatus.Int(), iNumRemotes);
+	}
+
+void CTavsrcAbsoluteVolume::DoCancel()
+	{
+	iAbsoluteVolumeController->CancelSetAbsoluteVolume();
+	}
+
+TUint32 CTavsrcAbsoluteVolume::GetVolume()
+	{
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("Enter volume: "));
+	TUint32 volume = iMtAbsoluteVolumeConsole->GetIntFromUser();
+	iMtAbsoluteVolumeConsole->Console().Printf(_L("\n"));
+	
+	return volume;
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcAbsoluteVolume.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,72 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCABSOLUTEVOLUME_H_
+#define TAVSRCABSOLUTEVOLUME_H_
+#include <absolutevolumeapitargetobserver.h>
+#include <absolutevolumeapicontrollerobserver.h>
+#include "tavsrcConsole.h"
+
+static const TUint32 KInitialVolume = 1;
+static const TUint32 KMaxTgVolume = 10;
+
+static const TUint32 KMaxCtVolume = 100;
+
+class CActiveConsole;
+class CRemConInterfaceSelector;
+class CRemConAbsoluteVolumeTarget;
+class CRemConAbsoluteVolumeController;
+class CTavsrcAbsoluteVolume: public CActive, 
+	                         public MActiveConsoleNotify,
+	                         public MRemConAbsoluteVolumeTargetObserver,
+	                         public MRemConAbsoluteVolumeControllerObserver
+    {
+public:
+	static CTavsrcAbsoluteVolume* NewL(CRemConInterfaceSelector& aIfSel);
+	~CTavsrcAbsoluteVolume();	
+
+private:
+	CTavsrcAbsoluteVolume();
+	void ConstructL(CRemConInterfaceSelector& aIfSel);
+
+private://from MActiveConsoleNotify
+	void KeyPressed(TChar aKey);
+	
+private:
+	//from MRemConAbsoluteVolumeTargetObserver
+	void MrcavtoSetAbsoluteVolumeRequest(TUint32 aVolume, TUint32 aMaxVolume);
+	
+	//from MRemConAbsoluteVolumeControllerObserver
+	void MrcavcoCurrentVolume(TUint32 aVolume, TUint32 aMaxVolume, TInt aError);
+	void MrcavcoSetAbsoluteVolumeResponse(TUint32 aVolume, TUint32 aMaxVolume, TInt aError);
+	void MrcavcoAbsoluteVolumeNotificationError();
+	
+private:
+	// from CActive
+	void RunL();
+	void DoCancel();
+	
+private: 
+	void MtMenu();
+	TUint32 GetVolume();
+
+private:
+	CActiveConsole* iMtAbsoluteVolumeConsole;
+	CRemConAbsoluteVolumeTarget* iAbsoluteVolumeTarget;
+	CRemConAbsoluteVolumeController* iAbsoluteVolumeController;
+	TUint iNumRemotes;
+	};
+
+#endif /*TAVSRCABSOLUTEVOLUME_H_*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcConsole.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,191 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcConsole.h"
+#include "tavsrc.h"
+
+#include <e32test.h>
+
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV")
+#define LDD_NAME _L("ECOMM")
+#else  // __GCC32__
+#define PDD_NAME _L("EUART1")
+#define LDD_NAME _L("ECOMM")
+#endif
+
+static RTest testOutcome(_L("Test results"));	
+
+CActiveConsole::CActiveConsole(MActiveConsoleNotify& aNotify)
+	: CActive(EPriorityStandard), iNotify(aNotify)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+
+CActiveConsole::~CActiveConsole()
+	{
+	Cancel();
+	delete iConsole;
+	}
+
+CActiveConsole* CActiveConsole::NewL(MActiveConsoleNotify& aNotify,const TDesC& aTitle,const TSize& aSize)
+	{
+	CActiveConsole* console = new (ELeave) CActiveConsole(aNotify);
+	CleanupStack::PushL(console);
+	console->ConstructL(aTitle,aSize);
+	CleanupStack::Pop();
+	return console;
+	}
+
+void CActiveConsole::ConstructL(const TDesC& aTitle,const TSize& aSize)
+	{
+	iConsole = Console::NewL(aTitle,aSize);
+	}
+
+void CActiveConsole::DoCancel()
+	{
+	iConsole->ReadCancel();
+	}
+
+void CActiveConsole::RequestKey()
+	{
+	DrawCursor();
+	iConsole->Read(iStatus);
+	SetActive();
+	}
+
+void CActiveConsole::DrawCursor()
+	{
+	iConsole->Printf(_L(">>"));
+	}
+
+void CActiveConsole::RunL()
+	{
+	// key has been pressed
+	TChar ch = iConsole->KeyCode();
+	iNotify.KeyPressed(ch);
+	}
+
+TInt CActiveConsole::RunError(TInt aError)
+	{
+	iConsole->Printf(_L("Console error %d\nTrying again...\n"), aError);
+	RequestKey();
+	return KErrNone;
+	}
+
+TInt CActiveConsole::GetIntFromUser()
+	{
+	TBool requeRead = EFalse;
+	if(IsActive())
+		{
+		Cancel();
+		requeRead = ETrue;
+		}
+
+	TKeyCode key;
+	
+	TBuf<10> intBuf;
+	
+	while((key = iConsole->Getch())!=EKeyEnter)
+		{
+		if(key == EKeyBackspace&&intBuf.Length()!=0)
+			{
+			intBuf.SetLength(intBuf.Length()-1);
+			iConsole->Printf(_L("%c"), key);
+			}
+		else if ( intBuf.Length() < intBuf.MaxLength())
+			{
+			intBuf.Append(key);
+			iConsole->Printf(_L("%c"), key);
+			}
+		}
+	
+	iConsole->Printf(_L("\n"));	
+	
+	TLex lex(intBuf);
+	TInt value = 0;
+	
+	TInt err = lex.Val(value);
+	if(err)
+		{
+		iConsole->Printf(_L("Error %d reading value from console\n"), err);	
+		}
+
+	if(requeRead)
+		{
+		RequestKey();
+		}
+	return value;
+	}
+
+void LoadLDD_PDDL()
+	{
+	TInt err = KErrNone;
+	testOutcome.Printf(_L("Loading PDD... "));
+	err = User::LoadPhysicalDevice(PDD_NAME);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		User::Leave(err);
+		}
+	testOutcome.Printf(_L("Loading LDD... "));
+	err = User::LoadLogicalDevice(LDD_NAME);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		User::Leave(err);
+		}
+	}
+
+void StartL()
+	{
+	LoadLDD_PDDL();
+		
+	CAVTestApp* app = CAVTestApp::NewL();
+	app->StartL();
+
+	delete app;
+	}
+	
+
+TInt E32Main()
+	{
+	__UHEAP_MARK;
+
+	CTrapCleanup* cleanupStack=CTrapCleanup::New();	// Get CleanupStack
+
+	CActiveScheduler* activescheduler=new CActiveScheduler;
+	CActiveScheduler::Install(activescheduler);
+
+	testOutcome.Printf(_L("Starting tests... "));
+	
+	TRAPD(err, StartL());
+
+	delete activescheduler;
+	delete cleanupStack;	
+
+	testOutcome.Printf(_L("Test completed result %d"), err);
+	if(err != KErrNone)
+		{
+		testOutcome.Getch();
+		}
+	testOutcome.Close();
+
+
+	__UHEAP_MARKEND;
+
+	return err ;
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcConsole.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,55 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCCONSOLE_H
+#define TAVSRCCONSOLE_H
+
+#include <e32base.h>
+#include <e32cons.h>
+
+class MActiveConsoleNotify
+	{
+public:
+	virtual void KeyPressed(TChar aKey) =0;
+	};
+
+class CActiveConsole : public CActive
+	{
+public:
+	static CActiveConsole* NewL(MActiveConsoleNotify& aNotify,const TDesC& aTitle,const TSize& aSize);
+	void RequestKey();
+	TInt GetIntFromUser();
+	
+	inline CConsoleBase& Console() const 
+		{
+		return *iConsole;
+		};
+
+	~CActiveConsole();
+
+private:
+	void RunL();
+	TInt RunError(TInt aError);
+	void DoCancel();
+	void DrawCursor();
+	CActiveConsole(MActiveConsoleNotify& aNotify);
+	void ConstructL(const TDesC& aTitle,const TSize& aSize);
+
+private:
+	CConsoleBase*	iConsole;
+	MActiveConsoleNotify&	iNotify;	
+	};
+
+#endif // TAVSRCCONSOLE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcController.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,188 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcController.h"
+
+#include <remconinterfaceselector.h>
+#include <remconcoreapicontroller.h>
+#include <remconbeareravrcp.h>
+
+CTavsrcController* CTavsrcController::NewL(CRemConInterfaceSelector& aIfSel, CActiveConsole& aConsole)
+	{
+	CTavsrcController* controller = new(ELeave) CTavsrcController(aIfSel, aConsole);
+	CleanupStack::PushL(controller);
+	controller->ConstructL();
+	CleanupStack::Pop(controller);
+	return controller;
+	}
+	
+CTavsrcController::CTavsrcController(CRemConInterfaceSelector& aIfSel, CActiveConsole& aConsole)
+	: CActive(EPriorityStandard), iState(EControllerNotConnected), iSelector(&aIfSel), iConsole(aConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CTavsrcController::ConstructL()
+	{
+	iCoreController = CRemConCoreApiController::NewL(*iSelector, *this);
+	iGoConnectionOrientedSent = EFalse;
+	}
+	
+CTavsrcController::~CTavsrcController()
+	{
+	Cancel();
+	}
+
+TInt CTavsrcController::Command(TRemConCoreApiOperationId aOpId)
+	{
+	TInt err = KErrNotReady;
+	
+	if(!IsActive())
+		{
+		err = KErrNone;
+		
+		if(iState == EControllerConnected)
+			{
+			IssueCommand(aOpId);
+			}
+		else
+			{
+			// Need to connect first
+			TRAP(err, ConnectL());
+			}
+		}
+	
+	return err;
+	}
+
+
+void CTavsrcController::MrccacoResponse(TRemConCoreApiOperationId aOperationId, TInt aError)
+	{
+	iConsole.Console().Printf(_L("Received Response for Operation %d, Result %d\n"), aOperationId, aError);
+	}
+
+void CTavsrcController::IssueCommand(TRemConCoreApiOperationId aOpId)
+	{
+	switch(aOpId)
+		{
+	case ERemConCoreApiVolumeDown:
+		iCoreController->VolumeDown(iStatus, iNumRemotes, ERemConCoreApiButtonClick);
+		break;
+	case ERemConCoreApiVolumeUp:
+		iCoreController->VolumeUp(iStatus, iNumRemotes, ERemConCoreApiButtonPress);
+		break;
+	case ERemConCoreApiForward:
+		iCoreController->Forward(iStatus, iNumRemotes, ERemConCoreApiButtonClick);
+		break;
+	case ERemConCoreApiBackward:
+		iCoreController->Backward(iStatus, iNumRemotes, ERemConCoreApiButtonClick);
+		break;
+	case ERemConCoreApiPlay:
+		iCoreController->Play(iStatus, iNumRemotes, ERemConCoreApiButtonClick);
+		break;
+	case ERemConCoreApiStop:
+		iCoreController->Stop(iStatus, iNumRemotes, ERemConCoreApiButtonClick);
+		break;
+	default:
+		// Cos we don't want to SetActive(), alright?
+		return;
+		}
+	
+	iConsole.Console().Printf(_L("Sending Command Operation %d\n"), aOpId);	
+	SetActive();
+	}
+
+void CTavsrcController::ConnectL()
+	{
+	//Ask user which device address we should connect to...	
+	iState = ESearchingForDevice;
+	User::LeaveIfError(iNotify.Connect());
+	iNotify.StartNotifierAndGetResponse(iStatus, KDeviceSelectionNotifierUid, iPckg, iResPckg);
+	SetActive();
+	}
+	
+void CTavsrcController::RunL()
+	{
+	switch(iState)
+		{
+	case EControllerConnected:
+		{
+		// We don't care what the result was really
+		// Ask Tim about the display logging and 
+		// log it
+		break;
+		}
+	case EControllerNotConnected:
+		{
+		iConsole.Console().Printf(_L("AVRCP connection completed, result = %d\n"), iStatus.Int());
+
+		if(iStatus.Int() == KErrNone)
+			{
+			// Connected ok, now issue command
+			iState = EControllerConnected;
+			IssueCommand(iOutstandingOperation);	
+			}
+		break;
+		}
+	case ESearchingForDevice:
+		{
+		if (iStatus.Int() == KErrNone)
+			{
+			iState = EControllerNotConnected;
+			
+			iNotify.CancelNotifier(KDeviceSelectionNotifierUid);
+			iNotify.Close();
+			
+			iConsole.Console().Printf(_L("Opening AVRCP connection...\n"));
+
+			TBTDevAddr btAddr = iResPckg().BDAddr();
+			// Store as 8 bit machine readable
+			RBuf8 bearerData;
+			bearerData.CreateL(btAddr.Des());
+
+			// Form the RemCon Addr from the AVRCP Uid and the 
+			// bluetooth address
+			TRemConAddress addr;
+			addr.BearerUid() = TUid::Uid(KRemConBearerAvrcpImplementationUid);
+			addr.Addr() = bearerData;
+
+			if (iGoConnectionOrientedSent)
+				{
+				// Only allowed to call GoConnectionOrientedL() once on pain of RemCon panic,
+				// ERemConClientPanicAlreadyConnectionOriented. Solution is to call GoConnectionlessL()
+				// before recalling GoConnectionOrientedL()
+				iSelector->GoConnectionlessL();
+				}
+			iSelector->GoConnectionOrientedL(addr);
+			iSelector->ConnectBearer(iStatus);
+			iGoConnectionOrientedSent = ETrue;
+
+			SetActive();
+			break;
+			}
+		}
+	default:
+		{
+		// hmm shouldn't be here
+		__DEBUGGER();
+		break;
+		}
+		}
+	}
+	
+void CTavsrcController::DoCancel()
+	{
+	iCoreController->Cancel();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcController.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,68 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCCONTROLLER_H
+#define TAVSRCCONTROLLER_H
+
+#include "tavsrcConsole.h"
+
+#include <e32base.h>
+#include <btextnotifiers.h>
+#include <remconcoreapicontrollerobserver.h>
+
+class CRemConInterfaceSelector;
+class CRemConCoreApiController;
+
+class CTavsrcController : public CActive, public MRemConCoreApiControllerObserver
+	{
+public:
+	static CTavsrcController* NewL(CRemConInterfaceSelector& aIfSel, CActiveConsole& aConsole);
+	~CTavsrcController();
+
+	TInt Command(TRemConCoreApiOperationId aOpId);
+	void MrccacoResponse(TRemConCoreApiOperationId aOperationId, TInt aError);
+
+private:
+	CTavsrcController(CRemConInterfaceSelector& aIfSel, CActiveConsole& aConsole);
+	void ConstructL();
+		
+	void RunL();
+	void DoCancel();
+
+	void ConnectL();
+	void IssueCommand(TRemConCoreApiOperationId aOpId);
+		
+private:
+	enum TTavsrcControllerState
+		{
+		EControllerConnected,
+		EControllerNotConnected,
+		ESearchingForDevice,
+		};
+
+private:
+	TTavsrcControllerState	  iState;
+	CRemConInterfaceSelector* iSelector;
+	TBool                     iGoConnectionOrientedSent;
+	CRemConCoreApiController* iCoreController;
+	TUint					  iNumRemotes;	
+	TRemConCoreApiOperationId iOutstandingOperation;
+	CActiveConsole&			  iConsole;
+	RNotifier 				  iNotify;
+	TBTDeviceSelectionParamsPckg iPckg;
+	TBTDeviceResponseParamsPckg iResPckg;
+	};
+
+#endif // TAVSRCCONTROLLER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcOperations.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,260 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcOperations.h"
+
+// The opcodes used internally to CTavsrcOperations
+static const TInt KTavsrcOpCodeConnect = 0x00000001;
+static const TInt KTavsrcOpCodeCancel = 0x00000002;
+static const TInt KTavsrcOpCodeDiscoverSEPs = 0x00000004;
+static const TInt KTavsrcOpCodeCreateBearers = 0x00000008;
+static const TInt KTavsrcOpCodeCloseBearers = 0x00000010;
+static const TInt KTavsrcOpCodeContentProtection = 0x00000020;
+static const TInt KTavsrcOpCodeGetCapabilities = 0x00000040;
+static const TInt KTavsrcOpCodeStartStreams = 0x00000080;
+static const TInt KTavsrcOpCodeSuspendStreams = 0x00000100;
+static const TInt KTavsrcOpCodeEchoStorm = 0x00000200;
+static const TInt KTavsrcOpCodeAbort = 0x00000400;
+static const TInt KTavsrcOpCodeStream = 0x00000800;
+static const TInt KTavsrcOpCodeStreamFaster = 0x00001000;
+static const TInt KTavsrcOpCodeStreamSlower = 0x00002000;
+static const TInt KTavsrcOpCodeAutoStream = 0x00004000;
+static const TInt KTavsrcOpCodeStopStream = 0x00008000;
+static const TInt KTavsrcOpCodeRegisterSEP = 0x00010000;
+static const TInt KTavsrcOpCodeRegisterMultipleSEPs = 0x00020000;
+static const TInt KTavsrcOpCodeStartSrc = 0x00040000;
+static const TInt KTavsrcOpCodeStopSrc = 0x00080000;
+static const TInt KTavsrcOpCodeDisconnectSrc = 0x00100000;
+static const TInt KTavsrcOpCodeConfigureSEP = 0x00200000;
+static const TInt KTavsrcOpCodeReconfigureSEP = 0x00400000;
+static const TInt KTavsrcOpCodePacketDropIoctl = 0x00800000;
+static const TInt KTavsrcOpCodeVolumeUp = 0x01000000;
+static const TInt KTavsrcOpCodeVolumeDown = 0x02000000;
+static const TInt KTavsrcOpCodeBackwards = 0x04000000;
+static const TInt KTavsrcOpCodeForwards = 0x08000000;
+static const TInt KTavsrcOpCodePlay = 0x10000000;
+static const TInt KTavsrcOpCodeStop = 0x20000000;
+static const TInt KTavsrcOpCodeExit = 0x40000000;
+static const TInt KTavsrcOpCodeToggleSafeMode = 0x80000000;
+
+// all the AVRCP opcodes
+static const TInt KTavsrcOpCodeAvrcp = KTavsrcOpCodeVolumeUp | KTavsrcOpCodeVolumeDown | KTavsrcOpCodeBackwards | KTavsrcOpCodeForwards | KTavsrcOpCodePlay | KTavsrcOpCodeStop;
+
+// all always available opcodes
+static const TInt KTavsrcOpCodeAlwaysAvailable = KTavsrcOpCodeAvrcp | KTavsrcOpCodeToggleSafeMode | KTavsrcOpCodeCancel | KTavsrcOpCodeExit | KTavsrcOpCodeStopSrc | KTavsrcOpCodeRegisterSEP | KTavsrcOpCodeRegisterMultipleSEPs;
+
+// all possible opcodes
+static const TInt KTavsrcOpCodeAll = 0xffffffff;
+
+// The next opcodes for every command, 0 means to not change state
+static const TInt KTavsrcOpConnectNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeDiscoverSEPs | KTavsrcOpCodeAutoStream;
+static const TInt KTavsrcOpCancelNextOperations = 0;
+static const TInt KTavsrcOpDiscoverSEPsNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeGetCapabilities;
+static const TInt KTavsrcOpCreateBearersNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeCloseBearers;
+static const TInt KTavsrcOpCloseBearersNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeCreateBearers;
+static const TInt KTavsrcOpContentProtectionNextOperations = 0;
+static const TInt KTavsrcOpGetCapabilitiesNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeConfigureSEP;
+static const TInt KTavsrcOpStartStreamsNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeStream | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeSuspendStreams | KTavsrcOpCodeAbort;
+static const TInt KTavsrcOpSuspendStreamsNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeAbort | KTavsrcOpCodeReconfigureSEP;
+static const TInt KTavsrcOpEchoStormNextOperations = 0;
+static const TInt KTavsrcOpAbortNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeCloseBearers;
+static const TInt KTavsrcOpStreamNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeStopStream | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeSuspendStreams | KTavsrcOpCodeAbort | KTavsrcOpCodeStreamFaster | KTavsrcOpCodeStreamSlower;
+static const TInt KTavsrcOpStreamFasterNextOperations = 0;
+static const TInt KTavsrcOpStreamSlowerNextOperations = 0;
+static const TInt KTavsrcOpAutoStreamNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeStopStream | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeSuspendStreams;
+static const TInt KTavsrcOpStopStreamNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeStream | KTavsrcOpCodeSuspendStreams | KTavsrcOpCodeAbort;
+static const TInt KTavsrcOpRegisterSEPNextOperations = 0;
+static const TInt KTavsrcOpRegisterMultipleSEPsNextOperations = 0;
+static const TInt KTavsrcOpStartSrcNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeConnect;
+static const TInt KTavsrcOpStopSrcNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartSrc;
+static const TInt KTavsrcOpDisconnectSrcNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeConnect;
+static const TInt KTavsrcOpConfigureSEPNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeCreateBearers;
+static const TInt KTavsrcOpReconfigureSEPNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeAbort | KTavsrcOpCodeReconfigureSEP;
+static const TInt KTavsrcOpPacketDropIoctlNextOperations = 0;
+static const TInt KTavsrcOpVolumeUpNextOperations = 0;
+static const TInt KTavsrcOpVolumeDownNextOperations = 0;
+static const TInt KTavsrcOpBackwardsNextOperations = 0;
+static const TInt KTavsrcOpForwardsNextOperations = 0;
+static const TInt KTavsrcOpPlayNextOperations = 0;
+static const TInt KTavsrcOpStopNextOperations = 0;
+static const TInt KTavsrcOpExitNextOperations = 0;
+static const TInt KTavsrcOpToggleSafeModeNextOperations = 0;
+
+// TTavsrcOperation
+TTavsrcOperation::TTavsrcOperation(TInt aOpCode, TChar aOperation, TInt aNextOpCodes)
+	: iOpCode(aOpCode), iOperation(aOperation), iNextOpCodes(aNextOpCodes)
+	{	
+	}
+
+/*static*/ TBool TTavsrcOperation::OperationMatchesAndAllowed(const TTavsrcOperation& aOpA, const TTavsrcOperation& aOpB)
+	{
+	return ((aOpA.iOperation == aOpB.iOperation) && (aOpA.iNextOpCodes & aOpB.iOpCode));
+	}
+
+TInt TTavsrcOperation::GetNextOpCodes() const
+	{
+	return iNextOpCodes;
+	}
+
+// CTavsrcOperations
+CTavsrcOperations* CTavsrcOperations::NewL()
+	{
+	CTavsrcOperations* operations = new (ELeave) CTavsrcOperations;
+	CleanupStack::PushL(operations);
+	operations->ConstructL();
+	CleanupStack::Pop(operations);
+	return operations;
+	}
+
+void CTavsrcOperations::ConstructL()
+	{
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeConnect, KTavsrcOpConnect, KTavsrcOpConnectNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeCancel, KTavsrcOpCancel, KTavsrcOpCancelNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeDiscoverSEPs, KTavsrcOpDiscoverSEPs, KTavsrcOpDiscoverSEPsNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeCreateBearers, KTavsrcOpCreateBearers, KTavsrcOpCreateBearersNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeCloseBearers, KTavsrcOpCloseBearers, KTavsrcOpCloseBearersNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeContentProtection, KTavsrcOpContentProtection, KTavsrcOpContentProtectionNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeGetCapabilities, KTavsrcOpGetCapabilities, KTavsrcOpGetCapabilitiesNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStartStreams, KTavsrcOpStartStreams, KTavsrcOpStartStreamsNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeSuspendStreams, KTavsrcOpSuspendStreams, KTavsrcOpSuspendStreamsNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeEchoStorm, KTavsrcOpEchoStorm, KTavsrcOpEchoStormNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeAbort, KTavsrcOpAbort, KTavsrcOpAbortNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStream, KTavsrcOpStream, KTavsrcOpStreamNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStreamFaster, KTavsrcOpStreamFaster, KTavsrcOpStreamFasterNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStreamSlower, KTavsrcOpStreamSlower, KTavsrcOpStreamSlowerNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeAutoStream, KTavsrcOpAutoStream, KTavsrcOpAutoStreamNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStopStream, KTavsrcOpStopStream, KTavsrcOpStopStreamNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeRegisterSEP, KTavsrcOpRegisterSEP, KTavsrcOpRegisterSEPNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeRegisterMultipleSEPs, KTavsrcOpRegisterMultipleSEPs, KTavsrcOpRegisterMultipleSEPsNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStartSrc, KTavsrcOpStartSrc, KTavsrcOpStartSrcNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStopSrc, KTavsrcOpStopSrc, KTavsrcOpStopSrcNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeDisconnectSrc, KTavsrcOpDisconnectSrc, KTavsrcOpDisconnectSrcNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeConfigureSEP, KTavsrcOpConfigureSEP, KTavsrcOpConfigureSEPNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeReconfigureSEP, KTavsrcOpReconfigureSEP, KTavsrcOpReconfigureSEPNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodePacketDropIoctl, KTavsrcOpPacketDropIoctl, KTavsrcOpPacketDropIoctlNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeVolumeUp, KTavsrcOpVolumeUp, KTavsrcOpVolumeUpNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeVolumeDown, KTavsrcOpVolumeDown, KTavsrcOpVolumeDownNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeBackwards, KTavsrcOpBackwards, KTavsrcOpBackwardsNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeForwards, KTavsrcOpForwards, KTavsrcOpForwardsNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodePlay, KTavsrcOpPlay, KTavsrcOpPlayNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStop, KTavsrcOpStop, KTavsrcOpStopNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeExit, KTavsrcOpExit, KTavsrcOpExitNextOperations));
+	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeToggleSafeMode, KTavsrcOpToggleSafeMode, KTavsrcOpToggleSafeModeNextOperations));
+	
+	// tavsrc always starts the src initially
+	iLastOperationIndex = GetAllowedOperationIndex(KTavsrcOpStartSrc, KTavsrcOpCodeAll);
+	User::LeaveIfError(iLastOperationIndex);
+	}
+
+CTavsrcOperations::CTavsrcOperations()
+	: iPendingOperationIndex(KErrNotFound), iSafeMode(ETrue)
+	{
+	}
+
+CTavsrcOperations::~CTavsrcOperations()
+	{
+	iOperations.Close();
+	}
+
+// Returns the index into iOperations array if aOperation is allowed as the next operation
+// according to aAllowedNextOpcodes or an error
+TInt CTavsrcOperations::GetAllowedOperationIndex(TChar aOperation, TInt aAllowedNextOpcodes)
+	{
+	TIdentityRelation<TTavsrcOperation> matchFunc(TTavsrcOperation::OperationMatchesAndAllowed);
+	return (iOperations.Find(TTavsrcOperation(0, aOperation, aAllowedNextOpcodes), matchFunc));
+	}
+
+TBool CTavsrcOperations::IsOperationAllowed(TChar aOperation)
+	{
+	TBool ret = EFalse;
+	
+	if (!SafeMode())
+		{
+		// if we are not in safe mode then any operation is allowed
+		ret = ETrue;
+		}
+	else
+		{ 
+		ret = (GetAllowedOperationIndex(aOperation, iOperations[iLastOperationIndex].GetNextOpCodes()) >= 0);
+		}
+	return ret;
+	}
+
+TInt CTavsrcOperations::BeginOperation(TChar aOperation)
+	{
+	TInt rerr = KErrNone;
+
+	if ((iPendingOperationIndex >= 0) && (aOperation != KTavsrcOpCancel))
+		{
+		// an operation is in progress, block until it has completed
+		rerr = KErrNotReady;
+		}
+	else
+		{
+		TInt allowedNextOpCodes = iOperations[iLastOperationIndex].GetNextOpCodes();
+		
+		if (!SafeMode())
+			{
+			// not in safe mode so any operation should be allowed
+			allowedNextOpCodes = KTavsrcOpCodeAll;
+			}
+		
+		TInt index = GetAllowedOperationIndex(aOperation, allowedNextOpCodes);
+
+		if (index >= 0)
+			{
+			// we have a valid operation
+			iPendingOperationIndex = index;
+			}
+		else
+			{
+			// aOperation is not a supported command, return error
+			rerr = index;
+			}
+		}
+	return rerr;
+	}
+
+void CTavsrcOperations::EndOperation(TChar aOperation, TInt aError)
+	{
+	// if an error has occured the state hasn't moved on
+	if (!aError)
+		{
+		// check to see if there is an outstanding operation
+		if (iPendingOperationIndex < 0)
+			{
+			// we have no pending operation, this means that the remote has moved our state on,
+			// to keep the allowed operations in step pretend that we moved the state on ourselves
+			iPendingOperationIndex = GetAllowedOperationIndex(aOperation, KTavsrcOpCodeAll);
+			}
+	
+		// update current state if there is any valid operations in the pending operation
+		if (iOperations[iPendingOperationIndex].GetNextOpCodes() != 0)
+			{
+			iLastOperationIndex = iPendingOperationIndex;
+			}
+		}
+	iPendingOperationIndex = KErrNotFound;
+	}
+
+TBool CTavsrcOperations::SafeMode()
+	{
+	return iSafeMode;
+	}
+
+void CTavsrcOperations::SetSafeMode(TBool aSafeMode)
+	{
+	iSafeMode = aSafeMode;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcOperations.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,113 @@
+
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCOPERATIONS_H
+#define TAVSRCOPERATIONS_H
+
+#include <e32def.h>
+#include <e32cmn.h>
+#include <e32base.h>
+#include <e32keys.h>
+
+// all key operations available for user input
+static const TInt KTavsrcOpConnect = ']';
+static const TInt KTavsrcOpCancel = '[';
+static const TInt KTavsrcOpDiscoverSEPs = 'd';
+static const TInt KTavsrcOpCreateBearers = '1';
+static const TInt KTavsrcOpCloseBearers = '!';
+static const TInt KTavsrcOpContentProtection = 'p';
+static const TInt KTavsrcOpGetCapabilities = 'g';
+static const TInt KTavsrcOpStartStreams = 's';
+static const TInt KTavsrcOpSuspendStreams = 'e';
+static const TInt KTavsrcOpEchoStorm = 'E';
+static const TInt KTavsrcOpAbort = 'a';
+static const TInt KTavsrcOpStream = '@';
+static const TInt KTavsrcOpStreamFaster = '+';
+static const TInt KTavsrcOpStreamSlower = '-';
+static const TInt KTavsrcOpAutoStream = 'A';
+static const TInt KTavsrcOpStopStream = '\'';
+static const TInt KTavsrcOpRegisterSEP = 't';
+static const TInt KTavsrcOpRegisterMultipleSEPs = 'T';
+static const TInt KTavsrcOpStartSrc = 'o';
+static const TInt KTavsrcOpStopSrc = 'c';
+static const TInt KTavsrcOpDisconnectSrc = 'f';
+static const TInt KTavsrcOpConfigureSEP = 'x';
+static const TInt KTavsrcOpReconfigureSEP = 'x';
+static const TInt KTavsrcOpPacketDropIoctl = 'i';
+static const TInt KTavsrcOpVolumeUp = EKeyUpArrow;
+static const TInt KTavsrcOpVolumeDown = EKeyDownArrow;
+static const TInt KTavsrcOpBackwards = EKeyLeftArrow;
+static const TInt KTavsrcOpForwards = EKeyRightArrow;
+static const TInt KTavsrcOpPlay = '}';
+static const TInt KTavsrcOpStop = '{';
+static const TInt KTavsrcOpExit = EKeyEscape;
+static const TInt KTavsrcOpToggleSafeMode = 'W';
+
+// describes one operation including key to press and next possible operations
+class TTavsrcOperation
+	{
+public:
+	TTavsrcOperation(TInt aOpCode, TChar aOperation, TInt aNextOpCodes);
+
+	static TBool OperationMatchesAndAllowed(const TTavsrcOperation& aOpA, const TTavsrcOperation& aOpB);
+	TInt GetNextOpCodes() const;
+
+private:
+	// iOpCode is the internal representation of the operation and can be used in a bitmask to define
+	// all possible next operations 
+	TInt iOpCode;
+	
+	// iOperation is the external representation of the operation, i.e. the key pressed by the user defined
+	// above
+	TChar iOperation;
+	
+	// iNextOpCodes is a bitmask of all the next possible operations after this operation
+	TInt iNextOpCodes;
+	};
+
+// describes all operations and is used to only allow acceptable, as defined by GAVDP, operations
+// to be selected by the user. All checking of whether an operation is allowed can be disabled
+// by turning off safe mode.
+class CTavsrcOperations : public CBase
+	{
+public:
+	static CTavsrcOperations* NewL();
+	~CTavsrcOperations();
+
+	TBool IsOperationAllowed(TChar aOperation);
+	TInt BeginOperation(TChar aOperation);
+	void EndOperation(TChar aOperation, TInt aError);
+
+	TBool SafeMode();
+	void SetSafeMode(TBool aSafeMode);
+	
+private:
+	CTavsrcOperations();
+	void ConstructL();
+
+	TInt GetAllowedOperationIndex(TChar aOperation, TInt aAllowedNextOpcodes);
+	TBool IsOperationAllowed(TInt aIndex);
+	
+private:
+	TInt iLastOperationIndex;
+	TInt iPendingOperationIndex;
+
+	TBool iSafeMode;
+	
+	RArray<TTavsrcOperation> iOperations;
+	};
+
+#endif // TAVSRCOPERATIONS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcSDP.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,233 @@
+// Copyright (c) 2005-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:
+//
+
+#include "tavsrc.h"
+
+void CAVTestApp::RegisterSinkSDPRecordL(RSdpDatabase& aDB, TBool aHeadphone,
+										TBool aSpeaker,TBool aRecorder,TBool aAmp)
+	{
+	CSdpAttrValue* attrVal = 0;
+	CSdpAttrValueDES* attrValDES = 0;
+
+	// Set Attr 1 (service class list) to list with UUID = Audio Sink
+	aDB.CreateServiceRecordL(TUUID(KAudioSinkUUID), iSnkHandle); 
+
+	// Protocol Descriptor List
+	attrValDES = CSdpAttrValueDES::NewDESL(0); 
+	CleanupStack::PushL(attrValDES); 
+
+	attrValDES->StartListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KL2CAPUUID)))					// L2CAP
+			->BuildUintL(TSdpIntBuf<TUint16>(KAVDTP))					// PSM = AVDTP
+			->EndListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KAvdtpUUID)))					// Avdtp UUID
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100))					// Version
+			->EndListL()
+		->EndListL(); 
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES);
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+	//BrowseGroupList
+	/*
+	This has been added in order to be interoperable with remote devices which only look for the 
+	service in the PublicBrowseGroup (the root of the browse hierarchy). This is not a mandatory feature. 
+	*/
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	
+	attrValDES->StartListL()
+		->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID))) // Public browse group (the root)
+	    ->EndListL();
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdBrowseGroupList, *attrValDES); //attribute 5
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = NULL;
+
+	// Language
+	attrValDES = CSdpAttrValueDES::NewDESL(0); 
+	CleanupStack::PushL(attrValDES); 
+
+	attrValDES->StartListL()
+		->BuildUintL(TSdpIntBuf<TUint16>(KLanguageEnglish))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdCharacterEncodingUTF8))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdBasePrimaryLanguage))
+	->EndListL(); 
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdLanguageBaseAttributeIDList, *attrValDES); 
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+
+	// BT Profile Description
+	attrValDES = CSdpAttrValueDES::NewDESL(0); 
+	CleanupStack::PushL(attrValDES); 
+
+	attrValDES->StartListL()
+		->BuildDESL()->StartListL()
+			->BuildUUIDL(KAdvancedAudioDistributionUUID)
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100))					// version
+		->EndListL()
+	->EndListL(); 
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES); 
+
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+
+	// provider name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Software Ltd")); 
+	CleanupStack::PushL(attrVal); 
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName, *attrVal); 
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Advanced audio distribution sink")); 
+	CleanupStack::PushL(attrVal); 
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, *attrVal); 
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service description
+	attrVal = CSdpAttrValueString::NewStringL(_L8("kick back and listen to some fine tunes with this neat service")); 
+	CleanupStack::PushL(attrVal); 
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, *attrVal); 
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// supported features
+	TUint16 supportedFeatures = aHeadphone ? 1:0;
+	supportedFeatures|=aSpeaker ? 2:0;
+	supportedFeatures|=aRecorder ? 4:0;
+	supportedFeatures|=aAmp ? 8:0;
+	attrVal = CSdpAttrValueUint::NewUintL(TSdpIntBuf<TUint16>(supportedFeatures)); 
+	CleanupStack::PushL(attrVal); 
+	
+	aDB.UpdateAttributeL(iSnkHandle, KSdpAttrIdSupportedFeatures, *attrVal); 	
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+	}
+
+
+void CAVTestApp::RegisterSourceSDPRecordL(RSdpDatabase& aDB, TBool aPlayer,
+										TBool aMic,TBool aTuner,TBool aMixer)
+	{
+	CSdpAttrValue* attrVal = 0;
+	CSdpAttrValueDES* attrValDES = 0;
+
+	// Set Attr 1 (service class list) to list with UUID = Audio Sink
+	aDB.CreateServiceRecordL(TUUID(KAudioSourceUUID), iSrcHandle); 
+
+	// Protocol Descriptor List
+	attrValDES = CSdpAttrValueDES::NewDESL(0); 
+	CleanupStack::PushL(attrValDES); 
+
+	attrValDES->StartListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KL2CAPUUID)))					// L2CAP
+			->BuildUintL(TSdpIntBuf<TUint16>(KAVDTP))					// PSM = AVDTP
+			->EndListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KAvdtpUUID)))					// Avdtp UUID
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100))					// Version
+			->EndListL()
+		->EndListL(); 
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES); 
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+	//BrowseGroupList
+	/*
+	This has been added in order to be interoperable with remote devices which only look for the 
+	service in the PublicBrowseGroup (the root of the browse hierarchy). This is not a mandatory feature. 
+	*/
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	
+	attrValDES->StartListL()
+		->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID))) // Public browse group (the root)
+	    ->EndListL();
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdBrowseGroupList, *attrValDES); //attribute 5
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = NULL;
+
+	// Language
+	attrValDES = CSdpAttrValueDES::NewDESL(0); 
+	CleanupStack::PushL(attrValDES); 
+
+	attrValDES->StartListL()
+		->BuildUintL(TSdpIntBuf<TUint16>(KLanguageEnglish))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdCharacterEncodingUTF8))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdBasePrimaryLanguage))
+	->EndListL(); 
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdLanguageBaseAttributeIDList, *attrValDES); 
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+
+	// BT Profile Description
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES); 
+
+	attrValDES->StartListL()
+		->BuildDESL()->StartListL()
+			->BuildUUIDL(KAdvancedAudioDistributionUUID)
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100))					// version
+		->EndListL()
+	->EndListL(); 
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES); 
+
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+
+	// provider name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Software Ltd")); 
+	CleanupStack::PushL(attrVal); 
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName, *attrVal); 
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Advanced audio distribution source")); 
+	CleanupStack::PushL(attrVal); 
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, *attrVal); 
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service description
+	attrVal = CSdpAttrValueString::NewStringL(_L8("plug your wireless cans into me!")); 
+	CleanupStack::PushL(attrVal); 
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, *attrVal); 
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// supported features
+										
+	TUint16 supportedFeatures = aPlayer ? 1:0;
+	supportedFeatures|=aMic ? 2:0;
+	supportedFeatures|=aTuner ? 4:0;
+	supportedFeatures|=aMixer ? 8:0;
+	attrVal = CSdpAttrValueUint::NewUintL(TSdpIntBuf<TUint16>(supportedFeatures)); 
+	CleanupStack::PushL(attrVal); 
+	
+	aDB.UpdateAttributeL(iSrcHandle, KSdpAttrIdSupportedFeatures, *attrVal); 	
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcSock.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,221 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcSock.h"
+#include "tavsrc.h"
+
+#ifdef __WINS__
+static const TSize KReaderConsole(55,10);
+static const TSize KWriterConsole(55,12);
+#else
+static const TSize KReaderConsole(KConsFullScreen,KConsFullScreen);
+static const TSize KWriterConsole(KConsFullScreen,KConsFullScreen);
+#endif
+
+//
+// class CActivePacketDropIoctl
+//
+CActivePacketDropIoctl* CActivePacketDropIoctl::NewL(CActiveConsole* aLogConsole, RSocketArray aPendingSockets)
+	{
+	CActivePacketDropIoctl* self = new (ELeave) CActivePacketDropIoctl(aLogConsole, aPendingSockets);
+	return self;
+	}
+
+CActivePacketDropIoctl::CActivePacketDropIoctl(CActiveConsole* aLogConsole, RSocketArray aPendingSockets) : CActive(0)
+	{
+	iPendingSockets = aPendingSockets;
+	iLogConsole = aLogConsole;
+	CActiveScheduler::Add(this);
+	}
+
+CActivePacketDropIoctl::~CActivePacketDropIoctl()
+	{
+	}
+
+void CActivePacketDropIoctl::DoCancel()
+	{
+	Cancel();
+	}
+
+void CActivePacketDropIoctl::Start()
+	{
+	iPendingSockets[0].Ioctl(ENotifyAvdtpMediaPacketDropped, iStatus, &iPacketsLostPkgBuf, KSolBtAVDTPMedia);	
+	SetActive();
+	}
+
+void CActivePacketDropIoctl::RunL()
+	{
+	__LOG(_L("\n**Packets Dropped Notification! %d packets lost.\n"), iPacketsLostPkgBuf());		
+	}
+
+//
+// class CActiveSockReader
+//
+CActiveSockReader* CActiveSockReader::NewL(RSocket aSock, TAvdtpTransportSessionType aType)
+	{
+	CActiveSockReader* self = new (ELeave) CActiveSockReader(aSock);
+	CleanupStack::PushL(self);
+	self->ConstructL(aType);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CActiveSockReader::CActiveSockReader(RSocket aSock)
+: CActive(0), iSock(aSock), iBufferDes(NULL, NULL)
+	{
+	CActiveScheduler::Add(this);
+	}
+	
+void CActiveSockReader::Start()
+	{
+	iSock.Read(iBufferDes,iStatus);
+	SetActive();
+	}
+	
+void CActiveSockReader::ConstructL(TAvdtpTransportSessionType aType)
+	{
+	iType = aType;
+	switch (aType)
+		{
+	case EMedia:
+		iConsole = Console::NewL(_L("Incoming Sink Data"),KReaderConsole);
+		break;
+	case EReporting:
+		iConsole = Console::NewL(_L("Incoming Reporting Channel Data"),KReaderConsole);
+		break;
+	case ERecovery:
+		iConsole = Console::NewL(_L("Incoming Recovery Channel Data"),KReaderConsole);
+		break;
+		}
+
+	iBuffer = HBufC8::NewL(40);
+	iBuffer->Des().SetMax();
+	iBufferDes.Set(iBuffer->Des());
+	}
+
+CActiveSockReader::~CActiveSockReader()
+	{
+	Cancel();
+	delete iConsole;
+	iSock.Close();
+	}
+	
+void CActiveSockReader::DoCancel()
+	{
+	iSock.CancelAll();
+	}
+	
+void CActiveSockReader::RunL()
+	{
+	if (iStatus.Int()==KErrNone)
+		{
+		iConsole->Printf(_L("length: [%04d]\n"),iBufferDes.Length());
+		for (TInt i=0;i<=iBufferDes.Length()-1;i++)
+			{
+			iConsole->Printf(_L("%c"),iBufferDes[i]);
+			}
+		iConsole->Printf(_L("\n\n"));
+		iBuffer->Des().SetMax();
+		iBufferDes.Set(iBuffer->Des());
+		iSock.Read(iBufferDes,iStatus);
+		SetActive();
+		}
+	else
+		{
+		iConsole->Printf(_L("SOCKET ERROR: %d"),iStatus.Int());
+		}
+	
+	}
+
+//
+// class CActiveSockWriter
+//
+CActiveSockWriter* CActiveSockWriter::NewL(RSocket aSock,
+													TAvdtpTransportSessionType aType)
+	{
+	CActiveSockWriter* writer = new (ELeave) CActiveSockWriter(aSock);
+	CleanupStack::PushL(writer);
+	writer->ConstructL(aType);
+	CleanupStack::Pop();
+	return writer;
+	}
+
+CActiveSockWriter::~CActiveSockWriter()
+	{
+	delete iSendBuffer;
+	delete iConsole;
+	// test for normal shutdown on media socket
+	TRequestStatus stat;
+	iSock.Shutdown(RSocket::ENormal, stat);
+	User::WaitForRequest(stat);
+	iSock.Close();
+	}
+	
+void CActiveSockWriter::Send()
+	{
+	// periodic callback to send from app
+	if (IsActive())
+		{
+		iConsole->Printf(_L("Info: Transport session %d tried to send, but active\n"), iType);
+		}
+	else
+		{
+		iSock.Write(*iSendBuffer, iStatus);
+		SetActive();
+		}
+	}
+	
+CActiveSockWriter::CActiveSockWriter(RSocket aSock)
+: CActive(-1), iSock(aSock)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CActiveSockWriter::ConstructL(TAvdtpTransportSessionType aType)
+	{
+	//	Writer console to be used in the future if necessary for debugging
+	//	iConsole = Console::NewL(_L("Writer"), KWriterConsole);
+	
+	iSendBuffer = HBufC8::NewL(512);
+	TPtr8 des = iSendBuffer->Des();
+	iType = aType;
+	switch (aType)
+		{
+	case EMedia:
+		des.Copy(_L("Media channel connected!"));
+		break;
+	case EReporting:
+		des.Copy(_L("Reporting channel connected!"));
+		break;
+	case ERecovery:
+		des.Copy(_L("Recovery channel connected!"));
+		break;
+	default:
+		des.Copy(_L("Unknown channel "));
+		des.AppendNum(aType);
+		des.Append(_L(" connected!"));
+		break;
+		}
+	}
+	
+void CActiveSockWriter::DoCancel()
+	{
+	iSock.CancelWrite();
+	}
+	
+void CActiveSockWriter::RunL()
+	{
+	//	iConsole->Printf(_L("Info: Transport session %d SENT, result %d"), iType, iStatus.Int());
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcSock.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,84 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCSOCK_H
+#define TAVSRCSOCK_H
+
+#include "tavsrc.h"
+#include "tavsrcConsole.h"
+
+#include <e32base.h>
+
+class CActivePacketDropIoctl : public CActive
+	{
+public:
+	static CActivePacketDropIoctl* NewL(CActiveConsole* aLogConsole, RSocketArray aPendingSockets);
+	~CActivePacketDropIoctl();
+	void DoCancel();
+	void RunL();
+	void Start();
+
+private:
+	CActivePacketDropIoctl(CActiveConsole* aLogConsole, RSocketArray aPendingSockets);
+
+private:
+	CActiveConsole* iLogConsole;
+	RSocketArray iPendingSockets;
+	TPckgBuf<TInt> iPacketsLostPkgBuf;
+	};
+
+class CActiveSockWriter : public CActive
+	{
+public:
+	static CActiveSockWriter* NewL(RSocket aSock, TAvdtpTransportSessionType aType);
+	~CActiveSockWriter();
+	void Send();
+	void DoCancel();
+	void RunL();
+
+private:
+	CActiveSockWriter(RSocket aSock);
+	void ConstructL(TAvdtpTransportSessionType aType);
+	
+private:
+	RSocket	iSock;
+	CConsoleBase* iConsole;
+	HBufC8* iSendBuffer;
+	TAvdtpTransportSessionType iType;
+	};
+
+class CActiveSockReader : public CActive
+	{
+public:
+	static CActiveSockReader* NewL(RSocket aSock, TAvdtpTransportSessionType aType);
+	~CActiveSockReader();
+	void Start();
+
+private:
+	CActiveSockReader(RSocket aSock);
+	void ConstructL(TAvdtpTransportSessionType aType);
+	void DoCancel();
+	void RunL();
+
+private:
+	RSocket	iSock;
+	CConsoleBase* iConsole;
+	HBufC8*	iBuffer;
+	TPtr8 iBufferDes;
+	TSockXfrLength iLen;
+	TAvdtpTransportSessionType iType;
+	};
+
+#endif // TAVSRCSOCK_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcStreamer.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,830 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcStreamer.h"
+#include "tavsrcUI.h"
+#include "tavsrcUtils.h"
+
+#include <bluetoothav.h>
+
+static const TSize KStreamerConsole(55,12);
+
+using namespace SymbianBluetoothAV;
+using namespace SymbianSBC;
+
+//
+// class CSbcTrackInfo
+//
+CSbcTrackInfo::~CSbcTrackInfo()
+	{
+	iFrameInfo.Close();
+	}
+
+TInt CSbcTrackInfo::GetLastFrameSize()
+	{
+	TInt frameSize = KErrNotFound;
+	TInt count = iFrameInfo.Count();
+	
+	if (count > 0)
+		{
+		frameSize = iFrameInfo[count - 1].iFrameSize;
+		}
+	return frameSize;
+	}
+
+TInt CSbcTrackInfo::AddNewFrame(TInt aFrameSize)
+	{
+	TInt rerr = KErrNone;
+	TInt count = iFrameInfo.Count();
+
+	if ((count > 0) && (iFrameInfo[count - 1].iFrameSize == aFrameSize))
+		{
+		// another frame of the same size
+		iFrameInfo[count - 1].iFrameCount++;
+		}
+	else
+		{
+		// add new frame info
+		rerr = iFrameInfo.Append(TSbcTrackFrameInfo());
+		if (rerr == KErrNone)
+			{
+			iFrameInfo[count].iFrameSize = aFrameSize;
+			iFrameInfo[count].iFrameCount = 1;
+			}
+		}
+	return rerr;
+	}
+
+TInt CSbcTrackInfo::RemoveLastFrame()
+	{
+	TInt rerr = KErrNotFound;
+	TInt count = iFrameInfo.Count();
+	
+	if (count > 0)
+		{
+		if (iFrameInfo[count - 1].iFrameCount > 1)
+			{
+			// remove one of the instances of the last frame size
+			iFrameInfo[count - 1].iFrameCount--;
+			}
+		else
+			{
+			// remove the last frame info
+			iFrameInfo.Remove(count - 1);
+			}
+		rerr = KErrNone;
+		}
+	return rerr;	
+	}
+
+void CSbcTrackInfo::Reset()
+	{
+	iFrameInfo.Reset();
+	}
+
+//
+// class CActiveStreamer
+//
+CActiveStreamer* CActiveStreamer::NewL(RSocketArray aSockets,
+									   CConsoleBase& aConsole,
+									   MActiveStreamerUser& aUser,
+									   TUint aDisplayMode,
+									   TBool aPreloadFile)
+	{
+	CActiveStreamer* self = new (ELeave) CActiveStreamer (aConsole, aUser, aDisplayMode, aPreloadFile);
+	CleanupStack::PushL(self);
+	self->ConstructL(aSockets);
+	CleanupStack::Pop();
+	return self;
+	}
+
+CActiveStreamer::CActiveStreamer(CConsoleBase& aConsole, MActiveStreamerUser& aUser, TUint aDisplayMode, TBool aPreloadFile)
+: iConsole(aConsole), iUser(aUser), iDisplayMode(aDisplayMode), iPreloadFile(aPreloadFile), iSbcFrameRate(1), iDirectionForward(ETrue)
+	{
+	iRTPCanSend = ETrue;
+	}
+
+CActiveStreamer::~CActiveStreamer()
+	{
+	delete iTimer;
+
+	iSendSource.Close();
+	iSession.Close();
+	iSockets[0].Close();
+	delete iFiles;
+	iFile.Close();
+	iRFs.Close();
+	
+	delete iProgressBar;
+	DestroyBucket();
+	delete iStreamingInfoConsole;	
+
+	delete iFileBuf;
+	iFileBuf = NULL;
+	
+	delete iStreamerUI;
+	iStreamerUI = NULL;	
+	}
+
+void CActiveStreamer::Stream(TBool aIsSink)
+	{
+
+	if (!aIsSink)
+		{
+		iStartedTime.UniversalTime();
+		iTimer->Start(iNominalSendClockInterval);
+		Drip();		
+		}
+	else
+		{
+		//as sink, we do want to start up rtp and await its notification of a NewSource
+		//Nothing to do at the moment, because when INT is a SNK, 
+		//it just needs to get the RTP packets running and wait for notification.
+		//This has already been done in constructor of the class.		
+		}
+	iStreamerUI->Play();
+	}
+
+void CActiveStreamer::Suspend()
+	{
+	iTimer->Cancel(); // stop callbacks to send
+	iStreamerUI->Pause();
+	}
+	
+void CActiveStreamer::ReStream()
+	{
+
+
+	iTimer->Start(iNominalSendClockInterval);
+	Drip();
+	iStreamerUI->Play();
+	}
+
+	
+void CActiveStreamer::Stop()
+	{
+	iTimer->Cancel();
+	iStreamerUI->Stop();
+
+	iFillLevel = 0;
+	iPos = 0;
+	}
+
+void CActiveStreamer::Pause()
+	{
+	iTimer->Cancel();
+	iStreamerUI->Pause();
+	}
+
+	
+void CActiveStreamer::NextTrack()
+	{
+	iPos=0;
+	if (iCurrentFile < iFiles->Count() - 1)
+		{
+		iCurrentFile++;
+		iStreamerUI->Next();
+		}
+	else
+		{
+		iCurrentFile = 0;
+		iStreamerUI->First();
+		}
+	TRAPD(err, InitL());		
+	if (err)
+		{
+		iConsole.Printf(_L("InitL failed with error: %d"),err);
+		}
+	}
+
+void CActiveStreamer::PrevTrack()
+	{
+	iPos=0;
+	if (iCurrentFile>0)
+		{
+		iCurrentFile--;
+		iStreamerUI->Prev();
+		}
+	TRAPD(err, InitL());		
+	if (err)
+		{
+		iConsole.Printf(_L("InitL failed with error: %d"),err);
+		}
+	}
+
+void CActiveStreamer::InitL()
+	{
+	// close current file
+	iFile.Close();
+	delete iProgressBar;
+	iProgressBar = NULL;
+
+	// get file details
+	RBuf filename;
+	filename.Create(100);
+	filename.Append(KSBCFileRoot);
+	filename.Append(iFiles->operator[](iCurrentFile).iName);
+	
+	User::LeaveIfError(iFile.Open(iRFs,filename,EFileRead | EFileShareReadersOnly));
+	
+	TInt numChannels, chMode, numSubbands, blkLen, bitPool, freq, allocMethod;
+	User::LeaveIfError(TTavsrcUtils::GetCodecSettingsFromSBCFile(filename, chMode, numChannels, numSubbands, blkLen, bitPool, freq, allocMethod));
+	
+	if (iStreamingInfoConsole)
+		{
+		iStreamingInfoConsole->Printf(_L("\nFirst SBC frame info for: %S...\n"), &filename);
+		}
+
+	filename.Close();
+
+	// determine if a re-configuration is required
+	if ((iNumChannels != numChannels) || (iFreq != freq) ||
+		(iChMode != chMode) || (iBitPool != bitPool) ||
+		(iBlkLen != blkLen) || (iNumSubbands != numSubbands) ||
+		(iAllocMethod != allocMethod))
+		{		
+		iNumChannels = numChannels;
+		iChMode = chMode;
+		iNumSubbands = numSubbands;
+		iBlkLen = blkLen;
+		iBitPool = bitPool;
+		iFreq = freq;
+		iAllocMethod = allocMethod;
+		
+		// configuration is set first time around
+		if (iSBCFrameSize != 0)
+			{
+			TSBCCodecCapabilities cfg;
+
+			TSBCSubbandsBitmask subbands = numSubbands == 8 ? EEightSubbands : EFourSubbands;
+			TSBCAllocationMethodBitmask alloc = allocMethod == 0 ? ELoudness : ESNR;
+			
+			TSBCSamplingFrequencyBitmask freqs(0);
+			if (freq == 48000) freqs = E48kHz;
+			else if (freq == 44100) freqs = E44100Hz; // note else if now as only select one
+			else if (freq == 32000) freqs = E32kHz;
+			else if (freq == 16000) freqs = E16kHz;
+			
+			TSBCChannelModeBitmask chs(0); // set it to anything to prevent warning
+			if (chMode == 0) chs=EMono; 
+			else if (chMode == 1) chs=EDualChannel; 
+			else if (chMode == 2) chs=EStereo; 
+			else if (chMode == 3) chs=EJointStereo; 
+			
+			TSBCBlockLengthBitmask blkLens(0); // set it to anything to prevent warning
+			if (blkLen == 4) blkLens = EBlockLenFour;
+			else if (blkLen == 8) blkLens = EBlockLenEight;
+			else if (blkLen == 12) blkLens = EBlockLenTwelve;
+			else if (blkLen == 16) blkLens = EBlockLenSixteen;
+				
+			cfg.SetSamplingFrequencies(freqs);
+			cfg.SetChannelModes(chs);
+			cfg.SetBlockLengths(blkLens);
+			cfg.SetSubbands(subbands);
+			cfg.SetAllocationMethods(alloc);
+		
+			// reconfig required
+			iUser.MediaCodecConfigurationRequired(cfg);
+			
+			// ensure no more timer events until we have finished reconfiguring
+			iTimer->Cancel();
+			}
+
+		if (chMode == 0 || chMode == 1)
+			{
+			iSBCFrameSize = 4+TReal((4*numSubbands*numChannels))/8+TTavsrcUtils::CEIL(TReal(blkLen*numChannels*bitPool)/8);
+			}
+		else
+			{
+			TBool join = chMode == 0x03;
+			
+			iSBCFrameSize = 4+TReal((4*numSubbands*numChannels))/8+TTavsrcUtils::CEIL(TReal((join*numSubbands+blkLen*bitPool))/8);
+			}
+
+		iSBCBitrate = 8*iSBCFrameSize*freq/(numSubbands*blkLen);
+		TUint64 numerator = TUint64(8000000)*iSBCFrameSize;
+		iSBCFrameInterval = (numerator)/iSBCBitrate; //microsecs
+		}
+	
+	iSbcTrackInfo.Reset();
+	iSbcTrackInfo.AddNewFrame(iSBCFrameSize);
+	
+	iDirectionForward = ETrue;
+	iSbcFrameRate = 1;
+	
+	User::LeaveIfError(iFile.Size(iFileSize));
+
+	if (iStreamingInfoConsole)
+		{
+		iStreamingInfoConsole->Printf(_L("Sampling Frequency: %d Hz\n"), iFreq);
+		iStreamingInfoConsole->Printf(_L("Subbands: %d\n"), iNumSubbands);
+		iStreamingInfoConsole->Printf(_L("BlkLen: %d\n"), iBlkLen);
+		iStreamingInfoConsole->Printf(_L("ChannelMode: %d\n"), iChMode);
+		iStreamingInfoConsole->Printf(_L("AllocMethod: %d\n"), iAllocMethod);
+		iStreamingInfoConsole->Printf(_L("Bitpool: %d\n"), iBitPool);
+		iStreamingInfoConsole->Printf(_L("SBC Frame size: %d bytes\n"), iSBCFrameSize);
+		iStreamingInfoConsole->Printf(_L("Bitrate: %d bps\n"), iSBCBitrate);
+		}
+	
+	TInt err = LoadFile();
+	if(err==KErrNone)
+		{
+		if (iDisplayMode & EProgressBarWindow)
+			{
+			iProgressBar = CProgressBar::NewL(iFileSize);
+			}
+		FillBucket();
+		}
+	else
+		{
+		User::Leave(err);
+		}
+	// start the timer for this file
+	iStartTime.UniversalTime();
+	}
+
+void CActiveStreamer::UpdateFrameInfo()
+	{
+	TInt numChannels, chMode, numSubbands, blkLen, bitPool, freq, allocMethod;
+	User::LeaveIfError(TTavsrcUtils::GetCodecSettingsFromSBCFile(iFile, iPos, chMode, numChannels, numSubbands, blkLen, bitPool, freq, allocMethod));
+
+	// determine if a re-configuration is required
+	if ((iNumChannels != numChannels)|| (iFreq != freq) ||
+		(iChMode != chMode) || (iBitPool != bitPool) ||
+		(iBlkLen != blkLen) || (iNumSubbands != numSubbands) ||
+		(iAllocMethod != allocMethod))
+		{		
+		iNumChannels = numChannels;
+		iChMode = chMode;
+		iNumSubbands = numSubbands;
+		iBlkLen = blkLen;
+		iBitPool = bitPool;
+		iFreq = freq;
+		iAllocMethod = allocMethod;
+					
+		TInt newFrameSize = 0;
+		if (chMode == 0 || chMode == 1)
+			{
+			newFrameSize = 4+TReal((4*numSubbands*numChannels))/8+TTavsrcUtils::CEIL(TReal(blkLen*numChannels*bitPool)/8);
+			}
+		else
+			{
+			TBool join = chMode == 0x03;
+			
+			newFrameSize = 4+TReal((4*numSubbands*numChannels))/8+TTavsrcUtils::CEIL(TReal((join*numSubbands+blkLen*bitPool))/8);
+			}
+
+		if (newFrameSize != iSBCFrameSize)
+			{
+			// work out timer for SBC frame
+			iSBCBitrate = 8*newFrameSize*freq/(numSubbands*blkLen);
+
+			TUint64 numerator = TUint64(8000000)*iSBCFrameSize;
+			iSBCFrameInterval = (numerator)/iSBCBitrate; //microsecs
+			}
+		iSBCFrameSize = newFrameSize;
+		}	
+	}
+
+void CActiveStreamer::TimerEvent(CAdaptiveHighResPeriodic& /*aTimer*/)
+	{
+	if (iRTPCanSend)
+		{
+		iSent++;
+		}
+	else
+		{
+		// move iPos on anyway?
+		iFailedSend++;
+		}
+	DoTimerEvent();
+	}
+
+void CActiveStreamer::TimerError(CAdaptiveHighResPeriodic& /*aTimer*/, TInt aError)
+	{
+	iConsole.Printf(_L("*ERROR %d*\n"), aError);
+	__DEBUGGER();
+	}
+	
+
+void CActiveStreamer::DoTimerEvent()
+	{
+	FillBucket();
+	Drip();
+	CheckJammed();	
+	}
+
+void CActiveStreamer::FillBucket()
+	{
+	// fill up bucket - it may be fully empty or partially full, but top it up in all cases	
+	if (iFillLevel < KLowTidemark)
+		{
+		for (/*iFillLevel*/; iFillLevel < KSendBucketSize; iFillLevel++)
+			{
+			// get the next RTP packet to send
+			RRtpSendPacket& sendPacket = iSendPackets[iFillLevel];
+			TDes8& payload = sendPacket.WritePayload();
+			payload.Zero();
+			payload.Append(0); // update this later with number of frames in packet.
+			
+			TInt spaceInRtpPacket = iSBCFrameBytesPerRTP;
+			TInt framesAdded = 0;
+			TInt packetInterval = 0;
+			
+			TInt nextFrameSize = iDirectionForward ? iSBCFrameSize : iSbcTrackInfo.GetLastFrameSize();
+			
+			TBool moreFrames = ETrue;
+			while ((nextFrameSize > 0) && (nextFrameSize <= spaceInRtpPacket) && (framesAdded <= 15) && moreFrames)
+				{
+				// add frame
+				if (iPreloadFile)
+					{
+					TPtrC8 ptr(iFileBuf->Des().Ptr()+iPos, nextFrameSize);
+					payload.Append(ptr);
+					}
+				else
+					{
+					TPtr8 ptr(const_cast<TUint8*>(iFileBuf->Des().Ptr()), 0, nextFrameSize);
+					iFile.Read(iPos, ptr);
+					payload.Append(ptr);
+					}
+				framesAdded++;
+				packetInterval+=iSBCFrameInterval;			
+				spaceInRtpPacket-=nextFrameSize;
+
+				// get next frame information
+				for (TInt count = 0; (count != iSbcFrameRate) && moreFrames; count++)
+					{
+					iPos = iDirectionForward ? iPos + nextFrameSize : iPos - nextFrameSize;
+
+					// determine if we are done with the current file
+					if ((iPos >= iFileSize) || (iPos < 0))
+						{
+						moreFrames = EFalse;
+						}
+					else 
+						{
+						TInt err = KErrNone;
+						if (iDirectionForward)
+							{
+							// keep track of the frame sizes as we go, this is used to rewind,
+							// i.e. iDirectionForward = EFalse
+							if ((err = iSbcTrackInfo.AddNewFrame(iSBCFrameSize)) != KErrNone)
+								{
+								iConsole.Printf(_L("Error adding SBC frame information: %d\n"), err);
+								__DEBUGGER();
+								}
+							}
+						else
+							{
+							if ((err = iSbcTrackInfo.RemoveLastFrame()) != KErrNone)
+								{
+								// this should never happen as we always check the length first
+								iConsole.Printf(_L("Error removing SBC frame information: %d\n"), err);
+								__DEBUGGER();
+								}
+							}
+						UpdateFrameInfo();
+						nextFrameSize = iDirectionForward ? iSBCFrameSize : iSbcTrackInfo.GetLastFrameSize();
+						}
+					}				
+				}
+
+			// has the interval changed since last time we set the timer
+			if ((iNominalSendClockInterval != packetInterval) && moreFrames)
+				{
+				// adjust timer
+				if (iStreamingInfoConsole)
+					{
+					iStreamingInfoConsole->Printf(_L("Interval change from: %d to %d\n"), iNominalSendClockInterval, packetInterval);
+					}
+				iNominalSendClockInterval = packetInterval;
+				iTimer->SetInterval(iNominalSendClockInterval);
+				}
+				
+			// write number of SBC frames into packet
+			payload[0] = TChar(framesAdded);
+						
+			//DrawBucket();	//<--- to animate the display
+			
+			if (iPos > iFileSize)
+				{
+				// time to do some metrics, and loop back to beginning
+				TTime finTime;
+				finTime.UniversalTime();
+				
+				TInt64 secs;
+				secs = (finTime.MicroSecondsFrom(iStartTime)).Int64();
+				
+				TInt bps = (iFileSize*8LL*1000000LL)/secs;
+				iConsole.Printf(_L("Looping. fail=%d, sent=%d, bytes=%d, secs=%Ld"), iFailedSend, iSent, iFileSize, secs);
+				iConsole.Printf(_L(" bps=%d\n"), bps);
+
+				iFailedSend=0;
+				iSent=0;
+				iPos=0; // loop
+				
+				RDebug::Printf("Looping");
+				NextTrack();
+				
+				// restart the timer
+				iTimer->Start(iNominalSendClockInterval);
+				}
+			else if (iPos <= 0)
+				{
+				PrevTrack();
+				}
+			else if (iProgressBar)
+				{
+				iProgressBar->Increment(iPos-iProgressBarPos);
+				iProgressBarPos = iPos;
+				}
+			}
+		iPreviousFillLevel = iFillLevel;
+		}
+	}
+
+void CActiveStreamer::DrawBucket()
+	{
+	if (iStreamingInfoConsole)
+		{
+		iStreamingInfoConsole->SetPos(1,1);
+
+		TBuf<KSendBucketSize> bar;
+		bar.AppendFill('#',iFillLevel);
+		bar.AppendFill('.',KSendBucketSize-iFillLevel);
+	
+		iStreamingInfoConsole->Printf(bar);
+		}
+	}
+	
+void CActiveStreamer::Drip()
+	{
+	// take head packet
+	RRtpSendPacket& packet = iSendPackets[0]; //packet=oldpacket
+
+	// move previous packet to back - it is reusable, so we don't close
+	// instead just move to back so that the packet to send is at head
+	iSendPackets.Remove(0);
+	iSendPackets.Append(packet);
+
+	if (iRTPCanSend && iFillLevel > 0)
+		{
+		// take oldest packet and give to RTP
+		packet.Send();
+		iRTPCanSend = EFalse;
+		iFillLevel--;
+		//DrawBucket();	//<--- to animate the display
+		}
+	else
+		{
+		// not ready to send yet but when we are send straight away
+		iBonusDrip = ETrue;
+		
+		// remember this as a fail to measure
+		// let code beneath recycle packet
+		iFailedSend++;
+		}		
+	}
+	
+void CActiveStreamer::ConstructL(RSocketArray aSockets)
+	{
+	iTimer = CAdaptiveHighResPeriodic::NewL(*this);
+	
+	if (iDisplayMode & EStreamerInfoWindow)
+		{
+		iStreamingInfoConsole = Console::NewL(_L("Streamer"), KStreamerConsole);
+		}
+	
+	User::LeaveIfError(iRFs.Connect());
+	
+	iSockets = aSockets;
+
+	TPckgBuf<TInt> mruBuf;
+	iSockets[0].GetOpt(EAvdtpMediaGetMaximumReceivePacketSize, KSolBtAVDTPMedia, mruBuf);
+	
+	// donate media socket to rtp
+	iSession.OpenL(iSockets[0], mruBuf());
+	
+	// we get all RTP events in one place (could have them separately)
+	iSession.RegisterEventCallbackL(ERtpAnyEvent,
+									RTPCallbackL,
+									this);
+									
+	iSendSource = iSession.NewSendSourceL();
+
+	iSendSource.RegisterEventCallbackL(ERtpAnyEvent,
+									RTPCallbackL,
+									this);
+
+	iStreamerUI = CStreamerUI::NewL((iDisplayMode & EPlaylistWindow), (iDisplayMode & EChunkyIconWindow));
+
+	TInt err = iRFs.GetDir(KSBCFiles, KEntryAttNormal, ESortByName, iFiles);	
+
+	// set playlist
+	for (TInt i=0; i<iFiles->Count(); i++)
+		{
+		iStreamerUI->AddTitle(iFiles->operator[](i).iName);
+		}
+	
+	err = aSockets[0].GetOpt(EAvdtpMediaGetMaximumPacketSize, KSolBtAVDTPMedia, iMTU);
+
+	iSBCFrameBytesPerRTP = iMTU - 12 - 1;
+	iSendSource.SetDefaultPayloadSize(iSBCFrameBytesPerRTP+1);
+
+	CreateBucketL();
+	InitL();
+	}
+	
+void CActiveStreamer::CreateBucketL()
+	{
+	if (iSendPackets.Count() == KSendBucketSize)
+		{
+		RDebug::Printf("Bucket already created");
+		}
+	else
+		{
+		RDebug::Printf("Creating bucket");
+		// create all the RTP send packets now
+		for (TInt i=0; i<KSendBucketSize ; i++)
+			{
+			User::LeaveIfError(iSendPackets.Append(iSendSource.NewSendPacketL()));
+			RDebug::Printf("Adding Sendpacket 0x%08x in bucket", &iSendPackets[i]);
+			}
+		}
+	}
+	
+void CActiveStreamer::DestroyBucket()
+	{
+	RDebug::Printf("Destroying bucket");
+
+	// rtp bug closing these packets?
+	iSendPackets.Reset();
+	}
+	
+/*static*/ void CActiveStreamer::RTPCallbackL(CActiveStreamer* aStreamer, const TRtpEvent& aEvent)
+	{
+	switch (aEvent.Type())
+		{
+	case ERtpSendFail:
+		if (aStreamer->iStreamingInfoConsole)
+			{
+			aStreamer->iStreamingInfoConsole->Printf(_L("\n**RTP SEND FAILURE**"));			
+			}
+		break;
+		
+	case ERtpSendSucceeded:
+		aStreamer->iRTPCanSend = ETrue;	
+		if (aStreamer->iBonusDrip)
+			{
+			aStreamer->Drip();
+			aStreamer->iBonusDrip = EFalse;
+			}
+		break;
+		
+	case ERtpSourceFail:
+		if (aStreamer->iStreamingInfoConsole)
+			{
+			aStreamer->iStreamingInfoConsole->Printf(_L("\n**RTP SOURCE FAILURE**"));			
+			}
+		break;
+		
+
+	case ERtpNewSource:
+		if (aStreamer->iStreamingInfoConsole)
+			{
+			aStreamer->iStreamingInfoConsole->Printf(_L("\n**NEW SOURCE!\n"));
+			}
+		aStreamer->StartSinkL();
+		break;
+		
+	case ERtpPacketReceived:
+		RRtpPacket packet = aStreamer->iReceiveSource.Packet();
+		if (aStreamer->iStreamingInfoConsole)
+			{
+			aStreamer->iStreamingInfoConsole->Printf(_L("SNK Rxd packet "));
+			aStreamer->iStreamingInfoConsole->Printf(_L("SeqNo %d\n"),packet.SequenceNumber());
+			}
+		break;
+		}
+	}
+	
+void CActiveStreamer::StartSinkL()
+	{
+	iReceiveSource = iSession.NewReceiveSourceL();
+	iReceiveSource.RegisterEventCallbackL(ERtpAnyEvent,
+										RTPCallbackL,
+										this);
+	}
+	
+TInt CActiveStreamer::LoadFile()
+	{
+	RDebug::Printf("Loading file");
+	delete iFileBuf;
+	iFileBuf = NULL;
+	
+	TInt err = KErrNone;
+
+	if (iPreloadFile)
+		{
+		if (iStreamingInfoConsole)
+			{
+			iStreamingInfoConsole->Printf(_L("Preloading SBC file\n"));
+			}
+
+		// max heap is something or other	
+		const TInt KMaxHeap = 4000000;
+		TInt size = iFileSize;
+		size = Min(iFileSize, KMaxHeap);
+		TRAP(err, iFileBuf = HBufC8::NewL(size));	
+		if (err)
+			{
+			return err;
+			}
+		iFileSize = Min(KMaxHeap, iFileSize);
+	
+		TPtr8 ptr(const_cast<TUint8*>(iFileBuf->Des().Ptr()), 0, iFileSize);	
+	
+		const TEntry& entry = iFiles->operator[](iCurrentFile);
+		RFile test;
+		test.Open(iRFs, entry.iName, EFileRead);
+		
+		ptr.Zero();
+		err=iFile.Read(ptr);
+		}
+	else
+		{
+		if (iStreamingInfoConsole)
+			{
+			iStreamingInfoConsole->Printf(_L("Streaming from file\n"));
+			}
+		
+		// read from file to be more "streaming"-like
+		TRAP(err, iFileBuf = HBufC8::NewL(Min(iFileSize, iSBCFrameBytesPerRTP)));
+		}
+	return err;
+	}
+
+void CActiveStreamer::Faster()
+	{
+	// limit the speed
+	if (iSbcFrameRate < 5)
+		{
+		iSbcFrameRate++;
+		}
+	}
+	
+void CActiveStreamer::Slower()
+	{
+	if (iSbcFrameRate > 1)
+		{
+		iSbcFrameRate--;		
+		}
+	}
+
+void CActiveStreamer::Backward()
+	{
+	iDirectionForward=EFalse;
+	}
+
+void CActiveStreamer::Forward()
+	{
+	iDirectionForward=ETrue;
+	}
+
+void CActiveStreamer::CheckJammed()
+	{
+	if (iFillLevel==iPreviousFillLevel)
+		{
+		if ((iBucketAppearsJammed++ > 500) && iStreamingInfoConsole)
+			{
+			iStreamingInfoConsole->Printf(_L("BUCKET JAMMED\n"));
+			iStreamingInfoConsole->Printf(_L("iFillLevel %d "),iFillLevel);
+			iStreamingInfoConsole->Printf(_L("iRTPCanSend %d "),iRTPCanSend);
+			iStreamingInfoConsole->Printf(_L("iFailedSend %d "),iFailedSend);
+			iStreamingInfoConsole->Printf(_L("iPos %d "),iPos);
+	
+			TTime now;
+			now.UniversalTime();
+			
+			TInt millisecs = now.MicroSecondsFrom(iLastPacketSentTime).Int64()/1000;
+			iStreamingInfoConsole->Printf(_L("time since last send %d ms "),millisecs);
+			}
+		}
+	else
+		{
+		iBucketAppearsJammed = 0;
+		}
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcStreamer.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,193 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCSTREAMER_H
+#define TAVSRCSTREAMER_H
+
+#include "tavsrc.h"
+#include "tavsrcTimer.h"
+#include "tavsrcStreamerUser.h"
+
+#include <f32file.h>
+#include <rtp.h>
+
+static const TInt KLowTidemark = 2;
+static const TInt KSendBucketSize = 2;
+	
+#ifdef __WINS__
+_LIT(KSBCFileRoot, "c:\\");
+_LIT(KSBCFiles, "c:\\*.sbc");
+#else
+//For reference boards, use the MMC drive, because C: is formatted every reboot
+_LIT(KSBCFileRoot, "e:\\");
+_LIT(KSBCFiles, "e:\\*.sbc");
+#endif
+
+class CProgressBar;
+class CStreamerUI;
+class CActiveSockWriter;
+class CActiveSockReader;
+
+class TSbcTrackFrameInfo
+	{
+public:
+	TInt iFrameSize;
+	TUint iFrameCount;
+	};
+
+// used to keep track of the sizes of the SBC frames to allow going backwards through
+// an SBC file on a frame by frame basis. This is require to support VBR where the
+// frame sizes can change for a single track.
+class CSbcTrackInfo : public CBase
+	{
+public:
+	~CSbcTrackInfo();
+	
+	TInt GetLastFrameSize();
+	TInt AddNewFrame(TInt aFrameSize);
+	TInt RemoveLastFrame();
+	void Reset();
+	
+private:
+	RArray<TSbcTrackFrameInfo> iFrameInfo;
+	};
+
+class CActiveStreamer : public CBase, private MAdaptiveHighResPeriodicClient
+	{
+public:
+	static CActiveStreamer*	NewL(RSocketArray aSockets,
+								 CConsoleBase& aConsole,
+								 MActiveStreamerUser& aUser,
+								 TUint aDisplayMode,
+								 TBool aPreloadFile);
+
+	~CActiveStreamer();
+	
+	static void RTPCallbackL(CActiveStreamer* aStreamer, const TRtpEvent& aEvent);
+	
+	// streamer operations
+	void Stream(TBool aIsSink);
+	void Suspend();
+	void ReStream();
+	void Stop();
+	void Pause();
+	void Faster();
+	void Slower();
+	void Backward();
+	void Forward();
+	void NextTrack();
+	void PrevTrack();
+
+private:
+	enum TDisplayMode
+		{
+		EStatusCommandWindows = 0x00,
+		EStreamerInfoWindow = 0x01,
+		EProgressBarWindow = 0x02,
+		EPlaylistWindow = 0x04,
+		EChunkyIconWindow = 0x08,
+		};
+	
+private:
+	CActiveStreamer(CConsoleBase& aConsole, MActiveStreamerUser& aUser, TUint aDisplayMode, TBool aPreloadFile);
+
+	void TimerEvent(CAdaptiveHighResPeriodic& aTimer);
+	void TimerError(CAdaptiveHighResPeriodic& aTimer, TInt aError);
+	void StartSinkL();
+	
+	void ConstructL(RSocketArray aSockets);
+	TInt LoadFile();
+	void DoTimerEvent();
+	void DestroyBucket();
+	void InitL();
+
+	void CreateBucketL();
+	void FillBucket();
+	void Drip();
+	void DrawBucket();
+	void CheckJammed();
+
+	void UpdateFrameInfo();
+	
+private:
+	CConsoleBase& iConsole;
+	TInt iProgressBarPos;
+	CProgressBar* iProgressBar;
+	CStreamerUI* iStreamerUI;
+	CConsoleBase* iStreamingInfoConsole;
+	CAdaptiveHighResPeriodic* iTimer;
+	
+	RFile iFile;
+	RFs iRFs;	
+	CDir* iFiles;
+	TInt iCurrentFile;
+	RSocketArray iSockets;
+	TInt iMTU;
+	TInt iFileSize;
+	TTime iStartTime;
+	
+	RRtpSession iSession;
+	RRtpSendSource iSendSource;
+	RRtpReceiveSource iReceiveSource;
+	
+	RArray<RRtpSendPacket> iSendPackets; // used like a queue sometimes
+	TRtpEventType iEventType;
+	TBool iRTPCanSend;
+
+	TInt iSBCFrameBytesPerRTP;
+	TInt iSBCFrameSize;
+	TInt iSBCFrameInterval;
+	TInt iNumSBCFramesInRTP;
+	TInt iSBCBitrate;
+	TInt iSendClockInterval;		// microsecs
+	TInt iNominalSendClockInterval;// microsecs
+	TBool iBonusDrip;
+	TTime iStartedTime;			// for "absolute" timing style
+		
+	// checking for jammed streamer, and leaky mbufs
+	TInt iBucketAppearsJammed;
+	TBool iBucketJammed;
+	TTime iLastPacketSentTime;
+	TInt iPreviousFillLevel;
+	
+	TInt iPos;
+	TInt iFailedSend;
+	TInt iSent;
+	TInt iFillLevel;
+	
+	HBufC8* iFileBuf;
+	
+	// current SEP configuration
+	TInt iNumChannels;
+	TInt iChMode;
+	TInt iNumSubbands;
+	TInt iBlkLen;
+	TInt iBitPool;
+	TInt iFreq;
+	TInt iAllocMethod;
+	
+	MActiveStreamerUser& iUser;	
+	
+	TUint iDisplayMode;
+	TBool iPreloadFile;
+	
+	CSbcTrackInfo iSbcTrackInfo;
+	
+	TInt iSbcFrameRate;
+	
+	TBool iDirectionForward;
+	};
+
+#endif // TAVSRCSTREAMER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcStreamerUser.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,28 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCSTREAMERUSER_H
+#define TAVSRCSTREAMERUSER_H
+
+#include <bluetoothav.h>
+
+// used to notify changes to the configuration of the media being streamed
+class MActiveStreamerUser
+	{
+public:
+	virtual void MediaCodecConfigurationRequired(TSBCCodecCapabilities& aConfig)=0;
+	};
+
+#endif // TAVSRCSTREAMERUSER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcTimer.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,146 @@
+// Copyright (c) 2007-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:
+//
+
+#include <hal.h>
+#include <hal_data.h>
+
+#include "tavsrcTimer.h"
+#include "tavsrc.h"
+
+static const TUint KMillion = 1000000;
+
+CAdaptiveHighResPeriodic* CAdaptiveHighResPeriodic::NewL(MAdaptiveHighResPeriodicClient& aClient)
+	{
+	CAdaptiveHighResPeriodic* p = new (ELeave) CAdaptiveHighResPeriodic(aClient);
+	CleanupStack::PushL(p);
+	p->ConstructL();
+	CleanupStack::Pop(p);
+	return p;
+	}
+	
+CAdaptiveHighResPeriodic::~CAdaptiveHighResPeriodic()
+	{
+	Cancel();
+	}
+
+CAdaptiveHighResPeriodic::CAdaptiveHighResPeriodic(MAdaptiveHighResPeriodicClient& aClient)
+: CTimer(EPriorityStandard+1), iClient(aClient)
+	{
+	CActiveScheduler::Add(this);
+	}
+	
+void CAdaptiveHighResPeriodic::ConstructL()
+	{
+	CTimer::ConstructL();
+	
+	HAL::Get(HALData::EFastCounterFrequency, iFastCounterFreq);
+	HAL::Get(HALData::EFastCounterCountsUp, iFastCounterIncreases);
+
+	RDebug::Printf("Timer HAL: FC Freq %d", iFastCounterFreq);
+	
+	if (iFastCounterIncreases)
+		{
+		RDebug::Printf("Timer HAL: FC increases");
+		}
+	else
+		{
+		RDebug::Printf("Timer HAL: FC decreases");
+		}
+
+	iFastCounterFreqUs = (TReal)iFastCounterFreq / KMillion;
+	}
+	
+	
+void CAdaptiveHighResPeriodic::Start(TTimeIntervalMicroSeconds32 aInterval)
+	{
+	RDebug::Printf("*** Start Timer");
+	iInterval = aInterval;
+
+	// calculate the number of fast counter ticks for the interval
+	TReal intervalInCounts = iInterval.Int()*iFastCounterFreqUs;		
+	TInt countChangeExpected = (TInt) intervalInCounts;
+
+	// store any extra fractions of fast counter ticks
+	iExtraCounts = intervalInCounts - countChangeExpected;
+
+	iIntendedCountOnCallback = iFastCounterIncreases
+								? User::FastCounter() + countChangeExpected
+								: User::FastCounter() - countChangeExpected;
+
+	StartTimer(aInterval);
+	}
+	
+void CAdaptiveHighResPeriodic::RunL()
+	{
+	User::LeaveIfError(iStatus.Int());
+	iClient.TimerEvent(*this);
+
+	if (!IsActive())
+		{
+		TUint endCount = User::FastCounter();
+
+		// are we fast or slow? positive = late, negative = early
+		TInt varianceCount = iFastCounterIncreases
+				? (TInt)((endCount - iIntendedCountOnCallback))
+				: (TInt)((iIntendedCountOnCallback - endCount));
+
+		// convert count to microsecs
+		TInt varianceUs = varianceCount/iFastCounterFreqUs;
+
+		TInt nextInterval = iInterval.Int() - varianceUs; // in musecs
+
+		if (nextInterval < 0)
+			{
+			nextInterval = 0;
+			}
+
+		// calculate the number of fast counter ticks for the interval
+		TReal intervalInCounts = nextInterval*iFastCounterFreqUs;		
+		TInt countChangeExpected = (TInt) intervalInCounts;
+
+		// update extra fractions of fast counter ticks
+		iExtraCounts += intervalInCounts - countChangeExpected;
+
+		if (iExtraCounts >= 1)
+			{
+			// we have more than a whole tick, do the adjustment
+			countChangeExpected++;
+			iExtraCounts--;
+			nextInterval = countChangeExpected/iFastCounterFreqUs;
+			}
+
+		iIntendedCountOnCallback = iFastCounterIncreases
+									? User::FastCounter() + countChangeExpected
+									: User::FastCounter() - countChangeExpected;
+		
+		StartTimer(nextInterval);
+		}
+	}
+	
+TInt CAdaptiveHighResPeriodic::RunError(TInt aError)
+	{
+	iClient.TimerError(*this, aError);
+	return KErrNone;
+	}
+
+void CAdaptiveHighResPeriodic::SetInterval(TTimeIntervalMicroSeconds32 aInterval)
+	{
+	iInterval = aInterval;
+	}
+	
+void CAdaptiveHighResPeriodic::StartTimer(TTimeIntervalMicroSeconds32 aInterval)
+	{
+	HighRes(aInterval);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcTimer.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,62 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCTIMER_H
+#define TAVSRCTIMER_H
+
+#include <e32base.h>
+
+class CAdaptiveHighResPeriodic;
+
+class MAdaptiveHighResPeriodicClient
+	{
+public:
+	virtual void TimerEvent(CAdaptiveHighResPeriodic& aTimer)=0;
+	virtual void TimerError(CAdaptiveHighResPeriodic& aTimer, TInt aError)=0;
+	};
+
+//adapts the callback to counter drift	
+class CAdaptiveHighResPeriodic : public CTimer
+	{
+public:
+	static CAdaptiveHighResPeriodic* NewL(MAdaptiveHighResPeriodicClient& aClient);
+	~CAdaptiveHighResPeriodic();
+	void Start(TTimeIntervalMicroSeconds32 aPeriod);
+
+	void SetInterval(TTimeIntervalMicroSeconds32 aInterval);
+	
+private:
+	CAdaptiveHighResPeriodic(MAdaptiveHighResPeriodicClient& aClient);
+	void ConstructL();
+	void RunL();
+	TInt RunError(TInt aError);
+	void StartTimer(TTimeIntervalMicroSeconds32 aInterval);
+	
+private:
+	MAdaptiveHighResPeriodicClient& iClient;
+
+	// HAL stuff
+	TBool	iFastCounterIncreases;
+	TInt	iFastCounterFreq;
+	TReal	iFastCounterFreqUs;
+	TReal	iExtraCounts;
+	
+	// what the client asked for in musecs
+	TTimeIntervalMicroSeconds32	iInterval;
+
+	TUint	iIntendedCountOnCallback ;	// the hoped for fast counter reading on callback
+	};
+
+#endif // TAVSRCTIMER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcUI.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,219 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcUI.h"
+
+//
+// class CStreamerUI
+//
+CStreamerUI* CStreamerUI::NewL(TBool aDisplayPlaylist, TBool aDisplayChunkyIcon)
+	{
+	CStreamerUI* ui = new (ELeave) CStreamerUI ();
+	CleanupStack::PushL(ui);
+	ui->ConstructL(aDisplayPlaylist, aDisplayChunkyIcon);
+	CleanupStack::Pop(ui);
+	return ui;
+	}
+
+CStreamerUI::CStreamerUI()
+	{	
+	}
+
+void CStreamerUI::ConstructL(TBool aDisplayPlaylist, TBool aDisplayChunkyIcon)
+	{
+	if (aDisplayChunkyIcon)
+		{
+		iIconConsole = Console::NewL(_L("Icon"), TSize(-1,-1));
+		}
+
+	if (aDisplayPlaylist)
+		{
+		iPlayListConsole = Console::NewL(_L("Play List"), TSize(-1,-1));
+		}
+	}
+	
+CStreamerUI::~CStreamerUI()
+	{
+	delete iIconConsole;
+	iIconConsole = NULL;
+	delete iPlayListConsole;
+	iPlayListConsole = NULL;
+	}
+	
+void CStreamerUI::Play()
+	{
+	if (iIconConsole)
+		{
+		TBuf<KIconSize> line;
+	
+		iIconConsole->ClearScreen();
+		
+		for (TInt len=1; len<=KIconSize/2; len++)
+			{
+			line.AppendFill('*',len*2);
+			iIconConsole->SetPos(KIconIndent,len);
+			iIconConsole->Printf(line);
+			iIconConsole->SetPos(KIconIndent,KIconSize-len);
+			iIconConsole->Printf(line);
+			line.Zero();
+			}
+		}
+	DrawPointer();	
+	}
+
+void CStreamerUI::Pause()
+	{
+	if (iIconConsole)
+		{
+		TBuf<KIconSize> line;
+	
+		iIconConsole->ClearScreen();
+		line.AppendFill('*',KIconSize/3);
+		line.AppendFill(' ',KIconSize/3);
+		line.AppendFill('*',KIconSize/3);
+		
+		for (TInt len=1; len<=KIconSize; len++)
+			{
+			iIconConsole->SetPos(KIconIndent,len);
+			iIconConsole->Printf(line);
+			}
+		}
+	}
+	
+void CStreamerUI::Stop()
+	{
+	if (iIconConsole)
+		{
+		TBuf<KIconSize> line;
+
+		iIconConsole->ClearScreen();
+		line.AppendFill('*',KIconSize);
+		
+		for (TInt len=1; len<=KIconSize; len++)
+			{
+			iIconConsole->SetPos(KIconIndent,len);
+			iIconConsole->Printf(line);
+			}
+		}
+	}
+
+void CStreamerUI::AddTitle(const TDesC& aTitle)
+	{
+	if (iPlayListConsole)
+		{
+		iPlayListConsole->SetPos(KPlayListX+2);	
+		iPlayListConsole->Printf(_L("%S\n"), &aTitle);
+		}
+	}
+	
+void CStreamerUI::Next()
+	{
+	ClearPointer();
+	++iPlayListY;
+	DrawPointer();
+	}
+	
+void CStreamerUI::Prev()
+	{
+	ClearPointer();
+	--iPlayListY;
+	DrawPointer();	
+	}
+
+void CStreamerUI::First()
+	{
+	ClearPointer();
+	iPlayListY = 0;
+	DrawPointer();
+	}
+	
+void CStreamerUI::ClearPointer()
+	{
+	if (iPlayListConsole)
+		{
+		iPlayListConsole->SetPos(KPlayListX, iPlayListY);
+		iPlayListConsole->Printf(_L(" "));
+		}
+	}
+	
+void CStreamerUI::DrawPointer()
+	{
+	if (iPlayListConsole)
+		{
+		iPlayListConsole->SetPos(KPlayListX, iPlayListY);
+		iPlayListConsole->Printf(_L(">"));
+		}
+	}
+	
+static const TInt KProgressBarSize = 70;
+
+//
+// class CProgressBar
+//
+CProgressBar::CProgressBar(TInt aMaximum) : iMax(aMaximum)
+	{
+	}
+
+CProgressBar::~CProgressBar()
+	{
+	delete iConsole;
+	}
+
+CProgressBar* CProgressBar::NewL(TInt aMaximum)
+	{
+	CProgressBar* p = new (ELeave) CProgressBar(aMaximum);
+	CleanupStack::PushL(p);
+	p->ConstructL();
+	CleanupStack::Pop(p);
+	return p;
+	}
+	
+void CProgressBar::Increment(TInt aStep)
+	{
+	iValue+=aStep;
+	if (iValue < 0)
+		{
+		iValue = 0;
+		}
+#ifdef __WINS__
+	Redraw();
+#endif
+	}
+	
+void CProgressBar::ConstructL()
+	{
+#ifdef __WINS__
+	iConsole = Console::NewL(_L("Progress"), TSize(KProgressBarSize+5,1));
+	Redraw();
+#endif
+	}
+	
+void CProgressBar::Redraw()
+	{
+	iConsole->SetPos(0);
+	
+	TBuf<KProgressBarSize> bar;
+	TInt numDone = ((iValue*KProgressBarSize) /iMax);
+	TInt numToDo = 0;
+
+	if (numDone<bar.MaxLength())
+		{
+		bar.AppendFill('|',numDone);
+		numToDo = KProgressBarSize - numDone;
+		}
+	bar.AppendFill('-',numToDo);
+	
+	iConsole->Printf(bar);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcUI.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,69 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCUI_H
+#define TAVSRCUI_H
+
+#include <e32base.h>
+#include <e32cons.h>
+
+static const TUint KIconSize = 36;
+static const TUint KIconIndent = 36;
+static const TUint KPlayListX = 2;
+
+class CStreamerUI : public CBase
+	{
+public:
+	static CStreamerUI* NewL(TBool aDisplayPlaylist, TBool aDisplayChunkyIcon);
+	~CStreamerUI();
+	void Play();
+	void Pause();
+	void Stop();
+	void AddTitle(const TDesC& aTitle);
+	void Next();
+	void Prev();
+	void First();
+	
+private:
+	CStreamerUI();
+	void ConstructL(TBool aDisplayPlaylist, TBool aDisplayChunkyIcon);
+	void ClearPointer();
+	void DrawPointer();
+
+private:
+	CConsoleBase* iIconConsole;
+	CConsoleBase* iPlayListConsole;
+	TInt iPlayListY;
+	};
+
+class CProgressBar : public CBase
+	{
+public:
+	static CProgressBar* NewL(TInt aMaximum);
+	void Increment(TInt aStep);
+	~CProgressBar();
+	
+private:
+	CProgressBar(TInt aMaximum);
+	void ConstructL();
+	void Redraw();
+	
+private:
+	TInt	iMax;
+	TInt	iValue;
+	CConsoleBase*	iConsole;
+	};
+
+#endif // TAVSRCUI_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcUtils.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,394 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tavsrcUtils.h"
+#include "tavsrcConsole.h"
+
+#include <bluetoothav.h>
+#include <btextnotifiers.h>
+
+#include <f32file.h>
+#include <e32math.h>
+
+void TTavsrcUtils::RegisterSinkSDPRecordL(RSdpDatabase& aDB, TSdpServRecordHandle& aRecHandle,
+										  TBool aHeadphone, TBool aSpeaker, TBool aRecorder,
+										  TBool aAmp)
+	{
+	CSdpAttrValue* attrVal = 0;
+	CSdpAttrValueDES* attrValDES = 0;
+
+	// Set Attr 1 (service class list) to list with UUID = Audio Sink
+	aDB.CreateServiceRecordL(TUUID(KAudioSinkUUID), aRecHandle);
+
+	// Protocol Descriptor List
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+
+	attrValDES->StartListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KL2CAPUUID))) // L2CAP
+			->BuildUintL(TSdpIntBuf<TUint16>(KAVDTP)) // PSM = AVDTP
+			->EndListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KAvdtpUUID))) // Avdtp UUID
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100)) // Version
+			->EndListL()
+		->EndListL();
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES);
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+	//BrowseGroupList
+	/*
+	This has been added in order to be interoperable with remote devices which only look for the 
+	service in the PublicBrowseGroup (the root of the browse hierarchy). This is not a mandatory feature. 
+	*/
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	
+	attrValDES->StartListL()
+		->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID))) // Public browse group (the root)
+	    ->EndListL();
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBrowseGroupList, *attrValDES); //attribute 5
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = NULL;
+
+	// Language
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+
+	attrValDES->StartListL()
+		->BuildUintL(TSdpIntBuf<TUint16>(KLanguageEnglish))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdCharacterEncodingUTF8))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdBasePrimaryLanguage))
+	->EndListL();
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdLanguageBaseAttributeIDList, *attrValDES);
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+
+	// BT Profile Description
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+
+	attrValDES->StartListL()
+		->BuildDESL()->StartListL()
+			->BuildUUIDL(KAdvancedAudioDistributionUUID)
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100)) // version
+		->EndListL()
+	->EndListL();
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES);
+
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+	// provider name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Software Ltd"));
+	CleanupStack::PushL(attrVal);
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName, *attrVal);
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Advanced audio distribution sink"));
+	CleanupStack::PushL(attrVal);
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, *attrVal);
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service description
+	attrVal = CSdpAttrValueString::NewStringL(_L8("kick back and listen to some fine tunes with this neat service"));
+	CleanupStack::PushL(attrVal);
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, *attrVal);
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// supported features
+	TUint16 supportedFeatures = aHeadphone ? 1:0;
+	supportedFeatures|=aSpeaker ? 2:0;
+	supportedFeatures|=aRecorder ? 4:0;
+	supportedFeatures|=aAmp ? 8:0;
+	attrVal = CSdpAttrValueUint::NewUintL(TSdpIntBuf<TUint16>(supportedFeatures));
+	CleanupStack::PushL(attrVal);
+	
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdSupportedFeatures, *attrVal);	
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+	}
+
+void TTavsrcUtils::RegisterSourceSDPRecordL(RSdpDatabase& aDB, TSdpServRecordHandle& aRecHandle,
+											TBool aPlayer, TBool aMic, TBool aTuner, TBool aMixer)
+	{
+	CSdpAttrValue* attrVal = 0;
+	CSdpAttrValueDES* attrValDES = 0;
+
+	// Set Attr 1 (service class list) to list with UUID = Audio Sink
+	aDB.CreateServiceRecordL(TUUID(KAudioSourceUUID), aRecHandle);
+
+	// Protocol Descriptor List
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+
+	attrValDES->StartListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KL2CAPUUID))) // L2CAP
+			->BuildUintL(TSdpIntBuf<TUint16>(KAVDTP)) // PSM = AVDTP
+			->EndListL()
+		->BuildDESL()
+			->StartListL()
+			->BuildUUIDL(TUUID(TUint16(KAvdtpUUID))) // Avdtp UUID
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100)) // Version
+			->EndListL()
+		->EndListL();
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES);
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+	//BrowseGroupList
+	/*
+	This has been added in order to be interoperable with remote devices which only look for the 
+	service in the PublicBrowseGroup (the root of the browse hierarchy). This is not a mandatory feature. 
+	*/
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+	
+	attrValDES->StartListL()
+		->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID))) // Public browse group (the root)
+	    ->EndListL();
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBrowseGroupList, *attrValDES); //attribute 5
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = NULL;
+
+	// Language
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+
+	attrValDES->StartListL()
+		->BuildUintL(TSdpIntBuf<TUint16>(KLanguageEnglish))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdCharacterEncodingUTF8))
+		->BuildUintL(TSdpIntBuf<TUint16>(KSdpAttrIdBasePrimaryLanguage))
+	->EndListL(); 
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdLanguageBaseAttributeIDList, *attrValDES);
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+
+	// BT Profile Description
+	attrValDES = CSdpAttrValueDES::NewDESL(0);
+	CleanupStack::PushL(attrValDES);
+
+	attrValDES->StartListL()
+		->BuildDESL()->StartListL()
+			->BuildUUIDL(KAdvancedAudioDistributionUUID)
+			->BuildUintL(TSdpIntBuf<TUint16>(0x0100)) // version
+		->EndListL()
+	->EndListL(); 
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES);
+
+	CleanupStack::PopAndDestroy(attrValDES);
+	attrValDES = 0;
+	
+	// provider name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Software Ltd"));
+	CleanupStack::PushL(attrVal);
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName, *attrVal);
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service name
+	attrVal = CSdpAttrValueString::NewStringL(_L8("Advanced audio distribution source"));
+	CleanupStack::PushL(attrVal);
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, *attrVal);
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// service description
+	attrVal = CSdpAttrValueString::NewStringL(_L8("plug your wireless cans into me!"));
+	CleanupStack::PushL(attrVal);
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, *attrVal);
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+
+	// supported features									
+	TUint16 supportedFeatures = aPlayer ? 1:0;
+	supportedFeatures|=aMic ? 2:0;
+	supportedFeatures|=aTuner ? 4:0;
+	supportedFeatures|=aMixer ? 8:0;
+	attrVal = CSdpAttrValueUint::NewUintL(TSdpIntBuf<TUint16>(supportedFeatures));
+	CleanupStack::PushL(attrVal);
+	
+	aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdSupportedFeatures, *attrVal);	
+	CleanupStack::PopAndDestroy(attrVal);
+	attrVal = 0;
+	}
+
+TInt TTavsrcUtils::GetIntFromUser(CConsoleBase& aConsole)
+	{
+	TBuf<4> inpb;
+	aConsole.Printf(_L(":"));
+	TInt x = aConsole.WhereX();
+	TInt y = aConsole.WhereY();
+	TRequestStatus stat;
+
+	TChar ch(0); // set it to anything to prevent warning
+	while ((ch!='\n')&&(ch!='\r') && inpb.Length()==0)
+		{
+		aConsole.Read(stat);
+		User::WaitForRequest(stat);
+		ch = aConsole.KeyCode();
+		
+		if ((ch=='\b') && (inpb.Length()>0))
+			{
+			inpb.Delete(inpb.Length()-1,1);
+			}
+			
+		if ((inpb.Length()<4)&&((ch>='0')&&(ch<='9')))
+			{
+			inpb.Append(ch);
+			}
+			
+		aConsole.SetPos(x,y);
+		aConsole.Printf(_L("%S"),&inpb);
+		}
+
+	TLex lex(inpb);
+	TInt res;
+	return (lex.Val(res)==KErrNone) ? res : 0;
+	}
+	
+TBool TTavsrcUtils::GetYNFromUser(CConsoleBase& aConsole, const TDesC& aDes)
+	{
+	TBuf<4> inpb;
+	aConsole.Printf(_L("%S (y/n):"),&aDes);
+	TRequestStatus stat;
+
+	TChar ch(0); // set it to anything to prevent warning
+	while ((ch!='n')&&(ch!='y'))
+		{
+		aConsole.Read(stat);
+		User::WaitForRequest(stat);
+		ch = aConsole.KeyCode();
+		}
+	aConsole.Printf(_L("%c"), static_cast<TUint>(ch));
+	return (ch=='y') ? ETrue : EFalse;
+	}
+
+void TTavsrcUtils::GetDeviceAddressL(TBTDevAddr& aAddr)
+	{
+	//Ask user which device address we should connect to...
+	RNotifier notify;
+	User::LeaveIfError(notify.Connect());
+	TBTDeviceSelectionParamsPckg pckg;
+	TBTDeviceResponseParamsPckg resPckg;
+	TRequestStatus stat;
+	notify.StartNotifierAndGetResponse(stat, KDeviceSelectionNotifierUid, pckg, resPckg);
+	User::WaitForRequest(stat);
+	notify.CancelNotifier(KDeviceSelectionNotifierUid);
+	notify.Close();
+	User::LeaveIfError(stat.Int()); 
+
+	aAddr = resPckg().BDAddr();
+	}
+
+TInt TTavsrcUtils::GetCodecSettingsFromSBCFile(RFile& aFile, TInt aPos, TInt& aChannelMode,
+							TInt& aNumChannels, TInt& aNumSubbands, TInt& aBlkLen,
+							TInt& aBitPool, TInt& aFreq, TInt& aAllocMethod)
+	{
+	TInt err = KErrNone;
+	
+	TBuf8<4> header;
+	aFile.Read(aPos, header);
+	TInt syncWord = header[0];
+	__ASSERT_ALWAYS(syncWord==0x9C, User::Invariant());
+	
+	TInt sampleFreq = (header[1]&0xC0)>>6;
+	TInt blockLen = (header[1]&0x30)>>4;
+	aChannelMode = (header[1]&0x0C)>>2;
+	aAllocMethod = (header[1]&0x02)>>1;
+	TInt subBands = (header[1]&0x01);
+	aBitPool = header[2];
+	
+	aNumChannels = (aChannelMode==0) ? 1 : 2;
+	aNumSubbands = (subBands==1) ? 8 : 4;
+	
+	switch (sampleFreq)
+		{
+		case 0x00:
+			aFreq = 16000;
+			break; 
+		case 0x01:
+			aFreq = 32000;
+			break; 
+		case 0x02:
+			aFreq = 44100;
+			break; 
+		case 0x03:
+			aFreq = 48000;
+			break; 
+		}
+		
+	switch (blockLen)
+		{
+		case 0x00:
+			aBlkLen = 4;
+			break; 
+		case 0x01:
+			aBlkLen = 8;
+			break; 
+		case 0x02:
+			aBlkLen = 12;
+			break; 
+		case 0x03:
+			aBlkLen = 16;
+			break; 
+		}
+		
+	return err;
+	}
+
+TInt TTavsrcUtils::GetCodecSettingsFromSBCFile(const TDesC& aFileName, TInt& aChannelMode,
+							TInt& aNumChannels, TInt& aNumSubbands, TInt& aBlkLen,
+							TInt& aBitPool, TInt& aFreq, TInt& aAllocMethod)
+	{
+	TInt err = KErrNone;
+	
+	RFs fileserver;
+	RFile file;
+	
+	err = fileserver.Connect();
+	if (!err) 
+		{
+		err = file.Open(fileserver,aFileName,EFileRead | EFileShareReadersOnly);			
+		}
+	if (err)
+		{
+		return err;			
+		}
+	
+	err = GetCodecSettingsFromSBCFile(file, 0, aChannelMode, aNumChannels, aNumSubbands,
+										aBlkLen, aBitPool, aFreq, aAllocMethod);	
+	file.Close();
+	fileserver.Close();
+	
+	return err;
+	}
+	
+TInt TTavsrcUtils::CEIL(TReal aX)
+	{
+	TReal frac;
+	Math::Frac(frac,aX);
+	return (frac < 0.5) ? aX :aX+1;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcUtils.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,50 @@
+// Copyright (c) 2007-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:
+//
+
+#ifndef TAVSRCUTILS_H
+#define TAVSRCUTILS_H
+
+#include <e32def.h>
+#include <btsdp.h>
+#include <f32file.h>
+
+class TTavsrcUtils
+	{
+public:
+	// SDP helper functions
+	static void RegisterSinkSDPRecordL(RSdpDatabase& aDB, TSdpServRecordHandle& aRecHandle,
+									   TBool aHeadphone, TBool aSpeaker,TBool aRecorder,TBool aAmp);
+	static void RegisterSourceSDPRecordL(RSdpDatabase& aDB, TSdpServRecordHandle& aRecHandle,
+										 TBool aPlayer, TBool aMic, TBool aTuner, TBool aMixer);
+
+	// User input helper functions
+	static TInt GetIntFromUser(CConsoleBase& aConsole);
+	static TBool GetYNFromUser(CConsoleBase& aConsole, const TDesC& aDes);
+
+	static void GetDeviceAddressL(TBTDevAddr& aAddr);
+
+	static TInt GetCodecSettingsFromSBCFile(RFile& aFile, TInt aPos, TInt& aChannelMode,
+							TInt& aNumChannels, TInt& aNumSubbands, TInt& aBlkLen,
+							TInt& aBitPool, TInt& aFreq, TInt& aAllocMethod);
+
+	static TInt GetCodecSettingsFromSBCFile(const TDesC& aFileName, TInt& aChannelMode,
+							TInt& aNumChannels, TInt& aNumSubbands, TInt& aBlkLen,
+							TInt& aBitPool, TInt& aFreq, TInt& aAllocMethod);
+
+	static TInt CEIL(TReal aX);
+	};
+
+#endif // TAVSRCUTILS_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcmtupdaterdatabaseaware.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,981 @@
+// Copyright (c) 2007-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:
+//
+
+#include <e32property.h>
+#include <f32file.h>
+#include <e32debug.h>
+#include <barsc2.h>
+#include <remcondatabaseawarenowplayingtarget.h>
+#include <remcondatabaseawaremediabrowsetarget.h>
+#include <remcondatabaseawaremedialibrarybrowse.h>
+#include <remcondatabaseawarenowplayingbrowse.h>
+#include <remconmediaerror.h>
+#include <reftsp/reftspactiveplayerobserver.h>
+
+#include "browsingframe.h"
+
+#include "tavsrc.h"
+#include "tavsrcmtupdaterdatabaseaware.h"
+#include "activecallbackconsole.h"
+
+#ifdef __WINS__
+GLDEF_D TSize gUpdaterConsole(75,30);
+GLDEF_D TSize gBrowseConsole(75,30);
+#else
+GLDEF_D TSize gUpdaterConsole(KConsFullScreen,KConsFullScreen);
+GLDEF_D TSize gBrowseConsole(KConsFullScreen,KConsFullScreen);
+#endif
+
+
+#define BROWSE_CONSOLE iMtBrowseConsole
+
+const TRemConItemUid KUidMarker = 0xc0ffeeee00000000ull;
+const TRemConItemUid KFolderMarker = 0x0000000100000000ull;
+const TInt KNumberFolderItemsInFolder = 1;
+const TInt KNumberMediaItemsInFolder = 1502;
+const TInt KNumberItemsInFolder = KNumberMediaItemsInFolder + KNumberFolderItemsInFolder; 
+const TInt KMaxFolderDepth = 10;
+
+_LIT8(KFolderName, "Folder%08x");
+
+CTavsrcMtUpdater* CTavsrcMtUpdater::NewL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces)
+	{
+	CTavsrcMtUpdater* mt = new(ELeave)CTavsrcMtUpdater();
+	CleanupStack::PushL(mt);
+	mt->ConstructL(aIfSel, aRemConInterfaces);
+	CleanupStack::Pop();
+	return mt;
+	}
+
+struct TMediaBrowseThreadParams
+	{
+	CRemConInterfaceSelector*	iIfSel;
+	CTavsrcMtUpdater*			iUpdater;
+	};
+
+TInt CTavsrcMtUpdater::MediaBrowseThread(TAny* aPtr)
+	{
+	TMediaBrowseThreadParams* params = reinterpret_cast<TMediaBrowseThreadParams*>(aPtr);
+	
+	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+	CActiveScheduler* activescheduler = new CActiveScheduler;
+	CActiveScheduler::Install(activescheduler);
+	
+	TInt err = KErrNoMemory;
+	if(cleanupStack && activescheduler)
+		{
+		CTavsrcMtUpdater* self = params->iUpdater;
+		TRAP(err, self->BrowseSetupL(*(params->iIfSel)))
+		RThread().Rendezvous(err);
+		if(err == KErrNone)
+			{
+			CActiveScheduler::Start();
+			}
+		self->BrowseCleanup();
+		}
+
+	delete activescheduler;
+	delete cleanupStack;
+
+	return err;
+	}
+
+void CTavsrcMtUpdater::BrowseSetupL(CRemConInterfaceSelector& aIfSel)
+	{
+	iMtBrowseConsole = CActiveCallBackConsole::NewL(BrowseKeyPressed, this, _L("MtBrowse"),gBrowseConsole);
+	BrowseMenu();
+	
+	iMtBrowseStopper = CStopBrowseWatcher::NewL();
+	iMediaBrowse = CRemConDatabaseAwareMediaBrowseTarget::NewL(aIfSel, 
+			*this, *this, EFalse, iMediaBrowseInterface, 
+			iNowPlayingBrowseInterface,
+			iUidCounter);
+	iMtBrowseStopper->Start();
+	}
+
+void CTavsrcMtUpdater::BrowseCleanup()
+	{
+	delete iMtBrowseStopper; iMtBrowseStopper = NULL;
+	delete iMtBrowseConsole; iMtBrowseConsole = NULL;
+	}
+
+
+void CTavsrcMtUpdater::ConstructL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces)
+	{ 
+	if (aRemConInterfaces & EPlayerInformation)
+		{
+		iPlayerInformation = CPlayerInfoTarget::NewL(aIfSel,
+											iPlayerCapabilitiesObserver,
+											iPlayerApplicationSettingsObserver,
+											iPlayerEventsObserver,
+											*this);
+		}
+	
+	if (aRemConInterfaces & ENowPlaying)
+		{
+		iNowPlaying = CRemConDatabaseAwareNowPlayingTarget::NewL(aIfSel, *this);
+		}
+	
+	if (aRemConInterfaces & EMediaBrowse)
+		{
+		// Create media browse thread (and wait until it is running)...
+		TMediaBrowseThreadParams params;
+		params.iIfSel = &aIfSel;
+		params.iUpdater = this;
+		TRequestStatus status;
+		User::LeaveIfError(iMediaBrowseThread.Create(KNullDesC, CTavsrcMtUpdater::MediaBrowseThread, KDefaultStackSize, NULL, &params));
+		iMediaBrowseThread.Rendezvous(status);
+		iMediaBrowseThread.Resume();
+		User::WaitForRequest(status);
+		User::LeaveIfError(status.Int());
+		iMediaBrowseThreadOpen = ETrue;
+		}
+	
+	iMtUpdaterConsole = CActiveConsole::NewL(*this,_L("MtUpdater"),gUpdaterConsole);
+	
+			
+	// configure the PlayerInformation from resource file	
+	ReadAVRCPSettingsFile(KAVRCPSettingsResourceFilename);
+	
+	// We don't need to call AddEvent() for PlaybackStatusChanged or TrackChanged
+	// since these are mandatory events which must be supported. A KErrAlreadyExists
+	// error is returned if these are called from here.
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationPlaybackStatusChanged);
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationTrackChanged);
+	
+	// configure the interface with the events supported by tavsrc
+	// This cannot fail as we constructed the iNotificationEvents array to have a granularity sufficient to 
+	// contain all events without having to grow
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationTrackReachedEnd));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationTrackReachedEnd);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationTrackReachedStart));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationTrackReachedStart);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationPlaybackPosChanged));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationPlaybackPosChanged);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationBatteryStatusChanged));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationBatteryStatusChanged);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationPlayerApplicationSettingChanged));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationPlayerApplicationSettingChanged);
+			
+	// save a Company ID
+	iPlayerCapabilitiesObserver->AddCompanyId(0x4321);
+	iCompanyIds.InsertInOrderL(0x4321);
+
+	// set the player events to some test values 
+	iPlayerEventsObserver->TrackReachedEnd();
+	 
+	// playing 12, which is 2:30 long with a low battery
+	iPlayerEventsObserver->PlaybackStatusChanged(MPlayerEventsObserver::EStopped);
+	iPlaybackStatus = MPlayerEventsObserver::EStopped;
+	
+	iPlayerEventsObserver->TrackChanged(12, 150*1000);
+	iLength = 150*1000;
+	
+	iPlayerEventsObserver->SetBatteryStatus(MPlayerEventsObserver::ECritical);
+	iBatteryStatus = MPlayerEventsObserver::ECritical;
+
+	// current position is 1 minute 10 secs though track 12
+	iPlayerEventsObserver->SetPlaybackPosition(70000);	
+	iPosition = 70000;
+	
+	_LIT_SECURITY_POLICY_PASS(KPassPolicy);
+	TInt err = RProperty::Define(TUid::Uid(KRefTspProperty), KRefTspActivePlayer, RProperty::EInt, KPassPolicy, KPassPolicy);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		User::Leave(err);
+		}
+
+	MtMenu();
+	}
+	
+CTavsrcMtUpdater::CTavsrcMtUpdater()
+	: iNotificationEvents(ERegisterNotificationReservedLast),
+	  iUidCounter(1)
+	{
+	}
+	
+CTavsrcMtUpdater::~CTavsrcMtUpdater()
+	{
+	delete iMtUpdaterConsole;
+	iNotificationEvents.Close();
+	iCompanyIds.Close();
+	if(iMediaBrowseThreadOpen)
+		{
+		TRequestStatus status;
+		iMediaBrowseThread.Logon(status);
+		iMtBrowseStopper->Complete();
+		User::WaitForRequest(status);
+		// the browse thread should not be running now.
+		}
+	iMediaBrowseThread.Close();
+	}
+	
+void CTavsrcMtUpdater::ReadAVRCPSettingsFile(const TDesC& aResourceFileName)
+/**
+ - Creates the resource reader.
+ - Reads the default policy evaluator and dialog creator UIDs.
+ - Reads the number of policies in the resource file.
+ 
+@param aRFs					The file server session used by the resource parser.
+@param aResourceFileName	The name of the AVRCP settings file to read.
+*/
+	{
+	RFs rfs;
+	rfs.Connect();
+	RFile r;
+	User::LeaveIfError(r.Open(rfs, aResourceFileName, EFileRead | EFileShareReadersOnly));
+	CleanupClosePushL(r);
+	TInt size;
+	User::LeaveIfError(r.Size(size));
+	CleanupStack::PopAndDestroy(&r);
+	
+	CResourceFile* resourceFile = CResourceFile::NewLC(rfs, aResourceFileName, 0, size);
+	PlayerApplicationSettingsResourceInit::DefineAttributesL(*iPlayerApplicationSettingsObserver, *resourceFile);
+	CleanupStack::PopAndDestroy(resourceFile);
+	}
+
+void CTavsrcMtUpdater::KeyPressed(TChar aKey)
+	{
+	
+	switch(aKey)
+		{
+	case 'e':
+		{
+		AddEvent(ERegisterNotificationPlaybackPosChanged);
+		iNotificationEvents.InsertInOrder(ERegisterNotificationPlaybackPosChanged);
+		iMtUpdaterConsole->Console().Printf(_L("Add event EPlaybackPosChanged\n"));
+		break;
+		}
+	case 'c':
+		{
+		AddCompanyId(0x5678);
+		(void)iCompanyIds.InsertInOrder(0x5678);
+		iMtUpdaterConsole->Console().Printf(_L("Add CompanyId 0x5678\n"));
+		break;
+		}
+	case '1':
+		{
+		PlackbackStatusChanged(NextPlaybackStatus());
+		iMtUpdaterConsole->Console().Printf(_L("Playback status changed %d\n"),iPlaybackStatus);
+		break;
+		}
+	case '2':
+		{
+		TrackChanged(++iIndex, KDefaultLength);
+		iMtUpdaterConsole->Console().Printf(_L("Track changed\n"));
+		break;
+		}
+	case '3':
+		{
+		TrackReachedEnd();
+		iMtUpdaterConsole->Console().Printf(_L("Track reached end\n"));
+		break;
+		}
+	case '4':
+		{
+		TrackReachedStart();
+		iMtUpdaterConsole->Console().Printf(_L("Track reached end\n"));
+		break;
+		}
+	case '5':
+		{
+		iPosition += KPositionIncrement;
+		SetPlaybackPosition(iPosition);
+		iMtUpdaterConsole->Console().Printf(_L("Position %d\n"),iPosition );
+		break;
+	case '6':
+		{
+		SetBatteryStatus(NextBatteryStatus());
+		iMtUpdaterConsole->Console().Printf(_L("BatteryStatus %d\n"),iBatteryStatus );
+		break;
+		}
+		}
+	case '8':
+		{
+		// change an application setting, 
+		// increment the value if attribute ID no 1 for example
+		// CPlayerInfoTarget
+		iPlayerApplicationSettingsObserver->SetAttributeL(1, 2);
+		iMtUpdaterConsole->Console().Printf(_L("Increment the value if attribute ID no 1\n") );
+		break;
+		}
+	case '9':
+		{
+		// Update NowPlayingList 
+		iNowPlaying->NowPlayingContentChanged();
+
+		iMtUpdaterConsole->Console().Printf(_L("Now Playing List updated\n") );
+		break;
+		}
+	case '0':
+		{
+		User::SafeInc(*reinterpret_cast<TInt*>(&iUidCounter)); // Might get dodgy when reaching 0x80000000
+		iMediaBrowseInterface->MrcdamlbMediaLibraryStateChange(iUidCounter);
+		iMtUpdaterConsole->Console().Printf(_L("UIDs changed: %d \n"), iUidCounter);
+		break;
+		}
+	case 'a':
+		{
+		SetAsActivePlayer();
+		break;
+		}
+	default:
+		iMtUpdaterConsole->Console().Printf(_L("No such command\n"));
+		break;
+		};
+		
+	MtMenu();
+	}
+		
+void CTavsrcMtUpdater::MtMenu()
+	{
+	DisplayCurrentState();
+	
+	iMtUpdaterConsole->Console().Printf(_L("e.\tAddEvent\n"));
+	iMtUpdaterConsole->Console().Printf(_L("c.\tAddCompanyId\n"));
+	iMtUpdaterConsole->Console().Printf(_L("1.\tPlaybackStatusChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("2.\tTrackChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("3.\tTrackReachedEnd\n"));
+	iMtUpdaterConsole->Console().Printf(_L("4.\tTrackReachedStart\n"));
+	iMtUpdaterConsole->Console().Printf(_L("5.\tPlaybackPositionChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("6.\tSetBatteryStatus\n"));
+	iMtUpdaterConsole->Console().Printf(_L("8.\tAttributeChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("9.\tNowPlayingContentChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("0.\tUIDsChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("\n"));
+	
+	iMtUpdaterConsole->RequestKey();
+	}
+
+TInt CTavsrcMtUpdater::BrowseKeyPressed(TAny* aPtr, TChar aKey)
+	{
+	TRAPD(err, static_cast<CTavsrcMtUpdater*>(aPtr)->BrowseKeyPressedL(aKey));
+	return err;
+	}
+
+void CTavsrcMtUpdater::BrowseKeyPressedL(TChar aKey)
+	{
+	switch(aKey)
+		{
+	case '0':
+		{
+		User::SafeInc(*reinterpret_cast<TInt*>(&iUidCounter)); // Might get dodgy when reaching 0x80000000
+		iMediaBrowseInterface->MrcdamlbMediaLibraryStateChange(iUidCounter);
+		BROWSE_CONSOLE->Console().Printf(_L("UIDs changed: %d \n"), iUidCounter);
+		break;
+		}
+	default:
+		BROWSE_CONSOLE->Console().Printf(_L("No such command\n"));
+		break;
+		};
+		
+	BrowseMenu();
+	}
+	
+void CTavsrcMtUpdater::BrowseMenu()
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("0.\tUIDsChanged\n"));
+	BROWSE_CONSOLE->Console().Printf(_L("\n"));
+	
+	BROWSE_CONSOLE->RequestKey();
+	}
+
+void CTavsrcMtUpdater::AddEvent(TRegisterNotificationEvent aEvent)
+	{
+	iPlayerCapabilitiesObserver->AddEvent(aEvent);
+	}
+	
+void CTavsrcMtUpdater::AddCompanyId(TInt aCompanyId)
+	{
+	// save a Company ID
+	iPlayerCapabilitiesObserver->AddCompanyId(aCompanyId);
+	}
+
+void CTavsrcMtUpdater::TrackReachedEnd()
+	{
+	iPlayerEventsObserver->TrackReachedEnd();
+	}
+	
+void CTavsrcMtUpdater::TrackReachedStart()
+	{
+	iPlayerEventsObserver->TrackReachedStart();
+	}
+	
+void CTavsrcMtUpdater::PlackbackStatusChanged(MPlayerEventsObserver::TPlaybackStatus aPlaybackStatus)
+	{ 
+	iPlayerEventsObserver->PlaybackStatusChanged(aPlaybackStatus);
+	}
+
+void CTavsrcMtUpdater::TrackChanged(TUint64 aIndex, TUint32 aLengthInMilliseconds)
+	{ 
+	iPlayerEventsObserver->TrackChanged(aIndex, aLengthInMilliseconds);
+	}
+	
+void CTavsrcMtUpdater::SetBatteryStatus(MPlayerEventsObserver::TTargetBatteryStatus aStatus)
+	{
+	iPlayerEventsObserver->SetBatteryStatus(aStatus);
+	}
+
+void CTavsrcMtUpdater::SetPlaybackPosition(TUint32 aPosition)
+	{	
+	iPlayerEventsObserver->SetPlaybackPosition(aPosition);
+	}
+	
+void CTavsrcMtUpdater::SetAsActivePlayer()
+	{
+	TInt err = RProperty::Set(TUid::Uid(KRefTspProperty), KRefTspActivePlayer, RProcess().Id());
+	iMtUpdaterConsole->Console().Printf(_L("Set as active player %d\n"), err);
+	}
+
+MPlayerEventsObserver::TPlaybackStatus CTavsrcMtUpdater::NextPlaybackStatus()
+	{
+	if(iPlaybackStatus == MPlayerEventsObserver::EStopped)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EPlaying;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::EPlaying)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EPaused;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::EPaused)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EFwdSeek;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::EFwdSeek)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::ERevSeek;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::ERevSeek)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EStopped;
+		}
+		
+	return iPlaybackStatus;
+	}
+
+MPlayerEventsObserver::TTargetBatteryStatus CTavsrcMtUpdater::NextBatteryStatus()
+	{
+	if(iBatteryStatus == MPlayerEventsObserver::ENormal)
+		{
+		iBatteryStatus = MPlayerEventsObserver::EWarning;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::EWarning)
+		{
+		iBatteryStatus = MPlayerEventsObserver::ECritical;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::ECritical)
+		{
+		iBatteryStatus = MPlayerEventsObserver::EExternal;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::EExternal)
+		{
+		iBatteryStatus = MPlayerEventsObserver::EFullCharge;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::EFullCharge)
+		{
+		iBatteryStatus = MPlayerEventsObserver::ENormal;
+		}
+		
+	return iBatteryStatus;
+	}
+
+// from MPlayerApplicationSettingsNotify
+void CTavsrcMtUpdater::MpasnSetPlayerApplicationValueL(const RArray<TInt>& aAttributeID, const RArray<TInt>& aAttributeValue)
+
+	{
+	for (TInt i=0; i < aAttributeID.Count(); i++)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("SetPlayerApplication attribute:%d value:%d \n"),aAttributeID[i], aAttributeValue[i]);	
+		}
+	}
+
+void CTavsrcMtUpdater::MrcdanptoPlayItem(const TRemConItemUid& aItem, TRemConFolderScope aScope, TUint16 aUidCounter)
+	{
+	iMtUpdaterConsole->Console().Printf(_L("* PlayItem %08x %08x\t scope %d remote uidcounter %d\n"), aItem>>32, aItem & 0xffffffff, aScope, aUidCounter);
+
+	if(iUidCounter != aUidCounter)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("remote uidcounter does not match local(%d)\n"), iUidCounter);
+		iNowPlaying->PlayItemResponse(KErrInvalidMediaLibraryStateCookie);
+		}
+	else
+		{
+		iNowPlaying->PlayItemResponse(KErrNone);
+		}
+	}
+
+void CTavsrcMtUpdater::MrcdanptoAddToNowPlaying(const TRemConItemUid& aItem, TRemConFolderScope aScope, TUint16 aUidCounter)
+	{
+	iMtUpdaterConsole->Console().Printf(_L("* AddToNowPlaying %08x%08x\t scope %d uidcounter %d\n"), aItem>>32, aItem, aScope, aUidCounter);
+
+	if(iUidCounter != aUidCounter)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("remote uidcounter does not match local(%d)\n"), iUidCounter);
+		iNowPlaying->AddToNowPlayingResponse(KErrInvalidMediaLibraryStateCookie);
+		}
+	else
+		{
+		iNowPlaying->AddToNowPlayingResponse(KErrNone);
+		}
+	}
+
+void CTavsrcMtUpdater::MrcdamlboGetFolderListing(TRemConFolderScope aScope, TUint aStartItem, TUint aEndItem)
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("* GetFolderItems scope %d, start item %d, end item %d\n"), aScope, aStartItem, aEndItem);
+	// FIXME handle scopes
+	TInt err = aStartItem < KNumberItemsInFolder ? KErrNone : KErrMediaBrowseInvalidOffset;
+
+	TInt numberItems = (iFolderDepth == KMaxFolderDepth) ? KNumberMediaItemsInFolder : KNumberItemsInFolder;
+	TInt numberFolderItems = (iFolderDepth == KMaxFolderDepth) ? 0 : KNumberFolderItemsInFolder;
+	
+	RArray<TRemConItem> folderListing;
+	if(!err)
+		{
+		for(TInt i = aStartItem; (i <= aEndItem) && (i < numberItems) && !err; i++)
+			{
+			// FIXME handle erro	
+			TRemConItem item;
+			item.iUid = static_cast<TRemConItemUid>(i) | KUidMarker;
+			item.iType = ERemConMediaItem;
+			if(i < numberFolderItems)
+				{
+				item.iUid = static_cast<TRemConItemUid>(i) | KFolderMarker;
+				item.iType = ERemConFolderItem;
+				}
+			
+			err = folderListing.Append(item);
+			}
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Returning listing of %d items, current uid counter %d\n"), folderListing.Array().Count(), iUidCounter);	
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error %d getting folder listing"));	
+		}
+	iMediaBrowseInterface->MrcdamlbFolderListing(folderListing.Array(), iUidCounter, err);
+
+	folderListing.Close();
+	}
+
+void CTavsrcMtUpdater::SetAttributeL(REAResponse& aAttribute, TRemConItemUid& aUid)
+	{
+	_LIT8(KTestTitle,     "Test Title 0x%08x%08x");
+	aAttribute.iCharset = KUtf8MibEnum;
+
+	switch(aAttribute.iAttributeId)
+		{
+		case ETitleOfMedia:
+			{
+			//buffer.Copy(KMediaTitle);
+			aAttribute.iString = HBufC8::NewL(29);
+			TPtr8 namePtr = aAttribute.iString->Des();
+			namePtr.AppendFormat(KTestTitle, (aUid >> 32), aUid);
+			aAttribute.iStringLen = namePtr.Length();
+			break;
+			}
+			/*
+		case ENameOfArtist:
+			buffer.Copy(KArtistName);
+			break;
+		case ENameOfAlbum:
+			buffer.Copy(KAlbumName);
+			break;
+		case ETrackNumber:
+			buffer.Copy(KTrackNumber);
+			break;
+		case ENumberOfTracks:
+			buffer.Copy(KNumberOfTracks);
+			break;
+		case EGenre:
+			buffer.Copy(KGenre);
+			break;
+		case EPlayingTime:
+			buffer.Copy(KPlayingTime);
+			break;
+			*/
+		default:
+		//	__DEBUGGER();
+			User::Leave(KErrNotFound);
+			break;
+		}
+	}
+
+void CTavsrcMtUpdater::MrcdamlboFolderUp(TUint16 aMediaLibraryStateCookie)
+	{
+	TInt err = (aMediaLibraryStateCookie == iUidCounter) ? KErrNone : KErrInvalidMediaLibraryStateCookie;
+
+	if(!err && --iFolderDepth < 0)
+		{
+		iFolderDepth = 0;
+		err = KErrMediaBrowseNotADirectory;
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Folder Up\n"));
+		}
+	else if(err == KErrInvalidMediaLibraryStateCookie)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error: remote uidcounter (%d) does not match local(%d)\n"), aMediaLibraryStateCookie, iUidCounter);
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error: %d\n"), err);
+		}
+	iMediaBrowseInterface->MrcdamlbFolderUpResult(KNumberItemsInFolder, err);
+	}
+
+void CTavsrcMtUpdater::MrcdamlboFolderDown(const TRemConItemUid& aFolder, TUint16 aMediaLibraryStateCookie)
+	{
+	TInt err = (aMediaLibraryStateCookie == iUidCounter) ? KErrNone : KErrInvalidMediaLibraryStateCookie;
+	
+	if(!(aFolder & KFolderMarker))
+		{
+		err = KErrMediaBrowseNotADirectory;
+		}
+	else if(!err && ++iFolderDepth > KMaxFolderDepth)
+		{
+		iFolderDepth = KMaxFolderDepth;
+		err = KErrNotSupported;
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Folder down %08x %08x\n"), aFolder >> 32, aFolder);
+		}
+	else if(err == KErrInvalidMediaLibraryStateCookie)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error: remote uidcounter (%d) does not match local(%d)\n"), aMediaLibraryStateCookie, iUidCounter);
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error: %d\n"), err);
+		}
+	iMediaBrowseInterface->MrcdamlbFolderDownResult(KNumberItemsInFolder, err);
+	}
+
+void CTavsrcMtUpdater::MrcdamlboGetPath(RPointerArray<HBufC8>& aPath)
+	{
+	TInt err = KErrNone;
+	for(TInt i = 0; (i < iFolderDepth) && (err == KErrNone); i++)
+		{
+		HBufC8* name = HBufC8::NewL(14);
+		name->Des().AppendFormat(KFolderName, iFolderDepth);
+		err = aPath.Append(name);
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Player set as browsed: folder items = %d, uid counter = %d\n"), KNumberItemsInFolder, iUidCounter);
+		}
+	else 
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Error %d setting as browsed player"), err);
+		}
+	iMediaBrowseInterface->MrcdamlbGetPathResult(KNumberItemsInFolder, iUidCounter, err);
+	}
+
+void CTavsrcMtUpdater::MrcdamlboSearch(const TDesC8& /*aSearch*/)
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("* Search (returning not supported)"));
+
+	iMediaBrowseInterface->MrcdamlbSearchResult(0, iUidCounter, KErrAvrcpAirSearchNotSupported);
+	}
+
+void CTavsrcMtUpdater::DisplayCurrentState()
+	{
+	iMtUpdaterConsole->Console().Printf(_L("**************************************************\n"));
+	iMtUpdaterConsole->Console().Printf(_L("* CURRENT STATE\n*\n"));
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Supported Events:\t"));
+	for(TInt i=0; i<iNotificationEvents.Count(); i++)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("0x%.8x\t"), iNotificationEvents[i]);
+		}
+	iMtUpdaterConsole->Console().Printf(_L("\n"));
+		
+	iMtUpdaterConsole->Console().Printf(_L("* Supported Company Ids:\t"));
+	for(TInt i=0; i<iCompanyIds.Count(); i++)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("0x%.8x\t"), iCompanyIds[i]);
+		}
+	iMtUpdaterConsole->Console().Printf(_L("\n"));
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Playback Status: "));
+	switch(iPlaybackStatus)
+		{
+	case MPlayerEventsObserver::EStopped:
+		iMtUpdaterConsole->Console().Printf(_L("STOPPED\n"));
+		break;
+	case MPlayerEventsObserver::EPlaying:
+		iMtUpdaterConsole->Console().Printf(_L("PLAYING\n"));
+		break;
+	case MPlayerEventsObserver::EPaused:
+		iMtUpdaterConsole->Console().Printf(_L("PAUSED\n"));
+		break;
+	case MPlayerEventsObserver::EFwdSeek:
+		iMtUpdaterConsole->Console().Printf(_L("FWD_SEEK\n"));
+		break;
+	case MPlayerEventsObserver::ERevSeek:
+		iMtUpdaterConsole->Console().Printf(_L("REV_SEEK\n"));
+		break;
+	default:
+		ASSERT(EFalse);
+		break;
+		}
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Position: %d\n"), iPosition);
+	iMtUpdaterConsole->Console().Printf(_L("* Length: %d\n"), iLength);
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Battery Status: "), iBatteryStatus);
+	switch(iBatteryStatus)
+		{
+	case MPlayerEventsObserver::ENormal:
+		iMtUpdaterConsole->Console().Printf(_L("NORMAL \n"));
+		break;
+	case MPlayerEventsObserver::EWarning:
+		iMtUpdaterConsole->Console().Printf(_L("WARNING \n"));
+		break;
+	case MPlayerEventsObserver::ECritical:
+		iMtUpdaterConsole->Console().Printf(_L("CRITICAL \n"));
+		break;
+	case MPlayerEventsObserver::EExternal:
+		iMtUpdaterConsole->Console().Printf(_L("EXTERNAL \n"));
+		break;
+	case MPlayerEventsObserver::EFullCharge:
+		iMtUpdaterConsole->Console().Printf(_L("FULL CHARGE \n"));
+		break;
+	case MPlayerEventsObserver::EUnknown:
+		iMtUpdaterConsole->Console().Printf(_L("Unknown\n"));
+	default:
+		ASSERT(EFalse);
+		break;
+		}	
+	
+	iMtUpdaterConsole->Console().Printf(_L("**************************************************\n\n"));
+	}
+
+void CTavsrcMtUpdater::MrcdanpboGetFolderListing(TUint aStartItem, TUint aEndItem)
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("* GetFolderItems NowPlaying start item %d, end item %d\n"), aStartItem, aEndItem);
+
+	TInt err = aStartItem < KNumberItemsInFolder ? KErrNone : KErrMediaBrowseInvalidOffset;
+
+	RArray<TRemConItem> folderListing;
+	if(!err)
+		{
+		for(TInt i = aStartItem; (i <= aEndItem) && (i < KNumberItemsInFolder) && !err; i++)
+			{
+			// FIXME handle erro
+			TRemConItem item;
+			item.iUid = static_cast<TRemConItemUid>(i) | KUidMarker;
+			item.iType = ERemConMediaItem;
+			err = folderListing.Append(item);
+			}
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Returning listing of %d items, current uid counter %d\n"), folderListing.Array().Count(), iUidCounter);	
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error %d getting folder listing"));	
+		}
+
+	iNowPlayingBrowseInterface->MrcdanpbFolderListing(folderListing.Array(), iUidCounter, err);
+	}
+
+TInt CTavsrcMtUpdater::PrepareItemDataL(
+		TMediaAttributeIter& aIter,
+		const TRemConItemUid& aItemId,
+		HBufC8* &aItemName,
+		RArray<TMediaElementAttribute>& aItemAttributes)
+	{
+	/**
+	First, construct the name of the media item.
+	*/
+    _LIT8(KMediaItemName,     "MediaItem 0x%08x%08x");	
+	_LIT8(KFolderItemName,     "FolderItem 0x%08x%08x");	
+	HBufC8* itemName = HBufC8::NewL(30);
+    TPtr8 namePtr = itemName->Des();
+	TUint upper = aItemId >> 32;
+	TUint lower = aItemId & 0xffffffff;	
+	if (aItemId & KUidMarker)
+	    {
+	    namePtr.AppendFormat(KMediaItemName, upper, lower);
+	    }
+	else if(aItemId & KFolderMarker)
+		{
+		namePtr.AppendFormat(KFolderItemName, upper, lower);
+		}
+	else
+		{
+		ASSERT(NULL);
+		}
+	aItemName = itemName;
+	/**
+	Second, construct attributes of the item.
+	*/
+	_LIT8(KAttributeName, "Attibute 0x%02x");
+	TMediaElementAttribute attribute;
+	TMediaAttributeId id;
+	aIter.Start();
+	while(aIter.Next(id))
+		{
+		//API takes the ownership.
+		HBufC8* attributeName = HBufC8::NewL(30);
+		TPtr8 attributeNamePtr = attributeName->Des();
+		attributeNamePtr.AppendFormat(KAttributeName, id);
+		
+		attribute.iAttributeId = id;
+		attribute.iString = attributeName;
+		aItemAttributes.Append(attribute);
+		}
+	
+	return KErrNone;
+	}
+
+TInt CTavsrcMtUpdater::MrcdamlboGetItem(TRemConFolderScope /*aScope*/,
+				const TRemConItemUid& aItemId, 
+				TMediaAttributeIter& aIter, 
+				TUint16 aMediaLibraryStateCookie)
+	{
+	if(iUidCounter != aMediaLibraryStateCookie)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("remote uidcounter does not match local(%d)\n"), iUidCounter);
+		return KErrInvalidMediaLibraryStateCookie;
+		}
+
+	TInt error = KErrNone;
+	RArray<TMediaElementAttribute> itemAttributes;
+	HBufC8* itemName = NULL;
+	if (aItemId & KUidMarker)
+		{
+		PrepareItemDataL(aIter, aItemId, itemName, itemAttributes);
+		iMediaBrowseInterface->MrcdamlbMediaElementItemResult(aItemId, 
+					*itemName, 
+					AvrcpBrowsing::KAudio,
+					itemAttributes.Array(), 
+					KErrNone);
+		}
+	else if(aItemId & KFolderMarker)
+		{
+		PrepareItemDataL(aIter, aItemId, itemName, itemAttributes);
+		iMediaBrowseInterface->MrcdamlbFolderItemResult(aItemId, 
+					*itemName, 
+					EFolderPlaylists,
+					KFolderNotPlayable,
+					itemAttributes.Array(),
+					KErrNone);
+		}
+	else
+		{
+		error = KErrInvalidUid;
+		}
+	
+	delete itemName;
+	return error;
+	}
+
+
+TInt CTavsrcMtUpdater::MrcdanpboGetItem(const TRemConItemUid& aItemId, 
+			TMediaAttributeIter& aIter, 
+			TUint16 aMediaLibraryStateCookie)
+	{
+	if(iUidCounter != aMediaLibraryStateCookie)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("remote uidcounter does not match local(%d)\n"), iUidCounter);
+		return KErrInvalidMediaLibraryStateCookie;
+		}
+	
+	TInt error = KErrNone;
+	RArray<TMediaElementAttribute> itemAttributes;
+	if (aItemId & KUidMarker)
+		{
+		HBufC8* itemName;
+		PrepareItemDataL(aIter, aItemId, itemName, itemAttributes);
+		iNowPlayingBrowseInterface->MrcdanpbMediaElementItemResult(aItemId, 
+				*itemName, 
+				AvrcpBrowsing::KAudio,
+				itemAttributes.Array(), 
+				KErrNone);
+		delete itemName;
+		}
+	else
+		{
+		error = KErrInvalidUid;
+		}
+	
+	return error;
+	}
+
+CStopBrowseWatcher* CStopBrowseWatcher::NewL()
+	{
+	CStopBrowseWatcher* self = new(ELeave) CStopBrowseWatcher;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CStopBrowseWatcher::CStopBrowseWatcher()
+	: CActive(EPriorityStandard)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CStopBrowseWatcher::ConstructL()
+	{
+	User::LeaveIfError(iThread.Open(RThread().Id()));
+	}
+
+CStopBrowseWatcher::~CStopBrowseWatcher()
+	{
+	Cancel();
+	iThread.Close();
+	}
+
+void CStopBrowseWatcher::Start()
+	{
+	iStatus = KRequestPending;
+	SetActive();
+	}
+
+void CStopBrowseWatcher::Complete()
+	{
+	TRequestStatus* status = &iStatus;
+	iThread.RequestComplete(status, KErrNone);
+	}
+
+void CStopBrowseWatcher::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CStopBrowseWatcher::DoCancel()
+	{
+	TRequestStatus* status = &iStatus;
+	iThread.RequestComplete(status, KErrCancel);
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcmtupdaterdatabaseaware.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,168 @@
+// Copyright (c) 2007-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:
+// tavsrcmtupdater.h
+//
+
+#ifndef TAVSRCMTUPDATER_H
+#define TAVSRCMTUPDATER_H
+
+#include <remconmediainformationtargetobserver.h>
+#include <playerinformationtargetobserver.h>
+#include <remcondatabaseawarenowplayingtargetobserver.h>
+#include <remcondatabaseawarenowplayingbrowseobserver.h>
+#include <remcondatabaseawaremedialibrarybrowseobserver.h>
+#include <remcon/avrcpspec.h>
+#include "mediainformation.h"
+
+_LIT(KAVRCPSettingsResourceFilename, "z:\\bluetooth\\avrcp\\avrcp-settings.rsc");
+const TInt KDefaultLength = 120000;
+const TInt KPositionIncrement = 5000;
+
+class CStopBrowseWatcher
+	: public CActive
+	{
+public:
+	static CStopBrowseWatcher* NewL();
+	~CStopBrowseWatcher();
+	
+	void Start();
+	void Complete();
+	
+private:
+	CStopBrowseWatcher();
+	void ConstructL();
+	
+private: // from CActive
+	void RunL();
+	void DoCancel();
+
+private:
+	RThread iThread;
+	};
+
+class CActiveCallBackConsole;
+class CRemConDatabaseAwareNowPlayingTarget;
+class CRemConDatabaseAwareMediaBrowseTarget;
+class MRemConDatabaseAwareMediaLibraryBrowse;
+class MRemConDatabaseAwareNowPlayingBrowse;
+class CTavsrcMtUpdater : public CBase, public MActiveConsoleNotify, 
+	public MPlayerApplicationSettingsNotify, 
+	public MRemConDatabaseAwareMediaLibraryBrowseObserver,
+	public MRemConDatabaseAwareNowPlayingBrowseObserver,
+	public MRemConDatabaseAwareNowPlayingTargetObserver
+	{
+public:
+	static CTavsrcMtUpdater* NewL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces);
+	~CTavsrcMtUpdater();
+	
+private:
+	CTavsrcMtUpdater();
+	void ConstructL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces);
+	
+	void KeyPressed(TChar aKey);
+	void MtMenu();
+	
+	void ReadAVRCPSettingsFile(const TDesC& aResourceFileName);
+	
+	void AddEvent(TRegisterNotificationEvent aEvent);
+	void AddCompanyId(TInt aCompanyId);
+	void TrackReachedEnd();
+	void TrackReachedStart();
+	void PlackbackStatusChanged(MPlayerEventsObserver::TPlaybackStatus aPlaybackStatus);
+	void TrackChanged(TUint64 aIndex, TUint32 aLengthInMilliseconds);
+	void SetBatteryStatus(MPlayerEventsObserver::TTargetBatteryStatus aStatus);
+	void SetPlaybackPosition(TUint32 aPosition);
+	void SetAsActivePlayer();
+	
+	MPlayerEventsObserver::TPlaybackStatus NextPlaybackStatus();
+	MPlayerEventsObserver::TTargetBatteryStatus NextBatteryStatus();
+
+private:
+	// from MPlayerApplicationSettingsNotify
+	void MpasnSetPlayerApplicationValueL(const RArray<TInt>& aAttributeID, const RArray<TInt>& aAttributeValue);
+	
+	// from MRemConDatabaseAwareNowPlayingTargetObserver
+	void MrcdanptoPlayItem(const TRemConItemUid& aItem, TRemConFolderScope aScope, TUint16 aUidCounter);
+	void MrcdanptoAddToNowPlaying(const TRemConItemUid& aItem, TRemConFolderScope aScope, TUint16 aUidCounter);
+	
+	// from MRemConDatabaseAwareMediaLibraryBrowseTargetObserver
+	void MrcdamlboGetFolderListing(TRemConFolderScope aScope, TUint aStartItem, TUint aEndItem);
+	void MrcdamlboFolderUp(TUint16 aMediaLibraryStateCookie);
+	void MrcdamlboFolderDown(const TRemConItemUid& aFolder, TUint16 aMediaLibraryStateCookie);
+	void MrcdamlboGetPath(RPointerArray<HBufC8>& aPath);
+	void MrcdamlboSearch(const TDesC8& aSearch);
+	TInt MrcdamlboGetItem(TRemConFolderScope aScope,
+				const TRemConItemUid& aItemId, 
+				TMediaAttributeIter& aIter, 
+				TUint16 aMediaLibraryStateCookie);
+	
+	// from MRemConDatabaseAwareNowPlayingBrowseObserver
+	void MrcdanpboGetFolderListing(TUint aStartItem, TUint aEndItem);
+	TInt MrcdanpboGetItem(const TRemConItemUid& aItemId, 
+				TMediaAttributeIter& aIter, 
+				TUint16 aMediaLibraryStateCookie);
+	
+	void DisplayCurrentState();
+	void SetAttributeL(REAResponse& aAttribute, TRemConItemUid& aUid);
+
+private: // Utility functions
+	TInt PrepareItemDataL(TMediaAttributeIter& aIter,
+			const TRemConItemUid& aItemId,
+			HBufC8* &aItemName,
+			RArray<TMediaElementAttribute>& aItemAttributes);
+	
+private: // second thread functions
+	static TInt MediaBrowseThread(TAny* aPtr);
+	void BrowseSetupL(CRemConInterfaceSelector& aIfSel);
+	void BrowseCleanup();
+	
+	static TInt BrowseKeyPressed(TAny* aPtr, TChar aKey);
+	void BrowseKeyPressedL(TChar aKey);
+	void BrowseMenu();
+	
+private:
+	CPlayerInfoTarget* iPlayerInformation;
+	MPlayerCapabilitiesObserver* iPlayerCapabilitiesObserver;
+	MPlayerApplicationSettingsObserver* iPlayerApplicationSettingsObserver;
+	MPlayerEventsObserver* iPlayerEventsObserver;
+	
+	CRemConDatabaseAwareMediaBrowseTarget*			iMediaBrowse;
+	MRemConDatabaseAwareMediaLibraryBrowse*			iMediaBrowseInterface;
+	MRemConDatabaseAwareNowPlayingBrowse*			iNowPlayingBrowseInterface;
+	CRemConDatabaseAwareNowPlayingTarget*			iNowPlaying;
+	
+	CActiveConsole*	iMtUpdaterConsole;
+	
+	CActiveCallBackConsole*	iMtBrowseConsole;
+	
+	TInt iIndex;
+	MPlayerEventsObserver::TPlaybackStatus iPlaybackStatus;
+	MPlayerEventsObserver::TTargetBatteryStatus iBatteryStatus;
+	TUint32 iPosition;
+	TUint32 iLength;
+	
+	
+	RArray<TInt> iNotificationEvents;
+	RArray<TInt> iCompanyIds;
+	
+	TInt iFolderDepth;
+	
+	TUint iUidCounter;
+	
+	TBool iMediaBrowseThreadOpen;
+	RThread iMediaBrowseThread;
+	CStopBrowseWatcher* iMtBrowseStopper;
+	};
+
+#endif //TAVSRCMTUPDATER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcmtupdaterdatabaseunaware.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,929 @@
+// Copyright (c) 2007-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:
+// tavsrcmtupdater.cpp
+//
+
+#include <e32property.h>
+#include <f32file.h>
+#include <e32debug.h>
+#include <barsc2.h>
+#include <remcondatabaseunawarenowplayingtarget.h>
+#include <remcondatabaseunawaremediabrowsetarget.h>
+#include <remcondatabaseunawaremedialibrarybrowse.h>
+#include <remcondatabaseunawarenowplayingbrowse.h>
+#include <remconmediaerror.h>
+#include <reftsp/reftspactiveplayerobserver.h>
+
+#include "tavsrc.h"
+#include "tavsrcmtupdaterdatabaseunaware.h"
+#include "activecallbackconsole.h"
+
+#ifdef __WINS__
+GLDEF_D TSize gUpdaterConsole(75,30);
+GLDEF_D TSize gBrowseConsole(75,30);
+#else
+GLDEF_D TSize gUpdaterConsole(KConsFullScreen,KConsFullScreen);
+GLDEF_D TSize gBrowseConsole(KConsFullScreen,KConsFullScreen);
+#endif
+
+
+#define BROWSE_CONSOLE iMtBrowseConsole
+
+const TRemConItemUid KUidMarker = 0xc0ffeeee00000000ull;
+const TRemConItemUid KFolderMarker = 0x0000000100000000ull;
+const TInt KNumberFolderItemsInFolder = 1;
+const TInt KNumberMediaItemsInFolder = 1501;
+const TInt KNumberItemsInFolder = KNumberMediaItemsInFolder + KNumberFolderItemsInFolder; 
+
+_LIT8(KFolderName, "Folder%08x");
+
+CTavsrcMtUpdater* CTavsrcMtUpdater::NewL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces)
+	{
+	CTavsrcMtUpdater* mt = new(ELeave)CTavsrcMtUpdater();
+	CleanupStack::PushL(mt);
+	mt->ConstructL(aIfSel, aRemConInterfaces);
+	CleanupStack::Pop();
+	return mt;
+	}
+
+struct TMediaBrowseThreadParams
+	{
+	CRemConInterfaceSelector*	iIfSel;
+	CTavsrcMtUpdater*			iUpdater;
+	};
+
+TInt CTavsrcMtUpdater::MediaBrowseThread(TAny* aPtr)
+	{
+	TMediaBrowseThreadParams* params = reinterpret_cast<TMediaBrowseThreadParams*>(aPtr);
+	
+	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+	CActiveScheduler* activescheduler = new CActiveScheduler;
+	CActiveScheduler::Install(activescheduler);
+	
+	TInt err = KErrNoMemory;
+	if(cleanupStack && activescheduler)
+		{
+		CTavsrcMtUpdater* self = params->iUpdater;
+		TRAP(err, self->BrowseSetupL(*(params->iIfSel)))
+		RThread().Rendezvous(err);
+		if(err == KErrNone)
+			{
+			CActiveScheduler::Start();
+			}
+		self->BrowseCleanup();
+		}
+
+	delete activescheduler;
+	delete cleanupStack;
+
+	return err;
+	}
+
+void CTavsrcMtUpdater::BrowseSetupL(CRemConInterfaceSelector& aIfSel)
+	{
+	iMtBrowseConsole = CActiveCallBackConsole::NewL(BrowseKeyPressed, this, _L("MtBrowse"),gBrowseConsole);
+	BrowseMenu();
+	
+	iMtBrowseStopper = CStopBrowseWatcher::NewL();
+	iMediaBrowse = CRemConDatabaseUnawareMediaBrowseTarget::NewL(aIfSel, 
+			*this, *this, ETrue, iMediaBrowseInterface, 
+			iNowPlayingBrowseInterface);
+	iMtBrowseStopper->Start();
+	}
+
+void CTavsrcMtUpdater::BrowseCleanup()
+	{
+	delete iMtBrowseStopper; iMtBrowseStopper = NULL;
+	delete iMtBrowseConsole; iMtBrowseConsole = NULL;
+	}
+
+
+void CTavsrcMtUpdater::ConstructL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces)
+	{ 
+	if (aRemConInterfaces & EPlayerInformation)
+		{
+	iPlayerInformation = CPlayerInfoTarget::NewL(aIfSel,
+										iPlayerCapabilitiesObserver,
+										iPlayerApplicationSettingsObserver,
+										iPlayerEventsObserver,
+										*this);
+		}
+	
+	if (aRemConInterfaces & ENowPlaying)
+		{
+	iNowPlaying = CRemConDatabaseUnawareNowPlayingTarget::NewL(aIfSel, *this);
+		}
+	
+	if (aRemConInterfaces & EMediaBrowse)
+		{
+		// Create media browse thread (and wait until it is running)...
+		TMediaBrowseThreadParams params;
+		params.iIfSel = &aIfSel;
+		params.iUpdater = this;
+		TRequestStatus status;
+		User::LeaveIfError(iMediaBrowseThread.Create(KNullDesC, CTavsrcMtUpdater::MediaBrowseThread, KDefaultStackSize, NULL, &params));
+		iMediaBrowseThread.Rendezvous(status);
+		iMediaBrowseThread.Resume();
+		User::WaitForRequest(status);
+		User::LeaveIfError(status.Int());
+		iMediaBrowseThreadOpen = ETrue;
+		}
+	
+	iMtUpdaterConsole = CActiveConsole::NewL(*this,_L("MtUpdater"),gUpdaterConsole);
+		
+	// configure the PlayerInformation from resource file	
+	ReadAVRCPSettingsFile(KAVRCPSettingsResourceFilename);
+	
+	// We don't need to call AddEvent() for PlaybackStatusChanged or TrackChanged
+	// since these are mandatory events which must be supported. A KErrAlreadyExists
+	// error is returned if these are called from here.
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationPlaybackStatusChanged);
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationTrackChanged);
+	
+	// configure the interface with the events supported by tavsrc
+	// This cannot fail as we constructed the iNotificationEvents array to have a granularity sufficient to 
+	// contain all events without having to grow
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationTrackReachedEnd));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationTrackReachedEnd);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationTrackReachedStart));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationTrackReachedStart);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationPlaybackPosChanged));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationPlaybackPosChanged);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationBatteryStatusChanged));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationBatteryStatusChanged);
+	
+	User::LeaveIfError( iPlayerCapabilitiesObserver->AddEvent(ERegisterNotificationPlayerApplicationSettingChanged));
+	(void)iNotificationEvents.InsertInOrder(ERegisterNotificationPlayerApplicationSettingChanged);
+			
+	// save a Company ID
+	iPlayerCapabilitiesObserver->AddCompanyId(0x4321);
+	iCompanyIds.InsertInOrderL(0x4321);
+
+	// set the player events to some test values 
+	iPlayerEventsObserver->TrackReachedEnd();
+	 
+	// playing 12, which is 2:30 long with a low battery
+	iPlayerEventsObserver->PlaybackStatusChanged(MPlayerEventsObserver::EStopped);
+	iPlaybackStatus = MPlayerEventsObserver::EStopped;
+	
+	iPlayerEventsObserver->TrackChanged(12, 150*1000);
+	iLength = 150*1000;
+	
+	iPlayerEventsObserver->SetBatteryStatus(MPlayerEventsObserver::ECritical);
+	iBatteryStatus = MPlayerEventsObserver::ECritical;
+
+	// current position is 1 minute 10 secs though track 12
+	iPlayerEventsObserver->SetPlaybackPosition(70000);	
+	iPosition = 70000;
+	
+	_LIT_SECURITY_POLICY_PASS(KPassPolicy);
+	TInt err = RProperty::Define(TUid::Uid(KRefTspProperty), KRefTspActivePlayer, RProperty::EInt, KPassPolicy, KPassPolicy);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		User::Leave(err);
+		}
+
+	MtMenu();
+	}
+	
+CTavsrcMtUpdater::CTavsrcMtUpdater()
+	: iNotificationEvents(ERegisterNotificationReservedLast),
+	  iUidCounter(0)
+	{
+	}
+	
+CTavsrcMtUpdater::~CTavsrcMtUpdater()
+	{
+	delete iMtUpdaterConsole;
+	iNotificationEvents.Close();
+	iCompanyIds.Close();
+	if(iMediaBrowseThreadOpen)
+		{
+		TRequestStatus status;
+		iMediaBrowseThread.Logon(status);
+		iMtBrowseStopper->Complete();
+		User::WaitForRequest(status);
+		// the browse thread should not be running now.
+		}
+	iMediaBrowseThread.Close();
+	}
+	
+void CTavsrcMtUpdater::ReadAVRCPSettingsFile(const TDesC& aResourceFileName)
+/**
+ - Creates the resource reader.
+ - Reads the default policy evaluator and dialog creator UIDs.
+ - Reads the number of policies in the resource file.
+ 
+@param aRFs					The file server session used by the resource parser.
+@param aResourceFileName	The name of the AVRCP settings file to read.
+*/
+	{
+	RFs rfs;
+	rfs.Connect();
+	RFile r;
+	User::LeaveIfError(r.Open(rfs, aResourceFileName, EFileRead | EFileShareReadersOnly));
+	CleanupClosePushL(r);
+	TInt size;
+	User::LeaveIfError(r.Size(size));
+	CleanupStack::PopAndDestroy(&r);
+	
+	CResourceFile* resourceFile = CResourceFile::NewLC(rfs, aResourceFileName, 0, size);
+	PlayerApplicationSettingsResourceInit::DefineAttributesL(*iPlayerApplicationSettingsObserver, *resourceFile);
+	CleanupStack::PopAndDestroy(resourceFile);
+	}
+
+void CTavsrcMtUpdater::KeyPressed(TChar aKey)
+	{
+	
+	switch(aKey)
+		{
+	case 'e':
+		{
+		AddEvent(ERegisterNotificationPlaybackPosChanged);
+		iNotificationEvents.InsertInOrder(ERegisterNotificationPlaybackPosChanged);
+		iMtUpdaterConsole->Console().Printf(_L("Add event EPlaybackPosChanged\n"));
+		break;
+		}
+	case 'c':
+		{
+		AddCompanyId(0x5678);
+		(void)iCompanyIds.InsertInOrder(0x5678);
+		iMtUpdaterConsole->Console().Printf(_L("Add CompanyId 0x5678\n"));
+		break;
+		}
+	case '1':
+		{
+		PlackbackStatusChanged(NextPlaybackStatus());
+		iMtUpdaterConsole->Console().Printf(_L("Playback status changed %d\n"),iPlaybackStatus);
+		break;
+		}
+	case '2':
+		{
+		TrackChanged(++iIndex, KDefaultLength);
+		iMtUpdaterConsole->Console().Printf(_L("Track changed\n"));
+		break;
+		}
+	case '3':
+		{
+		TrackReachedEnd();
+		iMtUpdaterConsole->Console().Printf(_L("Track reached end\n"));
+		break;
+		}
+	case '4':
+		{
+		TrackReachedStart();
+		iMtUpdaterConsole->Console().Printf(_L("Track reached end\n"));
+		break;
+		}
+	case '5':
+		{
+		iPosition += KPositionIncrement;
+		SetPlaybackPosition(iPosition);
+		iMtUpdaterConsole->Console().Printf(_L("Position %d\n"),iPosition );
+		break;
+	case '6':
+		{
+		SetBatteryStatus(NextBatteryStatus());
+		iMtUpdaterConsole->Console().Printf(_L("BatteryStatus %d\n"),iBatteryStatus );
+		break;
+		}
+		}
+	case '8':
+		{
+		// change an application setting, 
+		// increment the value if attribute ID no 1 for example
+		// CPlayerInfoTarget
+		iPlayerApplicationSettingsObserver->SetAttributeL(1, 2);
+		iMtUpdaterConsole->Console().Printf(_L("Increment the value if attribute ID no 1\n") );
+		break;
+		}
+	case '9':
+		{
+		// Update NowPlayingList 
+		iNowPlaying->NowPlayingContentChanged();
+
+		iMtUpdaterConsole->Console().Printf(_L("Now Playing List updated\n") );
+		break;
+		}
+	case '0':
+		{
+		iMediaBrowseInterface->MrcdumlbMediaLibraryStateChange();
+
+		iMtUpdaterConsole->Console().Printf(_L("UIDs changed: %d \n"), iUidCounter);
+		break;
+		}
+	case 'a':
+		{
+		SetAsActivePlayer();
+		break;
+		}
+	default:
+		iMtUpdaterConsole->Console().Printf(_L("No such command\n"));
+		break;
+		};
+		
+	MtMenu();
+	}
+		
+void CTavsrcMtUpdater::MtMenu()
+	{
+	DisplayCurrentState();
+	
+	iMtUpdaterConsole->Console().Printf(_L("e.\tAddEvent\n"));
+	iMtUpdaterConsole->Console().Printf(_L("c.\tAddCompanyId\n"));
+	iMtUpdaterConsole->Console().Printf(_L("1.\tPlaybackStatusChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("2.\tTrackChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("3.\tTrackReachedEnd\n"));
+	iMtUpdaterConsole->Console().Printf(_L("4.\tTrackReachedStart\n"));
+	iMtUpdaterConsole->Console().Printf(_L("5.\tPlaybackPositionChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("6.\tSetBatteryStatus\n"));
+	iMtUpdaterConsole->Console().Printf(_L("8.\tAttributeChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("9.\tNowPlayingContentChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("0.\tUIDsChanged\n"));
+	iMtUpdaterConsole->Console().Printf(_L("\n"));
+	
+	iMtUpdaterConsole->RequestKey();
+	}
+
+TInt CTavsrcMtUpdater::BrowseKeyPressed(TAny* aPtr, TChar aKey)
+	{
+	TRAPD(err, static_cast<CTavsrcMtUpdater*>(aPtr)->BrowseKeyPressedL(aKey));
+	return err;
+	}
+
+void CTavsrcMtUpdater::BrowseKeyPressedL(TChar aKey)
+	{
+	switch(aKey)
+		{
+	case '0':
+		{
+		iMediaBrowseInterface->MrcdumlbMediaLibraryStateChange();
+		BROWSE_CONSOLE->Console().Printf(_L("UIDs changed: %d \n"), iUidCounter);
+		break;
+		}
+	default:
+		BROWSE_CONSOLE->Console().Printf(_L("No such command\n"));
+		break;
+		};
+		
+	BrowseMenu();
+	}
+	
+void CTavsrcMtUpdater::BrowseMenu()
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("0.\tUIDsChanged\n"));
+	BROWSE_CONSOLE->Console().Printf(_L("\n"));
+	
+	BROWSE_CONSOLE->RequestKey();
+	}
+
+void CTavsrcMtUpdater::AddEvent(TRegisterNotificationEvent aEvent)
+	{
+	iPlayerCapabilitiesObserver->AddEvent(aEvent);
+	}
+	
+void CTavsrcMtUpdater::AddCompanyId(TInt aCompanyId)
+	{
+	// save a Company ID
+	iPlayerCapabilitiesObserver->AddCompanyId(aCompanyId);
+	}
+
+void CTavsrcMtUpdater::TrackReachedEnd()
+	{
+	iPlayerEventsObserver->TrackReachedEnd();
+	}
+	
+void CTavsrcMtUpdater::TrackReachedStart()
+	{
+	iPlayerEventsObserver->TrackReachedStart();
+	}
+	
+void CTavsrcMtUpdater::PlackbackStatusChanged(MPlayerEventsObserver::TPlaybackStatus aPlaybackStatus)
+	{ 
+	iPlayerEventsObserver->PlaybackStatusChanged(aPlaybackStatus);
+	}
+
+void CTavsrcMtUpdater::TrackChanged(TUint64 aIndex, TUint32 aLengthInMilliseconds)
+	{ 
+	iPlayerEventsObserver->TrackChanged(aIndex, aLengthInMilliseconds);
+	}
+	
+void CTavsrcMtUpdater::SetBatteryStatus(MPlayerEventsObserver::TTargetBatteryStatus aStatus)
+	{
+	iPlayerEventsObserver->SetBatteryStatus(aStatus);
+	}
+
+void CTavsrcMtUpdater::SetPlaybackPosition(TUint32 aPosition)
+	{	
+	iPlayerEventsObserver->SetPlaybackPosition(aPosition);
+	}
+	
+void CTavsrcMtUpdater::SetAsActivePlayer()
+	{
+	TInt err = RProperty::Set(TUid::Uid(KRefTspProperty), KRefTspActivePlayer, RProcess().Id());
+	iMtUpdaterConsole->Console().Printf(_L("Set as active player %d\n"), err);
+	}
+
+MPlayerEventsObserver::TPlaybackStatus CTavsrcMtUpdater::NextPlaybackStatus()
+	{
+	if(iPlaybackStatus == MPlayerEventsObserver::EStopped)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EPlaying;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::EPlaying)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EPaused;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::EPaused)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EFwdSeek;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::EFwdSeek)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::ERevSeek;
+		}
+	else if(iPlaybackStatus == MPlayerEventsObserver::ERevSeek)
+		{
+		iPlaybackStatus = MPlayerEventsObserver::EStopped;
+		}
+		
+	return iPlaybackStatus;
+	}
+
+MPlayerEventsObserver::TTargetBatteryStatus CTavsrcMtUpdater::NextBatteryStatus()
+	{
+	if(iBatteryStatus == MPlayerEventsObserver::ENormal)
+		{
+		iBatteryStatus = MPlayerEventsObserver::EWarning;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::EWarning)
+		{
+		iBatteryStatus = MPlayerEventsObserver::ECritical;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::ECritical)
+		{
+		iBatteryStatus = MPlayerEventsObserver::EExternal;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::EExternal)
+		{
+		iBatteryStatus = MPlayerEventsObserver::EFullCharge;
+		}
+	else if(iBatteryStatus == MPlayerEventsObserver::EFullCharge)
+		{
+		iBatteryStatus = MPlayerEventsObserver::ENormal;
+		}
+		
+	return iBatteryStatus;
+	}
+
+// from MPlayerApplicationSettingsNotify
+void CTavsrcMtUpdater::MpasnSetPlayerApplicationValueL(const RArray<TInt>& aAttributeID, const RArray<TInt>& aAttributeValue)
+
+	{
+	for (TInt i=0; i < aAttributeID.Count(); i++)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("SetPlayerApplication attribute:%d value:%d \n"),aAttributeID[i], aAttributeValue[i]);	
+		}
+	}
+
+void CTavsrcMtUpdater::MrcdunptoPlayItem(const TRemConItemUid& aItem, TRemConFolderScope aScope)
+	{
+	iMtUpdaterConsole->Console().Printf(_L("* PlayItem 0x%08x%08x\t scope %d \n"), aItem>>32, aItem, aScope);
+	iNowPlaying->PlayItemResponse(0x11);
+	}
+
+void CTavsrcMtUpdater::MrcdunptoAddToNowPlaying(const TRemConItemUid& aItem, TRemConFolderScope aScope)
+	{
+	iMtUpdaterConsole->Console().Printf(_L("* AddToNowPlaying 0x%08x%08x\t scope %d\n"), aItem>>32, aItem, aScope);
+	iNowPlaying->AddToNowPlayingResponse(KErrNone);
+	}
+
+void CTavsrcMtUpdater::MrcdumlboGetFolderListing(TRemConFolderScope /*aScope*/, TUint aStartItem, TUint aEndItem)
+	{
+	// FIXME handle scopes
+	TInt err = KErrNone;
+
+	RArray<TRemConItem> folderListing;
+	for(TInt i = aStartItem; (i <= aEndItem) && (i < KNumberItemsInFolder) && !err; i++)
+		{
+		// FIXME handle erro
+		TRemConItem item;
+		item.iUid = static_cast<TRemConItemUid>(i) | KUidMarker;
+		item.iType = ERemConMediaItem;
+		if(i < KNumberFolderItemsInFolder)
+			{
+			item.iUid = static_cast<TRemConItemUid>(i) | KFolderMarker;
+			item.iType = ERemConFolderItem;
+			}
+		
+		err = folderListing.Append(item);
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Returning listing of %d items, current uid counter %d\n"), folderListing.Array().Count(), iUidCounter);	
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error %d getting folder listing"));	
+		}
+	iMediaBrowseInterface->MrcdumlbFolderListing(folderListing.Array(), err);
+
+	folderListing.Close();
+	}
+
+void CTavsrcMtUpdater::SetAttributeL(REAResponse& aAttribute, TRemConItemUid& aUid)
+	{
+	_LIT8(KTestTitle,     "Test Title 0x%08x%08x");
+	aAttribute.iCharset = KUtf8MibEnum;
+
+	switch(aAttribute.iAttributeId)
+		{
+		case ETitleOfMedia:
+			{
+			//buffer.Copy(KMediaTitle);
+			aAttribute.iString = HBufC8::NewL(29);
+			TPtr8 namePtr = aAttribute.iString->Des();
+			namePtr.AppendFormat(KTestTitle, (aUid >> 32), aUid);
+			aAttribute.iStringLen = namePtr.Length();
+			break;
+			}
+			/*
+		case ENameOfArtist:
+			buffer.Copy(KArtistName);
+			break;
+		case ENameOfAlbum:
+			buffer.Copy(KAlbumName);
+			break;
+		case ETrackNumber:
+			buffer.Copy(KTrackNumber);
+			break;
+		case ENumberOfTracks:
+			buffer.Copy(KNumberOfTracks);
+			break;
+		case EGenre:
+			buffer.Copy(KGenre);
+			break;
+		case EPlayingTime:
+			buffer.Copy(KPlayingTime);
+			break;
+			*/
+		default:
+		//	__DEBUGGER();
+			User::Leave(KErrNotFound);
+			break;
+		}
+	}
+
+void CTavsrcMtUpdater::MrcdumlboFolderUp()
+	{
+	TInt err = KErrNone;
+
+	if(!err && --iFolderDepth < 0)
+		{
+		iFolderDepth = 0;
+		err = KErrNotSupported;
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Folder Up\n"));
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error: %d\n"), err);
+		}
+	iMediaBrowseInterface->MrcdumlbFolderUpResult(KNumberItemsInFolder, err);
+	}
+
+void CTavsrcMtUpdater::MrcdumlboFolderDown(const TRemConItemUid& aFolder)
+	{
+	TInt err = KErrNone;
+	
+	if(!(aFolder & KFolderMarker))
+		{
+		err = KErrNotFound;
+		}
+	else if(!err && ++iFolderDepth > 10)
+		{
+		iFolderDepth = 10;
+		err = KErrNotSupported;
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Folder down %08x %08x\n"), aFolder >> 32, aFolder);
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error: %d\n"), err);
+		}
+	iMediaBrowseInterface->MrcdumlbFolderDownResult(KNumberItemsInFolder, err);
+	}
+
+void CTavsrcMtUpdater::MrcdumlboGetPath(RPointerArray<HBufC8>& aPath)
+	{
+	TInt err = KErrNone;
+	for(TInt i = 0; (i < iFolderDepth) && (err == KErrNone); i++)
+		{
+		HBufC8* name = HBufC8::NewL(14);
+		name->Des().AppendFormat(KFolderName, iFolderDepth);
+		err = aPath.Append(name);
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Player set as browsed: folder items = %d, uid counter = %d\n"), KNumberItemsInFolder, iUidCounter);
+		}
+	else 
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("* Error %d setting as browsed player"), err);
+		}
+	iMediaBrowseInterface->MrcdumlbGetPathResult(KNumberItemsInFolder, err);
+	}
+
+void CTavsrcMtUpdater::MrcdumlboSearch(const TDesC8& /*aSearch*/)
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("* Search (returning not supported)"));
+
+	iMediaBrowseInterface->MrcdumlbSearchResult(0, KErrNotSupported);
+	}
+
+void CTavsrcMtUpdater::DisplayCurrentState()
+	{
+	iMtUpdaterConsole->Console().Printf(_L("**************************************************\n"));
+	iMtUpdaterConsole->Console().Printf(_L("* CURRENT STATE\n*\n"));
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Supported Events:\t"));
+	for(TInt i=0; i<iNotificationEvents.Count(); i++)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("0x%.8x\t"), iNotificationEvents[i]);
+		}
+	iMtUpdaterConsole->Console().Printf(_L("\n"));
+		
+	iMtUpdaterConsole->Console().Printf(_L("* Supported Company Ids:\t"));
+	for(TInt i=0; i<iCompanyIds.Count(); i++)
+		{
+		iMtUpdaterConsole->Console().Printf(_L("0x%.8x\t"), iCompanyIds[i]);
+		}
+	iMtUpdaterConsole->Console().Printf(_L("\n"));
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Playback Status: "));
+	switch(iPlaybackStatus)
+		{
+	case MPlayerEventsObserver::EStopped:
+		iMtUpdaterConsole->Console().Printf(_L("STOPPED\n"));
+		break;
+	case MPlayerEventsObserver::EPlaying:
+		iMtUpdaterConsole->Console().Printf(_L("PLAYING\n"));
+		break;
+	case MPlayerEventsObserver::EPaused:
+		iMtUpdaterConsole->Console().Printf(_L("PAUSED\n"));
+		break;
+	case MPlayerEventsObserver::EFwdSeek:
+		iMtUpdaterConsole->Console().Printf(_L("FWD_SEEK\n"));
+		break;
+	case MPlayerEventsObserver::ERevSeek:
+		iMtUpdaterConsole->Console().Printf(_L("REV_SEEK\n"));
+		break;
+	default:
+		ASSERT(EFalse);
+		break;
+		}
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Position: %d\n"), iPosition);
+	iMtUpdaterConsole->Console().Printf(_L("* Length: %d\n"), iLength);
+	
+	iMtUpdaterConsole->Console().Printf(_L("* Battery Status: "), iBatteryStatus);
+	switch(iBatteryStatus)
+		{
+	case MPlayerEventsObserver::ENormal:
+		iMtUpdaterConsole->Console().Printf(_L("NORMAL \n"));
+		break;
+	case MPlayerEventsObserver::EWarning:
+		iMtUpdaterConsole->Console().Printf(_L("WARNING \n"));
+		break;
+	case MPlayerEventsObserver::ECritical:
+		iMtUpdaterConsole->Console().Printf(_L("CRITICAL \n"));
+		break;
+	case MPlayerEventsObserver::EExternal:
+		iMtUpdaterConsole->Console().Printf(_L("EXTERNAL \n"));
+		break;
+	case MPlayerEventsObserver::EFullCharge:
+		iMtUpdaterConsole->Console().Printf(_L("FULL CHARGE \n"));
+		break;
+	case MPlayerEventsObserver::EUnknown:
+		iMtUpdaterConsole->Console().Printf(_L("Unknown\n"));
+	default:
+		ASSERT(EFalse);
+		break;
+		}	
+	
+	iMtUpdaterConsole->Console().Printf(_L("**************************************************\n\n"));
+	}
+
+void CTavsrcMtUpdater::MrcdunpboGetFolderListing(TUint aStartItem, TUint aEndItem)
+	{
+	BROWSE_CONSOLE->Console().Printf(_L("* GetFolderItems NowPlaying start item %d, end item %d\n"), aStartItem, aEndItem);
+
+	TInt err = KErrNone;
+	
+	RArray<TRemConItem> folderListing;
+	for(TInt i = aStartItem; (i <= aEndItem) && (i < KNumberItemsInFolder) && !err; i++)
+		{
+		// FIXME handle erro
+		TRemConItem item;
+		item.iUid = static_cast<TRemConItemUid>(i) | KUidMarker;
+		item.iType = ERemConMediaItem;
+		err = folderListing.Append(item);
+		}
+	
+	if(!err)
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Returning listing of %d items, current uid counter %d\n"), folderListing.Array().Count(), iUidCounter);	
+		}
+	else
+		{
+		BROWSE_CONSOLE->Console().Printf(_L("  Error %d getting folder listing"));	
+		}
+
+	iNowPlayingBrowseInterface->MrcdunpbFolderListing(folderListing.Array(), err);
+	}
+
+TInt CTavsrcMtUpdater::PrepareItemDataL(
+		TMediaAttributeIter& aIter,
+		const TRemConItemUid& aItemId,
+		HBufC8* &aItemName,
+		RArray<TMediaElementAttribute>& aItemAttributes)
+	{
+	/**
+	First, construct the name of the media item.
+	*/
+    _LIT8(KMediaItemName,     "MediaItem 0x%08x%08x");	
+	_LIT8(KFolderItemName,     "FolderItem 0x%08x%08x");	
+	HBufC8* itemName = HBufC8::NewL(30);
+    TPtr8 namePtr = itemName->Des();
+	TUint upper = aItemId >> 32;
+	TUint lower = aItemId & 0xffffffff;	
+	if (aItemId & KUidMarker)
+	    {
+	    namePtr.AppendFormat(KMediaItemName, upper, lower);
+	    }
+	else if(aItemId & KFolderMarker)
+		{
+		namePtr.AppendFormat(KFolderItemName, upper, lower);
+		}
+	else
+		{
+		ASSERT(NULL);
+		}
+	aItemName = itemName;
+	/**
+	Second, construct attributes of the item.
+	*/
+	_LIT8(KAttributeName, "Attibute 0x%02x");
+	TMediaElementAttribute attribute;
+	TMediaAttributeId id;
+	aIter.Start();
+	while(aIter.Next(id))
+		{
+		//API takes the ownership.
+		HBufC8* attributeName = HBufC8::NewL(30);
+		TPtr8 attributeNamePtr = attributeName->Des();
+		attributeNamePtr.AppendFormat(KAttributeName, id);
+		
+		attribute.iAttributeId = id;
+		attribute.iString = attributeName;
+		aItemAttributes.Append(attribute);
+		}
+	
+	return KErrNone;
+	}
+
+TInt CTavsrcMtUpdater::MrcdumlboGetItem(TRemConFolderScope aScope,
+				const TRemConItemUid& aItemId, 
+				TMediaAttributeIter& aIter)
+	{
+	//FIXME handle the error: uidcounter doesn't match
+	
+	TInt error = KErrNone;
+	RArray<TMediaElementAttribute> itemAttributes;
+	HBufC8* itemName;
+	if (aItemId & KUidMarker)
+		{
+		PrepareItemDataL(aIter, aItemId, itemName, itemAttributes);
+		iMediaBrowseInterface->MrcdumlbMediaElementItemResult(aItemId, 
+					*itemName, 
+					AvrcpBrowsing::KAudio,
+					itemAttributes.Array(), 
+					KErrNone);
+		}
+	else if(aItemId & KFolderMarker)
+		{
+		PrepareItemDataL(aIter, aItemId, itemName, itemAttributes);	
+		iMediaBrowseInterface->MrcdumlbFolderItemResult(aItemId, 
+					*itemName, 
+					EFolderPlaylists,
+					KFolderNotPlayable,
+					itemAttributes.Array(),
+					KErrNone);
+		}
+	else
+		{
+		error = KErrInvalidUid;
+		}
+	
+	delete itemName;
+	return error;
+	}
+
+TInt CTavsrcMtUpdater::MrcdunpboGetItem(const TRemConItemUid& aItemId, 
+			TMediaAttributeIter& aIter)
+	{
+	//FIXME handle the error: uidcounter doesn't match.
+	
+	TInt error = KErrNone;
+	RArray<TMediaElementAttribute> itemAttributes;
+	HBufC8* itemName;
+	if (aItemId & KUidMarker)
+		{
+		PrepareItemDataL(aIter, aItemId, itemName, itemAttributes);
+		iNowPlayingBrowseInterface->MrcdunpbMediaElementItemResult(aItemId, 
+					*itemName, 
+					AvrcpBrowsing::KAudio,
+					itemAttributes.Array(), 
+					KErrNone);
+		}
+	else
+		{
+		error = KErrInvalidUid;
+		}
+	
+	delete itemName;
+	return error;
+	}
+
+CStopBrowseWatcher* CStopBrowseWatcher::NewL()
+	{
+	CStopBrowseWatcher* self = new(ELeave) CStopBrowseWatcher;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CStopBrowseWatcher::CStopBrowseWatcher()
+	: CActive(EPriorityStandard)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CStopBrowseWatcher::ConstructL()
+	{
+	User::LeaveIfError(iThread.Open(RThread().Id()));
+	}
+
+CStopBrowseWatcher::~CStopBrowseWatcher()
+	{
+	Cancel();
+	iThread.Close();
+	}
+
+void CStopBrowseWatcher::Start()
+	{
+	iStatus = KRequestPending;
+	SetActive();
+	}
+
+void CStopBrowseWatcher::Complete()
+	{
+	TRequestStatus* status = &iStatus;
+	iThread.RequestComplete(status, KErrNone);
+	}
+
+void CStopBrowseWatcher::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CStopBrowseWatcher::DoCancel()
+	{
+	TRequestStatus* status = &iStatus;
+	iThread.RequestComplete(status, KErrCancel);
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcmtupdaterdatabaseunaware.h	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,165 @@
+// Copyright (c) 2007-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:
+// tavsrcmtupdater.h
+//
+
+#ifndef TAVSRCMTUPDATER_H
+#define TAVSRCMTUPDATER_H
+
+#include <remconmediainformationtargetobserver.h>
+#include <playerinformationtargetobserver.h>
+#include <remcondatabaseunawarenowplayingtargetobserver.h>
+#include <remcondatabaseunawarenowplayingbrowseobserver.h>
+#include <remcondatabaseunawaremedialibrarybrowseobserver.h>
+#include <remcon/avrcpspec.h>
+#include "mediainformation.h"
+
+_LIT(KAVRCPSettingsResourceFilename, "z:\\bluetooth\\avrcp\\avrcp-settings.rsc");
+const TInt KDefaultLength = 120000;
+const TInt KPositionIncrement = 5000;
+
+class CStopBrowseWatcher
+	: public CActive
+	{
+public:
+	static CStopBrowseWatcher* NewL();
+	~CStopBrowseWatcher();
+	
+	void Start();
+	void Complete();
+	
+private:
+	CStopBrowseWatcher();
+	void ConstructL();
+	
+private: // from CActive
+	void RunL();
+	void DoCancel();
+
+private:
+	RThread iThread;
+	};
+
+class CActiveCallBackConsole;
+class CRemConDatabaseUnawareMediaBrowseTarget;
+class MRemConDatabaseUnawareMediaLibraryBrowse;
+class MRemConDatabaseUnawareNowPlayingBrowse;
+class CRemConDatabaseUnawareNowPlayingTarget;
+class CTavsrcMtUpdater : public CBase, public MActiveConsoleNotify, 
+	public MPlayerApplicationSettingsNotify, 
+	public MRemConDatabaseUnawareMediaLibraryBrowseObserver,
+	public MRemConDatabaseUnawareNowPlayingBrowseObserver,
+	public MRemConDatabaseUnawareNowPlayingTargetObserver
+	{
+public:
+	static CTavsrcMtUpdater* NewL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces);
+	~CTavsrcMtUpdater();
+	
+private:
+	CTavsrcMtUpdater();
+	void ConstructL(CRemConInterfaceSelector& aIfSel, TUint aRemConInterfaces);
+	
+	void KeyPressed(TChar aKey);
+	void MtMenu();
+	
+	void ReadAVRCPSettingsFile(const TDesC& aResourceFileName);
+	
+	void AddEvent(TRegisterNotificationEvent aEvent);
+	void AddCompanyId(TInt aCompanyId);
+	void TrackReachedEnd();
+	void TrackReachedStart();
+	void PlackbackStatusChanged(MPlayerEventsObserver::TPlaybackStatus aPlaybackStatus);
+	void TrackChanged(TUint64 aIndex, TUint32 aLengthInMilliseconds);
+	void SetBatteryStatus(MPlayerEventsObserver::TTargetBatteryStatus aStatus);
+	void SetPlaybackPosition(TUint32 aPosition);
+	void SetAsActivePlayer();
+	
+	MPlayerEventsObserver::TPlaybackStatus NextPlaybackStatus();
+	MPlayerEventsObserver::TTargetBatteryStatus NextBatteryStatus();
+
+private:
+	// from MPlayerApplicationSettingsNotify
+	void MpasnSetPlayerApplicationValueL(const RArray<TInt>& aAttributeID, const RArray<TInt>& aAttributeValue);
+	
+	// from MRemConDatabaseUnawareNowPlayingTargetObserver
+	void MrcdunptoPlayItem(const TRemConItemUid& aItem, TRemConFolderScope aScope);
+	void MrcdunptoAddToNowPlaying(const TRemConItemUid& aItem, TRemConFolderScope aScope);
+	
+	// from MRemConDatabaseUnawareMediaLibraryBrowseObserver
+	void MrcdumlboGetFolderListing(TRemConFolderScope aScope, TUint aStartItem, TUint aEndItem);
+	void MrcdumlboFolderUp();
+	void MrcdumlboFolderDown(const TRemConItemUid& aFolder);
+	void MrcdumlboGetPath(RPointerArray<HBufC8>& aPath);
+	void MrcdumlboSearch(const TDesC8& aSearch);
+	TInt MrcdumlboGetItem(TRemConFolderScope aScope,
+				const TRemConItemUid& aItemId, 
+				TMediaAttributeIter& aIter);
+	
+	// from MRemConDatabaseUnawareNowPlayingBrowseObserver
+	void MrcdunpboGetFolderListing(TUint aStartItem, TUint aEndItem);
+	TInt MrcdunpboGetItem(const TRemConItemUid& aItemId, 
+			TMediaAttributeIter& aIter);
+	
+	void DisplayCurrentState();
+	void SetAttributeL(REAResponse& aAttribute, TRemConItemUid& aUid);
+	
+private: // Utility functions
+	TInt PrepareItemDataL(TMediaAttributeIter& aIter,
+			const TRemConItemUid& aItemId,
+			HBufC8* &aItemName,
+			RArray<TMediaElementAttribute>& aItemAttributes);
+	
+private: // second thread functions
+	static TInt MediaBrowseThread(TAny* aPtr);
+	void BrowseSetupL(CRemConInterfaceSelector& aIfSel);
+	void BrowseCleanup();
+	
+	static TInt BrowseKeyPressed(TAny* aPtr, TChar aKey);
+	void BrowseKeyPressedL(TChar aKey);
+	void BrowseMenu();
+	
+private:
+	CPlayerInfoTarget* iPlayerInformation;
+	MPlayerCapabilitiesObserver* iPlayerCapabilitiesObserver;
+	MPlayerApplicationSettingsObserver* iPlayerApplicationSettingsObserver;
+	MPlayerEventsObserver* iPlayerEventsObserver;
+	
+	CRemConDatabaseUnawareMediaBrowseTarget*		iMediaBrowse;
+	MRemConDatabaseUnawareMediaLibraryBrowse*		iMediaBrowseInterface;
+	MRemConDatabaseUnawareNowPlayingBrowse*			iNowPlayingBrowseInterface;
+	CRemConDatabaseUnawareNowPlayingTarget*			iNowPlaying;
+	
+	CActiveConsole* iMtUpdaterConsole;
+	CActiveCallBackConsole*	iMtBrowseConsole;
+	
+	TInt iIndex;
+	MPlayerEventsObserver::TPlaybackStatus iPlaybackStatus;
+	MPlayerEventsObserver::TTargetBatteryStatus iBatteryStatus;
+	TUint32 iPosition;
+	TUint32 iLength;
+	
+	
+	RArray<TInt> iNotificationEvents;
+	RArray<TInt> iCompanyIds;
+	
+	TInt iFolderDepth;
+	
+	TUint iUidCounter;
+	
+	TBool iMediaBrowseThreadOpen;
+	RThread iMediaBrowseThread;
+	CStopBrowseWatcher* iMtBrowseStopper;
+	};
+
+#endif //TAVSRCMTUPDATER_H
--- a/bluetoothcommsprofiles/btpan/group/btpan.iby	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothcommsprofiles/btpan/group/btpan.iby	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -34,11 +34,11 @@
 REM *** Now for things which should only be included if the device
 REM *** supports bluetooth, to save ROM space...
 
-#ifndef __BT
+#ifdef SYMBIAN_EXCLUDE_BLUETOOTH
 REM Feature BLUETOOTH is not in this ROM (btpan.iby)
 
 #else
-// __BT
+// !SYMBIAN_EXCLUDE_BLUETOOTH
 
 file=ABI_DIR\BT_DIR\panagt.agt		System\Libs\panagt.agt
 file=ABI_DIR\BT_DIR\panhelper.dll		System\Libs\panhelper.dll
@@ -50,7 +50,7 @@
 #endif
 
 #endif
-// __BT
+// SYMBIAN_EXCLUDE_BLUETOOTH
 
 #endif
 // __BTPAN_IBY__
--- a/bluetoothmgmt/bluetoothclientlib/avlib/avdtpTypes.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/bluetoothclientlib/avlib/avdtpTypes.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -37,7 +37,7 @@
 // const TInt KMinMediaCodecLOSC = 2; // mediatype, codectype - see figure8-50 AVDTP
 // const TInt KMinContentProtectionLOSC = 2; // protectiontype
 
-static const TUint KAvdtpSockAddrLocalMask = static_cast<TUint>(1U<<31U);
+static const TUint KAvdtpSockAddrLocalMask = static_cast<TUint>(1<<31);
 
 /**
 Default constructor using 0 as the parameter for setPort()
--- a/bluetoothmgmt/bluetoothclientlib/btlib/btbaseband.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/bluetoothclientlib/btlib/btbaseband.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-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"
@@ -18,7 +18,6 @@
 #include <bt_sock.h>
 #include <bluetooth/hci/hcierrors.h>
 #include <bluetooth/aclsockaddr.h>
-#include <bluetooth/hci/aclpacketconsts.h>
 #include "btsocketpanic.h"
 
 //.................................
--- a/bluetoothmgmt/bluetoothclientlib/inc/bttypes.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/bluetoothclientlib/inc/bttypes.h	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-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"
@@ -745,20 +745,6 @@
 const TUint KLIAC=0x9e8b00;
 
 /**
-@publishedAll
-@released
-
-HCI Scan enable mask
-*/
-enum THCIScanEnable 
-	{
-	ENoScansEnabled = 0x00, /*!< No scans enabled */
-	EInquiryScanOnly = 0x01, /*!< Inquiry scan enabled */
-	EPageScanOnly = 0x02, /*!< Page scan enabled */
-	EInquiryAndPageScan = 0x03 /*!< Inquiry and page scan enabled */
-	};
-
-/**
 L2CAP channel modes
 @publishedAll
 @released
--- a/bluetoothmgmt/bluetoothclientlib/inc/pairing.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/bluetoothclientlib/inc/pairing.h	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-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"
@@ -24,7 +24,6 @@
 
 #include <e32std.h>
 #include <bt_sock.h>
-#include <bttypespartner.h>
 
 /**
 The UID indicating the dedicated bonding service request.
--- a/bluetoothmgmt/btmgr/BTManServer/btmanserverburmgr.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/btmgr/BTManServer/btmanserverburmgr.cpp	Wed Sep 01 12:38:54 2010 +0100
@@ -19,7 +19,6 @@
 #include <e32property.h>
 #include <f32file.h>
 #include <s32file.h>
-#include <bluetooth/hci/hciconsts.h>
 #include "btmanserverutil.h"
 #include "btmanserverburmgr.h"
 #include "BTManServer.h"
--- a/bluetoothmgmt/btrom/bluetooth.iby	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/btrom/bluetooth.iby	Wed Sep 01 12:38:54 2010 +0100
@@ -58,7 +58,7 @@
 file=ABI_DIR\BT_DIR\sdpagent.dll		System\Libs\sdpagent.dll
 
 REM Bluetooth AV user libraries
-file=ABI_DIR\BT_DIR\bluetoothAV.dll		System\Libs\bluetoothAV.dll
+file=ABI_DIR\BT_DIR\bluetoothav.dll		System\Libs\bluetoothAV.dll
 file=ABI_DIR\BT_DIR\gavdp.dll			System\Libs\gavdp.dll
 
 REM Generic Remote Control Framework
@@ -80,7 +80,7 @@
 REM *** Now for things which should only be included if the device
 REM *** supports bluetooth, to save ROM space...
 
-#ifndef __BT
+#ifdef SYMBIAN_EXCLUDE_BLUETOOTH
 REM Feature BLUETOOTH is not in this ROM (bluetooth.iby)
 #else
 
@@ -88,7 +88,7 @@
 data=ZPRIVATE\100069cc\backup_registration.xml	Private\100069cc\backup_registration.xml
 
 REM default is to run Esock_BT thread in DealerPlayer role
-data=ZPRIVATE\101F7988\esock_bt.cmi private\101F7988\esock_bt.cmi
+data=ZPRIVATE\101f7988\esock_bt.cmi private\101F7988\esock_bt.cmi
 
 file=ABI_DIR\BT_DIR\btcomm.csy			System\Libs\btcomm.csy
 
@@ -102,8 +102,8 @@
 REM Bluetooth using HCI API Version 2
 file=ABI_DIR\BT_DIR\bt_v2.prt							System\Libs\bt_v2.prt
 REM Stack configuration files
-data=ZPRIVATE\101f7989\ESock\bt.bt_v2.esk				Private\101f7989\ESock\bt.bt_v2.esk
-data=ZPRIVATE\101F7989\Bluetooth\bluetooth_stack.ini	Private\101F7989\Bluetooth\bluetooth_stack.ini
+data=ZPRIVATE\101f7989\esock\bt.bt_v2.esk				Private\101f7989\ESock\bt.bt_v2.esk
+data=ZPRIVATE\101f7989\bluetooth\bluetooth_stack.ini	Private\101F7989\Bluetooth\bluetooth_stack.ini
 
 REM HCI Shared binary
 file=ABI_DIR\BT_DIR\hcishared.dll			System\Libs\hcishared.dll
@@ -133,7 +133,7 @@
 
 #endif // BLUETOOTH_NO_AV
 
-#endif // __BT
+#endif // SYMBIAN_EXCLUDE_BLUETOOTH
 
 #endif
 
--- a/bluetoothmgmt/btrom/hci.iby	Tue Aug 31 16:20:16 2010 +0300
+++ b/bluetoothmgmt/btrom/hci.iby	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// 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"
@@ -32,12 +32,8 @@
 REM Symbian HCIv2 Framework DLLs - must be included
 #include <hci_framework.iby>
 
-REM hci_implementation.iby is provided elsewhere (platform-specific).
-REM Use reference HCI implementation for H4, H6 and Naviengine.
-#if ( defined __MOMAP24XX_H4HRP__ || defined __MOMAP34XX_SDP__ || defined __NE1_TB__ )
-#include <hci_implementation_reference.iby>
-#else
+REM Reference HCIv2 DLLs - this will be branched/overwritten by the licensee to include the relevant files
 #include <hci_implementation.iby>
-#endif
 
 #endif // __HCI_IBY__
+
--- a/bthci/bthci2/corehci/interface/hcitypes.h	Tue Aug 31 16:20:16 2010 +0300
+++ b/bthci/bthci2/corehci/interface/hcitypes.h	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-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"
@@ -181,6 +181,17 @@
 	EPointToPointAndBroadcastEncryption = 0x02, /*!< Point to point and broadcast encryption enabled */
 	};
 
+enum THCIScanEnable 
+/**
+HCI Scan enable mask
+*/
+	{
+	ENoScansEnabled = 0x00, /*!< No HCI scans enabled */
+	EInquiryScanOnly = 0x01, /*!< HCI inquiry scan enabled */
+	EPageScanOnly = 0x02, /*!< HCI page scan enabled */
+	EInquiryAndPageScan = 0x03 /*!< HCI inquiry and page scan enabled */
+	};
+
 enum THCIInquiryMode 
 /**
 HCI Inquiry mode flag
--- a/bthci/bthci2/group/hci_framework.iby	Tue Aug 31 16:20:16 2010 +0300
+++ b/bthci/bthci2/group/hci_framework.iby	Wed Sep 01 12:38:54 2010 +0100
@@ -32,6 +32,6 @@
 file=ABI_DIR\HCIF_DIR\hcicmdq.dll				System\Libs\hcicmdq.dll
 
 REM Command Queue configuration file
-data=ZPRIVATE\101F7989\Bluetooth\cmdq.ini	Private\101F7989\Bluetooth\cmdq.ini
+data=ZPRIVATE\101f7989\bluetooth\cmdq.ini	Private\101F7989\Bluetooth\cmdq.ini
 
 #endif //  HCI_FRAMEWORK_IBY
--- a/bthci/hci2implementations/group/bld.inf	Tue Aug 31 16:20:16 2010 +0300
+++ b/bthci/hci2implementations/group/bld.inf	Wed Sep 01 12:38:54 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-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"
@@ -27,4 +27,4 @@
 #include "../CommandsEvents/symbian/group/bld.inf"
 
 PRJ_EXPORTS
-hci_implementation_reference.iby  /epoc32/rom/include/hci_implementation_reference.iby
+hci_implementation.iby  /epoc32/rom/include/hci_implementation.iby
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/group/hci_implementation.iby	Wed Sep 01 12:38:54 2010 +0100
@@ -0,0 +1,45 @@
+// Copyright (c) 2006-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:
+//
+
+#ifndef  HCI_IMPLMENTATION_IBY
+#define  HCI_IMPLMENTATION_IBY
+
+// If __HCI_DEBUG__ is defined pull in debug versions of the
+// HCI DLLs and Plugins regardless of the ROM type
+#ifdef __HCI_DEBUG__
+define HCI_DIR UDEB
+#define HCI_PLUGIN ECOM_PLUGIN_UDEB
+#else
+define HCI_DIR BUILD_DIR
+#define HCI_PLUGIN ECOM_PLUGIN
+#endif
+
+#include <corehci_symbian.iby>
+#include <commandsevents_symbian.iby>
+#include <hci_qdp_symbian.iby>
+
+#ifdef HCI_TI
+
+#include <hctl_ti.iby>
+#include <hci_initialisor_ti.iby>
+
+#else // CSR + Default
+
+#include <hctl_bcsp.iby>
+#include <initialisor_symbian.iby>
+
+#endif
+
+#endif //  HCI_IMPLMENTATION_IBY
--- a/bthci/hci2implementations/group/hci_implementation_reference.iby	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-// 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"
-// which accompanies 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  HCI_IMPLEMENTATION_REFERENCE_IBY
-#define  HCI_IMPLEMENTATION_REFERENCE_IBY
-
-// If __HCI_DEBUG__ is defined pull in debug versions of the
-// HCI DLLs and Plugins regardless of the ROM type
-#ifdef __HCI_DEBUG__
-define HCI_DIR UDEB
-#define HCI_PLUGIN ECOM_PLUGIN_UDEB
-#else
-define HCI_DIR BUILD_DIR
-#define HCI_PLUGIN ECOM_PLUGIN
-#endif
-
-#include <corehci_symbian.iby>
-#include <commandsevents_symbian.iby>
-#include <hci_qdp_symbian.iby>
-
-#ifdef HCI_TI
-
-#include <hctl_ti.iby>
-#include <hci_initialisor_ti.iby>
-
-#else // CSR + Default
-
-#include <hctl_bcsp.iby>
-#include <initialisor_symbian.iby>
-
-#endif
-
-#endif //  HCI_IMPLEMENTATION_REFERENCE_IBY
--- a/btsimulator/btaudioadaptation_stub/EABI/btaudioadaptationU.DEF	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-EXPORTS
-	_ZN23CBTAudioStreamInputBase4NewLER22MBTAudioStreamObserverR21MBTAudioErrorObserver @ 1 NONAME
-	_ZN29CBTAudioStreamInputAdaptation10DisconnectEv @ 2 NONAME
-	_ZN29CBTAudioStreamInputAdaptation13BufferEmptiedERK6TDesC8 @ 3 NONAME
-	_ZN29CBTAudioStreamInputAdaptation16EncoderInterfaceE4TUid @ 4 NONAME
-	_ZN29CBTAudioStreamInputAdaptation4StopEv @ 5 NONAME
-	_ZN29CBTAudioStreamInputAdaptation5StartEv @ 6 NONAME
-	_ZN29CBTAudioStreamInputAdaptation7ConnectEv @ 7 NONAME
-	_ZN29CBTAudioStreamInputAdaptation9SetFormatE7TFourCC @ 8 NONAME
-
--- a/btsimulator/btaudioadaptation_stub/bwins/btaudioadaptationU.DEF	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-EXPORTS
-	?NewL@CBTAudioStreamInputBase@@SAPAV1@AAVMBTAudioStreamObserver@@AAVMBTAudioErrorObserver@@@Z @ 1 NONAME ; class CBTAudioStreamInputBase * CBTAudioStreamInputBase::NewL(class MBTAudioStreamObserver &, class MBTAudioErrorObserver &)
-	?BufferEmptied@CBTAudioStreamInputAdaptation@@UAEXABVTDesC8@@@Z @ 2 NONAME ; void CBTAudioStreamInputAdaptation::BufferEmptied(class TDesC8 const &)
-	?Connect@CBTAudioStreamInputAdaptation@@UAEHXZ @ 3 NONAME ; int CBTAudioStreamInputAdaptation::Connect(void)
-	?Disconnect@CBTAudioStreamInputAdaptation@@UAEXXZ @ 4 NONAME ; void CBTAudioStreamInputAdaptation::Disconnect(void)
-	?EncoderInterface@CBTAudioStreamInputAdaptation@@UAEPAXVTUid@@@Z @ 5 NONAME ; void * CBTAudioStreamInputAdaptation::EncoderInterface(class TUid)
-	?SetFormat@CBTAudioStreamInputAdaptation@@UAEHVTFourCC@@@Z @ 6 NONAME ; int CBTAudioStreamInputAdaptation::SetFormat(class TFourCC)
-	?Start@CBTAudioStreamInputAdaptation@@UAEHXZ @ 7 NONAME ; int CBTAudioStreamInputAdaptation::Start(void)
-	?Stop@CBTAudioStreamInputAdaptation@@UAEXXZ @ 8 NONAME ; void CBTAudioStreamInputAdaptation::Stop(void)
-
--- a/btsimulator/btaudioadaptation_stub/group/bld.inf	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
-* Copyright (c) 2005-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 btaudioadaptation_stub
-*
-*/
-
-
-PRJ_PLATFORMS
-DEFAULT
-
-#if defined __BT_STEREO_AUDIO
-
-PRJ_MMPFILES
-../group/btaudiostreaminputadaptation.mmp	
-
-#endif // __BT_STEREO_AUDIO 
--- a/btsimulator/btaudioadaptation_stub/group/btaudiostreaminputadaptation.mmp	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
-* Copyright (c) 2005-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:  Project definition file for project btaudioadaptation_stub 
-*
-*/
-
-
-#include <platform_paths.hrh>
-
-#if defined(WINS) || defined(WINSCW)
-TARGET        btaudioadaptation.dll
-#else 
-TARGET        btaudioadaptation_stub.dll
-#endif
-
-CAPABILITY 	CAP_GENERAL_DLL 
-TARGETTYPE	DLL
-UID 	0x1000008d   0x10208977
-
-VENDORID 	VID_DEFAULT
-
-SOURCEPATH	../src
-SOURCE		btaudiostreaminputadaptation.cpp
-
-USERINCLUDE	../inc
-
-OS_LAYER_SYSTEMINCLUDE
-
-LIBRARY		euser.lib	// user library 
-
-DEBUGLIBRARY         flogger.lib	// file logging services 
-
-EXPORTLIBRARY 	btaudioadaptation.lib 
-LINKAS 					btaudioadaptation.dll 
--- a/btsimulator/btaudioadaptation_stub/inc/btaudioadaptationdebug.h	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,150 +0,0 @@
-/*
-* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  Debug definitions for BT Audio Adaptation 
-*
-*/
-
-
-#ifndef BT_AUDIO_ADAPTATION_DEBUG_H 
-#define BT_AUDIO_ADAPTATION_DEBUG_H 
-
-#include <f32file.h>
-
-
-#ifdef _DEBUG
-
-// Print options
-
-#define KPRINTERROR		0x00000001 // Print error
-#define KPRINTFTRACE	0x00000002 // Print function trace
-#define KPRINTSTATE		0x00000004 // Print state machine infos
-
-const TInt KDebugMask = KPRINTERROR	| KPRINTFTRACE | KPRINTSTATE ; 
-
-
-// Un-comment/comment this definition to enable/disable memory tracing
-//#define MEMTRACE
-
-#ifdef __WINS__
-
-// File logging for WINS
-#define __FLOGGING__
-
-#else
-
-// Logging with RDebug for target HW
-#define __CLOGGING__
-
-#endif //__WINS__
-
-#endif // _DEBUG
-
-
-// ==================================================================
-// File logging
-// ==================================================================
-//
-#if  defined(__FLOGGING__)
-
-#include <e32std.h>
-
-_LIT(KLogFile,"BTAudioAdaptationLog.txt");
-_LIT(KLogDirFullName,"c:\\logs\\bt\\");
-_LIT(KLogDir,"BT");
-
-#include <f32file.h>
-#include <flogger.h>
-
-#define FLOG(a) { FPrint(a); }
-  
-#define FTRACE(a) { a; }
-
-#define BT_AUDIO_ADAPTATION_TRACE_OPT(a,p) {if((KDebugMask)&(a))p;}
-
-
-
-
-inline void FPrint(const TRefByValue<const TDesC> aFmt, ...)
-    {
-    VA_LIST list;
-    VA_START(list,aFmt);
-    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list);
-#ifdef MEMTRACE
-    TInt size;
-    User::Heap().AllocSize(size);   
-    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, _L("[BTAudioAdaptation]\t MEM\tAllocated from heap: %d B. Total heap size: %d B"), size, User::Heap().Size());
-#endif
-    }
-
-
-inline void FHex(const TUint8* aPtr, TInt aLen)
-    {
-    RFileLogger::HexDump(KLogDir, KLogFile, EFileLoggingModeAppend, 0, 0, aPtr, aLen);
-    }
-
-
-inline void FHex(const TDesC8& aDes)
-    {
-    FHex(aDes.Ptr(), aDes.Length());
-    }
-
-
-// ==================================================================
-// RDebug logging
-// ==================================================================
-//
-#elif defined(__CLOGGING__)
-
-#include <e32svr.h>
-
-#define FLOG(a) { RDebug::Print(a);  }
-
-#define FHex(a)
-
-#define FTRACE(a) { a; }
-
-#define BT_AUDIO_ADAPTATION_TRACE_OPT(a,p) {if((KDebugMask)&(a))p;}
-
-
-inline void FPrint(const TRefByValue<const TDesC> aFmt, ...)
-    {
-    VA_LIST list;
-    VA_START(list,aFmt);
-    TInt tmpInt = VA_ARG(list, TInt);
-    TInt tmpInt2 = VA_ARG(list, TInt);
-    TInt tmpInt3 = VA_ARG(list, TInt);
-    VA_END(list);
-    RDebug::Print(aFmt, tmpInt, tmpInt2, tmpInt3);
-    }
-
-
-// ==================================================================
-// No loggings --> Reduced binary size
-// ==================================================================
-//
-#else // if no __FLOGGING__ and no __CLOGGING__
-
-#define FLOG(a)
-
-#define FTRACE(a)
-
-#define FHex(a)
-
-#define BT_AUDIO_ADAPTATION_TRACE_OPT(a,p)
-
-#endif // ...loggings 
-
-#endif // BTAUDIOADAPTATION_DEBUG_H
-
-// End of File
--- a/btsimulator/btaudioadaptation_stub/inc/btaudiostreaminputadaptation.h	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-/*
-* Copyright (c) 2005-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:  This header specifies the implementation of BT Audio Adaptation API. 
-*
-*/
-
-
-#ifndef __BTAUDIOSTREAMINPUTADAPTATION_H__
-#define __BTAUDIOSTREAMINPUTADAPTATION_H__
-
-#include <e32base.h>
-#include <e32std.h>
-#include "btaudiostreaminputbase.h" 
-
-/**
- *  This class implements the interface specified by CBTAudioStreamInputBase. 
- *
- *  This class contains the stub implementation of the CAudioStreamInputAdaptation, 
- *  that inherits from CBTAudioStreamInputBase. 
- *  
- *  To the user it seems as if he's operating with the base class, because he calls, 
- *  but in practice the class he uses is an instance of this class. 
- *
- *  @lib btaudioadaptation.lib
- *  @since S60 v3.1 
- */
-NONSHARABLE_CLASS(CBTAudioStreamInputAdaptation) : public CBTAudioStreamInputBase 
-    {
-    public:  
-    static CBTAudioStreamInputAdaptation* NewL( MBTAudioStreamObserver& aStreamObserver, MBTAudioErrorObserver& aErrorObserver );
-    virtual ~CBTAudioStreamInputAdaptation();
-
-    public: 
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is called when the client has processed the buffer it got 
-     * from the Receive method. 
-     * 
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param aBuffer refers to the buffer that was received earlier in the Receive method. 
-     * @return  void
-     */
-        IMPORT_C void BufferEmptied( const TDesC8& aBuffer );
-
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is for connecting to the audio subsystem. 
-     *
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param void. 
-     * @return a Symbian OS wide error code. 
-     */
-        IMPORT_C TInt Connect();
-
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is for disconnecting from the audio subsystem. 
-     *
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param void. 
-     * @return void
-     */
-        IMPORT_C void Disconnect();
-
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is for passing the custom interfaces that are 
-     * needed sometimes for configuring the hardware encoder. 
-     *
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param aInterfaceId specifies the id of custom interface that the client 
-     *        wants to get. 
-     * @return  A pointer to the requested interface. Client must cast it into a correct class. 
-     */
-        IMPORT_C TAny* EncoderInterface(TUid aInterfaceId);
-
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is for choosing the encoder for the audio data. 
-     *
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param aDesiredFourCC specifies the encoder that the client wants to use. 
-     * @return a Symbian OS wide error code. 
-     */
-        IMPORT_C TInt SetFormat(TFourCC aDesiredFourCC);
-
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is for starting the recording from the audio subsystem. 
-     *
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param void. 
-     * @return a Symbian OS wide error code. 
-     */
-        IMPORT_C TInt Start();
-
-    /**
-     * From CBTAudioStreamInputBase.
-     * This method is for stopping the recording from the audio subsystem. 
-     *
-     * See BT Audio Adaptation API and BT Audio Adaptation Design specifications 
-     * for detailed explanation. 
-     *
-     * @since S60 v3.1
-     * @param void. 
-     * @return a Symbian OS wide error code. 
-     */
-        IMPORT_C void Stop();
-
-    private:
-        CBTAudioStreamInputAdaptation(MBTAudioStreamObserver& aStreamObserver, MBTAudioErrorObserver& aErrorObserver);
-        void ConstructL();
-        void RunL(); 
-        void DoCancel();
-   }; 
-
-#endif 
--- a/btsimulator/btaudioadaptation_stub/layers.sysdef.xml	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
-  <!ENTITY layer_real_source_path "sf/adaptation/stubs/btaudioadaptation_stub" >
-]>
-
-<SystemDefinition name="btaudioadaptation_stub" schema="1.4.0">
-  <systemModel>
-    <layer name="stubs_layer">
-      <module name="btaudioadaptation_stub">
-        <unit unitID="lcdo.btaudioadaptation_stub" mrp="" bldFile="&layer_real_source_path;/group" name="btaudioadaptation_stub" filter="oem_build"/>
-      </module>
-    </layer>
-  </systemModel>
-</SystemDefinition>
-
--- a/btsimulator/btaudioadaptation_stub/rom/btaudioadaptation.iby	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef __BTAUDIOADAPTATION_IBY__
-#define __BTAUDIOADAPTATION_IBY__
-
-file=ABI_DIR\BUILD_DIR\btaudioadaptation_stub.dll		SHARED_LIB_DIR\btaudioadaptation.dll
-
-#endif
--- a/btsimulator/btaudioadaptation_stub/src/btaudiostreaminputadaptation.cpp	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,150 +0,0 @@
-/*
-* Copyright (c) 2005-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:  Contains stub implementation of CBTAudioStreamInputAdaptation class, 
-*                which implements BT Audio Adaptation API. 
-*
-*/
-
-
-#include <e32std.h> 
-
-#include "btaudiostreaminputadaptation.h"
-#include "btaudioadaptationdebug.h"
-
-CBTAudioStreamInputAdaptation::CBTAudioStreamInputAdaptation(MBTAudioStreamObserver& /*aStreamObserver*/, MBTAudioErrorObserver& /*aErrorObserver*/) 
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::CBTAudioStreamInputAdaptation() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::CBTAudioStreamInputAdaptation() <-")));
-    }
-
-void CBTAudioStreamInputAdaptation::ConstructL()
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::ConstructL() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::ConstructL() <-")));
-    }
-
-// ---------------------------------------------------------------------------
-// Static factory method for the abstract base class. 
-// This just calls the factory method of the concrete implementation class. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C CBTAudioStreamInputBase* CBTAudioStreamInputBase::NewL(MBTAudioStreamObserver& aStreamObserver, MBTAudioErrorObserver& aErrorObserver)
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioInput::NewL() ->")));
-    CBTAudioStreamInputBase* audioInput = (CBTAudioStreamInputAdaptation::NewL(aStreamObserver, aErrorObserver)); 
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioInput::NewL() <-")));
-    return audioInput; 
-    }
-
-// ---------------------------------------------------------------------------
-// Static factory method. 
-// ---------------------------------------------------------------------------
-//
-CBTAudioStreamInputAdaptation* CBTAudioStreamInputAdaptation::NewL(MBTAudioStreamObserver& aStreamObserver, MBTAudioErrorObserver& aErrorObserver)
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::NewL() ->")));
-    CBTAudioStreamInputAdaptation* self = new (ELeave) CBTAudioStreamInputAdaptation(aStreamObserver, aErrorObserver);
-    CleanupStack::PushL(self); 
-    self->ConstructL();
-    CleanupStack::Pop(self);
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::NewL() <-")));
-    return self;
-    }
-
-CBTAudioStreamInputAdaptation::~CBTAudioStreamInputAdaptation()
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::~CBTAudioStreamInputAdaptation() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::~CBTAudioStreamInputAdaptation() <-")));
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Returns KErrNotSupported always - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TInt CBTAudioStreamInputAdaptation::Start()
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Start() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Start() <-")));
-    return KErrNotSupported;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Returns a NULL pointer always - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TAny* CBTAudioStreamInputAdaptation::EncoderInterface(TUid /*aInterfaceId*/)
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::EncoderInterface() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::EncoderInterface() <-")));
-    return (TAny *) 0;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Doesn't do anything - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CBTAudioStreamInputAdaptation::BufferEmptied( const TDesC8& /*aBuffer*/ )
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::BufferEmptied() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::BufferEmptied() <-")));
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Doesn't do anything - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CBTAudioStreamInputAdaptation::Stop()
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Stop() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Stop() <-")));
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Returns KErrNotSupported always - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TInt CBTAudioStreamInputAdaptation::SetFormat(TFourCC /*aDesiredFourCC*/)
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::SetFormat() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::SetFormat() <-")));
-    return KErrNotSupported; 
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Returns KErrNotSupported always - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TInt CBTAudioStreamInputAdaptation::Connect() 
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Connect() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Connect() <-")));
-    return KErrNotSupported; 
-    }
-
-// ---------------------------------------------------------------------------
-// From class CBTAudioStreamInputBase.
-// Doesn't do anything - this is the stub implementation. 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CBTAudioStreamInputAdaptation::Disconnect()
-    {
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Disconnect() ->")));
-    BT_AUDIO_ADAPTATION_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioAdaptation]\t CBTAudioStreamInputAdaptation::Disconnect() <-")));
-    }
--- a/btsimulator/btaudioadaptation_stub/sysdef_1_4_0.dtd	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
- <!ELEMENT SystemDefinition (systemModel?, build?)>
- <!ATTLIST SystemDefinition
-  name CDATA #REQUIRED
-  schema CDATA #REQUIRED>
- <!ELEMENT systemModel (layer+)>
- <!ELEMENT layer (logicalset* | module*)*>
- <!ATTLIST layer
-  name CDATA #REQUIRED
-  levels CDATA #IMPLIED
-  span CDATA #IMPLIED>
- <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
- <!ATTLIST logicalset name CDATA #REQUIRED>
- <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
- <!ATTLIST logicalsubset name CDATA #REQUIRED>
- <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
- <!ATTLIST module
-  name CDATA #REQUIRED
-  level CDATA #IMPLIED>
- <!ELEMENT component (unit* | package* | prebuilt*)*>
- <!ATTLIST component name CDATA #REQUIRED>
- <!ELEMENT unit EMPTY>
- <!ATTLIST unit
-  unitID ID #REQUIRED
-  name CDATA #REQUIRED
-  mrp CDATA #REQUIRED
-  filter CDATA #IMPLIED
-  bldFile CDATA #REQUIRED
-  priority CDATA #IMPLIED
-  contract CDATA #IMPLIED>
- <!ELEMENT package EMPTY>
- <!ATTLIST package
-  name CDATA #REQUIRED
-  mrp CDATA #REQUIRED
-  filter CDATA #IMPLIED
-  contract CDATA #IMPLIED>
- <!ELEMENT prebuilt EMPTY>
- <!ATTLIST prebuilt
-  name CDATA #REQUIRED
-  version CDATA #REQUIRED
-  late (Y|N) #IMPLIED
-  filter CDATA #IMPLIED
-  contract CDATA #IMPLIED>
- <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
- <!ELEMENT unitList (unitRef+)>
- <!ATTLIST unitList
-  name ID #REQUIRED
-  description CDATA #REQUIRED>
- <!ELEMENT unitRef EMPTY>
- <!ATTLIST unitRef unit IDREF #REQUIRED>
- <!ELEMENT targetList EMPTY>
- <!ATTLIST targetList
-  name ID #REQUIRED
-  description CDATA #REQUIRED
-  target IDREFS #REQUIRED>
- <!ELEMENT target EMPTY>
- <!ATTLIST target
-  name ID #REQUIRED
-  abldTarget CDATA #REQUIRED
-  description CDATA #REQUIRED>
- <!ELEMENT option EMPTY>
- <!ATTLIST option
-  name ID #REQUIRED
-  abldOption CDATA #REQUIRED
-  description CDATA #REQUIRED
-  enable (Y | N | y | n) #REQUIRED>
- <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
- <!ATTLIST configuration
-  name ID #REQUIRED
-  description CDATA #REQUIRED
-  filter CDATA #REQUIRED>
- <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
- <!ELEMENT unitListRef EMPTY>
- <!ATTLIST unitListRef unitList IDREF #REQUIRED>
- <!ELEMENT layerRef EMPTY>
- <!ATTLIST layerRef layerName CDATA #REQUIRED>
- <!ELEMENT buildLayer EMPTY>
- <!ATTLIST buildLayer
-  command CDATA #REQUIRED
-  targetList IDREFS #IMPLIED
-  unitParallel (Y | N | y | n) #REQUIRED
-  targetParallel (Y | N | y | n) #IMPLIED>
- <!ELEMENT specialInstructions EMPTY>
- <!ATTLIST specialInstructions
-  name CDATA #REQUIRED
-  cwd CDATA #REQUIRED
-  command CDATA #REQUIRED>  
--- a/package_definition.xml	Tue Aug 31 16:20:16 2010 +0300
+++ b/package_definition.xml	Wed Sep 01 12:38:54 2010 +0100
@@ -1,104 +1,87 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <SystemDefinition schema="3.0.0">
- <package id="bt" name="Bluetooth" levels="adaptation hw-if plugin framework server app-if">
-  <collection id="bt_plat" name="Bluetooth Platform Interfaces" level="app-if">
-   <component id="bluetooth_audio_adaptation_api" name="Bluetooth Audio Adaptation API" class="api" filter="s60">
-    <meta rel="Api" href="bt_plat/bluetooth_audio_adaptation_api/bluetooth_audio_adaptation_api.metaxml"/>
-    <unit bldFile="bt_plat/bluetooth_audio_adaptation_api/group"/>
-   </component>
-   <component id="bluetooth_power_management_api" name="Bluetooth Power Management API" class="api" filter="s60">
-    <meta rel="Api" href="bt_plat/bluetooth_power_management_api/bluetooth_power_management_api.metaxml"/>
-    <unit bldFile="bt_plat/bluetooth_power_management_api/group"/>
-   </component>
-   <component id="at_command_handler_plugin_api" name="AT Command Handler Plugin API" class="api" filter="s60">
-    <meta rel="Api" href="bt_plat/at_command_handler_plugin_api/at_command_handler_plugin_api.metaxml"/>
-    <unit bldFile="bt_plat/at_command_handler_plugin_api/group"/>
-   </component>
-  </collection>
-  <collection id="bluetooth" name="Bluetooth Core" level="framework">
-   <component id="btstack" name="Bluetooth Stack" introduced="6.0" purpose="optional">
-    <unit bldFile="bluetooth/btstack" mrp="bluetooth/btstack/bluetooth_stack.mrp"/>
-   </component>
-   <component id="btcomm" name="Bluetooth CSY" introduced="6.0" purpose="optional" class="plugin">
-    <unit bldFile="bluetooth/btcomm" mrp="bluetooth/btcomm/bluetooth_btcomm.mrp"/>
-   </component>
-   <component id="btsdp" name="Bluetooth SDP" introduced="6.1" purpose="optional">
-    <unit bldFile="bluetooth/btsdp" mrp="bluetooth/btsdp/bluetooth_sdp.mrp"/>
-   </component>
-   <component id="btextnotifiers" name="Bluetooth Notifiers Support" introduced="6.1" purpose="optional">
-    <unit bldFile="bluetooth/btextnotifiers" mrp="bluetooth/btextnotifiers/bluetooth_btextnotifiers.mrp"/>
-   </component>
-   <component id="gavdp" name="Bluetooth GAVDP" introduced="8.1" purpose="optional">
-    <unit bldFile="bluetooth/gavdp/group" mrp="bluetooth/gavdp/group/bluetooth_gavdp.mrp"/>
-   </component>
-   <component id="btexample" name="Bluetooth Examples and Tests" introduced="6.1" purpose="development" filter="test">
-    <unit mrp="bluetooth/btexample/test/bluetooth_tests_examples.mrp" bldFile="bluetooth/btexample/test/group"/>
-   </component>
-   <component id="btlogger" name="Bluetooth Logging Engine" introduced="9.2" purpose="optional">
-    <unit bldFile="bluetooth/btlogger/group" mrp="bluetooth/btlogger/group/bluetooth_logger.mrp"/>
-   </component>
-   <component id="btdocs" name="Bluetooth Documentation" purpose="development" class="doc">
-    <unit mrp="bluetooth/btdocs/bluetooth_documentation.mrp"/>
-   </component>
-  </collection>
-  <collection id="bluetoothmgmt" name="Bluetooth Management" level="plugin">
-   <component id="btmgr" name="Bluetooth Manager" introduced="6.0" purpose="optional">
-    <unit bldFile="bluetoothmgmt/btmgr" mrp="bluetoothmgmt/btmgr/bluetooth_manager.mrp"/>
-   </component>
-   <component id="btconfig" name="Bluetooth Config" purpose="optional" class="config">
-    <unit bldFile="bluetoothmgmt/btconfig" mrp="bluetoothmgmt/btconfig/bluetooth_config.mrp"/>
-   </component>
-   <component id="btrom" name="Bluetooth ROM" introduced="9.1" purpose="optional">
-    <unit bldFile="bluetoothmgmt/btrom" mrp="bluetoothmgmt/btrom/bluetooth_rom.mrp"/>
-   </component>
-   <component id="bluetoothclientlib" name="Bluetooth Client Library" introduced="6.0" purpose="optional">
-    <unit bldFile="bluetoothmgmt/bluetoothclientlib" mrp="bluetoothmgmt/bluetoothclientlib/bluetooth_user.mrp"/>
-   </component>
-   <component id="btcommon" name="Bluetooth Build Utilities" purpose="optional" filter="test">
-    <unit mrp="bluetoothmgmt/btcommon/bluetooth_common.mrp" bldFile="bluetoothmgmt/btcommon"/>
-   </component>
-  </collection>
-  <collection id="bluetoothcommsprofiles" name="Bluetooth Comms Profiles" level="app-if">
-   <component id="btpan" name="Bluetooth PAN Profile" introduced="8.1" purpose="optional" class="plugin">
-    <unit bldFile="bluetoothcommsprofiles/btpan/group" mrp="bluetoothcommsprofiles/btpan/group/bluetooth_pan.mrp"/>
-   </component>
-  </collection>
-  <collection id="bthci" name="Host Controller Interface" level="server">
-   <component id="bthci2" name="Bluetooth HCI Framework 2" introduced="9.2" purpose="optional">
-    <unit bldFile="bthci/bthci2/group" mrp="bthci/bthci2/group/bluetooth_hci_v2_framework.mrp"/>
-   </component>
-   <component id="hciextensioninterface" name="Bluetooth HCI Extension Interface" introduced="6.1" purpose="optional">
-    <unit bldFile="bthci/hciextensioninterface" mrp="bthci/hciextensioninterface/bluetooth_hciproxy.mrp"/>
-   </component>
-   <component id="hci2implementations" name="Bluetooth HCI 2 Reference Implementations" introduced="9.2" purpose="optional" class="plugin">
-    <unit bldFile="bthci/hci2implementations/group" mrp="bthci/hci2implementations/group/bluetooth_hci_v2_implementations.mrp"/>
-   </component>
-  </collection>
-  <collection id="irda" name="IrDA" level="plugin">
-   <component id="irdastack" name="IrDA Stack" purpose="optional">
-    <unit bldFile="irda/irdastack/group" mrp="irda/irdastack/group/infra-red_irda.mrp"/>
-   </component>
-  </collection>
-  <collection id="bluetoothapitest" name="Bluetooth API Tests" level="app-if">
-   <component id="bluetoothsvs" name="Bluetooth Verification Suite" introduced="^3" purpose="development" filter="test">
-    <unit mrp="bluetoothapitest/bluetoothsvs/group/bluetoothsvs.mrp" bldFile="bluetoothapitest/bluetoothsvs/group"/>
-   </component>
-  </collection>
-  <collection id="atext" name="AT Extensions" level="server">
-   <!-- collection is really a component. Need to move down a directory -->
-   <component id="atext_build" name="AT Extension Build" introduced="^3" purpose="optional" filter="s60">
-    <unit bldFile="atext/group"/>
-   </component>
-  </collection>
-  <collection id="bt_info" name="Bluetooth Info" level="app-if">
-   <component id="bt_metadata" name="Bluetooth Metadata" class="config" introduced="^3" purpose="development" target="desktop">
-    <unit mrp="bt_info/bt_metadata/bt_metadata.mrp"/>
-   </component>
-  </collection>
-  <collection id="btsimulator" name="Bluetooth Simulator" level="internal-utils">
-   <component id="btaudioadaptation_stub" name="Bluetooth Audio Adaption Stub" purpose="optional" filter="oem_build">
-    <unit bldFile="btsimulator/btaudioadaptation_stub/group"/>
-   </component>
-  </collection>
- </package>
+  <package id="bt" name="Bluetooth" levels="adaptation hw-if plugin framework server app-if">
+    <collection id="bluetooth" name="Bluetooth Core" level="framework">
+      <component id="btstack" name="Bluetooth Stack" introduced="6.0" purpose="optional">
+        <unit bldFile="bluetooth/btstack" mrp="bluetooth/btstack/bluetooth_stack.mrp"/>
+      </component>
+      <component id="btcomm" name="Bluetooth CSY" introduced="6.0" purpose="optional" class="plugin">
+        <unit bldFile="bluetooth/btcomm" mrp="bluetooth/btcomm/bluetooth_btcomm.mrp"/>
+      </component>
+      <component id="btsdp" name="Bluetooth SDP" introduced="6.1" purpose="optional">
+        <unit bldFile="bluetooth/btsdp" mrp="bluetooth/btsdp/bluetooth_sdp.mrp"/>
+      </component>
+      <component id="btextnotifiers" name="Bluetooth Notifiers Support" introduced="6.1" purpose="optional">
+        <unit bldFile="bluetooth/btextnotifiers" mrp="bluetooth/btextnotifiers/bluetooth_btextnotifiers.mrp"/>
+      </component>
+      <component id="gavdp" name="Bluetooth GAVDP" introduced="8.1" purpose="optional">
+        <unit bldFile="bluetooth/gavdp/group" mrp="bluetooth/gavdp/group/bluetooth_gavdp.mrp"/>
+      </component>
+      <component id="btexample" name="Bluetooth Examples and Tests" introduced="6.1" purpose="development" filter="test">
+        <unit mrp="bluetooth/btexample/test/bluetooth_tests_examples.mrp" bldFile="bluetooth/btexample/test/group"/>
+      </component>
+      <component id="btlogger" name="Bluetooth Logging Engine" introduced="9.2" purpose="optional">
+        <unit bldFile="bluetooth/btlogger/group" mrp="bluetooth/btlogger/group/bluetooth_logger.mrp"/>
+      </component>
+      <component id="btdocs" name="Bluetooth Documentation" purpose="development" class="doc">
+        <unit mrp="bluetooth/btdocs/bluetooth_documentation.mrp"/>
+      </component>
+    </collection>
+    <collection id="bluetoothmgmt" name="Bluetooth Management" level="plugin">
+      <component id="btmgr" name="Bluetooth Manager" introduced="6.0" purpose="optional">
+        <unit bldFile="bluetoothmgmt/btmgr" mrp="bluetoothmgmt/btmgr/bluetooth_manager.mrp"/>
+      </component>
+      <component id="btconfig" name="Bluetooth Config" purpose="optional" class="config">
+        <unit bldFile="bluetoothmgmt/btconfig" mrp="bluetoothmgmt/btconfig/bluetooth_config.mrp"/>
+      </component>
+      <component id="btrom" name="Bluetooth ROM" introduced="9.1" purpose="optional">
+        <unit bldFile="bluetoothmgmt/btrom" mrp="bluetoothmgmt/btrom/bluetooth_rom.mrp"/>
+      </component>
+      <component id="bluetoothclientlib" name="Bluetooth Client Library" introduced="6.0" purpose="optional">
+        <unit bldFile="bluetoothmgmt/bluetoothclientlib" mrp="bluetoothmgmt/bluetoothclientlib/bluetooth_user.mrp"/>
+      </component>
+      <component id="btcommon" name="Bluetooth Build Utilities" purpose="optional" filter="test">
+        <unit mrp="bluetoothmgmt/btcommon/bluetooth_common.mrp" bldFile="bluetoothmgmt/btcommon"/>
+      </component>
+    </collection>
+    <collection id="bluetoothcommsprofiles" name="Bluetooth Comms Profiles" level="app-if">
+      <component id="btpan" name="Bluetooth PAN Profile" introduced="8.1" purpose="optional" class="plugin">
+        <unit bldFile="bluetoothcommsprofiles/btpan/group" mrp="bluetoothcommsprofiles/btpan/group/bluetooth_pan.mrp"/>
+      </component>
+    </collection>
+    <collection id="bthci" name="Host Controller Interface" level="server">
+      <component id="bthci2" name="Bluetooth HCI Framework 2" introduced="9.2" purpose="optional">
+        <unit bldFile="bthci/bthci2/group" mrp="bthci/bthci2/group/bluetooth_hci_v2_framework.mrp"/>
+      </component>
+      <component id="hciextensioninterface" name="Bluetooth HCI Extension Interface" introduced="6.1" purpose="optional">
+        <unit bldFile="bthci/hciextensioninterface" mrp="bthci/hciextensioninterface/bluetooth_hciproxy.mrp"/>
+      </component>
+      <component id="hci2implementations" name="Bluetooth HCI 2 Reference Implementations" introduced="9.2" purpose="optional" class="plugin">
+        <unit bldFile="bthci/hci2implementations/group" mrp="bthci/hci2implementations/group/bluetooth_hci_v2_implementations.mrp"/>
+      </component>
+    </collection>
+    <collection id="irda" name="IrDA" level="plugin">
+      <component id="irdastack" name="IrDA Stack" purpose="optional">
+        <unit bldFile="irda/irdastack/group" mrp="irda/irdastack/group/infra-red_irda.mrp"/>
+      </component>
+    </collection>
+    <collection id="bluetoothapitest" name="Bluetooth API Tests" level="app-if">
+      <component id="bluetoothsvs" name="Bluetooth Verification Suite" introduced="^3" purpose="development" filter="test">
+        <unit mrp="bluetoothapitest/bluetoothsvs/group/bluetoothsvs.mrp" bldFile="bluetoothapitest/bluetoothsvs/group"/>
+      </component>
+    </collection>
+    <collection id="atext" name="AT Extensions" level="server">
+      <component id="atext_build" name="AT Extension Build" introduced="^3" purpose="optional" filter="s60">
+        <unit bldFile="atext/group"/>
+      </component>
+    </collection>
+    <collection id="bt_info" name="Bluetooth Info" level="app-if">
+      <component id="bt_plat" filter="s60" class="api">
+        <unit bldFile="bt_plat/group"/>
+      </component>
+      <component id="bt_metadata" name="Bluetooth Metadata" class="config" introduced="^3" purpose="development" target="desktop">
+        <unit mrp="bt_info/bt_metadata/bt_metadata.mrp"/>
+      </component>
+    </collection>
+  </package>
 </SystemDefinition>
--- a/package_map.xml	Tue Aug 31 16:20:16 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0"?>
-<PackageMap root="sf" layer="os" />
\ No newline at end of file