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.

246 lines
6.8 KiB

  1. // MoveFile.cpp: implementation of the CMoveFile class.
  2. //
  3. // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
  4. //
  5. //////////////////////////////////////////////////////////////////////
  6. #include "precomp.h"
  7. #include "MoveFile.h"
  8. #include "ExtendString.h"
  9. #include "ExtendQuery.h"
  10. //////////////////////////////////////////////////////////////////////
  11. // Construction/Destruction
  12. //////////////////////////////////////////////////////////////////////
  13. CMoveFile::CMoveFile(CRequestObject *pObj, IWbemServices *pNamespace,
  14. IWbemContext *pCtx):CGenericClass(pObj, pNamespace, pCtx)
  15. {
  16. }
  17. CMoveFile::~CMoveFile()
  18. {
  19. }
  20. HRESULT CMoveFile::CreateObject(IWbemObjectSink *pHandler, ACTIONTYPE atAction)
  21. {
  22. HRESULT hr = WBEM_S_NO_ERROR;
  23. MSIHANDLE hView = NULL;
  24. MSIHANDLE hRecord = NULL;
  25. int i = -1;
  26. WCHAR wcBuf[BUFF_SIZE];
  27. WCHAR wcProductCode[39];
  28. DWORD dwBufSize;
  29. bool bMatch = false;
  30. UINT uiStatus;
  31. bool bGotID = false;
  32. WCHAR wcAction[BUFF_SIZE];
  33. WCHAR wcTestCode[39];
  34. //These will change from class to class
  35. bool bActionID;
  36. SetSinglePropertyPath(L"ActionID");
  37. //improve getobject performance by optimizing the query
  38. if(atAction != ACTIONTYPE_ENUM)
  39. {
  40. // we are doing GetObject so we need to be reinitialized
  41. hr = WBEM_E_NOT_FOUND;
  42. BSTR bstrCompare;
  43. int iPos = -1;
  44. bstrCompare = SysAllocString ( L"ActionID" );
  45. if ( bstrCompare )
  46. {
  47. if(FindIn(m_pRequest->m_Property, bstrCompare, &iPos))
  48. {
  49. if ( ::SysStringLen ( m_pRequest->m_Value[iPos] ) < BUFF_SIZE )
  50. {
  51. //Get the action we're looking for
  52. wcscpy(wcBuf, m_pRequest->m_Value[iPos]);
  53. // safe operation if wcslen ( wcBuf ) > 38
  54. if ( wcslen ( wcBuf ) > 38 )
  55. {
  56. wcscpy(wcTestCode, &(wcBuf[(wcslen(wcBuf) - 38)]));
  57. }
  58. else
  59. {
  60. // we are not good to go, they have sent us longer string
  61. SysFreeString ( bstrCompare );
  62. throw hr;
  63. }
  64. // safe because lenght has been tested already in condition
  65. RemoveFinalGUID(m_pRequest->m_Value[iPos], wcAction);
  66. bGotID = true;
  67. }
  68. else
  69. {
  70. // we are not good to go, they have sent us longer string
  71. SysFreeString ( bstrCompare );
  72. throw hr;
  73. }
  74. }
  75. SysFreeString ( bstrCompare );
  76. }
  77. else
  78. {
  79. throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
  80. }
  81. }
  82. Query wcQuery;
  83. wcQuery.Append ( 1, L"select distinct `FileKey`, `Component_`, `SourceName`, `SourceFolder`, `DestName`, `DestFolder`, `Options` from MoveFile" );
  84. //optimize for GetObject
  85. if ( bGotID )
  86. {
  87. wcQuery.Append ( 3, L" where `FileKey`=\'", wcAction, L"\'" );
  88. }
  89. LPWSTR Buffer = NULL;
  90. LPWSTR dynBuffer = NULL;
  91. DWORD dwDynBuffer = 0L;
  92. while(!bMatch && m_pRequest->Package(++i) && (hr != WBEM_E_CALL_CANCELLED))
  93. {
  94. // safe operation:
  95. // Package ( i ) returns NULL ( tested above ) or valid WCHAR [39]
  96. wcscpy(wcProductCode, m_pRequest->Package(i));
  97. if((atAction == ACTIONTYPE_ENUM) || (bGotID && (_wcsicmp(wcTestCode, wcProductCode) == 0))){
  98. //Open our database
  99. try
  100. {
  101. if ( GetView ( &hView, wcProductCode, wcQuery, L"MoveFile", TRUE , FALSE ) )
  102. {
  103. uiStatus = g_fpMsiViewFetch(hView, &hRecord);
  104. while(!bMatch && (uiStatus != ERROR_NO_MORE_ITEMS) && (hr != WBEM_E_CALL_CANCELLED)){
  105. CheckMSI(uiStatus);
  106. if(FAILED(hr = SpawnAnInstance(&m_pObj))) throw hr;
  107. //----------------------------------------------------
  108. dwBufSize = BUFF_SIZE;
  109. GetBufferToPut ( hRecord, 1, dwBufSize, wcBuf, dwDynBuffer, dynBuffer, Buffer );
  110. PutProperty(m_pObj, pFileKey, Buffer);
  111. PutProperty(m_pObj, pName, Buffer);
  112. PutProperty(m_pObj, pCaption, Buffer);
  113. PutProperty(m_pObj, pDescription, Buffer);
  114. PutKeyProperty ( m_pObj, pActionID, Buffer, &bActionID, m_pRequest, 1, wcProductCode );
  115. if ( dynBuffer && dynBuffer [ 0 ] != 0 )
  116. {
  117. dynBuffer [ 0 ] = 0;
  118. }
  119. //====================================================
  120. dwBufSize = BUFF_SIZE;
  121. GetBufferToPut ( hRecord, 2, dwBufSize, wcBuf, dwDynBuffer, dynBuffer, Buffer );
  122. if ( ValidateComponentName ( msidata.GetDatabase(), wcProductCode, Buffer ) )
  123. {
  124. if ( dynBuffer && dynBuffer [ 0 ] != 0 )
  125. {
  126. dynBuffer [ 0 ] = 0;
  127. }
  128. dwBufSize = BUFF_SIZE;
  129. PutPropertySpecial ( hRecord, 3, dwBufSize, wcBuf, dwDynBuffer, dynBuffer, pSourceName );
  130. dwBufSize = BUFF_SIZE;
  131. PutPropertySpecial ( hRecord, 4, dwBufSize, wcBuf, dwDynBuffer, dynBuffer, pSourceFolder );
  132. dwBufSize = BUFF_SIZE;
  133. PutPropertySpecial ( hRecord, 5, dwBufSize, wcBuf, dwDynBuffer, dynBuffer, pDestName );
  134. dwBufSize = BUFF_SIZE;
  135. PutPropertySpecial ( hRecord, 6, dwBufSize, wcBuf, dwDynBuffer, dynBuffer, pDestFolder );
  136. PutProperty(m_pObj, pOptions, g_fpMsiRecordGetInteger(hRecord, 7));
  137. //----------------------------------------------------
  138. if(bActionID) bMatch = true;
  139. if((atAction != ACTIONTYPE_GET) || bMatch){
  140. hr = pHandler->Indicate(1, &m_pObj);
  141. }
  142. }
  143. else
  144. {
  145. if ( dynBuffer && dynBuffer [ 0 ] != 0 )
  146. {
  147. dynBuffer [ 0 ] = 0;
  148. }
  149. }
  150. m_pObj->Release();
  151. m_pObj = NULL;
  152. g_fpMsiCloseHandle(hRecord);
  153. uiStatus = g_fpMsiViewFetch(hView, &hRecord);
  154. }
  155. }
  156. }
  157. catch(...)
  158. {
  159. if ( dynBuffer )
  160. {
  161. delete [] dynBuffer;
  162. dynBuffer = NULL;
  163. }
  164. g_fpMsiCloseHandle(hRecord);
  165. g_fpMsiViewClose(hView);
  166. g_fpMsiCloseHandle(hView);
  167. msidata.CloseDatabase ();
  168. if(m_pObj)
  169. {
  170. m_pObj->Release();
  171. m_pObj = NULL;
  172. }
  173. throw;
  174. }
  175. g_fpMsiCloseHandle(hRecord);
  176. g_fpMsiViewClose(hView);
  177. g_fpMsiCloseHandle(hView);
  178. msidata.CloseDatabase ();
  179. }
  180. }
  181. if ( dynBuffer )
  182. {
  183. delete [] dynBuffer;
  184. dynBuffer = NULL;
  185. }
  186. return hr;
  187. }