home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / pserv.cpl / pserv-2.4.exe / source / CListViewTools.cpp < prev    next >
C/C++ Source or Header  |  2005-01-05  |  8KB  |  287 lines

  1. #include "stdafx.h"
  2. #include "CListViewTools.h"
  3. #include "CConfiguration.h"
  4. #include "WriteOptimizedFile.h"
  5.  
  6. CString GetUsernameFromSid( PSID sid )
  7. {
  8.     CString result;
  9.     TCHAR szUserName[256], szDomainName[256];
  10.     DWORD dwName = sizeof(szUserName), dwDomain = sizeof(szDomainName);
  11.     SID_NAME_USE snu;
  12.  
  13.     if( LookupAccountSid(NULL, sid, szUserName, &dwName, szDomainName, &dwDomain, &snu ) )
  14.     {
  15.         result.Format(_T("%s\\%s"), szDomainName, szUserName);
  16.     }
  17.     return result;
  18. }
  19.  
  20. CString GetUserNameFromProcess(HANDLE hProcess)
  21. {
  22.     CString result;
  23.     HANDLE hToken;
  24.     if( OpenProcessToken(hProcess, TOKEN_QUERY, &hToken) )
  25.     {
  26.         DWORD dwReturnLength = 0;
  27.         if( !GetTokenInformation(hToken, TokenUser, NULL, 0, &dwReturnLength ) )
  28.         {
  29.             DWORD dwLastError = GetLastError();
  30.             if( dwLastError == ERROR_INSUFFICIENT_BUFFER )
  31.             {
  32.                 BYTE* memory = new BYTE[dwReturnLength];
  33.                 if( memory )
  34.                 {
  35.                     ZeroMemory( memory, dwReturnLength );
  36.                     if( GetTokenInformation(hToken, TokenUser, memory, dwReturnLength, &dwReturnLength ) )
  37.                     {
  38.                         result = GetUsernameFromSid(((TOKEN_USER*) memory)->User.Sid);
  39.                     }
  40.                     delete memory;
  41.                 }
  42.             }
  43.         }
  44.         CloseHandle(hToken);
  45.     }
  46.     return result;
  47. }
  48.  
  49. void PrintToFile( CFile* pFile, LPCTSTR lpszMessage, ... )
  50. {
  51.     va_list args;
  52.     va_start( args, lpszMessage );
  53.     CString result;
  54.     result.FormatV( lpszMessage, args );
  55.     pFile->Write( (LPCTSTR) result, result.GetLength() * sizeof(TCHAR) );
  56. }
  57.  
  58. void DisplayErrorMessage(LPCTSTR lpszCaption, ...)
  59. {
  60.     DWORD dwLastError = GetLastError();
  61.  
  62.     va_list args;
  63.     va_start( args, lpszCaption);
  64.     CString caption;
  65.     caption.FormatV(lpszCaption, args );
  66.  
  67.     if( dwLastError != S_OK )
  68.     {
  69.         LPVOID lpMsgBuf;
  70.         if( FormatMessage( 
  71.             FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  72.             FORMAT_MESSAGE_FROM_SYSTEM | 
  73.             FORMAT_MESSAGE_IGNORE_INSERTS,
  74.             NULL,
  75.             dwLastError,
  76.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  77.             (LPTSTR) &lpMsgBuf,
  78.             0,
  79.             NULL ) )
  80.         {
  81.             CString copyOfMessage( (LPCTSTR) lpMsgBuf );
  82.             copyOfMessage.TrimRight( _T("\r\n \t") );
  83.  
  84.             AfxMessageBox( FormattedString(_T("%s. %s"),
  85.                 (LPCTSTR) caption, (LPCTSTR)copyOfMessage) , MB_OK|MB_ICONSTOP );
  86.             LocalFree( lpMsgBuf );
  87.             return;
  88.         }
  89.     }
  90.     
  91.     AfxMessageBox(caption, MB_OK|MB_ICONSTOP );
  92. }
  93.  
  94. void DeleteObjects(CObArray& array)
  95. {
  96.     while( array.GetSize() )
  97.     {
  98.         CObject* element = array.GetAt(0);
  99.         if( element )
  100.         {
  101.             array.RemoveAt(0);
  102.             delete element;
  103.         }
  104.         else break;
  105.     }
  106. }
  107.  
  108. CString FormattedString(LPCTSTR expression, ... )
  109. {
  110.     va_list args;
  111.     va_start( args, expression);
  112.     CString result;
  113.     result.FormatV(expression, args );
  114.     return result;
  115. }
  116.  
  117. CListViewEntries::CListViewEntries( GENERICCOMPAREFN* pSortMethods, LPCTSTR lpszName )
  118.     :   m_SortMethods( pSortMethods ),
  119.         m_bSortAscending( TRUE ),
  120.         m_dwSortMethod( 0 ),
  121.         m_strName( lpszName ),
  122.         m_dwNumberOfDisplayColumns( 0 )
  123. {
  124. }
  125.  
  126. CListViewEntries::~CListViewEntries()
  127. {
  128.     DeleteObjects(m_Entries);
  129.     DeleteObjects(m_Columns);
  130. }
  131.  
  132. void CListViewEntries::DoConfigExchange(CRegistry& key)
  133. {
  134.     // if this is the first time, create column widths array
  135.     ASSERT( m_Columns.GetSize() != 0 );
  136.  
  137.     CString buffer;
  138.     for( DWORD dwIndex = 0, dwMax = m_Columns.GetSize(); dwIndex < dwMax; dwIndex++ )
  139.     {
  140.         CListViewColumn* c = (CListViewColumn*) m_Columns.GetAt(dwIndex);
  141.         ASSERT_VALID(c);
  142.  
  143.         buffer.Format(_T("%s_Width"), (LPCTSTR) c->m_strCaption );
  144.         key.RegExchange(buffer, &c->m_dwWidth );
  145.  
  146.         buffer.Format(_T("%s_DisplayOrder"), (LPCTSTR) c->m_strCaption );
  147.         key.RegExchange(buffer, &c->m_dwDisplayOrder );
  148.     }
  149.     key.RegExchange( _T("SortAscending"), &m_bSortAscending );
  150.     key.RegExchange( _T("SortMethod"), &m_dwSortMethod );
  151.     if( !key.m_bSave )
  152.         RefreshDisplayColumns();
  153. }
  154.  
  155. CString CListViewEntries::GetDisplayString(CListViewEntry* item, DWORD dwColumn)
  156. {
  157.     if( item && (dwColumn < m_dwNumberOfDisplayColumns) )
  158.         return item->GetDisplayString(m_dwDisplayColumn[dwColumn]);
  159.     return CString();
  160. }
  161.  
  162. void CListViewEntries::Sort()
  163. {
  164.     CListViewEntry** p = (CListViewEntry**) m_Entries.GetData();
  165.     int numberOfEntries = m_Entries.GetSize();
  166.     if( m_dwSortMethod >= m_dwNumberOfDisplayColumns )
  167.         m_dwSortMethod = 0;
  168.  
  169.     qsort(p,numberOfEntries,sizeof(CListViewEntry*),m_SortMethods[m_dwDisplayColumn[m_dwSortMethod]]);
  170.  
  171.     if( !m_bSortAscending )
  172.     {
  173.         CListViewEntry* temp;
  174.  
  175.         for( int i = 0, imax = numberOfEntries/2, in = numberOfEntries-1; i < imax; i++, in-- )
  176.         {
  177.             temp = p[i];
  178.             p[i] = p[in];
  179.             p[in] = temp;
  180.         }
  181.     }
  182.  
  183. CString XmlEscape(LPCTSTR s)
  184. {
  185.     CString temp(s);
  186.     temp.Replace(TEXT("&"),TEXT("&"));
  187.     temp.Replace(TEXT("<"),TEXT("<"));
  188.     temp.Replace(TEXT(">"),TEXT(">"));
  189.     return temp;
  190. }
  191.  
  192. BOOL CListViewEntries::ExportAsXml( LPCTSTR lpszFilename )
  193. {
  194.     CWriteOptimizedFile file;
  195.     if( file.Open( lpszFilename, CFile::modeCreate | CFile::modeWrite ) )
  196.     {
  197.         ExportXmlToFile(&file);
  198.         file.Close();
  199.         return TRUE;
  200.     }
  201.     return FALSE;
  202. }
  203.  
  204. CListViewColumn* CListViewEntries::GetColumnByName( LPCTSTR lpszName )
  205. {
  206.     for( int i = 0, imax = m_Columns.GetSize(); i < imax; i++ )
  207.     {
  208.         CListViewColumn* c = (CListViewColumn*) m_Columns.GetAt(i);
  209.         if( c->m_strCaption.Compare(lpszName) == 0 )
  210.         {
  211.             return c;
  212.         }
  213.     }
  214.     return NULL;
  215. }
  216.  
  217. DWORD CListViewEntries::GetNumberOfColumns()
  218. {
  219.     return m_dwNumberOfDisplayColumns;
  220. }
  221.  
  222. CListViewColumn* CListViewEntries::GetColumn( DWORD dwIndex )
  223. {
  224.     if( dwIndex < m_dwNumberOfDisplayColumns )
  225.         return (CListViewColumn*) m_Columns.GetAt(m_dwDisplayColumn[dwIndex]);
  226.  
  227.     return NULL;
  228. }
  229.  
  230. void CListViewEntries::RefreshDisplayColumns()
  231. {
  232.     DWORD nColumns = DWORD(m_Columns.GetSize());
  233.     for( m_dwNumberOfDisplayColumns = 0; m_dwNumberOfDisplayColumns < nColumns; m_dwNumberOfDisplayColumns++ )
  234.     {
  235.         BOOL found = FALSE;
  236.         for( DWORD iCurrentIndex = 0; iCurrentIndex < nColumns; iCurrentIndex++ )
  237.         {
  238.             CListViewColumn* c = (CListViewColumn*) m_Columns.GetAt( iCurrentIndex );
  239.             if( c->m_dwDisplayOrder == m_dwNumberOfDisplayColumns )
  240.             {
  241.                 m_dwDisplayColumn[m_dwNumberOfDisplayColumns] = iCurrentIndex;
  242.                 found = TRUE;
  243.                 break;
  244.             }   
  245.         }
  246.         if( !found )
  247.             break;
  248.     }
  249. }
  250.  
  251. BOOL CListViewEntries::Matches(CListViewEntry* item, LPFNFindSubstring lpfnFindSubstring, LPCTSTR lpszFind)
  252. {
  253.     if( !item )
  254.         return FALSE;
  255.  
  256.     for( DWORD dwIndex = 0; dwIndex < m_dwNumberOfDisplayColumns; dwIndex++ )
  257.     {
  258.         if( lpfnFindSubstring( item->GetDisplayString(m_dwDisplayColumn[dwIndex]), lpszFind ) )
  259.         {
  260.             return TRUE;
  261.         }
  262.     }
  263.     return FALSE;
  264. }
  265.  
  266. void CListViewEntries::CreateColumns( LPCTSTR lpszColumn, ... )
  267. {
  268.     va_list args;
  269.     va_start( args, lpszColumn );
  270.  
  271.     int index = 0;
  272.     while( lpszColumn )
  273.     {
  274.         m_Columns.Add( new CListViewColumn(lpszColumn, index++ ) );
  275.         lpszColumn = va_arg( args, LPCTSTR );
  276.     }    
  277. }
  278.  
  279. CListViewColumn::CListViewColumn( LPCTSTR lpszCaption, DWORD dwDisplayOrder, DWORD dwWidth )
  280.     :   m_strCaption(lpszCaption),
  281.         m_dwDisplayOrder( dwDisplayOrder ),
  282.         m_dwWidth( dwWidth )
  283. {
  284. }
  285.  
  286.