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.
435 lines
18 KiB
435 lines
18 KiB
/**INC+**********************************************************************/
|
|
/* Header: sclipdata.h */
|
|
/* */
|
|
/* Purpose: Clipboard Monitor global data definition */
|
|
/* */
|
|
/* Copyright(C) Microsoft Corporation 1998 */
|
|
/* */
|
|
/**INC-**********************************************************************/
|
|
|
|
#ifndef _H_ACBMDATA
|
|
#define _H_ACBMDATA
|
|
|
|
#ifndef INITGUID
|
|
#define INITGUID
|
|
#include <initguid.h>
|
|
#endif
|
|
|
|
#include <oleguid.h>
|
|
|
|
#ifndef PPVOID
|
|
typedef LPVOID * PPVOID;
|
|
#endif //PPVOID
|
|
|
|
#ifndef TS_STRING_FUNCS
|
|
#define TS_STRING_FUNCS
|
|
|
|
#define TS_PREPEND_STRING "\\\\tsclient\\"
|
|
#define LTS_PREPEND_STRING L"\\\\tsclient\\"
|
|
// TS_PREPEND_LENGTH is the number of characters in TS_PREPEND_STRING,
|
|
// not counting the terminating '\0'
|
|
#define TS_PREPEND_LENGTH (sizeof(TS_PREPEND_STRING) - sizeof(TS_PREPEND_STRING[0]))
|
|
#endif // ifndef TS_STRING_FUNCS
|
|
|
|
// GetDataSync EVENTS
|
|
#define TS_BLOCK_RECEIVED 0
|
|
#define TS_RECEIVE_COMPLETED 1
|
|
#define TS_RESET_EVENT 2
|
|
#define TS_DISCONNECT_EVENT 3
|
|
#define TS_NUM_EVENTS 4
|
|
|
|
|
|
// String length for the paste information string.
|
|
|
|
#define PASTE_PROGRESS_STRING_LENGTH 128
|
|
|
|
HRESULT CBMConvertToServerPathW(PVOID pOldData, PVOID pData, size_t cbDest) ;
|
|
HRESULT CBMConvertToServerPathA(PVOID pOldData, PVOID pData, size_t cbDest) ;
|
|
HRESULT CBMConvertToServerPath(PVOID pOldData, PVOID pData, size_t cbDest,
|
|
BOOL fWide) ;
|
|
ULONG CBMGetNewDropfilesSizeForServerW(PVOID pData, ULONG oldSize) ;
|
|
ULONG CBMGetNewDropfilesSizeForServerA(PVOID pData, ULONG oldSize) ;
|
|
ULONG CBMGetNewDropfilesSizeForServer(PVOID pData, ULONG oldSize, BOOL fWide) ;
|
|
|
|
HRESULT CBMConvertToClientPathW(PVOID pOldData, PVOID pData, size_t cbDest) ;
|
|
HRESULT CBMConvertToClientPathA(PVOID pOldData, PVOID pData, size_t cbDest) ;
|
|
HRESULT CBMConvertToClientPath(PVOID pOldData, PVOID pData, size_t cbDest,
|
|
BOOL fWide) ;
|
|
UINT CBMGetNewFilePathLengthForClient(PVOID pData, BOOL fWide) ;
|
|
UINT CBMGetNewFilePathLengthForClientW(WCHAR* szOldFilepath) ;
|
|
UINT CBMGetNewFilePathLengthForClientA(char* szOldFilepath) ;
|
|
ULONG CBMGetNewDropfilesSizeForClientW(PVOID pData, ULONG oldSize) ;
|
|
ULONG CBMGetNewDropfilesSizeForClientA(PVOID pData, ULONG oldSize) ;
|
|
ULONG CBMGetNewDropfilesSizeForClient(PVOID pData, ULONG oldSize, BOOL fWide) ;
|
|
|
|
int CBMCopyToTempDirectory(PVOID pSrcFiles, BOOL fWide) ;
|
|
int CBMCopyToTempDirectoryW(PVOID pSrcFiles) ;
|
|
int CBMCopyToTempDirectoryA(PVOID pSrcFiles) ;
|
|
|
|
|
|
class CImpIDataObject ;
|
|
typedef CImpIDataObject *PCImpIDataObject ;
|
|
|
|
class CEnumFormatEtc ;
|
|
|
|
class CClipData : public IUnknown
|
|
{
|
|
friend CImpIDataObject ;
|
|
friend CEnumFormatEtc ;
|
|
|
|
private:
|
|
LONG _cRef ;
|
|
TS_CLIP_PDU _ClipPDU ;
|
|
PCImpIDataObject _pImpIDataObject ;
|
|
|
|
public:
|
|
CClipData();
|
|
~CClipData(void);
|
|
|
|
HRESULT DCINTERNAL SetNumFormats(ULONG);
|
|
DCVOID SetClipData(HGLOBAL, DCUINT) ;
|
|
|
|
//IUnknown members that delegate to _pUnkOuter.
|
|
STDMETHODIMP QueryInterface(REFIID, PPVOID);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
} ;
|
|
|
|
typedef CClipData *PCClipData ;
|
|
|
|
class CImpIDataObject : public IDataObject
|
|
{
|
|
private:
|
|
LONG _cRef;
|
|
LPUNKNOWN _pUnkOuter;
|
|
ULONG _maxNumFormats ;
|
|
// Current number of formats in IDataObject
|
|
ULONG _numFormats ;
|
|
// Buffer of _maxNumFormats FORMATETC's
|
|
LPFORMATETC _pFormats ;
|
|
LPSTGMEDIUM _pSTGMEDIUM ; // Our fixed STGMEDIUM (always an HGLOBAL)
|
|
DCUINT _uiSTGType;
|
|
// _lastFormatRequested is used to see if we can avoid re-requesting the
|
|
// same data twice over the wire.
|
|
CLIPFORMAT _lastFormatRequested ;
|
|
CLIPFORMAT _cfDropEffect ;
|
|
BOOL _fAlreadyCopied ;
|
|
DWORD _dropEffect ; // We currently only support FO_COPY and FO_MOVE
|
|
LPVOID _fileName ;
|
|
|
|
DCVOID FreeSTGMEDIUM( void );
|
|
|
|
public:
|
|
PTS_CLIP_PDU _pClipPDU ;
|
|
CImpIDataObject(LPUNKNOWN);
|
|
~CImpIDataObject(void);
|
|
HRESULT Init(ULONG) ;
|
|
DCVOID SetClipData(HGLOBAL, DCUINT) ;
|
|
|
|
public:
|
|
//IUnknown members that delegate to _pUnkOuter.
|
|
STDMETHODIMP QueryInterface(REFIID, PPVOID);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
//IDataObject members
|
|
STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM);
|
|
STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM);
|
|
STDMETHODIMP QueryGetData(LPFORMATETC);
|
|
STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC, LPFORMATETC);
|
|
STDMETHODIMP SetData(LPFORMATETC, LPSTGMEDIUM, BOOL);
|
|
STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC *);
|
|
STDMETHODIMP DAdvise(LPFORMATETC, DWORD
|
|
, LPADVISESINK, DWORD *);
|
|
STDMETHODIMP DUnadvise(DWORD);
|
|
STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *);
|
|
};
|
|
|
|
class CEnumFormatEtc : public IEnumFORMATETC
|
|
{
|
|
private:
|
|
LONG _cRef;
|
|
LPUNKNOWN _pUnkRef;
|
|
LPFORMATETC _pFormats;
|
|
ULONG _iCur;
|
|
ULONG _cItems;
|
|
|
|
public:
|
|
CEnumFormatEtc(LPUNKNOWN);
|
|
~CEnumFormatEtc(void);
|
|
DCVOID Init(LPFORMATETC, ULONG) ;
|
|
|
|
//IUnknown members that delegate to _pUnkOuter.
|
|
STDMETHODIMP QueryInterface(REFIID, PPVOID);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
//IEnumFORMATETC members
|
|
STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG *);
|
|
STDMETHODIMP Skip(ULONG);
|
|
STDMETHODIMP Reset(void);
|
|
STDMETHODIMP Clone(IEnumFORMATETC **);
|
|
};
|
|
|
|
typedef CEnumFormatEtc *PCEnumFormatEtc;
|
|
|
|
/**STRUCT+*******************************************************************/
|
|
/* Structure: CBM_GLOBAL_DATA */
|
|
/* */
|
|
/* Description: Clipboard Monitor global data */
|
|
/****************************************************************************/
|
|
typedef struct tagCBM_GLOBAL_DATA
|
|
{
|
|
/************************************************************************/
|
|
/* Clipboard viewer chain information */
|
|
/************************************************************************/
|
|
HWND viewerWindow;
|
|
WNDCLASS viewerWindowClass;
|
|
HWND nextViewer;
|
|
DCBOOL notifyNextViewer;
|
|
|
|
/************************************************************************/
|
|
/* Our state information */
|
|
/************************************************************************/
|
|
DCUINT state;
|
|
DCBOOL open;
|
|
|
|
/************************************************************************/
|
|
/* Client uses ascii for format names */
|
|
/************************************************************************/
|
|
DCBOOL fUseAsciiNames;
|
|
|
|
/************************************************************************/
|
|
/* Server/client format ID map */
|
|
/************************************************************************/
|
|
CB_FORMAT_MAP idMap[CB_MAX_FORMATS];
|
|
|
|
/************************************************************************/
|
|
/* The registered message used to communicate between the two threads */
|
|
/* of the Clipboard Monitor */
|
|
/************************************************************************/
|
|
UINT regMsg;
|
|
|
|
/************************************************************************/
|
|
/* thread info */
|
|
/************************************************************************/
|
|
DCBOOL runThread;
|
|
HANDLE hDataThread;
|
|
|
|
/************************************************************************/
|
|
/* other useful data */
|
|
/************************************************************************/
|
|
DCUINT pendingClientID;
|
|
DCUINT pendingServerID;
|
|
ULONG logonId;
|
|
INT formatResponseCount;
|
|
|
|
/************************************************************************/
|
|
/* Virtual channel stuff */
|
|
/************************************************************************/
|
|
HANDLE vcHandle;
|
|
OVERLAPPED writeOL;
|
|
OVERLAPPED readOL;
|
|
PDCUINT8 rxpBuffer;
|
|
PDCUINT8 rxpNext;
|
|
DCUINT rxSize;
|
|
DCUINT rxLeft;
|
|
|
|
/************************************************************************/
|
|
/* Array of events */
|
|
/************************************************************************/
|
|
#define CLIP_EVENT_DISCONNECT 0
|
|
#define CLIP_EVENT_RECONNECT 1
|
|
#define CLIP_EVENT_READ 2
|
|
#define CLIP_EVENT_COUNT 3
|
|
HANDLE hEvent[CLIP_EVENT_COUNT];
|
|
|
|
/************************************************************************/
|
|
/* Already running mutex */
|
|
/************************************************************************/
|
|
HANDLE hMutex;
|
|
|
|
// GetDataSync is an array of event handles used to synchronize the
|
|
// transmission of data from the remote and local clipboard via the
|
|
// IDataObject::GetData interface function
|
|
|
|
// GetDataSync[TS_BLOCK_RECEIVED] is signaled if a datapacket arrives
|
|
// GetDataSync[TS_RECEIVE_COMPLETED] is signaled when the data stream is done sending data
|
|
// GetDataSync[TS_RESET_EVENT] is signaled when we need to reset/stop waiting
|
|
// GetDataSync[TS_DISCONNECT_EVENT] is signaled when a disconnect event occurs
|
|
HANDLE GetDataSync[TS_NUM_EVENTS] ;
|
|
// CClipData is the data object that encapsulates the IDataObject
|
|
PCClipData pClipData ;
|
|
|
|
// locatation where temp files will go; the +1 is for an extra NULL char
|
|
// that may be needed for the SHFileOperation
|
|
char tempDirA[MAX_PATH+1] ;
|
|
wchar_t tempDirW[MAX_PATH+1] ;
|
|
char baseTempDirA[MAX_PATH+1] ;
|
|
wchar_t baseTempDirW[MAX_PATH+1] ;
|
|
|
|
DWORD dropEffect ;
|
|
BOOL fFileCutCopyOn ;
|
|
BOOL fAlreadyCopied ;
|
|
|
|
BOOL fRegisteredForSessNotif;
|
|
BOOL fInClipboardChain;
|
|
|
|
WCHAR szPasteInfoStringW[PASTE_PROGRESS_STRING_LENGTH];
|
|
CHAR szPasteInfoStringA[PASTE_PROGRESS_STRING_LENGTH];
|
|
} CBM_GLOBAL_DATA;
|
|
/**STRUCT-*******************************************************************/
|
|
|
|
DC_GL_EXT CBM_GLOBAL_DATA CBM
|
|
|
|
#ifdef DC_DEFINE_GLOBAL_DATA
|
|
= { 0 }
|
|
#endif
|
|
;
|
|
|
|
/****************************************************************************/
|
|
/* CBM State Table */
|
|
/****************************************************************************/
|
|
DC_GL_EXT DCUINT cbmStateTable[CBM_NUMEVENTS][CBM_NUMSTATES]
|
|
|
|
#ifdef DC_DEFINE_GLOBAL_DATA
|
|
= {
|
|
|
|
/********************************************************************/
|
|
/* This is not a state table in the strict sense. It simply shows */
|
|
/* which events are valid in which states. It is not used to drive */
|
|
/* CB. */
|
|
/* */
|
|
/* Values mean */
|
|
/* - 0 event OK in this state. */
|
|
/* - 1 warning - event should not occur in this state, but does in */
|
|
/* some race conditions - ignore it. */
|
|
/* - 2 error - event should not occur in ths state at all. */
|
|
/* */
|
|
/* These values are hard-coded here in order to make the table */
|
|
/* readable. They correspond to the constants CBM_TABLE_OK, */
|
|
/* CBM_TABLE_WARN & CBM_TABLE_ERROR. */
|
|
/* */
|
|
/* Uninitialized */
|
|
/* | Initialized */
|
|
/* | | Connected */
|
|
/* | | | Local CB owner */
|
|
/* | | | | Shared CB owner */
|
|
/* | | | | | Pending format list rsp */
|
|
/* | | | | | | Pending format data rsp */
|
|
/* | | | | | | | */
|
|
/********************************************************************/
|
|
/* Start up */
|
|
{ 0, 2, 2, 2, 2, 2, 2}, /* CBM_MAIN */
|
|
|
|
/* local Window messages */
|
|
{ 2, 0, 0, 0, 0, 0, 0}, /* WM_CLOSE */
|
|
{ 0, 2, 2, 2, 2, 2, 2}, /* WM_CREATE */
|
|
{ 2, 0, 2, 2, 2, 2, 2}, /* WM_DESTROY */
|
|
{ 2, 0, 0, 0, 0, 0, 0}, /* WM_CHANGECBCHAIN */
|
|
{ 1, 1, 0, 0, 0, 0, 2}, /* WM_DRAWCLIPBOARD */
|
|
{ 2, 2, 0, 0, 2, 2, 2}, /* WM_RENDERFORMAT */
|
|
|
|
/* shared CB messages */
|
|
{ 2, 0, 1, 0, 2, 2, 2}, /* Connect */
|
|
{ 1, 1, 0, 0, 0, 0, 0}, /* Disconnect */
|
|
{ 2, 2, 0, 0, 0, 0, 0}, /* Format list */
|
|
{ 2, 2, 2, 2, 2, 0, 2}, /* Format list rsp */
|
|
{ 2, 2, 1, 1, 0, 1, 2}, /* Format data rq */
|
|
{ 2, 2, 2, 2, 2, 2, 0} /* Format data rsp */
|
|
}
|
|
#endif /* DC_DEFINE_GLOBAL_DATA */
|
|
;
|
|
|
|
#ifdef DC_DEBUG
|
|
/****************************************************************************/
|
|
/* State and event descriptions (debug build only) */
|
|
/****************************************************************************/
|
|
DC_GL_EXT const DCTCHAR cbmState[CBM_NUMSTATES][35]
|
|
#ifdef DC_DEFINE_GLOBAL_DATA
|
|
= {
|
|
_T("CBM_STATE_NOT_INIT"),
|
|
_T("CBM_STATE_INITIALIZED"),
|
|
_T("CBM_STATE_CONNECTED"),
|
|
_T("CBM_STATE_LOCAL_CB_OWNER"),
|
|
_T("CBM_STATE_SHARED_CB_OWNER"),
|
|
_T("CBM_STATE_PENDING_FORMAT_LIST_RSP"),
|
|
_T("CBM_STATE_PENDING_FORMAT_DATA_RSP")
|
|
}
|
|
#endif /* DC_DEFINE_GLOBAL_DATA */
|
|
;
|
|
|
|
DC_GL_EXT const DCTCHAR cbmEvent[CBM_NUMEVENTS][35]
|
|
#ifdef DC_DEFINE_GLOBAL_DATA
|
|
= {
|
|
_T("CBM_EVENT_CBM_MAIN"),
|
|
_T("CBM_EVENT_WM_CLOSE"),
|
|
_T("CBM_EVENT_WM_CREATE"),
|
|
_T("CBM_EVENT_WM_DESTROY"),
|
|
_T("CBM_EVENT_WM_CHANGECBCHAIN"),
|
|
_T("CBM_EVENT_WM_DRAWCLIPBOARD"),
|
|
_T("CBM_EVENT_WM_RENDERFORMAT"),
|
|
_T("CBM_EVENT_CONNECT"),
|
|
_T("CBM_EVENT_DISCONNECT"),
|
|
_T("CBM_EVENT_FORMAT_LIST"),
|
|
_T("CBM_EVENT_FORMAT_LIST_RSP"),
|
|
_T("CBM_EVENT_FORMAT_DATA_RQ"),
|
|
_T("CBM_EVENT_FORMAT_DATA_RSP")
|
|
}
|
|
#endif /* DC_DEFINE_GLOBAL_DATA */
|
|
;
|
|
|
|
#endif /* DC_DEBUG */
|
|
|
|
/****************************************************************************/
|
|
/* Excluded formats */
|
|
/****************************************************************************/
|
|
const DCTCHAR cbmExcludedFormatList[CBM_EXCLUDED_FORMAT_COUNT]
|
|
[TS_FORMAT_NAME_LEN]
|
|
= {
|
|
_T("Link" ),
|
|
_T("OwnerLink" ),
|
|
_T("ObjectLink" ),
|
|
_T("Link Source" ),
|
|
_T("Link Source Descriptor"),
|
|
|
|
_T("Embed Source" ),
|
|
_T("Embedded Object" )
|
|
// _T("Ole Private Data" ),
|
|
// _T("DataObject" ),
|
|
// _T("Object Descriptor" ),
|
|
// _T("Shell IDList Array" ),
|
|
// _T("Shell Object Offsets" ),
|
|
// _T("FileName" ),
|
|
// _T("FileNameW" ),
|
|
_T("FileContents" ),
|
|
_T("FileGroupDescriptor" ),
|
|
_T("FileGroupDescriptorW" ),
|
|
} ;
|
|
|
|
const DCTCHAR cbmExcludedFormatList_NO_RD[CBM_EXCLUDED_FORMAT_COUNT_NO_RD]
|
|
[TS_FORMAT_NAME_LEN]
|
|
= {
|
|
_T("Link" ),
|
|
_T("OwnerLink" ),
|
|
_T("ObjectLink" ),
|
|
_T("Link Source" ),
|
|
_T("Link Source Descriptor"),
|
|
|
|
_T("Embed Source" ),
|
|
_T("Embedded Object" )
|
|
_T("Ole Private Data" ),
|
|
_T("DataObject" ),
|
|
_T("Object Descriptor" ),
|
|
_T("Shell IDList Array" ),
|
|
_T("Shell Object Offsets" ),
|
|
_T("FileName" ),
|
|
_T("FileNameW" ),
|
|
_T("FileContents" ),
|
|
_T("FileGroupDescriptor" ),
|
|
_T("FileGroupDescriptorW" ),
|
|
} ;
|
|
|
|
|
|
#endif /* _H_ACBMDATA */
|
|
|