Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1697)

Unified Diff: net/url_request/url_request_inet_job.cc

Issue 11502: Fix the FTP implementation. Our change to make the MessageLoopForIO not... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/url_request/url_request_inet_job.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/url_request/url_request_inet_job.cc
===================================================================
--- net/url_request/url_request_inet_job.cc (revision 5686)
+++ net/url_request/url_request_inet_job.cc (working copy)
@@ -18,6 +18,8 @@
#include "net/url_request/url_request_job_metrics.h"
#include "net/url_request/url_request_job_tracker.h"
+using net::WinInetUtil;
+
//
// HOW ASYNC IO WORKS
//
@@ -61,20 +63,11 @@
// the base class' version of OnIOComplete if appropriate.
//
+COMPILE_ASSERT(
+ sizeof(URLRequestInetJob::AsyncResult) == sizeof(INTERNET_ASYNC_RESULT),
+ async_result_inconsistent_size);
-using namespace std;
-
-using net::WinInetUtil;
-
-static const wchar_t kWndClass[] = L"URLRequestMessageWnd";
-
-// Custom message types for use with message_hwnd
-enum {
- MSG_REQUEST_COMPLETE = WM_USER + 1
-};
-
HINTERNET URLRequestInetJob::the_internet_ = NULL;
-HWND URLRequestInetJob::message_hwnd_ = NULL;
#ifndef NDEBUG
MessageLoop* URLRequestInetJob::my_message_loop_ = NULL;
#endif
@@ -85,7 +78,8 @@
request_handle_(NULL),
last_error_(ERROR_SUCCESS),
is_waiting_(false),
- read_in_progress_(false) {
+ read_in_progress_(false),
+ loop_(MessageLoop::current()) {
// TODO(darin): we should re-create the internet if the UA string changes,
// but we have to be careful about existing users of this internet.
if (!the_internet_) {
@@ -110,12 +104,17 @@
void URLRequestInetJob::Kill() {
CleanupConnection();
+ {
+ AutoLock locked(loop_lock_);
+ loop_ = NULL;
+ }
+
// Dispatch the NotifyDone message to the URLRequest
URLRequestJob::Kill();
}
-void URLRequestInetJob::SetAuth(const wstring& username,
- const wstring& password) {
+void URLRequestInetJob::SetAuth(const std::wstring& username,
+ const std::wstring& password) {
DCHECK((proxy_auth_ && proxy_auth_->state == net::AUTH_STATE_NEED_AUTH) ||
(server_auth_ && server_auth_->state == net::AUTH_STATE_NEED_AUTH));
@@ -218,19 +217,16 @@
is_waiting_ = false;
// the job could have completed with an error while the message was pending
- if (is_done()) {
- Release(); // may destroy self if last reference
- return;
+ if (!is_done()) {
+ // Verify that our status is currently set to IO_PENDING and
+ // reset it on success.
+ DCHECK(GetStatus().is_io_pending());
+ if (result.dwResult && result.dwError == 0)
+ SetStatus(URLRequestStatus());
+
+ OnIOComplete(result);
}
- // Verify that our status is currently set to IO_PENDING and
- // reset it on success.
- DCHECK(GetStatus().is_io_pending());
- if (result.dwResult && result.dwError == 0)
- SetStatus(URLRequestStatus());
-
- OnIOComplete(result);
-
Release(); // may destroy self if last reference
}
@@ -308,10 +304,11 @@
if (ERROR_IO_PENDING == last_error) {
SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
- async_result_.dwError = ERROR_INTERNET_CONNECTION_ABORTED;
- async_result_.dwResult = reinterpret_cast<DWORD_PTR>(handle);
+ AsyncResult result;
+ result.dwError = ERROR_INTERNET_CONNECTION_ABORTED;
+ result.dwResult = reinterpret_cast<DWORD_PTR>(handle);
MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
- this, &URLRequestInetJob::CallOnIOComplete, async_result_));
+ this, &URLRequestInetJob::CallOnIOComplete, result));
}
}
}
@@ -323,23 +320,6 @@
// static
void URLRequestInetJob::InitializeTheInternet(const std::string& user_agent) {
- // construct message window for processsing
- HINSTANCE hinst = GetModuleHandle(NULL);
-
- WNDCLASSEX wc = {0};
- wc.cbSize = sizeof(wc);
- wc.lpfnWndProc = URLRequestWndProc;
- wc.hInstance = hinst;
- wc.lpszClassName = kWndClass;
- RegisterClassEx(&wc);
-
- message_hwnd_ = CreateWindow(kWndClass, 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0,
- hinst, 0);
- if (!message_hwnd_) {
- NOTREACHED() << "error: " << GetLastError();
- return;
- }
-
// Hack attack. We are hitting a deadlock in wininet deinitialization.
// What is happening is that when we deinitialize, FreeLibrary will be
// called on wininet. The loader lock is held, and wininet!DllMain is
@@ -373,53 +353,21 @@
}
// static
-LRESULT CALLBACK URLRequestInetJob::URLRequestWndProc(HWND hwnd,
- UINT message,
- WPARAM wparam,
- LPARAM lparam) {
- URLRequestInetJob* job = reinterpret_cast<URLRequestInetJob*>(wparam);
- HINTERNET handle = reinterpret_cast<HINTERNET>(lparam);
-
- switch (message) {
- case MSG_REQUEST_COMPLETE: {
- // The callback will be reset if we have closed the handle and deleted
- // the job instance. Call CallOnIOComplete only if the handle still
- // has a valid callback.
- INTERNET_STATUS_CALLBACK callback = NULL;
- DWORD option_buffer_size = sizeof(callback);
- if (InternetQueryOption(handle, INTERNET_OPTION_CALLBACK,
- &callback, &option_buffer_size)
- && (NULL != callback)) {
- const AsyncResult& r = job->async_result_;
- DLOG(INFO) << "REQUEST_COMPLETE: job=" << job << ", result=" <<
- (void*) r.dwResult << ", error=" << r.dwError;
- job->CallOnIOComplete(r);
- }
- break;
- }
- default:
- return DefWindowProc(hwnd, message, wparam, lparam);
- }
-
- return 0;
-}
-
-// static
void CALLBACK URLRequestInetJob::URLRequestStatusCallback(
HINTERNET handle, DWORD_PTR job_id, DWORD status, LPVOID status_info,
DWORD status_info_len) {
- UINT message = 0;
- LPARAM message_param = 0;
switch (status) {
case INTERNET_STATUS_REQUEST_COMPLETE: {
- message = MSG_REQUEST_COMPLETE;
- DCHECK(status_info_len == sizeof(INTERNET_ASYNC_RESULT));
- LPINTERNET_ASYNC_RESULT r =
- static_cast<LPINTERNET_ASYNC_RESULT>(status_info);
URLRequestInetJob* job = reinterpret_cast<URLRequestInetJob*>(job_id);
- job->async_result_.dwResult = r->dwResult;
- job->async_result_.dwError = r->dwError;
- message_param = reinterpret_cast<LPARAM>(handle);
+
+ DCHECK(status_info_len == sizeof(AsyncResult));
+ AsyncResult* result = static_cast<AsyncResult*>(status_info);
+
+ AutoLock locked(job->loop_lock_);
+ if (job->loop_) {
+ job->loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ job, &URLRequestInetJob::CallOnIOComplete, *result));
+ }
break;
}
case INTERNET_STATUS_USER_INPUT_REQUIRED:
@@ -428,9 +376,5 @@
ResumeSuspendedDownload(handle, 0);
break;
}
-
- if (message)
- PostMessage(URLRequestInetJob::message_hwnd_, message,
- static_cast<WPARAM>(job_id), message_param);
}
« no previous file with comments | « net/url_request/url_request_inet_job.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698