1472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/*
2472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * Copyright (C) 2005-2016 The Android Open Source Project
3472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn *
4472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
5472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * you may not use this file except in compliance with the License.
6472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * You may obtain a copy of the License at
7472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn *
8472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
9472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn *
10472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * Unless required by applicable law or agreed to in writing, software
11472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
12472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * See the License for the specific language governing permissions and
14472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * limitations under the License.
15472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn */
16472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
17472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifndef _LIBS_LOG_EVENT_LIST_H
18472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define _LIBS_LOG_EVENT_LIST_H
19472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
207ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn#include <errno.h>
21472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#include <stdint.h>
22472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
23472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#if (defined(__cplusplus) && defined(_USING_LIBCXX))
24472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynextern "C++" {
25472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#include <string>
26472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn}
27472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
28472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
29472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#include <log/log.h>
30472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
31472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifdef __cplusplus
32472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynextern "C" {
33472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
34472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
35472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifndef __ANDROID_USE_LIBLOG_EVENT_INTERFACE
36472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifndef __ANDROID_API__
37472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define __ANDROID_USE_LIBLOG_EVENT_INTERFACE 1
38472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#elif __ANDROID_API__ > 23 /* > Marshmallow */
39472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define __ANDROID_USE_LIBLOG_EVENT_INTERFACE 1
40472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#else
41472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define __ANDROID_USE_LIBLOG_EVENT_INTERFACE 0
42472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
43472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
44472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
45472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#if __ANDROID_USE_LIBLOG_EVENT_INTERFACE
46472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
47472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/* For manipulating lists of events. */
48472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
49472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define ANDROID_MAX_LIST_NEST_DEPTH 8
50472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
51472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/*
52472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * The opaque context used to manipulate lists of events.
53472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn */
54472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifndef __android_log_context_defined
55472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define __android_log_context_defined
56472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyntypedef struct android_log_context_internal* android_log_context;
57472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
58472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
59472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/*
60472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * Elements returned when reading a list of events.
61472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn */
62472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifndef __android_log_list_element_defined
63472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define __android_log_list_element_defined
64472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyntypedef struct {
652ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  AndroidEventLogType type;
662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t complete;
672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t len;
682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  union {
692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int32_t int32;
702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int64_t int64;
712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    char* string;
722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    float float32;
732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  } data;
74472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn} android_log_list_element;
75472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
76472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
77472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/*
78472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * Creates a context associated with an event tag to write elements to
79472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * the list of events.
80472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn */
81472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynandroid_log_context create_android_logger(uint32_t tag);
82472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
83472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/* All lists must be braced by a begin and end call */
84472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/*
85472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * NB: If the first level braces are missing when specifying multiple
86472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn *     elements, we will manufacturer a list to embrace it for your API
87472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn *     convenience. For a single element, it will remain solitary.
88472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn */
89472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_list_begin(android_log_context ctx);
90472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_list_end(android_log_context ctx);
91472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
92472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_int32(android_log_context ctx, int32_t value);
93472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_int64(android_log_context ctx, int64_t value);
94472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_string8(android_log_context ctx, const char* value);
952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint android_log_write_string8_len(android_log_context ctx, const char* value,
962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                  size_t maxlen);
97472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_float32(android_log_context ctx, float value);
98472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
99472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/* Submit the composed list context to the specified logger id */
100472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/* NB: LOG_ID_EVENTS and LOG_ID_SECURITY only valid binary buffers */
101472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_write_list(android_log_context ctx, log_id_t id);
102472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
103472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/*
104472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn * Creates a context from a raw buffer representing a list of events to be read.
105472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn */
106472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynandroid_log_context create_android_log_parser(const char* msg, size_t len);
107472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
108472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynandroid_log_list_element android_log_read_next(android_log_context ctx);
109472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynandroid_log_list_element android_log_peek_next(android_log_context ctx);
110472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
111472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/* Finished with reader or writer context */
112472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynint android_log_destroy(android_log_context* ctx);
113472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
114472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifdef __cplusplus
115472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifndef __class_android_log_event_list_defined
116472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#define __class_android_log_event_list_defined
117472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn/* android_log_list C++ helpers */
118472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynextern "C++" {
119472245d9625b8f0c52737aa8753524facfa211dbMark Salyzynclass android_log_event_list {
1202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  friend class __android_log_event_list;
1212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1222ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn private:
1232ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_context ctx;
1242ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int ret;
1252ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1262ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list(const android_log_event_list&) = delete;
1272ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  void operator=(const android_log_event_list&) = delete;
1282ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1292ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn public:
1302ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  explicit android_log_event_list(int tag) : ret(0) {
1312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    ctx = create_android_logger(static_cast<uint32_t>(tag));
1322ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  explicit android_log_event_list(log_msg& log_msg) : ret(0) {
13491794ca2751a627e8db92c807dc4befb21d11247Yao Chen    ctx = create_android_log_parser(log_msg.msg() + sizeof(uint32_t),
1352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                    log_msg.entry.len - sizeof(uint32_t));
1362ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ~android_log_event_list() {
1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    android_log_destroy(&ctx);
1392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int close() {
1422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_destroy(&ctx);
1432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return retval;
1452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  /* To allow above C calls to use this class as parameter */
1482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  operator android_log_context() const {
1492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ctx;
1502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1527ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn  /* return errors or transmit status */
1532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int status() const {
1542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
1552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int begin() {
1582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_list_begin(ctx);
1592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
1612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int end() {
1632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_list_end(ctx);
1642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1652ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
1662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(int32_t value) {
1692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_int32(ctx, value);
1702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
1722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(uint32_t value) {
1752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_int32(ctx, static_cast<int32_t>(value));
1762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
1782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
180e09e9a503effcc955b0a11d012916d9fb2554215Mark Salyzyn  android_log_event_list& operator<<(bool value) {
181e09e9a503effcc955b0a11d012916d9fb2554215Mark Salyzyn    int retval = android_log_write_int32(ctx, value ? 1 : 0);
182e09e9a503effcc955b0a11d012916d9fb2554215Mark Salyzyn    if (retval < 0) ret = retval;
183e09e9a503effcc955b0a11d012916d9fb2554215Mark Salyzyn    return *this;
184e09e9a503effcc955b0a11d012916d9fb2554215Mark Salyzyn  }
185e09e9a503effcc955b0a11d012916d9fb2554215Mark Salyzyn
1862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(int64_t value) {
1872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_int64(ctx, value);
1882ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
1902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(uint64_t value) {
1932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_int64(ctx, static_cast<int64_t>(value));
1942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
1952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
1962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
1982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(const char* value) {
1992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_string8(ctx, value);
2002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
2022ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
203472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
204472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#if defined(_USING_LIBCXX)
2052ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(const std::string& value) {
2062ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval =
2072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn        android_log_write_string8_len(ctx, value.data(), value.length());
2082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2092ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
2102ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
211472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
212472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
2132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_event_list& operator<<(float value) {
2142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_float32(ctx, value);
2152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2162ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return *this;
2172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2182ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int write(log_id_t id = LOG_ID_EVENTS) {
2207ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn    /* facilitate -EBUSY retry */
2217ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn    if ((ret == -EBUSY) || (ret > 0)) ret = 0;
2222ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_list(ctx, id);
2237ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn    /* existing errors trump transmission errors */
2247ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn    if (!ret) ret = retval;
2252ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
2262ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2272ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2282ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int operator<<(log_id_t id) {
2297ecfd6ac10957ff392dda713e983cb6b09b2b203Mark Salyzyn    write(id);
2302ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    android_log_destroy(&ctx);
2312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
2322ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  /*
2352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn   * Append<Type> methods removes any integer promotion
2362ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn   * confusion, and adds access to string with length.
2372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn   * Append methods are also added for all types for
2382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn   * convenience.
2392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn   */
2402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool AppendInt(int32_t value) {
2422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_int32(ctx, value);
2432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool AppendLong(int64_t value) {
2482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_int64(ctx, value);
2492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2522ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool AppendString(const char* value) {
2542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_string8(ctx, value);
2552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool AppendString(const char* value, size_t len) {
2602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_string8_len(ctx, value, len);
2612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
264472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
265472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#if defined(_USING_LIBCXX)
2662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool AppendString(const std::string& value) {
2672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval =
2682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn        android_log_write_string8_len(ctx, value.data(), value.length());
2692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
2712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool Append(const std::string& value) {
2742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval =
2752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn        android_log_write_string8_len(ctx, value.data(), value.length());
2762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret;
2782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
279472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
280472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
2812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool AppendFloat(float value) {
2822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_float32(ctx, value);
2832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2852ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  template <typename Tvalue>
2882ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool Append(Tvalue value) {
2892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    *this << value;
2902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool Append(const char* value, size_t len) {
2942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    int retval = android_log_write_string8_len(ctx, value, len);
2952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (retval < 0) ret = retval;
2962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return ret >= 0;
2972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
2982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn
2992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_list_element read() {
3002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return android_log_read_next(ctx);
3012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
3022ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_log_list_element peek() {
3032ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return android_log_peek_next(ctx);
3042ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
305472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn};
306472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn}
307472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
308472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
309472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
310472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif /* __ANDROID_USE_LIBLOG_EVENT_INTERFACE */
311472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
312472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#ifdef __cplusplus
313472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn}
314472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif
315472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn
316472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#endif /* _LIBS_LOG_EVENT_LIST_H */
317