Source code of Windows XP (NT5)
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.

799 lines
24 KiB

  1. /* MEDIAMAN.H
  2. *
  3. * Public header for the MMSys media element manager DLL
  4. *
  5. * include after windows.h
  6. *
  7. */
  8. #ifndef _MEDMAN_H_
  9. #define _MEDMAN_H_
  10. /*************** MEDIAMAN TYPES ****************/
  11. typedef DWORD MEDID;
  12. typedef WORD MEDGID;
  13. typedef DWORD FOURCC;
  14. typedef FOURCC MEDTYPE;
  15. typedef WORD MEDMSG;
  16. typedef WORD MEDUSER;
  17. /*************** MEDINFO INSTANCE BLOCK ****************/
  18. /*
  19. * Resource instance structure, passed around as MEDINFO.
  20. * This structure definition may change, DO NOT DEPEND ON IT, but
  21. * use access macros defined below instead!!
  22. */
  23. typedef struct _MedInfoStruct {
  24. DWORD wFlags; // maybe duplicate fpEnt flags
  25. WORD wAccessCount;
  26. WORD wLockCount;
  27. DWORD dwAccessRet;
  28. DWORD dwLockRet;
  29. char achInst[2];
  30. } MedInfoStruct;
  31. typedef MedInfoStruct FAR *MEDINFO;
  32. /* Instance data access macros */
  33. #define medInfoInstance(medinfo) ((LPSTR) &((medinfo)->achInst[0]))
  34. #define medInfoAccessCount(medinfo) ((medinfo)->wAccessCount)
  35. #define medInfoLockCount(medinfo) ((medinfo)->wLockCount)
  36. #define medInfoLockRead(medinfo) ((medinfo)->wFlags & 0x0800)
  37. #define medInfoLockWrite(medinfo) ((medinfo)->wFlags & 0x0400)
  38. #define MedInfoInstance(medinfo) medInfoInstance(medinfo)
  39. #define MedInfoAccessCount(medinfo) medInfoAccessCount(medinfo)
  40. #define MedInfoLockCount(medinfo) medInfoLockCount(medinfo)
  41. #define MedInfoLockRead(medinfo) medInfoLockRead(medinfo)
  42. #define MedInfoLockWrite(medinfo) medInfoLockWrite(medinfo)
  43. /********** RESOURCE HANDLER DECLARATION *************/
  44. typedef DWORD (FAR PASCAL MedHandler)
  45. (MEDID medid, MEDMSG medmsg, MEDINFO medinfo,
  46. LONG lParam1, LONG lParam2);
  47. typedef MedHandler FAR *FPMedHandler;
  48. /* Logical resource handler messages */
  49. #define MED_INIT 0x0010
  50. #define MED_UNLOAD 0x0011
  51. #define MED_LOCK 0x0012
  52. #define MED_UNLOCK 0x0013
  53. #define MED_EXPEL 0x0014
  54. #define MED_DESTROY 0x0015
  55. #define MED_CREATE 0x0016
  56. #define MED_TYPEINIT 0x0020
  57. #define MED_TYPEUNLOAD 0x0021
  58. #define MED_SETPHYSICAL 0x0022
  59. #define MED_COPY 0x0023
  60. #define MED_NEWNAME 0x0024
  61. #define MED_PAINT 0x002A
  62. #define MED_REALIZEPALETTE 0x002B
  63. #define MED_GETPAINTCAPS 0x002C
  64. #define MED_GETCLIPBOARDDATA 0x002D
  65. /* PaintCaps flags */
  66. #define MMC_PALETTEINFO 0x0001
  67. #define MMC_BOUNDRECT 0x0002
  68. #define MMC_CLIPFORMAT 0x0003
  69. /* Paint message flags */
  70. #define MMP_NORMPAL 0x0000
  71. #define MMP_NOPALETTE 0x0001
  72. #define MMP_PALBACKGROUND 0x0002
  73. #define MMP_SHRINKTOFIT 0x0010
  74. #define MMP_DSTANDSRCRECTS 0x0020
  75. /* Load/Save messages */
  76. #define MED_GETLOADPARAM 0x0030
  77. #define MED_PRELOAD 0x0031
  78. #define MED_LOAD 0x0032
  79. #define MED_POSTLOAD 0x0033
  80. #define MED_FREELOADPARAM 0x0034
  81. #define MED_GETSAVEPARAM 0x0035
  82. #define MED_PRESAVE 0x0036
  83. #define MED_SAVE 0x0037
  84. #define MED_POSTSAVE 0x0038
  85. #define MED_FREESAVEPARAM 0x0039
  86. /* Sent to resource users */
  87. #define MED_CHANGE 0x0060
  88. /* Messages sent to MedDiskInfoCallback */
  89. #define MED_DISKCBBEGIN 0x0065
  90. #define MED_DISKCBUPDATE 0x0066
  91. #define MED_DISKCBEND 0x0067
  92. #define MED_DISKCBNEWCONV 0x0068
  93. /* Minimum value available for type-defined messages */
  94. #define MED_USER 0x0200
  95. /***************** RESOURCE LOAD/SAVE *******************/
  96. typedef struct _MedDisk {
  97. WORD wFlags;
  98. DWORD dwMessageData;
  99. DWORD dwRetVal;
  100. DWORD dwInstance1;
  101. DWORD dwInstance2;
  102. DWORD dwParam1;
  103. DWORD dwParam2;
  104. DWORD dwCbInstance1;
  105. DWORD dwCbInstance2;
  106. HWND hwndParentWindow;
  107. MEDID medid;
  108. DWORD dwReserved1;
  109. DWORD dwReserved2;
  110. DWORD dwReserved3;
  111. DWORD dwReserved4;
  112. } MedDisk;
  113. typedef MedDisk FAR *FPMedDisk;
  114. typedef MedDisk NEAR *NPMedDisk;
  115. /* Flags for wFlags field */
  116. #define MEDF_DISKSAVE 0x0001 // save taking place
  117. #define MEDF_DISKLOAD 0x0002 // load taking place
  118. #define MEDF_DISKVERIFY 0x0004 // verify the file format on load
  119. typedef HANDLE HMEDIABATCH;
  120. /* Macros to check status of load/save */
  121. #define medIsDiskVerify(FPDISK) \
  122. (((FPMedDisk) (FPDISK))->wFlags & MEDF_DISKVERIFY)
  123. #define medIsDiskLoad(FPDISK) \
  124. (((FPMedDisk) (FPDISK))->wFlags & MEDF_DISKLOAD)
  125. #define medIsDiskSave(FPDISK) \
  126. (((FPMedDisk) (FPDISK))->wFlags & MEDF_DISKSAVE)
  127. /* Values returned by physical handlers to MED_LOAD & MED_SAVE messages */
  128. #define MEDF_OK 1
  129. #define MEDF_ABORT 2
  130. #define MEDF_ERROR 3
  131. #define MEDF_BADFORMAT 4
  132. #define MEDF_NOTPROCESSED 0L
  133. /* Callback type used for information on disk save/load status */
  134. typedef WORD (FAR PASCAL MedDiskInfoCallback)
  135. (WORD wmsg, FPMedDisk fpDisk, LONG lParam,
  136. WORD wPercentDone, LPSTR lpszTextStatus);
  137. typedef MedDiskInfoCallback FAR *FPMedDiskInfoCallback;
  138. /* Functions used by info callbacks */
  139. void FAR PASCAL medDiskCancel(FPMedDisk fpDisk);
  140. WORD FAR PASCAL medUpdateProgress(FPMedDisk fpDisk,
  141. WORD wPercentDone, LPSTR lpszTextStatus);
  142. /************* LOGICAL I/O ROUTINES *****************/
  143. typedef struct _MedReturn {
  144. MEDID medid;
  145. DWORD dwReturn;
  146. } MedReturn;
  147. typedef MedReturn FAR *FPMedReturn;
  148. WORD FAR PASCAL medSave(MEDID medid, LONG lParam,
  149. BOOL fYield, FPMedDiskInfoCallback lpfnCb,
  150. LONG lParamCb);
  151. WORD FAR PASCAL medSaveAs(MEDID medid, FPMedReturn medReturn,
  152. LPSTR lpszName, LONG lParam, BOOL fYield,
  153. FPMedDiskInfoCallback lpfnCb, LONG lParamCb);
  154. WORD FAR PASCAL medAccess(MEDID medid, LONG lParam,
  155. FPMedReturn medReturn, BOOL fYield,
  156. FPMedDiskInfoCallback lpfnCb, LONG lParamCb);
  157. void FAR PASCAL medRelease(MEDID medid, LONG lParam);
  158. DWORD FAR PASCAL medLock(MEDID medid, WORD wFlags, LONG lParam);
  159. void FAR PASCAL medUnlock(MEDID medid, WORD wFlags,
  160. DWORD dwChangeInfo, LONG lParam);
  161. DWORD FAR PASCAL medSendMessage(MEDID medid, MEDMSG medmsg,
  162. LONG lParam1, LONG lParam2);
  163. DWORD FAR PASCAL medSendPhysMessage(MEDID medid, MEDMSG medmsg,
  164. LONG lParam1, LONG lParam2);
  165. BOOL FAR PASCAL medCreate(FPMedReturn medReturn,
  166. MEDTYPE medtype, LONG lParam);
  167. BOOL FAR PASCAL medIsDirty(MEDID medid);
  168. BOOL FAR PASCAL medSetDirty(MEDID medid, BOOL fDirty);
  169. WORD FAR PASCAL medIsAccessed(MEDID medid);
  170. BOOL FAR PASCAL medIsShared(MEDID medid);
  171. MEDINFO FAR PASCAL medGetMedinfo(MEDID medid);
  172. BOOL FAR PASCAL medReleaseResinfo(MEDID medid, MEDINFO medinfo);
  173. DWORD FAR PASCAL medSendPhysTypeMsg(MEDID medid, MEDTYPE medTypePhysical,
  174. MEDMSG medmsg, LONG lParam1, LONG lParam2);
  175. typedef struct _MedAccessStruct {
  176. MEDID medid;
  177. LONG lParamLoad;
  178. BOOL fYield;
  179. HWND hwndParent;
  180. FPMedDiskInfoCallback lpfnCb;
  181. LONG lParamCb;
  182. DWORD dwReturn;
  183. } MedAccessStruct;
  184. typedef MedAccessStruct FAR *FPMedAccessStruct;
  185. WORD FAR PASCAL medAccessIndirect(FPMedAccessStruct fpAccess, WORD wSize);
  186. typedef struct _MedSaveStruct {
  187. MEDID medid;
  188. LONG lParamSave;
  189. BOOL fYield;
  190. HWND hwndParent;
  191. FPMedDiskInfoCallback lpfnCb;
  192. LONG lParamCb;
  193. LPSTR lpszNewName;
  194. MEDID medidReturn;
  195. DWORD dwReturn;
  196. } MedSaveStruct;
  197. typedef MedSaveStruct FAR *FPMedSaveStruct;
  198. WORD FAR PASCAL medSaveIndirect(FPMedSaveStruct fpSave, WORD wSize);
  199. WORD FAR PASCAL medSaveAsIndirect(FPMedSaveStruct fpSave, WORD wSize);
  200. /*
  201. * BATCH CONVERSION
  202. */
  203. WORD FAR PASCAL medAccessBatch(HMEDIABATCH hmedBatch, FPMedReturn medReturn,
  204. BOOL fYield, WORD wFlags);
  205. WORD FAR PASCAL medSaveBatch(HMEDIABATCH hmedBatch, BOOL fYield);
  206. WORD FAR PASCAL medSaveAsBatch(HMEDIABATCH hmedBatch, MEDID medidExisting,
  207. LPSTR lpszName, FPMedReturn medReturn,
  208. BOOL fYield, WORD wResetFlags);
  209. HMEDIABATCH FAR PASCAL medAllocBatchBuffer(MEDID medid, HWND hwnd,
  210. WORD wFlags, BOOL fLoad, DWORD dwMsgData,
  211. FPMedDiskInfoCallback lpfnCb, LONG lParamCb);
  212. BOOL FAR PASCAL medResetBatchBuffer(HMEDIABATCH hmedbatch, MEDID medid,
  213. WORD wFlags);
  214. BOOL FAR PASCAL medFreeBatchBuffer(HMEDIABATCH hmedbatch);
  215. #define MEDBATCH_RESETUPDATECB 0x0001
  216. /* Flags for medLock */
  217. #define MEDF_READ 0x0001
  218. #define MEDF_WRITE 0x0002
  219. /* Flags for medUnlock */
  220. #define MEDF_CHANGED 0x0004
  221. #define MEDF_NOCHANGE 0x0000
  222. /**************** RESOURCE USER ******************/
  223. MEDUSER FAR PASCAL medRegisterUser(HWND hWnd, DWORD dwInst);
  224. void FAR PASCAL medUnregisterUser(MEDUSER meduser);
  225. void FAR PASCAL medSendUserMessage(MEDID medid, MEDMSG medmsg, LONG lParam);
  226. BOOL FAR PASCAL medRegisterUsage(MEDID medid, MEDUSER meduser);
  227. BOOL FAR PASCAL medUnregisterUsage(MEDID medid, MEDUSER meduser);
  228. typedef struct _MedUserMsgInfo {
  229. MEDID medid;
  230. LONG lParam;
  231. MEDINFO medinfo;
  232. DWORD dwInst;
  233. } MedUserMsgInfo;
  234. typedef MedUserMsgInfo FAR *FPMedUserMsgInfo;
  235. #ifndef MM_MEDNOTIFY
  236. #define MM_MEDNOTIFY 0x3BA
  237. #endif
  238. // obsolete but still required by bitedit and paledit
  239. typedef DWORD (FAR PASCAL MedUser)
  240. (MEDID medid, MEDMSG medmsg, MEDINFO medinfo,
  241. LONG lParam, DWORD dwInst);
  242. typedef MedUser FAR *FPMedUser;
  243. MEDUSER FAR PASCAL medRegisterCallback(FPMedUser lpfnUser, DWORD dwInst);
  244. /**************** TYPE TABLE *****************/
  245. typedef struct _MedTypeInfo {
  246. BOOL fValid; // Is this entry valid?
  247. WORD wFlags; // type flags
  248. MEDTYPE medtype; // the type id
  249. FPMedHandler lpfnHandler; // handler function for this type
  250. WORD wInstanceSize; // the byte count of instance data
  251. WORD wRefcount; // reference count on this type
  252. } MedTypeInfo;
  253. typedef MedTypeInfo FAR *FPMedTypeInfo;
  254. /* Flags to medRegisterType */
  255. #define MEDTYPE_LOGICAL 0x0001
  256. #define MEDTYPE_PHYSICAL 0x0002
  257. /* Type creation macros */
  258. #define medMEDTYPE( ch0, ch1, ch2, ch3 ) \
  259. ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
  260. ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  261. #define medFOURCC( ch0, ch1, ch2, ch3 ) \
  262. ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
  263. ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
  264. BOOL FAR PASCAL medRegisterType(MEDTYPE medtype, FPMedHandler lpfnHandler,
  265. WORD wFlags);
  266. BOOL FAR PASCAL medUnregisterType(MEDTYPE medtype);
  267. BOOL FAR PASCAL medGetTypeInfo(MEDTYPE medtype, FPMedTypeInfo fpInfo);
  268. WORD FAR PASCAL medIterTypes(WORD wIndex, FPMedTypeInfo fpInfo);
  269. FOURCC FAR PASCAL medStringToFourCC(LPSTR lpszString);
  270. void FAR PASCAL medFourCCToString( FOURCC fcc, LPSTR lpszString);
  271. MEDTYPE FAR PASCAL medGetLogicalType(MEDID medid);
  272. MEDTYPE FAR PASCAL medGetPhysicalType(MEDID medid);
  273. BOOL FAR PASCAL medSetPhysicalType(MEDID medid, MEDTYPE medtype);
  274. /************* MISC FUNCTIONS *****************/
  275. WORD FAR PASCAL medGetErrorText(DWORD wErrno, LPSTR lpszBuf, WORD wSize);
  276. DWORD FAR PASCAL medGetError(void);
  277. void FAR PASCAL medSetExtError(WORD wErrno, HANDLE hInst);
  278. BOOL FAR PASCAL medClientInit(void);
  279. BOOL FAR PASCAL medClientExit(void);
  280. HANDLE FAR PASCAL medLoadHandlerDLL(LPSTR lpszDLLName);
  281. BOOL FAR PASCAL medUnloadHandlerDLL(HANDLE hModule);
  282. /************* RESOURCE LOCATION *****************/
  283. MEDID FAR PASCAL medLocate(LPSTR lpszMedName, MEDTYPE medtype,
  284. WORD wFlags, LPSTR lpszMedPath);
  285. MEDID FAR PASCAL medSubLocate(MEDID medidParent, MEDTYPE medtype,
  286. DWORD dwOffset, DWORD dwSize);
  287. HANDLE FAR PASCAL medGetAliases(MEDID medid);
  288. /* Flags for medLocate */
  289. #define MEDF_LOCATE 0x0001
  290. #define MEDF_MAKEFILE 0x0002
  291. #define MEDF_MEMORYFILE 0x0004
  292. #define MEDF_NONSHARED 0x0008
  293. typedef struct _MedMemoryFileStruct {
  294. LPSTR lpszBuf;
  295. DWORD dwSize;
  296. } MedMemoryFile;
  297. typedef MedMemoryFile FAR *FPMedMemoryFile;
  298. typedef struct _MedFileInfo {
  299. WORD wFlags;
  300. WORD wFilesysType;
  301. MEDID medidParent;
  302. DWORD dwSize;
  303. DWORD dwOffset;
  304. /* Information on memory file system */
  305. LPSTR lpszMemory;
  306. DWORD dwMemSize;
  307. } MedFileInfo;
  308. typedef MedFileInfo FAR *FPMedFileInfo;
  309. #define MEDFILE_SUBELEMENT 0x01
  310. #define MEDFILE_NONSHARED 0x02
  311. BOOL FAR PASCAL medGetFileInfo(MEDID medid, FPMedFileInfo fpInfo, WORD wSize);
  312. WORD FAR PASCAL medGetFileName(MEDID medid, LPSTR lpszBuf, WORD wBufSize);
  313. #define MEDNAME_ERROR 0
  314. #define MEDNAME_DYNAMIC 1
  315. #define MEDNAME_MEMORY 2
  316. #define MEDNAME_FILE 3
  317. /***************************************
  318. *
  319. * MEDIAMAN DLL ERROR MESSAGES
  320. *
  321. * Should be less than 0x200.
  322. *
  323. ***************************************/
  324. #define MMERR_NOERROR 0x0000
  325. #define MMERR_TYPELISTMEM 0x0001
  326. #define MMERR_BADHANDLER 0x0002
  327. #define MMERR_TYPELISTDUPL 0x0003
  328. #define MMERR_INVALIDTYPE 0x0004
  329. #define MMERR_TYPEREFNOTZERO 0x0005
  330. #define MMERR_WRONGHANDLERTYPE 0x0006
  331. #define MMERR_GROUPTABLEMEMORY 0x0010
  332. #define MMERR_GROUPSTRUCTMEMORY 0x0011
  333. #define MMERR_GROUPSTRINGTABLE 0x0012
  334. #define MMERR_GROUPENTRYTABLE 0x0013
  335. #define MMERR_USERTABLEMEMORY 0x0014
  336. #define RMERR_INVALIDMEDUSER 0x0015
  337. #define MMERR_GLOBALUSERMEMORY 0x0016
  338. #define MMERR_INVALIDSUBPARENT 0x0030
  339. #define MMERR_NOFILEEXISTS 0x0031
  340. #define MMERR_LOGONNAMESPACE 0x0040
  341. #define MMERR_FILENAMESTEP 0x0041
  342. #define MMERR_MEDNOTACCESSED 0x0042
  343. #define MMERR_UNNAMEDELEMENT 0x0043
  344. #define MMERR_DISKOPABORT 0x0044
  345. #define MMERR_NOTCORRECTFILE 0x0045
  346. #define MMERR_COPYFAILED 0x0046
  347. #define MMERR_DISKOPINPROGRESS 0x0047
  348. #define MMERR_MEMORY 0x0048
  349. #define MMERR_READOFWRITELOCKED 0x00E0
  350. #define MMERR_WRITEOFWRITELOCKED 0x00E1
  351. #define MMERR_INVALIDDLLNAME 0x00F0
  352. #define MMERR_COULDNOTLOADDLL 0x00F1
  353. #define MMERR_BADLIBINIT 0x00F2
  354. #define MMERR_INVALIDMODULE 0x00F3
  355. #define MMERR_UNKNOWN 0x0100
  356. #define MMERR_HMEDREAD 0x0101
  357. #define MMERR_HMEDWRITE 0x0102
  358. #define MMERR_HMEDGET 0x0103
  359. #define MMERR_HMEDPUT 0x0104
  360. #define MMERR_HMEDCLOSE 0x0105
  361. #define MMERR_HMEDFIND 0x0106
  362. #define MMERR_HMEDFINDANY 0x0107
  363. #define MMERR_HMEDUNGET 0x0108
  364. #define MMERR_HMEDALLOC 0x0109
  365. #define MMERR_HMEDLOCK 0x010a
  366. #define MMERR_GETFILEINFO 0x010b
  367. #define MMERR_HMEDASCEND 0x010c
  368. #define MMERR_STACKASCEND 0x010d
  369. #define MMERR_HMEDDESCEND 0x010e
  370. #define MMERR_DESCENDSPACE 0x010f
  371. #define MMERR_DESCENDGET 0x0110
  372. #define MMERR_STACKDESCEND 0x0111
  373. #define MMERR_HMEDRESIZE 0x0112
  374. #define MMERR_STACKRESIZE 0x0113
  375. #define MMERR_HMEDCREATE 0x0114
  376. #define MMERR_STACKCREATE 0x0115
  377. #define MMERR_CREATESPACE 0x0116
  378. #define MMERR_CREATEPUT 0x0117
  379. #define MMERR_HMEDSIZE 0x0118
  380. #define MMERR_HMEDLEVEL 0x0119
  381. #define MMERR_HMEDCKID 0x011a
  382. #define RMERR_MEDIDOPEN 0x011b
  383. #define MMERR_WRITEONLY 0x011c
  384. #define MMERR_READONLY 0x011d
  385. #define MMERR_PREVERROR 0x011e
  386. #define MMERR_EOF 0x011f
  387. #define MMERR_BEGIN 0x0120
  388. #define MMERR_IOERROR 0x0121
  389. #define MMERR_UNGETROOM 0x0122
  390. #define MMERR_GETFILENAME 0x0123
  391. #define MMERR_FINDFIRST 0x0124
  392. #define MMERR_OPEN 0x0125
  393. #define MMERR_SEEKINIT 0x0126
  394. #define MMERR_HMEDSEEK 0x0127
  395. #define MMERR_READ 0x0128
  396. #define MMERR_HMEDCFOPEN 0x0129
  397. #define MMERR_MEDGCFCLOSE 0x0130
  398. #define MMERR_WRITE 0x0131
  399. #define MMERR_MAXERROR 0x0200
  400. /***************************************
  401. *
  402. * MEDIAMAN PHYSICAL IO DEFINITIONS
  403. *
  404. ***************************************/
  405. typedef FOURCC CKID;
  406. typedef FOURCC FORMTYPE;
  407. typedef DWORD CKSIZE;
  408. /*
  409. * RIFF stack elements
  410. */
  411. typedef int RIFFSTACKPLACE;
  412. typedef void huge * HPVOID;
  413. typedef struct riff_stack_element {
  414. CKID nID; /* TOS current chunk id */
  415. CKSIZE cbSize; /* TOS current chunk size */
  416. LONG nOffset; /* Stacked nOffset for prev chunk */
  417. LONG nEnd; /* Stacked nEnd for prev chunk */
  418. WORD info; /* Stacked info for prev chunk */
  419. } RIFFSTACKELEM;
  420. typedef RIFFSTACKELEM FAR * FPRIFFSTACKELEM;
  421. /*
  422. * Storage System Handler routine type definition
  423. */
  424. typedef LONG (FAR PASCAL MIOHANDLER) \
  425. (struct medElement far * hMed, WORD wFlags, \
  426. DWORD lParam1, DWORD lParam2 );
  427. typedef MIOHANDLER FAR * FPMIOHANDLER;
  428. #define MEDIO_DOS_STORAGE 0
  429. #define MEDIO_MEM_STORAGE 1
  430. #define MEDIO_CF_STORAGE 2
  431. /*
  432. * Handle to Resource ( once opened )
  433. */
  434. typedef struct medElement {
  435. LONG lData1; /* data 1 2 and 3 sections hold */
  436. LONG lData2; /* info specific to the storage system */
  437. LONG lData3; /* eg the dos file handle for dos files */
  438. MEDID medid; /* medid opened */
  439. HANDLE hMem; /* handle to the memory of the HMED */
  440. FPMIOHANDLER fpfnHandler; /* storage system handler */
  441. LONG nInitOffset; /* for sub-resources - offset of start */
  442. LONG nOffset; /* for riff offset start of chunk to start */
  443. /* NOTE nOffset doesn't include nInitOffset */
  444. LONG nCurrent; /* offset of end of current buffer */
  445. LONG nEnd; /* offset of end of current chunk/file */
  446. LONG nLeft; /* space in buff from eof(chunk) to buffend */
  447. LONG nGet; /* number of chars left to read in buff */
  448. LONG nPut; /* number of chars left to write in buff */
  449. /* NOTE nGet, nPut are mutually exclusive */
  450. LONG nSize; /* size of information read into buffer */
  451. LONG nUnGet; /* num of chars ungotten before buff start */
  452. WORD flags; /* RIOF_ info 'temperary' like error */
  453. WORD info; /* RIOI_ info 'permanent' eg. extendable*/
  454. LPSTR fpchPlace; /* place to get/put next char in buffer */
  455. LPSTR fpchMax; /* max position of Place - for seek, unget */
  456. LONG cbBuffer; /* the full buffer size */
  457. RIFFSTACKPLACE nRiffTop; /* current top of riff stack, -1 is nothing */
  458. FPRIFFSTACKELEM fpRiffStack;
  459. /* FP into the data to for Riff Stack */
  460. /* riff stack index top by nRiffTop */
  461. LPSTR fpchBuffer; /* FP into the data for the Buffer */
  462. char data[1]; /* the actual buffer */
  463. } MIOELEMENT;
  464. typedef MIOELEMENT FAR * HMED;
  465. /*
  466. * HMED flags 'temporary' info
  467. */
  468. #define MIOF_OK 0 /* no info */
  469. #define MIOF_EOF 1 /* have reached eof (or end of chunk) */
  470. #define MIOF_READING 2 /* info has been read into buffer */
  471. #define MIOF_WRITING 4 /* info has been written to buffer */
  472. #define MIOF_UNGET 8 /* have ungotten before buff start */
  473. #define MIOF_ERROR 16 /* have gotten some form of error */
  474. #define MIOF_BUFF_EOF 64 /* EOF at buffer end */
  475. #define MIOF_BUFF_ERROR 128 /* error at buffer end or 'fatal' error */
  476. /* fatal as in can not do any more IO */
  477. /* unlike the error you get for */
  478. /* trying to unget too many chars */
  479. #define MIOF_AFTERCURR 256 /* the characters in the buffer are located */
  480. /* after the hMed->nCurrent */
  481. /*
  482. * HMED info 'permanent' info
  483. */
  484. #define MIOI_NOTHING 0 /* no info */
  485. #define MIOI_RESIZED 32 /* This chunk has been resized */
  486. /* possibly fix the size on ascend */
  487. #define MIOI_AUTOSIZED 64 /* This chunk has been created */
  488. /* fix the size on ascend */
  489. #define MIOI_BYTESWAPPED 128 /* riff chunk sizes are byteswapped */
  490. #define MIOI_EXTENDABLE 256 /* the resource is extendable */
  491. /* unlike riff chunks */
  492. /*
  493. * Return values
  494. */
  495. #define MED_EOF (-1) /* universal something wrong return */
  496. /*
  497. * Resource mode to open resource as
  498. */
  499. #define MOP_READ 0
  500. #define MOP_WRITE 1
  501. #define MOP_READ_WRITE 2
  502. #define MOP_PRELOAD 0x0008
  503. #define MOP_CREATE 0x0010
  504. #define MOP_ZEROBUFFER 0x0100
  505. /* CLOSE return flags */
  506. #define MCERR_OK 0x0000
  507. #define MCERR_UNSPECIFIC 0x0001
  508. #define MCERR_FLUSH 0x0002
  509. #define MCERR_STORAGE 0x0004
  510. /*
  511. * seek flags
  512. */
  513. #define MOPS_SET 1
  514. #define MOPS_CUR 2
  515. #define MOPS_END 4
  516. #define MOPS_NONLOCAL 128
  517. #define MOPS_EXTEND 64
  518. /*
  519. * Resize Chunk Flags
  520. */
  521. #define MOPRC_AUTOSIZE 1
  522. /*
  523. * FUNCTION API's
  524. */
  525. /* normal IO */
  526. HMED FAR PASCAL medOpen( MEDID id, WORD wMode, WORD wSize );
  527. WORD FAR PASCAL medClose( HMED hMed );
  528. LONG FAR PASCAL medRead( HMED hMed, HPVOID hpBuffer, LONG lBytes );
  529. LONG FAR PASCAL medWrite( HMED hMed, HPVOID hpBuffer, LONG lBytes );
  530. LONG FAR PASCAL medSeek( HMED hMed, LONG lOffset, WORD wOrigin );
  531. /* RIFF */
  532. BOOL FAR PASCAL medAscend( HMED hMed );
  533. CKID FAR PASCAL medDescend( HMED hMed );
  534. CKID FAR PASCAL medCreateChunk(HMED hMed, CKID ckid, DWORD dwCkSize);
  535. BOOL FAR PASCAL medResizeChunk(HMED hMed, DWORD dwCkSize, WORD wFlags);
  536. int FAR PASCAL medGetChunkLevel( HMED hMed );
  537. CKID FAR PASCAL medGetChunkID( HMED hMed );
  538. CKSIZE FAR PASCAL medGetChunkSize( HMED hMed );
  539. BOOL FAR PASCAL medFindAnyChunk( HMED hMed, CKID FAR * ackid );
  540. BOOL FAR PASCAL medFindChunk( HMED hMed, CKID id );
  541. LONG FAR PASCAL medGetSwapWORD( HMED hMed );
  542. /*
  543. * FUNCTIONs used in macros and such
  544. */
  545. LONG FAR PASCAL medIOFillBuff( HMED hMed, int size );
  546. LONG FAR PASCAL medIOFlushBuff( HMED hMed, DWORD dwElem, int size );
  547. BOOL FAR PASCAL medFlush( HMED hMed );
  548. LONG FAR PASCAL medUnGet( HMED hMed, DWORD dwElem, int size );
  549. /*
  550. * MACRO API's autodocked in riomac.d
  551. */
  552. /* RIFF stuff */
  553. #define medFCC3( fcc ) ( (BYTE)( (fcc & 0xFF000000) >> 24 ) )
  554. #define medFCC2( fcc ) ( (BYTE)( (fcc & 0x00FF0000) >> 16 ) )
  555. #define medFCC1( fcc ) ( (BYTE)( (fcc & 0x0000FF00) >> 8 ) )
  556. #define medFCC0( fcc ) ( (BYTE)(fcc & 0x000000FF) )
  557. /* constant RIFF chunk id */
  558. #define ckidRIFF medFOURCC( 'R', 'I', 'F', 'F' )
  559. /* lets the user set and check if the file is byteswapped */
  560. #define medGetByteSwapped( hMed ) ( (hMed)->info & MIOI_BYTESWAPPED )
  561. #define medSetByteSwapped( hMed, fVal ) ( (hMed)->info = ( fVal ? \
  562. ( (hMed)->info | MIOI_BYTESWAPPED ) : \
  563. ~((~((hMed)->info))|MIOI_BYTESWAPPED) ) )
  564. #define medHMEDtoMEDID( hMed ) ( (hMed)->medid )
  565. /*
  566. * UnGet Get and Put of BYTE WORD and DWORD and ByteSwapped versions
  567. * NOTE the ByteSwap function is in WINCOM and so WINCOM.H must be included
  568. * before the RESIO.H
  569. */
  570. #define medUnGetBYTE( hMed, ch ) ( (int)(medUnGet( hMed,(DWORD)ch,1 ) ) )
  571. #define medUnGetWORD( hMed, w ) ( (LONG)(medUnGet( hMed,(DWORD)w,2 ) ) )
  572. #define medUnGetDWORD( hMed, dw ) ( (LONG)(medUnGet( hMed,(DWORD)dw,4) ) )
  573. #define medUnGetSwapWORD(hMed,w) ( medUnGetWORD( hMed, \
  574. ByteSwapWORD((WORD)w) ) )
  575. #define medUnGetSwapDWORD(hMed,dw) ( medUnGetDWORD( hMed, \
  576. ByteSwapDWORD((DWORD)dw) ) )
  577. #define medUnGetOpSwapWORD( hMed, w ) ( medGetByteSwapped( hMed ) ? \
  578. medUnGetSwapWORD( hMed, w ) : \
  579. medUnGetWORD( hMed, w ) )
  580. #define medUnGetOpSwapDWORD( hMed, dw ) ( medGetByteSwapped( hMed ) ? \
  581. medUnGetSwapDWORD( hMed, dw ) : \
  582. medUnGetDWORD( hMed, dw ) )
  583. #define medGetBYTE( hMed ) ( (--((hMed)->nGet) >= 0) ? \
  584. (int)(BYTE)*(((hMed)->fpchPlace)++) : \
  585. (int)(medIOFillBuff( hMed, 1 )) )
  586. #define medPutBYTE( hMed, ch ) ( (--((hMed)->nPut) >= 0) ? \
  587. (int)(BYTE)((*(((hMed)->fpchPlace)++)) = (BYTE)ch) : \
  588. (int)(medIOFlushBuff(hMed,(DWORD)ch,1)) )
  589. /* note in the following macros we want to advance the fpchPlace */
  590. /* by the size after we get the value of it. To do this we typecast */
  591. /* them to int ( or long ) and add the size ( += size ) and then */
  592. /* subtract 4 so the value used is not incremented yet */
  593. #define medGetWORD( hMed ) ( (((hMed)->nGet -= 2) >= 0) ? \
  594. (long)*((WORD FAR *)((((LONG)((hMed)->fpchPlace))+=2)-2)) : \
  595. (long)(medIOFillBuff( hMed, 2 )) )
  596. #define medPutWORD( hMed, w ) ( (((hMed)->nPut -= 2) >= 0) ? \
  597. (long)((*((WORD FAR *)((((LONG)((hMed)->fpchPlace))+=2)-2)))=(WORD)w) :\
  598. (long)(medIOFlushBuff( hMed, (DWORD)w, 2 )) )
  599. #define medPutSwapWORD( hMed, w ) ( medPutWORD(hMed,ByteSwapWORD((WORD)w)) )
  600. #define medGetOpSwapWORD( hMed ) ( medGetByteSwapped( hMed ) ? \
  601. medGetSwapWORD( hMed ) : \
  602. medGetWORD( hMed ) )
  603. #define medPutOpSwapWORD( hMed, w ) ( medGetByteSwapped( hMed ) ? \
  604. medPutSwapWORD( hMed, w ) : \
  605. medPutWORD( hMed, w ) )
  606. #define medGetDWORD( hMed ) ( (((hMed)->nGet -= 4) >= 0) ? \
  607. (long)*((DWORD FAR *)((((LONG)((hMed)->fpchPlace))+=4)-4)) : \
  608. (long)(medIOFillBuff( hMed, 4 )) )
  609. #define medPutDWORD( hMed, dw ) ( (((hMed)->nPut -= 4) >= 0) ? \
  610. (long)((*((DWORD FAR *)((((LONG)((hMed)->fpchPlace))+=4)-4)))=(DWORD)dw): \
  611. (long)(medIOFlushBuff( hMed, (DWORD)dw, 4 )) )
  612. #define medGetSwapDWORD(hMed) (ByteSwapDWORD((DWORD)medGetDWORD(hMed)))
  613. #define medPutSwapDWORD(hMed,dw) (medPutDWORD(hMed,ByteSwapDWORD((DWORD)dw)))
  614. #define medGetOpSwapDWORD( hMed ) ( medGetByteSwapped( hMed ) ? \
  615. medGetSwapDWORD( hMed ) : \
  616. medGetDWORD( hMed ) )
  617. #define medPutOpSwapDWORD( hMed, dw ) ( medGetByteSwapped( hMed ) ? \
  618. medPutSwapDWORD( hMed, dw ) : \
  619. medPutDWORD( hMed, dw ) )
  620. /* for RIFF, read the FORMTYPE */
  621. #define medReadFormHeader( hMed ) medGetDWORD( hMed )
  622. #define medWriteFormHeader( hMed, formtype ) medPutDWORD( hMed, formtype )
  623. #define medGetFOURCC( hMed ) medGetDWORD( hMed )
  624. #define medPutFOURCC( hMed, fcc ) medPutDWORD( hMed, fcc )
  625. /* ERROR and EOF checks */
  626. #define medGetIOError( hMed ) ( (hMed)->flags & MIOF_ERROR )
  627. #define medGetIOEOF( hMed ) ( (hMed)->flags & MIOF_EOF )
  628. #endif /* _MEDMAN_H_ */