windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/itools/linkchk/cmdline.cpp
2020-09-26 16:20:57 +08:00

248 lines
4.3 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name :
cmdline.cpp
Abstract:
Command line class implementation. This class takes care of command line
parsing and validation. And, it will add the user options to global
CUserOptions object.
Author:
Michael Cheuk (mcheuk)
Project:
Link Checker
Revision History:
--*/
#include "stdafx.h"
#include "cmdline.h"
#include "resource.h"
#include "lcmgr.h"
#include "iisinfo.h"
#include "afxpriv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CCmdLine::CCmdLine(
)
/*++
Routine Description:
Constructor.
Arguments:
N/A
Return Value:
N/A
--*/
{
m_iInstance = -1;
m_fInvalidParam = FALSE;
} // CCmdLine::CCmdLine
BOOL
CCmdLine::CheckAndAddToUserOptions(
)
/*++
Routine Description:
Validate the command line paramters and add them to global CUserOptions object
Arguments:
N/A
Return Value:
BOOL - TRUE if sucess. FALSE otherwise
--*/
{
// Do we have any invalid parameters so far?
if(m_fInvalidParam)
{
::MessageBeep(MB_ICONEXCLAMATION);
CDialog dlg(IDD_USAGE);
dlg.DoModal();
return FALSE;
}
// Is the user options valid ?
BOOL fURL = !m_strURL.IsEmpty();
BOOL fDirectories = !m_strAlias.IsEmpty() && !m_strPath.IsEmpty() && !m_strHostName.IsEmpty();
BOOL fInstance = !m_strHostName.IsEmpty() && m_iInstance != -1;
// Command line: linkchk -u URL
if(fURL && !fDirectories && !fInstance)
{
GetLinkCheckerMgr().GetUserOptions().AddURL(m_strURL);
return TRUE;
}
// Command line: linkchk -s ServerName -a VirtualDirectoryAlias -p VirtualDirectoryPath
else if(!fURL && fDirectories && !fInstance)
{
GetLinkCheckerMgr().GetUserOptions().AddDirectory(CVirtualDirInfo(m_strAlias, m_strPath));
GetLinkCheckerMgr().GetUserOptions().SetHostName(m_strHostName);
return TRUE;
}
// Command line: linkchk -s ServerName -i InstanceNumber
else if(!fURL && !fDirectories && fInstance)
{
GetLinkCheckerMgr().GetUserOptions().SetHostName(m_strHostName);
return QueryAndAddDirectories();
}
else
{
::MessageBeep(MB_ICONEXCLAMATION);
CDialog dlg(IDD_USAGE);
dlg.DoModal();
return FALSE;
}
} // CCmdLine::CheckAndAddToUserOptions
void
CCmdLine::ParseParam(
TCHAR chFlag,
LPCTSTR lpszParam
)
/*++
Routine Description:
Called by CLinkCheckApp for each parameters.
Arguments:
chFlag - parameter flag
lpszParam - value
Return Value:
N/A
--*/
{
// It is invalid to have a flag without any parameters
if(lpszParam == NULL)
{
m_fInvalidParam = TRUE;
return;
}
switch(chFlag)
{
case _TCHAR('a'):
m_strAlias = lpszParam;
break;
case _TCHAR('h'):
m_strHostName = lpszParam;
break;
case _TCHAR('i'):
m_iInstance = _ttoi(lpszParam);
break;
case _TCHAR('u'):
m_strURL = lpszParam;
break;
case _TCHAR('p'):
m_strPath = lpszParam;
default: // unknown flag
m_fInvalidParam = FALSE;
}
} // CCmdLine::ParseParam
BOOL
CCmdLine::QueryAndAddDirectories(
)
/*++
Routine Description:
Query the metabase for server/instance directories and
add them to the global CUserOptions object
Arguments:
N/A
Return Value:
BOOL - TRUE if sucess. FALSE otherwise
--*/
{
USES_CONVERSION; // for A2W
// Get the server info
LPIIS_INSTANCE_INFO_1 lpInfo = NULL;
NET_API_STATUS err = IISGetAdminInformation(
A2W((LPCSTR)m_strHostName),
1,
INET_HTTP_SVC_ID,
m_iInstance,
(LPBYTE*)&lpInfo
);
if(err != ERROR_SUCCESS)
{
AfxMessageBox(IDS_IISGETADMININFORMATION_ERROR);
return FALSE;
}
// Do we have any virtual directories ?
if(lpInfo->VirtualRoots == NULL)
{
AfxMessageBox(IDS_IIS_VIRTUALROOT_NOT_EXIST);
return FALSE;
}
// Get the virutal directory info
_INET_INFO_VIRTUAL_ROOT_ENTRY_1* pVRoot = NULL;
for(DWORD i=0; i<lpInfo->VirtualRoots->cEntries; i++)
{
pVRoot = &(lpInfo->VirtualRoots->aVirtRootEntry[i]);
GetLinkCheckerMgr().GetUserOptions().
AddDirectory(CVirtualDirInfo(pVRoot->pszRoot, pVRoot->pszDirectory));
}
return TRUE;
} // CCmdLine::QueryAndAddDirectories