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