diff options
-rw-r--r-- | macosx/HBAppDelegate.m | 1 | ||||
-rw-r--r-- | macosx/HBJobOutputFileWriter.h | 19 | ||||
-rw-r--r-- | macosx/HBJobOutputFileWriter.m | 64 | ||||
-rw-r--r-- | macosx/HBOutputFileWriter.h | 23 | ||||
-rw-r--r-- | macosx/HBOutputFileWriter.m | 69 | ||||
-rw-r--r-- | macosx/HBOutputPanelController.h | 2 | ||||
-rw-r--r-- | macosx/HBOutputPanelController.m | 160 | ||||
-rw-r--r-- | macosx/HBQueueController.h | 1 | ||||
-rw-r--r-- | macosx/HBQueueController.m | 20 | ||||
-rw-r--r-- | macosx/HBUtilities.h | 5 | ||||
-rw-r--r-- | macosx/HBUtilities.m | 8 |
11 files changed, 229 insertions, 143 deletions
diff --git a/macosx/HBAppDelegate.m b/macosx/HBAppDelegate.m index c28164a9e..2d8259b22 100644 --- a/macosx/HBAppDelegate.m +++ b/macosx/HBAppDelegate.m @@ -58,7 +58,6 @@ _presetsManager = [[HBPresetsManager alloc] initWithURL:presetsURL]; _queueController = [[HBQueueController alloc] init]; - _queueController.outputPanel = _outputPanel; _queueController.delegate = self; _mainController = [[HBController alloc] initWithQueue:_queueController presetsManager:_presetsManager]; diff --git a/macosx/HBJobOutputFileWriter.h b/macosx/HBJobOutputFileWriter.h new file mode 100644 index 000000000..3cf2e7f88 --- /dev/null +++ b/macosx/HBJobOutputFileWriter.h @@ -0,0 +1,19 @@ +/* HBJobOutputFileWriter.h $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ + +#import "HBOutputFileWriter.h" + +@class HBJob; + +/** + * Redirects the output to a new file based on the job destination + * and the current logging preference. + */ +@interface HBJobOutputFileWriter : HBOutputFileWriter + +- (instancetype)initWithJob:(HBJob *)job; + +@end diff --git a/macosx/HBJobOutputFileWriter.m b/macosx/HBJobOutputFileWriter.m new file mode 100644 index 000000000..2ae3c161d --- /dev/null +++ b/macosx/HBJobOutputFileWriter.m @@ -0,0 +1,64 @@ +/* HBJobOutputFileWriter.h $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ + +#import "HBJobOutputFileWriter.h" +#import "HBJob.h" +#import "HBUtilities.h" + +@implementation HBJobOutputFileWriter + +- (instancetype)initWithJob:(HBJob *)job +{ + NSURL *outputURL= job.destURL; + + // Establish the log file location to write to. + // We need to get the current time in YY-MM-DD HH-MM-SS format to put at the beginning of the name of the log file + time_t _now = time(NULL); + struct tm *now = localtime(&_now); + NSString *dateForLogTitle = [NSString stringWithFormat:@"%02d-%02d-%02d %02d-%02d-%02d", + now->tm_year + 1900, + now->tm_mon + 1, + now->tm_mday,now->tm_hour, + now->tm_min, now->tm_sec]; + + // Assemble the new log file name as YY-MM-DD HH-MM-SS mymoviename.txt + NSString *outputDateFileName = [NSString stringWithFormat:@"%@ %@.txt", + outputURL.lastPathComponent.stringByDeletingPathExtension, + dateForLogTitle]; + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"EncodeLogLocation"]) + { + // if we are putting it in the same directory with the movie + outputURL = [outputURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:outputDateFileName]; + } + else + { + // if we are putting it in the default ~/Libraries/Application Support/HandBrake/EncodeLogs logs directory + NSString *encodeLogDirectory = [[HBUtilities appSupportPath] stringByAppendingPathComponent:@"EncodeLogs"]; + if( ![[NSFileManager defaultManager] fileExistsAtPath:encodeLogDirectory] ) + { + [[NSFileManager defaultManager] createDirectoryAtPath:encodeLogDirectory + withIntermediateDirectories:NO + attributes:nil + error:nil]; + } + outputURL = [[NSURL fileURLWithPath:encodeLogDirectory] URLByAppendingPathComponent:outputDateFileName]; + } + + self = [super initWithFileURL:outputURL]; + if (self) + { + // Additional header info. + [self write:job.destURL.lastPathComponent]; + [self write:@"\nPreset: "]; + [self write:job.presetName]; + [self write:@"\n"]; + } + + return self; +} + +@end diff --git a/macosx/HBOutputFileWriter.h b/macosx/HBOutputFileWriter.h new file mode 100644 index 000000000..3538cc76e --- /dev/null +++ b/macosx/HBOutputFileWriter.h @@ -0,0 +1,23 @@ +/* HBOutputFileWriter.h $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ + +#import <Foundation/Foundation.h> +#import "HBOutputRedirect.h" + +/** + * This class is used to listen to HBOutputRedirect + * and write the output to a file. + */ +@interface HBOutputFileWriter : NSObject <HBOutputRedirectListening> + +- (instancetype)initWithFileURL:(NSURL *)url; + +- (void)write:(NSString *)text; +- (void)clear; + +@property (nonatomic, readonly) NSURL *url; + +@end diff --git a/macosx/HBOutputFileWriter.m b/macosx/HBOutputFileWriter.m new file mode 100644 index 000000000..f01293f12 --- /dev/null +++ b/macosx/HBOutputFileWriter.m @@ -0,0 +1,69 @@ +/* HBOutputFileWriter.m $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ + +#import "HBOutputFileWriter.h" +#import "HBUtilities.h" + +@implementation HBOutputFileWriter +{ + FILE *f; +} + +- (instancetype)initWithFileURL:(NSURL *)url; +{ + self = [super init]; + if (self) + { + _url = [url copy]; + f = fopen(url.fileSystemRepresentation, "w"); + f = freopen(NULL, "a", f); + + [self writeHeaderForReason:@"Session"]; + } + + return self; +} + +- (void)dealloc +{ + fclose(f); + [_url release]; + [super dealloc]; +} + +- (void)writeHeaderForReason:(NSString *)reason +{ + [self write:[NSString stringWithFormat:@"HandBrake Activity Log for %@: %@\n%@\n", + reason, + [[NSDate date] descriptionWithCalendarFormat:nil timeZone:nil locale:nil], + [HBUtilities handBrakeVersion]]]; +} + +- (void)write:(NSString *)text +{ + fprintf(f, "%s", text.UTF8String); + fflush(f); +} + +- (void)stdoutRedirect:(NSString *)text +{ + [self write:text]; +} + +- (void)stderrRedirect:(NSString *)text +{ + [self write:text]; +} + +- (void)clear +{ + f = freopen(NULL, "w", f); + f = freopen(NULL, "a", f); + + [self writeHeaderForReason:@"Session (Cleared)"]; +} + +@end diff --git a/macosx/HBOutputPanelController.h b/macosx/HBOutputPanelController.h index 38a9f867c..32907b02b 100644 --- a/macosx/HBOutputPanelController.h +++ b/macosx/HBOutputPanelController.h @@ -18,7 +18,5 @@ - (IBAction)openActivityLogFile:(id)sender; - (IBAction)openEncodeLogDirectory:(id)sender; - (IBAction)clearActivityLogFile:(id)sender; -- (void)startEncodeLog:(NSURL *)logURL; -- (void)endEncodeLog; @end diff --git a/macosx/HBOutputPanelController.m b/macosx/HBOutputPanelController.m index c275c3970..53a27c703 100644 --- a/macosx/HBOutputPanelController.m +++ b/macosx/HBOutputPanelController.m @@ -7,19 +7,14 @@ #import "HBOutputPanelController.h" #import "HBOutputRedirect.h" +#import "HBOutputFileWriter.h" #import "HBUtilities.h" /// Maximum amount of characters that can be shown in the view. -// Original value used by cleaner -//#define TextStorageUpperSizeLimit 20000 -// lets use this higher value for now for better gui debugging #define TextStorageUpperSizeLimit 125000 /// When old output is removed, this is the amount of characters that will be /// left in outputTextStorage. -// Original value used by cleaner -//#define TextStorageLowerSizeLimit 15000 -// lets use this higher value for now for better gui debugging #define TextStorageLowerSizeLimit 120000 @interface HBOutputPanelController () <HBOutputRedirectListening> @@ -32,13 +27,7 @@ } /// Path to log text file. -@property (nonatomic, copy) NSString *outputLogFile; - -/// Path to individual log text file. -@property (nonatomic, copy) NSString *outputLogFileForEncode; - -/// Whether we are writing an addition log file for the current encode or not. -@property (nonatomic) BOOL encodeLogOn; +@property (nonatomic, copy, readonly) HBOutputFileWriter *outputFile; @end @@ -47,7 +36,7 @@ /** * Initializes the object, creates outputTextStorage and starts redirection of stderr. */ -- (id)init +- (instancetype)init { if( (self = [super initWithWindowNibName:@"OutputPanel"]) ) { @@ -57,45 +46,39 @@ * * If/when we switch to using bindings, this can probably go away. */ - [self window]; + (void)[self window]; - // Use the inline search bar if available. - if ([textView respondsToSelector:@selector(setUsesFindBar:)]) + // Additionally, redirect the output to a file on the disk. + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSString *outputLogFile = [[HBUtilities appSupportPath] stringByAppendingPathComponent:@"HandBrake-activitylog.txt"]; + + // We check for an existing output log file here + if ([fileManager fileExistsAtPath:outputLogFile] == NO) { - [textView setUsesFindBar:YES]; + // if not, then we create a new blank one + [fileManager createFileAtPath:outputLogFile contents:nil attributes:nil]; } - /* We initialize the outputTextStorage object for the activity window */ - outputTextStorage = [[NSTextStorage alloc] init]; + _outputFile = [[HBOutputFileWriter alloc] initWithFileURL:[NSURL fileURLWithPath:outputLogFile]]; + [[HBOutputRedirect stderrRedirect] addListener:_outputFile]; + [[HBOutputRedirect stdoutRedirect] addListener:_outputFile]; - /* We declare the default NSFileManager into fileManager */ - NSFileManager * fileManager = [NSFileManager defaultManager]; - /* Establish the log file location to write to */ - /* We are initially using a .txt file as opposed to a .log file since it will open by - * default with the users text editor instead of the .log default Console.app, should - * create less confusion for less experienced users when we ask them to paste the log for support - */ - _outputLogFile = [[[HBUtilities appSupportPath] stringByAppendingPathComponent:@"HandBrake-activitylog.txt"] retain]; + // We initialize the outputTextStorage object for the activity window + outputTextStorage = [[NSTextStorage alloc] init]; - /* We check for an existing output log file here */ - if ([fileManager fileExistsAtPath:_outputLogFile] == NO) + // Use the inline search bar if available. + if ([textView respondsToSelector:@selector(setUsesFindBar:)]) { - /* if not, then we create a new blank one */ - [fileManager createFileAtPath:_outputLogFile contents:nil attributes:nil]; + [textView setUsesFindBar:YES]; } - /* We overwrite the existing output log with the date for starters the output log to start fresh with the new session */ - /* Use the current date and time for the new output log header */ - NSString *startOutputLogString = [self logHeaderForReason:@"Session (Cleared)"]; - [startOutputLogString writeToFile:_outputLogFile atomically:YES encoding:NSUTF8StringEncoding error:NULL]; - - [[HBOutputRedirect stderrRedirect] addListener:self]; - [[HBOutputRedirect stdoutRedirect] addListener:self]; [[textView layoutManager] replaceTextStorage:outputTextStorage]; [[textView enclosingScrollView] setLineScroll:10]; [[textView enclosingScrollView] setPageScroll:20]; - - _encodeLogOn = NO; + + // Add ourself as stderr/stdout listener + [[HBOutputRedirect stderrRedirect] addListener:self]; + [[HBOutputRedirect stdoutRedirect] addListener:self]; } return self; } @@ -108,6 +91,8 @@ [[HBOutputRedirect stderrRedirect] removeListener:self]; [[HBOutputRedirect stdoutRedirect] removeListener:self]; [outputTextStorage release]; + [_outputFile release]; + [super dealloc]; } @@ -129,77 +114,12 @@ } } -- (NSString *)logHeaderForReason:(NSString *)reason -{ - return [NSString stringWithFormat:@"HandBrake Activity Log for %@: %@\n%@", - reason, - [[NSDate date] descriptionWithCalendarFormat:nil timeZone:nil locale:nil], - [self handBrakeVersion]]; -} - -- (NSString *)handBrakeVersion -{ - NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; - return [NSString stringWithFormat:@"Handbrake Version: %@ (%@)", - infoDictionary[@"CFBundleShortVersionString"], - infoDictionary[@"CFBundleVersion"]]; -} - -- (void)startEncodeLog:(NSURL *)logURL -{ - self.encodeLogOn = YES; - NSString *outputFileForEncode = logURL.path ; - /* Since the destination path matches the extension of the output file, replace the - * output movie extension and replace it with ".txt" - */ - NSFileManager * fileManager = [NSFileManager defaultManager]; - /* Establish the log file location to write to */ - /* We are initially using a .txt file as opposed to a .log file since it will open by - * default with the users text editor instead of the .log default Console.app, should - * create less confusion for less experienced users when we ask them to paste the log for support - */ - /* We need to get the current time in YY-MM-DD HH-MM-SS format to put at the beginning of the name of the log file */ - time_t _now = time( NULL ); - struct tm * now = localtime( &_now ); - NSString *dateForLogTitle = [NSString stringWithFormat:@"%02d-%02d-%02d %02d-%02d-%02d",now->tm_year + 1900, now->tm_mon + 1, now->tm_mday,now->tm_hour, now->tm_min, now->tm_sec]; - - /* Assemble the new log file name as YY-MM-DD HH-MM-SS mymoviename.txt */ - NSString *outputDateFileName = [NSString stringWithFormat:@"%@ %@.txt",[[outputFileForEncode lastPathComponent] stringByDeletingPathExtension],dateForLogTitle]; - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"EncodeLogLocation"]) // if we are putting it in the same directory with the movie - { - self.outputLogFileForEncode = [NSString stringWithFormat:@"%@/%@",[outputFileForEncode stringByDeletingLastPathComponent], outputDateFileName]; - } - else // if we are putting it in the default ~/Libraries/Application Support/HandBrake/EncodeLogs logs directory - { - NSString *encodeLogDirectory = [[HBUtilities appSupportPath] stringByAppendingPathComponent:@"EncodeLogs"]; - if( ![[NSFileManager defaultManager] fileExistsAtPath:encodeLogDirectory] ) - { - [[NSFileManager defaultManager] createDirectoryAtPath:encodeLogDirectory - withIntermediateDirectories:NO - attributes:nil - error:nil]; - } - self.outputLogFileForEncode = [NSString stringWithFormat:@"%@/%@",encodeLogDirectory,outputDateFileName]; - } - [fileManager createFileAtPath:self.outputLogFileForEncode contents:nil attributes:nil]; - - /* Similar to the regular activity log, we print a header containing the date and time of the encode as well as what directory it was encoded to */ - NSString *startOutputLogString = [self logHeaderForReason:outputFileForEncode]; - [startOutputLogString writeToFile:self.outputLogFileForEncode atomically:YES encoding:NSUTF8StringEncoding error:NULL]; -} - -- (void) endEncodeLog -{ - self.encodeLogOn = NO; -} - /** * Displays text received from HBOutputRedirect in the text view * and write it to the log files. */ - (void)stderrRedirect:(NSString *)text { - NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text]; /* Actually write the libhb output to the text view (outputTextStorage) */ [outputTextStorage appendAttributedString:attributedString]; @@ -207,23 +127,14 @@ /* remove text from outputTextStorage as defined by TextStorageUpperSizeLimit and TextStorageLowerSizeLimit */ if (outputTextStorage.length > TextStorageUpperSizeLimit) + { [outputTextStorage deleteCharactersInRange:NSMakeRange(0, [outputTextStorage length] - TextStorageLowerSizeLimit)]; + } if (self.window.isVisible) { [textView scrollToEndOfDocument:self]; } - - FILE *f = fopen(_outputLogFile.fileSystemRepresentation, "a"); - fprintf(f, "%s", text.UTF8String); - fclose(f); - - if (_encodeLogOn == YES && _outputLogFileForEncode != nil) - { - FILE *e = fopen(_outputLogFileForEncode.fileSystemRepresentation, "a"); - fprintf(e, "%s", text.UTF8String); - fclose(e); - } } - (void)stdoutRedirect:(NSString *)text { [self stderrRedirect:text]; } @@ -236,7 +147,7 @@ /* We want to rewrite the app version info to the top of the activity window so it is always present */ time_t _now = time( NULL ); struct tm * now = localtime( &_now ); - fprintf(stderr, "[%02d:%02d:%02d] macgui: %s\n", now->tm_hour, now->tm_min, now->tm_sec, [[self handBrakeVersion] UTF8String]); + fprintf(stderr, "[%02d:%02d:%02d] macgui: %s\n", now->tm_hour, now->tm_min, now->tm_sec, [[HBUtilities handBrakeVersion] UTF8String]); } /** @@ -247,7 +158,6 @@ NSPasteboard *pboard = [NSPasteboard generalPasteboard]; [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; [pboard setString:[outputTextStorage string] forType:NSStringPboardType]; - } /** @@ -256,7 +166,7 @@ - (IBAction)openActivityLogFile:(id)sender { /* Opens the activity window log file in the users default text editor */ - NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource: [NSString stringWithFormat: @"%@%@%@", @"tell application \"Finder\" to open (POSIX file \"", _outputLogFile, @"\")"]]; + NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource:[NSString stringWithFormat: @"%@%@%@", @"tell application \"Finder\" to open (POSIX file \"", self.outputFile.url.path, @"\")"]]; [myScript executeAndReturnError: nil]; [myScript release]; } @@ -283,14 +193,7 @@ - (IBAction)clearActivityLogFile:(id)sender { - /* We overwrite the existing output log with the new date and time header */ - /* Use the current date and time for the new output log header */ - NSString *startOutputLogString = [self logHeaderForReason:@"Session Starting"]; - [startOutputLogString writeToFile:_outputLogFile atomically:NO encoding:NSUTF8StringEncoding error:NULL]; - - /* We want to rewrite the app version info to the top of the activity window so it is always present */ - NSString *versionStringFull = [self handBrakeVersion]; - [versionStringFull writeToFile:_outputLogFile atomically:NO encoding:NSUTF8StringEncoding error:NULL]; + [self.outputFile clear]; } - (void)windowWillClose:(NSNotification *)aNotification @@ -298,5 +201,4 @@ [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"OutputPanelIsOpen"]; } - @end diff --git a/macosx/HBQueueController.h b/macosx/HBQueueController.h index 0a48dff66..0e00267b9 100644 --- a/macosx/HBQueueController.h +++ b/macosx/HBQueueController.h @@ -20,7 +20,6 @@ @property (nonatomic, assign) HBController *controller; @property (nonatomic, assign) HBAppDelegate *delegate; -@property (nonatomic, assign) HBOutputPanelController *outputPanel; @property (nonatomic, readonly) NSUInteger count; @property (nonatomic, readonly) NSUInteger pendingItemsCount; diff --git a/macosx/HBQueueController.m b/macosx/HBQueueController.m index fb7ff6385..aab0b0530 100644 --- a/macosx/HBQueueController.m +++ b/macosx/HBQueueController.m @@ -10,7 +10,6 @@ #import "HBCore.h" #import "HBController.h" #import "HBAppDelegate.h" -#import "HBOutputPanelController.h" #import "HBQueueOutlineView.h" #import "HBUtilities.h" @@ -22,6 +21,9 @@ #import "HBDockTile.h" +#import "HBOutputRedirect.h" +#import "HBJobOutputFileWriter.h" + // Pasteboard type for or drag operations #define DragDropSimplePboardType @"HBQueueCustomOutlineViewPboardType" @@ -43,6 +45,7 @@ @property (nonatomic, readonly) HBDistributedArray *jobs; @property (nonatomic, retain) HBJob *currentJob; +@property (nonatomic, retain) HBJobOutputFileWriter *currentLog; @property (nonatomic, readwrite) BOOL stop; @@ -59,13 +62,6 @@ { if (self = [super initWithWindowNibName:@"Queue"]) { - // NSWindowController likes to lazily load its window nib. Since this - // controller tries to touch the outlets before accessing the window, we - // need to force it to load immadiately by invoking its accessor. - // - // If/when we switch to using bindings, this can probably go away. - [self window]; - _descriptions = [[NSMutableDictionary alloc] init]; // Workaround to avoid a bug in Snow Leopard @@ -462,7 +458,9 @@ self.currentJob.state = HBJobStateWorking; // Tell HB to output a new activity log file for this encode - [self.outputPanel startEncodeLog:self.currentJob.destURL]; + self.currentLog = [[[HBJobOutputFileWriter alloc] initWithJob:self.currentJob] autorelease]; + [[HBOutputRedirect stderrRedirect] addListener:self.currentLog]; + [[HBOutputRedirect stdoutRedirect] addListener:self.currentLog]; // now we can go ahead and scan the new pending queue item [self performScan:self.currentJob.fileURL titleIdx:self.currentJob.titleIdx]; @@ -483,7 +481,9 @@ { // Since we are done with this encode, tell output to stop writing to the // individual encode log. - [self.outputPanel endEncodeLog]; + [[HBOutputRedirect stderrRedirect] removeListener:self.currentLog]; + [[HBOutputRedirect stdoutRedirect] removeListener:self.currentLog]; + self.currentLog = nil; // Check to see if the encode state has not been cancelled // to determine if we should check for encode done notifications. diff --git a/macosx/HBUtilities.h b/macosx/HBUtilities.h index 754e872ab..2e073d17a 100644 --- a/macosx/HBUtilities.h +++ b/macosx/HBUtilities.h @@ -9,6 +9,11 @@ @interface HBUtilities : NSObject /** + * Returns a formatted string that contains the application version. + */ ++ (NSString *)handBrakeVersion; + +/** * Returns the path of the current <user>/Library/Application Support/HandBrake folder. */ + (NSString *)appSupportPath; diff --git a/macosx/HBUtilities.m b/macosx/HBUtilities.m index eec539c2b..c661b2a26 100644 --- a/macosx/HBUtilities.m +++ b/macosx/HBUtilities.m @@ -9,6 +9,14 @@ @implementation HBUtilities ++ (NSString *)handBrakeVersion +{ + NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; + return [NSString stringWithFormat:@"Handbrake Version: %@ (%@)", + infoDictionary[@"CFBundleShortVersionString"], + infoDictionary[@"CFBundleVersion"]]; +} + + (NSString *)appSupportPath { NSString *appSupportPath = [[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, |