123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /******************************************************************************
- Copyright (C) 2025 by Patrick Heyer <[email protected]>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- ******************************************************************************/
- @import Foundation;
- #import "CrashHandler.hpp"
- namespace {
- NSURL *getDiagnosticReportsDirectory()
- {
- NSFileManager *fileManager = [NSFileManager defaultManager];
- NSArray<NSURL *> *libraryURLs = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask];
- if (libraryURLs.count == 0) {
- blog(LOG_ERROR, "Unable to get macOS user library directory URL");
- return nil;
- }
- NSURL *diagnosticsReportsURL = [libraryURLs[0] URLByAppendingPathComponent:@"logs/DiagnosticReports"];
- return diagnosticsReportsURL;
- }
- } // namespace
- namespace OBS {
- PlatformType CrashHandler::getPlatformType() const
- {
- return PlatformType::macOS;
- }
- std::filesystem::path CrashHandler::findLastCrashLog() const
- {
- std::filesystem::path crashLogDirectoryPath;
- NSURL *diagnosticsReportsURL = getDiagnosticReportsDirectory();
- if (!diagnosticsReportsURL) {
- return crashLogDirectoryPath;
- }
- BOOL (^enumerationErrorHandler)(NSURL *_Nonnull, NSError *_Nonnull) =
- ^BOOL(NSURL *_Nonnull url __unused, NSError *_Nonnull error) {
- blog(LOG_ERROR, "Failed to enumerate diagnostics reports directory: %s",
- error.localizedDescription.UTF8String);
- return NO;
- };
- NSFileManager *fileManager = [NSFileManager defaultManager];
- NSDirectoryEnumerator *dirEnumerator = [fileManager
- enumeratorAtURL:diagnosticsReportsURL
- includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
- options:(NSDirectoryEnumerationSkipsHiddenFiles) errorHandler:enumerationErrorHandler];
- NSMutableArray<NSURL *> *reportCandidates = [NSMutableArray array];
- for (NSURL *entry in dirEnumerator) {
- NSString *fileName = nil;
- [entry getResourceValue:&fileName forKey:NSURLNameKey error:nil];
- if ([fileName hasPrefix:@"OBS"] && [fileName hasSuffix:@".ips"]) {
- [reportCandidates addObject:entry];
- }
- }
- NSArray<NSURL *> *sortedCandidates = [reportCandidates
- sortedArrayUsingComparator:^NSComparisonResult(NSURL *_Nonnull obj1, NSURL *_Nonnull obj2) {
- NSDate *creationDateObj1 = nil;
- NSDate *creationDateObj2 = nil;
- [obj1 getResourceValue:&creationDateObj1 forKey:NSURLCreationDateKey error:nil];
- [obj2 getResourceValue:&creationDateObj2 forKey:NSURLCreationDateKey error:nil];
- NSComparisonResult result = [creationDateObj2 compare:creationDateObj1];
- return result;
- }];
- if (sortedCandidates.count > 0) {
- NSURL *lastDiagnosticsReport = sortedCandidates[0];
- crashLogDirectoryPath = std::filesystem::u8path(lastDiagnosticsReport.path.UTF8String);
- }
- return crashLogDirectoryPath;
- }
- std::filesystem::path CrashHandler::getCrashLogDirectory() const
- {
- std::filesystem::path crashLogDirectoryPath;
- NSURL *diagnosticsReportsURL = getDiagnosticReportsDirectory();
- if (diagnosticsReportsURL) {
- crashLogDirectoryPath = std::filesystem::u8path(diagnosticsReportsURL.path.UTF8String);
- }
- return crashLogDirectoryPath;
- }
- } // namespace OBS
|