accessoryservices/remotecontrolfw/client/intermediate/src/bulkreceiver.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/remotecontrolfw/client/intermediate/src/bulkreceiver.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,197 @@
+// 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:
+//
+
+
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <comms-infras/commsdebugutility.h>
+#include <e32atomics.h>
+#include "bulkreceiver.h"
+#include "remconclient.h"
+#include "remconbulkclient.h"
+#include "utils.h"
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_REMCON_IF_BASE);
+#endif
+
+#ifdef _DEBUG
+PANICCATEGORY("bulkrecv");
+#endif // _DEBUG
+
+CBulkReceiver* CBulkReceiver::NewL(CRemConInterfaceSelector& aObserver)
+	{
+	LOG_STATIC_FUNC;
+	CBulkReceiver* self = new(ELeave) CBulkReceiver(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CBulkReceiver::~CBulkReceiver()
+	{
+	LOG_FUNC;
+	Cancel();
+	iConnectCall.Close();
+	iData.Close();
+	}
+
+CBulkReceiver::CBulkReceiver(CRemConInterfaceSelector& aObserver)
+	: CActive(CActive::EPriorityStandard)
+	, iObserver(aObserver)
+	{
+	LOG_FUNC;
+	}
+
+void CBulkReceiver::ConstructL()
+	{
+	LOG_FUNC;
+	TCallBack connectCb(StaticConnect, this);
+	LEAVEIFERRORL(iConnectCall.Create(connectCb, EPriorityStandard));
+	BindToCurrentThreadL();
+	}
+
+void CBulkReceiver::BindToCurrentThreadL()
+	{
+	LOG_FUNC;
+	ASSERT_DEBUG(!IsAdded());
+	TRAPD(err, DoBindToCurrentThreadL());
+	if(err != KErrNone)
+		{
+		this->Deque();
+		LEAVEL(err);
+		}
+	}
+
+void CBulkReceiver::DoBindToCurrentThreadL()
+	{
+	LOG_FUNC;
+	CActiveScheduler::Add(this);
+	LEAVEIFERRORL(iConnectCall.Start());
+	iThreadId = RThread().Id();
+	}
+
+TBool CBulkReceiver::InitialisationRequired() const
+	{
+	LOG_FUNC;
+	return IsAdded();
+	}
+
+TInt CBulkReceiver::StaticConnect(TAny* aSelf)
+	{
+	LOG_STATIC_FUNC;
+	ASSERT_DEBUG(aSelf);
+	return reinterpret_cast<CBulkReceiver*>(aSelf)->Connect();
+	}
+
+TInt CBulkReceiver::Connect()
+	{
+	LOG_FUNC;
+	// issue the connect from the bulk thread.
+	TRAPD(err, iObserver.BulkSessionConnectL());
+	if(err == KErrNone)
+		{
+		// Start the perpetual receive cycle.
+		Receive();
+		}
+	return err;
+	}
+
+void CBulkReceiver::InitialiseL(RRemConBulk& aRemConBulk, TUint aMaxDataLength)
+	{
+	LOG_FUNC;
+	iData.CreateL(aMaxDataLength);
+	iRemConBulk = &aRemConBulk;
+	// NB If a remote sends longer data than we expect to receive here, our 
+	// receive will be errored and the message will effectively be dropped in 
+	// the intermediate layer. (It won't get passed to the outer layer.)
+	
+	// Receive is queued once we have a connected bulk server session
+	}
+
+void CBulkReceiver::Receive()
+	{
+	LOG_FUNC
+	ASSERT_DEBUG(iRemConBulk);
+	iRemConBulk->Receive(iStatus, iInterfaceUid, iOperationId, iData);
+	SetActive();
+	}
+
+void CBulkReceiver::RunL()
+	{
+	LOG_FUNC
+	LOG1(_L8("\tiStatus = %d"), iStatus.Int());
+
+	TInt err = iStatus.Int();
+	
+	if(err == KErrNone)
+		{
+		iObserver.BulkReceiveComplete(iInterfaceUid, iOperationId, iData);
+		}
+	else
+		{
+		iObserver.BulkError(err);
+		}
+	
+	if(err != KErrServerTerminated)
+		{
+		// Repost request.
+		Receive();
+		}
+	}
+
+void CBulkReceiver::DoCancel()
+	{
+	LOG_FUNC
+	
+	if(RThread().Id() == iThreadId)
+		{
+		// There's nothing we can do about any error here, and it probably 
+		// indicates that the server has gone away anyway for some reason.
+		ASSERT_DEBUG(iRemConBulk);
+		static_cast<void>(iRemConBulk->ReceiveCancel());
+		
+		// No need to cancel the "connecting" request as it is a synchronous kick
+		}
+	else
+		{
+		// being run in a different thread - this means that something has gone
+		// wrong and we merely want to tidy up the CActive state (i.e. not active).
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrCancel);
+		}
+	}
+
+/**
+This function deals with connecting to the bulk server - it handles the
+cases where the bulk interfaces are running in the same thread as the control
+interfaces, and also when running in a different thread (which is as one might
+expect more complicated). 
+*/
+void CBulkReceiver::WaitUntilConnectedL()
+	{
+	LOG_FUNC;
+	LEAVEIFERRORL(iConnectCall.CallBack());
+	}
+
+
+