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.

420 lines
8.1 KiB

  1. //******************************************************************************
  2. // File: \wacker\tdll\Keymlist.h Created: 6/2/98 By: Dwayne M. Newsome
  3. //
  4. // Copyright 1998 by Hilgraeve Inc. --- Monroe, MI
  5. // All rights reserved
  6. //
  7. // Description:
  8. // This class manages the list of user defines key macros
  9. //
  10. // $Revision: 1 $
  11. // $Date: 10/05/98 1:12p $
  12. // $Id: keymlist.cpp 1.1 1998/06/11 12:03:39 dmn Exp $
  13. //
  14. //******************************************************************************
  15. #include <windows.h>
  16. #pragma hdrstop
  17. #include "stdtyp.h"
  18. #include "mc.h"
  19. #ifdef INCL_KEY_MACROS
  20. #include <strstrea.h>
  21. #include "keymlist.h"
  22. extern "C"
  23. {
  24. #include "sess_ids.h"
  25. #include "session.h"
  26. #include "sf.h"
  27. }
  28. //******************************************************************************
  29. // Method:
  30. // operator>>
  31. //
  32. // Description:
  33. // Iostream extractor
  34. //
  35. // Arguments:
  36. // theStream - The stream to extract from
  37. // aMacroList - The macrolist to stream into
  38. //
  39. // Returns:
  40. // istream &
  41. //
  42. // Throws:
  43. // None
  44. //
  45. // Author: Dwayne M. Newsome, 6/2/98
  46. //
  47. //
  48. istream & operator>>( istream & theStream, Emu_Key_Macro_List & aMacroList )
  49. {
  50. aMacroList.mMacroCount = 0;
  51. theStream >> aMacroList.mMacroCount;
  52. for ( int i = 0; i < aMacroList.mMacroCount; i++ )
  53. {
  54. theStream >> aMacroList.mMacroList[i];
  55. }
  56. return theStream;
  57. }
  58. //******************************************************************************
  59. // Method:
  60. // operator<<
  61. //
  62. // Description:
  63. // Iostream inserter
  64. //
  65. // Arguments:
  66. // theStream - The stream to insert into
  67. // aMacroList - The macrolist to stream out
  68. //
  69. // Returns:
  70. // istream &
  71. //
  72. // Throws:
  73. // None
  74. //
  75. // Author: Dwayne M. Newsome, 6/2/98
  76. //
  77. //
  78. ostream & operator<<( ostream & theStream, const Emu_Key_Macro_List & aMacroList )
  79. {
  80. theStream << aMacroList.mMacroCount << " ";
  81. for ( int i = 0; i < aMacroList.mMacroCount; i++ )
  82. {
  83. theStream << aMacroList.mMacroList[i] << " ";
  84. }
  85. return theStream;
  86. }
  87. //******************************************************************************
  88. // Method:
  89. // Emu_Key_Macro_List
  90. //
  91. // Description:
  92. // Constructor
  93. //
  94. // Arguments:
  95. // void
  96. //
  97. // Returns:
  98. // void
  99. //
  100. // Throws:
  101. // None
  102. //
  103. // Author: Dwayne M. Newsome, 6/2/98
  104. //
  105. //
  106. Emu_Key_Macro_List :: Emu_Key_Macro_List( void )
  107. : mMacroCount( 0 )
  108. {
  109. return;
  110. }
  111. //******************************************************************************
  112. // Method:
  113. // ~Emu_Key_Macro_List
  114. //
  115. // Description:
  116. // Destructor
  117. //
  118. // Arguments:
  119. // void
  120. //
  121. // Returns:
  122. // void
  123. //
  124. // Throws:
  125. // None
  126. //
  127. // Author: Dwayne M. Newsome, 6/2/98
  128. //
  129. //
  130. Emu_Key_Macro_List :: ~Emu_Key_Macro_List( void )
  131. {
  132. return;
  133. }
  134. //******************************************************************************
  135. // Method:
  136. // operator[]
  137. //
  138. // Description:
  139. // Subscript operator
  140. //
  141. // Arguments:
  142. // aIndex - The index of the macro requested
  143. //
  144. // Returns:
  145. // Reference to the requested macro.
  146. //
  147. // Throws:
  148. // None
  149. //
  150. // Author: Dwayne M. Newsome, 6/2/98
  151. //
  152. //
  153. Emu_Key_Macro & Emu_Key_Macro_List :: operator[]( int aIndex )
  154. {
  155. if ( aIndex < 0 || aIndex >= mMacroCount )
  156. {
  157. return mMacroList[eMaxKeys];
  158. }
  159. return mMacroList[aIndex];
  160. }
  161. //******************************************************************************
  162. // Method:
  163. // addMacro
  164. //
  165. // Description:
  166. // Adds the specified macro to the list of macros
  167. //
  168. // Arguments:
  169. // aMacro - The macro to add
  170. //
  171. // Returns:
  172. // 0 if all is ok, -1 if max macros exist, > 0 if duplicate found.
  173. //
  174. // Throws:
  175. // None
  176. //
  177. // Author: Dwayne M. Newsome, 6/2/98
  178. //
  179. //
  180. int Emu_Key_Macro_List :: addMacro( const Emu_Key_Macro & aMacro )
  181. {
  182. if ( mMacroCount == eMaxKeys )
  183. {
  184. return -1;
  185. }
  186. if ( int lIndex = find( aMacro ) >= 0 )
  187. {
  188. return lIndex;
  189. }
  190. mMacroList[ mMacroCount ] = aMacro;
  191. mMacroCount++;
  192. return 0;
  193. }
  194. //******************************************************************************
  195. // Method:
  196. // find
  197. //
  198. // Description:
  199. // Finds a macro in the list and retuens its index
  200. //
  201. // Arguments:
  202. // aKey - The key to locate in the list
  203. // aMacro - The macro to find in the list
  204. //
  205. // Returns:
  206. // -1 if the key or macro does not exist otherwise the index of the macro
  207. //
  208. // Throws:
  209. // None
  210. //
  211. // Author: Dwayne M. Newsome, 6/2/98
  212. //
  213. //
  214. int Emu_Key_Macro_List :: find( const Emu_Key_Macro & aMacro ) const
  215. {
  216. return find( aMacro.mKey );
  217. }
  218. int Emu_Key_Macro_List :: find( const KEYDEF & aKey ) const
  219. {
  220. int lIndex = -1;
  221. for ( int i = 0; i < mMacroCount; i++ )
  222. {
  223. if ( mMacroList[i].mKey == aKey )
  224. {
  225. lIndex = i;
  226. break;
  227. }
  228. }
  229. return lIndex;
  230. }
  231. //******************************************************************************
  232. // Method:
  233. // load
  234. //
  235. // Description:
  236. // Loads the key list from the session file.
  237. //
  238. // Arguments:
  239. // hSession - Session handle to use
  240. //
  241. // Returns:
  242. // 0 if all is ok, -1 for an error
  243. //
  244. // Throws:
  245. // None
  246. //
  247. // Author: Dwayne M. Newsome, 6/2/98
  248. //
  249. //
  250. int Emu_Key_Macro_List :: load( const HSESSION hSession )
  251. {
  252. SF_HANDLE hSF = sessQuerySysFileHdl( hSession );
  253. unsigned long lSize = 0;
  254. sfGetSessionItem( hSF, SFID_KEY_MACRO_LIST, &lSize, (void*)0 );
  255. int lReturnCode = 0;
  256. char * lBuffer = new char[lSize];
  257. if( sfGetSessionItem(hSF, SFID_KEY_MACRO_LIST, &lSize, lBuffer) == 0 )
  258. {
  259. istrstream lStream( lBuffer );
  260. lStream >> *this;
  261. }
  262. else
  263. {
  264. lReturnCode = -1;
  265. }
  266. delete[] lBuffer;
  267. return lReturnCode;
  268. }
  269. //******************************************************************************
  270. // Method:
  271. // numberOfMacros
  272. //
  273. // Description:
  274. // returns the number of macros in the list
  275. //
  276. // Arguments:
  277. // void
  278. //
  279. // Returns:
  280. // macro count
  281. //
  282. // Throws:
  283. // None
  284. //
  285. // Author: Dwayne M. Newsome, 6/4/98
  286. //
  287. //
  288. int Emu_Key_Macro_List :: numberOfMacros( void ) const
  289. {
  290. return mMacroCount;
  291. }
  292. //******************************************************************************
  293. // Method:
  294. // removeMacro
  295. //
  296. // Description:
  297. // Removes the specified macro form the list
  298. //
  299. // Arguments:
  300. // aKey - The key to be removed
  301. //
  302. // Returns:
  303. // 0 if error occured, non 0 if key was removed
  304. //
  305. // Throws:
  306. // None
  307. //
  308. // Author: Dwayne M. Newsome, 6/2/98
  309. //
  310. //
  311. int Emu_Key_Macro_List :: removeMacro( const KEYDEF & aKey )
  312. {
  313. int lIndex = find( aKey );
  314. if ( lIndex < 0 )
  315. {
  316. return 0;
  317. }
  318. for ( int i = lIndex; i < mMacroCount - lIndex + 1; i++ )
  319. {
  320. mMacroList[i] = mMacroList[i+1];
  321. }
  322. mMacroCount--;
  323. return 1;
  324. }
  325. //******************************************************************************
  326. // Method:
  327. // Save
  328. //
  329. // Description:
  330. // Saves the key list to the session file.
  331. //
  332. // Arguments:
  333. // hSession - Session handle to use
  334. //
  335. // Returns:
  336. // 0 if all is ok, -1 for an error
  337. //
  338. // Throws:
  339. // None
  340. //
  341. // Author: Dwayne M. Newsome, 6/2/98
  342. //
  343. //
  344. int Emu_Key_Macro_List :: save( const HSESSION hSession )
  345. {
  346. SF_HANDLE hSF = sessQuerySysFileHdl( hSession );
  347. int lReturnCode = 0;
  348. strstream lStream;
  349. lStream << *this << ends << flush;
  350. if ( !lStream )
  351. {
  352. return -1;
  353. }
  354. char * lBuffer = lStream.str();
  355. if ( sfPutSessionItem( hSF, SFID_KEY_MACRO_LIST, strlen(lBuffer), lBuffer ) != 0 )
  356. {
  357. lReturnCode = -1;
  358. }
  359. lStream.rdbuf()->freeze(0);
  360. return lReturnCode;
  361. }
  362. Emu_Key_Macro_List gMacroManager;
  363. #endif