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