home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 November
/
Chip_2002-11_cd1.bin
/
zkuste
/
vbasic
/
Data
/
Utils
/
WME71SDK.exe
/
RCDATA
/
CABINET
/
common.h
< prev
next >
Wrap
C/C++ Source or Header
|
2001-03-02
|
13KB
|
499 lines
#ifndef __UTILSVJIEF_H
#define __UTILSVJIEF_H
#define EVENT_ID 100
#define WM_ENCODER_EVENT WM_USER + 2
#define HR_TEST(hr) if(FAILED(hr)) return hr; \
// menu id's
#define ID_MENU_START 100
#define ID_MENU_STOP 101
#define ID_MENU_RESET 102
class CEncoderView;
typedef HRESULT (CEncoderView::*LPFNDISPLAY)(HTREEITEM hItem,IUnknown* pUnk);
CString _cdecl GetErrorFromHR(HRESULT hr);
CString _cdecl GetError();
using namespace std;
extern map<short,CString> g_mapShortToString;
extern map<WMENC_ENCODER_STATE,CString> g_mapRunState;
extern map<WMENC_ARCHIVE_STATE,CString> g_archMap;
extern map<WMENC_INDEXER_STATE,CString> g_mapIndexerState;
extern map<WMENC_ARCHIVE_OPERATION,CString> g_mapIndexerOp;
extern map<WMENC_SOURCE_TYPE ,CString> g_mapSourceType;
extern map<WMENC_PLUGIN_TYPE ,CString> g_mapPluginType;
extern map<WMENC_ARCHIVE_OPERATION ,CString> g_mapArchOp;
extern map<long,CString> g_mapEventIDToDisplayString;
extern map<WMENC_SOURCE_STATE ,CString> g_mapSrcState;
extern map<WMENC_BROADCAST_PROTOCOL ,CString> g_mapBrProtocol;
struct ARCHIVESTATECHANGE
{
WMENC_ARCHIVE_TYPE m_archiveType;
WMENC_ARCHIVE_OPERATION m_archiveOperation;
};
struct CONFIGCHANGE
{
long m_lHr;
CComBSTR m_bstr;
CONFIGCHANGE()
:m_lHr(0)
,m_bstr(_T(""))
{
}
};
struct CLIENTCONNECT
{
WMENC_BROADCAST_PROTOCOL m_BrProtocol;
CComBSTR m_bstr;
// default values
CLIENTCONNECT()
:m_BrProtocol(WMENC_PROTOCOL_HTTP)
,m_bstr(_T(""))
{
}
};
struct CLIENTDISCONNECT
{
WMENC_BROADCAST_PROTOCOL m_BrProtocol;
CComBSTR m_bstr;
CLIENTDISCONNECT()
:m_BrProtocol(WMENC_PROTOCOL_HTTP)
,m_bstr(_T(""))
{
}
};
struct SOURCESTATECHANGE
{
WMENC_SOURCE_STATE m_State;
WMENC_SOURCE_TYPE m_SrcType;
short m_nIndex;
CComBSTR m_bstrSG;
// there are no default values for this as such, so using just the basic defaults
SOURCESTATECHANGE()
:m_State((WMENC_SOURCE_STATE)0)
,m_SrcType((WMENC_SOURCE_TYPE)0)
,m_nIndex(0)
,m_bstrSG(_T(""))
{
}
};
struct INDEXERSTATECHANGE
{
WMENC_INDEXER_STATE m_IndexerStateChange;
CComBSTR m_bstrFile;
// there are no default values for this as such, so using just the basic defaults
INDEXERSTATECHANGE()
:m_IndexerStateChange((WMENC_INDEXER_STATE)0)
,m_bstrFile(_T(""))
{
}
};
// utility classes borrowed from MFC
class CSyncObject
{
public:
CSyncObject(LPCTSTR pstrName);
// Attributes
public:
operator HANDLE() const
{
return m_hObject;
}
HANDLE m_hObject;
// Operations
virtual BOOL Lock(DWORD dwTimeout = INFINITE);
virtual BOOL Unlock() = 0;
virtual BOOL Unlock(LONG /* lCount */, LPLONG /* lpPrevCount=NULL */)
{ return TRUE; }
// Implementation
public:
virtual ~CSyncObject();
#ifdef _DEBUG
tstring m_strName;
#endif
friend class CSingleLock;
};
class CEvent : public CSyncObject
{
// Constructor
public:
// Operations
public:
CEvent(BOOL bInitiallyOwn = FALSE,
BOOL bManualReset = FALSE,
LPCTSTR lpszNAme = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL)
: CSyncObject(lpszNAme)
{
m_hObject = ::CreateEvent(lpsaAttribute, bManualReset,
bInitiallyOwn, lpszNAme);
}
virtual CEvent::~CEvent()
{
}
BOOL SetEvent()
{
_ASSERT(m_hObject != NULL);
BOOL bRet = ::SetEvent(m_hObject);
_ASSERT(bRet);
return bRet;
}
BOOL PulseEvent()
{
_ASSERT(m_hObject != NULL);
return ::PulseEvent(m_hObject);
}
BOOL ResetEvent()
{
_ASSERT(m_hObject != NULL);
return ::ResetEvent(m_hObject);
}
BOOL Unlock();
// Implementation
public:
};
class CSingleLock
{
// Constructors
public:
CSingleLock(CSyncObject* pObject, BOOL bInitialLock = FALSE);
// Operations
public:
BOOL Lock(DWORD dwTimeOut = INFINITE);
BOOL Unlock();
BOOL Unlock(LONG lCount, LPLONG lPrevCount = NULL);
BOOL IsLocked();
// Implementation
public:
~CSingleLock()
{
Unlock();
}
protected:
CSyncObject* m_pObject;
HANDLE m_hObject;
BOOL m_bAcquired;
};
// event sink object for encoder
class CEncoderEventSink :
public CComObjectRootEx<CComMultiThreadModel>,
public IDispEventImpl<EVENT_ID,CEncoderEventSink,&DIID__IWMEncoderEvents,&LIBID_WMEncoderLib>
{
public:
static _ATL_FUNC_INFO StateChangeInfo;
static _ATL_FUNC_INFO ErrorInfo;
static _ATL_FUNC_INFO ArchiveStateChangeInfo;
static _ATL_FUNC_INFO ConfigChangeInfo;
static _ATL_FUNC_INFO ClientConnectInfo;
static _ATL_FUNC_INFO ClientDisconnectInfo;
static _ATL_FUNC_INFO SourceStateChangeInfo;
static _ATL_FUNC_INFO IndexerStateChangeInfo;
BEGIN_COM_MAP(CEncoderEventSink)
END_COM_MAP()
public:
BEGIN_SINK_MAP(CEncoderEventSink)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_STATECHANGE, OnStateChange,&StateChangeInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_ERROR, OnError,&ErrorInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_ARCHIVESTATECHANGE, OnArchiveStateChange,&ArchiveStateChangeInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_CONFIGCHANGE, OnConfigChange,&ConfigChangeInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_CLIENTCONNECT, OnClientConnect,&ClientConnectInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_CLIENTDISCONNECT, OnClientDisconnect,&ClientDisconnectInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_SRCSTATECHANGE, OnSourceStateChange,&SourceStateChangeInfo)
SINK_ENTRY_INFO(EVENT_ID,DIID__IWMEncoderEvents,DISPID_ENCODEREVENT_INDEXERSTATECHANGE, OnIndexerStateChange,&IndexerStateChangeInfo)
END_SINK_MAP()
public:
STDMETHOD(OnStateChange)(/*[in]*/ WMENC_ENCODER_STATE enumState);
STDMETHOD(OnError)(/*[in]*/ long hResult);
STDMETHOD(OnArchiveStateChange)(/*[in]*/ WMENC_ARCHIVE_TYPE enumArchive,
/*[in] */ WMENC_ARCHIVE_OPERATION enumState);
STDMETHOD(OnConfigChange)(/*[in]*/ long hResult,
/*[in]*/ BSTR bstr);
STDMETHOD(OnClientConnect)(/*[in]*/ WMENC_BROADCAST_PROTOCOL protocol,
/*[in]*/ BSTR bstr);
STDMETHOD(OnClientDisconnect)(/*[in]*/ WMENC_BROADCAST_PROTOCOL protocol,
/*[in]*/ BSTR bstr);
STDMETHOD(OnSourceStateChange)(/*[in]*/ WMENC_SOURCE_STATE enumState,
/*[in]*/ WMENC_SOURCE_TYPE enumType,
/*[in]*/ short iIndex
,BSTR bstrSG);
STDMETHOD(OnIndexerStateChange)(/*[in]*/ WMENC_INDEXER_STATE enumIndexerState,
/*[in]*/ BSTR bstrFile);
CEvent m_eveStateChange;
CEvent m_eveArchiveState;
CEvent m_eveConfig;
CEvent m_eveClientConnect;
CEvent m_eveClientDisconnect;
CEvent m_eveSourceState;
CEvent m_eveIndexerState;
CEvent m_eveError;
CEvent m_EventCalled; // this is the master event for which the object waits and when this is
// signalled it checks for the other events
WMENC_ENCODER_STATE m_StateChange;
long m_lError;
ARCHIVESTATECHANGE m_archiveStateChange;
CONFIGCHANGE m_ConfigChange;
CLIENTCONNECT m_ClientConnect;
CLIENTDISCONNECT m_ClientDisconnect;
SOURCESTATECHANGE m_srcStateChange;
INDEXERSTATECHANGE m_IndexerStateChange;
// member to callback so that the client don't have to create a separate thread and wait for
// the event, needed for encview
HWND m_hMsgWnd;
DWORD m_dwParam; // to be passed back while sending the message
CEncoderEventSink()
:m_hMsgWnd(NULL)
,m_dwParam(0)
{
}
~CEncoderEventSink()
{
}
};
inline STDMETHODIMP CEncoderEventSink::OnStateChange(WMENC_ENCODER_STATE enumState)
{
using namespace std;
m_StateChange = enumState;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveStateChange.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
map<WMENC_ENCODER_STATE,CString> runMap;
runMap[WMENC_ENCODER_STARTING] = _T("WMENC_ENCODER_STARTING");
runMap[WMENC_ENCODER_RUNNING ] = _T("WMENC_ENCODER_RUNNING ");
runMap[WMENC_ENCODER_PAUSED ] = _T("WMENC_ENCODER_PAUSED ");
runMap[WMENC_ENCODER_STOPPING ] = _T("WMENC_ENCODER_STOPPING ");
runMap[WMENC_ENCODER_STOPPED ] = _T("WMENC_ENCODER_STOPPED ");
//::MessageBox(NULL,runMap[enumState],_T("Encoder state change"),MB_OK);
ATLTRACE("State change = %s\n",runMap[enumState]);
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnError(long hResult)
{
m_lError = hResult;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveError.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnArchiveStateChange(WMENC_ARCHIVE_TYPE enumArchive,
WMENC_ARCHIVE_OPERATION enumState)
{
m_archiveStateChange.m_archiveType = enumArchive;
m_archiveStateChange.m_archiveOperation = enumState;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveArchiveState.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnConfigChange(long hResult,BSTR bstr)
{
m_ConfigChange.m_lHr = hResult;
m_ConfigChange.m_bstr = bstr;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveConfig.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnClientConnect(WMENC_BROADCAST_PROTOCOL protocol,BSTR bstr)
{
m_ClientConnect.m_bstr = bstr;
m_ClientConnect.m_BrProtocol = protocol;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveClientConnect.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnClientDisconnect(WMENC_BROADCAST_PROTOCOL protocol, BSTR bstr)
{
m_ClientDisconnect.m_BrProtocol = protocol;
m_ClientDisconnect.m_bstr = bstr;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveClientDisconnect.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnSourceStateChange(WMENC_SOURCE_STATE enumState, WMENC_SOURCE_TYPE enumType,
short iIndex, BSTR bstrSG)
{
m_srcStateChange.m_nIndex = iIndex;
m_srcStateChange.m_SrcType = enumType;
m_srcStateChange.m_State = enumState;
m_srcStateChange.m_bstrSG = bstrSG;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveSourceState.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
inline STDMETHODIMP CEncoderEventSink::OnIndexerStateChange(WMENC_INDEXER_STATE enumIndexerState, BSTR bstrFile)
{
m_IndexerStateChange.m_bstrFile = bstrFile;
m_IndexerStateChange.m_IndexerStateChange = enumIndexerState;
BOOL bRet = m_EventCalled.SetEvent();
_ASSERT(bRet);
bRet = m_eveIndexerState.SetEvent();
_ASSERT(bRet);
if(m_hMsgWnd)
{
::SendMessage(m_hMsgWnd,WM_ENCODER_EVENT,(WPARAM)m_dwParam,0);
}
return S_OK;
}
struct TREEDATA
{
LPFNDISPLAY pfnDisplay;
IUnknown* pUnk;
TREEDATA()
:pUnk(NULL)
,pfnDisplay(NULL)
{
}
TREEDATA(IUnknown* pUnk1, LPFNDISPLAY pfn)
:pUnk(pUnk1)
,pfnDisplay(pfn)
{
if(pUnk)
pUnk->AddRef();
}
TREEDATA(const TREEDATA& data)
{
pUnk = data.pUnk;
if(pUnk)
pUnk->AddRef();
pfnDisplay = data.pfnDisplay;
}
virtual ~TREEDATA()
{
if(pUnk)
pUnk->Release();
}
};
// this extra member is needed to receive events in case we are an encoder node
struct ENCDATA : public TREEDATA
{
CEncoderEventSink* pEvent;
ENCDATA()
:pEvent(NULL)
{
}
ENCDATA(IUnknown* pUnk1, LPFNDISPLAY pfn, CEncoderEventSink* pEve)
:TREEDATA(pUnk1, pfn), pEvent(pEve)
{
}
~ENCDATA()
{
CComQIPtr<IWMEncoder> pEnc(pUnk);
if(pEnc)
{
pEvent->DispEventUnadvise(pEnc);
}
if(pEvent)
delete pEvent;
}
};
typedef TREEDATA *LPTREEDATA;
void InitMaps();
#endif //__UTILSVJIEF_H