diff options
author | ritsuka <[email protected]> | 2015-02-20 07:59:38 +0000 |
---|---|---|
committer | ritsuka <[email protected]> | 2015-02-20 07:59:38 +0000 |
commit | 214fed29cdc153d4c0581bc0516b258a108cef22 (patch) | |
tree | 105b8454670e28f33a721a4d0b328dc2565a2446 /macosx/HBOutputPanelController.m | |
parent | fea0f7fa7473a10e56d6da95f47e03ba44ad2c35 (diff) |
MacGui: refactor the stderr/stdout redirect code to be more modular.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6927 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBOutputPanelController.m')
-rw-r--r-- | macosx/HBOutputPanelController.m | 160 |
1 files changed, 31 insertions, 129 deletions
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 |