diff -r 000000000000 -r 29b1cd4cb562 bluetoothmgmt/bluetoothclientlib/avctpservices/avctpremotedevices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothmgmt/bluetoothclientlib/avctpservices/avctpremotedevices.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,161 @@ +// 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: +// + +/** + @file + @internalTechnology +*/ + +#ifndef AVCTPREMOTEDEVICES_H +#define AVCTPREMOTEDEVICES_H + +#include +#include +#include "avctpserviceutils.h" + +// forward declaration +class CAvctpBody; +class CPrimaryChannelController; +class CSecondaryChannelController; + +//TODO (FBO) It will be moved somewhere in common with other code +/** +A wrapper class around an RFastLock that enables locks to be nested. +*/ +NONSHARABLE_CLASS(RNestableLock) + { +public: + RNestableLock(); + TInt CreateLocal(); + void Close(); + + void Wait(); + void Signal(); + +private: + static const TUint64 KInvalidThreadId = ~0u; + RFastLock iLock; + RFastLock iMetaLock; + TInt iRefCount; + TThreadId iThreadId; + }; + +NONSHARABLE_CLASS(TAvctpRemoteDeviceInfo) + { +public: + TAvctpRemoteDeviceInfo(const TBTDevAddr& aAddr); + TBool HasSecondChannel() const; + void SetHasSecondChannel(TBool aHasSecondChannel); + const TBTDevAddr& RemoteAddress() const; +private: + TBTDevAddr iAddr; + TBool iHasSecondChannel; + }; + +/** + MChannelControlNotify + **/ +class MControlChannelNotify + { +public: + // Main channel notifications + virtual void PrimaryChannelAttachConfirm(const TBTDevAddr& aAddr, TInt aMtu, TInt aError) = 0; + virtual void PrimaryChannelAttachIndicate(const TBTDevAddr& aAddr, TInt aMtu) = 0; + virtual void PrimaryChannelDetachConfirm(const TBTDevAddr& aAddr, TInt aError) = 0; + virtual void PrimaryChannelDetachIndicate(const TBTDevAddr& aAddr) = 0; + virtual void PrimaryChannelIoctlError(const TBTDevAddr& aAddr, TInt aError) = 0; + virtual void PrimaryChannelAgreementError(const TBTDevAddr& aAddr, TInt aError) = 0; + + // Second channel notifications + virtual void SecondaryChannelAttachConfirm(const TBTDevAddr& aAddr, TInt aMtu, TInt aError) = 0; + virtual void SecondaryChannelAttachIndicate(const TBTDevAddr& aAddr, TInt aMtu) = 0; + virtual void SecondaryChannelDetachConfirm(const TBTDevAddr& aAddr, TInt aError) = 0; + virtual void SecondaryChannelDetachIndicate(const TBTDevAddr& aAddr) = 0; + virtual void SecondaryChannelIoctlError(const TBTDevAddr& aAddr, TInt aError) = 0; + virtual void SecondaryChannelAgreementError(const TBTDevAddr& aAddr, TInt aError) = 0; + }; + +/** +AVCTP active class to deal with informing the prt of requests relating to +remote devices + +@internalComponent +*/ +NONSHARABLE_CLASS(CAvctpRemoteDevices) : public CBase, public MControlChannelNotify + { +public: + static CAvctpRemoteDevices* NewL(MAvctpEventNotify& aNotify, RSocketServ& aSocketServ, SymbianAvctp::TPid aPid); + static CAvctpRemoteDevices* NewLC(MAvctpEventNotify& aNotify, RSocketServ& aSocketServ, SymbianAvctp::TPid aPid); + ~CAvctpRemoteDevices(); + + // Methods to support RAvctp + TInt PrimaryChannelAttachRequest(const TBTDevAddr& aBTDevice); + TInt PrimaryChannelDetachRequest(const TBTDevAddr& aBTDevice); + void PrimaryChannelCancelAttach(const TBTDevAddr& aBTDevice); + + TInt SecondaryChannelAttachRequest(const TBTDevAddr& aBTDevice); + TInt SecondaryChannelDetachRequest(const TBTDevAddr& aBTDevice); + void SecondaryChannelCancelAttach(const TBTDevAddr& aBTDevice); + + void SetSecondaryChannelNotifyL(MAvctpEventNotify* aSecondChannelNotify); + // Methods to support CAvctpBody + TBool IsAttached(const TBTDevAddr& aBTDevice) const; + + // from MControlChannelNotify + void PrimaryChannelAttachConfirm(const TBTDevAddr& aAddr, TInt aMtu, TInt aError); + void PrimaryChannelAttachIndicate(const TBTDevAddr& aAddr, TInt aMtu); + void PrimaryChannelDetachConfirm(const TBTDevAddr& aAddr, TInt aError); + void PrimaryChannelDetachIndicate(const TBTDevAddr& aAddr); + void PrimaryChannelIoctlError(const TBTDevAddr& aAddr, TInt aError); + void PrimaryChannelAgreementError(const TBTDevAddr& aAddr, TInt aError); + + void SecondaryChannelAttachConfirm(const TBTDevAddr& aAddr, TInt aMtu, TInt aError); + void SecondaryChannelAttachIndicate(const TBTDevAddr& aAddr, TInt aMtu); + void SecondaryChannelDetachConfirm(const TBTDevAddr& aAddr, TInt aError); + void SecondaryChannelDetachIndicate(const TBTDevAddr& aAddr); + void SecondaryChannelIoctlError(const TBTDevAddr& aAddr, TInt aError); + void SecondaryChannelAgreementError(const TBTDevAddr& aAddr, TInt aError); + +private: + CAvctpRemoteDevices(MAvctpEventNotify& aNotify, RSocketServ& aSocketServ); + void ConstructL(SymbianAvctp::TPid aPid); + + void RemoveRemoteDevice(const TBTDevAddr& aBTDevice); + const TAvctpRemoteDeviceInfo* RemoteDeviceInfo(const TBTDevAddr& aBTDevice) const; + TInt PropagateAttachRsp(const TBTDevAddr& aBTDevice, + TBool aClientsAccepts, + TInt aChannel); + + void NotifyError(const TBTDevAddr& aBTDevice, TInt aError, TInt aChannel); + +private: + MAvctpEventNotify& iNotify; + RSocketServ& iSocketServ; + + // This is an array of remote addresses that are either connected or connecting + RArray iRemoteAddrs; + + enum TState {EListening, ECreatingControlLink, ECreatingSecondLink}; + TState iState; + + MAvctpEventNotify* iSecondaryChannelNotify; // non-owned + CPrimaryChannelController* iPrimaryChannelController; + CSecondaryChannelController* iSecondaryChannelController; + mutable RNestableLock iLock; // to use in the const functions + SymbianAvctp::TPid iPid; + }; + +#endif // AVCTPREMOTEDEVICES_H +