diff options
Diffstat (limited to 'private/net/svcdlls/lls/ccfapi32/ccfapi.cpp')
-rw-r--r-- | private/net/svcdlls/lls/ccfapi32/ccfapi.cpp | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/private/net/svcdlls/lls/ccfapi32/ccfapi.cpp b/private/net/svcdlls/lls/ccfapi32/ccfapi.cpp new file mode 100644 index 000000000..c0104f534 --- /dev/null +++ b/private/net/svcdlls/lls/ccfapi32/ccfapi.cpp @@ -0,0 +1,354 @@ +/*++ + +Copyright (c) 1995 Microsoft Corporation + +Module Name: + + ccfapi.cpp + +Abstract: + + Implementation of CCcfApiApp, the MFC application object for CCFAPI32.DLL. + +Author: + + Jeff Parham (jeffparh) 13-Dec-1995 + +Revision History: + +--*/ + +#include "stdafx.h" +#include <lmerr.h> + +#include "ccfapi.h" +#include "source.h" +#include "imagelst.h" +#include "remdlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +CCcfApiApp theApp; // The one and only CCcfApiApp object + + +BEGIN_MESSAGE_MAP(CCcfApiApp, CWinApp) + //{{AFX_MSG_MAP(CCcfApiApp) + // 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() + + +CCcfApiApp::CCcfApiApp() + +/*++ + +Routine Description: + + Constructor for CCF API application. + +Arguments: + + None. + +Return Values: + + None. + +--*/ + +{ + AFX_MANAGE_STATE( AfxGetStaticModuleState() ); + + m_LastError = 0; + m_LastLlsError = 0; + + LPTSTR pszHelpFileName = m_strHelpFileName.GetBuffer( MAX_PATH ); + + if ( NULL != pszHelpFileName ) + { + BOOL ok = GetSystemDirectory( pszHelpFileName, MAX_PATH ); + m_strHelpFileName.ReleaseBuffer(); + + if ( ok ) + { + m_strHelpFileName += TEXT( "\\" ); + } + + m_strHelpFileName += TEXT( "ccfapi.hlp" ); + } +} + + +void CCcfApiApp::DisplayLastError() + +/*++ + +Routine Description: + + Displays a message corresponding to the last error encountered. + +Arguments: + + None. + +Return Values: + + None. + +--*/ + +{ + CString strLastError; + CString strErrorCaption; + + strLastError = GetLastErrorString(); + + AfxMessageBox( strLastError, MB_ICONSTOP | MB_OK ); +} + + +CString CCcfApiApp::GetLastErrorString() + +/*++ + +Routine Description: + + Retrieves string for last error. + + (Routine stolen from winsadmn...). + + (And that routine stolen from LlsMgr...). + +Arguments: + + None. + +Return Values: + + CString. + +--*/ + +{ + CString strLastError; + DWORD nId = m_LastError; + const int cchLastErrorSize = 512; + LPTSTR pszLastError; + DWORD cchLastError; + + if (((long)nId == RPC_S_CALL_FAILED) || + ((long)nId == RPC_NT_SS_CONTEXT_MISMATCH)) + { + strLastError.LoadString(IDS_ERROR_DROPPED_LINK); + } + else if (((long)nId == RPC_S_SERVER_UNAVAILABLE) || + ((long)nId == RPC_NT_SERVER_UNAVAILABLE)) + { + strLastError.LoadString(IDS_ERROR_NO_RPC_SERVER); + } + else if ((long)nId == STATUS_INVALID_LEVEL) + { + strLastError.LoadString(IDS_ERROR_DOWNLEVEL_SERVER); + } + else if (((long)nId == ERROR_ACCESS_DENIED) || + ((long)nId == STATUS_ACCESS_DENIED)) + { + strLastError.LoadString(IDS_ERROR_ACCESS_DENIED); + } + else if ((long)nId == STATUS_ACCOUNT_EXPIRED) + { + strLastError.LoadString(IDS_ERROR_CERTIFICATE_EXPIRED); + } + else + { + HINSTANCE hinstDll = NULL; + + if ((nId >= NERR_BASE) && (nId <= MAX_NERR)) + { + hinstDll = ::LoadLibrary( _T( "netmsg.dll" ) ); + } + else if (nId >= 0x4000000) + { + hinstDll = ::LoadLibrary( _T( "ntdll.dll" ) ); + } + + cchLastError = 0; + pszLastError = strLastError.GetBuffer( cchLastErrorSize ); + + if ( NULL != pszLastError ) + { + DWORD dwFlags = FORMAT_MESSAGE_IGNORE_INSERTS + | FORMAT_MESSAGE_MAX_WIDTH_MASK + | ( hinstDll ? FORMAT_MESSAGE_FROM_HMODULE + : FORMAT_MESSAGE_FROM_SYSTEM ); + + cchLastError = ::FormatMessage( dwFlags, + hinstDll, + nId, + 0, + pszLastError, + cchLastErrorSize, + NULL ); + + strLastError.ReleaseBuffer(); + } + + if ( hinstDll ) + { + ::FreeLibrary( hinstDll ); + } + + if ( 0 == cchLastError ) + { + strLastError.LoadString( IDS_ERROR_UNSUCCESSFUL ); + } + } + + return strLastError; +} + +////////////////////////////////////////////////////////////////////////////// +// CCF API // +/////////////// + +DWORD CCcfApiApp::CertificateEnter( HWND hWndParent, LPCSTR pszServerName, LPCSTR pszProductName, LPCSTR pszVendor, DWORD dwFlags, LPCSTR pszSourceToUse ) + +/*++ + +Routine Description: + + Display a dialog allowing the user to enter a license certificate + into the system. + +Arguments: + + hWndParent (HWND) + HWND to the client's main window, for use as the parent window to any + opened dialogs. May be NULL. + pszServerName (LPCSTR) + Name of the server for which licenses are to be installed. Note that + this may not be the same as the server on which licenses are actually + installed, as, for example, per seat licenses are always installed on + the enterprise server. A NULL value indicates the local server. + pszProductName (LPCSTR) + Product for which licenses are to be installed. A NULL value indicates + that the user should be allowed to choose. + pszVendor (LPCSTR) + Name of the vendor of the product. This value should be NULL if + pszProductName is NULL, and should be non-NULL if pszProductName is + non-NULL. + dwFlags (DWORD) + A bitfield containing one or more of the following: + CCF_ENTER_FLAG_PER_SEAT_ONLY + Allow the user to enter only per seat licenses. Not valid in + combination with CCF_ENTER_FLAG_PER_SERVER_ONLY. + CCF_ENTER_FLAG_PER_SERVER_ONLY + Allow the user to enter only per server licenses. Not valid in + combination with CCF_ENTER_FLAG_PER_SEAT_ONLY. + pszSourceToUse (LPCSTR) + Name of the secure certificate source to use to install the certificate, + e.g., "Paper". A NULL value indicates that the user should be allowed + to choose. + +Return Value: + + ERROR_SUCCESS (A certificate was successfully entered into the system.) + ERROR_CANCELLED (The user cancelled without installing a certificate.) + other Win error + +--*/ + +{ + CCertSourceSelectDlg srcDlg( CWnd::FromHandle( hWndParent ) ); + LPCSTR pszNetServerName = NULL; + CHAR szNetServerName[ 3 + MAX_COMPUTERNAME_LENGTH ] = "\\\\"; + + // make sure server name, if specified, is in the form \\server + if ( NULL != pszServerName ) + { + if ( ( pszServerName[0] != '\\' ) || ( pszServerName[1] != '\\' ) ) + { + // is not prefixed with backslashes + lstrcpynA( szNetServerName + 2, pszServerName, sizeof( szNetServerName ) - 3 ); + pszNetServerName = szNetServerName; + } + else + { + // is prefixed with backslashes + pszNetServerName = pszServerName; + } + } + + return srcDlg.CertificateEnter( hWndParent, pszNetServerName, pszProductName, pszVendor, dwFlags, pszSourceToUse ); +} + + +DWORD CCcfApiApp::CertificateRemove( HWND hWndParent, LPCSTR pszServerName, LPCSTR pszProductName, LPCSTR pszVendor, DWORD dwFlags, LPCSTR pszSourceToUse ) + +/*++ + +Routine Description: + + Display a dialog allowing the user to remove one or more license + certificates from the system. + +Arguments: + + hWndParent (HWND) + HWND to the client's main window, for use as the parent window to any + opened dialogs. May be NULL. + pszServerName (LPCSTR) + Name of the server on which licenses are to be removed. A NULL value + indicates the local server. + pszProductName (LPCSTR) + Product for which licenses are to be removed. A NULL value indicates + that the user should be allowed to remove licenses from any product. + pszVendor (LPCSTR) + Name of the vendor of the product. This value should be NULL if + pszProductName is NULL, and should be non-NULL if pszProductName is + non-NULL. + dwFlags (DWORD) + Certificate removal options. As of this writing, no flags are + supported. + pszSourceToUse (LPCSTR) + Name of the secure certificate source by which licenses are to be + removed, e.g., "Paper". A NULL value indicates that the user should + be allowed to remove licenses that were installed with any source. + +Return Value: + + ERROR_SUCCESS + Win error + +--*/ + +{ + CCertRemoveSelectDlg remDlg( CWnd::FromHandle( hWndParent ) ); + LPCSTR pszNetServerName = NULL; + CHAR szNetServerName[ 3 + MAX_COMPUTERNAME_LENGTH ] = "\\\\"; + + // make sure server name, if specified, is in the form \\server + if ( NULL != pszServerName ) + { + if ( ( pszServerName[0] != '\\' ) || ( pszServerName[1] != '\\' ) ) + { + // is not prefixed with backslashes + lstrcpynA( szNetServerName + 2, pszServerName, sizeof( szNetServerName ) - 3 ); + pszNetServerName = szNetServerName; + } + else + { + // is prefixed with backslashes + pszNetServerName = pszServerName; + } + } + + return remDlg.CertificateRemove( pszNetServerName, pszProductName, pszVendor, dwFlags, pszSourceToUse ); +} + |