1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "webkit/glue/media/web_data_source_factory.h" 6 7 #include "base/logging.h" 8 9 namespace webkit_glue { 10 11 class WebDataSourceFactory::BuildRequest 12 : public media::AsyncDataSourceFactoryBase::BuildRequest { 13 public: 14 BuildRequest(const std::string& url, BuildCallback* callback, 15 WebDataSource* data_source, 16 WebDataSourceBuildObserverHack* build_observer); 17 virtual ~BuildRequest(); 18 19 protected: 20 // AsyncDataSourceFactoryBase::BuildRequest method. 21 virtual void DoStart(); 22 23 private: 24 void InitDone(media::PipelineStatus status); 25 26 scoped_refptr<WebDataSource> data_source_; 27 WebDataSourceBuildObserverHack* build_observer_; 28 29 DISALLOW_COPY_AND_ASSIGN(BuildRequest); 30 }; 31 32 WebDataSourceFactory::WebDataSourceFactory( 33 MessageLoop* render_loop, 34 WebKit::WebFrame* frame, 35 FactoryFunction factory_function, 36 WebDataSourceBuildObserverHack* build_observer) 37 : render_loop_(render_loop), 38 frame_(frame), 39 factory_function_(factory_function), 40 build_observer_(build_observer) { 41 DCHECK(render_loop_); 42 DCHECK(frame_); 43 DCHECK(factory_function_); 44 } 45 46 WebDataSourceFactory::~WebDataSourceFactory() {} 47 48 media::DataSourceFactory* WebDataSourceFactory::Clone() const { 49 return new WebDataSourceFactory(render_loop_, frame_, factory_function_, 50 build_observer_); 51 } 52 53 bool WebDataSourceFactory::AllowRequests() const { 54 return true; 55 } 56 57 media::AsyncDataSourceFactoryBase::BuildRequest* 58 WebDataSourceFactory::CreateRequest(const std::string& url, 59 BuildCallback* callback) { 60 WebDataSource* data_source = factory_function_(render_loop_, frame_); 61 62 return new WebDataSourceFactory::BuildRequest(url, callback, data_source, 63 build_observer_); 64 } 65 66 WebDataSourceFactory::BuildRequest::BuildRequest( 67 const std::string& url, 68 BuildCallback* callback, 69 WebDataSource* data_source, 70 WebDataSourceBuildObserverHack* build_observer) 71 : AsyncDataSourceFactoryBase::BuildRequest(url, callback), 72 data_source_(data_source), 73 build_observer_(build_observer) { 74 } 75 76 WebDataSourceFactory::BuildRequest::~BuildRequest() { 77 if (data_source_.get()) { 78 data_source_->CancelInitialize(); 79 data_source_ = NULL; 80 } 81 } 82 83 void WebDataSourceFactory::BuildRequest::DoStart() { 84 data_source_->Initialize(url(), NewCallback(this, &BuildRequest::InitDone)); 85 } 86 87 void WebDataSourceFactory::BuildRequest::InitDone( 88 media::PipelineStatus status) { 89 scoped_refptr<WebDataSource> data_source; 90 91 data_source = (status == media::PIPELINE_OK) ? data_source_ : NULL; 92 data_source_ = NULL; 93 94 if (build_observer_ && data_source.get()) { 95 build_observer_->Run(data_source.get()); 96 } 97 98 RequestComplete(status, data_source); 99 // Don't do anything after this line. This object is deleted by 100 // RequestComplete(). 101 } 102 103 } // namespace webkit_glue 104