1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef BenchLogger_DEFINED
9 #define BenchLogger_DEFINED
10 
11 #include <stdio.h>
12 #include "include/core/SkString.h"
13 #include "include/core/SkTypes.h"
14 
15 class SkFILEWStream;
16 
17 /**
18  * Class that allows logging to a file while simultaneously logging to stdout/stderr.
19  */
20 class BenchLogger {
21 public:
22     BenchLogger();
23 
24     /**
25      * Not virtual, since this class is not intended to be subclassed.
26      */
27     ~BenchLogger();
28 
29     /**
30      * Specify a file to write progress logs to. Unless this is called with a valid file path,
31      * BenchLogger will only write to stdout/stderr.
32      */
33     bool SetLogFile(const char file[]);
34 
35     /**
36      * Log an error to stderr, taking a C style string as input.
37      */
logError(const char msg[])38     void logError(const char msg[]) { this->nativeLogError(msg); }
39 
40     /**
41      * Log an error to stderr, taking an SkString as input.
42      */
logError(const SkString & str)43     void logError(const SkString& str) { this->nativeLogError(str.c_str()); }
44 
45     /**
46      * Log the progress of the bench tool to both stdout and the log file specified by SetLogFile,
47      * if any, taking a C style string as input.
48      */
logProgress(const char msg[])49     void logProgress(const char msg[]) {
50         this->nativeLogProgress(msg);
51         this->fileWrite(msg, strlen(msg));
52     }
53 
54     /**
55      * Log the progress of the bench tool to both stdout and the log file specified by SetLogFile,
56      * if any, taking an SkString as input.
57      */
logProgress(const SkString & str)58     void logProgress(const SkString& str) {
59         this->nativeLogProgress(str.c_str());
60         this->fileWrite(str.c_str(), str.size());
61     }
62 
63 private:
64 #ifdef SK_BUILD_FOR_ANDROID
nativeLogError(const char msg[])65     void nativeLogError(const char msg[]) { SkDebugf("%s", msg); }
66 #else
67     void nativeLogError(const char msg[]) { fprintf(stderr, "%s", msg); }
68 #endif
nativeLogProgress(const char msg[])69     void nativeLogProgress(const char msg[]) { SkDebugf("%s", msg); }
70 
71     void fileWrite(const char msg[], size_t size);
72 
73     SkFILEWStream* fFileStream;
74 };
75 
76 #endif // BenchLogger_DEFINED
77