#if !defined( _UTILS_H_ )
#define _UTILS_H_


#define	STREAMTYPE_CONTROL		0x00000001
#define	STREAMTYPE_CACHE		0x00000002
#define	STREAMTYPE_CONTAINER	0x00000004
#define STREAMTYPE_OTHER \
	(!(STREAMTYPE_CONTROL | STREAMTYPE_CACHE | STREAMTYPE_CONTAINER))
#define	STREAMTYPE_ALL			0xFFFFFFFF


#define OPCODE_COPY					1
#define OPCODE_REMOVE				2
#define OPCODE_MOVE					3
#define OPCODE_EXCLUDEFROMCOPY		4

#define CONVERT_NOSOURCE			1
#define CONVERT_NODESTINATION		2

typedef struct tagPLACEABLEMETAHEADER {
	DWORD	key;		/* must be 0x9AC6CDD7L */
	HANDLE	hmf;		/* must be zero */
	RECT	bbox;		/* bounding rectangle of the metafile */
	WORD	inch;		/* # of metafile units per inch must be < 1440 */
						/* most apps use 576 or 1000 */
	DWORD	reserved;	/* must be zero */
	WORD	checksum;
} PLACEABLEMETAHEADER;




#ifdef  _MAC
#define UtMemCpy(lpdst,lpsrc,dwCount)   (BlockMove(lpsrc, lpdst, dwCount))
#else
#define UtMemCpy(lpdst,lpsrc,dwCount)   (hmemcpy(lpdst, lpsrc, dwCount))
#endif

FARINTERNAL_(BOOL)		UtGlobalHandleCpy(HANDLE FAR* lphdst, HANDLE hsrc);

FARINTERNAL_(HANDLE)	UtDupGlobal (HANDLE hSrc, UINT uiFlags=GMEM_MOVEABLE);

FARINTERNAL_(BOOL)		UtIsFormatSupported (LPDATAOBJECT lpObj, BOOL fGet,
							BOOL fSet, CLIPFORMAT cfFormat);

FARINTERNAL_(LPSTR)		UtDupString(LPCSTR lpszIn);


FARINTERNAL_(BOOL)		UtCopyFormatEtc(FORMATETC FAR* pFetcIn, 
							FORMATETC FAR* pFetcCopy);

FARINTERNAL_(int)		UtCompareFormatEtc(FORMATETC FAR* pFetcLeft, 
							FORMATETC FAR* pFetcRight);

FARINTERNAL_(BOOL)		UtCompareTargetDevice(DVTARGETDEVICE FAR* ptdLeft, 
							DVTARGETDEVICE FAR* ptdRight);

FARINTERNAL_(BOOL)		UtCopyStatData(STATDATA FAR* pSDIn, 
							STATDATA FAR* pSDCopy);

FARINTERNAL_(void)		UtReleaseStatData(STATDATA FAR* pStatData);


FARINTERNAL_(HPALETTE)	UtDupPalette(HPALETTE hpalette);

FARINTERNAL_(int)		UtPaletteSize (int iBitCount);

FARINTERNAL_(DWORD)		UtFormatToTymed	(CLIPFORMAT cf);


FARINTERNAL_(BOOL)		UtQueryPictFormat(LPDATAOBJECT lpSrcDataObj, 
								LPFORMATETC	lpforetc);
								
FARINTERNAL_(HBITMAP)	UtConvertDibToBitmap(HANDLE hDib);
								
FARINTERNAL_(HANDLE)	UtConvertBitmapToDib(HBITMAP hBitmapm, 
								HPALETTE hpal = NULL);

FARINTERNAL_(void)		UtGetClassID(LPUNKNOWN lpUnk, CLSID FAR* lpClsid);

FARINTERNAL_(DVTARGETDEVICE FAR*) UtCopyTargetDevice(DVTARGETDEVICE FAR* ptd);

FARINTERNAL				UtGetIconData(LPDATAOBJECT lpSrcDataObj, 
							REFCLSID rclsid, LPFORMATETC lpforetc, 
							LPSTGMEDIUM lpstgmed);

OLEAPI					UtDoStreamOperation (LPSTORAGE pstgSrc, 
							LPSTORAGE pstgDst, int iOpCode, 
							DWORD grfAllowedStmTypes);

							
FARINTERNAL_(LPSTR)		UtStrRChr (LPCSTR sz, const char ch);

FARINTERNAL_(void)		UtGetPresStreamName (LPSTR lpszName, int iStreamNum);

FARINTERNAL_(void)		UtRemoveExtraOlePresStreams (LPSTORAGE pstg, 
							int iStart);

							
							
/*** Following routines can be found in convert.cpp *****/

FARINTERNAL				UtGetHGLOBALFromStm(LPSTREAM lpstream, DWORD dwSize, 
							HANDLE FAR* lphPres);
							
FARINTERNAL				UtGetHDIBFromDIBFileStm(LPSTREAM pstm, 
							HANDLE FAR* lphdata);

FARINTERNAL_(HANDLE)	UtGetHMFPICT(HMETAFILE hMF, BOOL fDeletOnError,
							DWORD xExt, DWORD yExt);
							
FARINTERNAL				UtGetHMFFromMFStm(LPSTREAM lpstream, DWORD dwSize, 
							BOOL fConvert, HANDLE FAR* lphPres);

FARINTERNAL				UtGetSizeAndExtentsFromPlaceableMFStm(LPSTREAM pstm,
							DWORD FAR* dwSize, LONG FAR* plWidth,  
							LONG FAR* plHeight);
		 
FARINTERNAL				UtGetHMFPICTFromPlaceableMFStm(LPSTREAM pstm, 
							HANDLE FAR* lphdata);

FARINTERNAL				UtHGLOBALToStm(HANDLE hdata, DWORD dwSize, 
							LPSTREAM pstm);

FARINTERNAL_(void)		UtGetDibExtents (LPBITMAPINFOHEADER lpbmi, 
							LONG FAR* plWidth, LONG FAR* plHeight);

FARINTERNAL				UtHDIBToDIBFileStm(HANDLE hdata, 
							DWORD dwSize, LPSTREAM pstm);

FARINTERNAL				UtDIBStmToDIBFileStm(LPSTREAM pstmDIB, 
							DWORD dwSize, LPSTREAM pstmDIBFile);

FARINTERNAL				UtHDIBFileToOlePresStm(HANDLE hdata, LPSTREAM pstm);

FARINTERNAL				UtHMFToMFStm(HANDLE FAR* lphMF, DWORD dwSize, 
							LPSTREAM lpstream); 
							
FARINTERNAL				UtHMFToPlaceableMFStm(HANDLE FAR* lphMF, 
							DWORD dwSize, LONG lWidth, LONG lHeight,
							LPSTREAM pstm);		
								
FARINTERNAL				UtMFStmToPlaceableMFStm(LPSTREAM pstmMF,
							DWORD dwSize, LONG lWidth, LONG lHeight, 
							LPSTREAM pstmPMF);

FARINTERNAL				UtReadOlePresStmHeader (LPSTREAM pstm, 
							LPFORMATETC pforetc, DWORD FAR* pdwAdvf, 
							BOOL FAR* pfConvert);

FARINTERNAL				UtWriteOlePresStmHeader(LPSTREAM lppstream, 
							LPFORMATETC pforetc, DWORD dwAdvf);

FARINTERNAL				UtOlePresStmToContentsStm (LPSTORAGE pstg, 
							LPSTR lpszPresStm, BOOL fDeletePresStm,
							UINT FAR* puiStatus);
							
/*** Following routines can be found in ..\dde\client\ddecnvrt.cpp *****/

							
FARINTERNAL				UtGetHMFPICTFromMSDrawNativeStm (LPSTREAM pstm,	
							DWORD dwSize, HANDLE FAR* lphdata);	
							
FARINTERNAL				UtPlaceableMFStmToMSDrawNativeStm (LPSTREAM pstmPMF, 
							LPSTREAM pstmMSDraw);
			
FARINTERNAL				UtDIBFileStmToPBrushNativeStm (LPSTREAM pstmDIBFile, 
							LPSTREAM pstmPBrush);
							
FARINTERNAL_(HANDLE)	UtGetHPRESFromNative (LPSTORAGE pstg, 
							CLIPFORMAT cfFormat, BOOL fOle10Native);
							
FARINTERNAL				UtContentsStmTo10NativeStm (LPSTORAGE pstg, 
							REFCLSID rclsid, BOOL fDeleteContents, 
							UINT FAR* puiStatus);

FARINTERNAL				Ut10NativeStmToContentsStm(LPSTORAGE pstg, 
							REFCLSID rclsid, BOOL fDeleteSrcStm);
		
#endif // _UTILS_H