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