OSDN Git Service

for OS X 10.11 El Capitan beta (15A215h)
authorkurikinton <kurikinton@1b7a4b54-c1e6-488d-bad7-d7f5528e62ba>
Fri, 10 Jul 2015 05:28:56 +0000 (05:28 +0000)
committerkurikinton <kurikinton@1b7a4b54-c1e6-488d-bad7-d7f5528e62ba>
Fri, 10 Jul 2015 05:28:56 +0000 (05:28 +0000)
git-svn-id: svn+ssh://svn.osdn.net/svnroot/letter-fix/branches/mavericks/letter-fix@57 1b7a4b54-c1e6-488d-bad7-d7f5528e62ba

Info.plist
LFApp.h
LFApp.m
LetterFix.h
LetterFix.m

index d346246..2061f74 100644 (file)
@@ -9,7 +9,7 @@
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleIdentifier</key>
-       <string>org.kuri.${PRODUCT_NAME}</string>
+       <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
@@ -35,6 +35,7 @@
                <string>800E5C92-87D3-429B-8740-5C6183CD13EA</string>
                <string>7C051997-F45A-4523-B053-2D262F94C775</string>
                <string>60D52D22-7491-4CA7-95BA-88215BD88F8E</string>
+               <string>AB695A2B-4605-4A74-A99F-AF9F9C92C41B</string>
        </array>
 </dict>
 </plist>
diff --git a/LFApp.h b/LFApp.h
index 7c74143..c04a0cc 100644 (file)
--- a/LFApp.h
+++ b/LFApp.h
 #import <AppKit/AppKit.h>
 #import "LFMenu.h"
 
-#define LETTERFIX_VERSION "2.3.2"
+#define LETTERFIX_VERSION "2.4.0a"
 
 enum LFver {
     LF_Unknown = -1,
     LF_Mavericks = 0x1009,
-    LF_Yosemite = 0x1010
+    LF_Yosemite  = 0x1010,
+    LF_ElCapitan = 0x1011
 };
 
 @interface LFApp : NSObject {
diff --git a/LFApp.m b/LFApp.m
index 0f3aa6b..b870803 100644 (file)
--- a/LFApp.m
+++ b/LFApp.m
@@ -41,6 +41,8 @@
                    ver = LF_Mavericks;
                } else if (systemVersionMinor == 10) {
                    ver = LF_Yosemite;
+                } else if (systemVersionMinor == 11) {
+                    ver = LF_ElCapitan;
                } else {
                    ver = LF_Unknown;
                }
index 979d5f1..1637975 100644 (file)
@@ -78,6 +78,9 @@ typedef struct {
 - (int) messageType;
 - (id) headersEditor;
 - (NSObject *) backEnd;
+- (void) _LF_finishLoadingEditor;
+- (id) webView;
+- (id) composeWebView;
 @end
 
 @interface NSObject (ComposeBackEnd)
index 0175f43..b2342a8 100644 (file)
@@ -58,11 +58,9 @@ static void backendSetPreferredEncoding(id backend, unsigned long long encoding)
        Ivar ivar = object_getInstanceVariable(backend, "_flags", NULL);
        _LF_flags *_flags = (_LF_flags *)((char *)backend + ivar_getOffset(ivar));
        _flags->encodingHint = encoding;
-    } else if ([app ver] == LF_Yosemite) {
+    } else if ([app ver] == LF_Yosemite || [app ver] == LF_ElCapitan) {
        [backend setEncodingHint: encoding];
     }
-    //[backend setPreferredEncoding:LF_Encoding_ISO2022JP];
 }
 
 static unsigned long long backendGetPreferredEncoding(id backend)
@@ -71,11 +69,10 @@ static unsigned long long backendGetPreferredEncoding(id backend)
        Ivar ivar = object_getInstanceVariable(backend, "_flags", NULL);
        _LF_flags *_flags = (_LF_flags *)((char *)backend + ivar_getOffset(ivar));
        return _flags->encodingHint; //FIXME: [backend _encodingHint] return wrong value?
-    } else if ([app ver] == LF_Yosemite) {
+    } else if ([app ver] == LF_Yosemite || [app ver] == LF_ElCapitan) {
        return [backend encodingHint];
     }
     return LF_Encoding_Auto;
-    //return [backend preferredEncoding];
 }
 
 int fixTextNode(DOMText *node, DOMRange *range, BOOL isCheck, BOOL isOpen)
@@ -485,11 +482,72 @@ BOOL _LF_IMP_isLoaded(id self, SEL _cmd)
     return result;
 }
 
+void _LF_IMP_finishLoadingEditor(id self, SEL _cmd)
+{
+    [self _LF_finishLoadingEditor];
+
+    if ([app isActive] == NO) {
+        return;
+    }
+
+    @try {
+        id composeView = [self composeWebView];
+        if ((composeView==NULL) || ([(WebView *)composeView isLoading]==YES) || ([(WebView *)composeView isEditable]==NO)) {
+            NSLog(@"composeView NULL!!");
+            return;
+        }
+        
+        switch ([self messageType]) {
+            case 1: // 返信
+            case 2: // 全員に返信
+            case 3: // 転送
+            case 4: // 下書きを開く
+            case 7: // リダイレクト
+            case 8: // 差出人に返信
+                break;
+            case 5: // 新規メッセージ
+            case 14:// 添付ファイルとして返信
+                return;
+            default:
+                NSLog(@"Unknown MessageType: %d", [self messageType]);
+                return;
+        }
+        
+        if (0 < fixLetter(self, composeView, TRUE, TRUE) || checkSubjectOnLoad(self)) {
+            if ([app operationAtOpen] == 0) {
+                NSAlert *alert = [[[NSAlert alloc] init] autorelease];
+                [alert addButtonWithTitle:@"変換"];
+                [alert addButtonWithTitle:@"変換しない"];
+                [alert setShowsSuppressionButton:TRUE];
+                [alert setMessageText:@"編集前にメッセージを変換しますか?"];
+                [alert setInformativeText:@"このメッセージには ISO 2022-JP でエンコードできない文字が含まれています。"];
+                [alert setAlertStyle:NSInformationalAlertStyle];
+                [alert beginSheetModalForWindow:[self window] completionHandler:^(NSModalResponse returnCode){
+                }];
+//                [alert runModal];
+            } else if ([app operationAtOpen] == 1) {
+                fixSubjectOnLoad(self);
+                fixLetter(self, composeView, FALSE, TRUE);
+                [[self backEnd] setHasChanges:FALSE];
+            }
+        }
+    }
+    @catch (NSException * exception) {
+        NSLog(@"LetterFix: caught %@ %@", [exception name], [exception reason]);
+    }
+    
+    return;
+}
+
 void alert0DidEnd_returnCode_contextInfo_(id self, SEL _cmd, id alert, int returnCode, void* arg1)
 {
     if (returnCode == NSAlertFirstButtonReturn) {
         fixSubjectOnLoad(self);
-       fixLetter(self, [self webView], FALSE, TRUE);
+        if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+            fixLetter(self, [self webView], FALSE, TRUE);
+        } else if ([app ver] == LF_ElCapitan) {
+            fixLetter(self, [self composeWebView], FALSE, TRUE);
+        }
        //[[self backEnd] setHasChanges:FALSE];
     } else if (returnCode == NSAlertSecondButtonReturn) {
     }
@@ -508,9 +566,19 @@ void _LF_IMP_send_(id self, SEL _cmd, id arg1)
        [self _LF_send: arg1];
        return;
     }
+
+    id composeView;
+    if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+        composeView = [self webView];
+    } else if ([app ver] == LF_ElCapitan) {
+        composeView = [self composeWebView];
+    } else {
+        [self _LF_send: arg1];
+        return;
+    }
     
     backendSetPreferredEncoding([self backEnd], LF_Encoding_ISO2022JP);
-    if (0 < fixLetter(self, [self webView], TRUE, FALSE)) {
+    if (0 < fixLetter(self, composeView, TRUE, FALSE)) {
         NSAlert *alert = [[[NSAlert alloc] init] autorelease];
        [alert addButtonWithTitle:@"変換して送信"];
        [alert addButtonWithTitle:@"キャンセル"];
@@ -549,7 +617,11 @@ void _LF_alertSubject(id self, SEL _cmd, id arg1)
 void alert1DidEnd_returnCode_contextInfo_(id self, SEL _cmd, id alert, int returnCode, void* arg1)
 {
     if (returnCode == NSAlertFirstButtonReturn) {
-       fixLetter(self, [self webView], FALSE, FALSE);
+        if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+            fixLetter(self, [self webView], FALSE, FALSE);
+        } else if ([app ver] == LF_ElCapitan) {
+            fixLetter(self, [self composeWebView], FALSE, FALSE);
+        }
        if (backendGetPreferredEncoding([self backEnd]) != LF_Encoding_ISO2022JP) backendSetPreferredEncoding([self backEnd], LF_Encoding_ISO2022JP);
        [[alert window] orderOut:arg1];
        if (([app isCheckSubject] != NO) && checkSubject(self)) _LF_alertSubject(self, _cmd, arg1);
@@ -563,7 +635,11 @@ void alert1DidEnd_returnCode_contextInfo_(id self, SEL _cmd, id alert, int retur
        [[alert window] orderOut:arg1];
        [self _LF_send: arg1];
     } else if (returnCode == (NSAlertThirdButtonReturn + 1)) { // 変換のみ
-       fixLetter(self, [self webView], FALSE, FALSE);
+        if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+            fixLetter(self, [self webView], FALSE, FALSE);
+        } else if ([app ver] == LF_ElCapitan) {
+            fixLetter(self, [self composeWebView], FALSE, FALSE);
+        }
        if (backendGetPreferredEncoding([self backEnd]) != LF_Encoding_ISO2022JP) backendSetPreferredEncoding([self backEnd], LF_Encoding_ISO2022JP);
     }
 }
@@ -586,7 +662,17 @@ void alert3DidEnd_returnCode_contextInfo_(id self, SEL _cmd, id alert, int retur
 
 void _LF_IMP_saveDocument_(id self, SEL _cmd, id arg1)
 {
-    if (([app isActive] != NO) && ([check_at_save containsObject:self]==NO) &&(0 < fixLetter(self, [self webView], TRUE, FALSE)) && (backendGetPreferredEncoding([self backEnd]) == LF_Encoding_ISO2022JP)) {
+    id composeView;
+    if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+        composeView = [self webView];
+    } else if ([app ver] == LF_ElCapitan) {
+        composeView = [self composeWebView];
+    } else {
+        [self _LF_saveDocument: arg1];
+        return;
+    }
+    
+    if (([app isActive] != NO) && ([check_at_save containsObject:self]==NO) &&(0 < fixLetter(self, composeView, TRUE, FALSE)) && (backendGetPreferredEncoding([self backEnd]) == LF_Encoding_ISO2022JP)) {
        NSAlert *alert = [[[NSAlert alloc] init] autorelease];
        [alert addButtonWithTitle:@"変換"];
        [alert addButtonWithTitle:@"変換しない"];
@@ -603,7 +689,11 @@ void _LF_IMP_saveDocument_(id self, SEL _cmd, id arg1)
 void alert2DidEnd_returnCode_contextInfo_(id self, SEL _cmd, id alert, int returnCode, void* arg1)
 {
     if (returnCode == NSAlertFirstButtonReturn) {
-       fixLetter(self, [self webView], FALSE, FALSE);
+        if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+            fixLetter(self, [self webView], FALSE, FALSE);
+        } else if ([app ver] == LF_ElCapitan) {
+            fixLetter(self, [self composeWebView], FALSE, FALSE);
+        }
     } else if (returnCode == NSAlertSecondButtonReturn) {
        [check_at_save addObject:self];
     }
@@ -618,7 +708,6 @@ void _LF_IMP_animationCompleted(id self, SEL _cmd)
 }
 
 #define MVMailBundle        (NSClassFromString(@"MVMailBundle"))
-#define LFDocumentEditor    (NSClassFromString(@"DocumentEditor"))
 
 @implementation LetterFix
 + (void) initialize
@@ -632,18 +721,32 @@ void _LF_IMP_animationCompleted(id self, SEL _cmd)
     
     app = [[LFApp alloc] init];
     
+    Class editorClass = nil;
+    if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+        editorClass = NSClassFromString(@"DocumentEditor");
+    } else if ([app ver] == LF_ElCapitan) {
+        editorClass = NSClassFromString(@"ComposeViewController");
+    } else {
+        return;
+    }
     
     //
     // swizzling method
     //
-    swizzlingMethod(LFDocumentEditor, @selector(isLoaded), @selector(_LF_isLoaded), (IMP)_LF_IMP_isLoaded);
-    swizzlingMethod(LFDocumentEditor, @selector(send:), @selector(_LF_send:), (IMP)_LF_IMP_send_);
-    swizzlingMethod(LFDocumentEditor, @selector(saveDocument:), @selector(_LF_saveDocument:), (IMP)_LF_IMP_saveDocument_);
-    swizzlingMethod(LFDocumentEditor, @selector(_animationCompleted), @selector(_LF_animationCompleted), (IMP)_LF_IMP_animationCompleted);
-    class_addMethod(LFDocumentEditor, @selector(_LF_alert0DidEnd:returnCode:contextInfo:), (IMP)alert0DidEnd_returnCode_contextInfo_, "v@:@i^v");
-    class_addMethod(LFDocumentEditor, @selector(_LF_alert1DidEnd:returnCode:contextInfo:), (IMP)alert1DidEnd_returnCode_contextInfo_, "v@:@i^v");
-    class_addMethod(LFDocumentEditor, @selector(_LF_alert2DidEnd:returnCode:contextInfo:), (IMP)alert2DidEnd_returnCode_contextInfo_, "v@:@i^v");
-    class_addMethod(LFDocumentEditor, @selector(_LF_alert3DidEnd:returnCode:contextInfo:), (IMP)alert3DidEnd_returnCode_contextInfo_, "v@:@i^v");
+    if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+        swizzlingMethod(editorClass, @selector(isLoaded), @selector(_LF_isLoaded), (IMP)_LF_IMP_isLoaded);
+    } else if ([app ver] == LF_ElCapitan) {
+        swizzlingMethod(editorClass, @selector(finishLoadingEditor), @selector(_LF_finishLoadingEditor), (IMP)_LF_IMP_finishLoadingEditor);
+    }
+    swizzlingMethod(editorClass, @selector(send:), @selector(_LF_send:), (IMP)_LF_IMP_send_);
+    swizzlingMethod(editorClass, @selector(saveDocument:), @selector(_LF_saveDocument:), (IMP)_LF_IMP_saveDocument_);
+    if ([app ver] == LF_Mavericks || [app ver] == LF_Yosemite) {
+        swizzlingMethod(editorClass, @selector(_animationCompleted), @selector(_LF_animationCompleted), (IMP)_LF_IMP_animationCompleted);
+    }
+    class_addMethod(editorClass, @selector(_LF_alert0DidEnd:returnCode:contextInfo:), (IMP)alert0DidEnd_returnCode_contextInfo_, "v@:@i^v");
+    class_addMethod(editorClass, @selector(_LF_alert1DidEnd:returnCode:contextInfo:), (IMP)alert1DidEnd_returnCode_contextInfo_, "v@:@i^v");
+    class_addMethod(editorClass, @selector(_LF_alert2DidEnd:returnCode:contextInfo:), (IMP)alert2DidEnd_returnCode_contextInfo_, "v@:@i^v");
+    class_addMethod(editorClass, @selector(_LF_alert3DidEnd:returnCode:contextInfo:), (IMP)alert3DidEnd_returnCode_contextInfo_, "v@:@i^v");
     //
     // end of swizzling method
     //