Host library for controlling a WiConnect enabled Wi-Fi module.

Dependents:   wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more

Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/types/ReaderFunc.h	Mon Aug 11 09:58:24 2014 +0000
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2014, ACKme Networks
+ * All Rights Reserved.
+ *
+ * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
+ * the contents of this file may not be disclosed to third parties, copied
+ * or duplicated in any form, in whole or in part, without the prior
+ * written permission of ACKme Networks.
+ */
+
+#pragma once
+
+#include "WiconnectTypes.h"
+#include "FunctionPointer.h"
+
+
+namespace wiconnect
+{
+
+typedef WiconnectResult (*_ReaderFunc)(void *user, void *data, int maxReadSize, int *bytesRead);
+
+class ReaderFunc : public FunctionPointer
+{
+public:
+
+    /*************************************************************************************************/
+    ReaderFunc(_ReaderFunc func = 0)
+    {
+        _function = (void*)func;
+        _membercaller = NULL;
+        _object = NULL;
+    }
+
+    /*************************************************************************************************/
+    template<typename T>
+    ReaderFunc(T *object, WiconnectResult (T::*member)(void *user, void *data, int maxReadSize, int *bytesRead))
+    {
+        _object = static_cast<void*>(object);
+        memcpy(_member, (char*)&member, sizeof(member));
+        _membercaller = (void*)&ReaderFunc::membercaller<T>;
+        _function = 0;
+    }
+
+    /*************************************************************************************************/
+    WiconnectResult call(void *user, void *data, int maxReadSize, int *bytesRead)
+    {
+        if (_function)
+        {
+            return ((_ReaderFunc)_function)(user, data, maxReadSize, bytesRead);
+        }
+        else if (_object)
+        {
+            typedef WiconnectResult (*membercallerFunc)(void*, char*, void *user, void *data, int maxReadSize, int *bytesRead);
+            return ((membercallerFunc)_membercaller)(_object, _member, user, data, maxReadSize, bytesRead);
+        }
+        else
+        {
+            return WICONNECT_ERROR;
+        }
+    }
+
+private:
+
+    /*************************************************************************************************/
+    template<typename T>
+    static WiconnectResult membercaller(void *object, char *member, void *user, void *data, int maxReadSize, int *bytesRead)
+    {
+        T* o = static_cast<T*>(object);
+        WiconnectResult (T::*m)(void *user, void *data, int maxReadSize, int *bytesRead);
+        memcpy((char*)&m, member, sizeof(m));
+        return (o->*m)(user, data, maxReadSize, bytesRead);
+    }
+};
+
+}
+