blob: e60fe7fbf870a3b060306daf0fcc9fa1073e9121 [file] [log] [blame]
// Copyright 2016 The Fuchsia 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 "garnet/bin/flog_viewer/channel_handler.h"
#include "garnet/bin/flog_viewer/flog_viewer.h"
#include "garnet/bin/flog_viewer/handlers/default.h"
#include "garnet/bin/flog_viewer/handlers/media_demux.h"
#include "garnet/bin/flog_viewer/handlers/media_packet_consumer.h"
#include "garnet/bin/flog_viewer/handlers/media_packet_producer.h"
#include "garnet/bin/flog_viewer/handlers/media_player.h"
#include "garnet/bin/flog_viewer/handlers/media_renderer.h"
#include "garnet/bin/flog_viewer/handlers/media_sink.h"
#include "garnet/bin/flog_viewer/handlers/media_source.h"
#include "garnet/bin/flog_viewer/handlers/media_timeline_control_point.h"
#include "garnet/bin/flog_viewer/handlers/media_type_converter.h"
namespace flog {
// static
const std::string ChannelHandler::kFormatTerse = "terse";
// static
const std::string ChannelHandler::kFormatFull = "full";
// static
const std::string ChannelHandler::kFormatDigest = "digest";
// static
std::unique_ptr<ChannelHandler> ChannelHandler::Create(
const std::string& type_name,
const std::string& format,
ChannelManager* manager) {
ChannelHandler* handler = nullptr;
// When implementing a new handler, add logic here for creating an instance.
if (type_name == handlers::MediaPlayer::Name_) {
handler = new handlers::MediaPlayer(format);
} else if (type_name == handlers::MediaTypeConverter::Name_) {
handler = new handlers::MediaTypeConverter(format);
} else if (type_name == handlers::MediaDemux::Name_) {
handler = new handlers::MediaDemux(format);
} else if (type_name == handlers::MediaPacketProducer::Name_) {
handler = new handlers::MediaPacketProducer(format);
} else if (type_name == handlers::MediaPacketConsumer::Name_) {
handler = new handlers::MediaPacketConsumer(format);
} else if (type_name == handlers::MediaRenderer::Name_) {
handler = new handlers::MediaRenderer(format);
} else if (type_name == handlers::MediaSink::Name_) {
handler = new handlers::MediaSink(format);
} else if (type_name == handlers::MediaSource::Name_) {
handler = new handlers::MediaSource(format);
} else if (type_name == handlers::MediaTimelineControlPoint::Name_) {
handler = new handlers::MediaTimelineControlPoint(format);
}
if (handler == nullptr) {
handler = new handlers::Default(format);
}
handler->manager_ = manager;
return std::unique_ptr<ChannelHandler>(handler);
}
ChannelHandler::ChannelHandler(const std::string& format) : format_(format) {}
ChannelHandler::~ChannelHandler() {}
void ChannelHandler::HandleMessage(std::shared_ptr<Channel> channel,
uint32_t entry_index,
const FlogEntryPtr& entry,
fidl::Message* message) {
channel_ = channel;
entry_index_ = entry_index;
entry_ = &entry;
HandleMessage(message);
channel_ = nullptr;
entry_index_ = 0;
entry_ = nullptr;
}
std::shared_ptr<Accumulator> ChannelHandler::GetAccumulator() {
return nullptr;
}
std::shared_ptr<Channel> ChannelHandler::AsChannel(uint64_t subject_address) {
FXL_DCHECK(manager_ != nullptr);
return manager_->FindChannelBySubjectAddress(channel_->log_id(),
subject_address);
}
void ChannelHandler::BindAs(uint64_t koid) {
FXL_DCHECK(manager_ != nullptr);
manager_->BindAs(channel_, koid);
}
void ChannelHandler::SetBindingKoid(Binding* binding, uint64_t koid) {
FXL_DCHECK(binding != nullptr);
FXL_DCHECK(koid != 0);
FXL_DCHECK(manager_ != nullptr);
manager_->SetBindingKoid(binding, koid);
}
} // namespace flog