mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
466 lines
13 KiB
466 lines
13 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
//
|
|
// File: output.h
|
|
//
|
|
// Contents: Header file for classes and function used for display
|
|
//
|
|
// History: 3-oct-2000 hiteshr Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
extern bool g_bQuiet;
|
|
extern int g_iQueryLimit;
|
|
extern bool g_bDeafultLimit;
|
|
|
|
HRESULT LocalCopyString(LPTSTR* ppResult, LPCTSTR pString);
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Class: CDisplay
|
|
//
|
|
// Purpose: This class is used for displaying a column
|
|
//
|
|
// History: 3-oct-2000 hiteshr Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
class CDisplay
|
|
{
|
|
#define MAXPAD 80
|
|
public:
|
|
|
|
//
|
|
//Initialize the Pad
|
|
//
|
|
CDisplay()
|
|
{
|
|
PadChar = L' ';
|
|
//Initialize the pad.
|
|
for( int i = 0; i < MAXPAD; ++i)
|
|
Pad[i] = PadChar;
|
|
}
|
|
|
|
//
|
|
//Display width number of Pad Charachter
|
|
//
|
|
VOID DisplayPad(LONG width)
|
|
{
|
|
if(width <= 0 )
|
|
return;
|
|
if(width >= MAXPAD)
|
|
width = MAXPAD -1;
|
|
Pad[width] = 0;
|
|
DisplayOutputNoNewline(Pad);
|
|
|
|
Pad[width] = PadChar;
|
|
}
|
|
|
|
//
|
|
//Dispaly a column with two starting pad,
|
|
//column value and two ending pad
|
|
//
|
|
VOID DisplayColumn(LONG width, LPWSTR lpszValue)
|
|
{
|
|
//Display Two PadChar in the begining
|
|
DisplayPad(2);
|
|
if(lpszValue)
|
|
{
|
|
DisplayOutputNoNewline(lpszValue);
|
|
|
|
DisplayPad(width- static_cast<LONG>(wcslen(lpszValue)));
|
|
}
|
|
else
|
|
DisplayPad(width);
|
|
|
|
|
|
//Display Two Trailing Padchar
|
|
DisplayPad(2);
|
|
}
|
|
|
|
//
|
|
//Display Newline
|
|
//
|
|
VOID DisplayNewLine()
|
|
{
|
|
DisplayOutputNoNewline(L"\r\n");
|
|
}
|
|
private:
|
|
WCHAR Pad[MAXPAD];
|
|
WCHAR PadChar;
|
|
|
|
};
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Class: CFormaInfo
|
|
//
|
|
// Purpose: Used to format table columns and display table
|
|
//
|
|
// History: 3-oct-2000 hiteshr Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
class CFormatInfo
|
|
{
|
|
public:
|
|
CFormatInfo():m_cCol(0),
|
|
m_ppszOutPutVal(NULL),
|
|
m_pColWidth(NULL),
|
|
m_bInit(FALSE),
|
|
m_cTotalRow(-1)
|
|
{};
|
|
|
|
~CFormatInfo()
|
|
{
|
|
if(m_ppszOutPutVal)
|
|
{
|
|
for(LONG i = 0; i < m_SampleSize*m_cCol; ++i)
|
|
LocalFree(m_ppszOutPutVal[i]);
|
|
}
|
|
LocalFree(m_ppszOutPutVal);
|
|
LocalFree(m_pColWidth);
|
|
}
|
|
|
|
//
|
|
//Do the initialization
|
|
//
|
|
HRESULT Init(LONG sampleSize, LONG cCol, LPWSTR * ppszColHeaders)
|
|
{
|
|
if(!sampleSize || !cCol || !ppszColHeaders)
|
|
{
|
|
ASSERT(FALSE);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
m_SampleSize = sampleSize;
|
|
m_cCol = cCol;
|
|
m_ppszColHeaders = ppszColHeaders;
|
|
m_ppszOutPutVal = (LPWSTR*)LocalAlloc(LPTR,m_SampleSize*cCol*sizeof(LPWSTR*));
|
|
if(!m_ppszOutPutVal)
|
|
return E_OUTOFMEMORY;
|
|
|
|
m_pColWidth = (LONG*)LocalAlloc(LPTR, cCol*sizeof(LONG*));
|
|
if(!m_pColWidth)
|
|
return E_OUTOFMEMORY;
|
|
|
|
//
|
|
//Initialize the minimum column width to width of column heading
|
|
//
|
|
for(LONG i = 0; i < m_cCol; ++i)
|
|
m_pColWidth[i] = static_cast<LONG>(wcslen(m_ppszColHeaders[i]));
|
|
|
|
m_bInit = TRUE;
|
|
|
|
return S_OK;
|
|
};
|
|
|
|
|
|
//
|
|
//Get the Column Width
|
|
//
|
|
inline
|
|
LONG GetColWidth(LONG col)
|
|
{
|
|
ASSERT(m_bInit);
|
|
if(col >= m_cCol)
|
|
{
|
|
ASSERT(FALSE);
|
|
return 0;
|
|
}
|
|
return m_pColWidth[col];
|
|
}
|
|
|
|
//
|
|
//Set the column Width
|
|
//
|
|
inline
|
|
VOID SetColWidth(LONG col, LONG width)
|
|
{
|
|
ASSERT(m_bInit);
|
|
if(col >= m_cCol)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
if(width > m_pColWidth[col])
|
|
m_pColWidth[col] = width;
|
|
}
|
|
|
|
//
|
|
//Cache the value and update column width
|
|
//
|
|
BOOL Set(LONG row, LONG col, LPWSTR pszValue)
|
|
{
|
|
ASSERT(m_bInit);
|
|
if(row >= m_SampleSize || col >= m_cCol)
|
|
{
|
|
ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
if(pszValue)
|
|
{
|
|
SetColWidth(col, static_cast<LONG>(wcslen(pszValue)));
|
|
LocalCopyString((LPWSTR*)(m_ppszOutPutVal + (row*m_cCol) + col),pszValue);
|
|
}
|
|
if(row>= m_cTotalRow)
|
|
m_cTotalRow = row +1;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
//Total number of rows in cache
|
|
//
|
|
LONG GetRowCount()
|
|
{
|
|
return m_cTotalRow;
|
|
}
|
|
|
|
//
|
|
//Get the value
|
|
//
|
|
inline
|
|
LPWSTR Get(LONG row, LONG col)
|
|
{
|
|
ASSERT(m_bInit);
|
|
if(row >= m_cTotalRow || col >= m_cCol)
|
|
{
|
|
ASSERT(FALSE);
|
|
return NULL;
|
|
}
|
|
|
|
return (LPWSTR)(*(m_ppszOutPutVal + row*m_cCol +col));
|
|
}
|
|
|
|
//
|
|
//Display headers
|
|
//
|
|
VOID DisplayHeaders()
|
|
{
|
|
if (g_bQuiet)
|
|
{
|
|
return;
|
|
}
|
|
if(!m_ppszColHeaders)
|
|
{
|
|
ASSERT(m_ppszColHeaders);
|
|
return;
|
|
}
|
|
for( long i = 0; i < m_cCol; ++i)
|
|
{
|
|
m_display.DisplayColumn(GetColWidth(i),m_ppszColHeaders[i]);
|
|
}
|
|
NewLine();
|
|
}
|
|
|
|
//
|
|
//Display a coulmn which is in cache
|
|
//
|
|
VOID DisplayColumn(LONG row,LONG col)
|
|
{
|
|
ASSERT(m_bInit);
|
|
if(row >= m_cTotalRow || col >= m_cCol)
|
|
{
|
|
ASSERT(FALSE);
|
|
return ;
|
|
}
|
|
|
|
m_display.DisplayColumn(GetColWidth(col),Get(row,col));
|
|
}
|
|
|
|
//
|
|
//Display the value using column width for col
|
|
//
|
|
VOID DisplayColumn(LONG col, LPWSTR pszValue)
|
|
{
|
|
if(col >= m_cCol)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
m_display.DisplayColumn(GetColWidth(col),pszValue);
|
|
}
|
|
|
|
//
|
|
//Display all rows in cache
|
|
//
|
|
VOID DisplayAllRows()
|
|
{
|
|
for(long i = 0; i < m_cTotalRow; ++i)
|
|
{
|
|
for(long j = 0; j < m_cCol; ++j)
|
|
DisplayColumn(i,j);
|
|
NewLine();
|
|
}
|
|
}
|
|
|
|
//
|
|
//Display a newline
|
|
//
|
|
VOID NewLine(){m_display.DisplayNewLine();}
|
|
|
|
private:
|
|
//
|
|
//True if Init is called
|
|
//
|
|
BOOL m_bInit;
|
|
//
|
|
//Number of rows to be used for calulating
|
|
//column width. This is also the size of the table.
|
|
//
|
|
LONG m_SampleSize;
|
|
//
|
|
//Count of rows in cache
|
|
//
|
|
LONG m_cTotalRow;
|
|
//
|
|
//Number of columns
|
|
//
|
|
LONG m_cCol;
|
|
|
|
LPWSTR *m_ppszOutPutVal;
|
|
LONG * m_pColWidth;
|
|
//
|
|
// Array of column headers. Its assumed that its length is same as m_cCol
|
|
//
|
|
LPWSTR *m_ppszColHeaders;
|
|
CDisplay m_display;
|
|
|
|
};
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Defines the scopes that a search can be run against when
|
|
// looking for a server object
|
|
//
|
|
// NOTE: If SERVER_QUERY_SCOPE_FOREST is not set then we are scoped
|
|
// against a site.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
#define SERVER_QUERY_SCOPE_SITE 0x00000001
|
|
#define SERVER_QUERY_SCOPE_FOREST 0x00000002
|
|
#define SERVER_QUERY_SCOPE_DOMAIN 0x00000004
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: GetServerSearchRoot
|
|
//
|
|
// Synopsis: Builds the path to the root of the search as determined by
|
|
// the parameters passed in from the command line.
|
|
//
|
|
// Arguments: [pCommandArgs IN] : the table of the command line input
|
|
// [refBasePathsInfo IN] : reference to the base paths info
|
|
// [refsbstrDN OUT] : reference to a CComBSTR that will
|
|
// receive the DN at which to start
|
|
// the search
|
|
//
|
|
// Returns: DWORD : one of: SERVER_QUERY_SCOPE_FOREST,
|
|
// SERVER_QUERY_SCOPE_DOMAIN,
|
|
// SERVER_QUERY_SCOPE_SITE
|
|
// which define the scope being used
|
|
//
|
|
// History: 11-Dec-2000 JeffJon Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
DWORD GetServerSearchRoot(IN PARG_RECORD pCommandArgs,
|
|
IN CDSCmdBasePathsInfo& refBasePathsInfo,
|
|
OUT CComBSTR& refsbstrDN);
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: GetSubnetSearchRoot
|
|
//
|
|
// Synopsis: Builds search root path for Subnet. Its always
|
|
// cn=subnet,cn=site in configuration container
|
|
//
|
|
// Arguments: [refBasePathsInfo IN] : reference to the base paths info
|
|
// [refsbstrDN OUT] : reference to a CComBSTR that will
|
|
// receive the DN at which to start
|
|
// the search
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 11-Dec-2000 JeffJon Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VOID GetSubnetSearchRoot(IN CDSCmdBasePathsInfo& refBasePathsInfo,
|
|
OUT CComBSTR& refsbstrDN);
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: GetSiteContainerPath
|
|
//
|
|
// Synopsis: Returns the DN for site container in Configuration
|
|
// container
|
|
//
|
|
// Arguments: [refBasePathsInfo IN] : reference to the base paths info
|
|
// [refsbstrDN OUT] : reference to a CComBSTR that will
|
|
// receive the DN
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 24-April-2001 hiteshr Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VOID GetSiteContainerPath(IN CDSCmdBasePathsInfo& refBasePathsInfo,
|
|
OUT CComBSTR& refSubSiteSuffix);
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: DsQueryServerOutput
|
|
//
|
|
// Synopsis: This functions outputs the query results for server object.
|
|
//
|
|
// Arguments: [outputFormat IN] Output format specified at commandline.
|
|
// [ppszAttributes IN] List of attributes fetched by query
|
|
// [cAttributes,IN] Number of arributes in above array
|
|
// [refServerSearch,IN]reference to the search Object
|
|
// [refCredObject IN] reference to the credential object
|
|
// [refBasePathsInfo IN] reference to the base paths info
|
|
// [pCommandArgs,IN] The pointer to the commands table
|
|
//
|
|
// Returns: HRESULT : S_OK if everything succeeded
|
|
// E_INVALIDARG
|
|
// Anything else is a failure code from an ADSI call
|
|
//
|
|
// History: 08-Dec-2000 JeffJon Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT DsQueryServerOutput( IN DSQUERY_OUTPUT_FORMAT outputFormat,
|
|
IN LPWSTR* ppszAttributes,
|
|
IN DWORD cAttributes,
|
|
IN CDSSearch& refServerSearch,
|
|
IN const CDSCmdCredentialObject& refCredObject,
|
|
IN CDSCmdBasePathsInfo& refBasePathsInfo,
|
|
IN PARG_RECORD pCommandArgs);
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: DsQueryOutput
|
|
//
|
|
// Synopsis: This functions outputs the query results.
|
|
//
|
|
// Arguments: [outputFormat IN] Output format specified at commandline.
|
|
// [ppszAttributes IN] List of attributes fetched by query
|
|
// [cAttributes,IN] Number of arributes in above array
|
|
// [*pSeach,IN] Search Object which has queryhandle
|
|
// [bListFormat IN] Is Output to shown in List Format.
|
|
// This is valid for "dsquery *" only.
|
|
// Returns: HRESULT : S_OK if everything succeeded
|
|
// E_INVALIDARG
|
|
// Anything else is a failure code from an ADSI call
|
|
//
|
|
// History: 25-Sep-2000 hiteshr Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT DsQueryOutput( IN DSQUERY_OUTPUT_FORMAT outputFormat,
|
|
IN LPWSTR * ppszAttributes,
|
|
IN DWORD cAttributes,
|
|
IN CDSSearch *pSearch,
|
|
IN BOOL bListFormat );
|