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
Diff: types/ReaderFunc.h
- 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); + } +}; + +} +