From 5ee37222777c8f0712ffa75ceff7a4102583b432 Mon Sep 17 00:00:00 2001 From: Mark Kendall Date: Thu, 5 Apr 2012 14:39:27 +0100 Subject: [PATCH] Add an Alert callback. bigzid: 462 This will be used to signal the client application to signal the user about critical issues. Also adds new libcec_parameter and libcec_parameter_types types for future expansion. --- include/cectypes.h | 25 +++++++++++++++++++++++++ src/LibCecSharp/CecSharpTypes.h | 18 ++++++++++++++++++ src/cec-config/cec-config.cpp | 1 + src/testclient/main.cpp | 1 + 4 files changed, 45 insertions(+) diff --git a/include/cectypes.h b/include/cectypes.h index 3beef1c..29a2e38 100644 --- a/include/cectypes.h +++ b/include/cectypes.h @@ -922,12 +922,29 @@ typedef struct cec_logical_addresses #endif } cec_logical_addresses; +typedef enum libcec_alert +{ + CEC_ALERT_SERVICE_DEVICE +} libcec_alert; + +typedef enum libcec_parameter_type +{ + CEC_PARAMETER_TYPE_STRING +} libcec_parameter_type; + +struct libcec_parameter +{ + libcec_parameter_type paramType; + void* paramData; +}; + struct libcec_configuration; typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const cec_log_message &); typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &); typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &); typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void *param, const libcec_configuration &); +typedef int (CEC_CDECL* CBCecAlertType)(void *param, const libcec_alert, const libcec_parameter &); typedef struct ICECCallbacks { @@ -958,6 +975,14 @@ typedef struct ICECCallbacks * @return 1 when ok, 0 otherwise */ CBCecConfigurationChangedType CBCecConfigurationChanged; + + /*! + * @Brief Transfer a libcec alert message from libCEC to the client + * @Param alert The alert type transfer. + * @Param data Misc. additional information. + * @return 1 when ok, 0 otherwise + */ + CBCecAlertType CBCecAlert; } ICECCallbacks; typedef enum cec_client_version diff --git a/src/LibCecSharp/CecSharpTypes.h b/src/LibCecSharp/CecSharpTypes.h index d9fcc9d..a7316f8 100644 --- a/src/LibCecSharp/CecSharpTypes.h +++ b/src/LibCecSharp/CecSharpTypes.h @@ -685,12 +685,20 @@ namespace CecSharp return 0; } + int CecAlertCB(void *cbParam, const CEC::libcec_alert alert, const libcec_parameter &data) + { + if (g_alertCB) + return g_alertCB(alert, data); + return 0; + } + #pragma managed // delegates for the unmanaged callback methods public delegate int CecLogMessageManagedDelegate(const CEC::cec_log_message &); public delegate int CecKeyPressManagedDelegate(const CEC::cec_keypress &); public delegate int CecCommandManagedDelegate(const CEC::cec_command &); public delegate int CecConfigManagedDelegate(const CEC::libcec_configuration &); + public delegate int CecAlertManagedDelegate(const CEC::libcec_alert, const CEC::libcec_parameter &); // callback method interface public ref class CecCallbackMethods @@ -838,6 +846,12 @@ namespace CecSharp g_configCB = static_cast(System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(m_configDelegate).ToPointer()); g_cecCallbacks.CBCecConfigurationChanged = CecConfigCB; + // create the delegate method for the alert callback + m_alertDelegate = gcnew CecAlertManagedDelegate(this, &CecCallbackMethods::CecAlertManaged); + m_alertGCHandle = System::Runtime::InteropServices::GCHandle::Alloc(m_alertDelegate); + g_alertCB = static_cast(System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(m_alertDelegate).ToPointer()); + g_cecCallbacks.CBCecAlert = CecAlertCB; + delete context; m_bDelegatesCreated = true; } @@ -859,6 +873,10 @@ namespace CecSharp static System::Runtime::InteropServices::GCHandle m_configGCHandle; CONFIGCB m_configCallback; + CecAlertManagedDelegate ^ m_alertDelegate; + static System::Runtime::InteropServices::GCHandle m_alertGCHandle; + CONFIGCB m_alertCallback; + CecCallbackMethods ^ m_callbacks; bool m_bHasCallbacks; bool m_bDelegatesCreated; diff --git a/src/cec-config/cec-config.cpp b/src/cec-config/cec-config.cpp index a7335c7..1e6c96f 100644 --- a/src/cec-config/cec-config.cpp +++ b/src/cec-config/cec-config.cpp @@ -145,6 +145,7 @@ void EnableCallbacks(ICECAdapter *adapter) g_callbacks.CBCecKeyPress = &CecKeyPress; g_callbacks.CBCecCommand = &CecCommand; g_callbacks.CBCecConfigurationChanged = NULL; + g_callbacks.CBCecAlert = NULL; adapter->EnableCallbacks(NULL, &g_callbacks); } diff --git a/src/testclient/main.cpp b/src/testclient/main.cpp index 1621ad3..c1106d5 100644 --- a/src/testclient/main.cpp +++ b/src/testclient/main.cpp @@ -181,6 +181,7 @@ void EnableCallbacks(ICECAdapter *adapter) g_callbacks.CBCecKeyPress = &CecKeyPress; g_callbacks.CBCecCommand = &CecCommand; g_callbacks.CBCecConfigurationChanged = NULL; + g_callbacks.CBCecAlert = NULL; adapter->EnableCallbacks(NULL, &g_callbacks); } -- 2.34.1