OLD | NEW |
| (Empty) |
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/bind.h" | |
8 #include "base/logging.h" | |
9 #include "media/base/media_log.h" | |
10 | |
11 namespace webkit_glue { | |
12 | |
13 class WebDataSourceFactory::BuildRequest | |
14 : public media::AsyncDataSourceFactoryBase::BuildRequest { | |
15 public: | |
16 BuildRequest(const std::string& url, const BuildCallback& callback, | |
17 WebDataSource* data_source, | |
18 const WebDataSourceBuildObserverHack& build_observer); | |
19 virtual ~BuildRequest(); | |
20 | |
21 protected: | |
22 // AsyncDataSourceFactoryBase::BuildRequest method. | |
23 virtual void DoStart(); | |
24 | |
25 private: | |
26 void InitDone(media::PipelineStatus status); | |
27 | |
28 scoped_refptr<WebDataSource> data_source_; | |
29 WebDataSourceBuildObserverHack build_observer_; | |
30 | |
31 DISALLOW_COPY_AND_ASSIGN(BuildRequest); | |
32 }; | |
33 | |
34 WebDataSourceFactory::WebDataSourceFactory( | |
35 MessageLoop* render_loop, | |
36 WebKit::WebFrame* frame, | |
37 media::MediaLog* media_log, | |
38 FactoryFunction factory_function, | |
39 const WebDataSourceBuildObserverHack& build_observer) | |
40 : render_loop_(render_loop), | |
41 frame_(frame), | |
42 media_log_(media_log), | |
43 factory_function_(factory_function), | |
44 build_observer_(build_observer) { | |
45 DCHECK(render_loop_); | |
46 DCHECK(frame_); | |
47 DCHECK(media_log_); | |
48 DCHECK(factory_function_); | |
49 } | |
50 | |
51 WebDataSourceFactory::~WebDataSourceFactory() {} | |
52 | |
53 media::DataSourceFactory* WebDataSourceFactory::Clone() const { | |
54 return new WebDataSourceFactory(render_loop_, frame_, media_log_, | |
55 factory_function_, build_observer_); | |
56 } | |
57 | |
58 bool WebDataSourceFactory::AllowRequests() const { | |
59 return true; | |
60 } | |
61 | |
62 media::AsyncDataSourceFactoryBase::BuildRequest* | |
63 WebDataSourceFactory::CreateRequest(const std::string& url, | |
64 const BuildCallback& callback) { | |
65 WebDataSource* data_source = factory_function_(render_loop_, frame_, | |
66 media_log_); | |
67 | |
68 return new WebDataSourceFactory::BuildRequest(url, callback, data_source, | |
69 build_observer_); | |
70 } | |
71 | |
72 WebDataSourceFactory::BuildRequest::BuildRequest( | |
73 const std::string& url, | |
74 const BuildCallback& callback, | |
75 WebDataSource* data_source, | |
76 const WebDataSourceBuildObserverHack& build_observer) | |
77 : AsyncDataSourceFactoryBase::BuildRequest(url, callback), | |
78 data_source_(data_source), | |
79 build_observer_(build_observer) { | |
80 } | |
81 | |
82 WebDataSourceFactory::BuildRequest::~BuildRequest() { | |
83 if (data_source_.get()) { | |
84 data_source_->CancelInitialize(); | |
85 data_source_ = NULL; | |
86 } | |
87 } | |
88 | |
89 void WebDataSourceFactory::BuildRequest::DoStart() { | |
90 data_source_->Initialize(url(), base::Bind(&BuildRequest::InitDone, | |
91 base::Unretained(this))); | |
92 } | |
93 | |
94 void WebDataSourceFactory::BuildRequest::InitDone( | |
95 media::PipelineStatus status) { | |
96 scoped_refptr<WebDataSource> data_source; | |
97 | |
98 data_source = (status == media::PIPELINE_OK) ? data_source_ : NULL; | |
99 data_source_ = NULL; | |
100 | |
101 if (!build_observer_.is_null() && data_source.get()) { | |
102 build_observer_.Run(data_source.get()); | |
103 } | |
104 | |
105 RequestComplete(status, data_source); | |
106 // Don't do anything after this line. This object is deleted by | |
107 // RequestComplete(). | |
108 } | |
109 | |
110 } // namespace webkit_glue | |
OLD | NEW |