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

types/ReaderFunc.h

Committer:
dan_ackme
Date:
2014-08-11
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad

File content as of revision 0:ea85c4bb5e1f:

/*
 * 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);
    }
};

}