/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_PRINTER_H #define ANDROID_PRINTER_H #include <android/log.h> namespace android { // Interface for printing to an arbitrary data stream class Printer { public: // Print a new line specified by 'string'. \n is appended automatically. // -- Assumes that the string has no new line in it. virtual void printLine(const char* string = "") = 0; // Print a new line specified by the format string. \n is appended automatically. // -- Assumes that the resulting string has no new line in it. virtual void printFormatLine(const char* format, ...) __attribute__((format (printf, 2, 3))); protected: Printer(); virtual ~Printer(); }; // class Printer // Print to logcat class LogPrinter : public Printer { public: // Create a printer using the specified logcat and log priority // - Unless ignoreBlankLines is false, print blank lines to logcat // (Note that the default ALOG behavior is to ignore blank lines) LogPrinter(const char* logtag, android_LogPriority priority = ANDROID_LOG_DEBUG, const char* prefix = nullptr, bool ignoreBlankLines = false); // Print the specified line to logcat. No \n at the end is necessary. virtual void printLine(const char* string); private: void printRaw(const char* string); const char* mLogTag; android_LogPriority mPriority; const char* mPrefix; bool mIgnoreBlankLines; }; // class LogPrinter // Print to a file descriptor class FdPrinter : public Printer { public: // Create a printer using the specified file descriptor. // - Each line will be prefixed with 'indent' number of blank spaces. // - In addition, each line will be prefixed with the 'prefix' string. FdPrinter(int fd, unsigned int indent = 0, const char* prefix = nullptr); // Print the specified line to the file descriptor. \n is appended automatically. virtual void printLine(const char* string); private: enum { MAX_FORMAT_STRING = 20, }; int mFd; unsigned int mIndent; const char* mPrefix; char mFormatString[MAX_FORMAT_STRING]; }; // class FdPrinter class String8; // Print to a String8 class String8Printer : public Printer { public: // Create a printer using the specified String8 as the target. // - In addition, each line will be prefixed with the 'prefix' string. // - target's memory lifetime must be a superset of this String8Printer. String8Printer(String8* target, const char* prefix = nullptr); // Append the specified line to the String8. \n is appended automatically. virtual void printLine(const char* string); private: String8* mTarget; const char* mPrefix; }; // class String8Printer // Print to an existing Printer by adding a prefix to each line class PrefixPrinter : public Printer { public: // Create a printer using the specified printer as the target. PrefixPrinter(Printer& printer, const char* prefix); // Print the line (prefixed with prefix) using the printer. virtual void printLine(const char* string); private: Printer& mPrinter; const char* mPrefix; }; } // namespace android #endif // ANDROID_PRINTER_H