--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/linkmgr/encryptionkeyrefreshhelper.h Tue Sep 14 23:28:24 2010 +0300
@@ -0,0 +1,169 @@
+// 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 the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef ENCRYPTIONKEYREFRESHHELPER_H
+#define ENCRYPTIONKEYREFRESHHELPER_H
+
+
+#include <bt_sock.h>
+#include <bluetooth/hci/hciutil.h>
+
+#include "debug.h"
+#include "linkutil.h"
+#include "physicallinkhelper.h"
+#include "physicallinks.h"
+
+// watchdog
+const TUint KTimeoutEncryptionKeyRefresh = 3000000; // 3 s;
+
+class TEncryptionKeyRefresherState;
+class CEncryptionKeyRefresherStateFactory;
+NONSHARABLE_CLASS(CEncryptionKeyRefresher) : public CPhysicalLinkHelper
+ {
+ friend class TEncryptionKeyRefresherState;
+ friend class TEkrStateIdle;
+ friend class TEkrStateDisablingLPM;
+ friend class TEkrStateRefreshingKey;
+
+public:
+ static CEncryptionKeyRefresher* NewL(CPhysicalLinksManager& aLinkMgr, CPhysicalLink& aLink);
+ ~CEncryptionKeyRefresher();
+
+ virtual void StartHelper();
+
+ void EncryptionKeyRefreshComplete(TInt aError);
+
+private:
+ CEncryptionKeyRefresher(CPhysicalLinksManager& aLinkMgr, CPhysicalLink& aLink);
+ void ConstructL();
+
+ virtual void TimerExpired();
+ virtual void HandleError(TInt aError);
+ virtual void EventReceived(TBTBasebandEventNotification& aEvent);
+
+private:
+ CEncryptionKeyRefresherStateFactory* iStateFactory;
+ const TEncryptionKeyRefresherState* iState;
+ };
+
+//--------------------------------------------------
+// STATE FACTORY
+//--------------------------------------------------
+
+/**
+ Factory for the EncryptionKeyRefresher states
+
+ The states are flyweight classes
+**/
+NONSHARABLE_CLASS(CEncryptionKeyRefresherStateFactory) : public CBase
+ {
+public:
+ static CEncryptionKeyRefresherStateFactory* NewL();
+
+ enum TEncryptionKeyRefresherStates
+ {
+ EIdle,
+ EDisablingLPM,
+ ERefreshingKey,
+ // Note that we don't need a state to enable LPM again
+ // as this will happen implicitly when we close our
+ // proxy SAP.
+ // *** keep next one last ***
+ EEncryptionKeyRefresherMaxState,
+ };
+
+ const TEncryptionKeyRefresherState& GetState(TEncryptionKeyRefresherStates aState) const;
+ TInt StateIndex(const TEncryptionKeyRefresherState* aState) const;
+
+private:
+ CEncryptionKeyRefresherStateFactory();
+ void ConstructL();
+ TFixedArray<TEncryptionKeyRefresherState*, EEncryptionKeyRefresherMaxState> iStates;
+ };
+
+
+
+//--------------------------------------------------
+// STATES, base
+//--------------------------------------------------
+
+NONSHARABLE_CLASS(TEncryptionKeyRefresherState)
+ {
+public:
+ TEncryptionKeyRefresherState(CEncryptionKeyRefresherStateFactory& aFactory);
+
+ virtual void Enter(CEncryptionKeyRefresher& aContext) const;
+ virtual void Exit(CEncryptionKeyRefresher& aContext) const;
+
+ virtual void Start(CEncryptionKeyRefresher& aContext) const;
+ virtual void EventReceived(CEncryptionKeyRefresher& aContext, TBTBasebandEventNotification& aEvent) const;
+ virtual void Error(CEncryptionKeyRefresher& aContext, TInt aErr) const;
+ virtual void TimerExpired(CEncryptionKeyRefresher& aContext) const;
+ virtual void EncryptionKeyRefreshComplete(CEncryptionKeyRefresher& aContext, TInt aError) const;
+
+protected:
+ // Exits old state, sets the new state, and enters it.
+ void ChangeState(CEncryptionKeyRefresher& aContext, CEncryptionKeyRefresherStateFactory::TEncryptionKeyRefresherStates aState) const;
+ void PanicInState(TLinkPanic aPanic) const;
+
+protected:
+ CEncryptionKeyRefresherStateFactory& iFactory;
+#ifdef __FLOG_ACTIVE
+ TBuf<48> iName;
+#endif
+ };
+
+
+//--------------------------------------------------
+// STATES
+//--------------------------------------------------
+
+NONSHARABLE_CLASS(TEkrStateIdle) : public TEncryptionKeyRefresherState
+ {
+public:
+ TEkrStateIdle(CEncryptionKeyRefresherStateFactory& aFactory);
+
+ virtual void Enter(CEncryptionKeyRefresher& aContext) const;
+ virtual void Start(CEncryptionKeyRefresher& aContext) const;
+ };
+
+
+NONSHARABLE_CLASS(TEkrStateDisablingLPM) : public TEncryptionKeyRefresherState
+ {
+public:
+ TEkrStateDisablingLPM(CEncryptionKeyRefresherStateFactory& aFactory);
+
+ virtual void Enter(CEncryptionKeyRefresher& aContext) const;
+ virtual void EventReceived(CEncryptionKeyRefresher& aContext, TBTBasebandEventNotification& aEvent) const;
+ };
+
+NONSHARABLE_CLASS(TEkrStateRefreshingKey) : public TEncryptionKeyRefresherState
+ {
+public:
+ TEkrStateRefreshingKey(CEncryptionKeyRefresherStateFactory& aFactory);
+
+ virtual void Enter(CEncryptionKeyRefresher& aContext) const;
+ virtual void EncryptionKeyRefreshComplete(CEncryptionKeyRefresher& aContext, TInt aError) const;
+ };
+
+
+#ifdef __FLOG_ACTIVE
+#define STATENAME(x) iName=_L(x)
+#else
+#define STATENAME(x)
+#endif
+
+
+#endif /* ENCRYPTIONKEYREFRESHHELPER_H */