--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcController.cpp Fri Jan 15 08:13:17 2010 +0200
@@ -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();
+ }