Skip to content

Commit

Permalink
Merge pull request #146 from andresag01/develop
Browse files Browse the repository at this point in the history
Add onShutdown to register callbacks
  • Loading branch information
pan- committed Dec 17, 2015
2 parents 65ed5c1 + 0024b78 commit 31be779
Show file tree
Hide file tree
Showing 4 changed files with 186 additions and 14 deletions.
46 changes: 45 additions & 1 deletion ble/Gap.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,9 @@ class Gap {

typedef FunctionPointerWithContext<bool> RadioNotificationEventCallback_t;

typedef FunctionPointerWithContext<const Gap *> GapShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const Gap *> GapShutdownCallbackChain_t;

/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
Expand Down Expand Up @@ -1009,9 +1012,43 @@ class Gap {
radioNotificationCallback.attach(tptr, mptr);
}

/**
* Setup a callback to be invoked to notify the user application that the
* Gap instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the Gap instance is shutdown.
*
* @Note: It is also possible to set up a callback into a member function of
* some object.
*
* @Note It is possible to unregister a callback using onShutdown().detach(callback)
*/
void onShutdown(const GapShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
GapShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

public:
/**
* Clear all Gap state of the associated object.
* Notify all registered onShutdown callbacks that the Gap instance is
* about to be shutdown and clear all Gap state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -1024,6 +1061,10 @@ class Gap {
* scan parameters to default values.
*/
virtual ble_error_t reset(void) {
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

/* Clear Gap state */
state.advertising = 0;
state.connected = 0;
Expand Down Expand Up @@ -1120,6 +1161,9 @@ class Gap {
ConnectionEventCallbackChain_t connectionCallChain;
DisconnectionEventCallbackChain_t disconnectionCallChain;

private:
GapShutdownCallbackChain_t shutdownCallChain;

private:
/* Disallow copy and assignment. */
Gap(const Gap &);
Expand Down
49 changes: 45 additions & 4 deletions ble/GattClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ class GattClient {
typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattHVXCallbackParams*> HVXCallbackChain_t;

typedef FunctionPointerWithContext<const GattClient *> GattClientShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattClient *> GattClientShutdownCallbackChain_t;

/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
Expand Down Expand Up @@ -314,6 +317,37 @@ class GattClient {
onHVXCallbackChain.add(callback);
}

/**
* Setup a callback to be invoked to notify the user application that the
* GattClient instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the GattClient is shutdown.
*
* @Note: It is also possible to set up a callback into a member function of
* some object.
*
* @Note It is possible to unregister a callback using onShutdown().detach(callback)
*/
void onShutdown(const GattClientShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
GattClientShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

/**
* @brief provide access to the callchain of HVX callbacks
Expand All @@ -327,7 +361,9 @@ class GattClient {

public:
/**
* Clear all GattClient state of the associated object.
* Notify all registered onShutdown callbacks that the GattClient is
* about to be shutdown and clear all GattClient state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -338,6 +374,10 @@ class GattClient {
* @return BLE_ERROR_NONE on success.
*/
virtual ble_error_t reset(void) {
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

onDataReadCallbackChain.clear();
onDataWriteCallbackChain.clear();
onHVXCallbackChain.clear();
Expand Down Expand Up @@ -367,9 +407,10 @@ class GattClient {
}

protected:
ReadCallbackChain_t onDataReadCallbackChain;
WriteCallbackChain_t onDataWriteCallbackChain;
HVXCallbackChain_t onHVXCallbackChain;
ReadCallbackChain_t onDataReadCallbackChain;
WriteCallbackChain_t onDataWriteCallbackChain;
HVXCallbackChain_t onHVXCallbackChain;
GattClientShutdownCallbackChain_t shutdownCallChain;

private:
/* Disallow copy and assignment. */
Expand Down
58 changes: 50 additions & 8 deletions ble/GattServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ class GattServer {
typedef FunctionPointerWithContext<const GattReadCallbackParams*> DataReadCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams *> DataReadCallbackChain_t;

typedef FunctionPointerWithContext<const GattServer *> GattServerShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattServer *> GattServerShutdownCallbackChain_t;

typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;

protected:
Expand Down Expand Up @@ -341,6 +344,38 @@ class GattServer {
return dataReadCallChain;
}

/**
* Setup a callback to be invoked to notify the user application that the
* GattServer instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the GattServer is shutdown.
*
* @Note: It is also possible to set up a callback into a member function of
* some object.
*
* @Note It is possible to unregister a callback using onShutdown().detach(callback)
*/
void onShutdown(const GattServerShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
GattServerShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

/**
* Set up a callback for when notifications or indications are enabled for a
* characteristic on the local GATT server.
Expand Down Expand Up @@ -397,7 +432,9 @@ class GattServer {

public:
/**
* Clear all GattServer state of the associated object.
* Notify all registered onShutdown callbacks that the GattServer is
* about to be shutdown and clear all GattServer state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -408,7 +445,11 @@ class GattServer {
* @return BLE_ERROR_NONE on success.
*/
virtual ble_error_t reset(void) {
serviceCount = 0;
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

serviceCount = 0;
characteristicCount = 0;

dataSentCallChain.clear();
Expand All @@ -426,12 +467,13 @@ class GattServer {
uint8_t characteristicCount;

private:
DataSentCallbackChain_t dataSentCallChain;
DataWrittenCallbackChain_t dataWrittenCallChain;
DataReadCallbackChain_t dataReadCallChain;
EventCallback_t updatesEnabledCallback;
EventCallback_t updatesDisabledCallback;
EventCallback_t confirmationReceivedCallback;
DataSentCallbackChain_t dataSentCallChain;
DataWrittenCallbackChain_t dataWrittenCallChain;
DataReadCallbackChain_t dataReadCallChain;
GattServerShutdownCallbackChain_t shutdownCallChain;
EventCallback_t updatesEnabledCallback;
EventCallback_t updatesDisabledCallback;
EventCallback_t confirmationReceivedCallback;

private:
/* Disallow copy and assignment. */
Expand Down
47 changes: 46 additions & 1 deletion ble/SecurityManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <stdint.h>

#include "Gap.h"
#include "CallChainOfFunctionPointersWithContext.h"

class SecurityManager {
public:
Expand Down Expand Up @@ -82,6 +83,9 @@ class SecurityManager {
typedef void (*LinkSecuredCallback_t)(Gap::Handle_t handle, SecurityMode_t securityMode);
typedef void (*PasskeyDisplayCallback_t)(Gap::Handle_t handle, const Passkey_t passkey);

typedef FunctionPointerWithContext<const SecurityManager *> SecurityManagerShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const SecurityManager *> SecurityManagerShutdownCallbackChain_t;

/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
Expand Down Expand Up @@ -161,6 +165,38 @@ class SecurityManager {

/* Event callback handlers. */
public:
/**
* Setup a callback to be invoked to notify the user application that the
* SecurityManager instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the SecurityManager is shutdown.
*
* @Note: It is also possible to set up a callback into a member function of
* some object.
*
* @Note It is possible to unregister a callback using onShutdown().detach(callback)
*/
void onShutdown(const SecurityManagerShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
SecurityManagerShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

/**
* To indicate that a security procedure for the link has started.
*/
Expand Down Expand Up @@ -233,7 +269,9 @@ class SecurityManager {

public:
/**
* Clear all SecurityManager state of the associated object.
* Notify all registered onShutdown callbacks that the SecurityManager is
* about to be shutdown and clear all SecurityManager state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -244,6 +282,10 @@ class SecurityManager {
* @return BLE_ERROR_NONE on success.
*/
virtual ble_error_t reset(void) {
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

securitySetupInitiatedCallback = NULL;
securitySetupCompletedCallback = NULL;
linkSecuredCallback = NULL;
Expand All @@ -259,6 +301,9 @@ class SecurityManager {
LinkSecuredCallback_t linkSecuredCallback;
HandleSpecificEvent_t securityContextStoredCallback;
PasskeyDisplayCallback_t passkeyDisplayCallback;

private:
SecurityManagerShutdownCallbackChain_t shutdownCallChain;
};

#endif /*__SECURITY_MANAGER_H__*/

0 comments on commit 31be779

Please sign in to comment.