// MainControlDlg.cpp : implementation file // #include "stdafx.h" #include "PrjVersion.h" #include #include "INITGUID.H" #include "PrismII.h" #include "PageDllStatus.h" #include "PUBLIB\INC\Cmn5BoardLibEx.h" #include "PUBLIB2\CommonInterface.h" //view window.. #include "WindowContainer.h" #include "EmWindow.h" #include "MainControlDlg.h" #include "PUBLIB2\winutil.h" #pragma warning (disable:4786) #include #include #include "devenum.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //window management´Â ³ªÁßÀ¸·Î ¹Ì·é´Ù... #define IDM_COMMAND_CAPTURE 2746 #define IDM_COMMAND_APPLY 1002 #define IDM_COMMAND_RESTORE 1003 #define IDM_COMMAND_DEFAULT 1004 #define IDM_COMMAND_RECORD 1005 #define IDM_COMMAND_CLOSE 1006 #define IDM_COMMAND_CASCADE 1007 #define IDM_COMMAND_TILEH 1008 #define IDM_COMMAND_TILEV 1009 #define IDC_TOOLBAR 3000 #define IDC_TREE 3001 #define IDC_TOOLBAR2 3002 #define COMPBTN_ID 0x11C0 #define DEFAULT_LOG_FOLDER "c:\\PrismII_Log" BEGIN_MESSAGE_MAP(CMainControlDlg, CDialog) //{{AFX_MSG_MAP(CMainControlDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CREATE() ON_WM_DESTROY() ON_WM_ERASEBKGND() ON_WM_TIMER() //}}AFX_MSG_MAP ON_NOTIFY(TVN_SELCHANGING, IDC_TREE, OnTreeSelchanging) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTabSelchanging) ON_COMMAND(IDM_COMMAND_CAPTURE, OnCommandCapture) ON_COMMAND(IDM_COMMAND_APPLY, OnCommandApply) ON_COMMAND(IDM_COMMAND_RESTORE, OnCommandRestore) ON_COMMAND(IDM_COMMAND_DEFAULT, OnCommandDefault) ON_COMMAND(IDM_COMMAND_CLOSE, OnCommandClose) ON_COMMAND(IDM_COMMAND_CASCADE, OnCommandTest) ON_COMMAND(IDM_COMMAND_TILEH, OnCommandTest) ON_COMMAND(IDM_COMMAND_TILEV, OnCommandTest) ON_COMMAND_RANGE(COMPBTN_ID,(COMPBTN_ID|0x3F)+1,OnComponentCommand) ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipMsg ) END_MESSAGE_MAP() PRISMEXTDLLINFO g_dll_Card[8]; PRISMEXTDLLINFO g_dll_Filter[16]; PRISMEXTDLLINFO g_dll_Plug[16]; PRISMEXTDLLINFO g_dll_Event[8]; int g_cdll_Card; int g_cdll_Filter; int g_cdll_Plug; int g_cdll_Event; static TBBUTTON buttons[]={ {22,IDM_COMMAND_CAPTURE,TBSTATE_ENABLED ,TBSTYLE_CHECK|TBSTYLE_AUTOSIZE,{0,},0,(int)"Capture"}, {24,IDM_COMMAND_APPLY, TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE,{0,},0,(int)"Apply"}, {26,IDM_COMMAND_DEFAULT,TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE,{0,},0,(int)"Default"}, {25,IDM_COMMAND_CLOSE, TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE,{0,},0,(int)"Close"}, TB_SEPERATOR, }; BOOL InitToolbar(CToolBarCtrl& tb,UINT id,CWnd* pParent,CFont* pFont,CImageList* pimlHot,CImageList* piml,UINT nBtn,TBBUTTON* pBtns,ULONG left); BOOL CreateInstance(HMODULE hLib,const GUID& pGuid,void ** ppInterface); ///////////////////////////////////////////////////////////////////////////// // CMainControlDlg dialog ///////////////////////////////////////////////////////////////////////////// CMainControlDlg* g_mainControlDlg; //saved and loaded from/to xml.... LOGOPTION g_LogOption; CRITICAL_SECTION CMessageManager::s_cs; CMainControlDlg::CMainControlDlg(CWnd* pParent /*=NULL*/) : CDialog(CMainControlDlg::IDD, pParent),m_cManager(0) { //{{AFX_DATA_INIT(CMainControlDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pDeviceLister=NULL; m_bUpdating=FALSE; ZERO_ARRAY(m_WindowOrder); m_nWindow=1;//main control dialog... g_mainControlDlg=this; m_CurInstMng=NULL; ZERO_ARRAY(m_pTimerProc); m_pStorage=NULL; } //#include #define IDM_COMMAND_CAPTURE 2746 #define IDM_COMMAND_APPLY 1002 #define IDM_COMMAND_RESTORE 1003 #define IDM_COMMAND_DEFAULT 1004 #define IDM_COMMAND_RECORD 1005 #define IDM_COMMAND_CLOSE 1006 #define IDM_COMMAND_CASCADE 1007 #define IDM_COMMAND_TILEH 1008 #define IDM_COMMAND_TILEV 1009 BOOL CMainControlDlg::OnToolTipMsg(UINT, NMHDR* lpnmhdr, LRESULT*) { LPNMTTDISPINFO lpnmtdi = (LPNMTTDISPINFO) lpnmhdr; //if(lpnmhdr->hwndFrom==m_Toolbar.m_hWnd){ switch(lpnmhdr->idFrom){ case 0:lstrcpy(lpnmtdi->szText,"Home Tab:Select to show PrismII global informations.");break; case IDM_COMMAND_CAPTURE: lstrcpy(lpnmtdi->szText,"Capture\nStart Device and Show the generated Data Stream with the filters.");break; case IDM_COMMAND_APPLY: lstrcpy(lpnmtdi->szText,"Apply\nRestart the Device with the new settings.");break; case IDM_COMMAND_RESTORE: lstrcpy(lpnmtdi->szText,"test");break; case IDM_COMMAND_DEFAULT: lstrcpy(lpnmtdi->szText,"Default\nMake the setting values defalut");break; case IDM_COMMAND_RECORD: lstrcpy(lpnmtdi->szText,"Record\n Record the streams.");break; case IDM_COMMAND_CLOSE: lstrcpy(lpnmtdi->szText,"Close\nTerminate PrismII Application.");break; case IDM_COMMAND_CASCADE: lstrcpy(lpnmtdi->szText,"Cascade the Windows.");break; case IDM_COMMAND_TILEH: lstrcpy(lpnmtdi->szText,"Tile the Windows.");break; case IDM_COMMAND_TILEV: lstrcpy(lpnmtdi->szText,"Tile the Windows.");break; } //} return TRUE; } void CMainControlDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMainControlDlg) //}}AFX_DATA_MAP } //ÇÊ¿äÇÑ ¸Þ½ÃÁö?? //create //activate //deactivate //destroy HWND CMainControlDlg::GetWindowHandle(UINT OrderIdx) { HWND hwnd; if(m_WindowOrder[OrderIdx].pWndMng==NULL){ hwnd=m_hWnd; }else{ hwnd=m_WindowOrder[OrderIdx].pWndMng->GetWindowHandle(m_WindowOrder[OrderIdx].idx); } return hwnd; } void CMainControlDlg::NotifyWindowInfo(IPrismIIWindowManage* pWndMng,UINT idx,WindowNotify uMsg,ULONG param) { if(uMsg==NOTIFY_WND_CREATED){ // Add to the WindowOrder list m_WindowOrder[m_nWindow].pWndMng=pWndMng; m_WindowOrder[m_nWindow].idx=idx; m_nWindow++; }else if(uMsg==NOTIFY_WND_DESTROYED){ // Delete from the WindowOrder list for(UINT i=0;iRead("ModelDataFileName",NULL,NULL,&modelFileName); //if(FAILED(hr))strcpy(modelFileName,"ModelsNew.xml"); hr=m_pStorage->Read("APIVersion",NULL,NULL,&apiVer); //if(FAILED(hr))apiVer=5; if(m_pDeviceLister=CreateDeviceLister()){ if(m_pDeviceLister->InitXMLDOMNodes(modelFileName)){ m_pDeviceLister->EnumerateDevices(apiVer); bXmlObjectInited=TRUE; } } } #endif //Appwizard Stuff.. CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); AnchorWindowToDesktop(m_hWnd,AWTD_HCENTER|AWTD_BOTTOM); SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); m_TabCtrl.SubclassDlgItem(IDC_TAB1,this); if(m_pStorage){//load log options... DWORD dummy; //default values.. #define LOG_ALL 0x7 sprintf(g_LogOption.logFolder, DEFAULT_LOG_FOLDER); g_LogOption.logEnable = TRUE; g_LogOption.logLevel = LOG_ALL; SSVType type; m_pStorage->Read("LogFolder",&type,&dummy,g_LogOption.logFolder); m_pStorage->Read("LogEnable",&type,&dummy,&g_LogOption.logEnable); m_pStorage->Read("LogLevel", &type,&dummy,&g_LogOption.logLevel); // guarantee log folder existence CreateDirectory(g_LogOption.logFolder, NULL); } //Home tab's Property pages.. m_pageStatus.Create(IDD_DLLSTATUS,this); m_pageModel.Create(IDD_MODELLIST,this); m_pageLogComp.Create(IDD_LOGSETTING_COMPONENT,this); m_pageLogGlobal.Create(IDD_LOGSETTING_GLOBAL,this); // Windows title #define MAIN_TITLE_LENGTH 1024 char mainTitle[MAIN_TITLE_LENGTH]; char stVer[MAIN_TITLE_LENGTH]; GetWindowText(mainTitle, MAIN_TITLE_LENGTH); for(int c=0;cCreatePointFont(85,"Arial"); RECT rc5; GetChildWindowRect( m_TabCtrl.m_hWnd,&rc5); InitToolbar (m_Toolbar,IDC_TOOLBAR,this,m_Font,CImageList::FromHandle(m_himl1),CImageList::FromHandle(m_himl2),ARRAYSIZE(buttons),buttons,rc5.right); m_Toolbar.ShowWindow(SW_SHOW); //move the proppages RECT rcPage; GetPageRect(&rcPage); m_pageStatus.MoveWindow(&rcPage); m_pageModel.MoveWindow(&rcPage); m_pageLogComp.MoveWindow(&rcPage); m_pageLogGlobal.MoveWindow(&rcPage); m_cManager=0; CMainInstManager * maininst = new CMainInstManager(); maininst->Create(this,&m_TabCtrl,m_himl1,m_himl2); m_Managers[m_cManager++]=maininst; m_MainInst = maininst; char lpCmd[1024]; lstrcpy(lpCmd,GetCommandLine()); //m_pDeviceLister->m_modelInfo.itrator; //BUILD auth info.. //automatic load... if(bXmlObjectInited){ int size=m_pDeviceLister->m_modelInfo.size(); DVRAUTHINFO* pauthlInfo = new DVRAUTHINFO[size]; int index=0; { std::map::const_iterator start,end; start=m_pDeviceLister->m_modelInfo.begin(); end=m_pDeviceLister->m_modelInfo.end(); while(start!=end){ ModelInfo modelInfo=(*start).second; pauthlInfo[index].hwId=modelInfo.DefModelID; pauthlInfo[index].hwIdCapAudio=modelInfo.CapAudioModelID; memcpy(pauthlInfo[index].activationCode,modelInfo.ActivationCode,16); start++; index++; } } { std::map::const_iterator start,end; start=m_pDeviceLister->m_prjInfo.begin(); end=m_pDeviceLister->m_prjInfo.end(); while(start!=end){ CardLoadInfo loadInfo=(*start).second; CInstanceManager * inst = new CInstanceManager(); if(inst->Create(this,&m_TabCtrl,&loadInfo,pauthlInfo,index,m_himl1,m_himl2)){ m_InstManagers[m_cManager-1]=inst; m_Managers[m_cManager++]=inst; }else{ delete inst; } start++; } } delete pauthlInfo; pauthlInfo=NULL; }else{ MessageBox("Can't Create(Load) appropriate XML Object.\nAutomatic Load is disabled","Warning"); } //add log setting treeview items.. m_MainInst->AddLogSettingTreeItems(); { //network ... CardLoadInfo loadInfo={ "MgrNVS100CM.dll", 0, 1, { {FUNCTION_VIDEO|FUNCTION_AUDIO|FUNCTION_CODEC|FUNCTION_NET,"NVS100.dll"} } }; DVRAUTHINFO authInfo={0x01F8,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; CInstanceManager * inst = new CInstanceManager(); if(inst && inst->Create(this,&m_TabCtrl,&loadInfo,&authInfo,1,m_himl1,m_himl2)){ m_InstManagers[m_cManager-1]=inst; m_Managers[m_cManager++]=inst; }else{ delete inst; } } //{ by metalbrain { CardLoadInfo loadInfo2={ "MgrNVS400CM.dll", 0, 1, { {FUNCTION_CODEC|FUNCTION_NET,"NVS400.dll"} } }; DVRAUTHINFO authInfo2={0x181,0,{0x2a, 0x96, 0x75, 0x56, 0xc8, 0x9e, 0x6b, 0x1d, 0xcd, 0x76, 0x99, 0x3e, 0x2f, 0x8a, 0xb8, 0x29}}; CInstanceManager * inst2 = new CInstanceManager(); if(inst2 && inst2->Create(this,&m_TabCtrl,&loadInfo2,&authInfo2,1,m_himl1,m_himl2)){ m_InstManagers[m_cManager-1]=inst2; m_Managers[m_cManager++]=inst2; }else{ delete inst2; } } { CardLoadInfo loadInfo3={ "MgrNVE.dll", 0, 1, { {FUNCTION_CODEC|FUNCTION_NET,"UdaNVE.dll"} } }; DVRAUTHINFO authInfo3={0xfff,1,{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; CInstanceManager * inst3 = new CInstanceManager(); if(inst3 && inst3->Create(this,&m_TabCtrl,&loadInfo3,&authInfo3,1,m_himl1,m_himl2)){ m_InstManagers[m_cManager-1]=inst3; m_Managers[m_cManager++]=inst3; }else{ delete inst3; } } { CardLoadInfo loadInfo4={ "MgrNVEQC.dll", 0, 1, { {FUNCTION_CODEC|FUNCTION_NET,"UdaNVE.dll"} } }; DVRAUTHINFO authInfo4={0xfff,2,{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; CInstanceManager * inst4 = new CInstanceManager(); if(inst4 && inst4->Create(this,&m_TabCtrl,&loadInfo4,&authInfo4,1,m_himl1,m_himl2)){ m_InstManagers[m_cManager-1]=inst4; m_Managers[m_cManager++]=inst4; }else{ delete inst4; } } //} if(m_cManager>0){ m_CurInstMng=m_Managers[0]; m_CurInstMng->Activate(TRUE); }else{ m_CurInstMng=NULL; } return TRUE; // return TRUE unless you set the focus to a control } #define TIMER_BASE 0x8000 void CMainControlDlg::OnTimer(UINT nIDEvent) { if(TIMER_BASE<=nIDEvent && nIDEventProcessTimer(m_TimerIDs[nIDEvent]); } } } BOOL CMainControlDlg::SetTimer(IProcessCtrl* pProc,UINT id,UINT nElapse) { for(int i=0;iAddRef(); m_TimerIDs[i]=id; CWnd::SetTimer(i+TIMER_BASE,nElapse,NULL); return TRUE; } } return FALSE; } BOOL CMainControlDlg::KillTimer(IProcessCtrl* pProc,UINT id) { for(int i=0;iRelease(); CWnd::KillTimer(i+TIMER_BASE); return TRUE; } } return FALSE; } BOOL CPageModelList::OnInitDialog() { CDialog::OnInitDialog(); ListView_InsertColumns(m_List.m_hWnd,3,"Model Name",120,"Category",80,"ModelID",80); if(g_mainControlDlg->m_pDeviceLister){ std::map::const_iterator start,end; start=g_mainControlDlg->m_pDeviceLister->m_modelInfo.begin(); end=g_mainControlDlg->m_pDeviceLister->m_modelInfo.end(); int index=0; while(start!=end){ ModelInfo modelInfo=(*start).second; char ModelID[16]; _itoa(modelInfo.DefModelID,ModelID,16); ListView_InsertItemWithSubItems(m_List.m_hWnd,index,modelInfo.ModelName,2,modelInfo.ProjectName,ModelID); start++; index++; } } return TRUE; } //Appwizard Stuff.. Never mind. void CMainControlDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { //CDialog::OnPaint(); CPaintDC dc(this); // device context for painting } } BOOL CMainControlDlg::GetPageRect(LPRECT pRc) { RECT rc; m_TabCtrl.GetClientRect(&rc); m_TabCtrl.MapWindowPoints(this,&rc); RECT rc1=rc; GetClientRect(&rc); HWND hToolbar=::GetDlgItem(m_hWnd,IDC_TOOLBAR); RECT rcTb; ::GetClientRect(hToolbar,&rcTb); pRc->left = rc1.right+2; pRc->top = rcTb.bottom; pRc->right = rc.right-2; pRc->bottom= rc.bottom-2; return TRUE; } BOOL CMainControlDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default //tree.. toolbar ... page¸¦ clie rgnÀ¸·Î ÇÏ°í.. //pDC-> RECT rc; #if 0 //test code.. pDC->GetClipBox(&rc); TRACE("%d,%d,%d,%d\n",rc.left,rc.top,rc.right,rc.bottom); int static step=0; int brs[]={LTGRAY_BRUSH,BLACK_BRUSH,WHITE_BRUSH,DKGRAY_BRUSH,GRAY_BRUSH}; //FillRect(pDC->m_hDC,&rc,(HBRUSH)GetStockObject(brs[step])); step++; step%=5; #endif m_TabCtrl.GetClientRect(&rc); m_TabCtrl.MapWindowPoints(this,&rc); RECT rc1=rc; GetClientRect(&rc); HWND hToolbar=::GetDlgItem(m_hWnd,IDC_TOOLBAR); RECT rcTb; ::GetClientRect(hToolbar,&rcTb); RECT rc2={rc1.right+2,rcTb.bottom,rc.right-2,rc.bottom-2}; ::MapWindowPoints(hToolbar,m_hWnd,(LPPOINT)&rcTb,2); pDC->ExcludeClipRect(&rc1); pDC->ExcludeClipRect(&rc2); if(m_bUpdating){ pDC->ExcludeClipRect(&rcTb); } BOOL ret= CDialog::OnEraseBkgnd(pDC); return ret; } HCURSOR CMainControlDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } int CMainControlDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here char titleStr[1024],VerStr[1024]; GetWindowText(titleStr,1024); sprintf(VerStr," [%X, %X, %X, %X] ",VER_A,VER_B,VER_C,VER_D); //sprintf(VerStr," [V %4X]",MGR_VERSION); //GetFileVersionString(lpCreateStruct->hInstance,VerStr); //JB ´©°¡ ÀÌ°É Áö¿üÁö? lstrcat(titleStr,VerStr); SetWindowText(titleStr); return 0; } void CMainControlDlg::OnDestroy() { m_CurInstMng=NULL; m_pageStatus.DestroyWindow(); m_pageModel.DestroyWindow(); m_pageLogComp.DestroyWindow(); m_pageLogGlobal.DestroyWindow(); // TODO: Add your message handler code here m_MainInst->OnCommandCapture(COMMAND_MODE_FORCEFALSE); delete m_MainInst; m_MainInst=NULL; delete m_Font; m_Font=NULL; for(int i=0;iWrite("LogFolder",SSVT_TEXT, 0,g_LogOption.logFolder); m_pStorage->Write("LogEnable",SSVT_DWORD,0,&g_LogOption.logEnable); m_pStorage->Write("LogLevel", SSVT_DWORD,0,&g_LogOption.logLevel); } SAFE_RELEASE(m_pStorage); DeleteCriticalSection(&CMessageManager::s_cs); CDialog::OnDestroy(); CoUninitialize(); } BOOL CMainControlDlg::AddDll(const char *fileName, DWORD category) { HMODULE hLib = LoadLibrary(fileName); if(hLib==NULL)return FALSE; FARPROC test_proc; test_proc = GetProcAddress(hLib, "GetPrismExtDllInfo"); if(test_proc==NULL){ // FreeLibrary(hLib); return FALSE; } BOOL rs; BOOL (FAR WINAPI*_GetPrismExtDllInfo)(PRISMEXTDLLINFO* pCodecInfo); *(FARPROC*)&_GetPrismExtDllInfo=test_proc; PRISMEXTDLLINFO dllInfo; lstrcpy(dllInfo.extFile,fileName); rs=(*_GetPrismExtDllInfo)(&dllInfo); if(rs && category==dllInfo.extCategory){ dllInfo.hLib=hLib; //ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ºÒ¸®¾ú´Ù.. switch(dllInfo.extCategory){ case PRISMEXTDLL_CATEGORY_CARDMANAGER: g_dll_Card[g_cdll_Card++]=dllInfo; break; case PRISMEXTDLL_CATEGORY_FILTER:{ g_dll_Filter[g_cdll_Filter++]=dllInfo; break;} case PRISMEXTDLL_CATEGORY_PLUGIN: g_dll_Plug[g_cdll_Plug++]=dllInfo; break; case PRISMEXTDLL_CATEGORY_EVENTMANAGER: g_dll_Event[g_cdll_Event++]=dllInfo; break; default: ASSERT(0); } }else{ //exportµÈ ÇÔ¼ö°¡ ¾ø°Å³ª.. category°¡ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù... FreeLibrary(hLib); } return rs;//None of Cap3Setup and CapSetup Exist. It fails to init library. } void CMainControlDlg::OnTabSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { m_bUpdating=TRUE; //deactivate current if(m_CurInstMng){ m_CurInstMng->Activate(FALSE); } //set current to new.. int iPage=m_TabCtrl.GetCurSel(); m_CurInstMng = m_Managers[iPage]; //activate new m_CurInstMng->Activate(TRUE); *pResult=FALSE; m_bUpdating=FALSE; } void CMainControlDlg::OnTreeSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { if(m_CurInstMng){ m_CurInstMng->OnTreeSelchanging(pNMHDR,pResult); } } void CMainControlDlg::OnCommandCapture() { if(m_CurInstMng){ if(m_Managers[0]==m_CurInstMng){ m_CurInstMng->OnCommandCapture(COMMAND_MODE_DEFAULT); }else{ m_CurInstMng->OnCommandCapture(m_Toolbar.IsButtonChecked(IDM_COMMAND_CAPTURE)?COMMAND_MODE_FORCETRUE:COMMAND_MODE_FORCEFALSE); } } } void CMainControlDlg::OnComponentCommand(UINT nID) { if(m_CurInstMng){ m_CurInstMng->OnComponentCommand(nID); } } void CMainControlDlg::OnCommandApply() { if(m_CurInstMng){ m_CurInstMng->OnCommandApply(); } } void CMainControlDlg::OnCommandRestore() { if(m_CurInstMng){ m_CurInstMng->OnCommandRestore(); } } void CMainControlDlg::OnCommandDefault() { if(m_CurInstMng){ m_CurInstMng->OnCommandDefault(); } } void CMainControlDlg::OnCommandClose() { DestroyWindow(); } void CMainControlDlg::OnCommandTest() { #if 1 MessageBox("Not yet implemented.","PrismII"); #else CToolBarCtrl* pToolbar=(CToolBarCtrl*)GetDlgItem(IDC_TOOLBAR); BOOL bAttatch=pToolbar->IsButtonChecked(900); if(bAttatch){ m_Container.ShowWindow(SW_SHOW); }else{ m_Container.ShowWindow(SW_HIDE); } for(int i=0;iAttatchToContainer(bAttatch); } #endif } ///////////////////////////////////////////////////////////////////////////// // CInstanceManager ///////////////////////////////////////////////////////////////////////////// CInstanceManager::CInstanceManager():m_refCount(1),m_lastItem(NULL),m_curItem(NULL) { m_CardManager = NULL; m_FilterCount = 0; m_cComponent = 0; m_PlugInCount = 0; m_itemDatas = NULL; m_itemCount = 0; m_lastItem = NULL; m_curItem = NULL; m_LoadingControl= NULL; m_pContainer = NULL; m_bCapture = FALSE; m_bStopping= FALSE; } CInstanceManager::~CInstanceManager() { UINT i; if(m_CardManager){ m_CardManager->Release(); } for(i=0;iRelease(); } for(i=0;iRelease(); } for(i=0;iRelease(); } if(m_itemDatas){ free(m_itemDatas); } } HRESULT CInstanceManager::InitializeContext() { return S_OK; } HRESULT CInstanceManager::UninitizlizeContext() { return S_OK; } BOOL CInstanceManager::Create(CMainControlDlg* pWnd,CTabCtrl* pTab,CardLoadInfo* pLoadInfo,DVRAUTHINFO authInfo[],int Count,HIMAGELIST himl1,HIMAGELIST himl2) { //Tree Item Data¸¦ À§ÇÑ.. ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇÑ´Ù. m_itemDatas=(TREEITEMDATA*)malloc(sizeof(TREEITEMDATA)*128); ZeroMemory(m_itemDatas,sizeof(TREEITEMDATA)*128); m_itemCount=128; //id·Î ºÎÅÍ..DLL Loading Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.. m_pSite=pWnd; m_pContainer=&pWnd->m_Container; m_cComponent=0; m_FilterCount=0; //pLoadInfo->DefaultCardManger; //find loadable dll... BOOL bFound=FALSE; int i; for(i=0;iDefaultCardManger)==0){ bFound=TRUE; break; } } if(bFound==FALSE){ //ÀûÀýÇÑ Ä«µå ¸Å´ÏÀú¸¦ ãÁö ¸øÇß´Ù.. return FALSE; } char strFileName[MAX_PATH]; strcpy(strFileName, "Settings"); lstrcat(strFileName,pLoadInfo->DefaultCardManger); RemoveExtension(strFileName); strcat(strFileName,"xml"); ISettingStorage* pStorage=NULL; CreateStorage(strFileName,&pStorage); if(pStorage==NULL) MessageBox(NULL,"Failed to create Setting storage","PrismII",MB_OK); //Ä«µå¸Å´ÏÀú¿¡ ¸Â´Â.. dataÆÄÀÏÀ» ·ÎµåÇÑ´Ù.. // OutputDebugStringF("pStorage allocated:%x\n",pStorage); int ID=i; CreateInstance(g_dll_Card[ID].hLib,IID_IPrismIICardManager, (void**)&m_CardManager); m_DllInfos[m_cComponent] = &g_dll_Card[ID]; m_CardManager->QueryInterface(IID_IProcessCtrl, (void**)&m_Components[m_cComponent++]); CMessageManager* pMsgMgr=new CMessageManager(g_dll_Card[ID].extName,this); // 0. prepare.. CImageList* piml1=CImageList::FromHandle(himl1); CImageList* piml2=CImageList::FromHandle(himl2); // 1. Insert Tab Item.. int iCount = pTab->GetItemCount(); pTab->InsertItem(iCount,g_dll_Card[ID].extName);//append last //rc is now the rect that tree control.. // 2. Create Tree Control.. RECT rc; pTab->GetWindowRect(&rc); ::MapWindowPoints(NULL,pTab->GetParent()->m_hWnd,(LPPOINT)&rc,2); pTab->AdjustRect(FALSE,&rc); RECT rc4=rc; //rc4.top+=60; //rc4.bottom+=80; // VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_TREEVIEW_REG)); ((CWnd*)&m_Tree)->CreateEx(WS_EX_STATICEDGE|WS_EX_TOPMOST,WC_TREEVIEW,"", WS_CHILD|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS , rc4,m_pSite,IDC_TREE); m_Tree.SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); m_Tree.SetImageList(piml1, TVSIL_NORMAL); // 3. Create Toolbar RECT rctb; GetChildWindowRect(pWnd->m_Toolbar.m_hWnd,&rctb); InitToolbar(m_Toolbar,IDC_TOOLBAR2,pWnd,pWnd->m_Toolbar.GetFont(),piml1,piml2,0,NULL,rctb.right); //m_Toolbar.ShowWindow(SW_SHOW); // 4. Load The Card Manager //m_CardManager; //LoadLibrary(); //GetProcAddress(); char *dllNames[4]={0,};//={"CapSeries.dll","bb.dll","cc.dll","dd.dll"}; for(i=0;iDllCount;i++){ DWORD func=pLoadInfo->DLLs[i].dwSupportedFunctions; if(func&FUNCTION_VIDEO) dllNames[CAPAPI_DLL_INDEX]=pLoadInfo->DLLs[i].DllName; if(func&FUNCTION_AUDIO) dllNames[AUDAPI_DLL_INDEX]=pLoadInfo->DLLs[i].DllName; if(func&FUNCTION_CODEC) dllNames[CODAPI_DLL_INDEX]=pLoadInfo->DLLs[i].DllName; if(func&FUNCTION_OVERAY)dllNames[OVRAPI_DLL_INDEX]=pLoadInfo->DLLs[i].DllName; } //--------------------------------load card manager.. int loadingCtrl=0; m_LoadingControl=m_Components[loadingCtrl++]; m_CardManager->Load(this,dllNames,authInfo,Count,pStorage,pMsgMgr); //é© LONG mediaCount; MEDIATYPE_MULTICHANNEL *mediaTypes[16]; // Ä«µå ¸Å´ÏÀú·Î ºÎÅÍ, mediatype ¸®½ºÆ®¸¦ ¾ò´Â´Ù. // ÀÌ ¸®½ºÆ®´Â uda5mgr¿¡¼­ »ý¼ºÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅÍ Å¸ÀÔÀ¸·Î // UDA5API¿¡ Á¾¼ÓÀûÀ¸·Î »ý¼ºµÈ´Ù. (cap¿¡ ÀÇÇØ »ý¼ºµÇ´Â°Í...µî) m_CardManager->GetMediaTypes(&mediaCount,NULL); m_CardManager->GetMediaTypes(&mediaCount,mediaTypes); ZeroMemory(m_mediaMap,sizeof(m_mediaMap)); ZeroMemory(m_idxMap,sizeof(m_idxMap)); //-------------------------------load Filters.. //loop¾È¿¡¼­.. m_mediaMap,m_idxMapÀ» µ¿½Ã¿¡ ¼³Á¤ÇÑ´Ù. for(i=0;imajorType,&count,minorTypes,NULL)){ //DLL·ÎºÎÅÍ mediaMapÁ¤º¸¸¦ ¹Þ¾Æµé¿´À½. for(int k=0;kminorType==minorTypes[k]){ bMatch=TRUE; int& nMedia=m_idxMap[m_FilterCount].nMedia;//media count per filter int& nFilter=m_mediaMap[j].nFilter;//filter count per media.. m_mediaMap[j].fltIdx[nFilter]=m_FilterCount; m_mediaMap[j].mediaIdx[nFilter]=nMedia; m_idxMap[m_FilterCount].mediaIdx[nMedia]=j; nFilter++; nMedia++; break; } } } } if(bMatch){ CreateInstance(g_dll_Filter[i].hLib,IID_IPrismIIFilter,(void**)&m_Filters[m_FilterCount]); m_DllInfos[m_cComponent] = &g_dll_Filter[i]; m_Filters[m_FilterCount]->QueryInterface(IID_IProcessCtrl, (void**)&m_Components[m_cComponent++]); m_FilterCount++; } } //5. load filter... for(i=0;iLoad(this,pStorage,pMsgMgr,m_idxMap[i].nMedia,mTypes); } m_Tree.Select(m_Tree.GetFirstVisibleItem(),TVGN_CARET); //6. Load Plug-Ins... #define ICONID_PLUGIN 20 AddTreeViewItem(NULL,ICONID_PLUGIN,"Plug-Ins",0,0,0); AdjustTreeViewLevel(FALSE); for(i=0;iLoad(this,m_CardManager,pStorage,pMsgMgr); if(SUCCEEDED(hr)){ m_DllInfos[m_cComponent] = &g_dll_Plug[i]; pPlugin->QueryInterface(IID_IProcessCtrl,(void**)&m_Components[m_cComponent++]); //add treeview item.. AddTreeViewItem(pPlugin,ICONID_PLUGIN,g_dll_Plug[i].extName,0,0,0); m_PlugIns[m_PlugInCount] = pPlugin; m_PlugInCount++; // pPlugin->QueryInterface(IID_IProcessCtrl, (void**)&m_Components[m_cComponent++]); } else { pPlugin->Release(); } } } AdjustTreeViewLevel(TRUE); pMsgMgr->Release(); // OutputDebugStringF("pStorage before release:%x release func addr :%x ,%x\n",pStorage,pStorage->Release,CSettingStorage::Release); pStorage->Release(); return TRUE; } BOOL CInstanceManager::Activate(BOOL bActivate) { if(bActivate){//activate //TOOLBAR/ m_Toolbar.ShowWindow(SW_SHOW); m_pSite->m_Toolbar.CheckButton(IDM_COMMAND_CAPTURE,m_bCapture); //TREE ... m_Tree.ShowWindow(SW_SHOW); HTREEITEM hItem = m_Tree.GetSelectedItem(); if(hItem){ int index = m_Tree.GetItemData(hItem); RECT rcPage={0,}; m_pSite->GetPageRect(&rcPage); DWORD * v=m_itemDatas[index].data; if (m_itemDatas[index].pManager) { m_itemDatas[index].pManager->ShowPropertyPage(m_pSite->m_hWnd ,rcPage,v[0],v[1],v[2]); } } }else{//deactivate m_Tree.ShowWindow(SW_HIDE); HTREEITEM hItem = m_Tree.GetSelectedItem(); if(hItem){ int index = m_Tree.GetItemData(hItem); if (m_itemDatas[index].pManager) { m_itemDatas[index].pManager->HidePropertyPage(); } } //m_CardManager->HidePropertyPage(); //é© //TOOLBAR/ m_Toolbar.ShowWindow(SW_HIDE); } return TRUE; } DWORD WINAPI CInstanceManager::StopCaptureThreadProc(LPVOID lpParam) { return ((CInstanceManager*)lpParam)->StopCaptureThreadProcInternal(); } DWORD CInstanceManager::StopCaptureThreadProcInternal() { for(int i=0;iProcessStop(); } return 0; } int MessageLoop ( HANDLE* lphObjects, int cObjects ) { while (TRUE){ // block-local variable DWORD result ; MSG msg ; ZeroMemory(&msg,sizeof(msg)); while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) return -1; // Otherwise, dispatch the message. if (!AfxGetApp()->PreTranslateMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } // End of PeekMessage while loop. AfxGetApp()->OnIdle(0); // updates user interface AfxGetApp()->OnIdle(1); // frees temporary objects result = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE, INFINITE, QS_ALLINPUT); // The result tells us the type of event we have. if (result == (WAIT_OBJECT_0 + cObjects)){ continue; } else { // One of the handles became signaled. return result - WAIT_OBJECT_0; //DoStuff () ; } // End of else clause. } // End of the always while loop. } // End of function. typedef unsigned ( __stdcall *beginthreadthreadproc)( void * ); void CInstanceManager::StopProcessCtrls() { m_bStopping=TRUE; DWORD id; HANDLE hThread; hThread = (HANDLE)_beginthreadex(0,0,(beginthreadthreadproc)StopCaptureThreadProc,this,0,(unsigned*)&id); // CreateThread(0,0,StopCaptureThreadProc,this,NULL,&id); #if 1 int ret=MessageLoop(&hThread,1); if(ret==0){ CloseHandle(hThread); hThread = NULL; }else if(ret==-1){ PostQuitMessage(0); } //thread is not yet finished.. if (hThread) { WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); hThread=NULL; } #else MSG msg; while(1){ DWORD wait = MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLINPUT); if(wait == (WAIT_OBJECT_0 + 1)){ if(::GetMessage(&msg,0,0,0)!=0){ TranslateMessage(&msg); DispatchMessage(&msg); }else{ PostQuitMessage(0); break; } }else if(wait ==WAIT_OBJECT_0 ){ //thread°¡ Á¾·áµÇ¾ú´Ù... CloseHandle(hThread); hThread = NULL; break; } } #endif m_bStopping=FALSE; } BOOL CInstanceManager::OnCommandCapture(int Mode) { if(m_bStopping)return FALSE; int i; // BOOL rs; if(Mode==COMMAND_MODE_FORCETRUE && m_bCapture)return TRUE; if(Mode==COMMAND_MODE_FORCEFALSE && !m_bCapture)return TRUE; if(Mode==COMMAND_MODE_FORCETRUE)m_bCapture=TRUE; else if(Mode==COMMAND_MODE_FORCEFALSE)m_bCapture=FALSE; //disable the button if(m_bCapture){ //capture¸¦ ½ÃÀÛÇÑ´Ù.. //1. filter¸¦ setupÇÑ´Ù.. for(i=0;iSaveSetting(); for(i=m_cComponent-1;i>=0;i--) m_Components[i]->ProcessSetup(); for(i=m_cComponent-1;i>=0;i--) m_Components[i]->ProcessRun(); }else{ //é© : Window message daed lockÇö»óÀ» ¾ø¾Öµµ·Ï ÇØ¾ß ÇÑ´Ù.. #if 1 StopProcessCtrls(); #else for(i=0;iProcessStop(); } #endif for(i=0;iProcessEndup(); } } //enable the button.. return TRUE; } //apply¸¦ Çϸé.. g_setting_next -> g_setting¿¡ ÀúÀå restoreÀÇ ±âÁØ°ªÀÌ º¯°æµÈ´Ù. BOOL CInstanceManager::OnCommandApply() { int i; if(m_bStopping)return FALSE; if(m_bCapture){ //ÇöÀç ½ÇÇàÁßÀ̹ǷΠstop½ÃŲÈÄ ´Ù½Ã runÇÑ´Ù. #if 1 StopProcessCtrls(); #else for(i=0;iProcessStop(); } #endif for(i=0;iSaveSetting(); for(i=m_cComponent-1;i>=0;i--) m_Components[i]->ProcessRun(); }else{ //apply the setting.. for(i=0;iSaveSetting(); } return TRUE; } BOOL CInstanceManager::OnComponentCommand(UINT nID) { //ID¸¦ ºÐÇØÇØ ³½´Ù.. ULONG uCmd=nID&0x03; ULONG uComponentIdx=(nID>>2)&0x0F; TBBUTTONINFO tbBtnInfo; ZeroMemory(&tbBtnInfo,sizeof(TBBUTTONINFO)); tbBtnInfo.cbSize=sizeof(TBBUTTONINFO); tbBtnInfo.dwMask=TBIF_LPARAM; m_Toolbar.GetButtonInfo(nID,&tbBtnInfo); if(m_Components[uComponentIdx]!=(IProcessCtrl*)tbBtnInfo.lParam){ return FALSE; } IProcessCtrl* pProcessCtrl = (IProcessCtrl*)tbBtnInfo.lParam; HRESULT hr; BOOL bCheckState=FALSE; if(m_Toolbar.IsButtonChecked(nID)){ bCheckState=TRUE; } BOOL bPrevState=!bCheckState; hr=pProcessCtrl->ProcessCommand(uCmd,&bCheckState); BOOL bCheck=SUCCEEDED(hr)?bCheckState:bPrevState; m_Toolbar.CheckButton(nID,bCheck); return TRUE; } BOOL CInstanceManager::OnCommandRestore() { int i; for(i=0;iRestoreSetting(); return TRUE; } BOOL CInstanceManager::OnCommandDefault() { int i; for(i=0;iResetSetting(); return TRUE; } BOOL CInstanceManager::AttatchToContainer(BOOL bAttatch) { HRESULT hr; int i; if(bAttatch){ for(i=0;iQueryInterface(IID_IPrismIIWindowManage,(void**)&pWindow); if(SUCCEEDED(hr)){ int nWindow=pWindow->GetWindowCount(); RECT rc; m_pContainer->GetInternalRect(&rc); for(int j=0;jGetWindowText(j,wndText); m_pContainer->InsertTab(wndText,(DWORD)pWindow,j); pWindow->AttachWindow(j,m_pContainer->m_hWnd,rc); } pWindow->Release(); } } }else{ for(i=0;iQueryInterface(IID_IPrismIIWindowManage,(void**)&pWindow); if(SUCCEEDED(hr)){ int nWindow=pWindow->GetWindowCount(); for(int j=0;jDetachWindow(j); m_pContainer->RemoveTab((DWORD)pWindow,j); } pWindow->Release(); } } } return TRUE; } HRESULT CInstanceManager::QueryInterface( REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject) { if(riid==IID_IUnknown){ *ppvObject = (IUnknown*)this; AddRef(); return S_OK; }else if(riid==IID_IInstanceManager){ AddRef(); *ppvObject = (IInstanceManager*)this; return S_OK; }else{ return E_NOINTERFACE; } return S_OK; } ULONG CInstanceManager::AddRef( void) { return InterlockedIncrement(&m_refCount); } ULONG CInstanceManager::Release( void) { LONG res= InterlockedDecrement(&m_refCount); if(res==0) delete this; return res; } HRESULT CInstanceManager::GetMainWindowHandle() { return S_OK; } //´ÙÀ½ ¼¼ ÇÔ¼ö´Â °°Àº À̸§À» °®´Â filterÀÇ method¿¡ ³Ñ°ÜÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù. //mapping table¿¡ ÀÇÇؼ­ ¸ðµç ÇÊÅÍ¿¡ Àü´ÞµÇÁö ¾Ê°í ÇÊ¿äÇÑ ÇÊÅÍ¿¡¸¸ Àü´ÞµÈ´Ù. //é© BOOL CInstanceManager::SetMediaTypes(LONG mediaCount, MEDIATYPE_MULTICHANNEL* mediaTypes[],BOOL bCurrent) { //ÀúÀåµÈ mediaCount¿Í °ªÀÌ °°ÀºÁö Á¶»çÇØ º¸¾Æ¾ßÇÑ´Ù.. for(int i=0;iSetMediaTypes(m_idxMap[i].nMedia,mTypes,bCurrent); } return TRUE; } BOOL CInstanceManager::SetMediaTypeDetail(LONG mediaIndex, LONG chIndex,MEDIATYPE_BASE* mediaType,BOOL bCurrent) { for(int i=0;iSetMediaTypeDetail(m_mediaMap[mediaIndex].mediaIdx[i],chIndex,mediaType,bCurrent); } return TRUE; } HRESULT CInstanceManager::ProcessMediaData(ULONG mediaIndex,ULONG linCh,MEDIADATA_BASE * MediaData,ReleaseMediaFunc relFunc) { //Card Manager¿¡¼­ º¸³½ µ¥ÀÌÅ͸¦ ó¸®ÇÑ´Ù. for(int i=0;iProcessMediaData(m_mediaMap[mediaIndex].mediaIdx[i],linCh,MediaData,relFunc); } return S_OK; } HRESULT CInstanceManager::ProcessMediaCallback(DWORD callbackParamType,DWORD apiIndex,DWORD param1,DWORD param2,DWORD param3) { for(int i=0;iMediaCallback(callbackParamType, apiIndex, param1, param2, param3); } return S_OK; } HRESULT CInstanceManager::GetDriverDLL() { return S_OK; } HRESULT CInstanceManager::GetActivationCode() { return S_OK; } int CInstanceManager::FindTreeViewItem(IProcessCtrl * pProcess,DWORD v1,DWORD v2,DWORD v3) { //find the item.. //tree¸¦ ¼øȸÇÑ´Ù.. //¸ÕÀú ÇØ´ç lParam°ªÀ» ã´Â´Ù... for(int i=0;i=0){ m_Tree.Select(m_itemDatas[rs].item,bSelect?TVGN_CARET:TVGN_FIRSTVISIBLE); //m_Tree.UpdateWindow(); return TRUE; } return FALSE; } BOOL CInstanceManager::SetTreeViewAddPosition(IProcessCtrl * pProcess,DWORD v1,DWORD v2,DWORD v3) { int rs=FindTreeViewItem(pProcess,v1,v2,v3); if(rs>=0){ m_curItem=m_itemDatas[rs].item; return TRUE; } return FALSE; } BOOL CInstanceManager::DeleteTreeViewItem(IProcessCtrl * pProcess,DWORD v1,DWORD v2,DWORD v3) { int index=FindTreeViewItem(pProcess,v1,v2,v3); if(index>=0){ HTREEITEM hItem=m_Tree.GetParentItem(m_curItem); //delete. m_Tree.DeleteItem(m_itemDatas[index].item); m_curItem=hItem; m_itemDatas[index].item=NULL; return TRUE; } return FALSE; } BOOL CInstanceManager::EmptyTreeView(IProcessCtrl * pProcess) { //ÃÖ »óÀ§ ·¹º§¸¸ Áö¿ì¸é µÈ´Ù. HTREEITEM item=m_Tree.GetRootItem(); //tree view item¸¦ Áö¿ì°í.. while(1){ HTREEITEM item_next=m_Tree.GetNextItem(item,TVGN_NEXT); if(item_next){ DWORD idx = m_Tree.GetItemData(item_next); if(m_itemDatas[idx].pManager==pProcess){ m_Tree.DeleteItem(item_next); }else{ item=item_next; } }else{ break; } } for(int i=0;iNotifyWindowInfo(pWndMng,idx,uMsg,param); return S_OK; } HRESULT CInstanceManager::AddToolbarButton(IProcessCtrl * pProcess,UINT uCmd,UINT iIcon,LPCSTR pText,BOOL bCheck,BOOL bOn) { //uCmd:0~3 BOOL bStateChange=FALSE; if(uCmd&0x00010000) bStateChange=TRUE; uCmd &= 0x03; if(uCmd>3)return E_FAIL; if(bStateChange){ //on/off¸¸ Á¶ÀýÇÑ´Ù. for(int i=0;i=0){ item.hInsertAfter = TVI_LAST; item.hParent = m_curItem; item.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT |TVIF_PARAM; item.item.iImage = IconID; item.item.iSelectedImage = IconID; item.item.pszText = text; item.item.lParam = empty_index; m_lastItem = m_Tree.InsertItem(&item); m_itemDatas[empty_index].pManager= pProcess;//m_LoadingControl; m_itemDatas[empty_index].data[0] = v1; m_itemDatas[empty_index].data[1] = v2; m_itemDatas[empty_index].data[2] = v3; m_itemDatas[empty_index].item = m_lastItem; return TRUE; }else{ return FALSE; } } BOOL CInstanceManager::AddTreeViewItemFormatted(IProcessCtrl* pProcess,DWORD IconID,DWORD v1,DWORD v2,DWORD v3,char * format,...) { char text[128]; va_list marker; va_start(marker,format); vsprintf(text,format,marker); return AddTreeViewItem(pProcess,IconID,text,v1,v2,v3); } HRESULT CInstanceManager::AdjustTreeViewLevel(BOOL bIncrease) { if(bIncrease){ m_curItem = m_Tree.GetParentItem(m_curItem); }else{//decrease.. m_curItem = m_lastItem; } return S_OK; } void CInstanceManager::OnTreeSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; TREEITEMDATA & newItem = m_itemDatas[pNMTreeView->itemNew.lParam]; TREEITEMDATA & oldItem = m_itemDatas[pNMTreeView->itemOld.lParam]; ULONG rs = TRUE; if(oldItem.pManager){ rs = oldItem.pManager->HidePropertyPage(); } if(pNMTreeView->itemOld.hItem!=NULL && !rs){ *pResult = 1; return; } RECT rcPage={0,}; m_pSite->GetPageRect(&rcPage); DWORD* v=newItem.data; if(!newItem.pManager){ return; } if(newItem.pManager->ShowPropertyPage(m_pSite->m_hWnd,rcPage,v[0],v[1],v[2])){ *pResult = 0;//accept chaging the tree view selction. }else{ *pResult = 1;//reject chaing the tree view selection. } } HRESULT CInstanceManager::SetTimer(IProcessCtrl* pProc,UINT id,UINT uElapse) { if(m_pSite->SetTimer(pProc,id,uElapse)) return S_OK; return E_FAIL; } HRESULT CInstanceManager::KillTimer(IProcessCtrl* pProc,UINT id) { if(m_pSite->KillTimer(pProc,id)) return S_OK; return E_FAIL; } ///////////////////////////////////////////////////////////////////////////// // CMainInstManager ///////////////////////////////////////////////////////////////////////////// CMainInstManager::CMainInstManager() { m_bCapture=FALSE; } CMainInstManager::~CMainInstManager() { } BOOL CMainInstManager::Create(CMainControlDlg* pWnd,CTabCtrl* pTab,HIMAGELIST himl1,HIMAGELIST himl2) { m_pSite=pWnd; // 0. prepare.. CImageList* piml1=CImageList::FromHandle(himl1); CImageList* piml2=CImageList::FromHandle(himl2); // 1. Insert Tab Item.. pTab->InsertItem(0,"Home"); RECT rc; pTab->GetWindowRect(&rc); ::MapWindowPoints(NULL,m_pSite->m_hWnd,(LPPOINT)&rc,2); pTab->AdjustRect(FALSE,&rc); //rc is now the rect that tree control.. // 2. Create Tree Control.. RECT rc4=rc; ((CWnd*)&m_Tree)->CreateEx(WS_EX_STATICEDGE|WS_EX_TOPMOST,WC_TREEVIEW,"", WS_CHILD|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS , rc4,m_pSite,IDC_TREE); m_Tree.SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); m_Tree.SetImageList(piml1, TVSIL_NORMAL); TV_INSERTSTRUCT item={0,}; item.hInsertAfter = TVI_LAST; item.hParent = NULL; item.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT |TVIF_PARAM; item.item.iImage = 5; item.item.iSelectedImage = 5; item.item.lParam = 0; item.item.pszText = "Dlls"; m_Tree.InsertItem(&item); item.item.lParam = 1; item.item.pszText = "Models"; m_Tree.InsertItem(&item); return TRUE; } BOOL CMainInstManager::Activate(BOOL bActivate) { HTREEITEM hSelected=m_Tree.GetSelectedItem(); if(hSelected==NULL)m_Tree.SelectItem(hSelected=m_Tree.GetFirstVisibleItem()); LPARAM id = m_Tree.GetItemData(hSelected) & 0xFF; if(bActivate){//activate m_Tree.ShowWindow(SW_SHOW); m_pSite->m_Toolbar.CheckButton(IDM_COMMAND_CAPTURE,m_bCapture); switch(id){ case 0: m_pSite->m_pageStatus.ShowWindow(SW_SHOW); break; case 1: m_pSite->m_pageModel.ShowWindow(SW_SHOW); break; case 2: m_pSite->m_pageLogGlobal.ShowWindow(SW_SHOW); break; case 3: m_pSite->m_pageLogComp.ShowWindow(SW_SHOW); break; } }else{//deactivate m_Tree.ShowWindow(SW_HIDE); m_pSite->m_pageStatus.ShowWindow(SW_HIDE); m_pSite->m_pageModel.ShowWindow(SW_HIDE); m_pSite->m_pageLogComp.ShowWindow(SW_HIDE); m_pSite->m_pageLogGlobal.ShowWindow(SW_HIDE); } return TRUE; } BOOL CMainInstManager::OnCommandCapture(int Mode) { m_bCapture = m_pSite->m_Toolbar.IsButtonChecked(IDM_COMMAND_CAPTURE); if(COMMAND_MODE_DEFAULT==Mode){ Mode = m_pSite->m_Toolbar.IsButtonChecked(IDM_COMMAND_CAPTURE)?COMMAND_MODE_FORCETRUE:COMMAND_MODE_FORCEFALSE; } for(int i=1;im_cManager;i++){ m_pSite->m_Managers[i]->OnCommandCapture(Mode); } return TRUE; } BOOL CMainInstManager::OnCommandApply() { for(int i=1;im_cManager;i++){ m_pSite->m_Managers[i]->OnCommandApply(); } return TRUE; } BOOL CMainInstManager::OnComponentCommand(UINT nID) { return TRUE; } BOOL CMainInstManager::OnCommandRestore() { for(int i=1;im_cManager;i++){ m_pSite->m_Managers[i]->OnCommandRestore(); } return TRUE; } BOOL CMainInstManager::OnCommandDefault() { for(int i=1;im_cManager;i++){ m_pSite->m_Managers[i]->OnCommandDefault(); } return TRUE; } void CMainInstManager::OnTreeSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { //ÀÚ±âÀÇ prop page¸¦ º¸¿©ÁØ´Ù. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; pNMTreeView->itemNew.lParam; pNMTreeView->itemOld.lParam; switch(pNMTreeView->itemOld.lParam){ case 0: m_pSite->m_pageStatus.ShowWindow(SW_HIDE); break; case 1: m_pSite->m_pageModel.ShowWindow(SW_HIDE); break; case 2: m_pSite->m_pageLogGlobal.ShowWindow(SW_HIDE); break; case 3: m_pSite->m_pageLogComp.ShowWindow(SW_HIDE); break; } switch(pNMTreeView->itemNew.lParam){ case 0: m_pSite->m_pageStatus.ShowWindow(SW_SHOW); break; case 1: m_pSite->m_pageModel.ShowWindow(SW_SHOW); break; case 2: m_pSite->m_pageLogGlobal.ShowWindow(SW_SHOW); break; case 3: m_pSite->m_pageLogComp.ShowWindow(SW_SHOW); break; } *pResult = 0;//accept chaging the tree view selction. } void CMainInstManager::AddLogSettingTreeItems() { HTREEITEM hParent=NULL; TV_INSERTSTRUCT item={0,}; item.hInsertAfter = TVI_LAST; item.hParent = NULL; item.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT |TVIF_PARAM; item.item.iImage = 5; item.item.iSelectedImage = 5; ///Global Options item.item.lParam = 2; item.item.pszText = "LogOptions"; hParent = m_Tree.InsertItem(&item); for(int i=0; im_cManager-1; i++){ CInstanceManager* pMgr=m_pSite->m_InstManagers[i]; item.hParent = hParent; item.item.lParam = (0xFF << 16) | (i<<8) | 3; item.item.pszText = pMgr->GetComponentDllInfo(0)->extName; HTREEITEM hParent2 = m_Tree.InsertItem(&item); for(int j=0;jGetComponentCount();j++){ item.hParent = hParent2; item.item.lParam = (j << 16) | (i<<8) | 3; item.item.pszText = pMgr->GetComponentDllInfo(j)->extName; m_Tree.InsertItem(&item); } } } ///////////////////////////////////////////////////////////////////////////// // CHollowTabCtrl ///////////////////////////////////////////////////////////////////////////// CHollowTabCtrl::CHollowTabCtrl() { } CHollowTabCtrl::~CHollowTabCtrl() { } BEGIN_MESSAGE_MAP(CHollowTabCtrl, CTabCtrl) //{{AFX_MSG_MAP(CHollowTabCtrl) ON_WM_ERASEBKGND() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHollowTabCtrl message handlers BOOL CHollowTabCtrl::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default RECT rc; GetClientRect(&rc); AdjustRect(FALSE,&rc); pDC->ExcludeClipRect(&rc); BOOL ret = CTabCtrl::OnEraseBkgnd(pDC); return ret; } ///////////////////////////////////////////////////////////////////////////// // CLogManager ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CMessageManager ///////////////////////////////////////////////////////////////////////////// //¿¡·¯¸Þ½ÃÁö¸¦ Ç¥½ÃÇØÁÖ´Â.. //Dialog Ŭ·¡½º¿¡.. ¸Þ¼Òµå¸¦ ºÒ·¯¼­.. ÅÇÀ» Ãß°¡ÇÏ°í ¸Þ½ÃÁö¸¦ Ãß°¡ÇÑ´Ù... CMessageManager::CMessageManager(LPCSTR name,CInstanceManager* pInst):m_refCount(1),m_pInst(pInst) { m_index = g_pMsgDlg->AddPage(name); strncpy(m_name,name,31); m_name[31]=0; } CMessageManager::~CMessageManager() { //deletepage??? } HRESULT CMessageManager::QueryInterface( REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject) { if(riid==IID_IUnknown){ *ppvObject = (CMessageManager*)this; AddRef(); return S_OK; }else if(riid==IID_IMessageManager){ AddRef(); *ppvObject = (CMessageManager*)this; return S_OK; }else if(riid==IID_ILogManager){ AddRef(); *ppvObject = (ILogManager*)this; return S_OK; }else{ return E_NOINTERFACE; } } ULONG CMessageManager::AddRef( void) { return InterlockedIncrement(&m_refCount); } ULONG CMessageManager::Release( void) { LONG res= InterlockedDecrement(&m_refCount); if(res==0) delete this; return res; } HRESULT CMessageManager::Show(BOOL bShow) { if(bShow){ g_pMsgDlg->Activate(TRUE,m_index); }else{ g_pMsgDlg->Activate(FALSE,m_index); } return S_OK; } HRESULT CMessageManager::PushErrorCodeF(const char* format,...) { char buf[512]; va_list marker; va_start(marker,format); vsprintf(buf,format,marker); strcat(buf,"\r\n"); g_pMsgDlg->AddMessage(m_index,buf); return S_OK; } HRESULT CMessageManager::PushErrorCodeItem(void* pEerrItem) { //errItem->TimeStamp CMN5_ERROR_CODE_ITEM* errItem = (CMN5_ERROR_CODE_ITEM*)pEerrItem; return PushErrorCode(errItem->ErrorCode,0,errItem->AuxMsg,errItem->SessionName); } HRESULT CMessageManager::PushErrorCode(ULONG code, ULONG minorCode, const char* auxMsg,const char* session) { char buf[256]; wsprintf(buf,"%d,%d,%s,%s\r\n",code,minorCode,auxMsg,session); g_pMsgDlg->AddMessage(m_index,buf); return S_OK; } HRESULT CMessageManager::LogMessageF(IProcessCtrl* pComp,ULONG code, const char * logMsg,...) { char buf[512]; va_list args; va_start (args, logMsg); _vsnprintf (buf, sizeof(buf), logMsg, args); va_end (args) ; return LogMessageF2(pComp, code, TRUE, TRUE,buf ); } HRESULT CMessageManager::LogMessageF2(IProcessCtrl* pComp,ULONG code, BOOL bPrefix, BOOL bLinefeed, const char * logMsg,...) { PRISMEXTDLLINFO* pDllInfo=NULL; //find component information.. for(int i = 0; i < m_pInst->GetComponentCount(); i++){ if(m_pInst->GetComponent(i) == pComp){ pDllInfo = m_pInst->GetComponentDllInfo(i); break; } } //Unknown component for this instance manager.. if(pDllInfo==NULL)return E_FAIL; //pDllInfo,m_name,code... BOOL bLog=g_LogOption.logEnable && ( g_LogOption.logLevel & ( 1<extName, time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond,time.wMilliseconds ); } char buf2[512]; va_list args; va_start (args, logMsg); _vsnprintf (buf2, sizeof(buf2), logMsg, args); va_end (args) ; strcat(buf1,buf2); if (bLinefeed) { strcat(buf1,"\r\n"); } fprintf(fp,buf1); fclose(fp); } LeaveCriticalSection(&s_cs); } return S_OK; } ///////////////////////////////////////////////////////////////////////////// // Util Functions... ///////////////////////////////////////////////////////////////////////////// static BOOL InitToolbar(CToolBarCtrl& tb,UINT id,CWnd* pParent,CFont* pFont,CImageList* pimlHot,CImageList* piml,UINT nBtn,TBBUTTON* pBtns,ULONG left) { RECT rc1={0,}; tb.Create(WS_CHILD|TBSTYLE_FREESIZE|TBSTYLE_LIST|TBSTYLE_TOOLTIPS,rc1,pParent,id);//CBRS_ALIGN_TOP ); tb.SetFont(pFont); tb.SetImageList(piml); tb.SetHotImageList(pimlHot); tb.AddButtons(nBtn,pBtns); SIZE size; tb.GetMaxSize(&size); RECT rcItem; tb.GetItemRect(tb.GetButtonCount()-1,&rcItem); ::MoveWindow(tb.m_hWnd,left,2,rcItem.right+4,size.cy+4,TRUE);//rc3.right-rc2.right,size.cy); return TRUE; } static BOOL CreateInstance(HMODULE hLib,const GUID& pGuid,void ** ppInterface) { BOOL rs; BOOL (FAR WINAPI*_CreateInstance)(const GUID& pGuid,void ** ppInterface); FARPROC test_proc=GetProcAddress(hLib,"CreateInstance"); *(FARPROC*)&_CreateInstance=test_proc; rs=(*_CreateInstance)(pGuid,ppInterface); return TRUE; } BOOL CMainControlDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->wParam == VK_RETURN) { return TRUE; } else if(pMsg->wParam == VK_ESCAPE) { return TRUE; } return CDialog::PreTranslateMessage(pMsg); }