home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 November
/
Chip_2002-11_cd1.bin
/
zkuste
/
vbasic
/
Data
/
Utils
/
WME71SDK.exe
/
RCDATA
/
CABINET
/
encoderview.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-03-02
|
47KB
|
1,739 lines
// EncoderView.cpp : Implementation of CEncoderView
#include "stdafx.h"
#include "Encview.h"
#include "common.h"
#include "EncoderView.h"
/////////////////////////////////////////////////////////////////////////////
// CEncoderView
CEncoderView::CEncoderView()
:m_bDragging(false)
,m_hDragItem(NULL)
{
m_bWindowOnly = TRUE;
CalcExtent(m_sizeExtent);
InitMaps();
}
HRESULT CEncoderView::FinalConstruct()
{
return S_OK;
}
void CEncoderView::FinalRelease()
{
}
STDMETHODIMP CEncoderView::get_Root(IDispatch **pVal)
{
HRESULT hr = NOERROR;
if(!pVal)
{
return E_POINTER;
}
*pVal = m_pRoot;
if(*pVal)
(*pVal)->AddRef();
return S_OK;
}
STDMETHODIMP CEncoderView::put_Root(IDispatch *newVal)
{
m_pRoot = newVal;
return S_OK;
}
// use root whenever possible, if it's absent, use machine name
STDMETHODIMP CEncoderView::Refresh()
{
HRESULT hr = NOERROR;
DeleteChildren(NULL);
if(m_pRoot)
{
CComQIPtr<IWMEncoder> pEnc(m_pRoot);
if(pEnc!=NULL)
hr = DisplayEncoder(pEnc, NULL);
}
// display all machines that we are given
else
{
if(m_vecMachines.empty())
return hr;
using namespace std;
USES_CONVERSION;
for(int i=0; i< m_vecMachines.size();i++)
{
CComPtr<IWMEncoderAgent> pAgent;
CComPtr<IWMEncoderNamesCollection> pEncCol;
CComPtr<IDispatch> pDisp;
CComPtr<IClassFactory> pCF;
HRESULT hr = NOERROR;
COSERVERINFO cs;
ZeroMemory(&cs,sizeof(cs));
USES_CONVERSION;
cs.pwszName = T2W((LPTSTR)(LPCTSTR)(m_vecMachines[i]));
hr = ::CoGetClassObject(CLSID_WMEncoderAgent,CLSCTX_ALL,
&cs,IID_IClassFactory, (VOID**)&pCF);
if(SUCCEEDED(hr))
{
hr = pCF->CreateInstance(NULL,IID_IWMEncoderAgent,(void**)&pAgent);
if(SUCCEEDED(hr))
{
CComPtr<IUnknown> pUnk;
hr = pAgent.QueryInterface(&pUnk);
if(SUCCEEDED(hr))
{
InsertNode((HTREEITEM)NULL,m_vecMachines[i],pUnk.p,
&CEncoderView::ShowMachineDetails);
}
}
}
if(FAILED(hr))
{
CString strError = GetErrorFromHR(hr);
InsertNode((HTREEITEM)NULL,strError,NULL,
NULL);
}
}
}
return hr;
}
// helper functions
HTREEITEM CEncoderView::InsertNode(HTREEITEM hParent, CString strText, LPUNKNOWN pUnk, LPFNDISPLAY pfn)
{
TREEDATA* ptd = new TREEDATA(pUnk,pfn);
if(!ptd)
return NULL;
USES_CONVERSION;
TV_INSERTSTRUCT tvs;
ZeroMemory(&tvs, sizeof(tvs));
tvs.hParent = hParent;
tvs.hInsertAfter = TVI_LAST;
tvs.item.mask = TVIF_CHILDREN | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvs.item.cChildren = 1;
tvs.item.lParam = (LPARAM)ptd;
tvs.item.pszText = (LPTSTR)(LPCTSTR)strText;
tvs.item.cchTextMax = MAX_PATH;
tvs.item.iImage = 0;
tvs.item.iSelectedImage = 1;
return m_Tree.InsertItem(&tvs);
}
HTREEITEM CEncoderView::InsertNode(HTREEITEM hParent, CString strText, TREEDATA* pData)
{
USES_CONVERSION;
TV_INSERTSTRUCT tvs;
ZeroMemory(&tvs, sizeof(tvs));
tvs.hParent = hParent;
tvs.hInsertAfter = TVI_LAST;
tvs.item.mask = TVIF_CHILDREN | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvs.item.cChildren = 1;
tvs.item.lParam = (LPARAM)pData;
tvs.item.pszText = (LPTSTR)(LPCTSTR)strText;
tvs.item.cchTextMax = MAX_PATH;
tvs.item.iImage = 0;
tvs.item.iSelectedImage = 1;
return m_Tree.InsertItem(&tvs);
}
HRESULT CEncoderView::DisplayEncoder(IWMEncoder* pEnc, HTREEITEM hParent)
{
if(!pEnc)
return E_POINTER;
HRESULT hr = NOERROR;
CComBSTR bstrName;
hr = pEnc->get_Name(&bstrName);
HR_TEST(hr);
USES_CONVERSION;
CString strName = W2T(bstrName);
CComObject<CEncoderEventSink>* pSink = NULL;
hr = CComObject<CEncoderEventSink>::CreateInstance(&pSink);
HR_TEST(hr);
CComPtr<IUnknown> pUnk;
hr = pEnc->QueryInterface(IID_IUnknown, (void**)&pUnk);
HR_TEST(hr);
HTREEITEM hItem = NULL;
if(pSink)
{
pSink->AddRef();
ENCDATA* pData = new ENCDATA((LPUNKNOWN)pUnk.p, &CEncoderView::ShowEncoderDetails, pSink);
hr = pSink->DispEventAdvise(pEnc);
pSink->m_hMsgWnd = m_hWnd;
hItem = InsertNode(hParent, strName,pData);
pSink->m_dwParam = (DWORD)hItem;
}
else
{
hItem = InsertNode(hParent, strName, (LPUNKNOWN)pUnk.p, &CEncoderView::ShowEncoderDetails);
}
if(hItem)
m_Tree.Expand(hItem);
return hr;
}
// message handlers
LRESULT CEncoderView::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
InitTreeView();
m_Tree.Attach(GetDlgItem(IDC_TREE_ENCODER));
_ASSERT(m_Tree.IsWindow());
m_ImageList.Create(IDB_ENCODERVIEW,16,0,0);
_ASSERT(m_ImageList!=NULL);
m_Tree.SetImageList(m_ImageList,TVSIL_NORMAL );
Refresh();
return 0;
}
LRESULT CEncoderView::OnItemexpandingTree_encoder(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)pnmh;
if(pnmtv->action==TVE_COLLAPSE)
return 0L;
LPTREEDATA lptrdata = (LPTREEDATA)pnmtv->itemNew.lParam;
if((lptrdata==NULL) || (lptrdata->pfnDisplay==NULL) || (lptrdata->pUnk==NULL))
{
return 0;
}
//if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
// return 0L;
// clean up all items first
DeleteChildren(pnmtv->itemNew.hItem);
_ASSERT(lptrdata->pUnk);
LPFNDISPLAY pfn = lptrdata->pfnDisplay;
//(lptrdata->*pfnDisplay)(pnmtv->itemOld.hItem,lptrdata->pUnk);
(this->*pfn)(pnmtv->itemNew.hItem,lptrdata->pUnk);
bHandled = FALSE;
return 0;
}
LRESULT CEncoderView::OnDeleteitemTree_encoder(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)pnmh;
LPTREEDATA lptrdata = (LPTREEDATA)pnmtv->itemOld.lParam;
if(lptrdata)
delete lptrdata;
return 0;
}
LRESULT CEncoderView::OnBegindragTree_encoder(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)pnmh;
m_hDragItem = pnmtv->itemNew.hItem;
CImageList ImageList = m_Tree.CreateDragImage(m_hDragItem);
m_ImageList.BeginDrag(0,0,0);
ShowCursor(FALSE);
SetCapture();
m_bDragging = true;
CPoint pt(pnmtv->ptDrag);
m_Tree.ClientToScreen(&pt);
m_ImageList.DragEnter(NULL,pt);
return 0;
}
LRESULT CEncoderView::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if(m_bDragging)
{
CPoint pt(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam));
m_ImageList.DragLeave(NULL);
UINT flags;
HTREEITEM hHitItem = m_Tree.HitTest(pt,&flags);
if(hHitItem)
{
m_Tree.SelectDropTarget(hHitItem);
}
m_Tree.ClientToScreen(&pt);
m_ImageList.DragMove(pt);
m_ImageList.DragEnter(NULL,pt);
}
return 0;
}
LRESULT CEncoderView::OnLButtonUP(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if(m_bDragging)
{
m_ImageList.DragLeave(NULL);
m_ImageList.EndDrag();
ReleaseCapture();
CPoint pt(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam));;
UINT nFlags;
HTREEITEM hHitItem = m_Tree.HitTest(pt,&nFlags);
if(hHitItem && (nFlags &TVHT_ONITEM ))
{
Move(m_hDragItem,hHitItem);
}
ShowCursor(TRUE) ;
m_bDragging = false;
}
return 0;
}
LRESULT CEncoderView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if(HIWORD(wParam)!=0) // not from menu
return 0;
UINT nID = LOWORD(wParam);
CComPtr<IWMEncoder> pEnc;
GetSelectedEncoder(&pEnc);
if(!pEnc)
return 0;
switch(nID)
{
case ID_MENU_START:
pEnc->Start();
break;
case ID_MENU_STOP:
pEnc->Stop();
break;
case ID_MENU_RESET:
pEnc->Reset();
break;
default:
break;
}
return 0;
}
HRESULT CEncoderView::GetSelectedEncoder(IWMEncoder** pEnc)
{
HRESULT hr = NOERROR;
if(!pEnc)
return E_POINTER;
HTREEITEM hItem = m_Tree.GetSelectedItem();
if(hItem)
{
LPTREEDATA lpdata = (LPTREEDATA)m_Tree.GetItemData(hItem);
if(!lpdata)
return hr;
hr = lpdata->pUnk->QueryInterface(IID_IWMEncoder, (void**)pEnc);
}
return hr;
}
// we first find out what type of node this is, and then show corresponding context menu.
// simple way to handle this would be to store the type information of the node at the node itself
// but more elegant solution we will use is to get the IUnknown stored here and then QI it to
// find out who the node is and then show the corresponding context menu
// so we use a map that maps all the interfaces that have context id's to the menu id
LRESULT CEncoderView::OnContextMenu(int , LPNMHDR pnmh, BOOL& )
{
// we currently have popup menu's only for the encoder, so we check if the item hit was
// encoder, or else we simply return
DWORD dwPos = ::GetMessagePos();
POINT pt = {LOWORD(dwPos), HIWORD(dwPos)};
if(pnmh->hwndFrom ==m_Tree.m_hWnd)
{
TV_HITTESTINFO tvhti;
TV_ITEM tvi;
m_Tree.ScreenToClient(&pt);
tvhti.pt = pt;
m_Tree.HitTest(&tvhti);
m_Tree.SelectItem(tvhti.hItem);
if (tvhti.flags & TVHT_ONITEMLABEL)
{
m_Tree.ClientToScreen(&pt);
tvi.mask=TVIF_PARAM;
tvi.hItem=tvhti.hItem;
if (!m_Tree.GetItem(&tvi))
return 0;
LPTREEDATA lpt=(LPTREEDATA)tvi.lParam;
if(!lpt || !lpt->pUnk )
return 0;
CComQIPtr<IWMEncoder> pEnc(lpt->pUnk);
if(!pEnc)
return 0;
CMenu Menu;
if(!Menu.CreatePopupMenu())
return 0;
BOOL bRet = FALSE;
bRet = Menu.AppendMenu(MF_STRING | MF_ENABLED, ID_MENU_START, _T("&Start"));
_ASSERT(bRet);
bRet = Menu.AppendMenu(MF_STRING | MF_ENABLED, ID_MENU_STOP, _T("&Stop"));
_ASSERT(bRet);
bRet = Menu.AppendMenu(MF_STRING | MF_ENABLED, ID_MENU_RESET, _T("&Reset"));
_ASSERT(bRet);
Menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,pt.x ,pt.y ,m_hWnd);
}
}
return 0;
}
UINT CEncoderView::GetItemIndex(CTreeItem& Item)
{
CTreeItem ParentItem(Item.GetParent());
if(ParentItem==NULL)
return -1;
HTREEITEM hChild;
UINT nRet = 0;
while((hChild = m_Tree.GetNextItem(ParentItem,TVGN_CHILD))!=Item)
{
nRet++;
}
return nRet;
}
HRESULT CEncoderView::Move(HTREEITEM hDragItem,HTREEITEM hHitItem)
{
HRESULT hr = NOERROR;
// if the parents aren't the same simply return
CTreeItem DragItem(hDragItem, &m_Tree);
CTreeItem HitItem(hHitItem, &m_Tree);
if(DragItem.GetParent() != HitItem.GetParent())
return hr;
TREEDATA* pData = (TREEDATA*)m_Tree.GetItemData(DragItem.GetParent());
if(!pData || !pData->pUnk)
return hr;
CComPtr<IWMEncTransformCollection> pTrCol;
hr = pData->pUnk->QueryInterface(IID_IWMEncTransformCollection, (void**)&pTrCol);
if(SUCCEEDED(hr))
{
UINT nDragItemIndex = GetItemIndex(DragItem);
UINT nHitItemIndex = GetItemIndex(HitItem);
hr = pTrCol->Move(nDragItemIndex, nHitItemIndex);
}
else
{
CComPtr<IWMEncSourceGroupCollection> pSGCol;
hr = pData->pUnk->QueryInterface(IID_IWMEncSourceGroupCollection, (void**)&pSGCol);
if(SUCCEEDED(hr))
{
TREEDATA* pFirst = (TREEDATA*)m_Tree.GetItemData(DragItem);
TREEDATA* pSecond = (TREEDATA*)m_Tree.GetItemData(HitItem);
CComQIPtr<IWMEncSourceGroup> pSGFirst(pFirst->pUnk);
CComQIPtr<IWMEncSourceGroup> pSGSecond(pSecond->pUnk);
hr = pSGCol->Move(pSGFirst, pSGSecond);
}
}
HR_TEST(hr);
// move must have succeeded, so now move the tree items
hr = MoveTreeItems(hDragItem, hHitItem);
// update the display
m_Tree.Expand(DragItem.GetParent(), TVE_COLLAPSE | TVE_COLLAPSERESET);
m_Tree.Expand(DragItem.GetParent());
return hr;
}
HRESULT CEncoderView::MoveTreeItems(HTREEITEM hDragItem,HTREEITEM hHitItem)
{
HRESULT hr = NOERROR;
TV_INSERTSTRUCT tvstruct;
TCHAR sztBuffer[1024];
tvstruct.item.hItem = hDragItem;
tvstruct.item.cchTextMax = 49;
tvstruct.item.pszText = sztBuffer;
tvstruct.item.mask = TVIF_PARAM | TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
m_Tree.GetItem(&tvstruct.item); //
TREEDATA* pOldData = (TREEDATA*)(tvstruct.item.lParam);
_ASSERT(pOldData);
TREEDATA* pData = new TREEDATA(*pOldData);
tvstruct.item.lParam = (LPARAM)pData;
// insert the item at new place
CTreeItem Item(hDragItem,&m_Tree);
tvstruct.hParent = Item.GetParent();
tvstruct.hInsertAfter = hHitItem;
tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM ;
CTreeItem NewItem = m_Tree.InsertItem(&tvstruct);
// delete the item at old place
m_Tree.DeleteItem(hDragItem);
return hr;
}
LRESULT CEncoderView::OnEncoderEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// get tree item for encoder node
HTREEITEM hEncItem = (HTREEITEM)wParam;
if(!hEncItem)
return 0L;
// get corresponding sink object
TREEDATA* pData = (TREEDATA*)m_Tree.GetItemData(hEncItem);
if(!pData)
return 0L;
ENCDATA* pEncData = static_cast<ENCDATA*>(pData);
if(!pEncData)
return 0L;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pEncData->pEvent);
if(!pSink)
return 0L;
// get event type
long lEventID = GetEventType(pSink);
if(!lEventID)
return 0L;
// get the node
HTREEITEM hNode = GetEventTreeNode(hEncItem,lEventID);
if(!hNode)
return 0L;
// get data associated with so that we can call the corresponding function
/*
pData = (TREEDATA*) m_Tree.GetItemData(hNode);
if(!pData)
return 0L;
LPFNDISPLAY pfn = pData->pfnDisplay ;
(this->*pfn)(hNode, (LPUNKNOWN)pSink);
*/
m_Tree.Expand(hNode, TVE_COLLAPSE | TVE_COLLAPSERESET);
m_Tree.Expand(hNode);
return 0L;
}
HRESULT CEncoderView::InitTreeView()
{
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(SHFILEINFO));
HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"),
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
// Attach ImageList to TreeView
if (hImageList && m_Tree.IsWindow())
m_Tree.SetImageList(hImageList,0);
return S_OK;
}
void CEncoderView::DeleteChildren(HTREEITEM hItem)
{
HTREEITEM hChild;
while((hChild = m_Tree.GetNextItem(hItem,TVGN_CHILD))!=0)
{
CTreeItem Child(hChild,&m_Tree);
Child.Delete();
}
}
void CEncoderView::GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTV_ITEM lptvitem)
{
//Note that we don't check the return value here because if GetIcon()
//fails, then we're in big trouble...
/*
lptvitem->iImage = GetIcon(lpifq, SHGFI_PIDL |
SHGFI_SYSICONINDEX |
SHGFI_SMALLICON);
lptvitem->iSelectedImage = GetIcon(lpifq, SHGFI_PIDL |
SHGFI_SYSICONINDEX |
SHGFI_SMALLICON |
SHGFI_OPENICON);
*/
return;
}
HRESULT CEncoderView::ShowMachineDetails(HTREEITEM hParent, IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncoderAgent> pAgent(pUnk);
if(pAgent==NULL)
return E_NOINTERFACE;
CComPtr<IWMEncoderNamesCollection> pEncCol;
CComPtr<IDispatch> pDisp;
hr = pAgent->get_EncoderNamesCollection((LPDISPATCH*)&pDisp);
HR_TEST(hr);
hr = pDisp->QueryInterface(IID_IWMEncoderNamesCollection, (void**)&pEncCol);
HR_TEST(hr);
// get name of the encoder and get IWMEncoder pointer from that
long lCount=0;
hr = pEncCol->get_Count(&lCount);
HR_TEST(hr);
for(long i=0; i<lCount; i++)
{
CComPtr<IWMEncoder> pEnc;
CComPtr<IDispatch> pDisp2;
CComBSTR bstrName;
hr = pEncCol->Item(i, &bstrName);
if(FAILED(hr))
continue;
hr = pAgent->GetEncoder(bstrName,(LPDISPATCH*)&pDisp2);
if(FAILED(hr))
continue;
hr = pDisp2->QueryInterface(IID_IWMEncoder, (void**)&pEnc);
if(FAILED(hr))
continue;
hr = DisplayEncoder(pEnc.p, hParent);
if(FAILED(hr))
continue;
}
return hr;
}
HRESULT CEncoderView::ShowEncoderDetails(HTREEITEM hParent, IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncoder> pEnc(pUnk);
if(pEnc==NULL)
return E_NOINTERFACE;
VARIANT_BOOL bVal = VARIANT_FALSE;
CString strRes;
// AUTOSTOP
CString strText = _T("AutoStop = ");
hr = InsertProperty(&IWMEncoder::get_AutoStop, pEnc.p, hParent, strText,
g_mapShortToString);
//EnableAutoArchive
strText = _T("EnableAutoArchive = ");
hr = InsertProperty(&IWMEncoder::get_EnableAutoArchive, pEnc.p, hParent, strText,
g_mapShortToString);
//RunState
strText = _T("RunState = ");
hr = InsertProperty(&IWMEncoder::get_RunState, pEnc.p, hParent, strText,
g_mapRunState);
// ErrorState
strText = _T("ErrorState = ");
hr = InsertProperty(&IWMEncoder::get_ErrorState, pEnc.p, hParent, strText);
//ArchiveState
strText = _T("ArchiveState");
HTREEITEM hItem = InsertNode(hParent, strText,NULL,NULL);
WMENC_ARCHIVE_TYPE enumType = WMENC_ARCHIVE_LOCAL ;
WMENC_ARCHIVE_STATE arState;
strText = _T("WMENC_ARCHIVE_LOCAL =");
hr = pEnc->get_ArchiveState(enumType, &arState);
if(FAILED(hr))
{
strRes = GetError();
}
else
{
strRes = g_archMap[arState];
}
strText += strRes;
m_Tree.InsertItem(strText,hItem,TVI_LAST);
//RemoteAdmin
strText = _T("RemoteAdmin = ");
hr = InsertProperty(&IWMEncoder::get_RemoteAdmin, pEnc.p, hParent, strText,g_mapShortToString);
//IndexerState
strText = _T("IndexerState = ");
hr = InsertProperty(&IWMEncoder::get_IndexerState, pEnc.p, hParent, strText,g_mapIndexerState);
//AutoIndex
strText = _T("AutoIndex = ");
hr = InsertProperty(&IWMEncoder::get_AutoIndex, pEnc.p, hParent, strText,g_mapShortToString);
//SourceGroupCollection
strText = _T("SourceGroupCollection");
InsertNode(hParent, strText, &IWMEncoder::get_SourceGroupCollection,
pEnc.p, &CEncoderView::ShowSGCDetails);
// SourcePluginInfoManager
strText = _T("SourcePluginInfoManager");
InsertNode(hParent, strText, &IWMEncoder::get_SourcePluginInfoManager,
pEnc.p, &CEncoderView::ShowSrcPlInfoMgr);
//IWMEncTransformPluginInfoManager
strText = _T("TransformPluginInfoManager");
InsertNode(hParent, strText, &IWMEncoder::get_TransformPluginInfoManager,
pEnc.p, &CEncoderView::ShowTrPlInfoMgr);
//IWMEncDisplayInfo
strText = _T("DisplayInfo");
InsertNode(hParent, strText, &IWMEncoder::get_DisplayInfo,
pEnc.p, &CEncoderView::ShowDisplayInfo);
//IWMEncAttributes
strText = _T("Attributes");
InsertNode(hParent, strText, &IWMEncoder::get_Attributes,
pEnc.p, &CEncoderView::ShowAttributes);
//IWMEncBroadcast
strText = _T("Broadcast");
InsertNode(hParent, strText, &IWMEncoder::get_Broadcast,
pEnc.p, &CEncoderView::ShowBroadcast);
//IWMEncFile
strText = _T("File");
InsertNode(hParent, strText, &IWMEncoder::get_File,
pEnc.p, &CEncoderView::ShowFile);
//IWMEncStatistics
strText = _T("Statistics");
InsertNode(hParent, strText, &IWMEncoder::get_Statistics,
pEnc.p, &CEncoderView::ShowStatistics);
//IWMEncProfileCollection
strText = _T("ProfileCollection");
InsertNode(hParent, strText, &IWMEncoder::get_ProfileCollection,
pEnc.p, &CEncoderView::ShowProfileCollection);
// get the eventsink pointer stored at the node to pass to the event children
ENCDATA* pData = (ENCDATA*) m_Tree.GetItemData(hParent);
_ASSERT(pData!=NULL);
// SourceState Events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_SRCSTATECHANGE];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowSourceStateEvents);
// Archive state events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_ARCHIVESTATECHANGE];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowArchiveStateEvents);
// Client connect events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_CLIENTCONNECT];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowClientConnectEvents);
// Client connect events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_STATECHANGE];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowStateEvents);
// Client connect events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_CLIENTDISCONNECT];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowClientDisconnectEvents);
// Client connect events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_CONFIGCHANGE];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowConfigEvents);
// Client connect events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_ERROR];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowErrorEvents);
// Client connect events
strText = g_mapEventIDToDisplayString[DISPID_ENCODEREVENT_INDEXERSTATECHANGE];
InsertNode(hParent, strText, (LPUNKNOWN)pData->pEvent, &CEncoderView::ShowIndexerStateEvents);
return hr;
}
HRESULT CEncoderView::ShowSGCDetails(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncSourceGroupCollection> pSGC(pUnk);
if(pSGC==NULL)
return E_NOINTERFACE;
long lCount=0;
hr = pSGC->get_Count(&lCount);
HR_TEST(hr);
USES_CONVERSION;
// get active SG if any and display it accordingly
CComPtr<IWMEncSourceGroup> pActiveSG;
hr = pSGC->get_Active(&pActiveSG);
for(long l=0;l<lCount;l++)
{
CComPtr<IWMEncSourceGroup> pSG;
CComVariant var((long)l);
hr = pSGC->Item(var, &pSG);
if(FAILED(hr))
continue;
CComBSTR bstrName;
hr = pSG->get_Name(&bstrName);
if(FAILED(hr))
bstrName = _T("No Name");
CString strText = W2T(bstrName);
if(pActiveSG.p == pSG.p) // it's active
strText += _T(" [ACTIVE] ");
InsertNode(hItem,strText,pSG.p,&CEncoderView::ShowSGDetails);
}
return hr;
}
HRESULT CEncoderView::ShowSGDetails(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncSourceGroup> pSG(pUnk);
if(pSG==NULL)
return E_NOINTERFACE;
CString strText;
// display sources
WMENC_SOURCE_TYPE srcType;
short sCount=0;
for( int i = 0 ; i < WMENC_TOTAL ; i++)
{
srcType = (WMENC_SOURCE_TYPE)(long) pow(2,i);
hr = pSG->get_SourceCount(srcType, &sCount);
if(FAILED(hr))
continue;
for(short s=0; s < sCount; s++)
{
CComPtr<IWMEncSource> pS;
hr = pSG->get_Source(srcType, s, &pS);
if(FAILED(hr))
continue;
CString strText;
strText.Format(_T("%s %d"),g_mapSourceType[srcType], s);
InsertNode(hItem, strText, pS.p, &CEncoderView::ShowSrcDetails);
}
}
// DISPLAY profile
CComPtr<IWMEncProfile> pProf;
hr = pSG->get_Profile(&pProf);
if(SUCCEEDED(hr))
{
strText = _T("Profile = ");
CComBSTR bstrText;
hr = pProf->get_Name(&bstrText);
USES_CONVERSION;
strText += W2T(bstrText);
InsertNode(hItem, strText, pProf.p, &CEncoderView::ShowProfile);
}
// AudienceCollection
strText = _T("AudienceCollection");
InsertNode(hItem,strText,&IWMEncSourceGroup::get_AudienceCollection,
pSG.p, &CEncoderView::ShowAudienceCollection);
//AutoArcive
strText = _T("AutoArcive");
HTREEITEM hChild = InsertNode(hItem, strText,NULL,NULL);
WMENC_ARCHIVE_TYPE enumType = WMENC_ARCHIVE_LOCAL ;
WMENC_ARCHIVE_OPERATION archOp;
hr = pSG->get_AutoArchive(enumType, &archOp);
strText = _T("WMENC_ARCHIVE_LOCAL =");
CString strRes;
if(FAILED(hr))
{
strRes = GetError();
}
else
{
strRes = g_mapArchOp[archOp];
}
strText += strRes;
m_Tree.InsertItem(strText,hChild,TVI_LAST);
//GroupTransformCollection
strText = _T("GroupTransformCollection");
InsertNode(hItem, strText, &IWMEncSourceGroup::get_GroupTransformCollection, pSG.p,
&CEncoderView::ShowGroupTransformCollection);
//GetGroupTransformPluginCount
strText = _T("GetGroupTransformPluginCount = ");
hr = InsertProperty(&IWMEncSourceGroup::GetGroupTransformPluginCount, pSG.p, hItem, strText);
return hr;
}
HRESULT CEncoderView::ShowProfile(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncProfile> pProf(pUnk);
if(pProf==NULL)
return E_NOINTERFACE;
CString strText;
//Description
strText = _T("Description = ");
InsertPropertyBSTR(&IWMEncProfile::get_Description, pProf.p, hItem, strText);
//MediaCount
strText = _T("MediaCount");
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
WMENC_SOURCE_TYPE srcType;
short sCount=0;
for( int i = 0 ; i < WMENC_TOTAL ; i++)
{
srcType = (WMENC_SOURCE_TYPE)(long) pow(2,i);
hr = pProf->get_MediaCount(srcType, &sCount);
if(FAILED(hr))
continue;
CString strText;
strText.Format(_T("%s = %d"),g_mapSourceType[srcType], sCount);
m_Tree.InsertItem(strText,hChild,TVI_LAST);
}
//MultipleBitrate
strText = _T("MultipleBitrate = ");
hr = InsertProperty(&IWMEncProfile::get_MultipleBitrate, pProf.p, hItem, strText,
g_mapShortToString);
// MaxPacketSize
strText = _T("MaxPacketSize = ");
hr = InsertProperty(&IWMEncProfile::get_MaxPacketSize, pProf.p, hItem, strText);
return hr;
}
// no implementation
HRESULT CEncoderView::ShowAudienceCollection(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
return hr;
}
HRESULT CEncoderView::ShowSrcDetails(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncSource> pSrc(pUnk);
if(pSrc==NULL)
return E_NOINTERFACE;
// we show source details first and then QI for video source
// Input
CComBSTR bstrStreamName, bstrScheme, bstrInput;
hr = pSrc->GetInput(&bstrStreamName, &bstrScheme, &bstrInput);
CString strStreamName = _T("StreamName = ");
CString strScheme = _T("Scheme = ");
CString strInput = _T("Input = ");
if(SUCCEEDED(hr))
{
USES_CONVERSION;
strStreamName += W2T(bstrStreamName);
strScheme += W2T(bstrScheme);
strInput += W2T(bstrInput);
}
else
{
CString strRes = GetError();
strStreamName += strRes;
strScheme += strRes;
strInput += strRes;
}
m_Tree.InsertItem(strStreamName,hItem,TVI_LAST);
m_Tree.InsertItem(strScheme,hItem,TVI_LAST);
m_Tree.InsertItem(strInput,hItem,TVI_LAST);
// Repeat
CString strText = _T("Repeat = ");
hr = InsertProperty(&IWMEncSource::get_Repeat, pSrc.p, hItem, strText,
g_mapShortToString);
// MarkIn
strText = _T("MarkIn = ");
hr = InsertProperty(&IWMEncSource::get_MarkIn, pSrc.p, hItem, strText);
// MarkOut
strText = _T("MarkOut = ");
hr = InsertProperty(&IWMEncSource::get_MarkOut, pSrc.p, hItem, strText);
//TransformCollection
strText = _T("TransformCollection");
InsertNode(hItem, strText, IWMEncSource::get_TransformCollection,
pSrc.p,&CEncoderView::ShowTransformDetails);
//PreviewCollection
strText = _T("PreviewCollection");
InsertNode(hItem, strText, IWMEncSource::get_PreviewCollection,
pSrc.p,&CEncoderView::ShowPreviewCollection);
//PostviewCollection
strText = _T("PostviewCollection");
InsertNode(hItem, strText, IWMEncSource::get_PostviewCollection,
pSrc.p,&CEncoderView::ShowPostviewCollection);
return hr;
}
HRESULT CEncoderView::ShowGroupTransformCollection(HTREEITEM hItem,IUnknown* pUnk)
{
return ShowTransformDetails(hItem,pUnk);
}
HRESULT CEncoderView::ShowTransformDetails(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncTransformCollection> pTrCol(pUnk);
if(pTrCol==NULL)
return E_NOINTERFACE;
long lCount = 0;
hr = pTrCol->get_Count(&lCount);
HR_TEST(hr);
for(long l=0; l< lCount ; l++)
{
CComPtr<IWMEncTransform> pTr;
hr = pTrCol->Item(l,&pTr);
if(!pTr)
continue;
CComBSTR bstrInitData, bstrScheme, bstrInput;
hr = pTr->GetInput(&bstrScheme, &bstrInitData, &bstrInput);
CString strInitData = _T("InitData = "), strScheme = _T("Scheme = "), strInput = _T("Input = ");
USES_CONVERSION;
strInitData += W2T(bstrInitData);
strScheme += W2T(bstrScheme);
strInput += W2T(bstrInput);
m_Tree.InsertItem(strInitData,hItem,TVI_LAST);
m_Tree.InsertItem(strScheme,hItem,TVI_LAST);
m_Tree.InsertItem(strInput,hItem,TVI_LAST);
}
return hr;
}
HRESULT CEncoderView::ShowPreviewCollection(HTREEITEM hItem,IUnknown* pUnk)
{
return ShowPreOrPostViewCollection(hItem,pUnk);
}
HRESULT CEncoderView::ShowPostviewCollection(HTREEITEM hItem,IUnknown* pUnk)
{
return ShowPreOrPostViewCollection(hItem,pUnk);
}
HRESULT CEncoderView::ShowPreOrPostViewCollection(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncDataViewCollection> pViewCol(pUnk);
if(pViewCol==NULL)
return E_NOINTERFACE;
long lCount = 0;
hr = pViewCol->get_Count(&lCount);
HR_TEST(hr);
for(long i=0; i<lCount;i++)
{
CComPtr<IUnknown> pUnk;
long dwCookie = 0;
hr = pViewCol->Item(i,&pUnk,&dwCookie);
HR_TEST(hr);
CString strText;
strText.Format(_T("Cookie = %d"), dwCookie);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
}
return hr;
}
HRESULT CEncoderView::ShowSrcPlInfoMgr(HTREEITEM hItem,IUnknown* pUnk)
{
CComQIPtr<IWMEncSourcePluginInfoManager> p(pUnk);
if(p==NULL)
return E_NOINTERFACE;
return ShowCollection(hItem,p.p, &CEncoderView::ShowSrcPlInfo, (IWMEncPluginInfo*)NULL);
}
HRESULT CEncoderView::ShowSrcPlInfo(HTREEITEM hParent, IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CString strText;
CComQIPtr<IWMEncPluginInfo> pSrcPlInfo(pUnk);
if(pSrcPlInfo==NULL)
return E_NOINTERFACE;
//Schemetype
strText = _T("Schemetype = ");
InsertPropertyBSTR(&IWMEncPluginInfo::get_SchemeType, pSrcPlInfo.p, hParent, strText);
//CLSID
strText = _T("CLSID = ");
InsertPropertyBSTR(&IWMEncPluginInfo::get_CLSID, pSrcPlInfo.p, hParent, strText);
//Name
strText = _T("Name = ");
InsertPropertyBSTR(&IWMEncPluginInfo::get_Name, pSrcPlInfo.p, hParent, strText);
//MediaType
strText = _T("MediaType = ");
InsertProperty(&IWMEncPluginInfo::get_MediaType, pSrcPlInfo.p, hParent, strText, g_mapSourceType);
//PluginType
strText = _T("PluginType = ");
InsertProperty(&IWMEncPluginInfo::get_PluginType, pSrcPlInfo.p, hParent, strText, g_mapPluginType);
//Copyright
strText = _T("Copyright = ");
InsertPropertyBSTR(&IWMEncPluginInfo::get_Copyright, pSrcPlInfo.p, hParent, strText);
//InfoURL
strText = _T("InfoURL = ");
InsertPropertyBSTR(&IWMEncPluginInfo::get_InfoURL, pSrcPlInfo.p, hParent, strText);
//Resources
strText = _T("Resources = ");
InsertProperty(&IWMEncPluginInfo::get_Resources, pSrcPlInfo.p, hParent, strText, g_mapShortToString);
//Exclusive
strText = _T("Exclusive = ");
InsertProperty(&IWMEncPluginInfo::get_Exclusive, pSrcPlInfo.p, hParent, strText, g_mapShortToString);
//PropertyPage
strText = _T("PropertyPage = ");
InsertProperty(&IWMEncPluginInfo::get_PropertyPage, pSrcPlInfo.p, hParent, strText, g_mapShortToString);
//TransformFlags
strText = _T("TransformFlags = ");
InsertProperty(&IWMEncPluginInfo::get_TransformFlags, pSrcPlInfo.p, hParent, strText);
//Hidden
strText = _T("Hidden = ");
InsertProperty(&IWMEncPluginInfo::get_Hidden, pSrcPlInfo.p, hParent, strText, g_mapShortToString);
//Count
strText = _T("Count = ");
InsertProperty(&IWMEncPluginInfo::get_Count, pSrcPlInfo.p, hParent, strText);
// Item
return hr;
}
HRESULT CEncoderView::ShowTrPlInfoMgr(HTREEITEM hItem,IUnknown* pUnk)
{
CComQIPtr<IWMEncTransformPluginInfoManager> pTRI(pUnk);
if(pTRI==NULL)
return E_NOINTERFACE;
return ShowCollection(hItem,pTRI.p, &CEncoderView::ShowSrcPlInfo, (IWMEncPluginInfo*)NULL);
}
HRESULT CEncoderView::ShowDisplayInfo(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncDisplayInfo> pDI(pUnk);
if(pDI==NULL)
return E_NOINTERFACE;
return hr;
}
HRESULT CEncoderView::ShowAttributes(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncAttributes> pAttr(pUnk);
if(pAttr==NULL)
return E_NOINTERFACE;
long lCount=0;
hr = pAttr->get_Count(&lCount);
HR_TEST(hr);
for(long l=0; l<lCount;l++)
{
CComBSTR bstrName;
CComVariant val;
hr = pAttr->Item(l,&bstrName,&val);
if(FAILED(hr))
continue;
USES_CONVERSION;
CString strText;
switch(val.vt)
{
case VT_BSTR :
strText.Format(_T("%s = %s"), W2T(bstrName), W2T(val.bstrVal));
break;
case VT_I2:
strText.Format(_T("%s = %d"), W2T(bstrName), val.iVal);
break;
case VT_I4:
strText.Format(_T("%s = %d"), W2T(bstrName), val.lVal);
break;
default:
break;
}
m_Tree.InsertItem(strText,hItem,TVI_LAST);
}
return hr;
}
HRESULT CEncoderView::ShowBroadcast(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncBroadcast> pBR(pUnk);
if(pBR==NULL)
return E_NOINTERFACE;
// port number
WMENC_BROADCAST_PROTOCOL protocol = WMENC_PROTOCOL_HTTP;
long sPort = 0;
hr = pBR->get_PortNumber(protocol, &sPort);
HR_TEST(hr);
CString strText;
strText.Format(_T("WMENC_PROTOCOL_HTTP = %d"), sPort);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowFile(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncFile> pFile(pUnk);
if(pFile==NULL)
return E_NOINTERFACE;
CString strFile;
CComBSTR bstrFile;
USES_CONVERSION;
hr = pFile->get_LocalFileName(&bstrFile);
if(SUCCEEDED(hr) && bstrFile)
{
strFile.Format(_T("LocalFileName = %s"), W2T(bstrFile));
m_Tree.InsertItem(strFile,hItem,TVI_LAST);
strFile.Empty();
bstrFile.Empty();
}
hr = pFile->get_RemoteFileName(&bstrFile);
if(SUCCEEDED(hr))
{
strFile.Format(_T("LocalFileName = %s"), W2T(bstrFile));
m_Tree.InsertItem(strFile,hItem,TVI_LAST);
strFile.Empty();
}
return hr;
}
HRESULT CEncoderView::ShowStatistics(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncStatistics> pStats(pUnk);
if(pStats==NULL)
return E_NOINTERFACE;
//EncodingTime
InsertProperty(&IWMEncStatistics::get_EncodingTime,pStats.p, hItem, _T("EncodingTime = "));
//StreamOutputCount
CString strText = _T("StreamOutputCount");
HTREEITEM hChild = InsertNode(hItem, strText,NULL,NULL);
WMENC_SOURCE_TYPE srcType;
for( int i = 0 ; i < WMENC_TOTAL ; i++)
{
srcType = (WMENC_SOURCE_TYPE)(long) pow(2,i);
short nStreamCount=0;
hr = pStats->get_StreamOutputCount(srcType,0,&nStreamCount);
if(FAILED(hr))
continue;
strText.Format(_T("WMENC_SOURCE_TYPE = %s MediaIndex = %d SreamOutputCount = %d"),
g_mapSourceType[srcType], 0, nStreamCount);
m_Tree.InsertItem(strText,hChild,TVI_LAST);
}
//WMFOutputStats
InsertNode(hItem,_T("WMFOutputStats"),&IWMEncStatistics::get_WMFOutputStats,pStats.p,
&CEncoderView::ShowWMFOutputStats);
//NetConnectionStats
InsertNode(hItem,_T("NetConnectionStats"),&IWMEncStatistics::get_NetConnectionStats,pStats.p,
&CEncoderView::ShowNetConnectionStats);
//FileArchiveStats
InsertNode(hItem,_T("FileArchiveStats"),&IWMEncStatistics::get_FileArchiveStats,pStats.p,
&CEncoderView::ShowFileArchiveStats);
//IndexerStats
InsertNode(hItem,_T("IndexerStats"),&IWMEncStatistics::get_IndexerStats,pStats.p,
&CEncoderView::ShowIndexerStats);
return hr;
}
HRESULT CEncoderView::ShowWMFOutputStats(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncOutputStats > pWMFStats(pUnk);
if(pWMFStats==NULL)
return E_NOINTERFACE;
CString strText;
//SampleCount
strText = _T("SampleCount = ");
hr = InsertProperty(&IWMEncOutputStats::get_SampleCount, pWMFStats.p, hItem, strText);
//ByteCount
strText = _T("ByteCount = ");
hr = InsertProperty(&IWMEncOutputStats::get_ByteCount, pWMFStats.p, hItem, strText);
//DroppedSampleCount
strText = _T("DroppedSampleCount = ");
hr = InsertProperty(&IWMEncOutputStats::get_DroppedSampleCount, pWMFStats.p, hItem, strText);
//DroppedByteCount
strText = _T("DroppedByteCount = ");
hr = InsertProperty(&IWMEncOutputStats::get_DroppedByteCount, pWMFStats.p, hItem, strText);
//CurrentBitrate
strText = _T("CurrentBitrate = ");
hr = InsertProperty(&IWMEncOutputStats::get_CurrentBitrate, pWMFStats.p, hItem, strText);
//AverageBitrate
strText = _T("AverageBitrate = ");
hr = InsertProperty(&IWMEncOutputStats::get_AverageBitrate, pWMFStats.p, hItem, strText);
//ExpectedBitrate
strText = _T("ExpectedBitrate = ");
hr = InsertProperty(&IWMEncOutputStats::get_ExpectedBitrate, pWMFStats.p, hItem, strText);
//CurrentSampleRate
strText = _T("CurrentSampleRate = ");
hr = InsertProperty(&IWMEncOutputStats::get_CurrentSampleRate, pWMFStats.p, hItem, strText);
//AverageSampleRate
strText = _T("AverageSampleRate = ");
hr = InsertProperty(&IWMEncOutputStats::get_AverageSampleRate, pWMFStats.p, hItem, strText);
//ExpectedSampleRate
strText = _T("ExpectedSampleRate = ");
hr = InsertProperty(&IWMEncOutputStats::get_ExpectedSampleRate, pWMFStats.p, hItem, strText);
return hr;
}
HRESULT CEncoderView::ShowNetConnectionStats(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncNetConnectionStats > pNetConStats(pUnk);
if(pNetConStats==NULL)
return E_NOINTERFACE;
// Get client count first
long lCount = 0;
hr = pNetConStats->get_ClientCount(&lCount);
USES_CONVERSION;
for(long l=0; l<lCount;l++)
{
CComBSTR bstrIP;
WMENC_BROADCAST_PROTOCOL br;
hr = pNetConStats->get_ClientInfo(l,&br,&bstrIP);
if(FAILED(hr))
continue;
// since we know this is the only protocol we are supporting
// there is no need to have the protocol type displayed as well
m_Tree.InsertItem(W2T(bstrIP),hItem,TVI_LAST);
}
return hr;
}
HRESULT CEncoderView::ShowFileArchiveStats(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncFileArchiveStats> pFileArcStats(pUnk);
if(pFileArcStats==NULL)
return E_NOINTERFACE;
//FileSize
WMENC_LONGLONG llOutputSize;
hr = pFileArcStats->get_FileSize(&llOutputSize);
if(SUCCEEDED(hr))
{
CString strText;
strText.Format(_T("FileSize = %d"), llOutputSize);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
}
//FileDuration
WMENC_LONGLONG llDuration;
hr = pFileArcStats->get_FileDuration(&llDuration);
if(SUCCEEDED(hr))
{
CString strText;
strText.Format(_T("FileDuration = %d"), llDuration);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
}
return hr;
}
HRESULT CEncoderView::ShowIndexerStats(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncIndexerStats > pIndexerStats(pUnk);
if(pIndexerStats==NULL)
return E_NOINTERFACE;
long lCount = 0;
hr = pIndexerStats->get_FileCount(&lCount);
HR_TEST(hr);
USES_CONVERSION;
// FileName
for(long l=0; l<lCount;l++)
{
CComBSTR bstrFile;
hr = pIndexerStats->get_FileName(l,&bstrFile);
if(FAILED(hr))
continue;
m_Tree.InsertItem(W2T(bstrFile),hItem,TVI_LAST);
}
//PercentComplete
InsertProperty(&IWMEncIndexerStats::get_PercentComplete, pIndexerStats.p,
hItem, _T("PercentComplete = "));
return hr;
}
HRESULT CEncoderView::ShowProfileCollection(HTREEITEM hItem,IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
_ASSERT(m_Tree.IsWindow());
HRESULT hr = NOERROR;
CComQIPtr<IWMEncProfileCollection> pProfCol(pUnk);
if(pProfCol==NULL)
return E_NOINTERFACE;
return ShowCollection(hItem,pProfCol.p, &CEncoderView::ShowProfile, (IWMEncProfile*)NULL);
return hr;
}
STDMETHODIMP CEncoderView::AddMachine(BSTR bstrMachineName)
{
if(!bstrMachineName)
{
return E_POINTER;
}
USES_CONVERSION;
CString strMachine = W2T(bstrMachineName);
m_vecMachines.push_back(strMachine);
return S_OK;
}
long CEncoderView::GetEventType(CEncoderEventSink* pSink)
{
_ASSERT(pSink!=NULL);
if(!pSink)
return 0;
map<HANDLE,long> mapEventHandleToEventID;
// initialize map with dispids
mapEventHandleToEventID[pSink->m_eveArchiveState] = DISPID_ENCODEREVENT_ARCHIVESTATECHANGE;
mapEventHandleToEventID[pSink->m_eveClientConnect] = DISPID_ENCODEREVENT_CLIENTCONNECT;
mapEventHandleToEventID[pSink->m_eveClientDisconnect] = DISPID_ENCODEREVENT_CLIENTDISCONNECT;
mapEventHandleToEventID[pSink->m_eveConfig] = DISPID_ENCODEREVENT_CONFIGCHANGE;
mapEventHandleToEventID[pSink->m_eveError] = DISPID_ENCODEREVENT_ERROR;
mapEventHandleToEventID[pSink->m_eveIndexerState] = DISPID_ENCODEREVENT_INDEXERSTATECHANGE;
mapEventHandleToEventID[pSink->m_eveSourceState] = DISPID_ENCODEREVENT_SRCSTATECHANGE;
mapEventHandleToEventID[pSink->m_eveStateChange] = DISPID_ENCODEREVENT_STATECHANGE;
HANDLE hEve[] =
{
pSink->m_eveArchiveState
,pSink->m_eveClientConnect
,pSink->m_eveClientDisconnect
,pSink->m_eveConfig
,pSink->m_eveError
,pSink->m_eveIndexerState
,pSink->m_eveSourceState
,pSink->m_eveStateChange
};
// we know atleast one of them is certainly set
DWORD nCount = sizeof(hEve)/sizeof(HANDLE);
DWORD dwRet = ::WaitForMultipleObjects(nCount,hEve,FALSE,INFINITE);
return mapEventHandleToEventID[ hEve[dwRet-WAIT_OBJECT_0] ];
}
// we return tree node corrseponding to this event,
// to do this, we simply look in the map we store to get the display string for the id first and then
// get the treeitem from string
HTREEITEM CEncoderView::GetEventTreeNode(HTREEITEM hParent, long lEventID)
{
CString strText = g_mapEventIDToDisplayString[lEventID];
if(strText.IsEmpty())
return NULL;
HTREEITEM hChild = NULL;
hChild = m_Tree.GetNextItem(hParent,TVGN_CHILD);
while(hChild!=0)
{
CTreeItem Child(hChild,&m_Tree);
CString strLabel;
if(Child.GetText(strLabel))
{
if(strText==strLabel)
return hChild;
}
hChild = m_Tree.GetNextItem(hChild,TVGN_NEXT);
}
return NULL;
}
HRESULT CEncoderView::ShowArchiveStateEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show arcive state
CString strText;
strText.Format(_T("%s = %s"), _T("WMENC_ARCHIVE_LOCAL"),
g_mapArchOp[pSink->m_archiveStateChange.m_archiveOperation]);
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowClientConnectEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show client connect state
CString strText;
USES_CONVERSION;
strText.Format(_T("%s = %s"), g_mapBrProtocol[pSink->m_ClientConnect.m_BrProtocol]
,W2T(pSink->m_ClientConnect.m_bstr));
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowClientDisconnectEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show client disconnect state
CString strText;
USES_CONVERSION;
strText.Format(_T("%s = %s"), g_mapBrProtocol[pSink->m_ClientDisconnect.m_BrProtocol]
,W2T(pSink->m_ClientDisconnect.m_bstr));
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowConfigEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show config state
CString strText;
USES_CONVERSION;
strText.Format(_T("%s = %d"), W2T(pSink->m_ConfigChange.m_bstr)
,pSink->m_ConfigChange.m_lHr);
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowErrorEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show error state
CString strText = GetErrorFromHR(pSink->m_lError);
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowIndexerStateEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show config state
CString strText;
USES_CONVERSION;
strText.Format(_T("File = %s, State = %s"), W2T(pSink->m_IndexerStateChange.m_bstrFile)
,g_mapIndexerState[pSink->m_IndexerStateChange.m_IndexerStateChange]);
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowSourceStateEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
USES_CONVERSION;
// show source state
CString strText;
strText.Format(_T("Index = %d"), pSink->m_srcStateChange.m_nIndex);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
strText.Format(_T("SrcType = %s"), g_mapSourceType[pSink->m_srcStateChange.m_SrcType]);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
strText.Format(_T("Sourcegroup = %s"), pSink->m_srcStateChange.m_bstrSG);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
strText.Format(_T("State = %s"), g_mapSrcState[pSink->m_srcStateChange.m_State]);
m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}
HRESULT CEncoderView::ShowStateEvents(HTREEITEM hItem,IUnknown* pUnk)
{
HRESULT hr = NOERROR;
CEncoderEventSink* pSink = reinterpret_cast<CEncoderEventSink*>(pUnk);
if(!pSink)
return E_FAIL;
// show error state
CString strText;
USES_CONVERSION;
strText.Format(_T("%s"), g_mapRunState[pSink->m_StateChange]);
HTREEITEM hChild = m_Tree.InsertItem(strText,hItem,TVI_LAST);
return hr;
}