// 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