+++ /dev/null
-/*\r
-* Copyright (c) 2007-2010 SlimDX Group\r
-* \r
-* Permission is hereby granted, free of charge, to any person obtaining a copy\r
-* of this software and associated documentation files (the "Software"), to deal\r
-* in the Software without restriction, including without limitation the rights\r
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-* copies of the Software, and to permit persons to whom the Software is\r
-* furnished to do so, subject to the following conditions:\r
-* \r
-* The above copyright notice and this permission notice shall be included in\r
-* all copies or substantial portions of the Software.\r
-* \r
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-* THE SOFTWARE.\r
-*/\r
-#include "stdafx.h"\r
-#include <windows.h>\r
-#include <dinput.h>\r
-#include <vcclr.h>\r
-\r
-#include "../stack_array.h"\r
-#include "../ComObject.h"\r
-#include "../Utilities.h"\r
-#include "../CollectionShim.h"\r
-\r
-#include "DirectInput.h"\r
-#include "DirectInputException.h"\r
-\r
-#include "EffectDI.h"\r
-#include "DeviceDI.h"\r
-#include "CallbacksDI.h"\r
-\r
-using namespace System;\r
-using namespace System::Threading;\r
-using namespace System::Collections::Generic;\r
-using namespace System::Windows::Forms;\r
-\r
-namespace SlimDX\r
-{\r
-namespace DirectInput\r
-{\r
- Device::Device( DirectInput^ directInput, Guid subsystem )\r
- {\r
- IDirectInputDevice8* device;\r
- HRESULT hr = directInput->InternalPointer->CreateDevice( Utilities::ConvertManagedGuid( subsystem ), &device, NULL );\r
-\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- throw gcnew DirectInputException( Result::Last );\r
-\r
- Construct( device );\r
- }\r
-\r
- Result Device::SetCooperativeLevel( IntPtr handle, CooperativeLevel flags )\r
- {\r
- HRESULT hr = InternalPointer->SetCooperativeLevel( static_cast<HWND>( handle.ToPointer() ), static_cast<DWORD>( flags ) );\r
- return RECORD_DINPUT( hr );\r
- }\r
-\r
- Result Device::SetCooperativeLevel( Control^ control, CooperativeLevel flags )\r
- {\r
- return SetCooperativeLevel( control->Handle, flags );\r
- }\r
-\r
- Result Device::Acquire()\r
- {\r
- HRESULT hr = InternalPointer->Acquire();\r
- return RecordError( hr );\r
- }\r
-\r
- Result Device::Unacquire()\r
- {\r
- HRESULT hr = InternalPointer->Unacquire();\r
- return RecordError( hr );\r
- }\r
-\r
- Result Device::Poll()\r
- {\r
- HRESULT hr = InternalPointer->Poll();\r
- return RecordError( hr );\r
- }\r
-\r
- Result Device::RunControlPanel()\r
- {\r
- HRESULT hr = InternalPointer->RunControlPanel( NULL, 0 );\r
- return RECORD_DINPUT( hr );\r
- }\r
-\r
- Result Device::RunControlPanel( Control^ parent )\r
- {\r
- HRESULT hr = InternalPointer->RunControlPanel( static_cast<HWND>( parent->Handle.ToPointer() ), 0 );\r
- return RECORD_DINPUT( hr );\r
- }\r
-\r
- DeviceImageHeader Device::GetDeviceImages()\r
- {\r
- DIDEVICEIMAGEINFOHEADER header;\r
- memset( &header, 0, sizeof( DIDEVICEIMAGEINFOHEADER ) );\r
- header.dwSize = sizeof( DIDEVICEIMAGEINFOHEADER );\r
- header.dwSizeImageInfo = sizeof( DIDEVICEIMAGEINFO );\r
-\r
- HRESULT hr = InternalPointer->GetImageInfo( &header );\r
- if( RECORD_DINPUT( hr ).IsFailure || header.dwBufferUsed <= 0 )\r
- return DeviceImageHeader();\r
-\r
- stack_array<DIDEVICEIMAGEINFO> images = stackalloc( DIDEVICEIMAGEINFO, header.dwBufferUsed / sizeof( DIDEVICEIMAGEINFO ) );\r
- header.dwBufferSize = header.dwBufferUsed;\r
- header.lprgImageInfoArray = &images[0];\r
-\r
- hr = InternalPointer->GetImageInfo( &header );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return DeviceImageHeader();\r
-\r
- return DeviceImageHeader( header );\r
- }\r
-\r
- EffectInfo Device::GetEffectInfo( Guid guid )\r
- {\r
- GUID nativeGuid = Utilities::ConvertManagedGuid( guid );\r
- DIEFFECTINFO info;\r
- info.dwSize = sizeof( DIEFFECTINFO );\r
-\r
- HRESULT hr = InternalPointer->GetEffectInfo( &info, nativeGuid );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return EffectInfo();\r
-\r
- return EffectInfo( info );\r
- }\r
-\r
- Result Device::SendData( array<ObjectData>^ data, bool overlay )\r
- {\r
- DWORD count = data->Length;\r
- stack_array<DIDEVICEOBJECTDATA> input = stackalloc( DIDEVICEOBJECTDATA, count );\r
-\r
- for( UINT i = 0; i < count; i++ )\r
- {\r
- input[i].dwOfs = data[i].Instance;\r
- input[i].dwData = data[i].Data;\r
- }\r
-\r
- HRESULT hr = InternalPointer->SendDeviceData( sizeof( DIDEVICEOBJECTDATA ), &input[0], &count, overlay ? DISDD_CONTINUE : 0 );\r
- return RECORD_DINPUT( hr );\r
- }\r
-\r
- DeviceObjectInstance Device::GetObjectInfoByUsage( int usageCode )\r
- {\r
- DIDEVICEOBJECTINSTANCE di;\r
- di.dwSize = sizeof( DIDEVICEOBJECTINSTANCE );\r
-\r
- HRESULT hr = InternalPointer->GetObjectInfo( &di, usageCode, DIPH_BYUSAGE );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return DeviceObjectInstance();\r
-\r
- return DeviceObjectInstance( di );\r
- }\r
-\r
- DeviceObjectInstance Device::GetObjectInfoById( int objectId )\r
- {\r
- DIDEVICEOBJECTINSTANCE di;\r
- di.dwSize = sizeof( DIDEVICEOBJECTINSTANCE );\r
-\r
- HRESULT hr = InternalPointer->GetObjectInfo( &di, objectId, DIPH_BYID );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return DeviceObjectInstance();\r
-\r
- return DeviceObjectInstance( di );\r
- }\r
-\r
- SlimDX::DirectInput::Capabilities^ Device::Capabilities::get()\r
- {\r
- if( caps != nullptr )\r
- return caps;\r
-\r
- DIDEVCAPS c;\r
- c.dwSize = sizeof( DIDEVCAPS );\r
- HRESULT hr = InternalPointer->GetCapabilities( &c );\r
- \r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- caps = nullptr;\r
-\r
- caps = gcnew SlimDX::DirectInput::Capabilities( c );\r
- return caps;\r
- }\r
-\r
- DeviceInstance^ Device::Information::get()\r
- {\r
- if( information != nullptr )\r
- return information;\r
-\r
- DIDEVICEINSTANCE deviceInstance;\r
- deviceInstance.dwSize = sizeof(DIDEVICEINSTANCE);\r
- HRESULT hr = InternalPointer->GetDeviceInfo( &deviceInstance );\r
- \r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- information = nullptr;\r
-\r
- information = gcnew DeviceInstance( deviceInstance );\r
-\r
- return information;\r
- }\r
-\r
- IList<DeviceObjectInstance>^ Device::GetObjects()\r
- {\r
- return GetObjects( ObjectDeviceType::All );\r
- }\r
-\r
- IList<DeviceObjectInstance>^ Device::GetObjects( ObjectDeviceType objectType )\r
- {\r
- List<DeviceObjectInstance>^ results = gcnew List<DeviceObjectInstance>();\r
- CollectionShim<DeviceObjectInstance> shim( results );\r
-\r
- HRESULT hr = InternalPointer->EnumObjects( static_cast<LPDIENUMDEVICEOBJECTSCALLBACK>( EnumerateObjects ), &shim, static_cast<DWORD>( objectType ) );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return results;\r
- }\r
-\r
- IList<EffectInfo>^ Device::GetEffects()\r
- {\r
- return GetEffects( EffectType::All );\r
- }\r
-\r
- IList<EffectInfo>^ Device::GetEffects( EffectType type )\r
- {\r
- List<EffectInfo>^ results = gcnew List<EffectInfo>();\r
- CollectionShim<EffectInfo> shim( results );\r
-\r
- HRESULT hr = InternalPointer->EnumEffects( static_cast<LPDIENUMEFFECTSCALLBACK>( EnumerateEffects ), &shim, static_cast<DWORD>( type ) );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return results;\r
- }\r
-\r
- IList<EffectFile>^ Device::GetEffectsInFile( String^ fileName )\r
- {\r
- return GetEffectsInFile( fileName, EffectFileFlags::None );\r
- }\r
-\r
- IList<EffectFile>^ Device::GetEffectsInFile( String^ fileName, EffectFileFlags flags )\r
- {\r
- List<EffectFile>^ results = gcnew List<EffectFile>();\r
- CollectionShim<EffectFile> shim( results );\r
- pin_ptr<const wchar_t> pinnedName = PtrToStringChars( fileName );\r
-\r
- HRESULT hr = InternalPointer->EnumEffectsInFile( reinterpret_cast<LPCWSTR>( pinnedName ), \r
- static_cast<LPDIENUMEFFECTSINFILECALLBACK>( EnumerateEffectsInFile ), &shim, static_cast<DWORD>( flags ) );\r
-\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return results;\r
- }\r
-\r
- Result Device::WriteEffectsToFile( String^ fileName, array<EffectFile>^ effects )\r
- {\r
- return WriteEffectsToFile( fileName, effects, false );\r
- }\r
-\r
- Result Device::WriteEffectsToFile( String^ fileName, array<EffectFile>^ effects, bool includeNonstandardEffects )\r
- {\r
- pin_ptr<const wchar_t> pinnedName = PtrToStringChars( fileName );\r
- stack_array<DIFILEEFFECT> entries = stackalloc( DIFILEEFFECT, effects->Length );\r
-\r
- for( int i = 0; i < effects->Length; i++ )\r
- entries[i] = effects[i].ToUnmanaged();\r
-\r
- HRESULT hr = InternalPointer->WriteEffectToFile( reinterpret_cast<LPCWSTR>( pinnedName ), effects->Length,\r
- &entries[0], includeNonstandardEffects ? DIFEF_INCLUDENONSTANDARD : 0 );\r
-\r
- for( int i = 0; i < effects->Length; i++ )\r
- delete entries[i].lpDiEffect;\r
-\r
- return RECORD_DINPUT( hr );\r
- }\r
-\r
- Result Device::SetNotification( WaitHandle^ eventHandle )\r
- {\r
- HRESULT hr = InternalPointer->SetEventNotification( eventHandle->SafeWaitHandle->DangerousGetHandle().ToPointer() );\r
- return RECORD_DINPUT( hr );\r
- }\r
-\r
- ObjectProperties^ Device::GetObjectPropertiesById( int objectId )\r
- {\r
- return gcnew ObjectProperties( InternalPointer, objectId, false );\r
- }\r
-\r
- ObjectProperties^ Device::GetObjectPropertiesByUsage( int usageCode )\r
- {\r
- return gcnew ObjectProperties( InternalPointer, usageCode, true );\r
- }\r
-\r
- array<Byte>^ Device::Escape( int command, array<Byte>^ data, int outputSize )\r
- {\r
- array<Byte>^ output = gcnew array<Byte>( outputSize );\r
-\r
- pin_ptr<Byte> pinnedData = &data[0];\r
- pin_ptr<Byte> pinnedOutput = &output[0];\r
-\r
- DIEFFESCAPE input;\r
- input.dwSize = sizeof(DIEFFESCAPE);\r
- input.dwCommand = command;\r
- input.cbInBuffer = data->Length;\r
- input.cbOutBuffer = output->Length;\r
- input.lpvInBuffer = pinnedData;\r
- input.lpvOutBuffer = pinnedOutput;\r
-\r
- HRESULT hr = InternalPointer->Escape( &input );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return output;\r
- }\r
-\r
- DeviceProperties^ Device::Properties::get()\r
- {\r
- if( properties == nullptr )\r
- properties = gcnew DeviceProperties( InternalPointer );\r
-\r
- return properties;\r
- }\r
-\r
- IList<Effect^>^ Device::CreatedEffects::get()\r
- {\r
- List<Effect^>^ results = gcnew List<Effect^>();\r
- CollectionShim<Effect^> shim( results );\r
-\r
- HRESULT hr = InternalPointer->EnumCreatedEffectObjects( static_cast<LPDIENUMCREATEDEFFECTOBJECTSCALLBACK>( EnumerateCreatedEffectObjects ), &shim, 0 );\r
- if( RECORD_DINPUT( hr ).IsFailure )\r
- return nullptr;\r
-\r
- return results;\r
- }\r
-}\r
-}\r