Subversion Repositories spk

Rev

Blame | Last modification | View Log | RSS feed

#pragma once

#include "../Overlay.h"

class KeyboardDevice : public IDirectInputDevice8
{
public:
        KeyboardDevice(IDirectInputDevice8* device, COverlay *o) : m_device(device), m_pOverlay(o)//, m_serverPipe(FULL_PIPE_NAME)
        {
                m_pOverlay->SetKeyboardDevice ( device );
        }

        /*** IUnknown methods ***/
        STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj)
        {
                return m_device->QueryInterface(riid, ppvObj);
        }

        STDMETHOD_(ULONG,AddRef)()
        {
                return m_device->AddRef();
        }

        STDMETHOD_(ULONG,Release)()
        {
                ULONG count = m_device->Release();
                if(0 == count)
                        delete this;

                return count;
        }

        /*** IDirectInputDevice8 methods ***/
        STDMETHOD(GetCapabilities)(LPDIDEVCAPS devCaps)
        {
                return m_device->GetCapabilities(devCaps);
        }

        STDMETHOD(EnumObjects)(LPDIENUMDEVICEOBJECTSCALLBACK callback, LPVOID ref, DWORD flags) 
        {
                return m_device->EnumObjects(callback, ref, flags);
        }

        STDMETHOD(GetProperty)(REFGUID rguid, LPDIPROPHEADER ph)
        {
                return m_device->GetProperty(rguid, ph);
        }

        STDMETHOD(SetProperty)(REFGUID rguid, LPCDIPROPHEADER ph)
        {
                return m_device->SetProperty(rguid, ph);

                /*
                You can detect immediate/buffered modes as such:
                
                HRESULT hr = m_device->SetProperty(rguid, ph);

                if(SUCCEEDED(hr) && rguid == DIPROP_BUFFERSIZE)
                {
                        DWORD data = *reinterpret_cast<const DWORD*>(ph + 1);
                        m_is_immediate = (data == 0);
                }

                return hr;
                */
        }

        STDMETHOD(Acquire)()
        {
                return m_device->Acquire();
        }

        STDMETHOD(Unacquire)()
        {
                return m_device->Unacquire();
        }

        STDMETHOD(GetDeviceState)(DWORD size, LPVOID data)
        {
                HRESULT hr = m_device->GetDeviceState(size, data);

                if ( m_pOverlay->SetKeyBuffer ( size, (char *)data ) )
                        hr = E_PENDING;

                return hr;
        }

        STDMETHOD(GetDeviceData)(DWORD size, LPDIDEVICEOBJECTDATA data, LPDWORD numElements, DWORD flags)
        {
                HRESULT hr = m_device->GetDeviceData(size, data, numElements, flags);

                for ( unsigned int i = 0; i < *numElements; i++ )
                {
                        DIDEVICEOBJECTDATA *d = &data[i];
                        if ( d->dwData )
                        {
                                if ( m_pOverlay->KeyDown ( (int)d->dwOfs ) )
                                        d->dwData = 0;
                        }
                        else
                                m_pOverlay->KeyReleased ( (int)d->dwOfs );
                }
/*
                if ( m_pOverlay->GetKeyboard () )
                {
                        char data[256];
                        if ( !FAILED (m_device->GetDeviceState(256, data)) )
                        {
                                if ( m_pOverlay->SetKeyBuffer ( 256, data ) )
                                        return DIERR_INPUTLOST;
                        }
                }*/
                return hr;
        }

        STDMETHOD(SetDataFormat)(LPCDIDATAFORMAT df)
        {
                return m_device->SetDataFormat(df);
        }

        STDMETHOD(SetEventNotification)(HANDLE event)
        {
                return m_device->SetEventNotification(event);
        }

        STDMETHOD(SetCooperativeLevel)(HWND window, DWORD level)
        {
                return m_device->SetCooperativeLevel(window, level);
        }

        STDMETHOD(GetObjectInfo)(LPDIDEVICEOBJECTINSTANCE object, DWORD objId, DWORD objHow)
        {
                return m_device->GetObjectInfo(object, objId, objHow);
        }

        STDMETHOD(GetDeviceInfo)(LPDIDEVICEINSTANCE di)
        {
                return m_device->GetDeviceInfo(di);
        }

        STDMETHOD(RunControlPanel)(HWND owner, DWORD flags)
        {
                return m_device->RunControlPanel(owner, flags);
        }

        STDMETHOD(Initialize)(HINSTANCE instance, DWORD version, REFGUID rguid)
        {
                return m_device->Initialize(instance, version, rguid);
        }

        STDMETHOD(CreateEffect)(REFGUID rguid, LPCDIEFFECT effect_params, LPDIRECTINPUTEFFECT* effect, LPUNKNOWN unknown)
        {
                return m_device->CreateEffect(rguid, effect_params, effect, unknown);
        }

    STDMETHOD(EnumEffects)(LPDIENUMEFFECTSCALLBACK callback, LPVOID ref, DWORD type)
        {
                return m_device->EnumEffects(callback, ref, type);
        }

    STDMETHOD(GetEffectInfo)(LPDIEFFECTINFO effect_info, REFGUID rguid)
        {
                return m_device->GetEffectInfo(effect_info, rguid);
        }

    STDMETHOD(GetForceFeedbackState)(LPDWORD state)
        {
                return m_device->GetForceFeedbackState(state);
        }

    STDMETHOD(SendForceFeedbackCommand)(DWORD flags)
        {
                return m_device->SendForceFeedbackCommand(flags);
        }

    STDMETHOD(EnumCreatedEffectObjects)(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback, LPVOID ref, DWORD flags)
        {
                return m_device->EnumCreatedEffectObjects(callback, ref, flags);
        }

    STDMETHOD(Escape)(LPDIEFFESCAPE escape)
        {
                return m_device->Escape(escape);
        }

    STDMETHOD(Poll)()
        {
                return m_device->Poll();
        }

        STDMETHOD(SendDeviceData)(DWORD size, LPCDIDEVICEOBJECTDATA data, LPDWORD num_elements, DWORD flags)
        {
                return m_device->SendDeviceData(size, data, num_elements, flags);
        }

        STDMETHOD(EnumEffectsInFile)(LPCTSTR file_name, LPDIENUMEFFECTSINFILECALLBACK callback, LPVOID ref, DWORD flags)
        {
                return m_device->EnumEffectsInFile(file_name, callback, ref, flags);
        }

    STDMETHOD(WriteEffectToFile)(LPCTSTR file_name, DWORD num_entries, LPDIFILEEFFECT effects, DWORD flags)
        {
                return m_device->WriteEffectToFile(file_name, num_entries, effects, flags);
        }

    STDMETHOD(BuildActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags)
        {
                return m_device->BuildActionMap(format, username, flags);
        }

    STDMETHOD(SetActionMap)(LPDIACTIONFORMAT format, LPCTSTR username, DWORD flags)
        {
                return m_device->SetActionMap(format, username, flags);
        }

    STDMETHOD(GetImageInfo)(LPDIDEVICEIMAGEINFOHEADER image_header)
        {
                return m_device->GetImageInfo(image_header);
        }

private:
        IDirectInputDevice8* m_device;  
        COverlay *m_pOverlay;
//      NamedPipeServer m_serverPipe;
};