root/src/add-ons/kernel/drivers/input/hid_shared/ProtocolHandler.h
/*
 * Copyright 2009-2011, Michael Lotz, mmlr@mlotz.ch.
 * Distributed under the terms of the MIT License.
 */
#ifndef PROTOCOL_HANDLER_H
#define PROTOCOL_HANDLER_H


#include <SupportDefs.h>


#define PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED             0x80000000


class HIDDevice;
class HIDReport;


class ProtocolHandler {
public:
                                                                ProtocolHandler(HIDDevice *device,
                                                                        const char *basePath,
                                                                        size_t ringBufferSize);
        virtual                                         ~ProtocolHandler();

                        status_t                        InitCheck() { return fStatus; }

                        HIDDevice *                     Device() { return fDevice; }

                        const char *            BasePath() { return fBasePath; }
                        void                            SetPublishPath(char *publishPath);
                        const char *            PublishPath() { return fPublishPath; }

        static  void                            AddHandlers(HIDDevice &device,
                                                                        ProtocolHandler *&handlerList,
                                                                        uint32 &handlerCount);

        virtual status_t                        Open(uint32 flags, uint32 *cookie);
        virtual status_t                        Close(uint32 *cookie);

        virtual status_t                        Read(uint32 *cookie, off_t position,
                                                                        void *buffer, size_t *numBytes);
        virtual status_t                        Write(uint32 *cookie, off_t position,
                                                                        const void *buffer, size_t *numBytes);

        virtual status_t                        Control(uint32 *cookie, uint32 op, void *buffer,
                                                                        size_t length);

                        int32                           RingBufferReadable();
                        status_t                        RingBufferRead(void *buffer, size_t length);
                        status_t                        RingBufferWrite(const void *buffer,
                                                                        size_t length);

                        void                            SetNextHandler(ProtocolHandler *next);
                        ProtocolHandler *       NextHandler() { return fNextHandler; };

                        status_t                        IOGetDeviceName(const char *name, void *buffer,
                                                                        size_t length);

protected:
                        status_t                        fStatus;

private:
                        HIDDevice *                     fDevice;
                        const char *            fBasePath;
                        char *                          fPublishPath;
                        struct ring_buffer *fRingBuffer;

                        ProtocolHandler *       fNextHandler;
};


#endif // PROTOCOL_HANDLER_H