1/* 2 * Copyright (C) 2013 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#define LOG_TAG "Printer" 18// #define LOG_NDEBUG 0 19 20#include <utils/Printer.h> 21#include <utils/String8.h> 22#include <utils/Log.h> 23 24#include <string.h> 25#include <stdio.h> 26#include <stdlib.h> 27 28namespace android { 29 30/* 31 * Implementation of Printer 32 */ 33Printer::Printer() { 34 // Intentionally left empty 35} 36 37Printer::~Printer() { 38 // Intentionally left empty 39} 40 41void Printer::printFormatLine(const char* format, ...) { 42 va_list arglist; 43 va_start(arglist, format); 44 45 char* formattedString; 46 47#ifndef USE_MINGW 48 if (vasprintf(&formattedString, format, arglist) < 0) { // returns -1 on error 49 ALOGE("%s: Failed to format string", __FUNCTION__); 50 return; 51 } 52#else 53 return; 54#endif 55 56 va_end(arglist); 57 58 printLine(formattedString); 59 free(formattedString); 60} 61 62/* 63 * Implementation of LogPrinter 64 */ 65LogPrinter::LogPrinter(const char* logtag, 66 android_LogPriority priority, 67 const char* prefix, 68 bool ignoreBlankLines) : 69 mLogTag(logtag), 70 mPriority(priority), 71 mPrefix(prefix ?: ""), 72 mIgnoreBlankLines(ignoreBlankLines) { 73} 74 75void LogPrinter::printLine(const char* string) { 76 if (string == NULL) { 77 ALOGW("%s: NULL string passed in", __FUNCTION__); 78 return; 79 } 80 81 if (mIgnoreBlankLines || (*string)) { 82 // Simple case: Line is not blank, or we don't care about printing blank lines 83 printRaw(string); 84 } else { 85 // Force logcat to print empty lines by adding prefixing with a space 86 printRaw(" "); 87 } 88} 89 90void LogPrinter::printRaw(const char* string) { 91 __android_log_print(mPriority, mLogTag, "%s%s", mPrefix, string); 92} 93 94 95/* 96 * Implementation of FdPrinter 97 */ 98FdPrinter::FdPrinter(int fd, unsigned int indent, const char* prefix) : 99 mFd(fd), mIndent(indent), mPrefix(prefix ?: "") { 100 101 if (fd < 0) { 102 ALOGW("%s: File descriptor out of range (%d)", __FUNCTION__, fd); 103 } 104 105 // <indent><prefix><line> -- e.g. '%-4s%s\n' for indent=4 106 snprintf(mFormatString, sizeof(mFormatString), "%%-%us%%s\n", mIndent); 107} 108 109void FdPrinter::printLine(const char* string) { 110 if (string == NULL) { 111 ALOGW("%s: NULL string passed in", __FUNCTION__); 112 return; 113 } else if (mFd < 0) { 114 ALOGW("%s: File descriptor out of range (%d)", __FUNCTION__, mFd); 115 return; 116 } 117 118#ifndef USE_MINGW 119 dprintf(mFd, mFormatString, mPrefix, string); 120#endif 121} 122 123/* 124 * Implementation of String8Printer 125 */ 126String8Printer::String8Printer(String8* target, const char* prefix) : 127 mTarget(target), 128 mPrefix(prefix ?: "") { 129 130 if (target == NULL) { 131 ALOGW("%s: Target string was NULL", __FUNCTION__); 132 } 133} 134 135void String8Printer::printLine(const char* string) { 136 if (string == NULL) { 137 ALOGW("%s: NULL string passed in", __FUNCTION__); 138 return; 139 } else if (mTarget == NULL) { 140 ALOGW("%s: Target string was NULL", __FUNCTION__); 141 return; 142 } 143 144 mTarget->append(mPrefix); 145 mTarget->append(string); 146 mTarget->append("\n"); 147} 148 149/* 150 * Implementation of PrefixPrinter 151 */ 152PrefixPrinter::PrefixPrinter(Printer& printer, const char* prefix) : 153 mPrinter(printer), mPrefix(prefix ?: "") { 154} 155 156void PrefixPrinter::printLine(const char* string) { 157 mPrinter.printFormatLine("%s%s", mPrefix, string); 158} 159 160}; //namespace android 161