Leaked source code of windows server 2003
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.
 
 
 
 
 
 

346 lines
11 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: fuslogvw.c
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 25 Mar 97 t-alans (Alan Shi) Created
// 12 Jan 00 AlanShi (Alan Shi) Copied from cdllogvw
// 30 May 00 AlanShi (Alan Shi) Modified to show date/time
//
//----------------------------------------------------------------------------
#include <windows.h>
#include <shlwapi.h>
#include <shellapi.h>
#include <wininet.h>
#include <commctrl.h>
#include "cdlids.h"
#include "wininet.h"
#define NUMBER_OF(x) (sizeof(x)/sizeof((x)[0]))
#define URL_SEARCH_PATTERN "?FusionBindError!name="
#define DELIMITER_CHAR '!'
#define MAX_CACHE_ENTRY_INFO_SIZE 2048
#define MAX_DATE_LEN 64
#define PAD_DIGITS_FOR_STRING(x) (((x) > 9) ? TEXT("") : TEXT("0"))
const char *ppszMonths[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
void ViewLogEntry(HWND hwnd);
void RefreshLogView(HWND hwnd);
void DeleteLogEntry(HWND hwnd);
void DeleteAllLogs(HWND hwnd);
void FormatDateBuffer(FILETIME *pftLastMod, LPSTR szBuf, int cchBuffer);
void InitListView(HWND hwndLV);
void AddLogItem(HWND hwndLV, LPINTERNET_CACHE_ENTRY_INFO pCacheEntryInfo);
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
hInst = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_CDLLOGVIEW), NULL, DlgProc);
return 0;
}
LRESULT CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndLV;
LPNMHDR pnmh = NULL;
switch (iMsg) {
case WM_INITDIALOG:
hwndLV = GetDlgItem(hwnd, IDC_LV_LOGMESSAGES);
InitListView(hwndLV);
RefreshLogView(hwnd);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDCANCEL:
EndDialog(hwnd, 0);
break;
case IDC_CB_VIEWLOG:
ViewLogEntry(hwnd);
break;
case IDC_CB_REFRESH:
RefreshLogView(hwnd);
break;
case IDC_CB_DELETE:
DeleteLogEntry(hwnd);
break;
case IDC_CB_DELETE_ALL:
DeleteAllLogs(hwnd);
break;
}
return TRUE;
case WM_NOTIFY:
if (wParam == IDC_LV_LOGMESSAGES) {
pnmh = (LPNMHDR)lParam;
if (pnmh->code == LVN_ITEMACTIVATE) {
// Double click (or otherwise activated)
ViewLogEntry(hwnd);
}
}
return TRUE;
}
return FALSE;
}
void DeleteLogEntry(HWND hwnd)
{
LPINTERNET_CACHE_ENTRY_INFO pCacheEntryInfo = NULL;
DWORD dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
HWND hwndLV;
LRESULT lIndex = 0;
LRESULT lLength = 0;
static char pBuffer[MAX_CACHE_ENTRY_INFO_SIZE];
char szUrl[INTERNET_MAX_URL_LENGTH];
char szBuf[INTERNET_MAX_URL_LENGTH];
hwndLV = GetDlgItem(hwnd, IDC_LV_LOGMESSAGES);
lIndex = ListView_GetSelectionMark(hwndLV);
ListView_GetItemText(hwndLV, lIndex, 0, szBuf, INTERNET_MAX_URL_LENGTH);
//
// Length of URL plus lenght of returned string must still fit in the
// URL buffer
//
if (((NUMBER_OF(URL_SEARCH_PATTERN) - 1) + lstrlen(szBuf)) >= NUMBER_OF(szUrl))
{
return;
}
strncpy(szUrl, URL_SEARCH_PATTERN, NUMBER_OF(szUrl));
strncat(szUrl, szBuf, NUMBER_OF(szUrl) - NUMBER_OF(URL_SEARCH_PATTERN));
pCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)pBuffer;
dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
if (DeleteUrlCacheEntry(szUrl)) {
RefreshLogView(hwnd);
}
else {
MessageBox(hwnd, "Error: Unable to delete cache file!",
"Log View Error", MB_OK | MB_ICONERROR);
}
}
void DeleteAllLogs(HWND hwnd)
{
HWND hwndLV;
LVITEM lvitem;
char szBuf[INTERNET_MAX_URL_LENGTH];
char szUrl[INTERNET_MAX_URL_LENGTH];
int iCount;
int i;
hwndLV = GetDlgItem(hwnd, IDC_LV_LOGMESSAGES);
memset(&lvitem, 0, sizeof(LVITEM));
lvitem.iSubItem = 0;
lvitem.mask = LVIF_TEXT;
lvitem.cchTextMax = NUMBER_OF(szBuf);
lvitem.pszText = szBuf;
iCount = ListView_GetItemCount(hwndLV);
for (i = 0; i < iCount; i++) {
szBuf[0] = TEXT('\0');
lvitem.iItem = i;
if (ListView_GetItem(hwndLV, &lvitem)) {
if ((NUMBER_OF(URL_SEARCH_PATTERN) + lstrlen(szUrl)) < NUMBER_OF(szUrl)) {
return;
}
strncpy(szUrl, URL_SEARCH_PATTERN, NUMBER_OF(szUrl));
strncat(szUrl, lvitem.pszText, NUMBER_OF(szUrl) - NUMBER_OF(URL_SEARCH_PATTERN));
DeleteUrlCacheEntry(szUrl);
}
}
RefreshLogView(hwnd);
}
void ViewLogEntry(HWND hwnd)
{
LRESULT lIndex = 0;
LRESULT lLength = 0;
HWND hwndLV;
DWORD dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
LPINTERNET_CACHE_ENTRY_INFO pCacheEntryInfo = NULL;
char szUrl[INTERNET_MAX_URL_LENGTH];
char szBuf[INTERNET_MAX_URL_LENGTH];
static char pBuffer[MAX_CACHE_ENTRY_INFO_SIZE];
hwndLV = GetDlgItem(hwnd, IDC_LV_LOGMESSAGES);
lIndex = ListView_GetSelectionMark(hwndLV);
ListView_GetItemText(hwndLV, lIndex, 0, szBuf, INTERNET_MAX_URL_LENGTH);
if ((NUMBER_OF(URL_SEARCH_PATTERN) + lstrlen(szUrl)) > NUMBER_OF(szUrl)) {
return;
}
strncpy(szUrl, URL_SEARCH_PATTERN, NUMBER_OF(szUrl));
strncat(szUrl, szBuf, NUMBER_OF(szUrl) - NUMBER_OF(URL_SEARCH_PATTERN));
pCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)pBuffer;
dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
if (GetUrlCacheEntryInfo(szUrl, pCacheEntryInfo, &dwBufferSize)) {
if (pCacheEntryInfo->lpszLocalFileName != NULL) {
if (ShellExecute(NULL, "open", pCacheEntryInfo->lpszLocalFileName,
NULL, NULL, SW_SHOWNORMAL ) <= (HINSTANCE)32) {
// ShellExecute returns <= 32 if error occured
MessageBox(hwnd, "Error: Unable to open cache file!",
"Log View Error", MB_OK | MB_ICONERROR);
}
}
else {
MessageBox(hwnd, "Error: No file name available!",
"Log View Error", MB_OK | MB_ICONERROR);
}
}
}
void RefreshLogView(HWND hwnd)
{
HANDLE hUrlCacheEnum;
DWORD dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
LPINTERNET_CACHE_ENTRY_INFO pCacheEntryInfo = NULL;
HWND hwndLV;
static char pBuffer[MAX_CACHE_ENTRY_INFO_SIZE];
hwndLV = GetDlgItem(hwnd, IDC_LV_LOGMESSAGES);
ListView_DeleteAllItems(hwndLV);
pCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)pBuffer;
hUrlCacheEnum = FindFirstUrlCacheEntry(URL_SEARCH_PATTERN, pCacheEntryInfo,
&dwBufferSize);
if (hUrlCacheEnum != NULL) {
if (pCacheEntryInfo->lpszSourceUrlName != NULL) {
if (StrStrI(pCacheEntryInfo->lpszSourceUrlName, URL_SEARCH_PATTERN)) {
AddLogItem(hwndLV, pCacheEntryInfo);
}
}
dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
while (FindNextUrlCacheEntry(hUrlCacheEnum, pCacheEntryInfo,
&dwBufferSize)) {
if (pCacheEntryInfo->lpszSourceUrlName != NULL) {
if (StrStrI(pCacheEntryInfo->lpszSourceUrlName, URL_SEARCH_PATTERN)) {
AddLogItem(hwndLV, pCacheEntryInfo);
}
}
dwBufferSize = MAX_CACHE_ENTRY_INFO_SIZE;
}
}
}
void AddLogItem(HWND hwndLV, LPINTERNET_CACHE_ENTRY_INFO pCacheEntryInfo)
{
LVITEM lvitem;
static char szBuf[MAX_DATE_LEN];
memset(&lvitem, 0, sizeof(lvitem));
lvitem.mask = LVIF_TEXT;
FormatDateBuffer(&pCacheEntryInfo->LastModifiedTime, szBuf, NUMBER_OF(szBuf));
lvitem.iItem = 0;
lvitem.iSubItem = 0;
lvitem.pszText = pCacheEntryInfo->lpszSourceUrlName + lstrlen(URL_SEARCH_PATTERN);
lvitem.iItem = ListView_InsertItem(hwndLV, &lvitem);
lvitem.iSubItem = 1;
lvitem.pszText = szBuf;
ListView_SetItem(hwndLV, &lvitem);
}
void FormatDateBuffer(FILETIME *pftLastMod, LPSTR szBuf, int chBuffer)
{
SYSTEMTIME systime;
FILETIME ftLocalLastMod;
FileTimeToLocalFileTime(pftLastMod, &ftLocalLastMod);
FileTimeToSystemTime(&ftLocalLastMod, &systime);
wnsprintf(szBuf, chBuffer, "%s%d %s %d @ %s%d:%s%d:%s%d",
PAD_DIGITS_FOR_STRING(systime.wDay), systime.wDay,
ppszMonths[systime.wMonth - 1],
systime.wYear,
PAD_DIGITS_FOR_STRING(systime.wHour), systime.wHour,
PAD_DIGITS_FOR_STRING(systime.wMinute), systime.wMinute,
PAD_DIGITS_FOR_STRING(systime.wSecond), systime.wSecond);
}
void InitListView(HWND hwndLV)
{
LVCOLUMN lvcol;
memset(&lvcol, 0, sizeof(LVCOLUMN));
lvcol.mask = LVCF_TEXT | LVCF_WIDTH;
lvcol.cx = 350;
lvcol.pszText = TEXT("Description");
ListView_InsertColumn(hwndLV, 0, &lvcol);
lvcol.pszText = TEXT("Date/Time");
lvcol.cx = 150;
ListView_InsertColumn(hwndLV, 1, &lvcol);
}
int
_stdcall
ModuleEntry(void)
{
int i;
STARTUPINFO si;
LPTSTR pszCmdLine = GetCommandLine();
si.dwFlags = 0;
GetStartupInfoA(&si);
i = WinMain(GetModuleHandle(NULL),
NULL,
pszCmdLine,
(si.dwFlags & STARTF_USESHOWWINDOW) ? si.wShowWindow : SW_SHOWDEFAULT);
ExitProcess(i);
return i; // We never come here
}