|
|
//Copyright (c) 1998 - 1999 Microsoft Corporation
/*++
Module Name:
LsMgrDoc.cpp
Abstract: This Module contains the implementation of CLicMgrDoc class (The Document class)
Author:
Arathi Kundapur (v-akunda) 11-Feb-1998
Revision History:
--*/
#include "stdafx.h"
#include "defines.h"
#include "LicMgr.h"
#include "LSMgrDoc.h"
#include "LSServer.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CLicMgrDoc
IMPLEMENT_DYNCREATE(CLicMgrDoc, CDocument)
BEGIN_MESSAGE_MAP(CLicMgrDoc, CDocument) //{{AFX_MSG_MAP(CLicMgrDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLicMgrDoc construction/destruction
CLicMgrDoc::CLicMgrDoc() { // TODO: add one-time construction code here
m_NodeType = NODE_NONE; m_pAllServers = NULL; }
CLicMgrDoc::~CLicMgrDoc() { if(m_pAllServers) { delete m_pAllServers; m_pAllServers = NULL; } }
BOOL CLicMgrDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// CLicMgrDoc serialization
void CLicMgrDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here
} else { // TODO: add loading code here
} }
/////////////////////////////////////////////////////////////////////////////
// CLicMgrDoc diagnostics
#ifdef _DEBUG
void CLicMgrDoc::AssertValid() const { CDocument::AssertValid(); }
void CLicMgrDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG
HRESULT CLicMgrDoc::EnumerateKeyPacks(CLicServer *pServer,DWORD dwSearchParm,BOOL bMatchAll) { ASSERT(pServer); HRESULT hResult = S_OK;
if(pServer == NULL) return E_FAIL;
if(TRUE == pServer->IsExpanded()) return ALREADY_EXPANDED;
PCONTEXT_HANDLE hBinding = NULL; BOOL bContext = FALSE; RPC_STATUS status; LSKeyPack keypack; CString Server; hBinding = pServer->GetContext(); if(NULL == hBinding) { if(pServer->UseIpAddress()) Server = pServer->GetIpAddress(); else Server = pServer->GetName(); hBinding=ConnectToLsServer(Server.GetBuffer(Server.GetLength())); if(hBinding == NULL) { hResult = CONNECTION_FAILED; goto cleanup; } }
memset(&keypack, 0, sizeof(keypack)); keypack.dwLanguageId = GetUserDefaultUILanguage(); status = LSKeyPackEnumBegin(hBinding, dwSearchParm, bMatchAll, &keypack); if(status != ERROR_SUCCESS) { hResult = status; goto cleanup; } else { do { status = LSKeyPackEnumNext(hBinding, &keypack); if(status == ERROR_SUCCESS) { DBGMSG( L"LICMGR:CLicMgrDoc::EnumerateKeyPacks - LSKeyPackEnumNext\n" , 0 );
CKeyPack * pKeyPack = new CKeyPack(keypack); if(pKeyPack == NULL) { hResult = E_OUTOFMEMORY; goto cleanup; } pServer->AddKeyPack(pKeyPack); } } while(status == ERROR_SUCCESS);
LSKeyPackEnumEnd(hBinding); pServer->Expand(TRUE); }
cleanup: //put cleanup code here.
if(hBinding) LSDisconnect(&hBinding); return hResult;
}
HRESULT CLicMgrDoc::EnumerateLicenses( CKeyPack *pKeyPack, DWORD dwSearchParm, BOOL bMatchAll ) /*++
--*/ { ASSERT(pKeyPack);
if(NULL == pKeyPack) { return E_FAIL; }
CLicServer *pServer = pKeyPack->GetServer();
ASSERT(pServer); if(NULL == pKeyPack) { return E_FAIL; }
HRESULT hResult = S_OK;
if(TRUE == pKeyPack->IsExpanded()) { return ALREADY_EXPANDED; }
PCONTEXT_HANDLE hBinding = NULL; BOOL bContext = FALSE; DWORD status = ERROR_SUCCESS; LSLicenseEx sLicense; CString Server;
hBinding = pServer->GetContext(); if(NULL == hBinding) { if(pServer->UseIpAddress()) { Server = pServer->GetIpAddress(); } else { Server = pServer->GetName(); }
hBinding=ConnectToLsServer(Server.GetBuffer(Server.GetLength())); if(hBinding == NULL) { hResult = CONNECTION_FAILED; goto cleanup; } } memset(&sLicense, 0, sizeof(LSLicenseEx)); sLicense.dwKeyPackId = pKeyPack->GetKeyPackStruct().dwKeyPackId; TLSLicenseEnumBegin( hBinding, dwSearchParm,bMatchAll ,(LPLSLicenseSearchParm) &sLicense, &status); if(status != ERROR_SUCCESS) { hResult = status; goto cleanup; } else { do { memset(&sLicense, 0, sizeof(LSLicenseEx)); sLicense.dwKeyPackId = pKeyPack->GetKeyPackStruct().dwKeyPackId; TLSLicenseEnumNextEx(hBinding,&sLicense,&status); if(status == ERROR_SUCCESS) { CLicense * pLicense = new CLicense(sLicense); if(NULL == pLicense) { hResult = E_OUTOFMEMORY; goto cleanup; } pKeyPack->AddIssuedLicense(pLicense); } } while(status == ERROR_SUCCESS);
TLSLicenseEnumEnd(hBinding,&status);
pKeyPack->Expand(TRUE); }
cleanup: //put cleanup code here
if(hBinding) { LSDisconnect(&hBinding); }
return hResult;
}
HRESULT CLicMgrDoc::ConnectToServer( CString& Server, CString& Scope, SERVER_TYPE& ServerType ) /*++
--*/ { PCONTEXT_HANDLE hBinding = NULL; HRESULT hResult = ERROR_SUCCESS; RPC_STATUS status; TCHAR szServerScope[LSERVER_MAX_STRING_SIZE]; TCHAR szMachineName[LSERVER_MAX_STRING_SIZE];
ULONG uSize; DWORD dwVersion = 0; PBYTE pbData = NULL; DWORD cbData = 0;
hBinding = ConnectToLsServer(Server.GetBuffer(Server.GetLength())); if(hBinding == NULL) { hResult = E_FAIL; goto cleanup; }
uSize = sizeof(szMachineName) / sizeof(szMachineName[0]); memset(szMachineName, 0, sizeof(szMachineName));
status = LSGetServerName(hBinding,szMachineName,&uSize); if(status == RPC_S_OK) { Server = szMachineName; }
uSize = sizeof(szServerScope) / sizeof(szServerScope[0]); memset(szServerScope, 0, sizeof(szServerScope));
status = LSGetServerScope(hBinding, szServerScope,&uSize); if(status == RPC_S_OK) { Scope = szServerScope; } else { Scope.LoadString(IDS_UNKNOWN); } //Get whether this is a TS4 server or TS5Enforced or TS5NonEnforced
//Use TLSGetVersion
status = TLSGetVersion (hBinding, &dwVersion); if(status == RPC_S_OK) { if(dwVersion & 0x40000000) { ServerType = SERVER_TS5_ENFORCED;
} else { ServerType = SERVER_TS5_NONENFORCED; } } else if(status == RPC_S_UNKNOWN_IF) { ServerType = SERVER_TS4; Scope = Server ; } else { hResult = E_FAIL; }
cleanup:
if(pbData != NULL) { midl_user_free(pbData); }
if(hBinding) { LSDisconnect(&hBinding); }
return hResult;
}
HRESULT CLicMgrDoc::ConnectWithCurrentParams() { CLicMgrApp *pApp = (CLicMgrApp*)AfxGetApp(); CMainFrame * pWnd = (CMainFrame *)pApp->m_pMainWnd ;
HRESULT hResult = ERROR_SUCCESS; CString Scope; CString IpAddress;
CString Server = pApp->m_Server; if(NULL == m_pAllServers) m_pAllServers = new CAllServers(_T(""));
if(NULL == m_pAllServers) { hResult = E_OUTOFMEMORY; goto cleanup; }
pWnd->SendMessage(WM_ADD_ALL_SERVERS,0,(LPARAM)m_pAllServers); if(!Server.IsEmpty()) { if(TRUE == IsServerInList(Server)) { hResult = E_DUPLICATE; }
if( hResult == ERROR_SUCCESS ) { pWnd->ConnectServer( Server ); } /* Why did we have this here?
IpAddress = Server; hResult = ConnectToServer( Server, Scope, ServerType );
if(ERROR_SUCCESS == hResult) { CAllServers * pAllServers = m_pAllServers; CLicServer *pServer1 = NULL; if(IpAddress != Server) { if(TRUE == IsServerInList(Server)) { hResult = E_DUPLICATE; goto cleanup; }
pServer1 = new CLicServer(Server,ServerType,Scope,IpAddress); } else { pServer1 = new CLicServer(Server,ServerType,Scope); } if(pServer1) { pAllServers->AddLicServer(pServer1); pWnd->SendMessage(WM_ADD_SERVER,0,(LPARAM)pServer1); } else { return E_OUTOFMEMORY; } } */
} cleanup: //Add any cleanup code required here.
return hResult;
}
HRESULT CLicMgrDoc::AddLicenses(PLICSERVER pServer,LPLSKeyPack pKeyPack,UINT nLicenses) { //Though the name of the function says add keypack, it adds licenses
HRESULT hResult = E_FAIL; if(NULL == pServer || NULL == pKeyPack) return hResult;
if(LSKEYPACKTYPE_TEMPORARY == pKeyPack->ucKeyPackType || LSKEYPACKTYPE_SELECT == pKeyPack->ucKeyPackType || LSKEYPACKTYPE_FREE == pKeyPack->ucKeyPackType ) { hResult = ERROR_UNLIMITED_KEYPACK; return hResult; }
RPC_STATUS status; PCONTEXT_HANDLE hBinding = NULL; LSKeyPack skeypack; hBinding = pServer->GetContext();
CString Server; if(NULL == hBinding) { if(pServer->UseIpAddress()) Server = pServer->GetIpAddress(); else Server = pServer->GetName(); hBinding=ConnectToLsServer(Server.GetBuffer(Server.GetLength())); if(hBinding == NULL) { hResult = CONNECTION_FAILED; goto cleanup; }
}
skeypack = *pKeyPack; skeypack.dwTotalLicenseInKeyPack = nLicenses; skeypack.ucKeyPackStatus = LSKEYPACKSTATUS_ADD_LICENSE; status=LSKeyPackAdd(hBinding, &skeypack); if(ERROR_SUCCESS == status) { *pKeyPack = skeypack; }
hResult = status;
cleanup: if(hBinding) LSDisconnect(&hBinding); return hResult; }
void CLicMgrDoc:: TimeToString(DWORD *ptime, CString& rString) { TCHAR m_szTime[MAX_PATH]; time_t time;
rString.Empty();
ASSERT(ptime); if(NULL == ptime) return;
//
// Times are stored in the ANSI time_t style in the database,
// however they are type cast to a DWORD (unsigned long). Because
// time_t is 64 bit on a 64 bit machine, and because it is a signed
// value, we must be careful here to make sure that the sign of the
// value is not lost as the value goes from 32 to 64 bit.
//
time = (time_t)(LONG)(*ptime);
LPTSTR lpszTime = NULL;
//Getting the local time as the time is stored as GMT
//in the license server database.
struct tm * pTm = localtime(&time); if(NULL == pTm) return;
SYSTEMTIME SystemTime;
SystemTime.wYear = (WORD)(pTm->tm_year + 1900); SystemTime.wMonth = (WORD)(pTm->tm_mon + 1); SystemTime.wDayOfWeek = (WORD)pTm->tm_wday; SystemTime.wDay = (WORD)pTm->tm_mday; SystemTime.wHour = (WORD)pTm->tm_hour; SystemTime.wMinute = (WORD)pTm->tm_min; SystemTime.wSecond = (WORD)pTm->tm_sec; SystemTime.wMilliseconds = 0;
int RetLen; TCHAR DateFormat[MAX_PATH]; TCHAR TimeFormat[MAX_PATH];
RetLen = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, DateFormat, sizeof(DateFormat)/sizeof(TCHAR)); ASSERT(RetLen!=0);
RetLen = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, TimeFormat, sizeof(TimeFormat)/sizeof(TCHAR)); ASSERT(RetLen!=0);
RetLen = ::GetDateFormat(LOCALE_USER_DEFAULT, 0, /* dwFlag */ &SystemTime, DateFormat, /* lpFormat */ m_szTime, sizeof(m_szTime)/sizeof(TCHAR)); if (RetLen == 0) return;
_tcscat(m_szTime, _T(" ")); /* Separator of date and time */
lpszTime = &m_szTime[lstrlen(m_szTime)]; RetLen = ::GetTimeFormat(LOCALE_USER_DEFAULT, 0, /* dwFlag */ &SystemTime, TimeFormat, /* lpFormat */ lpszTime, sizeof(m_szTime)/sizeof(TCHAR) - lstrlen(m_szTime)); if (RetLen == 0) return;
rString = m_szTime; return; }
BOOL CLicMgrDoc::IsServerInList(CString & Server) { ASSERT(m_pAllServers); if(NULL == m_pAllServers) return FALSE; BOOL bServerInList = FALSE;
LicServerList * pServerList = m_pAllServers->GetLicServerList(); //Assumption: ServerName is unique
POSITION pos = pServerList->GetHeadPosition(); while(pos) { CLicServer *pLicServer = (CLicServer *)pServerList->GetNext(pos); ASSERT(pLicServer); if(NULL == pLicServer) continue; if((0 == Server.CompareNoCase(pLicServer->GetName())) || (0 == Server.CompareNoCase(pLicServer->GetIpAddress()))) { bServerInList = TRUE; break; } } return bServerInList;
}
HRESULT CLicMgrDoc::RemoveLicenses(PLICSERVER pServer,LPLSKeyPack pKeyPack,UINT nLicenses) { HRESULT hResult = E_FAIL; if(NULL == pServer || NULL == pKeyPack) return hResult;
if(LSKEYPACKTYPE_TEMPORARY == pKeyPack->ucKeyPackType || LSKEYPACKTYPE_SELECT == pKeyPack->ucKeyPackType || LSKEYPACKTYPE_FREE == pKeyPack->ucKeyPackType ) { hResult = ERROR_UNLIMITED_KEYPACK; return hResult; }
RPC_STATUS status; PCONTEXT_HANDLE hBinding = NULL; LSKeyPack skeypack; hBinding = pServer->GetContext();
CString Server; if(NULL == hBinding) { if(pServer->UseIpAddress()) Server = pServer->GetIpAddress(); else Server = pServer->GetName(); hBinding=ConnectToLsServer(Server.GetBuffer(Server.GetLength())); if(hBinding == NULL) { hResult = CONNECTION_FAILED; goto cleanup; }
}
skeypack = *pKeyPack; if(nLicenses > skeypack.dwTotalLicenseInKeyPack) { hResult = E_FAIL; goto cleanup; } skeypack.dwTotalLicenseInKeyPack = nLicenses; skeypack.ucKeyPackStatus = LSKEYPACKSTATUS_REMOVE_LICENSE; status=LSKeyPackAdd(hBinding, &skeypack);
if(ERROR_SUCCESS == status || LSERVER_I_REMOVE_TOOMANY == status) { *pKeyPack = skeypack; }
hResult = status;
cleanup: if(hBinding) LSDisconnect(&hBinding); return hResult; }
|