//Copyright (c) 1998 - 1999 Microsoft Corporation /*++ Module Name: MainFrm.cpp Abstract: This Module contains the implementation of CMainFrame class (The Frame Window of the application) Author: Arathi Kundapur (v-akunda) 11-Feb-1998 Revision History: --*/ #include "stdafx.h" #include #include "LicMgr.h" #include "defines.h" #include "LSServer.h" #include "MainFrm.h" #include "RtList.h" #include "lSmgrdoc.h" #include "LtView.h" #include "cntdlg.h" #include "addkp.h" #include "treenode.h" #include "ntsecapi.h" //#include "lrwizapi.h" #include "TlsHunt.h" #include "htmlhelp.h" #define DELETE_AND_ADDTO_ERROR DeleteServer(pLicServerList,TempPos,pLicServer);\ if(!ErrorServers.IsEmpty()) \ ErrorServers = ErrorServers + _T(","); \ ErrorServers = ErrorServers + Name; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_MESSAGE(WM_ENUMERATESERVER, OnEnumerateServer) ON_MESSAGE(WM_SEL_CHANGE, OnSelChange) ON_MESSAGE(WM_ADD_ALL_SERVERS, OnAddAllServers) ON_MESSAGE(WM_ADD_SERVER, OnAddServer) ON_MESSAGE(WM_ADD_KEYPACK, OnAddKeyPack) ON_COMMAND(ID_LARGE_ICONS, OnLargeIcons) ON_COMMAND(ID_SMALL_ICONS, OnSmallIcons) ON_COMMAND(ID_LIST, OnList) ON_COMMAND(ID_DETAILS, OnDetails) ON_COMMAND(ID_EXIT, OnExit) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_HELP_FINDER, OnHelp) ON_COMMAND(ID_HELP_USING, CFrameWnd::OnHelpUsing) ON_COMMAND(ID_CONNECT_SERVER, OnConnectServer) ON_COMMAND(ID_REGISTRATION, OnRegistration) ON_COMMAND(ID_KEY_HELP , OnHelp ) ON_UPDATE_COMMAND_UI( ID_REGISTRATION, OnUpdateAddNewKeyPack) ON_UPDATE_COMMAND_UI( ID_ACTION_DOWNLOADLICENSES, OnUpdateDownloadlicenses ) ON_UPDATE_COMMAND_UI( ID_ACTION_ADVANCED_REPEATLASTDOWNLOAD , OnUpdateRepeatLastDownload ) ON_UPDATE_COMMAND_UI( ID_ACTION_ADVANCED_REREGISTERSERVER , OnUpdateReregisterserver ) ON_UPDATE_COMMAND_UI( ID_ACTION_ADVANCED_UNREGISTERSERVER , OnUpdateUnregisterserver ) ON_UPDATE_COMMAND_UI( ID_VIEW_PROPERTIES , OnUpdateProperties ) ON_COMMAND( ID_REFRESH, OnRefreshServer ) ON_COMMAND( ID_VIEW_REFRESHALL , OnRefresh ) ON_UPDATE_COMMAND_UI( ID_REFRESH , OnUpdateRefresh ) ON_COMMAND( ID_ACTION_DOWNLOADLICENSES , OnDownLoadLicenses ) ON_COMMAND( ID_ACTION_ADVANCED_REPEATLASTDOWNLOAD , OnRepeatLastDownLoad ) ON_COMMAND( ID_ACTION_ADVANCED_REREGISTERSERVER , OnReRegisterServer ) ON_COMMAND( ID_ACTION_ADVANCED_UNREGISTERSERVER , OnUnRegisterServer ) ON_COMMAND( ID_VIEW_PROPERTIES , OnProperties ) //}}AFX_MSG_MAP END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { m_pRightView= NULL; m_pLeftView = NULL; m_pServer = NULL; } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } #if 0 if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } #endif // Remove this if you don't want tool tips or a resizeable toolbar m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // Delete these three lines if you don't want the toolbar to be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; } void CMainFrame::OnHelp() { TCHAR * pHtml = L"ts_lice_topnode.htm"; HtmlHelp(AfxGetMainWnd()->m_hWnd, L"tslic.chm", HH_DISPLAY_TOPIC,(DWORD_PTR)pHtml); } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.style &= ~FWS_ADDTOTITLE; return CFrameWnd::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { m_SplitterWnd.CreateStatic(this,1,2); //1 row, 2 columns m_SplitterWnd.CreateView(0,0,(CRuntimeClass *)pContext->m_pNewViewClass,CSize(150,150),pContext); m_SplitterWnd.CreateView(0,1,RUNTIME_CLASS(CRightList),CSize(0,0),pContext); m_pRightView = (CView *)m_SplitterWnd.GetPane(0, 1); m_pLeftView = (CLicMgrLeftView *)m_SplitterWnd.GetPane(0, 0); return TRUE; } LRESULT CMainFrame::OnSelChange(WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; m_pRightView->SendMessage(WM_SEL_CHANGE,wParam,lParam); return lResult; } void CMainFrame::OnLargeIcons() { PressButton(ID_LARGE_ICONS,TRUE); PressButton(ID_SMALL_ICONS,FALSE); PressButton(ID_LIST,FALSE); PressButton(ID_DETAILS,FALSE); m_pRightView->SendMessage(WM_COMMAND,ID_LARGE_ICONS,0); } void CMainFrame::OnSmallIcons() { PressButton(ID_LARGE_ICONS,FALSE); PressButton(ID_SMALL_ICONS,TRUE); PressButton(ID_LIST,FALSE); PressButton(ID_DETAILS,FALSE); m_pRightView->SendMessage(WM_COMMAND,ID_SMALL_ICONS,0); } void CMainFrame::OnList() { PressButton(ID_LARGE_ICONS,FALSE); PressButton(ID_SMALL_ICONS,FALSE); PressButton(ID_LIST,TRUE); PressButton(ID_DETAILS,FALSE); m_pRightView->SendMessage(WM_COMMAND,ID_LIST,0); } void CMainFrame::OnDetails() { PressButton(ID_LARGE_ICONS,FALSE); PressButton(ID_SMALL_ICONS,FALSE); PressButton(ID_LIST,FALSE); PressButton(ID_DETAILS,TRUE); m_pRightView->SendMessage(WM_COMMAND,ID_DETAILS,0); } void CMainFrame::OnExit() { SendMessage(WM_CLOSE,0,0); } LRESULT CMainFrame::OnAddAllServers(WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; m_pLeftView->SendMessage(WM_ADD_ALL_SERVERS,wParam,lParam); return lResult; } LRESULT CMainFrame::OnAddServer(WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; m_pLeftView->SendMessage(WM_ADD_SERVER,wParam,lParam); m_pRightView->SendMessage(WM_ADD_SERVER,wParam,lParam); return lResult; } LRESULT CMainFrame::OnAddKeyPack(WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; m_pLeftView->SendMessage(WM_ADD_KEYPACK,wParam,lParam); m_pRightView->SendMessage(WM_ADD_KEYPACK,wParam,lParam); return lResult; } void CMainFrame::OnAppAbout() { CString AppName; AppName.LoadString(IDS_APP_NAME); ::ShellAbout((HWND)m_hWnd,(LPCTSTR)AppName, NULL,NULL); } void CMainFrame::OnRegistration() { CWnd* cWnd = AfxGetMainWnd(); HWND hWnd=cWnd->GetSafeHwnd(); DWORD status; CString TempString; CString Server; CLicServer* pServer = NULL; WCHAR szServer[MAX_COMPUTERNAME_LENGTH + 1]; BOOL bRefresh; try { if(ERROR_SUCCESS != GetActiveServer(&pServer)) { DBGMSG( L"LICMGR : OnRegistration no active servers\n",0 ); return; } if(SERVER_TS5_ENFORCED == pServer->GetServerType()) { DBGMSG( L"LICMGR : OnRegistration on enforced server\n",0 ); if( !pServer->IsUserAdmin( ) ) { AfxMessageBox( IDS_E_ACCESSDENIED ); // ::MessageBox( GetSafeHwnd( ) , L"Unable to perform operation: Access denied" , L"Terminal Services Licensing" , MB_OK|MB_ICONINFORMATION ); return; } if(pServer->UseIpAddress()) { Server = pServer->GetIpAddress(); } else { Server = pServer->GetName(); } lstrcpy(szServer, (LPCTSTR)Server); DWORD dwStatus = pServer->GetServerRegistrationStatus( ); DBGMSG( L"LICMGR:CMainFrame::OnRegistration calling StartWizard\n", 0 ); StartWizard( hWnd , WIZACTION_REGISTERLS , szServer , &bRefresh ); //DBGMSG( L"LICMGR:CMainFrame::OnRegistration - StartWizard returned 0x%x\n" , status ); if( IsLicenseServerRegistered( hWnd , szServer , &status ) == ERROR_SUCCESS ) { pServer->SetServerRegistrationStatus( status ); } if( dwStatus != status ) { RefreshServer(pServer); } UpdateWindow(); } else { DBGMSG( L"LICMGR : OnRegistration on non-enforced server\n",0 ); // AddKeyPackDialog(NULL); } } catch (...) { // validation failed - user already alerted, fall through // Note: DELETE_EXCEPTION_(e) not required } } ////////////////////////////////////////////////////////////////////////////// BOOL CMainFrame::ConnectServer( LPCTSTR pszServer ) /*++ ++*/ { CConnectDialog ConnectDialog; CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc) return FALSE; HRESULT hResult = ERROR_SUCCESS; SERVER_TYPE ServerType; CString Scope; if(pszServer == NULL) { if(ConnectDialog.DoModal() != IDOK) { return FALSE; } // // Empty string - local machine // if(ConnectDialog.m_Server.IsEmpty()) { TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD dwBufSize = MAX_COMPUTERNAME_LENGTH + 1; memset(szComputerName, 0, sizeof(szComputerName)); GetComputerName(szComputerName, &dwBufSize); ConnectDialog.m_Server = szComputerName; } } else { // // Minimize code change // ConnectDialog.m_Server = pszServer; } SetCursor(LoadCursor(NULL,IDC_WAIT)); if(TRUE == pDoc->IsServerInList(ConnectDialog.m_Server)) { //AfxMessageBox(IDS_DUPLICATE_SERVER); return FALSE; } //HUEIHUEI - Check if server is registered // // Do a NT4 RPC connect to make sure the license server // can accept our calls. // CString IpAddress(ConnectDialog.m_Server); hResult = pDoc->ConnectToServer( ConnectDialog.m_Server, Scope, ServerType ); if(ERROR_SUCCESS != hResult) { CDialog ErrorDialog(IDD_CONNECT_ERROR,this); ErrorDialog.DoModal(); } else { CAllServers * pAllServers = pDoc->GetAllServers(); CLicServer *pServer1 = NULL; if(IpAddress != ConnectDialog.m_Server) { if(TRUE == pDoc->IsServerInList(ConnectDialog.m_Server)) { return TRUE; } pServer1 = new CLicServer( ConnectDialog. m_Server, ServerType, Scope, IpAddress ); } else { pServer1= new CLicServer( ConnectDialog. m_Server, ServerType, Scope ); } if(pServer1) { DWORD dwStatus; // check for admin pServer1->SetAdmin( IsUserAdmin( pServer1->GetName() ) ); if( pServer1->IsUserAdmin( ) ) { if( IsLicenseServerRegistered( GetSafeHwnd() , ( LPCTSTR )pServer1->GetName() , &dwStatus ) == ERROR_SUCCESS ) { pServer1->SetServerRegistrationStatus( dwStatus ); } } CLicMgrDoc * pDoc = (CLicMgrDoc *)(GetActiveView()->GetDocument()); pDoc->EnumerateKeyPacks( pServer1 , LSKEYPACK_SEARCH_LANGID , TRUE ); WIZCONNECTION WizConType; if( GetConnectionType( GetSafeHwnd() , pServer1->GetName() , &WizConType ) == ERROR_SUCCESS ) { DBGMSG( L"ConnectServer - GetConnectionType obtained %d" , WizConType ); pServer1->SetConType( WizConType ); } pAllServers->AddLicServer(pServer1); SendMessage(WM_ADD_SERVER,0,(LPARAM)pServer1); // after the send message is called all servers will have their keypacks cached. pServer1->SetDownLoadLics( IsDownLoadedPacks( pServer1 ) ); } else { return FALSE; } } return TRUE; } //////////////////////////////////////////////////////////////////////////// void CMainFrame::OnConnectServer() { ConnectServer(); } HRESULT CMainFrame::AddKeyPackDialog(CLicServer * pServer) { HRESULT hResult = ERROR_SUCCESS; CString TempString; CString Server; //if pServer is null,Then the message is from Listview. //Get the current server from the treeview. SetCursor(LoadCursor(NULL,IDC_WAIT)); if(NULL == pServer) { if(ERROR_SUCCESS != GetActiveServer(&pServer)) { hResult = E_FAIL; return hResult; } } //Server = pServer->GetName(); CLicMgrDoc * pDoc = (CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc) { hResult = E_FAIL; return hResult; } KeyPackList * pKeypackList = pServer->GetKeyPackList(); if(NULL == pKeypackList) { hResult = E_FAIL; return hResult; } //If Server is not enumerated enumerate now. if(!pServer->IsExpanded()) { HRESULT hResult = pDoc->EnumerateKeyPacks(pServer,LSKEYPACK_SEARCH_LANGID, TRUE); if(hResult != S_OK) { hResult = E_FAIL; return hResult; } POSITION pos1 = pKeypackList->GetHeadPosition(); while(pos1) { CKeyPack *pKeyPack = (CKeyPack *)pKeypackList->GetNext(pos1); hResult = pDoc->EnumerateLicenses(pKeyPack,LSLICENSE_SEARCH_KEYPACKID, TRUE); if(hResult != S_OK) { hResult = E_FAIL; return hResult; } } } CAddKeyPack KeyPack(pKeypackList,IsUserAdmin(Server)); KeyPack.DoModal(); return hResult; } void CMainFrame::OnUpdateAddNewKeyPack(CCmdUI* pCmdUI) { BOOL bEnable = FALSE; HRESULT hrStatus; // we have to force another check here bEnable = IsServerRegistered( &hrStatus ); if( FAILED( hrStatus ) ) { pCmdUI->Enable(bEnable); } else { pCmdUI->Enable( !bEnable ); } } HRESULT CMainFrame::AddLicensestoList( CKeyPack * pKeyPack, CListCtrl * pListCtrl, BOOL bRefresh ) /*++ --*/ { CLicServer *pServer = NULL; CString Error; HRESULT hr; ASSERT(pKeyPack); ASSERT(pListCtrl); CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pKeyPack || NULL == pListCtrl || NULL == pDoc) { return E_FAIL; } if(TRUE == bRefresh) { if((hr = pKeyPack->RefreshIssuedLicenses()) != S_OK) { EnumFailed(hr,pKeyPack->GetServer()); return E_FAIL; } } IssuedLicenseList * pIssuedLicenseList = pKeyPack->GetIssuedLicenseList(); ASSERT(pIssuedLicenseList); if(NULL == pIssuedLicenseList) { return E_FAIL; } LSKeyPack sKeyPack = pKeyPack->GetKeyPackStruct(); int nIndex = 0; int nSubitemIndex = 1; CString TempString; POSITION pos; LV_ITEM lvI; lvI.mask = LVIF_TEXT |LVIF_IMAGE |LVIF_STATE | LVIF_PARAM; lvI.state = 0; lvI.stateMask =0; lvI.iSubItem = 0; lvI.iImage = 2; pos = pIssuedLicenseList->GetHeadPosition(); while(pos) { lvI.iItem = nIndex; nSubitemIndex = 1; CLicense * pLicense = pIssuedLicenseList->GetNext(pos); ASSERT(pLicense); if(NULL == pLicense) { continue; } LSLicenseEx sLicense = pLicense->GetLicenseStruct(); lvI.lParam = (LPARAM)pLicense; TempString = sLicense.szMachineName; lvI.pszText = TempString.GetBuffer(TempString.GetLength()); lvI.cchTextMax =lstrlen(lvI.pszText + 1); nIndex = pListCtrl->InsertItem(&lvI); //Set the Issue date. pDoc->TimeToString(&sLicense.ftIssueDate, TempString); if(TempString.IsEmpty()) { TempString.LoadString(IDS_UNKNOWN); } pListCtrl->SetItemText(nIndex,nSubitemIndex,(LPCTSTR)TempString); nSubitemIndex++; //Set the expiry date. if(0x7FFFFFFF != sLicense.ftExpireDate) { TempString.LoadString(IDS_DASH); pDoc->TimeToString(&sLicense.ftExpireDate, TempString); if(TempString.IsEmpty()) { TempString.LoadString(IDS_UNKNOWN); } } else { TempString.LoadString(IDS_DASH); } pListCtrl->SetItemText(nIndex,nSubitemIndex,(LPCTSTR)TempString); nSubitemIndex++; // adding status text to license's status column switch( sLicense.ucLicenseStatus ) { case LSLICENSE_STATUS_UNKNOWN: TempString.LoadString( IDS_LICENSESTATUS_UNKNOWN ); break; case LSLICENSE_STATUS_TEMPORARY: TempString.LoadString( IDS_LICENSESTATUS_TEMPORARY ); break; case LSLICENSE_STATUS_ACTIVE: //case LSLICENSE_STATUS_PENDING_ACTIVE: case LSLICENSE_STATUS_CONCURRENT: TempString.LoadString( IDS_LICENSESTATUS_ACTIVE ); break; case LSLICENSE_STATUS_UPGRADED: TempString.LoadString( IDS_LICENSESTATUS_UPGRADED ); break; //case LSLICENSE_STATUS_REVOKE: //case LSLICENSE_STATUS_REVOKE_PENDING: // TempString.LoadString( IDS_LICENSESTATUS_REVOKE ); } if( TempString.IsEmpty() ) { TempString.LoadString(IDS_UNKNOWN); } pListCtrl->SetItemText(nIndex,nSubitemIndex,(LPCTSTR)TempString); nIndex ++; } return S_OK; } void CMainFrame :: PressButton(UINT uId, BOOL bPress) { CToolBarCtrl& ToolBarCtrl = m_wndToolBar.GetToolBarCtrl(); ToolBarCtrl.PressButton(uId,bPress); } ///////////////////////////////////////////////////////////////////// LRESULT CMainFrame::OnEnumerateServer(WPARAM wParam, LPARAM lParam) { CTlsHunt huntDlg; huntDlg.DoModal(); if( wParam == 0 && huntDlg.IsUserCancel() == FALSE && huntDlg.GetNumServerFound() == 0 ) { AfxMessageBox(IDS_NOSERVERINDOMAIN); } return 0; } ///////////////////////////////////////////////////////////////////// void CMainFrame :: ConnectAndDisplay() { CLicMgrApp *pApp = (CLicMgrApp*)AfxGetApp(); ASSERT(pApp); CLicMgrDoc *pDoc = (CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pApp || NULL == pDoc) return; HRESULT hResult = ERROR_SUCCESS; CString LicServer; CString Server = pApp->m_Server; if(!Server.IsEmpty()) { //Server Specified in the command line. Connect to it. hResult = pDoc->ConnectWithCurrentParams(); } else { ActivateFrame(); // // Save a copy of what we have. // LicServer = pApp->m_Server; pApp->m_Server = _TEXT(""); hResult = pDoc->ConnectWithCurrentParams(); pApp->m_Server = LicServer; hResult = ERROR_SUCCESS; } switch(hResult) { case E_FAIL: AfxMessageBox(IDS_CONNECT_SERVER_FAILED); break; case E_OUTOFMEMORY: AfxMessageBox(IDS_NO_MEMORY); SendMessage(WM_CLOSE,0,0); break; case E_DUPLICATE: AfxMessageBox(IDS_DUPLICATE_SERVER); break; } return; } HRESULT CMainFrame :: GetLicServer(CString * pLicServer) { HRESULT hResult = ERROR_SUCCESS; if(NULL == pLicServer) return hResult; HKEY hKey = NULL; DWORD lSize = MAX_PATH; ULONG lDataType = REG_SZ; TCHAR szString[MAX_PATH] = {0}; long lResult; lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TERMSERVICE_PARAMETER_KEY,0,KEY_READ,&hKey); if(ERROR_SUCCESS != lResult) { hResult = E_FAIL; goto cleanup; } lResult = RegQueryValueEx(hKey,USE_LICSENSE_SERVER,0,&lDataType,(unsigned char *)szString,&lSize); if(ERROR_SUCCESS != lResult) { hResult = E_FAIL; goto cleanup; } if(szString[0] != 1) { hResult = E_FAIL; goto cleanup; } lDataType = REG_SZ; lSize = MAX_PATH; lResult = RegQueryValueEx(hKey,LICSENSE_SERVER,0,&lDataType,(unsigned char *)szString,&lSize); if(ERROR_SUCCESS != lResult) { hResult = E_FAIL; goto cleanup; } else *pLicServer = szString; cleanup: if(hKey) RegCloseKey(hKey); return hResult; } void CMainFrame::OnRefresh() { CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc) { AfxMessageBox(IDS_INTERNAL_ERROR); return; } HRESULT hResult = ERROR_SUCCESS; CString ErrorServers; CString Error; CWaitCursor Wait; CAllServers *pAllServers = pDoc->GetAllServers(); ASSERT(pAllServers); if(NULL == pAllServers) { AfxMessageBox(IDS_INTERNAL_ERROR); return; } LicServerList * pLicServerList = pAllServers->GetLicServerList(); ASSERT(pLicServerList); if(NULL == pLicServerList) { AfxMessageBox(IDS_INTERNAL_ERROR); return; } POSITION pos = pLicServerList->GetHeadPosition(); OnEnumerateServer( (pos == NULL) ? 0 : 1, // show error dialog if nothing in the list 0 ); Wait.Restore(); while(pos) { // Connect to each server and check if the information in the cache is current. If not update the information. // If the connection to the server cannot be establised,add them to the list to display to the user. POSITION TempPos = pos; CLicServer * pLicServer = pLicServerList->GetNext(pos); ASSERT(pLicServer); if(NULL == pLicServer) { continue; } CString Name = pLicServer->GetName(); //Call Refresh Server hResult = RefreshServer(pLicServer); } if(!ErrorServers.IsEmpty()) { Error.LoadString(IDS_REFRESH_SERVERS_ERROR); Error = Error + ErrorServers; AfxMessageBox(Error); } return; } void CMainFrame::DeleteServer(LicServerList * pLicServerList, POSITION TempPos, CLicServer * pLicServer) { if(NULL == pLicServerList || NULL == pLicServer) return; m_pLeftView->SendMessage(WM_DELETE_SERVER,0,(LPARAM)pLicServer); m_pRightView->SendMessage(WM_DELETE_SERVER,0,(LPARAM)pLicServer); pLicServerList->RemoveAt(TempPos); delete pLicServer; pLicServer = NULL; } void CMainFrame::SetTreeViewSel(LPARAM lParam, NODETYPE NodeType) { if(NULL == lParam || NULL == m_pLeftView) return; ((CLicMgrLeftView *)m_pLeftView)->SetSelection(lParam, NodeType); SetActiveView(m_pLeftView); return; } HRESULT CMainFrame::AddLicenses(CKeyPack * pKeyPack,UINT nLicenses) { HRESULT hResult = ERROR_SUCCESS; CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc || NULL == pKeyPack) { hResult = E_FAIL; return hResult; } LPLSKeyPack psKeyPack; psKeyPack = &pKeyPack->GetKeyPackStruct(); hResult = pDoc->AddLicenses(pKeyPack->GetServer(),psKeyPack,nLicenses); if(ERROR_SUCCESS != hResult) { return hResult; } m_pRightView->SendMessage(WM_UPDATE_SERVER,0,(LPARAM)pKeyPack->GetServer()); return hResult; } HRESULT CMainFrame::RemoveLicenses(CKeyPack * pKeyPack,UINT nLicenses) { HRESULT hResult = ERROR_SUCCESS; CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc || NULL == pKeyPack) { hResult = E_FAIL; return hResult; } LPLSKeyPack psKeyPack; psKeyPack = &pKeyPack->GetKeyPackStruct(); hResult = pDoc->RemoveLicenses(pKeyPack->GetServer(),psKeyPack,nLicenses); if(ERROR_SUCCESS != hResult && LSERVER_I_REMOVE_TOOMANY != hResult) { return hResult; } m_pRightView->SendMessage(WM_UPDATE_SERVER,0,(LPARAM)pKeyPack->GetServer()); return hResult; } void InitLsaString(PLSA_UNICODE_STRING LsaString, LPWSTR String ) { DWORD StringLength; if (String == NULL) { LsaString->Buffer = NULL; LsaString->Length = 0; LsaString->MaximumLength = 0; return; } StringLength = lstrlen(String); LsaString->Buffer = String; LsaString->Length = (USHORT) StringLength * sizeof(WCHAR); LsaString->MaximumLength=(USHORT)(StringLength+1) * sizeof(WCHAR); } NTSTATUS OpenPolicy( LPWSTR ServerName, DWORD DesiredAccess, PLSA_HANDLE PolicyHandle ) /*++ --*/ { LSA_OBJECT_ATTRIBUTES ObjectAttributes; LSA_UNICODE_STRING ServerString; PLSA_UNICODE_STRING Server = NULL; // Always initialize the object attributes to all zeroes. ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); if (ServerName != NULL) { // Make a LSA_UNICODE_STRING out of the LPWSTR passed in InitLsaString(&ServerString, ServerName); Server = &ServerString; } // Attempt to open the policy. return LsaOpenPolicy(Server, &ObjectAttributes, DesiredAccess, PolicyHandle ); } BOOL CMainFrame::IsUserAdmin(CString& Server) { BOOL IsUserAdmin = FALSE; LSA_HANDLE PolicyHandle = NULL; NTSTATUS Status; Status = OpenPolicy(Server.GetBuffer(Server.GetLength()),POLICY_SERVER_ADMIN,&PolicyHandle); DBGMSG( L"LICMGR@CMainFrame::IsUserAdmin OpenPolicy returned 0x%x\n" , Status ); if(Status == 0) IsUserAdmin = TRUE; if(PolicyHandle) LsaClose(PolicyHandle); return IsUserAdmin; } void CMainFrame::EnumFailed(HRESULT reason, CLicServer * pLicServer) { DBGMSG( L"CMainFrame_EnumFailed\n" , 0 ); ASSERT(pLicServer); if(NULL == pLicServer) return; CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc) return; CString Error; CString Server; POSITION pos; BOOL bFoundServer = FALSE; LicServerList * pLicServerList = NULL; POSITION temppos = NULL; switch(reason) { case CONNECTION_FAILED: DBGMSG( L"\tCONNECTION_FAILED\n" , 0 ); Server = pLicServer->GetName(); Error.Format(IDS_CONNECT_ERROR,Server); AfxMessageBox(Error); pLicServerList = (pDoc->GetAllServers())->GetLicServerList(); if(NULL == pLicServerList) break; //Find the position of the server in the List; pos = pLicServerList->GetHeadPosition(); while(pos) { temppos = pos; CLicServer *pServer = (CLicServer *)pLicServerList->GetNext(pos); ASSERT(pServer); if(NULL == pServer) continue; if((0 == Server.CompareNoCase(pServer->GetName())) || (0 == Server.CompareNoCase(pServer->GetIpAddress()))) { bFoundServer = TRUE; break; } } if(bFoundServer) DeleteServer(pLicServerList,temppos,pLicServer); break; case LSERVER_E_SERVER_BUSY: DBGMSG( L"\tLSERVER_E_SERVER_BUSY\n" , 0 ); AfxMessageBox(IDS_SERVER_BUSY); break; case LSERVER_E_OUTOFMEMORY: DBGMSG( L"\tLSERVER_E_OUTOFMEMORY\n" , 0 ); AfxMessageBox(IDS_SERVER_OUTOFMEMORY); break; case LSERVER_E_INTERNAL_ERROR: DBGMSG( L"\tLSERVER_E_INTERNAL_ERROR\n" , 0 ); AfxMessageBox(IDS_SERVER_INTERNAL_ERROR); pLicServerList = (pDoc->GetAllServers())->GetLicServerList(); if(NULL == pLicServerList) break; //Find the position of the server in the List; pos = pLicServerList->GetHeadPosition(); while(pos) { temppos = pos; CLicServer *pServer = (CLicServer *)pLicServerList->GetNext(pos); ASSERT(pServer); if(NULL == pServer) continue; if((0 == Server.CompareNoCase(pServer->GetName())) || (0 == Server.CompareNoCase(pServer->GetIpAddress()))) { bFoundServer = TRUE; break; } } if(bFoundServer) DeleteServer(pLicServerList,temppos,pLicServer); break; case E_OUTOFMEMORY: DBGMSG( L"\tE_OUTOFMEMORY\n" , 0 ); AfxMessageBox(IDS_NO_MEMORY); break; default: break; } } void CMainFrame::SelectView(VIEW view) { if(view == TREEVIEW) { SetActiveView(m_pLeftView); } else { SetActiveView(m_pRightView); } } HRESULT CMainFrame::RefreshServer(CLicServer * pLicServer) { DWORD dwStatus; HRESULT hResult = E_FAIL; CWaitCursor Wait; if(NULL == pLicServer) { return E_INVALIDARG; } DBGMSG( L"LICMGR : CMainFrame::RefreshServer %s\n" , pLicServer->GetName( ) ); CLicMgrDoc * pDoc =(CLicMgrDoc *)(GetActiveView()->GetDocument()); ASSERT(pDoc); if(NULL == pDoc) { return ERROR_INTERNAL_ERROR; } CString Server; if(pLicServer->UseIpAddress()) { Server = pLicServer->GetIpAddress(); } else { Server = pLicServer->GetName(); } WIZCONNECTION WizConType; DBGMSG( L"LICMGR:CMainFrame::RefreshServer setting ConnectionType\n" , 0 ); if( GetConnectionType( GetSafeHwnd() , Server , &WizConType ) == ERROR_SUCCESS ) { pLicServer->SetConType( WizConType ); } // check for admin DBGMSG( L"LICMGR:CMainFrame::RefreshServer setting admin priv\n" , 0 ); pLicServer->SetAdmin( IsUserAdmin( Server ) ); if( !pLicServer->IsUserAdmin( ) ) { return E_ACCESSDENIED; } DBGMSG( L"LICMGR:CMainFrame::RefreshServer updating server status\n" , 0 ); if( IsLicenseServerRegistered( GetSafeHwnd( ) , Server , &dwStatus ) == ERROR_SUCCESS ) { pLicServer->SetServerRegistrationStatus( dwStatus ); } else { pLicServer->SetServerRegistrationStatus( ( DWORD )-1 ); } //Could connect to the server. check if Info in cache is proper. //If server is not expanded leave it like that. /* if(!pLicServer->IsExpanded()) { DBGMSG( L"LICMGR:Cmainframe licserver not expanded\n" , 0 ); return S_OK; } */ KeyPackList * pkeypackList = pLicServer->GetKeyPackList(); if(NULL == pkeypackList) { DBGMSG( L"LICMGR:RefreshServer no keypacklist\n",0 ); return E_FAIL; } POSITION pos1 = pkeypackList->GetHeadPosition(); CKeyPack *pKeyPack = NULL; DBGMSG( L"LICMGR:CMainFrame::RefreshServer removing keypacks\n" , 0 ); while(pos1) { pKeyPack = (CKeyPack *)pkeypackList->GetNext(pos1); ASSERT(pKeyPack); if(pKeyPack) { delete pKeyPack; pKeyPack = NULL; } } pkeypackList->RemoveAll(); pLicServer->Expand(FALSE); DBGMSG( L"LICMGR:CMainFrame::RefreshServer enumerating keypacks\n" , 0 ); hResult = pDoc->EnumerateKeyPacks( pLicServer, LSKEYPACK_SEARCH_LANGID, TRUE ); if(hResult != S_OK) { EnumFailed( hResult , pLicServer ); return hResult; } /* pos1 = pkeypackList->GetHeadPosition(); BOOL bFlag = FALSE; while(pos1) { CKeyPack *pKeyPack = (CKeyPack *)pkeypackList->GetNext(pos1); hResult = pDoc->EnumerateLicenses( pKeyPack, LSLICENSE_SEARCH_KEYPACKID, TRUE ); if(hResult != S_OK) { return hResult; } } */ DBGMSG( L"LICMGR:CMainFrame::RefreshServer checking for keypacks\n" , 0 ); pLicServer->SetDownLoadLics( IsDownLoadedPacks( pLicServer ) ); m_pLeftView->SendMessage(WM_UPDATE_SERVER,0,(LPARAM)pLicServer); m_pRightView->SendMessage(WM_UPDATE_SERVER,0,(LPARAM)pLicServer); return hResult; } //-------------------------------------------------------------------- void CMainFrame::OnUpdateDownloadlicenses( CCmdUI * pCmdUI ) { DBGMSG( L"LICMGR@CMainFrame::OnUpdateDownloadlicenses\n" , 0 ); CLicServer *pServer = NULL; HRESULT hr; GetActiveServer( &pServer ); pCmdUI->Enable( FALSE ); if( pServer != NULL ) { if( pServer->GetServerType( ) == SERVER_TS5_ENFORCED ) { pCmdUI->Enable( IsServerRegistered( &hr ) ); } else { pCmdUI->Enable( TRUE ); } } else { pCmdUI->Enable( FALSE ); } } //-------------------------------------------------------------------- void CMainFrame::OnUpdateRepeatLastDownload( CCmdUI * pCmdUI ) { DBGMSG( L"LICMGR@CMainFrame::OnUpdateRepeatLastDownload\n" , 0 ); HRESULT hr; CLicServer * pLicServer = NULL; if( SUCCEEDED( GetActiveServer( &pLicServer ) ) ) { if( pLicServer->GetConType( ) != CONNECTION_WWW ) { if( IsServerRegistered( &hr ) ) { pCmdUI->Enable( IsLicensesDownLoaded() ); return; } } } pCmdUI->Enable( FALSE ); } //-------------------------------------------------------------------- void CMainFrame::OnUpdateReregisterserver( CCmdUI * pCmdUI ) { DBGMSG( L"LICMGR@CMainFrame::OnUpdateReregisterserver\n" , 0 ); HRESULT hr; CLicServer * pLicServer = NULL; if( SUCCEEDED( GetActiveServer( &pLicServer ) ) ) { if( pLicServer->GetConType( ) != CONNECTION_WWW ) { pCmdUI->Enable( IsServerRegistered( &hr ) ); return; } } pCmdUI->Enable( FALSE ); } //-------------------------------------------------------------------- void CMainFrame::OnUpdateUnregisterserver( CCmdUI * pCmdUI ) { DBGMSG( L"LICMGR@CMainFrame::OnUpdateUnregisterserver\n" , 0 ); HRESULT hr; CLicServer * pLicServer = NULL; if( SUCCEEDED( GetActiveServer( &pLicServer ) ) ) { if( pLicServer->GetConType( ) != CONNECTION_WWW ) { pCmdUI->Enable( IsServerRegistered( &hr ) ); return; } } pCmdUI->Enable( FALSE ); } //-------------------------------------------------------------------- void CMainFrame::OnUpdateRefresh( CCmdUI *pCmdUI ) { CLicServer * pLicServer = NULL; if( FAILED( GetActiveServer( &pLicServer ) ) ) { pCmdUI->Enable( FALSE ); } else { pCmdUI->Enable( TRUE ); } } //-------------------------------------------------------------------- void CMainFrame::OnUpdateProperties( CCmdUI *pCmdUI ) { CLicServer * pLicServer = NULL; GetActiveServer( &pLicServer ); pCmdUI->Enable( FALSE ); if( pLicServer != NULL && pLicServer->GetServerType( ) == SERVER_TS5_ENFORCED ) { pCmdUI->Enable( TRUE ); } } //-------------------------------------------------------------------- void CMainFrame::OnRefreshServer( ) { CLicServer * pLicServer = NULL; if( FAILED( GetActiveServer( &pLicServer ) ) ) { // nothing to refresh return; } RefreshServer( pLicServer ); } //-------------------------------------------------------------------- BOOL CMainFrame::IsServerRegistered( HRESULT *phrStatus ) { BOOL bEnable = FALSE; ASSERT( phrStatus != NULL ); DWORD dwServerStatus = ERROR_SUCCESS; CLicServer * pLicServer = NULL; *phrStatus = GetActiveServer( &pLicServer ); if( pLicServer != NULL ) { if( pLicServer->GetServerType() == SERVER_TS5_ENFORCED ) { dwServerStatus = pLicServer->GetServerRegistrationStatus( ); } else { *phrStatus = E_FAIL; // fail all non enforced server } } if( dwServerStatus == LSERVERSTATUS_REGISTER_INTERNET || dwServerStatus == LSERVERSTATUS_REGISTER_OTHER ) { bEnable = TRUE; } else { bEnable = FALSE; } DBGMSG( L"LICMGR@CMainFrame::IsServerRegistered -- status returned 0x%x\n" , dwServerStatus ); return bEnable; } //-------------------------------------------------------------------- // used by views //-------------------------------------------------------------------- void CMainFrame::UI_initmenu( CMenu *pMenu , NODETYPE nt ) { HRESULT hr; CLicServer *pServer; GetActiveServer( &pServer ); if( pMenu == NULL ) { return; } UINT uMF = MF_GRAYED | MF_DISABLED; if( pServer != NULL ) { if( pServer->GetConType() != CONNECTION_WWW ) { DBGMSG( L"LICMGR:UI_initmenu server contype is not www\n" , 0 ); uMF = MF_ENABLED; } } BOOL bEnable = IsServerRegistered( &hr ); if( nt == NODE_SERVER ) { if( bEnable ) { if( FAILED( hr ) ) { pMenu->EnableMenuItem( ID_SVR_ACTIVATESERVER , MF_ENABLED ); } else { pMenu->EnableMenuItem( ID_SVR_ACTIVATESERVER , MF_GRAYED | MF_DISABLED ); } pMenu->EnableMenuItem( ID_LPK_ADVANCED_REACTIVATESERVER , uMF ); pMenu->EnableMenuItem( ID_LPK_ADVANCED_DEACTIVATESERVER , uMF ); pMenu->EnableMenuItem( ID_LPK_PROPERTIES , MF_ENABLED ); if( IsLicensesDownLoaded() ) { pMenu->EnableMenuItem( ID_LPK_DOWNLOADLICENSES , MF_ENABLED ); pMenu->EnableMenuItem( ID_LPK_ADVANCED_REPEATLASTDOWNLOAD , uMF ); } else { pMenu->EnableMenuItem( ID_LPK_DOWNLOADLICENSES , MF_ENABLED ); pMenu->EnableMenuItem( ID_LPK_ADVANCED_REPEATLASTDOWNLOAD , MF_GRAYED | MF_DISABLED ); } } else { if( SUCCEEDED( hr ) ) { pMenu->EnableMenuItem( ID_SVR_ACTIVATESERVER , MF_ENABLED ); } else { pMenu->EnableMenuItem( ID_SVR_ACTIVATESERVER , MF_DISABLED | MF_GRAYED ); } if( pServer != NULL ) { if( pServer->GetServerType( ) == SERVER_TS5_ENFORCED ) { pMenu->EnableMenuItem( ID_LPK_DOWNLOADLICENSES , MF_GRAYED | MF_DISABLED ); pMenu->EnableMenuItem( ID_LPK_PROPERTIES , MF_ENABLED ); } else { pMenu->EnableMenuItem( ID_LPK_DOWNLOADLICENSES , MF_ENABLED ); pMenu->EnableMenuItem( ID_LPK_PROPERTIES , MF_GRAYED | MF_DISABLED ); } } pMenu->EnableMenuItem( ID_LPK_ADVANCED_REPEATLASTDOWNLOAD , MF_GRAYED | MF_DISABLED ); pMenu->EnableMenuItem( ID_LPK_ADVANCED_REACTIVATESERVER , MF_GRAYED | MF_DISABLED ); pMenu->EnableMenuItem( ID_LPK_ADVANCED_DEACTIVATESERVER , MF_GRAYED | MF_DISABLED ); } } else if( nt == NODE_KEYPACK ) { if( bEnable ) { if( IsLicensesDownLoaded() ) { pMenu->EnableMenuItem( ID_LICPAK_DOWNLOADLICENSES , MF_ENABLED ); pMenu->EnableMenuItem( ID_LICPAK_REPEATDOWNLOAD , uMF ); } else { pMenu->EnableMenuItem( ID_LICPAK_DOWNLOADLICENSES , MF_ENABLED ); pMenu->EnableMenuItem( ID_LICPAK_REPEATDOWNLOAD , MF_GRAYED | MF_DISABLED ); } } else { if( pServer != NULL && pServer->GetServerType() == SERVER_TS5_ENFORCED ) { pMenu->EnableMenuItem( ID_LICPAK_DOWNLOADLICENSES , MF_GRAYED | MF_DISABLED ); } else { pMenu->EnableMenuItem( ID_LICPAK_DOWNLOADLICENSES , MF_ENABLED ); } pMenu->EnableMenuItem( ID_LICPAK_REPEATDOWNLOAD , MF_GRAYED | MF_DISABLED ); } } else if( nt == NODE_ALL_SERVERS ) { pMenu->EnableMenuItem( ID_ALLSVR_REFRESHALL , MF_ENABLED ); } /* else if( nt == NODE_NONE ) { // this can only mean licenses if( !IsLicensesDownLoaded( ) ) { pMenu->EnableMenuItem( ID_LIC_DOWNLOADLICENSES , MF_GRAYED | MF_DISABLED ); } } */ } //------------------------------------------------------------------------------------ void CMainFrame::OnDownLoadLicenses( ) { BOOL bF; CLicServer *pLicServer = NULL; GetActiveServer( &pLicServer ); if( pLicServer != NULL ) { if( pLicServer->GetServerType() == SERVER_TS5_ENFORCED ) { DWORD dw = WizardActionOnServer( WIZACTION_DOWNLOADLKP , &bF , NOVIEW ); DBGMSG( L"LICMGR : OnDownLoadLicenses returned 0x%x\n " , dw ); } else { AddKeyPackDialog(NULL); } } } //------------------------------------------------------------------------------------ void CMainFrame::OnRepeatLastDownLoad( ) { BOOL bF; DWORD dw = WizardActionOnServer( WIZACTION_DOWNLOADLASTLKP , &bF , NOVIEW ); DBGMSG( L"LICMGR : OnRepeatLastDownLoad returned 0x%x\n " , dw ); } //------------------------------------------------------------------------------------ void CMainFrame::OnReRegisterServer( ) { BOOL bF; DWORD dw = WizardActionOnServer( WIZACTION_REREGISTERLS , &bF , NOVIEW ); DBGMSG( L"LICMGR : OnReRegisterServer returned 0x%x\n " , dw ); } //------------------------------------------------------------------------------------ void CMainFrame::OnUnRegisterServer( ) { BOOL bF; DWORD dw = WizardActionOnServer( WIZACTION_UNREGISTERLS , &bF , NOVIEW ); DBGMSG( L"LICMGR : OnUnRegisterServer returned 0x%x\n " , dw ); } //------------------------------------------------------------------------------------ void CMainFrame::OnProperties( ) { BOOL bF; DWORD dw = WizardActionOnServer( WIZACTION_SHOWPROPERTIES , &bF , NOVIEW ); DBGMSG( L"LICMGR : CMainFrame -- OnProperties returned 0x%x\n", dw ); } //------------------------------------------------------------------------------------ BOOL CMainFrame::IsLicensesDownLoaded( ) { CLicServer * pLicServer = NULL; if( SUCCEEDED( GetActiveServer( &pLicServer ) ) ) { if( pLicServer != NULL ) { if( pLicServer->GetConType( ) != CONNECTION_PHONE ) { DBGMSG( L"Licmgr CMainFrame::IsLicensesDownLoaded GetConnectionType internet - www base\n" , 0 ); return pLicServer->IsLicsDownloaded( ); } else { return FALSE; } } } return FALSE; } //------------------------------------------------------------------------------------ DWORD CMainFrame::WizardActionOnServer( WIZACTION wa , PBOOL pbRefresh , VIEW vt ) { CLicMgrLeftView * pLeftView = (CLicMgrLeftView *)m_pLeftView; CTreeCtrl& TreeCtrl = pLeftView->GetTreeCtrl(); CRightList * pRightView = (CRightList *)m_pRightView; CLicServer *pServer = NULL; if( vt == TREEVIEW ) { CTreeNode *pNode = (CTreeNode *)TreeCtrl.GetItemData( pLeftView->GetRightClickedItem() ); if( pNode->GetNodeType() == NODE_SERVER ) { pServer = static_cast< CLicServer * >( pNode->GetTreeObject() ); } else if( pNode->GetNodeType( ) == NODE_KEYPACK ) { CKeyPack *pKeyPack = static_cast< CKeyPack *>( pNode->GetTreeObject() ); if( pKeyPack != NULL ) { pServer = pKeyPack->GetServer( ); } } } else if( vt == LISTVIEW ) { CListCtrl& listctrl = pRightView->GetListCtrl(); CLicMgrDoc * pDoc = ( CLicMgrDoc * )( GetActiveView()->GetDocument( ) ); ASSERT(pDoc); if(NULL == pDoc) { return ERROR_INVALID_PARAMETER; } int nSelected = listctrl.GetNextItem(-1, LVNI_SELECTED); if( -1 != nSelected) { DWORD_PTR dCurrSel = listctrl.GetItemData( nSelected ); if( NODE_ALL_SERVERS == pDoc->GetNodeType() ) { pServer = reinterpret_cast< CLicServer * >( dCurrSel ); } else if( pDoc->GetNodeType() == NODE_SERVER ) { CKeyPack *pKeyPack = reinterpret_cast< CKeyPack *>( dCurrSel ); if( pKeyPack != NULL ) { pServer = pKeyPack->GetServer( ); } } else if( pDoc->GetNodeType( ) == NODE_KEYPACK ) { CLicense * pLicense = reinterpret_cast< CLicense * >( dCurrSel ); pServer = ( pLicense->GetKeyPack() )->GetServer( ); } } } else if( vt == NOVIEW ) { CLicServer * pLicServer = NULL; if( SUCCEEDED( GetActiveServer( &pLicServer ) ) ) { pServer = pLicServer; } } if( pServer != NULL ) { DWORD dw = ERROR_SUCCESS; // check for admin if( !pServer->IsUserAdmin( ) ) { AfxMessageBox( IDS_E_ACCESSDENIED ); //::MessageBox( GetSafeHwnd( ) , L"Unable to perform operation: Access denied" , L"Terminal Services Licensing" , MB_OK|MB_ICONINFORMATION ); return ERROR_ACCESS_DENIED; } if( wa != WIZACTION_REGISTERLS ) { if( pServer->GetServerType() == SERVER_TS5_ENFORCED ) { DBGMSG( L"LICMGR:CMainFrame::WizardActionOnServer calling StartWizard\n", 0 ); dw = StartWizard( GetSafeHwnd( ) , wa , (LPCTSTR)pServer->GetName( ) , pbRefresh ); DBGMSG( L"StartWizard ( central call ) returned 0x%x\n", dw ); DBGMSG( L"StartWizard ( central call ) refresh = %s\n", *pbRefresh ? L"true" : L"false" ); if( *pbRefresh ) { RefreshServer( pServer ); } } else { if( wa == WIZACTION_DOWNLOADLKP ) { AddKeyPackDialog(NULL); } } } switch( wa ) { case WIZACTION_REGISTERLS: // this handles non-enforced as well. OnRegistration( ); break; case WIZACTION_UNREGISTERLS : if( dw == ERROR_SUCCESS ) { pServer->SetDownLoadLics( FALSE ); } // FALL THROUGH case WIZACTION_REREGISTERLS : { DWORD dwStatus; if( IsLicenseServerRegistered( GetSafeHwnd( ) , (LPCTSTR)pServer->GetName( ) , &dwStatus ) == ERROR_SUCCESS ) { pServer->SetServerRegistrationStatus( dwStatus ); } } break; } return dw; } return ERROR_INVALID_PARAMETER; } //------------------------------------------------------------------------------------ BOOL CMainFrame::IsDownLoadedPacks( CLicServer *pServer ) { UINT counter = 0; if( pServer != NULL ) { KeyPackList *pKeyPackList = pServer->GetKeyPackList( ); if( pKeyPackList != NULL ) { POSITION pos = pKeyPackList->GetHeadPosition(); while(pos) { CKeyPack *pKeyPack = (CKeyPack *)pKeyPackList->GetNext(pos); if( pKeyPack != NULL ) { if( pKeyPack->GetKeyPackStruct().ucKeyPackType != LSKEYPACKTYPE_TEMPORARY && pKeyPack->GetKeyPackStruct().ucKeyPackType != LSKEYPACKTYPE_FREE ) { counter++; DBGMSG( L"LICMGR:CMainFrame found %d keypack(s)\n" , counter ); } } } if( counter >= 1 ) { DBGMSG( L"LICMGR : CMainFrame IsDownLoadedPacks returns true\n" ,0 ); return TRUE; } } } DBGMSG( L"LICMGR : CMainFrame IsDownLoadedPacks returns false \n" ,0 ); return FALSE; }