reporterror.c
来自「一个类似windows」· C语言 代码 · 共 626 行 · 第 1/2 页
C
626 行
"Host: %s\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: %d\r\n"
"\r\n"
"%s",
hostname,
strlen(urlencodeBuffer),
urlencodeBuffer);
free(urlencodeBuffer);
free(parameterBuffer);
}
#define CONTENT_LENGTH "Content-Length:"
BOOL
WasErrorReportDelivered(LPSTR httpResponse)
{
return strstr(httpResponse, "</ErrorReportResponse>") != NULL;
}
BOOL
ReceiveResponse(SOCKET socket, LPSTR responseBuffer, PULONG responseBufferSize)
{
PCHAR pch = (PCHAR)responseBuffer;
ULONG length = 0;
fd_set fdset[1];
struct timeval timeout;
FD_ZERO(&fdset);
FD_SET(socket, &fdset);
timeout.tv_sec = 5;
timeout.tv_usec = 0;
while (select(1, fdset, NULL, NULL, &timeout) > 0)
{
if (recv(socket, pch, 1, 0) == 1)
{
pch++;
length++;
if (WasErrorReportDelivered(responseBuffer))
{
*responseBufferSize = length;
return TRUE;
}
}
else
break;
}
*responseBufferSize = 0;
return FALSE;
}
BOOL
SubmitErrorReport(SOCKET socket, LPERROR_REPORT errorReport)
{
BOOL wasErrorReportDelivered;
LPSTR requestBuffer;
LPSTR responseBuffer;
ULONG requestBufferSize = MAX_REQUEST_BUFFER_SIZE;
requestBuffer = malloc(requestBufferSize);
memset(requestBuffer, '\0', requestBufferSize);
CreateHTTPPostRequest(requestBuffer, ErrorReportingServerName, errorReport);
send(socket, requestBuffer, strlen(requestBuffer), 0);
responseBuffer = malloc(requestBufferSize);
wasErrorReportDelivered = ReceiveResponse(socket, responseBuffer, IN OUT &requestBufferSize);
free(responseBuffer);
free(requestBuffer);
return wasErrorReportDelivered;
}
VOID
DisconnectFromServer(SOCKET socket)
{
closesocket(socket);
}
DWORD STDCALL
SubmissionThread(LPVOID lpParameter)
{
WCHAR errorMessage[1024];
SOCKET socket;
HANDLE hThread;
INT error;
if (AbortSubmission != 0)
goto done;
PostMessage(hSubmissionNotifyWnd, WM_CONTACTING_SERVER, IDS_CONTACTING_SERVER, 0);
error = ConnectToServer(ErrorReportingServerName, &socket, errorMessage);
if (error != NO_ERROR)
{
MessageBox(NULL, errorMessage, NULL, MB_ICONWARNING);
PostMessage(hSubmissionNotifyWnd, WM_ABORT_SUBMISSION, IDS_FAILED_TO_LOCATE_SERVER, 0);
goto cleanup;
}
if (!SubmitErrorReport(socket, ErrorReport))
{
PostMessage(hSubmissionNotifyWnd, WM_ABORT_SUBMISSION, IDS_FAILED_TO_DELIVER_ERROR_REPORT, 0);
goto cleanup;
}
DisconnectFromServer(socket);
done:
switch (AbortSubmission)
{
case 0:
SendMessage(hSubmissionNotifyWnd, WM_SUBMISSION_COMPLETE, 0, 0);
break;
case 1:
SendMessage(hSubmissionNotifyWnd, WM_ABORT_SUBMISSION, 0, 0);
break;
}
cleanup:
hThread = (HANDLE)InterlockedExchange((LONG*)&hSubmissionThread, 0);
if (hThread != NULL)
CloseHandle(hThread);
ReleaseErrorReport(ErrorReport);
ErrorReport = NULL;
return 0;
}
BOOL
StartSubmissionThread(HWND hWndNotify)
{
if (hSubmissionThread == NULL)
{
DWORD ThreadId;
hSubmissionNotifyWnd = hWndNotify;
AbortSubmission = 0;
hSubmissionThread = CreateThread(NULL,
0,
SubmissionThread,
NULL,
CREATE_SUSPENDED,
&ThreadId);
if (hSubmissionThread == NULL)
return FALSE;
ResumeThread(hSubmissionThread);
return TRUE;
}
return FALSE;
}
INT_PTR CALLBACK
PageSubmittingReportProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch (pnmh->code)
{
case PSN_SETACTIVE:
{
SetDlgItemText(hwndDlg, IDC_SUBMISSION_STATUS, NULL);
SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, TRUE, 50);
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
StartSubmissionThread(hwndDlg);
break;
}
case PSN_RESET:
{
TerminateSubmission(TRUE);
break;
}
case PSN_WIZBACK:
if (hSubmissionThread != NULL)
{
PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
TerminateSubmission(FALSE);
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
return -1;
}
else
{
SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, FALSE, 0);
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SUBMIT_REPORT);
}
break;
}
break;
}
case WM_CONTACTING_SERVER:
{
WCHAR Msg[1024];
LoadString(hAppInstance, wParam, Msg, sizeof(Msg) / sizeof(WCHAR));
SetDlgItemText(hwndDlg, IDC_SUBMISSION_STATUS, Msg);
break;
}
case WM_SUBMISSION_COMPLETE:
{
SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, FALSE, 0);
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_SUBMITTED_REPORT);
break;
}
case WM_ABORT_SUBMISSION:
{
/* Go back in case we aborted the submission thread */
SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, FALSE, 0);
PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_SUBMIT_REPORT);
if (wParam != 0)
{
WCHAR Msg[1024];
LoadString(hAppInstance, wParam, Msg, sizeof(Msg) / sizeof(WCHAR));
MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
}
break;
}
}
return FALSE;
}
INT_PTR CALLBACK
PageSubmittedReportProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch (pnmh->code)
{
case PSN_SETACTIVE:
{
EnableWindow(GetDlgItem(GetParent(hwndDlg), IDCANCEL), FALSE);
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH);
break;
}
}
break;
}
}
return FALSE;
}
static LONG
CreateWizard(VOID)
{
PROPSHEETPAGE psp[8];
PROPSHEETHEADER psh;
WCHAR Caption[1024];
LoadString(hAppInstance, IDS_WIZARD_NAME, Caption, sizeof(Caption) / sizeof(TCHAR));
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
psh.hwndParent = NULL;
psh.hInstance = hAppInstance;
psh.hIcon = 0;
psh.pszCaption = Caption;
psh.nPages = 4;
psh.nStartPage = 0;
psh.ppsp = psp;
psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
InitPropSheetPage(&psp[0], IDD_FIRSTPAGE, PSP_HIDEHEADER, PageFirstPageProc);
InitPropSheetPage(&psp[1], IDD_SUBMIT_REPORT, PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE, PageSubmitReportProc);
InitPropSheetPage(&psp[2], IDD_SUBMITTING_REPORT, PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE, PageSubmittingReportProc);
InitPropSheetPage(&psp[3], IDD_SUBMITTED_REPORT, PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE, PageSubmittedReportProc);
return (LONG)(PropertySheet(&psh) != -1);
}
int WINAPI
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
WORD wVersionRequested;
WSADATA wsaData;
INT error;
hAppInstance = hInstance;
wVersionRequested = MAKEWORD(1, 1);
error = WSAStartup(wVersionRequested, &wsaData);
if (error != NO_ERROR)
{
WCHAR format[1024];
WCHAR message[1024];
LoadString(hAppInstance, IDS_FAILED_TO_INITIALIZE_WINSOCK, format, sizeof(format) / sizeof(WCHAR));
wsprintf(message, format, error);
MessageBox(NULL, message, NULL, MB_ICONWARNING);
return 0;
}
CreateWizard();
WSACleanup();
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?