root/src/system/kernel/device_manager/AbstractModuleDevice.h
/*
 * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Copyright 2008-2009, Axel Dörfler, axeld@pinc-software.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef ABSTRACT_MODULE_DEVICE_H
#define ABSTRACT_MODULE_DEVICE_H


#include "BaseDevice.h"


namespace BPrivate {


class AbstractModuleDevice : public BaseDevice {
public:
                                                        AbstractModuleDevice();
        virtual                                 ~AbstractModuleDevice();

                        device_module_info* Module() const { return fDeviceModule; }

                        void*                   Data() const { return fDeviceData; }
                        device_node*    Node() const { return fNode; }

        virtual bool                    HasSelect() const;
        virtual bool                    HasDeselect() const;
        virtual bool                    HasRead() const;
        virtual bool                    HasWrite() const;
        virtual bool                    HasIO() const;

        virtual status_t                Open(const char* path, int openMode,
                                                                void** _cookie);
        virtual status_t                Read(void* cookie, off_t pos, void* buffer,
                                                                size_t* _length);
        virtual status_t                Write(void* cookie, off_t pos, const void* buffer,
                                                                size_t* _length);
        virtual status_t                IO(void* cookie, io_request* request);
        virtual status_t                Control(void* cookie, int32 op, void* buffer,
                                                                size_t length);
        virtual status_t                Select(void* cookie, uint8 event, selectsync* sync);
        virtual status_t                Deselect(void* cookie, uint8 event,
                                                                selectsync* sync);

        virtual status_t                Close(void* cookie);
        virtual status_t                Free(void* cookie);

protected:
                        status_t                _DoIO(void* cookie, off_t pos,
                                                                void* buffer, size_t* _length, bool isWrite);

protected:
        device_node*                    fNode;
        int32                                   fInitialized;
        device_module_info*             fDeviceModule;
        void*                                   fDeviceData;
};


} // namespace BPrivate


using BPrivate::AbstractModuleDevice;


#endif  // ABSTRACT_MODULE_DEVICE_H