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 + -
显示快捷键?