//+------------------------------------------------------------------------- // // 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 // //-------------------------------------------------------------------------- #include "gettable.h" 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; WriteStandardOut(L"%s",Pad); Pad[width] = PadChar; } // //Dispaly a column with two starting pad, //column value and two ending pad // VOID DisplayColumn(LONG width, PCWSTR lpszValue) { //Display Two PadChar in the begining DisplayPad(2); if(lpszValue) { WriteStandardOut(lpszValue); DisplayPad(width- static_cast(wcslen(lpszValue))); } else DisplayPad(width); //Display Two Trailing Padchar DisplayPad(2); } // //Display Newline // VOID DisplayNewLine() { WriteStandardOut(L"%s",L"\n"); } private: WCHAR Pad[MAXPAD]; WCHAR PadChar; }; //+-------------------------------------------------------------------------- // // Class: CFormatInfo // // Purpose: Used to format table columns and display table // // History: 17-Oct-2000 JeffJon Created // //--------------------------------------------------------------------------- class CFormatInfo { public: // // Constructor // CFormatInfo(); // // Destructor // ~CFormatInfo(); // // Public methods // HRESULT Initialize(DWORD dwSampleSize, bool bShowAsList = false, bool bQuiet = false); inline DWORD GetColWidth(DWORD dwColNum) { ASSERT(m_bInitialized); if(dwColNum >= m_dwNumColumns) { ASSERT(FALSE); return 0; } return m_pColWidth[dwColNum]; } inline void SetColWidth(DWORD dwColNum, DWORD dwWidth) { ASSERT(m_bInitialized); if(dwColNum >= m_dwNumColumns) { ASSERT(FALSE); return; } if(dwWidth > m_pColWidth[dwColNum]) { m_pColWidth[dwColNum] = dwWidth; } } HRESULT AddRow(PDSGET_DISPLAY_INFO pDisplayInfo, DWORD dwColumnCount); DWORD GetRowCount() { return m_dwTotalRows; } inline HRESULT Get(DWORD dwRow, DWORD dwCol, CComBSTR& refsbstrColValue) { refsbstrColValue.Empty(); ASSERT(m_bInitialized); if(dwRow >= m_dwTotalRows || dwCol >= m_dwNumColumns) { ASSERT(FALSE); return E_INVALIDARG; } refsbstrColValue += m_ppDisplayInfoArray[dwRow][dwCol].GetValue(0); for (DWORD dwIdx = 1; dwIdx < m_ppDisplayInfoArray[dwRow][dwCol].GetValueCount(); dwIdx++) { refsbstrColValue += L";"; refsbstrColValue += m_ppDisplayInfoArray[dwRow][dwCol].GetValue(dwIdx); } return S_OK; } void DisplayHeaders() { ASSERT(m_bInitialized); if (!m_bQuiet) { for( DWORD i = 0; i < m_dwNumColumns; ++i) { m_display.DisplayColumn(GetColWidth(i),m_ppDisplayInfoArray[0][i].GetDisplayName()); } NewLine(); } } void DisplayColumn(DWORD dwRow, DWORD dwCol) { ASSERT(m_bInitialized); if(dwRow >= m_dwTotalRows || dwCol >= m_dwNumColumns) { ASSERT(FALSE); return ; } if (!m_bQuiet) { CComBSTR sbstrValue; HRESULT hr = Get(dwRow, dwCol, sbstrValue); if (SUCCEEDED(hr)) { m_display.DisplayColumn(GetColWidth(dwCol), sbstrValue); } } } void DisplayColumn(DWORD dwCol, PCWSTR pszValue) { ASSERT(m_bInitialized); if(dwCol >= m_dwNumColumns) { ASSERT(FALSE); return; } if (!m_bQuiet) { m_display.DisplayColumn(GetColWidth(dwCol), pszValue); } } void Display() { ASSERT(m_bInitialized); if (!m_bListFormat && !m_bQuiet) { DisplayHeaders(); for(DWORD i = 0; i < m_dwTotalRows; ++i) { for(DWORD j = 0; j < m_dwNumColumns; ++j) { DisplayColumn(i,j); } NewLine(); } } } void NewLine() { if (!m_bQuiet) { m_display.DisplayNewLine(); } } private: // // Private data // bool m_bInitialized; bool m_bListFormat; bool m_bQuiet; // //Number of rows to be used for calulating //column width. This is also the size of the table. // DWORD m_dwSampleSize; // //Count of rows in cache // DWORD m_dwTotalRows; // //Number of columns // DWORD m_dwNumColumns; // // Array of column widths // DWORD* m_pColWidth; // // Array of column header/value pairs // PDSGET_DISPLAY_INFO* m_ppDisplayInfoArray; CDisplay m_display; }; //+-------------------------------------------------------------------------- // // Function: DsGetOutputValuesList // // Synopsis: This function gets the values for the columns and then adds // the row to the format helper // // Arguments: [pszDN IN] : the DN of the object // [refBasePathsInfo IN] : reference to path info // [refCredentialObject IN] : reference to the credential manager // [pCommandArgs IN] : Command line arguments // [pObjectEntry IN] : Entry in the object table being processed // [pAttrInfo IN] : the values to display // [dwAttrCount IN] : Number of arributes in above array // [spDirObject IN] : Interface pointer to the object // [refFormatInfo IN]: Reference to the format helper // // Returns: HRESULT : S_OK if everything succeeded // E_INVALIDARG // // History: 16-Oct-2000 JeffJon Created // //--------------------------------------------------------------------------- HRESULT DsGetOutputValuesList(PCWSTR pszDN, CDSCmdBasePathsInfo& refBasePathsInfo, const CDSCmdCredentialObject& refCredentialObject, PARG_RECORD pCommandArgs, PDSGetObjectTableEntry pObjectEntry, DWORD dwAttrCount, PADS_ATTR_INFO pAttrInfo, CComPtr& spDirObject, CFormatInfo& refFormatInfo); //+-------------------------------------------------------------------------- // // Function: GetStringFromADs // // Synopsis: Converts Value into string depending upon type // Arguments: [pValues - IN]: Value to be converted to string // [dwADsType-IN]: ADSTYPE of pValue // [pBuffer - OUT]:Output buffer which gets the string // [dwBufferLen-IN]:Size of output buffer // Returns HRESULT S_OK if Successful // E_INVALIDARG // Anything else is a failure code from an ADSI // call // // // History: 05-OCT-2000 hiteshr Created // //--------------------------------------------------------------------------- HRESULT GetStringFromADs(IN const ADSVALUE *pValues, IN ADSTYPE dwADsType, OUT LPWSTR pBuffer, IN DWORD dwBufferLen);