www.pudn.com > 44w.rar > file.cpp
#include#include #include #include #include "AccessEnum.h" #include "resource.h" #include "resizer.h" void CompareUsers( HWND hWnd, const TCHAR * share, CUser * aUser, CUser * bUser, void (*callback)( HWND hWnd, const TCHAR * format, ... ), const TCHAR * type ) { // iterate over users for (;;) { if ( aUser == NULL && bUser == NULL ) break; int diff = aUser && bUser ? _tcsicmp( aUser->m_Acct, bUser->m_Acct ) : aUser ? -1 : 1; if ( diff < 0 ) { // item deleted callback( hWnd, _T("%s lost %s access to %s"), type ? aUser->m_Acct : _T("Everyone"), type ? type : aUser->m_Acct, share ); aUser = aUser->m_Next; continue; } if ( diff > 0 ) { // item added callback( hWnd, _T("%s gained %s access %s"), type ? bUser->m_Acct : _T("Everyone"), type ? type : bUser->m_Acct, share ); bUser = bUser->m_Next; continue; } aUser = aUser->m_Next; bUser = bUser->m_Next; } } void CompareShares( HWND hWnd, CShare * aShare, CShare * bShare, void (*callback)( HWND hWnd, const TCHAR * format, ... ) ) { // iterate over shares for (;;) { #if 0 // skip shares that we couldn't access permissions for while ( aShare && _tcschr( aShare->m_path+2, '\\' ) == NULL ) aShare = aShare->m_Next; while ( bShare && _tcschr( bShare->m_path+2, '\\' ) == NULL ) bShare = bShare->m_Next; #endif if ( aShare == NULL && bShare == NULL ) break; int diff = aShare && bShare ? _tcsicmp( aShare->m_path, bShare->m_path ) : aShare ? -1 : 1; if ( diff < 0 ) { // item deleted callback( hWnd, _T("%s removed"), aShare->m_path ); aShare = aShare->m_Next; continue; } if ( diff > 0 ) { // item added callback( hWnd, _T("%s added"), bShare->m_path ); bShare = bShare->m_Next; continue; } CompareUsers( hWnd, aShare->m_path, aShare->m_OtherRead, bShare->m_OtherRead, callback, _T("Read") ); CompareUsers( hWnd, aShare->m_path, aShare->m_OtherWrite, bShare->m_OtherWrite, callback, _T("Write") ); CompareUsers( hWnd, aShare->m_path, aShare->m_deny, bShare->m_deny, callback, _T("Deny") ); aShare = aShare->m_Next; bShare = bShare->m_Next; } } // Split a CSV line into fields int Split( TCHAR * line, TCHAR ** fields, TCHAR delim ) { TCHAR ** start = fields; TCHAR * dst = line; TCHAR * src = line; bool got = false; while ( *src ) { if ( *src == delim ) { if ( !got ) *fields++ = dst; *dst++ = 0; got = false; } else if ( *src != '"' ) { if ( !got ) *fields++ = dst, got = true; *dst++ = *src; } else { ++src; while ( *src != '"' ) { if ( *src == 0 ) goto abort; if ( !got ) *fields++ = dst, got = true; *dst++ = *src++; } } ++src; } if ( !got ) *fields++ = dst; abort: *fields = NULL; *dst = 0; return fields - start; } CShare * ImportFile( const TCHAR * path ) { CShare * list = NULL; FILE * fp = _tfopen( path, _T("rb") ); DWORD line = 0; if ( fp == NULL ) return NULL; // Mark file as unicode #if UNICODE WORD uni = _fgettc( fp ); if ( uni != 0xFEFF ) { fclose( fp ); return NULL; } #endif TCHAR Line[ 5 * MAX_TEXT ]; for (;;) { // read a line for ( int pos = 0; pos < sizeof Line/sizeof Line[0] - 1; ++pos ) { int ch = _fgettc( fp ); if ( ch == _TEOF ) { fclose( fp ); return list; } Line[pos] = ch; if ( pos >= 2 && Line[pos] == '\n' && Line[pos-1] == '\r' ) { ++pos; break; } } Line[pos] = 0; ++line; // remove trailing white space (particularly newlines) TCHAR * end = _tcschr( Line, 0 ); while ( end > Line && iswspace( end[-1] ) ) *--end = 0; TCHAR * fields[ 20 ]; int cnt = Split( Line, fields, 0x9 ); if ( cnt == 4 ) { CShare * item = new CShare( fields[0], fields[1], fields[2], fields[3], 0xA ); if ( line != 1 ) item->InsertInList( &list ); } else { // bad line MessageBox( NULL, _T("Bad file"), APPNAME, MB_OK|MB_ICONSTOP ); return NULL; } } } void CompareCallback( HWND hWnd, const TCHAR * format, ... ) { TCHAR msg[ 1024 ]; va_list va; va_start( va, format ); _vstprintf( msg, format, va ); va_end( va ); #if 1 // Add to listbox SendMessage( GetDlgItem( hWnd, IDC_LIST ), LB_ADDSTRING, 0, (LPARAM)msg ); #else // Add to listview HWND hListview = GetDlgItem( hWnd, IDC_LIST ); LVITEM item; item.mask = LVIF_TEXT; item.iItem = 0x7FFFFFFF; item.iSubItem = 0; item.iImage = 0; item.pszText = msg; item.iItem = ListView_InsertItem( hListview, &item ); item.iSubItem += 1; item.pszText = (TCHAR *) localpath; ListView_SetItem( hListview, &item ); #endif } INT_PTR CALLBACK CompareDialog( HWND hDlg, UINT message, UINT wParam, LONG lParam ) { static CResizer resizer; static TCHAR prevPath[ MAX_PATH ]; OPENFILENAME open; CShare * prev; switch ( message ) { case WM_INITDIALOG: // Create listview columns resizer.OnInitDialog( hDlg ); // get path to file memset( &open, 0, sizeof open ); open.lStructSize = sizeof open; open.hwndOwner = hDlg; open.lpstrFilter = TEXT("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"); open.lpstrFile = prevPath; open.nMaxFile = MAX_PATH; open.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; open.lpstrTitle = TEXT("Locate previously exported file"); if ( ! GetOpenFileName( &open ) ) { EndDialog( hDlg, 0 ); break; } // read file prev = ImportFile( prevPath ); if ( prev == NULL ) { MessageBox( hDlg, _T("Error reading file"), APPNAME, MB_OK ); break; } // compare files CompareShares( hDlg, prev, (CShare *)lParam, CompareCallback ); // clean up delete prev; return TRUE; case WM_COMMAND: switch ( LOWORD(wParam) ) { case IDOK: EndDialog( hDlg, 0 ); break; } break; case WM_CLOSE: EndDialog( hDlg, 0 ); return TRUE; case WM_GETMINMAXINFO: resizer.OnGetMinMaxInfo( wParam, lParam ); return 0; case WM_SIZE: resizer.OnSize( wParam, lParam ); UpdateWindow( hDlg ); return 0; case WM_NCHITTEST: SetWindowLong( hDlg, DWL_MSGRESULT, resizer.OnNcHitTest( wParam, lParam ) ); return true; case WM_PAINT: resizer.OnPaint( wParam, lParam ); break; default: break; } return FALSE; }