OpenShot Audio Library | OpenShotAudio  0.3.0
juce_FileLogger.cpp
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2017 - ROLI Ltd.
6 
7  JUCE is an open source library subject to commercial or open-source
8  licensing.
9 
10  The code included in this file is provided under the terms of the ISC license
11  http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12  To use, copy, modify, and/or distribute this software for any purpose with or
13  without fee is hereby granted provided that the above copyright notice and
14  this permission notice appear in all copies.
15 
16  JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17  EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18  DISCLAIMED.
19 
20  ==============================================================================
21 */
22 
23 namespace juce
24 {
25 
27  const String& welcomeMessage,
28  const int64 maxInitialFileSizeBytes)
29  : logFile (file)
30 {
31  if (maxInitialFileSizeBytes >= 0)
32  trimFileSize (logFile, maxInitialFileSizeBytes);
33 
34  if (! file.exists())
35  file.create(); // (to create the parent directories)
36 
37  String welcome;
38  welcome << newLine
39  << "**********************************************************" << newLine
40  << welcomeMessage << newLine
41  << "Log started: " << Time::getCurrentTime().toString (true, true) << newLine;
42 
43  FileLogger::logMessage (welcome);
44 }
45 
47 
48 //==============================================================================
49 void FileLogger::logMessage (const String& message)
50 {
51  const ScopedLock sl (logLock);
52  DBG (message);
53  FileOutputStream out (logFile, 256);
54  out << message << newLine;
55 }
56 
57 void FileLogger::trimFileSize (const File& file, int64 maxFileSizeBytes)
58 {
59  if (maxFileSizeBytes <= 0)
60  {
61  file.deleteFile();
62  }
63  else
64  {
65  const int64 fileSize = file.getSize();
66 
67  if (fileSize > maxFileSizeBytes)
68  {
69  TemporaryFile tempFile (file);
70 
71  {
72  FileOutputStream out (tempFile.getFile());
73  FileInputStream in (file);
74 
75  if (! (out.openedOk() && in.openedOk()))
76  return;
77 
78  in.setPosition (fileSize - maxFileSizeBytes);
79 
80  for (;;)
81  {
82  const char c = in.readByte();
83  if (c == 0)
84  return;
85 
86  if (c == '\n' || c == '\r')
87  {
88  out << c;
89  break;
90  }
91  }
92 
93  out.writeFromInputStream (in, -1);
94  }
95 
97  }
98  }
99 }
100 
101 //==============================================================================
103 {
104  #if JUCE_MAC
105  return File ("~/Library/Logs");
106  #else
108  #endif
109 }
110 
111 FileLogger* FileLogger::createDefaultAppLogger (const String& logFileSubDirectoryName,
112  const String& logFileName,
113  const String& welcomeMessage,
114  const int64 maxInitialFileSizeBytes)
115 {
116  return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName)
117  .getChildFile (logFileName),
118  welcomeMessage, maxInitialFileSizeBytes);
119 }
120 
121 FileLogger* FileLogger::createDateStampedLogger (const String& logFileSubDirectoryName,
122  const String& logFileNameRoot,
123  const String& logFileNameSuffix,
124  const String& welcomeMessage)
125 {
126  return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName)
127  .getChildFile (logFileNameRoot + Time::getCurrentTime().formatted ("%Y-%m-%d_%H-%M-%S"))
128  .withFileExtension (logFileNameSuffix)
129  .getNonexistentSibling(),
130  welcomeMessage, 0);
131 }
132 
133 } // namespace juce
bool setPosition(int64) override
bool openedOk() const noexcept
FileLogger(const File &fileToWriteTo, const String &welcomeMessage, const int64 maxInitialFileSizeBytes=128 *1024)
static FileLogger * createDefaultAppLogger(const String &logFileSubDirectoryName, const String &logFileName, const String &welcomeMessage, const int64 maxInitialFileSizeBytes=128 *1024)
static void trimFileSize(const File &file, int64 maxFileSize)
static File getSystemLogFileFolder()
~FileLogger() override
static FileLogger * createDateStampedLogger(const String &logFileSubDirectoryName, const String &logFileNameRoot, const String &logFileNameSuffix, const String &welcomeMessage)
void logMessage(const String &) override
bool openedOk() const noexcept
int64 getSize() const
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
@ userApplicationDataDirectory
Definition: juce_File.h:858
Result create() const
Definition: juce_File.cpp:492
bool deleteFile() const
bool exists() const
virtual char readByte()
virtual int64 writeFromInputStream(InputStream &source, int64 maxNumBytesToWrite)
bool overwriteTargetFileWithTemporary() const
const File & getFile() const noexcept
static Time JUCE_CALLTYPE getCurrentTime() noexcept
Definition: juce_Time.cpp:218
String toString(bool includeDate, bool includeTime, bool includeSeconds=true, bool use24HourClock=false) const
Definition: juce_Time.cpp:289