Home | History | Annotate | Download | only in media
      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