blob: 2c796b59d5e7a8b6d0e346e2e3c76e57acdc8009 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_METRICS_CAST_EVENT_BUILDER_H_
#define CHROMECAST_METRICS_CAST_EVENT_BUILDER_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
namespace base {
class TimeTicks;
} // namespace base
namespace metrics {
class CastLogsProto_CastEventProto;
}
namespace net {
class IPAddressBytes;
}
namespace chromecast {
// Builder for CastLogsProto_CastEventProto.
class CastEventBuilder {
public:
// TODO(sanfin): as in the Build() method below, ideally this should just be
// the proto-generated enum, but we don't want to depend on the metrics
// component for now (in particular, because this requires generating the
// proto headers before compiling any translation unit that #includes this
// header, which is complicated by the fact that some code uses this header
// that is compiled outside the gn build system.)
enum LaunchFrom {
FROM_UNKNOWN,
FROM_LOCAL,
FROM_DIAL,
FROM_CAST_V2,
FROM_CCS,
};
// This is used to preclude a header file dependency on the header generated
// from third_party/metrics_proto/cast_logs.proto.
static void SetLaunchFromProto(::metrics::CastLogsProto_CastEventProto* out,
LaunchFrom launch_from);
virtual ~CastEventBuilder() {}
// Returns the unhashed event name set for this builder.
virtual std::string GetName() = 0;
virtual CastEventBuilder& SetName(const std::string& name) = 0;
virtual CastEventBuilder& SetTime(const base::TimeTicks& time) = 0;
virtual CastEventBuilder& SetTimezoneId(const std::string& timezone_id) = 0;
virtual CastEventBuilder& SetAppId(const std::string& app_id) = 0;
virtual CastEventBuilder& SetRemoteAppId(
const std::string& remote_app_id) = 0;
virtual CastEventBuilder& SetSessionId(const std::string& session_id) = 0;
virtual CastEventBuilder& SetSdkVersion(const std::string& sdk_version) = 0;
virtual CastEventBuilder& SetMplVersion(const std::string& mpl_version) = 0;
virtual CastEventBuilder& SetConnectionInfo(
const std::string& transport_connection_id,
const std::string& virtual_connection_id) = 0;
virtual CastEventBuilder& SetGroupUuid(const std::string& group_uuid) = 0;
virtual CastEventBuilder& SetExtraValue(int64_t extra_value) = 0;
virtual CastEventBuilder& SetConversationKey(
const std::string& conversation_key) = 0;
virtual CastEventBuilder& SetRequestId(int32_t request_id) = 0;
virtual CastEventBuilder& SetEventId(const std::string& event_id) = 0;
virtual CastEventBuilder& SetAoghRequestId(const std::string& request_id) = 0;
virtual CastEventBuilder& SetAoghLocalDeviceId(int64_t local_id) = 0;
virtual CastEventBuilder& SetAoghAgentId(const std::string& agent_id) = 0;
virtual CastEventBuilder& SetAoghStandardAgentId(
const std::string& standard_agent_id) = 0;
virtual CastEventBuilder& SetUiVersion(const std::string& ui_version) = 0;
virtual CastEventBuilder& SetAuditReport(const std::string& audit_report) = 0;
virtual CastEventBuilder& SetDuoCoreVersion(int64_t version) = 0;
virtual CastEventBuilder& SetHotwordModelId(const std::string& model_id) = 0;
// Only used for reporting discovery related events. Sets the application
// subtype related to the event, where |app_id| is the 8-byte hex string
// for the given V2 app.
virtual CastEventBuilder& SetDiscoveryAppSubtype(
const std::string& app_id) = 0;
// Only used for reporting discovery related events. Sets the namespace
// subtype related to the event, where |namespace_hash| is the SHA-1 hash
// string for the given V2 app namespace.
virtual CastEventBuilder& SetDiscoveryNamespaceSubtype(
const std::string& namespace_hash) = 0;
// Only used for reporting discovery related events. Sets the sender IP
// address associated with the given event. Used to track requests and
// responses on a per sender basis. |sender_ip| is a vector containing each
// byte in the IP address in network order.
virtual CastEventBuilder& SetDiscoverySender(
const net::IPAddressBytes& sender_ip) = 0;
// Only used for reported discovery related events. Sets/unsets the unicast
// flag used to specify what type of discovery is occurring, and to compare
// unicast vs. multicast usage and reliability.
//
// TODO(maclellant): Refactor discovery metrics into more general events that
// can be shared between all the discovery protocols. Right now this unicast
// flag is really only specific to MDNS to signal the type of request or
// response.
virtual CastEventBuilder& SetDiscoveryUnicastFlag(bool uses_unicast) = 0;
virtual CastEventBuilder& SetFeatureVector(
const std::vector<float>& features) = 0;
virtual CastEventBuilder& AddMetadata(const std::string& name,
int64_t value) = 0;
virtual CastEventBuilder& SetLaunchFrom(LaunchFrom launch_from) = 0;
// Populates fields from the provided CastEventProto. Similar to the protobuf
// MergeFrom method, singular fields are overwritten and repeated fields like
// metadata are concatenated.
virtual CastEventBuilder& MergeFrom(
const ::metrics::CastLogsProto_CastEventProto* event_proto) = 0;
// Build the proto, caller takes ownership.
// TODO(gfhuang): Ideally this should be std::unique_ptr, but we don't want to
// have cast to depend on metrics component for now.
virtual ::metrics::CastLogsProto_CastEventProto* Build() = 0;
};
} // namespace chromecast
#endif // CHROMECAST_METRICS_CAST_EVENT_BUILDER_H_