blob: 4df0dcf8adc1bb559c54c8579e27a70d02c621da [file] [log] [blame]
// 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/media/web_data_source_factory.h"
#include "base/bind.h"
#include "base/logging.h"
#include "media/base/media_log.h"
namespace webkit_media {
class WebDataSourceFactory::BuildRequest
: public media::AsyncDataSourceFactoryBase::BuildRequest {
public:
BuildRequest(const std::string& url, const BuildCallback& callback,
WebDataSource* data_source,
const 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,
media::MediaLog* media_log,
FactoryFunction factory_function,
const WebDataSourceBuildObserverHack& build_observer)
: render_loop_(render_loop),
frame_(frame),
media_log_(media_log),
factory_function_(factory_function),
build_observer_(build_observer) {
DCHECK(render_loop_);
DCHECK(frame_);
DCHECK(media_log_);
DCHECK(factory_function_);
}
WebDataSourceFactory::~WebDataSourceFactory() {}
media::DataSourceFactory* WebDataSourceFactory::Clone() const {
return new WebDataSourceFactory(render_loop_, frame_, media_log_,
factory_function_, build_observer_);
}
bool WebDataSourceFactory::AllowRequests() const {
return true;
}
media::AsyncDataSourceFactoryBase::BuildRequest*
WebDataSourceFactory::CreateRequest(const std::string& url,
const BuildCallback& callback) {
WebDataSource* data_source = factory_function_(render_loop_, frame_,
media_log_);
return new WebDataSourceFactory::BuildRequest(url, callback, data_source,
build_observer_);
}
WebDataSourceFactory::BuildRequest::BuildRequest(
const std::string& url,
const BuildCallback& callback,
WebDataSource* data_source,
const 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(), base::Bind(&BuildRequest::InitDone,
base::Unretained(this)));
}
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_.is_null() && 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_media