// 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 "webkit/glue/media/web_data_source_factory.h" #include "base/logging.h" namespace webkit_glue { class WebDataSourceFactory::BuildRequest : public media::AsyncDataSourceFactoryBase::BuildRequest { public: BuildRequest(const std::string& url, BuildCallback* callback, WebDataSource* data_source, WebDataSourceBuildObserverHack* build_observer); virtual ~BuildRequest(); protected: // AsyncDataSourceFactoryBase::BuildRequest method. virtual void DoStart(); private: void InitDone(media::PipelineStatus status); scoped_refptr<WebDataSource> data_source_; WebDataSourceBuildObserverHack* build_observer_; DISALLOW_COPY_AND_ASSIGN(BuildRequest); }; WebDataSourceFactory::WebDataSourceFactory( MessageLoop* render_loop, WebKit::WebFrame* frame, FactoryFunction factory_function, WebDataSourceBuildObserverHack* build_observer) : render_loop_(render_loop), frame_(frame), factory_function_(factory_function), build_observer_(build_observer) { DCHECK(render_loop_); DCHECK(frame_); DCHECK(factory_function_); } WebDataSourceFactory::~WebDataSourceFactory() {} media::DataSourceFactory* WebDataSourceFactory::Clone() const { return new WebDataSourceFactory(render_loop_, frame_, factory_function_, build_observer_); } bool WebDataSourceFactory::AllowRequests() const { return true; } media::AsyncDataSourceFactoryBase::BuildRequest* WebDataSourceFactory::CreateRequest(const std::string& url, BuildCallback* callback) { WebDataSource* data_source = factory_function_(render_loop_, frame_); return new WebDataSourceFactory::BuildRequest(url, callback, data_source, build_observer_); } WebDataSourceFactory::BuildRequest::BuildRequest( const std::string& url, BuildCallback* callback, WebDataSource* data_source, WebDataSourceBuildObserverHack* build_observer) : AsyncDataSourceFactoryBase::BuildRequest(url, callback), data_source_(data_source), build_observer_(build_observer) { } WebDataSourceFactory::BuildRequest::~BuildRequest() { if (data_source_.get()) { data_source_->CancelInitialize(); data_source_ = NULL; } } void WebDataSourceFactory::BuildRequest::DoStart() { data_source_->Initialize(url(), NewCallback(this, &BuildRequest::InitDone)); } void WebDataSourceFactory::BuildRequest::InitDone( media::PipelineStatus status) { scoped_refptr<WebDataSource> data_source; data_source = (status == media::PIPELINE_OK) ? data_source_ : NULL; data_source_ = NULL; if (build_observer_ && data_source.get()) { build_observer_->Run(data_source.get()); } RequestComplete(status, data_source); // Don't do anything after this line. This object is deleted by // RequestComplete(). } } // namespace webkit_glue