14ea13dcd270953215f51345e83708c16963d332fMathias Agopian/* 24ea13dcd270953215f51345e83708c16963d332fMathias Agopian * Copyright (C) 2006 The Android Open Source Project 34ea13dcd270953215f51345e83708c16963d332fMathias Agopian * 44ea13dcd270953215f51345e83708c16963d332fMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 54ea13dcd270953215f51345e83708c16963d332fMathias Agopian * you may not use this file except in compliance with the License. 64ea13dcd270953215f51345e83708c16963d332fMathias Agopian * You may obtain a copy of the License at 74ea13dcd270953215f51345e83708c16963d332fMathias Agopian * 84ea13dcd270953215f51345e83708c16963d332fMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 94ea13dcd270953215f51345e83708c16963d332fMathias Agopian * 104ea13dcd270953215f51345e83708c16963d332fMathias Agopian * Unless required by applicable law or agreed to in writing, software 114ea13dcd270953215f51345e83708c16963d332fMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 124ea13dcd270953215f51345e83708c16963d332fMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ea13dcd270953215f51345e83708c16963d332fMathias Agopian * See the License for the specific language governing permissions and 144ea13dcd270953215f51345e83708c16963d332fMathias Agopian * limitations under the License. 154ea13dcd270953215f51345e83708c16963d332fMathias Agopian */ 164ea13dcd270953215f51345e83708c16963d332fMathias Agopian 17f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen#ifndef ANDROID_HARDWARE_TEXTOUTPUT_H 18f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen#define ANDROID_HARDWARE_TEXTOUTPUT_H 194ea13dcd270953215f51345e83708c16963d332fMathias Agopian 204ea13dcd270953215f51345e83708c16963d332fMathias Agopian#include <utils/Errors.h> 21a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang#include <utils/String8.h> 224ea13dcd270953215f51345e83708c16963d332fMathias Agopian 234ea13dcd270953215f51345e83708c16963d332fMathias Agopian#include <stdint.h> 244ea13dcd270953215f51345e83708c16963d332fMathias Agopian#include <string.h> 258a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang#include <sstream> 264ea13dcd270953215f51345e83708c16963d332fMathias Agopian 274ea13dcd270953215f51345e83708c16963d332fMathias Agopian// --------------------------------------------------------------------------- 284ea13dcd270953215f51345e83708c16963d332fMathias Agopiannamespace android { 29f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenennamespace hardware { 3069c328d4373f26f712e259302a97431cbc27b74bJeff Sharkey 314ea13dcd270953215f51345e83708c16963d332fMathias Agopianclass TextOutput 324ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 334ea13dcd270953215f51345e83708c16963d332fMathias Agopianpublic: 344ea13dcd270953215f51345e83708c16963d332fMathias Agopian TextOutput(); 354ea13dcd270953215f51345e83708c16963d332fMathias Agopian virtual ~TextOutput(); 364ea13dcd270953215f51345e83708c16963d332fMathias Agopian 374ea13dcd270953215f51345e83708c16963d332fMathias Agopian virtual status_t print(const char* txt, size_t len) = 0; 384ea13dcd270953215f51345e83708c16963d332fMathias Agopian virtual void moveIndent(int delta) = 0; 394ea13dcd270953215f51345e83708c16963d332fMathias Agopian 404ea13dcd270953215f51345e83708c16963d332fMathias Agopian class Bundle { 414ea13dcd270953215f51345e83708c16963d332fMathias Agopian public: 424ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline Bundle(TextOutput& to) : mTO(to) { to.pushBundle(); } 434ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline ~Bundle() { mTO.popBundle(); } 444ea13dcd270953215f51345e83708c16963d332fMathias Agopian private: 454ea13dcd270953215f51345e83708c16963d332fMathias Agopian TextOutput& mTO; 464ea13dcd270953215f51345e83708c16963d332fMathias Agopian }; 474ea13dcd270953215f51345e83708c16963d332fMathias Agopian 484ea13dcd270953215f51345e83708c16963d332fMathias Agopian virtual void pushBundle() = 0; 494ea13dcd270953215f51345e83708c16963d332fMathias Agopian virtual void popBundle() = 0; 504ea13dcd270953215f51345e83708c16963d332fMathias Agopian}; 514ea13dcd270953215f51345e83708c16963d332fMathias Agopian 524ea13dcd270953215f51345e83708c16963d332fMathias Agopian// --------------------------------------------------------------------------- 534ea13dcd270953215f51345e83708c16963d332fMathias Agopian 544ea13dcd270953215f51345e83708c16963d332fMathias Agopian// Text output stream for printing to the log (via utils/Log.h). 554ea13dcd270953215f51345e83708c16963d332fMathias Agopianextern TextOutput& alog; 564ea13dcd270953215f51345e83708c16963d332fMathias Agopian 574ea13dcd270953215f51345e83708c16963d332fMathias Agopian// Text output stream for printing to stdout. 584ea13dcd270953215f51345e83708c16963d332fMathias Agopianextern TextOutput& aout; 594ea13dcd270953215f51345e83708c16963d332fMathias Agopian 604ea13dcd270953215f51345e83708c16963d332fMathias Agopian// Text output stream for printing to stderr. 614ea13dcd270953215f51345e83708c16963d332fMathias Agopianextern TextOutput& aerr; 624ea13dcd270953215f51345e83708c16963d332fMathias Agopian 634ea13dcd270953215f51345e83708c16963d332fMathias Agopiantypedef TextOutput& (*TextOutputManipFunc)(TextOutput&); 644ea13dcd270953215f51345e83708c16963d332fMathias Agopian 654ea13dcd270953215f51345e83708c16963d332fMathias AgopianTextOutput& endl(TextOutput& to); 664ea13dcd270953215f51345e83708c16963d332fMathias AgopianTextOutput& indent(TextOutput& to); 674ea13dcd270953215f51345e83708c16963d332fMathias AgopianTextOutput& dedent(TextOutput& to); 684ea13dcd270953215f51345e83708c16963d332fMathias Agopian 698a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wangtemplate<typename T> 708a2e8ac7b2a44b6f37e209fa186a06326e82661eWei WangTextOutput& operator<<(TextOutput& to, const T& val) 718a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang{ 728a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang std::stringstream strbuf; 738a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang strbuf << val; 748a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang std::string str = strbuf.str(); 758a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang to.print(str.c_str(), str.size()); 768a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang return to; 778a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang} 788a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang 794ea13dcd270953215f51345e83708c16963d332fMathias AgopianTextOutput& operator<<(TextOutput& to, TextOutputManipFunc func); 804ea13dcd270953215f51345e83708c16963d332fMathias Agopian 818a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wangclass TypeCode 824ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 834ea13dcd270953215f51345e83708c16963d332fMathias Agopianpublic: 844ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline TypeCode(uint32_t code); 854ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline ~TypeCode(); 864ea13dcd270953215f51345e83708c16963d332fMathias Agopian 874ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline uint32_t typeCode() const; 888a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang 894ea13dcd270953215f51345e83708c16963d332fMathias Agopianprivate: 904ea13dcd270953215f51345e83708c16963d332fMathias Agopian uint32_t mCode; 914ea13dcd270953215f51345e83708c16963d332fMathias Agopian}; 924ea13dcd270953215f51345e83708c16963d332fMathias Agopian 934ea13dcd270953215f51345e83708c16963d332fMathias AgopianTextOutput& operator<<(TextOutput& to, const TypeCode& val); 944ea13dcd270953215f51345e83708c16963d332fMathias Agopian 954ea13dcd270953215f51345e83708c16963d332fMathias Agopianclass HexDump 964ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 974ea13dcd270953215f51345e83708c16963d332fMathias Agopianpublic: 984ea13dcd270953215f51345e83708c16963d332fMathias Agopian HexDump(const void *buf, size_t size, size_t bytesPerLine=16); 994ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline ~HexDump(); 1004ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1014ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline HexDump& setBytesPerLine(size_t bytesPerLine); 1024ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline HexDump& setSingleLineCutoff(int32_t bytes); 1034ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline HexDump& setAlignment(size_t alignment); 1044ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline HexDump& setCArrayStyle(bool enabled); 1054ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1064ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline const void* buffer() const; 1074ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline size_t size() const; 1084ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline size_t bytesPerLine() const; 1094ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline int32_t singleLineCutoff() const; 1104ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline size_t alignment() const; 1114ea13dcd270953215f51345e83708c16963d332fMathias Agopian inline bool carrayStyle() const; 1124ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1134ea13dcd270953215f51345e83708c16963d332fMathias Agopianprivate: 1144ea13dcd270953215f51345e83708c16963d332fMathias Agopian const void* mBuffer; 1154ea13dcd270953215f51345e83708c16963d332fMathias Agopian size_t mSize; 1164ea13dcd270953215f51345e83708c16963d332fMathias Agopian size_t mBytesPerLine; 1174ea13dcd270953215f51345e83708c16963d332fMathias Agopian int32_t mSingleLineCutoff; 1184ea13dcd270953215f51345e83708c16963d332fMathias Agopian size_t mAlignment; 1194ea13dcd270953215f51345e83708c16963d332fMathias Agopian bool mCArrayStyle; 1204ea13dcd270953215f51345e83708c16963d332fMathias Agopian}; 1214ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1224ea13dcd270953215f51345e83708c16963d332fMathias AgopianTextOutput& operator<<(TextOutput& to, const HexDump& val); 123a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wanginline TextOutput& operator<<(TextOutput& to, 124a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang decltype(std::endl<char, 125a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang std::char_traits<char>>) 126a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang /*val*/) { 127a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang endl(to); 128a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang return to; 129a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang} 130a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang 131a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wanginline TextOutput& operator<<(TextOutput& to, const char &c) 132a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang{ 133a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang to.print(&c, 1); 134a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang return to; 135a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang} 136a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang 137a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wanginline TextOutput& operator<<(TextOutput& to, const bool &val) 138a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang{ 139a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang if (val) to.print("true", 4); 140a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang else to.print("false", 5); 141a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang return to; 142a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang} 143a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang 144a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wanginline TextOutput& operator<<(TextOutput& to, const String16& val) 145a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang{ 146a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang to << String8(val).string(); 147a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang return to; 148a3ff00744ee8f31433ad20c3ba5062e1a855bee1Wei Wang} 1494ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1504ea13dcd270953215f51345e83708c16963d332fMathias Agopian// --------------------------------------------------------------------------- 1514ea13dcd270953215f51345e83708c16963d332fMathias Agopian// No user servicable parts below. 1524ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1534ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline TextOutput& endl(TextOutput& to) 1544ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 1554ea13dcd270953215f51345e83708c16963d332fMathias Agopian to.print("\n", 1); 1564ea13dcd270953215f51345e83708c16963d332fMathias Agopian return to; 1574ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1584ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1594ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline TextOutput& indent(TextOutput& to) 1604ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 1614ea13dcd270953215f51345e83708c16963d332fMathias Agopian to.moveIndent(1); 1624ea13dcd270953215f51345e83708c16963d332fMathias Agopian return to; 1634ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1644ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1654ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline TextOutput& dedent(TextOutput& to) 1664ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 1674ea13dcd270953215f51345e83708c16963d332fMathias Agopian to.moveIndent(-1); 1684ea13dcd270953215f51345e83708c16963d332fMathias Agopian return to; 1694ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1704ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1714ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func) 1724ea13dcd270953215f51345e83708c16963d332fMathias Agopian{ 1734ea13dcd270953215f51345e83708c16963d332fMathias Agopian return (*func)(to); 1744ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1754ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1764ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline TypeCode::TypeCode(uint32_t code) : mCode(code) { } 1774ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline TypeCode::~TypeCode() { } 1784ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline uint32_t TypeCode::typeCode() const { return mCode; } 1794ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1804ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline HexDump::~HexDump() { } 1814ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1824ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) { 1834ea13dcd270953215f51345e83708c16963d332fMathias Agopian mBytesPerLine = bytesPerLine; return *this; 1844ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1854ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) { 1864ea13dcd270953215f51345e83708c16963d332fMathias Agopian mSingleLineCutoff = bytes; return *this; 1874ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1884ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline HexDump& HexDump::setAlignment(size_t alignment) { 1894ea13dcd270953215f51345e83708c16963d332fMathias Agopian mAlignment = alignment; return *this; 1904ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1914ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline HexDump& HexDump::setCArrayStyle(bool enabled) { 1924ea13dcd270953215f51345e83708c16963d332fMathias Agopian mCArrayStyle = enabled; return *this; 1934ea13dcd270953215f51345e83708c16963d332fMathias Agopian} 1944ea13dcd270953215f51345e83708c16963d332fMathias Agopian 1954ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline const void* HexDump::buffer() const { return mBuffer; } 1964ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline size_t HexDump::size() const { return mSize; } 1974ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline size_t HexDump::bytesPerLine() const { return mBytesPerLine; } 1984ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; } 1994ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline size_t HexDump::alignment() const { return mAlignment; } 2004ea13dcd270953215f51345e83708c16963d332fMathias Agopianinline bool HexDump::carrayStyle() const { return mCArrayStyle; } 2014ea13dcd270953215f51345e83708c16963d332fMathias Agopian 2024ea13dcd270953215f51345e83708c16963d332fMathias Agopian// --------------------------------------------------------------------------- 203f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen}; // namespace hardware 2044ea13dcd270953215f51345e83708c16963d332fMathias Agopian}; // namespace android 2054ea13dcd270953215f51345e83708c16963d332fMathias Agopian 206f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen#endif // ANDROID_HARDWARE_TEXTOUTPUT_H 207