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
WebDataSourceFactory(MessageLoop * render_loop,WebKit::WebFrame * frame,FactoryFunction factory_function,WebDataSourceBuildObserverHack * build_observer)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
~WebDataSourceFactory()46 WebDataSourceFactory::~WebDataSourceFactory() {}
47
Clone() const48 media::DataSourceFactory* WebDataSourceFactory::Clone() const {
49 return new WebDataSourceFactory(render_loop_, frame_, factory_function_,
50 build_observer_);
51 }
52
AllowRequests() const53 bool WebDataSourceFactory::AllowRequests() const {
54 return true;
55 }
56
57 media::AsyncDataSourceFactoryBase::BuildRequest*
CreateRequest(const std::string & url,BuildCallback * callback)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
BuildRequest(const std::string & url,BuildCallback * callback,WebDataSource * data_source,WebDataSourceBuildObserverHack * build_observer)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
~BuildRequest()76 WebDataSourceFactory::BuildRequest::~BuildRequest() {
77 if (data_source_.get()) {
78 data_source_->CancelInitialize();
79 data_source_ = NULL;
80 }
81 }
82
DoStart()83 void WebDataSourceFactory::BuildRequest::DoStart() {
84 data_source_->Initialize(url(), NewCallback(this, &BuildRequest::InitDone));
85 }
86
InitDone(media::PipelineStatus status)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