Warning: opendir(/var/tmp/wsvnFKRvz5/TruePreview.m.r42) [function.opendir]: failed to open dir: Not a directory in /usr/local/www/websvn/dl.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /usr/local/www/websvn/dl.php:38) in /usr/local/www/websvn/dl.php on line 238

Warning: Cannot modify header information - headers already sent by (output started at /usr/local/www/websvn/dl.php:38) in /usr/local/www/websvn/dl.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /usr/local/www/websvn/dl.php:38) in /usr/local/www/websvn/dl.php on line 240
/* * Copyright (c) 2009-2011, Jim Riggs, Christian Serving, L.L.C. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Christian Serving, L.L.C. nor the names of * its contributors may be used to endorse or promote products * derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import "TruePreview.h" @implementation TruePreview #pragma mark Class initialization + (void)initialize { if (self == [TruePreview class]) { class_setSuperclass(self, NSClassFromString(@"MVMailBundle")); } [super registerBundle]; // register the preferences value transformers [NSValueTransformer setValueTransformer:[[TruePreviewPreferenceValueTransformer alloc] init] forName:@"TruePreviewPreferenceValueTransformer" ]; [NSValueTransformer setValueTransformer:[[TruePreviewPreferenceValueTransformerDelay alloc] init] forName:@"TruePreviewPreferenceValueTransformerDelay" ]; [NSValueTransformer setValueTransformer:[[TruePreviewPreferenceValueTransformerDelayEditIndicator alloc] init] forName:@"TruePreviewPreferenceValueTransformerDelayEditIndicator" ]; // add our "categories" [TruePreviewLibraryMessage truePreviewAddAsCategoryToClass:NSClassFromString(@"LibraryMessage")]; [TruePreviewMessageViewer truePreviewAddAsCategoryToClass:NSClassFromString(@"MessageViewer")]; [TruePreviewPreferences truePreviewAddAsCategoryToClass:NSClassFromString(@"NSPreferences")]; // do our swizzles [NSClassFromString(@"LibraryMessage") truePreviewSwizzleMethod:@selector(markAsViewed) withMethod:@selector(truePreviewMarkAsViewed) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(dealloc) withMethod:@selector(truePreviewDealloc) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(forwardAsAttachment:) withMethod:@selector(truePreviewForwardAsAttachment:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(forwardMessage:) withMethod:@selector(truePreviewForwardMessage:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(markAsRead:) withMethod:@selector(truePreviewMarkAsRead:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(markAsUnread:) withMethod:@selector(truePreviewMarkAsUnread:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(messageNoLongerDisplayedInTextView:) withMethod:@selector(truePreviewMessageNoLongerDisplayedInTextView:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(messageWasDisplayedInTextView:) withMethod:@selector(truePreviewMessageWasDisplayedInTextView:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(replyAllMessage:) withMethod:@selector(truePreviewReplyAllMessage:) isClassMethod:NO ]; [NSClassFromString(@"MessageViewer") truePreviewSwizzleMethod:@selector(replyMessage:) withMethod:@selector(truePreviewReplyMessage:) isClassMethod:NO ]; [NSClassFromString(@"NSPreferences") truePreviewSwizzleMethod:@selector(sharedPreferences) withMethod:@selector(truePreviewSharedPreferences) isClassMethod:YES ]; // set defaults [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:TRUEPREVIEW_DELAY_IMMEDIATE], @"TruePreviewDelay", [NSNumber numberWithInt:NSOnState], @"TruePreviewReply", [NSNumber numberWithInt:NSOnState], @"TruePreviewForward", [NSNumber numberWithInt:NSOnState], @"TruePreviewWindow", [NSNumber numberWithInt:NSOffState], @"TruePreviewScroll", nil ] ]; // we're all set NSLog( @"Loaded TruePreview plugin %@", [[NSBundle bundleForClass:[TruePreview class]] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey] ); } #pragma mark MVMailBundle class methods + (BOOL)hasPreferencesPanel { return YES; } + (NSString*)preferencesOwnerClassName { return @"TruePreviewPreferencesModule"; } + (NSString*)preferencesPanelName { return @"TruePreview"; } @end @implementation NSObject (TruePreviewObject) #pragma mark Class methods + (void)truePreviewAddAsCategoryToClass:(Class)inClass { unsigned int theCount = 0; Method* theMethods = class_copyMethodList(object_getClass([self class]), &theCount); Class theClass = object_getClass(inClass); unsigned int i = 0; while (YES) { for (i = 0; i < theCount; i++) { if ( !class_addMethod( theClass, method_getName(theMethods[i]), method_getImplementation(theMethods[i]), method_getTypeEncoding(theMethods[i]) ) ) { NSLog( @"truePreviewAddAsCategoryToClass: could not add %@ to %@", NSStringFromSelector(method_getName(theMethods[i])), inClass ); } } if (theMethods != nil) { free(theMethods); } if (theClass != inClass) { theClass = inClass; theMethods = class_copyMethodList([self class], &theCount); } else { break; } } } + (void)truePreviewSwizzleMethod:(SEL)inOriginalSelector withMethod:(SEL)inReplacementSelector isClassMethod:(BOOL)inIsClassMethod { Method theOriginalMethod = (!inIsClassMethod ? class_getInstanceMethod([self class], inOriginalSelector) : class_getClassMethod([self class], inOriginalSelector) ); Method theReplacementMethod = (!inIsClassMethod ? class_getInstanceMethod([self class], inReplacementSelector) : class_getClassMethod([self class], inReplacementSelector) ); method_exchangeImplementations(theOriginalMethod, theReplacementMethod); } @end