Home | History | Annotate | Download | only in binder
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_TEXTOUTPUT_H
     18 #define ANDROID_TEXTOUTPUT_H
     19 
     20 #include <utils/Errors.h>
     21 #include <utils/String8.h>
     22 
     23 #include <stdint.h>
     24 #include <string.h>
     25 #include <sstream>
     26 
     27 // ---------------------------------------------------------------------------
     28 namespace android {
     29 
     30 class TextOutput
     31 {
     32 public:
     33                         TextOutput();
     34     virtual             ~TextOutput();
     35 
     36     virtual status_t    print(const char* txt, size_t len) = 0;
     37     virtual void        moveIndent(int delta) = 0;
     38 
     39     class Bundle {
     40     public:
     41         inline Bundle(TextOutput& to) : mTO(to) { to.pushBundle(); }
     42         inline ~Bundle() { mTO.popBundle(); }
     43     private:
     44         TextOutput&     mTO;
     45     };
     46 
     47     virtual void        pushBundle() = 0;
     48     virtual void        popBundle() = 0;
     49 };
     50 
     51 // ---------------------------------------------------------------------------
     52 
     53 // Text output stream for printing to the log (via utils/Log.h).
     54 extern TextOutput& alog;
     55 
     56 // Text output stream for printing to stdout.
     57 extern TextOutput& aout;
     58 
     59 // Text output stream for printing to stderr.
     60 extern TextOutput& aerr;
     61 
     62 typedef TextOutput& (*TextOutputManipFunc)(TextOutput&);
     63 
     64 TextOutput& endl(TextOutput& to);
     65 TextOutput& indent(TextOutput& to);
     66 TextOutput& dedent(TextOutput& to);
     67 
     68 template<typename T>
     69 TextOutput& operator<<(TextOutput& to, const T& val)
     70 {
     71     std::stringstream strbuf;
     72     strbuf << val;
     73     std::string str = strbuf.str();
     74     to.print(str.c_str(), str.size());
     75     return to;
     76 }
     77 
     78 TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func);
     79 
     80 class TypeCode
     81 {
     82 public:
     83     inline TypeCode(uint32_t code);
     84     inline ~TypeCode();
     85 
     86     inline uint32_t typeCode() const;
     87 
     88 private:
     89     uint32_t mCode;
     90 };
     91 
     92 TextOutput& operator<<(TextOutput& to, const TypeCode& val);
     93 
     94 class HexDump
     95 {
     96 public:
     97     HexDump(const void *buf, size_t size, size_t bytesPerLine=16);
     98     inline ~HexDump();
     99 
    100     inline HexDump& setBytesPerLine(size_t bytesPerLine);
    101     inline HexDump& setSingleLineCutoff(int32_t bytes);
    102     inline HexDump& setAlignment(size_t alignment);
    103     inline HexDump& setCArrayStyle(bool enabled);
    104 
    105     inline const void* buffer() const;
    106     inline size_t size() const;
    107     inline size_t bytesPerLine() const;
    108     inline int32_t singleLineCutoff() const;
    109     inline size_t alignment() const;
    110     inline bool carrayStyle() const;
    111 
    112 private:
    113     const void* mBuffer;
    114     size_t mSize;
    115     size_t mBytesPerLine;
    116     int32_t mSingleLineCutoff;
    117     size_t mAlignment;
    118     bool mCArrayStyle;
    119 };
    120 
    121 TextOutput& operator<<(TextOutput& to, const HexDump& val);
    122 inline TextOutput& operator<<(TextOutput& to,
    123                               decltype(std::endl<char,
    124                                        std::char_traits<char>>)
    125                               /*val*/) {
    126     endl(to);
    127     return to;
    128 }
    129 
    130 inline TextOutput& operator<<(TextOutput& to, const char &c)
    131 {
    132     to.print(&c, 1);
    133     return to;
    134 }
    135 
    136 inline TextOutput& operator<<(TextOutput& to, const bool &val)
    137 {
    138     if (val) to.print("true", 4);
    139     else to.print("false", 5);
    140     return to;
    141 }
    142 
    143 inline TextOutput& operator<<(TextOutput& to, const String16& val)
    144 {
    145     to << String8(val).string();
    146     return to;
    147 }
    148 
    149 // ---------------------------------------------------------------------------
    150 // No user servicable parts below.
    151 
    152 inline TextOutput& endl(TextOutput& to)
    153 {
    154     to.print("\n", 1);
    155     return to;
    156 }
    157 
    158 inline TextOutput& indent(TextOutput& to)
    159 {
    160     to.moveIndent(1);
    161     return to;
    162 }
    163 
    164 inline TextOutput& dedent(TextOutput& to)
    165 {
    166     to.moveIndent(-1);
    167     return to;
    168 }
    169 
    170 inline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func)
    171 {
    172     return (*func)(to);
    173 }
    174 
    175 inline TypeCode::TypeCode(uint32_t code) : mCode(code) { }
    176 inline TypeCode::~TypeCode() { }
    177 inline uint32_t TypeCode::typeCode() const { return mCode; }
    178 
    179 inline HexDump::~HexDump() { }
    180 
    181 inline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) {
    182     mBytesPerLine = bytesPerLine; return *this;
    183 }
    184 inline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) {
    185     mSingleLineCutoff = bytes; return *this;
    186 }
    187 inline HexDump& HexDump::setAlignment(size_t alignment) {
    188     mAlignment = alignment; return *this;
    189 }
    190 inline HexDump& HexDump::setCArrayStyle(bool enabled) {
    191     mCArrayStyle = enabled; return *this;
    192 }
    193 
    194 inline const void* HexDump::buffer() const { return mBuffer; }
    195 inline size_t HexDump::size() const { return mSize; }
    196 inline size_t HexDump::bytesPerLine() const { return mBytesPerLine; }
    197 inline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; }
    198 inline size_t HexDump::alignment() const { return mAlignment; }
    199 inline bool HexDump::carrayStyle() const { return mCArrayStyle; }
    200 
    201 // ---------------------------------------------------------------------------
    202 }; // namespace android
    203 
    204 #endif // ANDROID_TEXTOUTPUT_H
    205