19a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com/*
29a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * Copyright 2012 Google Inc.
39a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com *
49a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * Use of this source code is governed by a BSD-style license that can be
59a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * found in the LICENSE file.
69a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */
79a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#ifndef BenchLogger_DEFINED
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#define BenchLogger_DEFINED
109a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
11fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com#include <stdio.h>
12f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkString.h"
13f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkTypes.h"
149a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
159a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comclass SkFILEWStream;
169a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
179a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com/**
189a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com * Class that allows logging to a file while simultaneously logging to stdout/stderr.
199a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com */
20f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BenchLogger {
219a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.compublic:
22f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    BenchLogger();
239a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
249a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    /**
259a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * Not virtual, since this class is not intended to be subclassed.
269a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     */
27f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    ~BenchLogger();
289a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
299a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    /**
309a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * Specify a file to write progress logs to. Unless this is called with a valid file path,
31f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina     * BenchLogger will only write to stdout/stderr.
329a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     */
339a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    bool SetLogFile(const char file[]);
349a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
359a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    /**
369a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * Log an error to stderr, taking a C style string as input.
379a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     */
389a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void logError(const char msg[]) { this->nativeLogError(msg); }
399a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
409a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    /**
419a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * Log an error to stderr, taking an SkString as input.
429a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     */
439a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void logError(const SkString& str) { this->nativeLogError(str.c_str()); }
449a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
459a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    /**
469a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * Log the progress of the bench tool to both stdout and the log file specified by SetLogFile,
479a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * if any, taking a C style string as input.
489a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     */
499a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void logProgress(const char msg[]) {
509a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        this->nativeLogProgress(msg);
519a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        this->fileWrite(msg, strlen(msg));
529a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    }
539a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
549a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    /**
559a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * Log the progress of the bench tool to both stdout and the log file specified by SetLogFile,
569a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     * if any, taking an SkString as input.
579a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com     */
589a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void logProgress(const SkString& str) {
599a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        this->nativeLogProgress(str.c_str());
609a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com        this->fileWrite(str.c_str(), str.size());
619a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    }
629a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
639a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.comprivate:
649a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#ifdef SK_BUILD_FOR_ANDROID
659a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void nativeLogError(const char msg[]) { SkDebugf("%s", msg); }
669a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#else
679a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void nativeLogError(const char msg[]) { fprintf(stderr, "%s", msg); }
689a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com#endif
69aadb4d9a53d406b4bf40089a10ef94302d21b6bbcommit-bot@chromium.org    void nativeLogProgress(const char msg[]) { SkDebugf("%s", msg); }
709a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
719a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    void fileWrite(const char msg[], size_t size);
729a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
739a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com    SkFILEWStream* fFileStream;
749a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com};
759a4125283ad56cea3b986337cb669dde14bf0ed8scroggo@google.com
76f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#endif // BenchLogger_DEFINED
77