| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "net/socket_stream/socket_stream_job_manager.h" |
| |
| #include "base/memory/singleton.h" |
| |
| namespace net { |
| |
| SocketStreamJobManager::SocketStreamJobManager() { |
| } |
| |
| SocketStreamJobManager::~SocketStreamJobManager() { |
| } |
| |
| // static |
| SocketStreamJobManager* SocketStreamJobManager::GetInstance() { |
| return Singleton<SocketStreamJobManager>::get(); |
| } |
| |
| SocketStreamJob* SocketStreamJobManager::CreateJob( |
| const GURL& url, SocketStream::Delegate* delegate) const { |
| // If url is invalid, create plain SocketStreamJob, which will close |
| // the socket immediately. |
| if (!url.is_valid()) { |
| SocketStreamJob* job = new SocketStreamJob(); |
| job->InitSocketStream(new SocketStream(url, delegate)); |
| return job; |
| } |
| |
| const std::string& scheme = url.scheme(); // already lowercase |
| |
| base::AutoLock locked(lock_); |
| FactoryMap::const_iterator found = factories_.find(scheme); |
| if (found != factories_.end()) { |
| SocketStreamJob* job = found->second(url, delegate); |
| if (job) |
| return job; |
| } |
| SocketStreamJob* job = new SocketStreamJob(); |
| job->InitSocketStream(new SocketStream(url, delegate)); |
| return job; |
| } |
| |
| SocketStreamJob::ProtocolFactory* |
| SocketStreamJobManager::RegisterProtocolFactory( |
| const std::string& scheme, SocketStreamJob::ProtocolFactory* factory) { |
| base::AutoLock locked(lock_); |
| |
| SocketStreamJob::ProtocolFactory* old_factory; |
| FactoryMap::iterator found = factories_.find(scheme); |
| if (found != factories_.end()) { |
| old_factory = found->second; |
| } else { |
| old_factory = NULL; |
| } |
| if (factory) { |
| factories_[scheme] = factory; |
| } else if (found != factories_.end()) { |
| factories_.erase(found); |
| } |
| return old_factory; |
| } |
| |
| } // namespace net |