1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket_stream/socket_stream_job_manager.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSocketStreamJobManager::SocketStreamJobManager() {
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSocketStreamJobManager::~SocketStreamJobManager() {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// static
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSocketStreamJobManager* SocketStreamJobManager::GetInstance() {
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return Singleton<SocketStreamJobManager>::get();
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSocketStreamJob* SocketStreamJobManager::CreateJob(
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& url, SocketStream::Delegate* delegate) const {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If url is invalid, create plain SocketStreamJob, which will close
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the socket immediately.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!url.is_valid()) {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SocketStreamJob* job = new SocketStreamJob();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    job->InitSocketStream(new SocketStream(url, delegate));
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return job;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& scheme = url.scheme();  // already lowercase
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock locked(lock_);
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FactoryMap::const_iterator found = factories_.find(scheme);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (found != factories_.end()) {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SocketStreamJob* job = found->second(url, delegate);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (job)
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return job;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SocketStreamJob* job = new SocketStreamJob();
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  job->InitSocketStream(new SocketStream(url, delegate));
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return job;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSocketStreamJob::ProtocolFactory*
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSocketStreamJobManager::RegisterProtocolFactory(
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& scheme, SocketStreamJob::ProtocolFactory* factory) {
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock locked(lock_);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SocketStreamJob::ProtocolFactory* old_factory;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FactoryMap::iterator found = factories_.find(scheme);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (found != factories_.end()) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    old_factory = found->second;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    old_factory = NULL;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (factory) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    factories_[scheme] = factory;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (found != factories_.end()) {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    factories_.erase(found);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return old_factory;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
67