| /* | |
| * 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. | |
| */ | |
| #define LOG_TAG "Printer" | |
| // #define LOG_NDEBUG 0 | |
| #include <utils/Printer.h> | |
| #include <utils/String8.h> | |
| #include <utils/Log.h> | |
| #include <string.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| namespace android { | |
| /* | |
| * Implementation of Printer | |
| */ | |
| Printer::Printer() { | |
| // Intentionally left empty | |
| } | |
| Printer::~Printer() { | |
| // Intentionally left empty | |
| } | |
| void Printer::printFormatLine(const char* format, ...) { | |
| va_list arglist; | |
| va_start(arglist, format); | |
| char* formattedString; | |
| #ifndef USE_MINGW | |
| if (vasprintf(&formattedString, format, arglist) < 0) { // returns -1 on error | |
| ALOGE("%s: Failed to format string", __FUNCTION__); | |
| return; | |
| } | |
| #else | |
| return; | |
| #endif | |
| va_end(arglist); | |
| printLine(formattedString); | |
| free(formattedString); | |
| } | |
| /* | |
| * Implementation of LogPrinter | |
| */ | |
| LogPrinter::LogPrinter(const char* logtag, | |
| android_LogPriority priority, | |
| const char* prefix, | |
| bool ignoreBlankLines) : | |
| mLogTag(logtag), | |
| mPriority(priority), | |
| mPrefix(prefix ?: ""), | |
| mIgnoreBlankLines(ignoreBlankLines) { | |
| } | |
| void LogPrinter::printLine(const char* string) { | |
| if (string == NULL) { | |
| ALOGW("%s: NULL string passed in", __FUNCTION__); | |
| return; | |
| } | |
| if (mIgnoreBlankLines || (*string)) { | |
| // Simple case: Line is not blank, or we don't care about printing blank lines | |
| printRaw(string); | |
| } else { | |
| // Force logcat to print empty lines by adding prefixing with a space | |
| printRaw(" "); | |
| } | |
| } | |
| void LogPrinter::printRaw(const char* string) { | |
| __android_log_print(mPriority, mLogTag, "%s%s", mPrefix, string); | |
| } | |
| /* | |
| * Implementation of FdPrinter | |
| */ | |
| FdPrinter::FdPrinter(int fd, unsigned int indent, const char* prefix) : | |
| mFd(fd), mIndent(indent), mPrefix(prefix ?: "") { | |
| if (fd < 0) { | |
| ALOGW("%s: File descriptor out of range (%d)", __FUNCTION__, fd); | |
| } | |
| // <indent><prefix><line> -- e.g. '%-4s%s\n' for indent=4 | |
| snprintf(mFormatString, sizeof(mFormatString), "%%-%us%%s\n", mIndent); | |
| } | |
| void FdPrinter::printLine(const char* string) { | |
| if (string == NULL) { | |
| ALOGW("%s: NULL string passed in", __FUNCTION__); | |
| return; | |
| } else if (mFd < 0) { | |
| ALOGW("%s: File descriptor out of range (%d)", __FUNCTION__, mFd); | |
| return; | |
| } | |
| #ifndef USE_MINGW | |
| dprintf(mFd, mFormatString, mPrefix, string); | |
| #endif | |
| } | |
| /* | |
| * Implementation of String8Printer | |
| */ | |
| String8Printer::String8Printer(String8* target, const char* prefix) : | |
| mTarget(target), | |
| mPrefix(prefix ?: "") { | |
| if (target == NULL) { | |
| ALOGW("%s: Target string was NULL", __FUNCTION__); | |
| } | |
| } | |
| void String8Printer::printLine(const char* string) { | |
| if (string == NULL) { | |
| ALOGW("%s: NULL string passed in", __FUNCTION__); | |
| return; | |
| } else if (mTarget == NULL) { | |
| ALOGW("%s: Target string was NULL", __FUNCTION__); | |
| return; | |
| } | |
| mTarget->append(mPrefix); | |
| mTarget->append(string); | |
| mTarget->append("\n"); | |
| } | |
| /* | |
| * Implementation of PrefixPrinter | |
| */ | |
| PrefixPrinter::PrefixPrinter(Printer& printer, const char* prefix) : | |
| mPrinter(printer), mPrefix(prefix ?: "") { | |
| } | |
| void PrefixPrinter::printLine(const char* string) { | |
| mPrinter.printFormatLine("%s%s", mPrefix, string); | |
| } | |
| }; //namespace android |