Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1127 lines
33 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1998 - 1999
  6. //
  7. // File: dinputdeviceobj.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. // dDrawColorControlObj.cpp : Implementation of CDirectApp and DLL registration.
  11. // DHF_DS entire file
  12. #include "stdafx.h"
  13. #include "Direct.h"
  14. #include "dms.h"
  15. #include "dienumDeviceObjectsObj.h"
  16. #include "dIEnumEffectsObj.h"
  17. #include "dInputdeviceObj.h"
  18. #include "dInputEffectObj.h"
  19. #include "didevInstObj.h"
  20. #include "didevObjInstObj.h"
  21. //TODO move to typlib enum
  22. #define dfDIKeyboard 1
  23. #define dfDIMouse 2
  24. #define dfDIJoystick 3
  25. #define dfDIJoystick2 4
  26. #define dfDIMouse2 5
  27. extern HRESULT FixUpCoverEffect(GUID g, DIEFFECT_CDESC *cover,DIEFFECT *realEffect);
  28. extern HRESULT FixUpRealEffect(GUID g,DIEFFECT *realEffect,DIEFFECT_CDESC *cover);
  29. extern HRESULT DINPUTBSTRtoGUID(LPGUID pGuid,BSTR str);
  30. extern BSTR DINPUTGUIDtoBSTR(LPGUID pg);
  31. extern HRESULT FillRealActionFormat(DIACTIONFORMATW *real, DIACTIONFORMAT_CDESC *cover, SAFEARRAY **actionArray,long ActionCount );
  32. #define SAFE_DELETE(p) { if(p) { delete (p); p=NULL; } }
  33. HRESULT C_dxj_DirectInputDevice8Object::init()
  34. {
  35. nFormat=0;
  36. return S_OK;
  37. }
  38. HRESULT C_dxj_DirectInputDevice8Object::cleanup()
  39. {
  40. return S_OK;
  41. }
  42. CONSTRUCTOR(_dxj_DirectInputDevice8, {init();});
  43. DESTRUCTOR(_dxj_DirectInputDevice8, {cleanup();});
  44. //NOTE get set for Device object
  45. // must use QI to get at other objects.
  46. GETSET_OBJECT(_dxj_DirectInputDevice8);
  47. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceObjectsEnum(
  48. /* [in] */ long flags,
  49. /* [retval][out] */ I_dxj_DIEnumDeviceObjects **ppret)
  50. {
  51. HRESULT hr;
  52. hr=C_dxj_DIEnumDeviceObjectsObject::create(m__dxj_DirectInputDevice8,flags,ppret);
  53. return hr;
  54. }
  55. STDMETHODIMP C_dxj_DirectInputDevice8Object::acquire(){
  56. return m__dxj_DirectInputDevice8->Acquire();
  57. }
  58. STDMETHODIMP C_dxj_DirectInputDevice8Object::getCapabilities(DIDEVCAPS_CDESC *caps)
  59. {
  60. //DIDevCaps same in VB/Java as in C
  61. caps->lSize=sizeof(DIDEVCAPS);
  62. HRESULT hr=m__dxj_DirectInputDevice8->GetCapabilities((DIDEVCAPS*)caps);
  63. return hr;
  64. }
  65. //VB cant return sucess codes so we will return an error code
  66. #define VB_DI_BUFFEROVERFLOW 0x80040260
  67. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceData(
  68. /* [in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *deviceObjectDataArray,
  69. /* [in] */ long flags,
  70. long *ret)
  71. {
  72. HRESULT hr;
  73. if ((*deviceObjectDataArray)->cDims!=1) return E_INVALIDARG;
  74. if ((*deviceObjectDataArray)->cbElements!=sizeof(DIDEVICEOBJECTDATA)) return E_INVALIDARG;
  75. DWORD dwC= (*deviceObjectDataArray)->rgsabound[0].cElements;
  76. if (dwC==0) return E_INVALIDARG;
  77. LPDIDEVICEOBJECTDATA pobjData=(LPDIDEVICEOBJECTDATA)((SAFEARRAY*)*deviceObjectDataArray)->pvData;
  78. hr=m__dxj_DirectInputDevice8->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), pobjData, (DWORD*)&dwC,flags);
  79. *ret=dwC;
  80. if (hr==DI_BUFFEROVERFLOW) hr= VB_DI_BUFFEROVERFLOW;
  81. return hr;
  82. }
  83. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceInfo(
  84. /* [out] */ I_dxj_DirectInputDeviceInstance8 __RPC_FAR **info)
  85. {
  86. HRESULT hr;
  87. DIDEVICEINSTANCEW inst;
  88. ZeroMemory(&inst,sizeof(DIDEVICEINSTANCEW));
  89. inst.dwSize=sizeof(DIDEVICEINSTANCEW);
  90. hr=m__dxj_DirectInputDevice8->GetDeviceInfo(&inst);
  91. if FAILED(hr) return hr;
  92. hr=C_dxj_DIDeviceInstance8Object::create(&inst,info);
  93. return hr;
  94. }
  95. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceStateKeyboard(
  96. /* [out] */ DIKEYBOARDSTATE_CDESC __RPC_FAR *state)
  97. {
  98. HRESULT hr;
  99. if ((nFormat!= dfDIKeyboard) && (nFormat!=-1)) return DIERR_NOTINITIALIZED ;
  100. hr=m__dxj_DirectInputDevice8->GetDeviceState(256,(void*)state->key);
  101. return hr;
  102. }
  103. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceStateMouse(
  104. /* [out] */ DIMOUSESTATE_CDESC __RPC_FAR *state)
  105. {
  106. HRESULT hr;
  107. if ((nFormat!= dfDIMouse) && (nFormat!=-1)) return DIERR_NOTINITIALIZED;
  108. hr=m__dxj_DirectInputDevice8->GetDeviceState(sizeof(DIMOUSESTATE),(void*)state);
  109. return hr;
  110. }
  111. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceStateMouse2(
  112. /* [out] */ DIMOUSESTATE2_CDESC __RPC_FAR *state)
  113. {
  114. HRESULT hr;
  115. if ((nFormat!= dfDIMouse2) && (nFormat!=-1)) return DIERR_NOTINITIALIZED;
  116. hr=m__dxj_DirectInputDevice8->GetDeviceState(sizeof(DIMOUSESTATE2),(void*)state);
  117. return hr;
  118. }
  119. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceStateJoystick(
  120. /* [out] */ DIJOYSTATE_CDESC __RPC_FAR *state)
  121. {
  122. HRESULT hr;
  123. //note Joystick1 or Joystick2 are valid formats since
  124. //one is a superset of the other
  125. if ((nFormat!= dfDIJoystick)&&(nFormat!= dfDIJoystick2) && (nFormat!=-1)) return DIERR_NOTINITIALIZED;
  126. hr=m__dxj_DirectInputDevice8->GetDeviceState(sizeof(DIJOYSTATE),(void*)state);
  127. return hr;
  128. }
  129. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceStateJoystick2(
  130. /* [out] */ DIJOYSTATE2_CDESC __RPC_FAR *state)
  131. {
  132. HRESULT hr;
  133. //only for format2
  134. if ((nFormat!= dfDIJoystick2) && (nFormat!=-1)) return DIERR_NOTINITIALIZED;
  135. hr=m__dxj_DirectInputDevice8->GetDeviceState(sizeof(DIJOYSTATE2),(void*)state);
  136. return hr;
  137. }
  138. STDMETHODIMP C_dxj_DirectInputDevice8Object::getDeviceState(
  139. /* [in] */ long cb,
  140. /* [in] */ void *pFormat)
  141. {
  142. HRESULT hr;
  143. __try {
  144. hr=m__dxj_DirectInputDevice8->GetDeviceState((DWORD) cb,(void*)pFormat);
  145. }
  146. __except(1,1){
  147. hr=E_INVALIDARG;
  148. }
  149. return hr;
  150. }
  151. STDMETHODIMP C_dxj_DirectInputDevice8Object::getObjectInfo(
  152. /* [in] */ long obj,
  153. /* [in] */ long how,
  154. I_dxj_DirectInputDeviceObjectInstance **ret)
  155. {
  156. DIDEVICEOBJECTINSTANCEW inst;
  157. ZeroMemory(&inst,sizeof(DIDEVICEOBJECTINSTANCEW));
  158. inst.dwSize=sizeof(DIDEVICEOBJECTINSTANCEW);
  159. HRESULT hr;
  160. hr=m__dxj_DirectInputDevice8->GetObjectInfo(&inst,(DWORD) obj,(DWORD)how);
  161. if FAILED(hr) return hr;
  162. hr=C_dxj_DIDeviceObjectInstanceObject::create(&inst,ret);
  163. return hr;
  164. /* DEAD
  165. //TODO - consider what is going on here carefully
  166. if (instCover->strGuidType) SysFreeString(instCover->strGuidType);
  167. if (instCover->strName) SysFreeString(instCover->strName);
  168. //TODO - consider localization
  169. if (inst.tszName){
  170. instCover->strName=T2BSTR(inst.tszName);
  171. }
  172. instCover->strGuidType=DINPUTGUIDtoBSTR(&inst.guidType);
  173. instCover->lOfs=inst.dwOfs;
  174. instCover->lType=inst.dwType;
  175. instCover->lFlags=inst.dwFlags;
  176. instCover->lFFMaxForce=inst.dwFFMaxForce;
  177. instCover->lFFForceResolution=inst.dwFFForceResolution;
  178. instCover->nCollectionNumber=inst.wCollectionNumber;
  179. instCover->nDesignatorIndex=inst.wDesignatorIndex;
  180. instCover->nUsagePage=inst.wUsagePage;
  181. instCover->nUsage=inst.wUsage;
  182. instCover->lDimension=inst.dwDimension;
  183. instCover->nExponent=inst.wExponent;
  184. instCover->nReserved=inst.wReserved;
  185. return hr;
  186. */
  187. }
  188. STDMETHODIMP C_dxj_DirectInputDevice8Object::runControlPanel(
  189. #ifdef _WIN64
  190. /* [in] */ HWND hwnd)
  191. #else
  192. /* [in] */ long hwnd)
  193. #endif
  194. {
  195. HRESULT hr;
  196. hr=m__dxj_DirectInputDevice8->RunControlPanel((HWND) hwnd,(DWORD)0);
  197. return hr;
  198. }
  199. STDMETHODIMP C_dxj_DirectInputDevice8Object::setCooperativeLevel(
  200. #ifdef _WIN64
  201. /* [in] */ HWND hwnd,
  202. #else
  203. /* [in] */ long hwnd,
  204. #endif
  205. /* [in] */ long flags)
  206. {
  207. HRESULT hr;
  208. hr=m__dxj_DirectInputDevice8->SetCooperativeLevel((HWND) hwnd,(DWORD)flags);
  209. return hr;
  210. }
  211. STDMETHODIMP C_dxj_DirectInputDevice8Object::poll()
  212. {
  213. HRESULT hr;
  214. hr=m__dxj_DirectInputDevice8->Poll();
  215. return hr;
  216. }
  217. STDMETHODIMP C_dxj_DirectInputDevice8Object::setCommonDataFormat(
  218. /* [in] */ long format)
  219. {
  220. //variant so that when structs can be packed in VARIANTS we can take care of it
  221. HRESULT hr;
  222. //� c_dfDIKeyboard
  223. //� c_dfDIMouse
  224. //� c_dfDIJoystick
  225. //� c_dfDIJoystick2
  226. nFormat=format;
  227. switch(format){
  228. case dfDIKeyboard:
  229. hr=m__dxj_DirectInputDevice8->SetDataFormat(&c_dfDIKeyboard);
  230. break;
  231. case dfDIMouse:
  232. hr=m__dxj_DirectInputDevice8->SetDataFormat(&c_dfDIMouse);
  233. break;
  234. case dfDIJoystick:
  235. hr=m__dxj_DirectInputDevice8->SetDataFormat(&c_dfDIJoystick);
  236. break;
  237. case dfDIJoystick2:
  238. hr=m__dxj_DirectInputDevice8->SetDataFormat(&c_dfDIJoystick2);
  239. break;
  240. case dfDIMouse2:
  241. hr=m__dxj_DirectInputDevice8->SetDataFormat(&c_dfDIMouse2);
  242. break;
  243. default:
  244. return E_INVALIDARG;
  245. }
  246. return hr;
  247. }
  248. STDMETHODIMP C_dxj_DirectInputDevice8Object::setDataFormat(
  249. /* [in] */ DIDATAFORMAT_CDESC __RPC_FAR *format,
  250. SAFEARRAY __RPC_FAR * __RPC_FAR *formatArray)
  251. {
  252. HRESULT hr;
  253. LPDIDATAFORMAT pFormat=(LPDIDATAFORMAT)format;
  254. GUID *pGuid = NULL;
  255. GUID *pGuidArray = NULL;
  256. DIOBJECTDATAFORMAT_CDESC *pDiDataFormat=NULL;
  257. if ((!format) || (!formatArray))
  258. {
  259. DPF(1,"------ DXVB: Nothing passed in.. \n");
  260. return E_INVALIDARG;
  261. }
  262. if (((SAFEARRAY*)*formatArray)->cDims != 1)
  263. {
  264. return E_INVALIDARG;
  265. }
  266. if (((SAFEARRAY*)*formatArray)->rgsabound[0].cElements < pFormat->dwNumObjs)
  267. {
  268. return E_INVALIDARG;
  269. }
  270. __try {
  271. pFormat->dwSize=sizeof(DIDATAFORMAT);
  272. pFormat->rgodf = NULL;
  273. pFormat->rgodf = new DIOBJECTDATAFORMAT[pFormat->dwNumObjs];
  274. if (!pFormat->rgodf)
  275. {
  276. DPF(1,"------ DXVB: Out of memory (pFormat->rgodf) \n");
  277. return E_OUTOFMEMORY;
  278. }
  279. pGuidArray=new GUID[pFormat->dwNumObjs];
  280. if (!pGuidArray){
  281. DPF(1,"------ DXVB: Out of memory (pGuidArray), Freeing pFormat->rgodf \n");
  282. SAFE_DELETE(pFormat->rgodf);
  283. return E_OUTOFMEMORY;
  284. }
  285. for (DWORD i=0; i< pFormat->dwNumObjs;i++){
  286. DPF1(1,"------ DXVB: Filling array item %d \n",i);
  287. pGuid=&(pGuidArray[i]);
  288. pDiDataFormat=&(((DIOBJECTDATAFORMAT_CDESC*)((SAFEARRAY*)*formatArray)->pvData)[i]);
  289. hr=DINPUTBSTRtoGUID(pGuid, pDiDataFormat->strGuid);
  290. if FAILED(hr) {
  291. DPF(1,"------ DXVB: DInputBstrToGuid Failed, free memory \n");
  292. SAFE_DELETE(pGuidArray);
  293. SAFE_DELETE(pFormat->rgodf);
  294. pFormat->rgodf=NULL;
  295. return hr;
  296. }
  297. pFormat->rgodf[i].pguid=pGuid;
  298. pFormat->rgodf[i].dwOfs=pDiDataFormat->lOfs;
  299. pFormat->rgodf[i].dwType=pDiDataFormat->lType;
  300. pFormat->rgodf[i].dwFlags=pDiDataFormat->lFlags;
  301. }
  302. DPF(1,"------ DXVB: Call SetDataFormat \n");
  303. hr=m__dxj_DirectInputDevice8->SetDataFormat(pFormat);
  304. DPF(1,"------ DXVB: Free Memory \n");
  305. SAFE_DELETE(pGuidArray);
  306. SAFE_DELETE(pFormat->rgodf);
  307. }
  308. __except(EXCEPTION_EXECUTE_HANDLER)
  309. {
  310. SAFE_DELETE(pGuidArray);
  311. SAFE_DELETE(pFormat->rgodf);
  312. return E_INVALIDARG;
  313. }
  314. //indicate we have a custom format
  315. nFormat=-1;
  316. return hr;
  317. }
  318. #ifdef _WIN64
  319. STDMETHODIMP C_dxj_DirectInputDevice8Object::setEventNotification(
  320. /* [in] */ HANDLE hEvent)
  321. #else
  322. STDMETHODIMP C_dxj_DirectInputDevice8Object::setEventNotification(
  323. /* [in] */ long hEvent)
  324. #endif
  325. {
  326. HRESULT hr=m__dxj_DirectInputDevice8->SetEventNotification((HANDLE)hEvent);
  327. return hr;
  328. }
  329. // NOTE: - current working implemtation promotes
  330. // code bloat
  331. // might want to revist this and do it in a more
  332. // tidy fasion
  333. //
  334. STDMETHODIMP C_dxj_DirectInputDevice8Object::getProperty(
  335. /* [in] */ BSTR str,
  336. /* [out] */ void __RPC_FAR *propertyInfo)
  337. {
  338. HRESULT hr;
  339. if (!propertyInfo) return E_INVALIDARG;
  340. DIPROPDWORD dipdw;
  341. DIPROPRANGE dipr;
  342. DIPROPSTRING dips;
  343. //For bug #41819
  344. DIPROPGUIDANDPATH dipgap;
  345. DIPROPCPOINTS dipcp;
  346. DIPROPPOINTER dipp;
  347. //End bug #41819
  348. dipdw.diph.dwSize=sizeof(DIPROPDWORD);
  349. dipdw.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  350. dipdw.diph.dwObj=((DIPROPLONG_CDESC*)propertyInfo)->lObj;
  351. dipdw.diph.dwHow=((DIPROPLONG_CDESC*)propertyInfo)->lHow;
  352. dipr.diph.dwSize=sizeof(DIPROPRANGE);
  353. dipr.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  354. dipr.diph.dwObj=((DIPROPLONG_CDESC*)propertyInfo)->lObj;
  355. dipr.diph.dwHow=((DIPROPLONG_CDESC*)propertyInfo)->lHow;
  356. dips.diph.dwSize=sizeof(DIPROPSTRING);
  357. dips.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  358. dips.diph.dwObj=((DIPROPSTRING_CDESC *)propertyInfo)->lObj;
  359. dips.diph.dwHow=((DIPROPSTRING_CDESC *)propertyInfo)->lHow;
  360. //For bug #41819
  361. dipgap.diph.dwSize=sizeof(DIPROPGUIDANDPATH);
  362. dipgap.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  363. dipgap.diph.dwObj=0;
  364. dipgap.diph.dwHow=((DIPROPLONG_CDESC *)propertyInfo)->lHow;
  365. dipcp.diph.dwSize=sizeof(DIPROPCPOINTS);
  366. dipcp.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  367. dipcp.diph.dwObj=((DIPROPLONG_CDESC *)propertyInfo)->lObj;
  368. dipcp.diph.dwHow=((DIPROPLONG_CDESC *)propertyInfo)->lHow;
  369. dipp.diph.dwSize=sizeof(DIPROPPOINTER);
  370. dipp.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  371. dipp.diph.dwObj=((DIPROPLONG_CDESC *)propertyInfo)->lObj;
  372. dipp.diph.dwHow=((DIPROPLONG_CDESC *)propertyInfo)->lHow;
  373. //End bug #41819
  374. if( 0==_wcsicmp(str,L"diprop_buffersize")){
  375. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_BUFFERSIZE,(DIPROPHEADER*)&dipdw);
  376. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  377. }
  378. else if( 0==_wcsicmp(str,L"diprop_axismode")){
  379. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_AXISMODE,(DIPROPHEADER*)&dipdw);
  380. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  381. }
  382. else if( 0==_wcsicmp(str,L"diprop_granularity")){
  383. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_GRANULARITY,(DIPROPHEADER*)&dipdw);
  384. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  385. }
  386. //else if( 0==_wcsicmp(str,L"diprop_getlogicalrange")){
  387. // hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_GETLOGICALRANGE,(DIPROPHEADER*)&dipr);
  388. // ((DIPROPRANGE_CDESC*)propertyInfo)->lMin=(long)dipdw.lMin;
  389. // ((DIPROPRANGE_CDESC*)propertyInfo)->lMax=(long)dipdw.lMax;
  390. //}
  391. //else if( 0==_wcsicmp(str,L"diprop_getlogicalrange")){
  392. // hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_GETPHYSICALLRANGE,(DIPROPHEADER*)&dipr);
  393. // ((DIPROPRANGE_CDESC*)propertyInfo)->lMin=(long)dipdw.lMin;
  394. // ((DIPROPRANGE_CDESC*)propertyInfo)->lMax=(long)dipdw.lMax;
  395. //}
  396. else if( 0==_wcsicmp(str,L"diprop_range")){
  397. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_RANGE,(DIPROPHEADER*)&dipr);
  398. ((DIPROPRANGE_CDESC*)propertyInfo)->lMin=(long)dipr.lMin;
  399. ((DIPROPRANGE_CDESC*)propertyInfo)->lMax=(long)dipr.lMax;
  400. }
  401. else if( 0==_wcsicmp(str,L"diprop_deadzone")){
  402. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_DEADZONE,(DIPROPHEADER*)&dipdw);
  403. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  404. }
  405. else if( 0==_wcsicmp(str,L"diprop_ffgain")){
  406. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_FFGAIN,(DIPROPHEADER*)&dipdw);
  407. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  408. }
  409. else if( 0==_wcsicmp(str,L"diprop_ffload")){
  410. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_FFLOAD,(DIPROPHEADER*)&dipdw);
  411. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  412. }
  413. else if( 0==_wcsicmp(str,L"diprop_getportdisplayname")){
  414. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_GETPORTDISPLAYNAME,(DIPROPHEADER*)&dips);
  415. if FAILED(hr) return hr;
  416. ((DIPROPSTRING_CDESC*)propertyInfo)->PropString=SysAllocString(dips.wsz);
  417. }
  418. else if( 0==_wcsicmp(str,L"diprop_instancename")){
  419. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_INSTANCENAME,(DIPROPHEADER*)&dips);
  420. if FAILED(hr) return hr;
  421. ((DIPROPSTRING_CDESC*)propertyInfo)->PropString=SysAllocString(dips.wsz);
  422. }
  423. else if( 0==_wcsicmp(str,L"diprop_keyname")){
  424. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_KEYNAME,(DIPROPHEADER*)&dips);
  425. if FAILED(hr) return hr;
  426. ((DIPROPSTRING_CDESC*)propertyInfo)->PropString=SysAllocString(dips.wsz);
  427. }
  428. else if( 0==_wcsicmp(str,L"diprop_productname")){
  429. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_PRODUCTNAME,(DIPROPHEADER*)&dips);
  430. if FAILED(hr) return hr;
  431. ((DIPROPSTRING_CDESC*)propertyInfo)->PropString=SysAllocString(dips.wsz);
  432. }
  433. else if( 0==_wcsicmp(str,L"diprop_username")){
  434. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_USERNAME,(DIPROPHEADER*)&dips);
  435. if FAILED(hr) return hr;
  436. ((DIPROPSTRING_CDESC*)propertyInfo)->PropString=SysAllocString(dips.wsz);
  437. }
  438. else if( 0==_wcsicmp(str,L"diprop_saturation")){
  439. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_SATURATION,(DIPROPHEADER*)&dipdw);
  440. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  441. }
  442. else if( 0==_wcsicmp(str,L"diprop_scancode")){
  443. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_SCANCODE,(DIPROPHEADER*)&dipdw);
  444. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  445. }
  446. else if( 0==_wcsicmp(str,L"diprop_autocenter")){
  447. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_AUTOCENTER,(DIPROPHEADER*)&dipdw);
  448. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  449. }
  450. else if( 0==_wcsicmp(str,L"diprop_joystickid")){
  451. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_JOYSTICKID,(DIPROPHEADER*)&dipdw);
  452. ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  453. }
  454. //Added for bug #41819
  455. else if(0==_wcsicmp(str, L"diprop_calibration")){
  456. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_CALIBRATION,(DIPROPHEADER*)&dipdw);
  457. if (hr == S_OK) ((DIPROPLONG_CDESC*)propertyInfo)->lData=(long)dipdw.dwData;
  458. }
  459. else if (0==_wcsicmp(str, L"diprop_guidandpath")){
  460. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_GUIDANDPATH,(DIPROPHEADER*)&dipgap);
  461. if (hr == S_OK)
  462. {
  463. ((DIPROPGUIDANDPATH_CDESC*)propertyInfo)->Guid=DINPUTGUIDtoBSTR(&dipgap.guidClass);
  464. ((DIPROPGUIDANDPATH_CDESC*)propertyInfo)->Path=SysAllocString(dipgap.wszPath);
  465. }
  466. }
  467. else if (0==_wcsicmp(str, L"diprop_physicalrange")){
  468. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_PHYSICALRANGE,(DIPROPHEADER*)&dipr);
  469. if (hr == S_OK)
  470. {
  471. ((DIPROPRANGE_CDESC*)propertyInfo)->lMin=(long)dipr.lMin;
  472. ((DIPROPRANGE_CDESC*)propertyInfo)->lMax=(long)dipr.lMax;
  473. }
  474. }
  475. else if( 0==_wcsicmp(str,L"diprop_logicalrange")){
  476. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_LOGICALRANGE,(DIPROPHEADER*)&dipr);
  477. if (hr == S_OK)
  478. {
  479. ((DIPROPRANGE_CDESC*)propertyInfo)->lMin=(long)dipr.lMin;
  480. ((DIPROPRANGE_CDESC*)propertyInfo)->lMax=(long)dipr.lMax;
  481. }
  482. }
  483. else if( 0==_wcsicmp(str,L"diprop_cpoints")){
  484. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_CPOINTS,(DIPROPHEADER*)&dipcp);
  485. if (hr == S_OK)
  486. {
  487. ((DIPROPCPOINTS_CDESC*)propertyInfo)->dwCPointsNum=(long)dipcp.dwCPointsNum;
  488. __try{
  489. memcpy( (void*) (((DIPROPCPOINTS_CDESC*)propertyInfo)->cp), (void*)dipcp.cp, sizeof(CPOINT_CDESC) * dipcp.dwCPointsNum);
  490. }
  491. __except(1,1){
  492. return E_INVALIDARG;
  493. }
  494. }
  495. }
  496. else if(0==_wcsicmp(str,L"diprop_appdata")){
  497. hr=m__dxj_DirectInputDevice8->GetProperty(DIPROP_APPDATA,(DIPROPHEADER*)&dipp);
  498. if (hr == S_OK)
  499. {
  500. if FAILED(hr) return hr;
  501. ((DIPROPPOINTER_CDESC*)propertyInfo)->uData=(long)dipp.uData;
  502. }
  503. }
  504. //End bug #41819
  505. else {
  506. DPF(1, "DXVB: Invalid arguments passed in.\n");
  507. return E_INVALIDARG;
  508. }
  509. /*
  510. __try{
  511. ((DIPROPHEADER*)propertyInfo)->dwHeaderSize=sizeof(DIPROPHEADER);
  512. hr=m__dxj_DirectInputDevice8->GetProperty((REFGUID)g,(DIPROPHEADER*)propertyInfo);
  513. }
  514. __except(1,1){
  515. return E_INVALIDARG;
  516. }
  517. */
  518. if (FAILED(hr)) {
  519. DPF1(1, "DXVB: GetProperty returned: %d \n", hr);
  520. }
  521. return hr;
  522. }
  523. STDMETHODIMP C_dxj_DirectInputDevice8Object::setProperty(
  524. /* [in] */ BSTR __RPC_FAR str,
  525. /* [out] */ void __RPC_FAR *propertyInfo)
  526. {
  527. if (!propertyInfo) return E_INVALIDARG;
  528. HRESULT hr;
  529. DIPROPDWORD dipdw;
  530. dipdw.diph.dwSize=sizeof(DIPROPDWORD);
  531. dipdw.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  532. dipdw.diph.dwObj=((DIPROPLONG_CDESC*)propertyInfo)->lObj;
  533. dipdw.diph.dwHow=((DIPROPLONG_CDESC*)propertyInfo)->lHow;
  534. DIPROPSTRING dips;
  535. dips.diph.dwSize=sizeof(DIPROPSTRING);
  536. dips.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  537. dips.diph.dwObj=((DIPROPSTRING_CDESC *)propertyInfo)->lObj;
  538. dips.diph.dwHow=((DIPROPSTRING_CDESC *)propertyInfo)->lHow;
  539. DIPROPRANGE dipr;
  540. dipr.diph.dwSize=sizeof(DIPROPRANGE);
  541. dipr.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  542. dipr.diph.dwObj=((DIPROPLONG_CDESC*)propertyInfo)->lObj;
  543. dipr.diph.dwHow=((DIPROPLONG_CDESC*)propertyInfo)->lHow;
  544. //Added for bug #41819
  545. DIPROPPOINTER dipp;
  546. dipp.diph.dwSize=sizeof(DIPROPPOINTER);
  547. dipp.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  548. dipp.diph.dwObj=((DIPROPLONG_CDESC*)propertyInfo)->lObj;
  549. dipp.diph.dwHow=((DIPROPLONG_CDESC*)propertyInfo)->lHow;
  550. DIPROPCPOINTS dipcp;
  551. dipcp.diph.dwSize=sizeof(DIPROPCPOINTS);
  552. dipcp.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  553. dipcp.diph.dwObj=((DIPROPLONG_CDESC*)propertyInfo)->lObj;
  554. dipcp.diph.dwHow=((DIPROPLONG_CDESC*)propertyInfo)->lHow;
  555. //End bug #41819
  556. if( 0==_wcsicmp(str,L"diprop_buffersize")){
  557. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  558. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_BUFFERSIZE,(DIPROPHEADER*)&dipdw);
  559. }
  560. else if( 0==_wcsicmp(str,L"diprop_axismode")){
  561. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  562. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_AXISMODE,(DIPROPHEADER*)&dipdw);
  563. }
  564. else if( 0==_wcsicmp(str,L"diprop_range")){
  565. dipr.lMin=((DIPROPRANGE_CDESC*)propertyInfo)->lMin;
  566. dipr.lMax=((DIPROPRANGE_CDESC*)propertyInfo)->lMax;
  567. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_RANGE,(DIPROPHEADER*)&dipr);
  568. }
  569. else if( 0==_wcsicmp(str,L"diprop_deadzone")){
  570. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  571. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_DEADZONE,(DIPROPHEADER*)&dipdw);
  572. }
  573. else if( 0==_wcsicmp(str,L"diprop_ffgain")){
  574. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  575. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_FFGAIN,(DIPROPHEADER*)&dipdw);
  576. }
  577. else if( 0==_wcsicmp(str,L"diprop_saturation")){
  578. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  579. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_SATURATION,(DIPROPHEADER*)&dipdw);
  580. }
  581. else if( 0==_wcsicmp(str,L"diprop_autocenter")){
  582. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  583. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_AUTOCENTER,(DIPROPHEADER*)&dipdw);
  584. }
  585. else if( 0==_wcsicmp(str,L"diprop_calibrationmode")){
  586. dipdw.dwData=((DIPROPLONG_CDESC*)propertyInfo)->lData;
  587. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_CALIBRATIONMODE,(DIPROPHEADER*)&dipdw);
  588. }
  589. //Added for bug #41819
  590. else if( 0==_wcsicmp(str,L"diprop_appdata")){
  591. dipp.uData=((DIPROPPOINTER_CDESC *)propertyInfo)->uData;
  592. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_APPDATA,(DIPROPHEADER*)&dipp);
  593. }
  594. else if( 0==_wcsicmp(str,L"diprop_instancename")){
  595. wcscpy(dips.wsz,((DIPROPSTRING_CDESC *)propertyInfo)->PropString);
  596. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_INSTANCENAME,(DIPROPHEADER*)&dips);
  597. }
  598. else if( 0==_wcsicmp(str,L"diprop_productname")){
  599. wcscpy(dips.wsz, ((DIPROPSTRING_CDESC *)propertyInfo)->PropString);
  600. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_PRODUCTNAME,(DIPROPHEADER*)&dips);
  601. }
  602. else if( 0==_wcsicmp(str,L"diprop_cpoints")){
  603. dipcp.dwCPointsNum=((DIPROPCPOINTS_CDESC *)propertyInfo)->dwCPointsNum;
  604. __try{
  605. memcpy( (void*)dipcp.cp, (void*)((DIPROPCPOINTS_CDESC*)propertyInfo)->cp, sizeof(CPOINT_CDESC) * MAXCPOINTSNUM);
  606. }
  607. __except(1,1){
  608. DPF(1, "Invalid arguments passed in.\n");
  609. return E_INVALIDARG;
  610. }
  611. hr=m__dxj_DirectInputDevice8->SetProperty(DIPROP_CPOINTS,(DIPROPHEADER*)&dipcp);
  612. }
  613. //End bug #41819
  614. else {
  615. DPF(1, "Invalid arguments passed in.\n");
  616. return E_INVALIDARG;
  617. }
  618. /*
  619. __try {
  620. ((DIPROPHEADER*)propertyInfo)->dwHeaderSize=sizeof(DIPROPHEADER);
  621. hr=m__dxj_DirectInputDevice8->SetProperty((REFGUID)g,(DIPROPHEADER*)propertyInfo);
  622. }
  623. __except (1,1){
  624. return E_INVALIDARG;
  625. }
  626. */
  627. if (FAILED(hr)) {
  628. DPF1(1, "DXVB: SetProperty returned: %d \n", hr);
  629. }
  630. return hr;
  631. }
  632. STDMETHODIMP C_dxj_DirectInputDevice8Object::unacquire()
  633. {
  634. HRESULT hr=m__dxj_DirectInputDevice8->Unacquire();
  635. return hr;
  636. }
  637. STDMETHODIMP C_dxj_DirectInputDevice8Object::createEffect(
  638. /* [in] */ BSTR effectGuid,
  639. /* [in] */ DIEFFECT_CDESC __RPC_FAR *effectInfo,
  640. /* [retval][out] */ I_dxj_DirectInputEffect __RPC_FAR *__RPC_FAR *ret)
  641. {
  642. HRESULT hr;
  643. GUID g;
  644. DIEFFECT realEffect;
  645. LPDIRECTINPUTEFFECT pRealEffect=NULL;
  646. hr=DINPUTBSTRtoGUID(&g,effectGuid);
  647. if FAILED(hr) return hr;
  648. hr=FixUpRealEffect(g,&realEffect,effectInfo);
  649. if FAILED(hr) return hr;
  650. hr=m__dxj_DirectInputDevice8->CreateEffect(g,&realEffect,&pRealEffect,NULL);
  651. if FAILED(hr) return hr;
  652. INTERNAL_CREATE(_dxj_DirectInputEffect,pRealEffect,ret)
  653. return hr;
  654. }
  655. STDMETHODIMP C_dxj_DirectInputDevice8Object::createCustomEffect(
  656. /* [in] */ DIEFFECT_CDESC __RPC_FAR *effectInfo,
  657. /* [in] */ long channels,
  658. /* [in] */ long samplePeriod,
  659. /* [in] */ long nSamples,
  660. /* [in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *sampledata,
  661. /* [retval][out] */ I_dxj_DirectInputEffect __RPC_FAR *__RPC_FAR *ret)
  662. {
  663. HRESULT hr;
  664. GUID g=GUID_CustomForce;
  665. DIEFFECT realEffect;
  666. LPDIRECTINPUTEFFECT pRealEffect=NULL;
  667. hr=FixUpRealEffect(g,&realEffect,effectInfo);
  668. if FAILED(hr) return hr;
  669. DICUSTOMFORCE customData;
  670. customData.cChannels =(DWORD)channels;
  671. customData.cSamples =(DWORD)nSamples;
  672. customData.dwSamplePeriod =(DWORD)samplePeriod;
  673. customData.rglForceData = (long*)(*sampledata)->pvData;
  674. realEffect.lpvTypeSpecificParams=&customData;
  675. realEffect.cbTypeSpecificParams=sizeof(DICUSTOMFORCE);
  676. __try {
  677. hr=m__dxj_DirectInputDevice8->CreateEffect(g,&realEffect,&pRealEffect,NULL);
  678. }
  679. __except(1,1){
  680. return E_INVALIDARG;
  681. }
  682. if FAILED(hr) return hr;
  683. INTERNAL_CREATE(_dxj_DirectInputEffect,pRealEffect,ret)
  684. return hr;
  685. }
  686. STDMETHODIMP C_dxj_DirectInputDevice8Object::sendDeviceData(
  687. /* [in] */ long count,
  688. /* [in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *data,
  689. /* [in] */ long flags,
  690. /* [retval][out] */ long __RPC_FAR *retcount)
  691. {
  692. DWORD dwCount=count;
  693. HRESULT hr;
  694. __try {
  695. hr=m__dxj_DirectInputDevice8->SendDeviceData(
  696. sizeof(DIDEVICEOBJECTDATA),
  697. (DIDEVICEOBJECTDATA*)(*data)->pvData,
  698. &dwCount,
  699. (DWORD)flags);
  700. }
  701. __except(1,1){
  702. return E_INVALIDARG;
  703. }
  704. return hr;
  705. }
  706. STDMETHODIMP C_dxj_DirectInputDevice8Object::sendForceFeedbackCommand(
  707. /* [in] */ long flags)
  708. {
  709. HRESULT hr;
  710. hr=m__dxj_DirectInputDevice8->SendForceFeedbackCommand((DWORD)flags);
  711. return hr;
  712. }
  713. STDMETHODIMP C_dxj_DirectInputDevice8Object::getForceFeedbackState(
  714. /* [retval][out] */ long __RPC_FAR *state)
  715. {
  716. if (!state) return E_INVALIDARG;
  717. HRESULT hr;
  718. hr=m__dxj_DirectInputDevice8->GetForceFeedbackState((DWORD*)state);
  719. return hr;
  720. }
  721. STDMETHODIMP C_dxj_DirectInputDevice8Object::getEffectsEnum( long effType,
  722. I_dxj_DirectInputEnumEffects **ret)
  723. {
  724. HRESULT hr=C_dxj_DirectInputEnumEffectsObject::create(m__dxj_DirectInputDevice8,effType,ret);
  725. return hr;
  726. }
  727. STDMETHODIMP C_dxj_DirectInputDevice8Object::BuildActionMap(
  728. /* [out][in] */ DIACTIONFORMAT_CDESC __RPC_FAR *format,
  729. BSTR userName,
  730. /* [in] */ long flags)
  731. {
  732. HRESULT hr;
  733. DIACTIONFORMATW frmt;
  734. hr=FillRealActionFormat(&frmt, format, &(format->ActionArray), format->lActionCount);
  735. if FAILED(hr) return hr;
  736. hr=m__dxj_DirectInputDevice8->BuildActionMap(&frmt,(WCHAR*)userName,(DWORD) flags);
  737. return hr;
  738. }
  739. STDMETHODIMP C_dxj_DirectInputDevice8Object::SetActionMap(
  740. /* [out][in] */ DIACTIONFORMAT_CDESC __RPC_FAR *format,
  741. /* [in] */ BSTR username,
  742. /* [in] */ long flags)
  743. {
  744. HRESULT hr;
  745. DIACTIONFORMATW frmt;
  746. hr=FillRealActionFormat(&frmt, format, &(format->ActionArray), format->lActionCount);
  747. if FAILED(hr) return hr;
  748. hr=m__dxj_DirectInputDevice8->SetActionMap(&frmt,(LPWSTR) username,(DWORD) flags);
  749. return hr;
  750. }
  751. STDMETHODIMP C_dxj_DirectInputDevice8Object::GetImageInfoCount(
  752. long *retCount)
  753. {
  754. HRESULT hr;
  755. DIDEVICEIMAGEINFOHEADERW RealHeader;
  756. ZeroMemory(&RealHeader,sizeof(DIDEVICEIMAGEINFOHEADERW));
  757. RealHeader.dwSize= sizeof(DIDEVICEIMAGEINFOHEADERW);
  758. RealHeader.dwSizeImageInfo= sizeof(DIDEVICEIMAGEINFOW);
  759. //figure out how big to make our buffer
  760. hr=m__dxj_DirectInputDevice8->GetImageInfo(&RealHeader);
  761. if FAILED(hr) return hr;
  762. *retCount=RealHeader.dwBufferUsed / sizeof(DIDEVICEIMAGEINFOW);
  763. return S_OK;
  764. }
  765. STDMETHODIMP C_dxj_DirectInputDevice8Object::GetImageInfo(
  766. /* [out] */ DIDEVICEIMAGEINFOHEADER_CDESC __RPC_FAR *info)
  767. {
  768. HRESULT hr;
  769. if (!info) return E_INVALIDARG;
  770. DIDEVICEIMAGEINFOHEADERW RealHeader;
  771. ZeroMemory(&RealHeader,sizeof(DIDEVICEIMAGEINFOHEADERW));
  772. RealHeader.dwSize= sizeof(DIDEVICEIMAGEINFOHEADERW);
  773. RealHeader.dwSizeImageInfo= sizeof(DIDEVICEIMAGEINFOW);
  774. //figure out how big to make our buffer
  775. hr=m__dxj_DirectInputDevice8->GetImageInfo(&RealHeader);
  776. if FAILED(hr) return hr;
  777. //allocate the buffer
  778. RealHeader.lprgImageInfoArray =(DIDEVICEIMAGEINFOW*)malloc(RealHeader.dwBufferSize);
  779. if (!RealHeader.lprgImageInfoArray) return E_OUTOFMEMORY;
  780. //TODO validate that the safe array passed to us is large enough
  781. info->ImageCount =RealHeader.dwBufferSize / sizeof(DIDEVICEIMAGEINFOW);
  782. if (info->Images->rgsabound[0].cElements < (DWORD)info->ImageCount)
  783. {
  784. free(RealHeader.lprgImageInfoArray);
  785. return E_INVALIDARG;
  786. }
  787. for (long i =0 ;i<info->ImageCount;i++)
  788. {
  789. DIDEVICEIMAGEINFO_CDESC *pInfo=&( ( (DIDEVICEIMAGEINFO_CDESC*) (info->Images->pvData) )[i]);
  790. DIDEVICEIMAGEINFOW *pRealInfo= &(RealHeader.lprgImageInfoArray[i]);
  791. pInfo->ImagePath=SysAllocString(pRealInfo->tszImagePath);
  792. pInfo->Flags= (long)pRealInfo->dwFlags;
  793. pInfo->ViewID= (long)pRealInfo->dwViewID;
  794. pInfo->ObjId= (long)pRealInfo->dwObjID;
  795. pInfo->ValidPts= (long)pRealInfo->dwcValidPts;
  796. pInfo->TextAlign= (long)pRealInfo->dwTextAlign;
  797. memcpy(&(pInfo->OverlayRect),&(pRealInfo->rcOverlay),sizeof(RECT));
  798. memcpy(&(pInfo->CalloutLine[0]),&(pRealInfo->rgptCalloutLine[0]),sizeof(POINT)*5);
  799. memcpy(&(pInfo->CalloutRect),&(pRealInfo->rcCalloutRect),sizeof(RECT));
  800. }
  801. info->Views=RealHeader.dwcViews;
  802. info->Buttons=RealHeader.dwcButtons;
  803. info->Axes=RealHeader.dwcAxes;
  804. info->POVs=RealHeader.dwcPOVs;
  805. free(RealHeader.lprgImageInfoArray);
  806. return S_OK;
  807. }
  808. BOOL CALLBACK DIEnumEffectsInFileCallback( LPCDIFILEEFFECT lpDiFileEf, LPVOID pvRef)
  809. {
  810. HRESULT hr;
  811. EFFECTSINFILE *pData=(EFFECTSINFILE*)pvRef;
  812. if (0==lstrcmp(lpDiFileEf->szFriendlyName,pData->szEffect))
  813. {
  814. pData->hr=pData->pDev->CreateEffect(
  815. lpDiFileEf->GuidEffect,
  816. lpDiFileEf->lpDiEffect,
  817. &pData->pEff,
  818. NULL);
  819. return DIENUM_STOP;
  820. }
  821. return DIENUM_CONTINUE;
  822. }
  823. STDMETHODIMP C_dxj_DirectInputDevice8Object::CreateEffectFromFile(
  824. BSTR filename,
  825. long flags,
  826. BSTR effectName,
  827. I_dxj_DirectInputEffect **ret)
  828. {
  829. HRESULT hr;
  830. USES_CONVERSION;
  831. EFFECTSINFILE data;
  832. ZeroMemory(&data,sizeof(EFFECTSINFILE));
  833. data.hr=E_INVALIDARG; //returned if we dont find the file
  834. data.pDev=m__dxj_DirectInputDevice8;
  835. if (!effectName) return E_INVALIDARG;
  836. if (effectName[0]==0) return E_INVALIDARG;
  837. ZeroMemory(data.szEffect,sizeof(MAX_PATH));
  838. char *szOut = NULL;
  839. __try { szOut=W2T(effectName); } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  840. strcpy (data.szEffect, szOut);
  841. hr=m__dxj_DirectInputDevice8->EnumEffectsInFile((WCHAR*)filename,DIEnumEffectsInFileCallback,(void*)&data ,(DWORD)flags);
  842. if FAILED(hr) return hr;
  843. if FAILED(data.hr) return data.hr;
  844. INTERNAL_CREATE(_dxj_DirectInputEffect,data.pEff,ret);
  845. return hr;
  846. }
  847. STDMETHODIMP C_dxj_DirectInputDevice8Object::WriteEffectToFile(
  848. BSTR filename, long flags, BSTR guid,BSTR name, DIEFFECT_CDESC *CoverEffect)
  849. {
  850. USES_CONVERSION;
  851. HRESULT hr;
  852. DIEFFECT RealEffect;
  853. DIFILEEFFECT FileEffect;
  854. if (!filename) return E_INVALIDARG;
  855. if (!guid) return E_INVALIDARG;
  856. if (!name) return E_INVALIDARG;
  857. FileEffect.dwSize=sizeof(DIFILEEFFECT);
  858. FileEffect.lpDiEffect=&RealEffect;
  859. ZeroMemory(FileEffect.szFriendlyName,sizeof(MAX_PATH));
  860. char *szOut = NULL;
  861. __try { szOut=W2T(name); } __except(EXCEPTION_EXECUTE_HANDLER) { return E_FAIL; }
  862. strcpy (FileEffect.szFriendlyName, szOut);
  863. hr=DINPUTBSTRtoGUID(&FileEffect.GuidEffect,guid);
  864. if FAILED(hr) return hr;
  865. hr=FixUpRealEffect(FileEffect.GuidEffect,&RealEffect,CoverEffect);
  866. if FAILED(hr) return hr;
  867. hr=m__dxj_DirectInputDevice8->WriteEffectToFile(
  868. (WCHAR*) filename,
  869. 1,
  870. &FileEffect,
  871. (DWORD) flags);
  872. return hr;
  873. }