// Copyright (C) 2024, The Duplicati Team // https://duplicati.com, hello@duplicati.com // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. using System; using System.Linq; namespace Duplicati.Library.Logging { /// /// Internal class for keeping log instance relations /// internal class LogScope : IDisposable { /// /// The unique ID of this log instance /// public readonly string InstanceID = Guid.NewGuid().ToString(); /// /// The log instance assigned to this scope /// private readonly ILogDestination m_log; /// /// The log filter /// private readonly ILogFilter m_filter; /// /// The log scope parent /// public readonly LogScope Parent; /// /// A flag indicating if the scope is disposed /// private bool m_isDisposed = false; /// /// A flag indicating if this is an isolating scope /// public readonly bool IsolatingScope; /// /// Initializes a new instance of the class. /// /// The log instance to wrap. /// The log filter to use /// The parent scope /// A flag indicating if the scope is an isolating scope public LogScope(ILogDestination self, ILogFilter filter, LogScope parent, bool isolatingScope) { Parent = parent; m_log = self; m_filter = filter; IsolatingScope = isolatingScope; if (parent != null) Logging.Log.StartScope(this); } /// /// The function called when a message is logged /// /// The log entry public void WriteMessage(LogEntry entry) { if (m_log != null && (m_filter == null || m_filter.Accepts(entry))) m_log.WriteMessage(entry); } /// /// Releases all resource used by the object. /// /// Call when you are finished using the /// . The method leaves the /// in an unusable state. After calling /// , you must release all references to the /// so the garbage collector can reclaim the memory that the /// was occupying. public void Dispose() { if (!m_isDisposed && Parent != null) { Logging.Log.CloseScope(this); m_isDisposed = true; } } } }