1ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/*
2ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Copyright (C) 2013 The Android Open Source Project
3ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin *
4ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * you may not use this file except in compliance with the License.
6ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * You may obtain a copy of the License at
7ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin *
8ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin *
10ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * See the License for the specific language governing permissions and
14ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * limitations under the License.
15ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */
16ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
17ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#ifndef ANDROID_PRINTER_H
18ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#define ANDROID_PRINTER_H
19ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
20ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <android/log.h>
21ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
22ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinnamespace android {
23ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
24ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// Interface for printing to an arbitrary data stream
25ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass Printer {
26ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinpublic:
27ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Print a new line specified by 'string'. \n is appended automatically.
28ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // -- Assumes that the string has no new line in it.
29ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual void printLine(const char* string = "") = 0;
30ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
31ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Print a new line specified by the format string. \n is appended automatically.
32ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // -- Assumes that the resulting string has no new line in it.
33ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual void printFormatLine(const char* format, ...) __attribute__((format (printf, 2, 3)));
34ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
35ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinprotected:
36ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    Printer();
37ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual ~Printer();
38ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; // class Printer
39ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
40ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// Print to logcat
41ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass LogPrinter : public Printer {
42ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinpublic:
43ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Create a printer using the specified logcat and log priority
44ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // - Unless ignoreBlankLines is false, print blank lines to logcat
45ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // (Note that the default ALOG behavior is to ignore blank lines)
46ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    LogPrinter(const char* logtag,
47ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin               android_LogPriority priority = ANDROID_LOG_DEBUG,
48ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin               const char* prefix = 0,
49ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin               bool ignoreBlankLines = false);
50ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
51ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Print the specified line to logcat. No \n at the end is necessary.
52ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual void printLine(const char* string);
53ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
54ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinprivate:
55ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    void printRaw(const char* string);
56ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
57ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    const char* mLogTag;
58ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    android_LogPriority mPriority;
59ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    const char* mPrefix;
60ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    bool mIgnoreBlankLines;
61ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; // class LogPrinter
62ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
63ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// Print to a file descriptor
64ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass FdPrinter : public Printer {
65ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinpublic:
66ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Create a printer using the specified file descriptor.
67ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // - Each line will be prefixed with 'indent' number of blank spaces.
68ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // - In addition, each line will be prefixed with the 'prefix' string.
69ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    FdPrinter(int fd, unsigned int indent = 0, const char* prefix = 0);
70ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
71ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Print the specified line to the file descriptor. \n is appended automatically.
72ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual void printLine(const char* string);
73ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
74ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinprivate:
75ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    enum {
76ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin        MAX_FORMAT_STRING = 20,
77ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    };
78ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
79ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    int mFd;
80ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    unsigned int mIndent;
81ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    const char* mPrefix;
82ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    char mFormatString[MAX_FORMAT_STRING];
83ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; // class FdPrinter
84ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
85ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass String8;
86ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
87ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// Print to a String8
88ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass String8Printer : public Printer {
89ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinpublic:
90ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Create a printer using the specified String8 as the target.
91ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // - In addition, each line will be prefixed with the 'prefix' string.
92ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // - target's memory lifetime must be a superset of this String8Printer.
93ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    String8Printer(String8* target, const char* prefix = 0);
94ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
95ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Append the specified line to the String8. \n is appended automatically.
96ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual void printLine(const char* string);
97ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
98ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinprivate:
99ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    String8* mTarget;
100ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    const char* mPrefix;
101ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; // class String8Printer
102ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
103ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// Print to an existing Printer by adding a prefix to each line
104ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinclass PrefixPrinter : public Printer {
105ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinpublic:
106ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Create a printer using the specified printer as the target.
107ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    PrefixPrinter(Printer& printer, const char* prefix);
108ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
109ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    // Print the line (prefixed with prefix) using the printer.
110ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    virtual void printLine(const char* string);
111ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
112ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinprivate:
113ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    Printer& mPrinter;
114ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin    const char* mPrefix;
115ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin};
116ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
117ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; // namespace android
118ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin
119ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#endif // ANDROID_PRINTER_H
120