From 5b54612d91129afb92aee01e14984e7e2e401709 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 20:41:51 -0700 Subject: [PATCH 1/3] Pass authtoken in from user, and add a wrapper for web UI on Mac. --- ext/mac-ui-macgap1-wrapper/LICENSE | 25 + .../MacGap.xcodeproj/project.pbxproj | 492 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/MacGap.xccheckout | 41 + .../UserInterfaceState.xcuserstate | Bin 0 -> 46675 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 18268 bytes .../WorkspaceSettings.xcsettings | 10 + .../UserInterfaceState.xcuserstate | Bin 0 -> 27811 bytes .../WorkspaceSettings.xcsettings | 10 + .../xcdebugger/Breakpoints.xcbkptlist | 131 + .../xcschemes/MacGap.xcscheme | 86 + .../xcschemes/xcschememanagement.plist | 22 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../api.xcuserdatad/xcschemes/MacGap.xcscheme | 88 + .../xcschemes/xcschememanagement.plist | 22 + .../xcdebugger/Breakpoints.xcbkptlist | 161 + .../xcschemes/MacGap.xcscheme | 84 + .../xcschemes/xcschememanagement.plist | 22 + .../MacGap/AppDelegate.h | 18 + .../MacGap/AppDelegate.m | 110 + .../MacGap/Classes/CallbackDelegate.h | 20 + .../MacGap/Classes/CallbackDelegate.m | 168 + .../MacGap/Classes/Commands/App.h | 21 + .../MacGap/Classes/Commands/App.m | 128 + .../MacGap/Classes/Commands/Command.h | 18 + .../MacGap/Classes/Commands/Command.m | 28 + .../MacGap/Classes/Commands/Dock.h | 11 + .../MacGap/Classes/Commands/Dock.m | 31 + .../MacGap/Classes/Commands/MenuItemProxy.h | 31 + .../MacGap/Classes/Commands/MenuItemProxy.m | 150 + .../MacGap/Classes/Commands/MenuProxy.h | 31 + .../MacGap/Classes/Commands/MenuProxy.m | 233 ++ .../MacGap/Classes/Commands/Notice.h | 26 + .../MacGap/Classes/Commands/Notice.m | 108 + .../MacGap/Classes/Commands/Path.h | 21 + .../MacGap/Classes/Commands/Path.m | 53 + .../MacGap/Classes/Commands/Sound.h | 17 + .../MacGap/Classes/Commands/Sound.m | 97 + .../MacGap/Classes/Commands/UserDefaults.h | 43 + .../MacGap/Classes/Commands/UserDefaults.m | 211 + .../MacGap/Classes/Commands/fonts.h | 9 + .../MacGap/Classes/Commands/fonts.m | 48 + .../MacGap/Classes/Constants.h | 7 + .../MacGap/Classes/ContentView.h | 15 + .../MacGap/Classes/ContentView.m | 68 + .../MacGap/Classes/JSEventHelper.h | 20 + .../MacGap/Classes/JSEventHelper.m | 41 + .../MacGap/Classes/Utils.h | 20 + .../MacGap/Classes/Utils.m | 93 + .../MacGap/Classes/WebViewDelegate.h | 49 + .../MacGap/Classes/WebViewDelegate.m | 206 + .../MacGap/Classes/Window.h | 23 + .../MacGap/Classes/Window.m | 94 + ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h | 10 + ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m | 51 + .../MacGap/MacGap-Info.plist | 34 + .../MacGap/MacGap-Prefix.pch | 15 + .../MacGap/WindowController.h | 13 + .../MacGap/WindowController.m | 54 + .../MacGap/en.lproj/Credits.rtf | 13 + .../MacGap/en.lproj/InfoPlist.strings | 2 + .../MacGap/en.lproj/MainMenu.xib | 3404 +++++++++++++++++ .../MacGap/en.lproj/Window.xib | 337 ++ ext/mac-ui-macgap1-wrapper/MacGap/main.m | 14 + ext/mac-ui-macgap1-wrapper/README.md | 36 + ext/mac-ui-macgap1-wrapper/application.icns | Bin 0 -> 88566 bytes ext/mac-ui-macgap1-wrapper/public/index.html | 33 + ui/main.jsx | 49 +- 68 files changed, 7537 insertions(+), 1 deletion(-) create mode 100644 ext/mac-ui-macgap1-wrapper/LICENSE create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/main.m create mode 100644 ext/mac-ui-macgap1-wrapper/README.md create mode 100644 ext/mac-ui-macgap1-wrapper/application.icns create mode 100644 ext/mac-ui-macgap1-wrapper/public/index.html diff --git a/ext/mac-ui-macgap1-wrapper/LICENSE b/ext/mac-ui-macgap1-wrapper/LICENSE new file mode 100644 index 000000000..c7fd4a4a5 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/LICENSE @@ -0,0 +1,25 @@ +MacGap was ported from phonegap-mac, and is under the same license (MIT) + +The MIT License +***************** + +Copyright (c) <2012> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj new file mode 100644 index 000000000..ea339cf0a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj @@ -0,0 +1,492 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1495814F15C15CCC00E1CFE5 /* Notice.m in Sources */ = {isa = PBXBuildFile; fileRef = 1495814E15C15CCC00E1CFE5 /* Notice.m */; }; + 6F169DA718CC332E005EDDF3 /* Command.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DA618CC332E005EDDF3 /* Command.m */; }; + 6F169DAA18CC35FD005EDDF3 /* CallbackDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */; }; + 6F169DAC18CD8A4A005EDDF3 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */; }; + 6F169DB118CD906F005EDDF3 /* MenuItemProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */; }; + 6F169DB218CD906F005EDDF3 /* MenuProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DB018CD906F005EDDF3 /* MenuProxy.m */; }; + 6FD672B618FE618E00C0DAAD /* UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FD672B518FE618E00C0DAAD /* UserDefaults.m */; }; + 6FD6E4ED18C2D48C00DFFBE6 /* fonts.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */; }; + 88746BEE14CCA435001E160E /* JSEventHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 88746BED14CCA435001E160E /* JSEventHelper.m */; }; + 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0645F14BDE10A00E4BCE2 /* Window.m */; }; + 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88C0646414BDEC5800E4BCE2 /* Window.xib */; }; + 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0646C14BDF6A600E4BCE2 /* WindowController.m */; }; + C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1C2B9901AFB0CF10060D7C2 /* Security.framework */; }; + F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B80015179E0FC100B069A8 /* Clipboard.m */; }; + FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA32509C14BA813600BF0781 /* WebKit.framework */; }; + FA3250C314BA85E700BF0781 /* ContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250BC14BA85E700BF0781 /* ContentView.m */; }; + FA3250C514BA85E700BF0781 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250BE14BA85E700BF0781 /* Utils.m */; }; + FA3250C714BA85E700BF0781 /* WebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250C014BA85E700BF0781 /* WebViewDelegate.m */; }; + FA3250D314BA860800BF0781 /* App.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250C914BA860800BF0781 /* App.m */; }; + FA3250D514BA860800BF0781 /* Dock.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250CB14BA860800BF0781 /* Dock.m */; }; + FA3250D914BA860800BF0781 /* Path.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250CF14BA860800BF0781 /* Path.m */; }; + FA3250DB14BA860800BF0781 /* Sound.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250D114BA860800BF0781 /* Sound.m */; }; + FA3250E514BA883A00BF0781 /* public in Resources */ = {isa = PBXBuildFile; fileRef = FA3250E414BA883A00BF0781 /* public */; }; + FA3250E714BA8BCE00BF0781 /* application.icns in Resources */ = {isa = PBXBuildFile; fileRef = FA3250E614BA8BCE00BF0781 /* application.icns */; }; + FA3F7742168F70790027B324 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA3F7741168F70780027B324 /* Cocoa.framework */; }; + FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FAE451C714BA79C600190544 /* InfoPlist.strings */; }; + FAE451CB14BA79C600190544 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE451CA14BA79C600190544 /* main.m */; }; + FAE451CF14BA79C600190544 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = FAE451CD14BA79C600190544 /* Credits.rtf */; }; + FAE451D214BA79C600190544 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE451D114BA79C600190544 /* AppDelegate.m */; }; + FAE451D514BA79C600190544 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAE451D314BA79C600190544 /* MainMenu.xib */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + FA3250DD14BA876F00BF0781 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1495814D15C15CCC00E1CFE5 /* Notice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Notice.h; path = Classes/Commands/Notice.h; sourceTree = ""; }; + 1495814E15C15CCC00E1CFE5 /* Notice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Notice.m; path = Classes/Commands/Notice.m; sourceTree = ""; }; + 6F169DA518CC332E005EDDF3 /* Command.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Command.h; path = Classes/Commands/Command.h; sourceTree = ""; }; + 6F169DA618CC332E005EDDF3 /* Command.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Command.m; path = Classes/Commands/Command.m; sourceTree = ""; }; + 6F169DA818CC35FD005EDDF3 /* CallbackDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CallbackDelegate.h; path = Classes/CallbackDelegate.h; sourceTree = ""; }; + 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CallbackDelegate.m; path = Classes/CallbackDelegate.m; sourceTree = ""; }; + 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + 6F169DAD18CD906F005EDDF3 /* MenuItemProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuItemProxy.h; path = Classes/Commands/MenuItemProxy.h; sourceTree = ""; }; + 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuItemProxy.m; path = Classes/Commands/MenuItemProxy.m; sourceTree = ""; }; + 6F169DAF18CD906F005EDDF3 /* MenuProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuProxy.h; path = Classes/Commands/MenuProxy.h; sourceTree = ""; }; + 6F169DB018CD906F005EDDF3 /* MenuProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuProxy.m; path = Classes/Commands/MenuProxy.m; sourceTree = ""; }; + 6FD672B418FE618E00C0DAAD /* UserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UserDefaults.h; path = Classes/Commands/UserDefaults.h; sourceTree = ""; }; + 6FD672B518FE618E00C0DAAD /* UserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UserDefaults.m; path = Classes/Commands/UserDefaults.m; sourceTree = ""; }; + 6FD6E4EB18C2D48200DFFBE6 /* fonts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fonts.h; path = Classes/Commands/fonts.h; sourceTree = ""; }; + 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = fonts.m; path = Classes/Commands/fonts.m; sourceTree = ""; }; + 88746BEC14CCA435001E160E /* JSEventHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSEventHelper.h; path = Classes/JSEventHelper.h; sourceTree = ""; }; + 88746BED14CCA435001E160E /* JSEventHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JSEventHelper.m; path = Classes/JSEventHelper.m; sourceTree = ""; }; + 88C0645E14BDE10A00E4BCE2 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Window.h; path = Classes/Window.h; sourceTree = ""; }; + 88C0645F14BDE10A00E4BCE2 /* Window.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Window.m; path = Classes/Window.m; sourceTree = ""; }; + 88C0646514BDEC5800E4BCE2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Window.xib; sourceTree = ""; }; + 88C0646B14BDF6A600E4BCE2 /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowController.h; sourceTree = ""; }; + 88C0646C14BDF6A600E4BCE2 /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowController.m; sourceTree = ""; }; + C1C2B9901AFB0CF10060D7C2 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + F2B80014179E0FC100B069A8 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = ""; }; + F2B80015179E0FC100B069A8 /* Clipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clipboard.m; sourceTree = ""; }; + FA32509C14BA813600BF0781 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + FA3250BA14BA85E700BF0781 /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Constants.h; path = Classes/Constants.h; sourceTree = ""; }; + FA3250BB14BA85E700BF0781 /* ContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContentView.h; path = Classes/ContentView.h; sourceTree = ""; }; + FA3250BC14BA85E700BF0781 /* ContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ContentView.m; path = Classes/ContentView.m; sourceTree = ""; }; + FA3250BD14BA85E700BF0781 /* Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Classes/Utils.h; sourceTree = ""; }; + FA3250BE14BA85E700BF0781 /* Utils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = Classes/Utils.m; sourceTree = ""; }; + FA3250BF14BA85E700BF0781 /* WebViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WebViewDelegate.h; path = Classes/WebViewDelegate.h; sourceTree = ""; }; + FA3250C014BA85E700BF0781 /* WebViewDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WebViewDelegate.m; path = Classes/WebViewDelegate.m; sourceTree = ""; }; + FA3250C814BA860800BF0781 /* App.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = App.h; path = Classes/Commands/App.h; sourceTree = ""; }; + FA3250C914BA860800BF0781 /* App.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = App.m; path = Classes/Commands/App.m; sourceTree = ""; }; + FA3250CA14BA860800BF0781 /* Dock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dock.h; path = Classes/Commands/Dock.h; sourceTree = ""; }; + FA3250CB14BA860800BF0781 /* Dock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Dock.m; path = Classes/Commands/Dock.m; sourceTree = ""; }; + FA3250CE14BA860800BF0781 /* Path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Path.h; path = Classes/Commands/Path.h; sourceTree = ""; }; + FA3250CF14BA860800BF0781 /* Path.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Path.m; path = Classes/Commands/Path.m; sourceTree = ""; }; + FA3250D014BA860800BF0781 /* Sound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Sound.h; path = Classes/Commands/Sound.h; sourceTree = ""; }; + FA3250D114BA860800BF0781 /* Sound.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Sound.m; path = Classes/Commands/Sound.m; sourceTree = ""; }; + FA3250E414BA883A00BF0781 /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + FA3250E614BA8BCE00BF0781 /* application.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = application.icns; sourceTree = SOURCE_ROOT; }; + FA3F7741168F70780027B324 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; + FAE451BA14BA79C600190544 /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + FAE451BE14BA79C600190544 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + FAE451C114BA79C600190544 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + FAE451C214BA79C600190544 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + FAE451C314BA79C600190544 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + FAE451C614BA79C600190544 /* MacGap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MacGap-Info.plist"; sourceTree = ""; }; + FAE451C814BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + FAE451CA14BA79C600190544 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FAE451CC14BA79C600190544 /* MacGap-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MacGap-Prefix.pch"; sourceTree = ""; }; + FAE451CE14BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + FAE451D014BA79C600190544 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + FAE451D114BA79C600190544 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + FAE451D414BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FAE451B714BA79C600190544 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */, + 6F169DAC18CD8A4A005EDDF3 /* JavaScriptCore.framework in Frameworks */, + FA3F7742168F70790027B324 /* Cocoa.framework in Frameworks */, + FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + FA3250E014BA87B800BF0781 /* Classes */ = { + isa = PBXGroup; + children = ( + FA3250E114BA87DD00BF0781 /* Commands */, + FA3250BA14BA85E700BF0781 /* Constants.h */, + 6F169DA818CC35FD005EDDF3 /* CallbackDelegate.h */, + 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */, + FA3250BB14BA85E700BF0781 /* ContentView.h */, + FA3250BC14BA85E700BF0781 /* ContentView.m */, + FA3250BF14BA85E700BF0781 /* WebViewDelegate.h */, + FA3250C014BA85E700BF0781 /* WebViewDelegate.m */, + 88C0646B14BDF6A600E4BCE2 /* WindowController.h */, + 88C0646C14BDF6A600E4BCE2 /* WindowController.m */, + ); + name = Classes; + sourceTree = ""; + }; + FA3250E114BA87DD00BF0781 /* Commands */ = { + isa = PBXGroup; + children = ( + 6F169DA518CC332E005EDDF3 /* Command.h */, + 6F169DA618CC332E005EDDF3 /* Command.m */, + 1495814D15C15CCC00E1CFE5 /* Notice.h */, + 1495814E15C15CCC00E1CFE5 /* Notice.m */, + FA3250CA14BA860800BF0781 /* Dock.h */, + FA3250CB14BA860800BF0781 /* Dock.m */, + 6FD6E4EB18C2D48200DFFBE6 /* fonts.h */, + 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */, + FA3250BD14BA85E700BF0781 /* Utils.h */, + FA3250BE14BA85E700BF0781 /* Utils.m */, + 6FD672B418FE618E00C0DAAD /* UserDefaults.h */, + 6FD672B518FE618E00C0DAAD /* UserDefaults.m */, + FA3250CE14BA860800BF0781 /* Path.h */, + FA3250CF14BA860800BF0781 /* Path.m */, + FA3250D014BA860800BF0781 /* Sound.h */, + FA3250D114BA860800BF0781 /* Sound.m */, + FA3250C814BA860800BF0781 /* App.h */, + FA3250C914BA860800BF0781 /* App.m */, + 6F169DAD18CD906F005EDDF3 /* MenuItemProxy.h */, + 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */, + 6F169DAF18CD906F005EDDF3 /* MenuProxy.h */, + 6F169DB018CD906F005EDDF3 /* MenuProxy.m */, + 88C0645E14BDE10A00E4BCE2 /* Window.h */, + 88C0645F14BDE10A00E4BCE2 /* Window.m */, + 88746BEC14CCA435001E160E /* JSEventHelper.h */, + 88746BED14CCA435001E160E /* JSEventHelper.m */, + F2B80014179E0FC100B069A8 /* Clipboard.h */, + F2B80015179E0FC100B069A8 /* Clipboard.m */, + ); + name = Commands; + sourceTree = ""; + }; + FAE451AF14BA79C600190544 = { + isa = PBXGroup; + children = ( + FA3F7741168F70780027B324 /* Cocoa.framework */, + FA3250E414BA883A00BF0781 /* public */, + FAE451C414BA79C600190544 /* MacGap */, + FAE451BD14BA79C600190544 /* Frameworks */, + FAE451BB14BA79C600190544 /* Products */, + ); + sourceTree = ""; + }; + FAE451BB14BA79C600190544 /* Products */ = { + isa = PBXGroup; + children = ( + FAE451BA14BA79C600190544 /* ZeroTier One.app */, + ); + name = Products; + sourceTree = ""; + }; + FAE451BD14BA79C600190544 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C1C2B9901AFB0CF10060D7C2 /* Security.framework */, + 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */, + FA32509C14BA813600BF0781 /* WebKit.framework */, + FAE451BE14BA79C600190544 /* Cocoa.framework */, + FAE451C014BA79C600190544 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + FAE451C014BA79C600190544 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + FAE451C114BA79C600190544 /* AppKit.framework */, + FAE451C214BA79C600190544 /* CoreData.framework */, + FAE451C314BA79C600190544 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + FAE451C414BA79C600190544 /* MacGap */ = { + isa = PBXGroup; + children = ( + FA3250E014BA87B800BF0781 /* Classes */, + FAE451D014BA79C600190544 /* AppDelegate.h */, + FAE451D114BA79C600190544 /* AppDelegate.m */, + FAE451D314BA79C600190544 /* MainMenu.xib */, + 88C0646414BDEC5800E4BCE2 /* Window.xib */, + FAE451C514BA79C600190544 /* Supporting Files */, + ); + path = MacGap; + sourceTree = ""; + }; + FAE451C514BA79C600190544 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + FA3250E614BA8BCE00BF0781 /* application.icns */, + FAE451C614BA79C600190544 /* MacGap-Info.plist */, + FAE451C714BA79C600190544 /* InfoPlist.strings */, + FAE451CA14BA79C600190544 /* main.m */, + FAE451CC14BA79C600190544 /* MacGap-Prefix.pch */, + FAE451CD14BA79C600190544 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FAE451B914BA79C600190544 /* MacGap */ = { + isa = PBXNativeTarget; + buildConfigurationList = FAE451D814BA79C600190544 /* Build configuration list for PBXNativeTarget "MacGap" */; + buildPhases = ( + FAE451B814BA79C600190544 /* Resources */, + FAE451B614BA79C600190544 /* Sources */, + FAE451B714BA79C600190544 /* Frameworks */, + FA3250DD14BA876F00BF0781 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MacGap; + productName = MacGap; + productReference = FAE451BA14BA79C600190544 /* ZeroTier One.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FAE451B114BA79C600190544 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = Twitter; + }; + buildConfigurationList = FAE451B414BA79C600190544 /* Build configuration list for PBXProject "MacGap" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = FAE451AF14BA79C600190544; + productRefGroup = FAE451BB14BA79C600190544 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FAE451B914BA79C600190544 /* MacGap */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FAE451B814BA79C600190544 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FA3250E514BA883A00BF0781 /* public in Resources */, + FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */, + FAE451CF14BA79C600190544 /* Credits.rtf in Resources */, + FAE451D514BA79C600190544 /* MainMenu.xib in Resources */, + FA3250E714BA8BCE00BF0781 /* application.icns in Resources */, + 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FAE451B614BA79C600190544 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F169DAA18CC35FD005EDDF3 /* CallbackDelegate.m in Sources */, + FA3250D314BA860800BF0781 /* App.m in Sources */, + FA3250D514BA860800BF0781 /* Dock.m in Sources */, + FA3250D914BA860800BF0781 /* Path.m in Sources */, + FA3250DB14BA860800BF0781 /* Sound.m in Sources */, + FA3250C314BA85E700BF0781 /* ContentView.m in Sources */, + FA3250C514BA85E700BF0781 /* Utils.m in Sources */, + FA3250C714BA85E700BF0781 /* WebViewDelegate.m in Sources */, + FAE451CB14BA79C600190544 /* main.m in Sources */, + 6F169DB118CD906F005EDDF3 /* MenuItemProxy.m in Sources */, + FAE451D214BA79C600190544 /* AppDelegate.m in Sources */, + 6F169DA718CC332E005EDDF3 /* Command.m in Sources */, + 6FD672B618FE618E00C0DAAD /* UserDefaults.m in Sources */, + 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */, + 6F169DB218CD906F005EDDF3 /* MenuProxy.m in Sources */, + 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */, + 6FD6E4ED18C2D48C00DFFBE6 /* fonts.m in Sources */, + 88746BEE14CCA435001E160E /* JSEventHelper.m in Sources */, + 1495814F15C15CCC00E1CFE5 /* Notice.m in Sources */, + F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 88C0646414BDEC5800E4BCE2 /* Window.xib */ = { + isa = PBXVariantGroup; + children = ( + 88C0646514BDEC5800E4BCE2 /* en */, + ); + name = Window.xib; + sourceTree = ""; + }; + FAE451C714BA79C600190544 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + FAE451C814BA79C600190544 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + FAE451CD14BA79C600190544 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + FAE451CE14BA79C600190544 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + FAE451D314BA79C600190544 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + FAE451D414BA79C600190544 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FAE451D614BA79C600190544 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = ""; + }; + name = Debug; + }; + FAE451D714BA79C600190544 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = ""; + }; + name = Release; + }; + FAE451D914BA79C600190544 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MacGap\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MacGap/MacGap-Prefix.pch"; + GCC_VERSION = ""; + INFOPLIST_FILE = "MacGap/MacGap-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + FAE451DA14BA79C600190544 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MacGap\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MacGap/MacGap-Prefix.pch"; + GCC_VERSION = ""; + INFOPLIST_FILE = "MacGap/MacGap-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FAE451B414BA79C600190544 /* Build configuration list for PBXProject "MacGap" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FAE451D614BA79C600190544 /* Debug */, + FAE451D714BA79C600190544 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FAE451D814BA79C600190544 /* Build configuration list for PBXNativeTarget "MacGap" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FAE451D914BA79C600190544 /* Debug */, + FAE451DA14BA79C600190544 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = FAE451B114BA79C600190544 /* Project object */; +} diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..88f36fc7b --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout new file mode 100644 index 000000000..b2ea215df --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 4D486E78-E297-4CC3-AAAE-1A58EDAC87E6 + IDESourceControlProjectName + MacGap + IDESourceControlProjectOriginsDictionary + + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + https://github.com/MacGapProject/MacGap1.git + + IDESourceControlProjectPath + MacGap.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ../.. + + IDESourceControlProjectURL + https://github.com/MacGapProject/MacGap1.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + IDESourceControlWCCName + MacGap1 + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..20281812beaefed26ed5a7ceb16e431be71ad75f GIT binary patch literal 46675 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 IMozN_0249hqyPW_ literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..04ade238606e9d7a8d4efba88066f44ffaac7322 GIT binary patch literal 18268 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 SCMF2Y2I + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..822ed3cb6581b8e606bab5208852eff2f504b0a4 GIT binary patch literal 27811 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 literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..6ff33e603 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 000000000..38f661269 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..0aaad5827 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 000000000..fe2b45415 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..2555dc89c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 000000000..8e541eaba --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..872d6d7d5 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h new file mode 100644 index 000000000..bf7370b50 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h @@ -0,0 +1,18 @@ +// +// AppDelegate.h +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "Classes/ContentView.h" + +#import "WindowController.h" + +@interface AppDelegate : NSObject + +@property (retain, nonatomic) WindowController *windowController; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m new file mode 100644 index 000000000..96a3e8201 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m @@ -0,0 +1,110 @@ +// +// AppDelegate.m +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +@synthesize windowController; + +- (void) applicationWillFinishLaunching:(NSNotification *)aNotification +{ +} + +-(BOOL)applicationShouldHandleReopen:(NSApplication*)application + hasVisibleWindows:(BOOL)visibleWindows{ + if(!visibleWindows){ + [self.windowController.window makeKeyAndOrderFront: nil]; + } + return YES; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { + return YES; +} + +- (void) applicationDidFinishLaunching:(NSNotification *)aNotification { + // Create authorization reference + OSStatus status; + AuthorizationRef authorizationRef; + + // AuthorizationCreate and pass NULL as the initial + // AuthorizationRights set so that the AuthorizationRef gets created + // successfully, and then later call AuthorizationCopyRights to + // determine or extend the allowable rights. + // http://developer.apple.com/qa/qa2001/qa1172.html + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error Creating Initial Authorization: %d", status); + return; + } + + // kAuthorizationRightExecute == "system.privilege.admin" + AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights rights = {1, &right}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; + + // Call AuthorizationCopyRights to determine or extend the allowable rights. + status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) + { + NSLog(@"Copy Rights Unsuccessful: %d", status); + return; + } + + // use rm tool with -rf + char *tool = "/bin/cat"; + char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; + FILE *pipe = NULL; + + status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error: %d", status); + } + + char url[16384]; + memset(url,0,sizeof(url)); + if (pipe) { + char buf[16384]; + + FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + long n = fread(buf,1,sizeof(buf)-1,pf); + long port = 9993; // default + if (n > 0) { + buf[n] = (char)0; + port = strtol(buf,(char **)0,10); + } + fclose(pf); + + n = (long)fread(buf,1,sizeof(buf)-1,pipe); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + } + fclose(pipe); + } + + // The only way to guarantee that a credential acquired when you + // request a right is not shared with other authorization instances is + // to destroy the credential. To do so, call the AuthorizationFree + // function with the flag kAuthorizationFlagDestroyRights. + // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html + status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + + NSString *urlStr = [[NSString alloc] initWithCString:url]; + self.windowController = [[WindowController alloc] initWithURL: urlStr]; + [self.windowController showWindow: [NSApplication sharedApplication].delegate]; + self.windowController.contentView.webView.alphaValue = 1.0; + self.windowController.contentView.alphaValue = 1.0; + [self.windowController showWindow:self]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h new file mode 100755 index 000000000..0f31ee417 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h @@ -0,0 +1,20 @@ +// +// CallbackDelegate.h +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" + +@interface CallbackDelegate : Command { +} + +@property JSObjectRef callback; + +- (id) initWithContext:(JSContextRef)aContext forCallback:(WebScriptObject*)aCallback; +- (id) call; +- (id) callWithParams:(id)firstOrNil, ... NS_REQUIRES_NIL_TERMINATION; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m new file mode 100755 index 000000000..5ce8fbe33 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m @@ -0,0 +1,168 @@ +// +// CallbackDelegate.m +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "CallbackDelegate.h" +#import + +@implementation CallbackDelegate + +@synthesize callback; + +- (id) initWithContext:(JSContextRef)aContext forCallback:(WebScriptObject*)aCallback +{ + if (!aCallback) + return nil; + if ([aCallback isKindOfClass:[WebUndefined class]]) + return nil; + + self = [super initWithContext:aContext]; + if (!self) + return nil; + + callback = [aCallback JSObject]; + JSValueProtect(context, callback); + return self; +} + +- (void) dealloc +{ + if (callback) + { + JSValueUnprotect(context, callback); + callback = nil; + } +} + +- (id) objectFromValue:(JSValueRef)val +{ + JSStringRef jstr; + NSString *rets; + + switch(JSValueGetType(context, val)) + { + case kJSTypeUndefined: + case kJSTypeNull: + return nil; + case kJSTypeBoolean: + return [NSNumber numberWithBool:JSValueToBoolean(context, val)]; + case kJSTypeNumber: + return [NSNumber numberWithDouble:JSValueToNumber(context, val, NULL)]; + case kJSTypeString: + jstr = JSValueToStringCopy(context, val, NULL); + size_t sz = JSStringGetMaximumUTF8CStringSize(jstr); + char *buf = (char*)malloc(sz); + JSStringGetUTF8CString(jstr, buf, sz); + rets = [NSString stringWithUTF8String:buf]; + free(buf); + return rets; + case kJSTypeObject: + // TODO: dictionary or something + return nil; + default: + NSAssert(false, @"Invalid JavaScript type"); + return nil; + } +} + +- (JSValueRef) valueFromObject:(id)obj +{ + JSValueRef val = nil; + if (!obj) + { + val = JSValueMakeNull(context); + } + else if ([obj isKindOfClass:[NSString class]]) + { + JSStringRef jstr = JSStringCreateWithUTF8CString([obj UTF8String]); + val = JSValueMakeString(context, jstr); + JSStringRelease(jstr); + } + else if ([obj isKindOfClass:[NSNumber class]]) + { + val = JSValueMakeNumber(context, [obj doubleValue]); + } + else if ([obj isKindOfClass:[NSDictionary class]]) + { + JSObjectRef o = JSObjectMake(context, NULL, NULL); + for (NSString *key in obj) + { + JSStringRef kstr = JSStringCreateWithUTF8CString([key UTF8String]); + JSValueRef v = [self valueFromObject:[obj objectForKey:key]]; + + JSObjectSetProperty(context, o, kstr, v, kJSPropertyAttributeNone, NULL); + JSStringRelease(kstr); + } + val = o; + } + else if ([obj isKindOfClass:[NSArray class]]) + { + NSUInteger pcount = [obj count]; + JSValueRef jsArgs[pcount]; + NSUInteger i=0; + for (id v in obj) + { + jsArgs[i++] = [self valueFromObject:v]; + } + val = JSObjectMakeArray(context, pcount, jsArgs, NULL); + } + else if ([obj isKindOfClass:[NSDate class]]) + { + NSTimeInterval secs = [obj timeIntervalSince1970]; + JSValueRef jsArgs[1]; + // call the Date(milliseconds) constructor in JS + jsArgs[0] = JSValueMakeNumber(context, secs * 1000.0); + val = JSObjectMakeDate(context, 1, jsArgs, NULL); + } + else + { + NSLog(@"Warning: unknown object type for: %@", obj); + val = JSValueMakeUndefined(context); + } + return val; +} + +- (id) call +{ + NSAssert(callback, @"Callback required"); + if (!JSObjectIsFunction(context, callback)) + return nil; + + JSValueRef jsArgs[0]; + JSValueRef ret = JSObjectCallAsFunction(context, callback, NULL, 0, jsArgs, NULL); + return [self objectFromValue:ret]; +} + +- (id) callWithParams:(id)firstOrNil, ... +{ + NSAssert(callback, @"Callback required"); + if (!JSObjectIsFunction(context, callback)) + return nil; + NSUInteger pcount = 0; + id p; + va_list args; + va_start(args, firstOrNil); + for (p=firstOrNil; p; p=va_arg(args, id)) + { + pcount++; + } + va_end(args); + + JSValueRef jsArgs[pcount]; + NSUInteger j = 0; + va_start(args, firstOrNil); + for (p=firstOrNil; p; p=va_arg(args, id)) + { + jsArgs[j++] = [self valueFromObject:p]; + } + va_end(args); + + JSValueRef ret = JSObjectCallAsFunction(context, callback, NULL, j, jsArgs, NULL); + return [self objectFromValue:ret]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h new file mode 100644 index 000000000..f65ba61e1 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h @@ -0,0 +1,21 @@ +#import + +#import "WindowController.h" + +@interface App : NSObject { + +} + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; + +- (void) terminate; +- (void) activate; +- (void) hide; +- (void) unhide; +- (void) beep; +- (void) bounce; +- (void) setCustomUserAgent:(NSString *)userAgentString; +- (NSNumber*) systemIdleTime; +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m new file mode 100644 index 000000000..6d47a17e1 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m @@ -0,0 +1,128 @@ +#import "App.h" + +#import "JSEventHelper.h" + +@implementation App + +@synthesize webView; + +- (id) initWithWebView:(WebView *) view{ + self = [super init]; + + if (self) { + self.webView = view; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveSleepNotification:) + name: NSWorkspaceWillSleepNotification object: NULL]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveWakeNotification:) + name: NSWorkspaceDidWakeNotification object: NULL]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveActivateNotification:) + name: NSWorkspaceDidActivateApplicationNotification object: NULL]; + } + + return self; +} + +- (void) terminate { + [NSApp terminate:nil]; +} + +- (void) activate { + [NSApp activateIgnoringOtherApps:YES]; +} + +- (void) hide { + [NSApp hide:nil]; +} + +- (void) unhide { + [NSApp unhide:nil]; +} + +- (void)beep { + NSBeep(); +} + +- (void) bounce { + [NSApp requestUserAttention:NSInformationalRequest]; +} + +- (void)setCustomUserAgent:(NSString *)userAgentString { + [self.webView setCustomUserAgent: userAgentString]; +} + +- (void) open:(NSString*)url { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; +} + +- (void) launch:(NSString *)name { + [[NSWorkspace sharedWorkspace] launchApplication:name]; +} + +- (void)receiveSleepNotification:(NSNotification*)note{ + [JSEventHelper triggerEvent:@"sleep" forWebView:self.webView]; +} + +- (void) receiveWakeNotification:(NSNotification*)note{ + [JSEventHelper triggerEvent:@"wake" forWebView:self.webView]; +} + +- (void) receiveActivateNotification:(NSNotification*)notification{ + NSDictionary* userInfo = [notification userInfo]; + NSRunningApplication* runningApplication = [userInfo objectForKey:NSWorkspaceApplicationKey]; + if (runningApplication) { + NSMutableDictionary* applicationDidGetFocusDict = [[NSMutableDictionary alloc] initWithCapacity:2]; + [applicationDidGetFocusDict setObject:runningApplication.localizedName + forKey:@"localizedName"]; + [applicationDidGetFocusDict setObject:[runningApplication.bundleURL absoluteString] + forKey:@"bundleURL"]; + + [JSEventHelper triggerEvent:@"appActivated" withArgs:applicationDidGetFocusDict forWebView:self.webView]; + } +} + + + + +/* + To get the elapsed time since the previous input event—keyboard, mouse, or tablet—specify kCGAnyInputEventType. + */ +- (NSNumber*)systemIdleTime { + CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); + + return [NSNumber numberWithDouble:timeSinceLastEvent]; +} + + + + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(open:)) { + result = @"open"; + } else if (selector == @selector(launch:)) { + result = @"launch"; + } else if (selector == @selector(setCustomUserAgent:)) { + result = @"setCustomUserAgent"; + } else if (selector == @selector(systemIdleTime)) { + result = @"systemIdleTime"; + } + + return result; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h new file mode 100755 index 000000000..65d6b6d48 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h @@ -0,0 +1,18 @@ +// +// Command.h +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import + +@interface Command : NSObject { + JSContextRef context; +} + +- (id) initWithContext:(JSContextRef)aContext; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m new file mode 100755 index 000000000..39b85630a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m @@ -0,0 +1,28 @@ +// +// Command.m +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" +#import + +@implementation Command + +- (id) initWithContext:(JSContextRef)aContext { + self = [super init]; + if (!self) + return nil; + context = aContext; + JSGlobalContextRetain((JSGlobalContextRef)context); + return self; +} + +- (void)dealloc +{ + if (context) + JSGlobalContextRelease((JSGlobalContextRef)context); +} +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h new file mode 100644 index 000000000..b3c533d79 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h @@ -0,0 +1,11 @@ +#import + +@interface Dock : NSObject { + +} +- (void) setBadge:(NSString*)value; +- (NSString *) badge; + +@property (readwrite, copy) NSString *badge; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m new file mode 100644 index 000000000..a4494d165 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m @@ -0,0 +1,31 @@ +#import "Dock.h" + +@implementation Dock + +@synthesize badge; + +- (void) setBadge:(NSString *)value +{ + NSDockTile *tile = [[NSApplication sharedApplication] dockTile]; + [tile setBadgeLabel:value]; +} + +- (NSString *) badge +{ + NSDockTile *tile = [[NSApplication sharedApplication] dockTile]; + return [tile badgeLabel]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h new file mode 100755 index 000000000..d765978fa --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h @@ -0,0 +1,31 @@ +// +// MenuItemProxy.h +// MacGap +// +// Created by Joe Hildebrand on 1/15/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" +#import "CallbackDelegate.h" + +@class MenuProxy; + +@interface MenuItemProxy : Command { + NSMenuItem *item; + CallbackDelegate *callback; +} + ++ (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem; + +- (MenuProxy*)addSubmenu; + +- (void) remove; +- (void) setCallback:(WebScriptObject*)aCallback; +- (void) setKey:(NSString*)keyCommand; +- (void) setTitle:(NSString*)title; +- (void) enable; +- (void) disable; +- (MenuProxy*)submenu; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m new file mode 100755 index 000000000..7b9702cc4 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m @@ -0,0 +1,150 @@ +// +// MenuItemProxy.m +// MacGap +// +// Created by Joe Hildebrand on 1/15/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "MenuItemProxy.h" +#import "MenuProxy.h" + +@implementation MenuItemProxy + +- (id) initWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem +{ + NSAssert(anItem, @"anItem required"); + self = [super initWithContext:aContext]; + if (!self) + return nil; + item = anItem; + item.representedObject = self; + + return self; +} + ++ (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem +{ + MenuItemProxy *proxy = [anItem representedObject]; + if (proxy) + { + NSLog(@"MIP Cache hit"); + NSAssert([proxy class] == [MenuItemProxy class], @"Bad proxy"); + return proxy; + } + return [[MenuItemProxy alloc] initWithContext:aContext andMenuItem:anItem]; +} + +- (NSString*) description +{ + return [item description]; +} + +- (MenuProxy*)addSubmenu +{ + NSMenu *s = [item submenu]; + if (!s) + { + s = [[NSMenu alloc] initWithTitle:@"FFFFFFOOOOO"]; + [item setSubmenu:s]; + } + return [MenuProxy proxyWithContext:context andMenu:s]; +} + +- (void) remove +{ + NSMenu *menu = [item menu]; + [menu removeItem:item]; +} + +- (void)callCallback:(id)sender +{ + [callback callWithParams:[sender title], nil]; +} + +- (void) setCallback:(WebScriptObject*)aCallback +{ + NSAssert(item, @"item required"); + callback = [[CallbackDelegate alloc] initWithContext:context forCallback:aCallback]; + [item setAction:@selector(callCallback:)]; + [item setTarget:self]; +} + +- (void)setKey:(NSString*)keyCommand +{ + NSString *aKey = [MenuProxy getKeyFromString:keyCommand]; + [item setKeyEquivalent:aKey]; + + NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand]; + [item setKeyEquivalentModifierMask:modifiers]; +} + +- (void) setTitle:(NSString*)title +{ + [item setTitle:title]; +} + +- (MenuProxy*)submenu; +{ + // TODO: make this work as a property + NSMenu *s = [item submenu]; + if (!s) + return nil; + return [MenuProxy proxyWithContext:context andMenu:s]; +} + +- (void) enable +{ + [item setEnabled:YES]; +} + +- (void) disable +{ + [item setEnabled:NO]; +} + +#pragma mark WebScripting protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(addSubmenu)) { + result = @"addSubmenu"; + } + else if (selector == @selector(remove)) { + result = @"remove"; + } + else if (selector == @selector(setCallback:)) { + result = @"setCallback"; + } + else if (selector == @selector(setKey:)) { + result = @"setKey"; + } + else if (selector == @selector(setTitle:)) { + result = @"setTitle"; + } + else if (selector == @selector(submenu)) { + result = @"submenu"; + } + else if (selector == @selector(enable)) { + result = @"enable"; + } + else if (selector == @selector(disable)) { + result = @"disable"; + } + + return result; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h new file mode 100755 index 000000000..afd6c6edb --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h @@ -0,0 +1,31 @@ +// +// MenuProxy.h +// MacGap +// +// Created by Joe Hildebrand on 1/14/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" + +@class MenuItemProxy; + +@interface MenuProxy : Command { + NSMenu *menu; +} + ++ (MenuProxy*)proxyWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu; + +- (MenuItemProxy*)addItemWithTitle:(NSString*)title + keyEquivalent:(NSString*)aKey + callback:(WebScriptObject*)aCallback + atIndex:(NSInteger)index; + +- (MenuItemProxy*)addSeparator; +- (MenuItemProxy*)itemForKey:(id)key; +- (MenuProxy*)removeItem:(id)key; + ++ (NSString*)getKeyFromString:(NSString*)keyCommand; ++ (NSUInteger*)getModifiersFromString:(NSString*)keyCommand; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m new file mode 100755 index 000000000..5bc10a763 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m @@ -0,0 +1,233 @@ +// +// MenuProxy.m +// MacGap +// +// Created by Joe Hildebrand on 1/14/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import + +#import "MenuProxy.h" +#import "MenuItemProxy.h" + +static char REPRESENTED_OBJECT; + +@interface NSMenu (represented) +@property (strong) id representedObject; +@end + +@implementation NSMenu (represented) + +- (id) representedObject +{ + return objc_getAssociatedObject(self, &REPRESENTED_OBJECT); +} + +- (void) setRepresentedObject:(id)representedObject +{ + objc_setAssociatedObject(self, + &REPRESENTED_OBJECT, + representedObject, + OBJC_ASSOCIATION_RETAIN); +} + +@end + +@implementation MenuProxy + +- (id) initWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu +{ + self = [super initWithContext:aContext]; + if (!self) + return nil; + menu = aMenu; + menu.representedObject = self; + return self; +} + ++ (MenuProxy*)proxyWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu +{ + // singleton-ish. + MenuProxy *ret = [aMenu representedObject]; + if (ret) + { + NSLog(@"MP cache hit"); + return ret; + } + return [[MenuProxy alloc] initWithContext:aContext andMenu:aMenu]; +} + +- (void) dealloc +{ + menu.representedObject = nil; +} + +- (NSString*) description +{ + return [menu description]; +} + +static BOOL isNullish(id o) +{ + if (!o) + return YES; + if ([o isKindOfClass:[WebUndefined class]]) + return YES; + return NO; +} + +- (MenuItemProxy*)addItemWithTitle:(NSString*)title + keyEquivalent:(NSString*)keyCommand + callback:(WebScriptObject*)aCallback + atIndex:(NSInteger)index +{ + if (isNullish(title)) + title = @""; + + NSString *aKey = [MenuProxy getKeyFromString:keyCommand]; + NSMenuItem *item = nil; + + if(index) { + item = [menu insertItemWithTitle:title action:nil keyEquivalent:aKey atIndex:index ]; + } else { + item = [menu addItemWithTitle:title action:nil keyEquivalent:aKey ]; + + } + + // Set the modifiers. + NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand]; + [item setKeyEquivalentModifierMask:modifiers]; + + if(!menu.supermenu) { + NSMenu *s = [[NSMenu alloc] initWithTitle:title]; + [item setSubmenu:s]; + } + + MenuItemProxy *mip = [MenuItemProxy proxyWithContext:context andMenuItem:item]; + if (!isNullish(aCallback)) + [mip setCallback:aCallback]; + + + return mip; +} + ++ (NSString*)getKeyFromString:(NSString*)keyCommand { + if (isNullish(keyCommand)) + keyCommand = @""; + + // Obtain the key (if there are modifiers, it will be the last character). + NSString *aKey = @""; + if ([keyCommand length] > 0) { + aKey = [keyCommand substringFromIndex:[keyCommand length] - 1]; + } + + return aKey; +} + ++ (NSUInteger*)getModifiersFromString:(NSString*)keyCommand { + // aKeys may optionally specify one or more modifiers. + NSUInteger modifiers = 0; + + if ([keyCommand rangeOfString:@"caps"].location != NSNotFound) modifiers += NSAlphaShiftKeyMask; + if ([keyCommand rangeOfString:@"shift"].location != NSNotFound) modifiers += NSShiftKeyMask; + if ([keyCommand rangeOfString:@"cmd"].location != NSNotFound) modifiers += NSCommandKeyMask; + if ([keyCommand rangeOfString:@"ctrl"].location != NSNotFound) modifiers += NSControlKeyMask; + if ([keyCommand rangeOfString:@"opt"].location != NSNotFound) modifiers += NSAlternateKeyMask; + if ([keyCommand rangeOfString:@"alt"].location != NSNotFound) modifiers += NSAlternateKeyMask; + + return modifiers; +} + +- (MenuItemProxy*)addSeparator +{ + NSMenuItem *sep = [NSMenuItem separatorItem]; + [menu addItem:sep]; + return [MenuItemProxy proxyWithContext:context andMenuItem:sep]; +} + +- (MenuItemProxy*)itemForKey:(id)key +{ + if (isNullish(key)) + return nil; + NSMenuItem *item = nil; + if ([key isKindOfClass:[NSNumber class]]) + { + item = [menu itemAtIndex:[key intValue]]; + } + else if ([key isKindOfClass:[NSString class]]) + { + item = [menu itemWithTitle:key]; + if (!item) + { + // Try again, with ... appended. e.g. "Save..." + item = [menu itemWithTitle: + [key stringByAppendingString:@"\u2026"]]; + } + } + if (!item) + return nil; + + return [MenuItemProxy proxyWithContext:context andMenuItem:item]; +} + +- (MenuProxy*)removeItem:(id)key +{ + if (isNullish(key)) + return nil; + + NSMenuItem *item = nil; + if ([key isKindOfClass:[NSNumber class]]) + { + item = [menu itemAtIndex:[key intValue]]; + } + else if ([key isKindOfClass:[NSString class]]) + { + item = [menu itemWithTitle:key]; + if (!item) + { + // Try again, with ... appended. e.g. "Save..." + item = [menu itemWithTitle: + [key stringByAppendingString:@"\u2026"]]; + } + } + if (!item) + return nil; + + [menu removeItem:item]; + return [MenuProxy proxyWithContext:context andMenu:menu]; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(addItemWithTitle:keyEquivalent:callback:atIndex:)) { + result = @"addItem"; + } + else if (selector == @selector(addSeparator)) { + result = @"addSeparator"; + } + else if (selector == @selector(itemForKey:)) { + result = @"getItem"; + } + else if (selector == @selector(removeItem:)) { + result = @"removeMenu"; + } + + return result; +} + + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h new file mode 100644 index 000000000..51077a434 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h @@ -0,0 +1,26 @@ +// +// Notice.h +// MacGap +// +// Created by Christian Sullivan on 7/26/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "WindowController.h" + +#define APP_NOTICE_NOTIFICATION @"Notice" + +@interface Notice : NSObject { + +} + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (void) notify:(NSDictionary*)message; +- (void) close:(NSString*)notificationId; ++ (BOOL) available; + +@end + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m new file mode 100644 index 000000000..a4095f9f2 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m @@ -0,0 +1,108 @@ +// +// Notice.m +// MacGap +// +// Created by Christian Sullivan on 7/26/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Notice.h" + +#import "JSEventHelper.h" + +@implementation Notice + +- (id) initWithWebView:(WebView*)view +{ + if(self = [super init]) { + self.webView = view; + [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self]; + } + return self; +} + +- (void) notify:(NSDictionary *)message { + NSUserNotification *notification = [[NSUserNotification alloc] init]; + [notification setTitle:[message valueForKey:@"title"]]; + [notification setInformativeText:[message valueForKey:@"content"]]; + [notification setDeliveryDate:[NSDate dateWithTimeInterval:0 sinceDate:[NSDate date]]]; + BOOL playSound = true; // optional parameter, false only when {sound: false} + @try { + NSNumber *s = [message valueForKey:@"sound"]; + if ([[s className] isEqual: @"__NSCFBoolean"]) { + playSound = [s boolValue]; + } + } + @catch (NSException *exception) { + } + if (playSound) { + [notification setSoundName:NSUserNotificationDefaultSoundName]; + } + NSString *id = @""; // optional, needed for close + @try { + id = [message valueForKey:@"id"]; + } + @catch (NSException *exception) { + } + [notification setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:id, @"id", nil]]; + NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter]; + [center scheduleNotification:notification]; +} + +// close all notifications with id == notificationId or close all notifications if notificationId == "*" +- (void) close:(NSString*)notificationId { + NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter]; + for(NSUserNotification * deliveredNote in center.deliveredNotifications) { + if ([notificationId isEqualToString:@"*"] || [deliveredNote.userInfo[@"id"] isEqualToString:notificationId]) { + [center removeDeliveredNotification: deliveredNote]; + } + } +} + ++ (BOOL) available { + if ([NSUserNotificationCenter respondsToSelector:@selector(defaultUserNotificationCenter)]) + return YES; + + return NO; +} + +- (void) userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification +{ + NSString *notificationId = [notification.userInfo valueForKey:@"id"]; + [JSEventHelper triggerEvent:@"macgap.notify.activated" forDetail:notificationId forWebView:self.webView]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + BOOL result = YES; + if (selector == @selector(notify:)) + result = NO; + if (selector == @selector(close:)) + result = NO; + + return result; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(notify:)) { + result = @"notify"; + } + if (selector == @selector(close:)) { + result = @"close"; + } + + return result; +} + +// right now exclude all properties (eg keys) ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h new file mode 100644 index 000000000..f931340d0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h @@ -0,0 +1,21 @@ +#import + +@interface Path : NSObject { + +} + +- (NSString *) application; +- (NSString *) resource; +- (NSString *) documents; +- (NSString *) library; +- (NSString *) home; +- (NSString *) temp; + +@property (readonly,copy) NSString* application; +@property (readonly,copy) NSString* resource; +@property (readonly,copy) NSString* documents; +@property (readonly,copy) NSString* library; +@property (readonly,copy) NSString* home; +@property (readonly,copy) NSString* temp; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m new file mode 100644 index 000000000..8c54100f7 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m @@ -0,0 +1,53 @@ +#import "Path.h" + +@implementation Path + +@synthesize application; +@synthesize resource; +@synthesize documents; +@synthesize library; +@synthesize home; +@synthesize temp; + +- (NSString *)application { + return [[NSBundle mainBundle] bundlePath]; +} + +- (NSString *)resource { + return [[NSBundle mainBundle] resourcePath]; +} + +- (NSString *)documents { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return [paths objectAtIndex:0]; +} + +- (NSString *)library { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); + NSLog( @"%@", paths ); + return [paths objectAtIndex:0]; +} + +- (NSString *)home { + return NSHomeDirectory(); +} + +- (NSString *)temp { + return NSTemporaryDirectory(); +} + +#pragma mark WebScripting Protocol + +/* checks whether a selector is acceptable to be called from JavaScript */ ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + +// right now exclude all properties (eg keys) ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h new file mode 100644 index 000000000..067076439 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h @@ -0,0 +1,17 @@ +#import +#import "Command.h" +#import "CallbackDelegate.h" + + +@interface Sound : Command { + +} + +// pending callbacks for sounds being played, to keep +// ARC from freeing them too early +@property (nonatomic, strong) NSMutableSet *pending; + +- (void) play:(NSString*)file onComplete:(WebScriptObject*)callback; +- (void) playSystem:(NSString*)name onComplete:(WebScriptObject*)callback; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m new file mode 100644 index 000000000..9f4a44dbc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m @@ -0,0 +1,97 @@ +#import "Sound.h" + + +@interface PlayDelegate : CallbackDelegate { +} + +@property (nonatomic, weak) Sound *sound; + +- (id) initWithContext:(JSContextRef)aContext + forCallback:(WebScriptObject*)aCallback + withSound:(Sound*)aSound; +@end + +@implementation PlayDelegate + +@synthesize sound; + +- (id) initWithContext:(JSContextRef)aContext + forCallback:(WebScriptObject*)aCallback + withSound:(Sound*)aSound +{ + self = [super initWithContext:aContext forCallback:aCallback]; + if (!self) + return nil; + sound = aSound; + return self; +} + +- (void)sound:(NSSound *)aSound didFinishPlaying:(BOOL)finishedPlaying { + [self callWithParams:[aSound name], nil]; + [sound.pending removeObject:self]; +} + +@end + +@implementation Sound + +@synthesize pending; + +- (id) initWithContext:(JSContextRef)aContext { + self = [super initWithContext:aContext]; + if (!self) { + return nil; + } + + pending = [NSMutableSet new]; + return self; +} + +- (void) playSound:(NSSound*)sound onComplete:(WebScriptObject*)callback { + if (callback != (id)[WebUndefined undefined]) { + PlayDelegate *d = [[PlayDelegate alloc] initWithContext:context + forCallback:callback + withSound:self]; + [pending addObject:d]; + [sound setDelegate:d]; + } + [sound play]; +} + +- (void) play:(NSString*)file onComplete:(WebScriptObject*)callback { + NSURL* fileUrl = [NSURL fileURLWithPath:[[Utils sharedInstance] pathForResource:file]]; + DebugNSLog(@"Sound file:%@", [fileUrl description]); + + NSSound* sound = [[NSSound alloc] initWithContentsOfURL:fileUrl byReference:YES]; + [self playSound:sound onComplete:callback]; +} + +- (void) playSystem:(NSString*)name onComplete:(WebScriptObject*)callback { + NSSound *systemSound = [NSSound soundNamed:name]; + [self playSound:systemSound onComplete:callback]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(play:onComplete:)) { + result = @"play"; + } + else if (selector == @selector(playSystem:onComplete:)) { + result = @"playSystem"; + } + + return result; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h new file mode 100644 index 000000000..269191b39 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h @@ -0,0 +1,43 @@ +// +// UserDefaults.h +// MacGap +// +// Created by Jeff Hanbury on 16/04/2014. +// Copyright (c) 2014 Twitter. All rights reserved. +// + +#import + +#import "WindowController.h" + +@interface UserDefaults : NSObject + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (NSString*) getMyDefaults; +- (NSDictionary*) myDefaultsDictionary; +- (void) removeObjectForKey:(NSString*)key; +- (NSArray*) getUserDefaultsKeys; + +- (NSString*) addPrefix:(NSString*)key; + +- (void) setString:(NSString*)key withValue:(NSString*)value; +- (NSString*) getString:(NSString*)key; + +- (void) setInteger:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getInteger:(NSString*)key; + +- (void) setBool:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getBool:(NSString*)key; + +- (void) setFloat:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getFloat:(NSString*)key; + +// Could also be implemented: +//– setObject:forKey: +//– setDouble:forKey: +//– setURL:forKey: + +@end + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m new file mode 100644 index 000000000..485687108 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m @@ -0,0 +1,211 @@ +// +// UserDefaults.m +// MacGap +// +// Created by Jeff Hanbury on 16/04/2014. +// Copyright (c) 2014 Twitter. All rights reserved. +// + +#import "UserDefaults.h" +#import "JSEventHelper.h" + +@interface UserDefaults() { + +} + +-(void) setupNotificationCenter; + +@end + + +@implementation UserDefaults + +- (id) initWithWebView:(WebView *) view{ + self = [super init]; + + if (self) { + self.webView = view; + [self setupNotificationCenter]; + } + + return self; +} + + +-(void) setupNotificationCenter{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(defaultsChanged:) + name:NSUserDefaultsDidChangeNotification + object:nil]; +} + +- (void)defaultsChanged:(NSNotification *)notification { + NSDictionary* returnDict = [self myDefaultsDictionary]; + [JSEventHelper triggerEvent:@"userDefaultsChanged" withArgs:returnDict forWebView:self.webView]; +} + +- (NSString*) getMyDefaults { + NSDictionary* myDefaults = [self myDefaultsDictionary]; + + return [[Utils sharedInstance] convertDictionaryToJSON:myDefaults]; +} + +- (NSDictionary*) myDefaultsDictionary { + NSString* prefix = [kWebScriptNamespace stringByAppendingString:@"_"]; + NSMutableDictionary* returnDict = [[NSMutableDictionary alloc] init]; + + // Get the user defaults. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // Build up a dictionary containing just the items beginning with our + // prefix. + for (NSString* key in [self getUserDefaultsKeys]) { + if ([key hasPrefix:prefix]) { + id val = [defaults valueForKey:key]; + [returnDict setObject:val forKey:key]; + } + } + + return returnDict; +} + +- (NSArray*) getUserDefaultsKeys { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [[prefs dictionaryRepresentation] allKeys]; +} + +- (void) removeObjectForKey:(NSString*)key { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + [[NSUserDefaults standardUserDefaults] removeObjectForKey:prefixedKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +// Check we have a standard prefix for JS-modified keys, for security purposes. +// If not, add it. This stops JavaScript from ever being able to modify keys +// it did not create. +- (NSString*) addPrefix:(NSString*)key { + NSString* prefix; + prefix = [kWebScriptNamespace stringByAppendingString:@"_"]; + + if (![key hasPrefix:prefix]) { + key = [prefix stringByAppendingString:key]; + } + return key; +} + +// String + +- (void) setString:(NSString*)key withValue:(NSString*)value { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + [prefs setObject:value forKey:prefixedKey]; +} + +- (NSString*) getString:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [prefs stringForKey:key]; +} + +// All the following must convert their type to NSNumber for JavaScript. + +// Integer + +- (void) setInteger:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSInteger myInt = [value intValue]; + [prefs setInteger:myInt forKey:prefixedKey]; +} + +- (NSNumber*) getInteger:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithInteger:[prefs integerForKey:key]]; +} + +// Boolean + +- (void) setBool:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + BOOL myBool = [value boolValue]; + [prefs setBool:myBool forKey:prefixedKey]; +} + +- (NSNumber*) getBool:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithBool:[prefs boolForKey:key]]; +} + +// Float + +- (void) setFloat:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + float myFloat = [value floatValue]; + [prefs setFloat:myFloat forKey:prefixedKey]; +} + +- (NSNumber*) getFloat:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithFloat:[prefs floatForKey:key]]; +} + + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(getMyDefaults)) { + result = @"getMyDefaults"; + } + + if (selector == @selector(removeObjectForKey:)) { + result = @"removeObjectForKey"; + } + + else if (selector == @selector(setString:withValue:)) { + result = @"setString"; + } else if (selector == @selector(getString:)) { + result = @"getString"; + } + + else if (selector == @selector(setInteger:withValue:)) { + result = @"setInteger"; + } else if (selector == @selector(getInteger:)) { + result = @"getInteger"; + } + + else if (selector == @selector(setBool:withValue:)) { + result = @"setBool"; + } else if (selector == @selector(getBool:)) { + result = @"getBool"; + } + + else if (selector == @selector(setFloat:withValue:)) { + result = @"setFloat"; + } else if (selector == @selector(getFloat:)) { + result = @"getFloat"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h new file mode 100644 index 000000000..62c7b7e83 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h @@ -0,0 +1,9 @@ +@interface Fonts : NSObject { +} + +- (NSArray*) availableFonts; +- (NSArray*) availableFontFamilies; +- (NSArray*) availableMembersOfFontFamily:(NSString*)fontFamily; +- (CGFloat) defaultLineHeightForFont:(NSString *)theFontName ofSize:(CGFloat)theFontSize; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m new file mode 100644 index 000000000..b17818a53 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m @@ -0,0 +1,48 @@ +#import "fonts.h" + +@implementation Fonts + + +- (NSArray*) availableFonts { + return [[NSFontManager sharedFontManager] availableFonts]; +} + +- (NSArray*) availableFontFamilies { + return [[NSFontManager sharedFontManager] availableFontFamilies]; +} + +- (NSArray*) availableMembersOfFontFamily:(NSString *)fontFamily { + return [[NSFontManager sharedFontManager] availableMembersOfFontFamily:fontFamily]; +} + +- (CGFloat) defaultLineHeightForFont:(NSString*)theFontName ofSize:(CGFloat)theFontSize { + NSFont *theFont = [NSFont fontWithName:theFontName size:theFontSize]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + + return [lm defaultLineHeightForFont:theFont]; +} + + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(availableMembersOfFontFamily:)) { + result = @"availableMembersOfFontFamily"; + } else if (selector == @selector(defaultLineHeightForFont:ofSize:)) { + result = @"defaultLineHeightForFont"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h new file mode 100644 index 000000000..1fe59d6cc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h @@ -0,0 +1,7 @@ +// Application constants + +#define kStartPage @"http://127.0.0.1:9993/" + +#define kStartFolder @"." + +#define kWebScriptNamespace @"macgap" \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h new file mode 100644 index 000000000..65890a5ee --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h @@ -0,0 +1,15 @@ +#import +#import + +@class WebViewDelegate; + +@interface ContentView : NSView { + IBOutlet WebView* webView; + WebViewDelegate* delegate; +} + +@property (retain) WebView* webView; +@property (retain) WebViewDelegate* delegate; +@property (strong) IBOutlet NSMenu *mainMenu; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m new file mode 100644 index 000000000..24e58cd1c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m @@ -0,0 +1,68 @@ +#import "ContentView.h" +#import "WebViewDelegate.h" +#import "AppDelegate.h" +#import "JSEventHelper.h" + +@interface WebPreferences (WebPreferencesPrivate) + - (void)_setLocalStorageDatabasePath:(NSString *)path; + - (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; + - (void) setDatabasesEnabled:(BOOL)databasesEnabled; + - (void) setDeveloperExtrasEnabled:(BOOL)developerExtrasEnabled; + - (void) setWebGLEnabled:(BOOL)webGLEnabled; + - (void) setOfflineWebApplicationCacheEnabled:(BOOL)offlineWebApplicationCacheEnabled; +@end + +@implementation ContentView + +@synthesize webView, delegate, mainMenu; + +- (void) awakeFromNib +{ + WebPreferences *webPrefs = [WebPreferences standardPreferences]; + + NSString *cappBundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; + NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath]; + NSString *savePath = [NSString pathWithComponents:[NSArray arrayWithObjects:applicationSupportFile, cappBundleName, @"LocalStorage", nil]]; + [webPrefs _setLocalStorageDatabasePath:savePath]; + [webPrefs setLocalStorageEnabled:YES]; + [webPrefs setDatabasesEnabled:YES]; + [webPrefs setDeveloperExtrasEnabled:[[NSUserDefaults standardUserDefaults] boolForKey: @"developer"]]; + [webPrefs setOfflineWebApplicationCacheEnabled:YES]; + [webPrefs setWebGLEnabled:YES]; + + [self.webView setPreferences:webPrefs]; + + NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage + sharedHTTPCookieStorage]; + [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; + + [self.webView setApplicationNameForUserAgent: @"MacGap"]; + + self.delegate = [[WebViewDelegate alloc] initWithMenu:[NSApp mainMenu]]; + [self.webView setFrameLoadDelegate:self.delegate]; + [self.webView setUIDelegate:self.delegate]; + [self.webView setResourceLoadDelegate:self.delegate]; + [self.webView setDownloadDelegate:self.delegate]; + [self.webView setPolicyDelegate:self.delegate]; + [self.webView setDrawsBackground:NO]; + [self.webView setShouldCloseWithWindow:NO]; + + [self.webView setGroupName:@"MacGap"]; + +} + +- (void) windowResized:(NSNotification*)notification; +{ + NSWindow* window = (NSWindow*)notification.object; + NSSize size = [window frame].size; + + DebugNSLog(@"window width = %f, window height = %f", size.width, size.height); + + bool isFullScreen = (window.styleMask & NSFullScreenWindowMask) == NSFullScreenWindowMask; + int titleBarHeight = isFullScreen ? 0 : [[Utils sharedInstance] titleBarHeight:window]; + + [self.webView setFrame:NSMakeRect(0, 0, size.width, size.height - titleBarHeight)]; + [JSEventHelper triggerEvent:@"orientationchange" forWebView:self.webView]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h new file mode 100644 index 000000000..401f3e396 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h @@ -0,0 +1,20 @@ +// +// Helper.h +// MacGap +// +// Created by Liam Kaufman Simpkins on 12-01-22. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "WindowController.h" + +@interface JSEventHelper : NSObject + ++ (void) triggerEvent:(NSString *)event forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forObject:(NSString *)objName forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forObject:(NSString *)objName forWebView:(WebView *)webView; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m new file mode 100644 index 000000000..65406b3c0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m @@ -0,0 +1,41 @@ +// +// Helper.m +// MacGap +// +// Created by Liam Kaufman Simpkins on 12-01-22. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "JSEventHelper.h" + +@implementation JSEventHelper + ++ (void) triggerEvent:(NSString *)event forWebView:(WebView *)webView { + [self triggerEvent:event withArgs:[NSMutableDictionary dictionary] forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forWebView:(WebView *)webView { + [self triggerEvent:event withArgs:args forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forObject:(NSString *)objName forWebView:(WebView *)webView { + + // Convert args Dictionary to JSON. + NSString* jsonString = [[Utils sharedInstance] convertDictionaryToJSON:args]; + + // Create the event JavaScript and run it. + NSString * str = [NSString stringWithFormat:@"var e = document.createEvent('Events'); e.initEvent('%@', true, false); e.data=%@; %@.dispatchEvent(e); ", event, jsonString, objName]; + [webView stringByEvaluatingJavaScriptFromString:str]; +} + ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forWebView:(WebView *)webView { + [self triggerEvent:event forDetail:detail forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forObject:(NSString *)objName forWebView:(WebView *)webView { + NSString *detailEscaped = [detail stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; + NSString *str = [NSString stringWithFormat:@"var e = new CustomEvent('%@', { 'detail': decodeURIComponent(\"%@\") }); %@.dispatchEvent(e); ", event, detailEscaped, objName]; + [webView stringByEvaluatingJavaScriptFromString:str]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h new file mode 100644 index 000000000..f573d881a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h @@ -0,0 +1,20 @@ +#import +#import + +#define DEG_EPS 0.001 +#define fequal(a,b) (fabs((a) - (b)) < DEG_EPS) +#define fequalzero(a) (fabs(a) < DEG_EPS) + +@class LoadingView; + +@interface Utils : NSObject { +} + +- (float) titleBarHeight:(NSWindow*)aWindow; +- (NSString*) pathForResource:(NSString*)resourcepath; +- (NSString*) convertDictionaryToJSON:(NSDictionary*)dict; +- (NSArray*) convertJSarrayToNSArray:(WebScriptObject*)jsArray; + ++ (Utils*) sharedInstance; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m new file mode 100644 index 000000000..8d85c2949 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m @@ -0,0 +1,93 @@ +#import "Utils.h" +#import + +static Utils* sharedInstance = nil; + +@implementation Utils + +- (float) titleBarHeight:(NSWindow*)aWindow +{ + NSRect frame = [aWindow frame]; + NSRect contentRect = [NSWindow contentRectForFrameRect: frame + styleMask: NSTitledWindowMask]; + + return (frame.size.height - contentRect.size.height); +} + +- (NSString*) pathForResource:(NSString*)resourcepath +{ + NSBundle * mainBundle = [NSBundle mainBundle]; + NSMutableArray *directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]]; + NSString *filename = [directoryParts lastObject]; + [directoryParts removeLastObject]; + + NSString *directoryStr = [NSString stringWithFormat:@"%@/%@", kStartFolder, [directoryParts componentsJoinedByString:@"/"]]; + return [mainBundle pathForResource:filename + ofType:@"" + inDirectory:directoryStr]; +} + +- (NSString*) convertDictionaryToJSON:(NSDictionary*)dict { + // Convert defaults Dictionary to JSON. + NSError *error; + NSData *jsonData = [NSJSONSerialization + dataWithJSONObject:dict + options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string + error:&error]; + + NSString *jsonString; + if (! jsonData) { + NSLog(@"Got an error converting to JSON: %@", error); + } + else { + jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } + + return jsonString; +} + +// Convert JavaScript array (arrives as a WebScriptObject) into an NSArray of strings. +- (NSArray*) convertJSarrayToNSArray:(WebScriptObject*)jsArray { + NSInteger count = [[jsArray valueForKey:@"length"] integerValue]; + + NSMutableArray *args = [NSMutableArray array]; + for (int i = 0; i < count; i++) { + NSString *item = [jsArray webScriptValueAtIndex:i]; + if ([item isKindOfClass:[NSString class]]) { + [args addObject:item]; + } + } + + return args; +} + +#pragma mark - +#pragma mark Singleton methods + ++ (Utils*) sharedInstance +{ + @synchronized(self) + { + if (sharedInstance == nil){ + sharedInstance = [[Utils alloc] init]; + } + } + return sharedInstance; +} + ++ (id) allocWithZone:(NSZone *)zone { + @synchronized(self) { + if (sharedInstance == nil) { + sharedInstance = [super allocWithZone:zone]; + return sharedInstance; // assignment and return on first allocation + } + } + return nil; // on subsequent allocation attempts return nil +} + +- (id) copyWithZone:(NSZone *)zone +{ + return self; +} + +@end \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h new file mode 100644 index 000000000..49c6da6b9 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h @@ -0,0 +1,49 @@ +#import +#import + +@class Sound; +@class Dock; +@class Growl; +@class Notice; +@class Path; +@class App; +@class Window; +@class Clipboard; +@class Fonts; +@class MenuProxy; +@class UserDefaults; + +@class WindowController; + +@interface WebViewDelegate : NSObject { + Sound* sound; + Dock* dock; + Growl* growl; + Notice* notice; + Path* path; + App* app; + Window* window; + Clipboard* clipboard; + Fonts* fonts; + NSMenu *mainMenu; + UserDefaults* userDefaults; +} + + + +@property (nonatomic, retain) Sound* sound; +@property (nonatomic, retain) Dock* dock; +@property (nonatomic, retain) Growl* growl; +@property (nonatomic, retain) Notice* notice; +@property (nonatomic, retain) Path* path; +@property (nonatomic, retain) App* app; +@property (nonatomic, retain) Window* window; +@property (nonatomic, retain) Clipboard* clipboard; +@property (nonatomic, retain) Fonts* fonts; +@property (nonatomic, retain) MenuProxy* menu; +@property (nonatomic, retain) UserDefaults* userDefaults; + +@property (nonatomic, retain) WindowController *requestedWindow; + +- (id) initWithMenu:(NSMenu*)menu; +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m new file mode 100644 index 000000000..505780183 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m @@ -0,0 +1,206 @@ +#import "WebViewDelegate.h" +#import "Sound.h" +#import "Dock.h" +#import "Notice.h" +#import "Path.h" +#import "App.h" +#import "Window.h" +#import "WindowController.h" +#import "Clipboard.h" +#import "Fonts.h" +#import "MenuProxy.h" +#import "UserDefaults.h" + +@implementation WebViewDelegate + +@synthesize sound; +@synthesize dock; +@synthesize growl; +@synthesize notice; +@synthesize path; +@synthesize app; +@synthesize window; +@synthesize requestedWindow; +@synthesize clipboard; +@synthesize fonts; +@synthesize menu; +@synthesize userDefaults; + +- (id) initWithMenu:(NSMenu*)aMenu +{ + self = [super init]; + if (!self) + return nil; + + mainMenu = aMenu; + return self; +} + +- (void) webView:(WebView*)webView didClearWindowObject:(WebScriptObject*)windowScriptObject forFrame:(WebFrame *)frame +{ + JSContextRef context = [frame globalContext]; + if (self.sound == nil) { self.sound = [[Sound alloc] initWithContext:context]; } + if (self.dock == nil) { self.dock = [Dock new]; } + if (self.path == nil) { self.path = [Path new]; } + if (self.clipboard == nil) { self.clipboard = [Clipboard new]; } + if (self.fonts == nil) { self.fonts = [Fonts new]; } + + if (self.notice == nil && [Notice available] == YES) { + self.notice = [[Notice alloc] initWithWebView:webView]; + } + + if (self.app == nil) { + self.app = [[App alloc] initWithWebView:webView]; + } + + if (self.window == nil) { + self.window = [[Window alloc] initWithWebView:webView]; + } + + if (self.menu == nil) { + self.menu = [MenuProxy proxyWithContext:context andMenu:mainMenu]; + } + + if (self.userDefaults == nil) { + self.userDefaults = [[UserDefaults alloc] initWithWebView:webView]; + } + + [windowScriptObject setValue:self forKey:kWebScriptNamespace]; +} + + +- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles{ + + NSOpenPanel * openDlg = [NSOpenPanel openPanel]; + + [openDlg setCanChooseFiles:YES]; + [openDlg setCanChooseDirectories:NO]; + + [openDlg beginWithCompletionHandler:^(NSInteger result){ + if (result == NSFileHandlingPanelOKButton) { + NSArray * files = [[openDlg URLs] valueForKey: @"relativePath"]; + [resultListener chooseFilenames: files]; + } else { + [resultListener cancel]; + } + }]; +} + +- (void) webView:(WebView*)webView addMessageToConsole:(NSDictionary*)message +{ + if (![message isKindOfClass:[NSDictionary class]]) { + return; + } + + NSLog(@"JavaScript console: %@:%@: %@", + [[message objectForKey:@"sourceURL"] lastPathComponent], // could be nil + [message objectForKey:@"lineNumber"], + [message objectForKey:@"message"]); +} + +- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; +} + +- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Yes"]; + [alert addButtonWithTitle:@"No"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + + if ([alert runModal] == NSAlertFirstButtonReturn) + return YES; + else + return NO; +} + +/* + By default the size of a database is set to 0 [1]. When a database is being created + it calls this delegate method to get an increase in quota size - or call an error. + PS this method is defined in WebUIDelegatePrivate and may make it difficult, but + not impossible [2], to get an app accepted into the mac app store. + + Further reading: + [1] http://stackoverflow.com/questions/353808/implementing-a-webview-database-quota-delegate + [2] http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application/4608549#4608549 + */ +- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier +{ + static const unsigned long long defaultQuota = 5 * 1024 * 1024; + if ([origin respondsToSelector: @selector(setQuota:)]) { + [origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]]; + } else { + NSLog(@"could not increase quota for %lld", defaultQuota); + } +} + +- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems +{ + NSMutableArray *webViewMenuItems = [defaultMenuItems mutableCopy]; + + if (webViewMenuItems) + { + NSEnumerator *itemEnumerator = [defaultMenuItems objectEnumerator]; + NSMenuItem *menuItem = nil; + while ((menuItem = [itemEnumerator nextObject])) + { + NSInteger tag = [menuItem tag]; + + switch (tag) + { + case WebMenuItemTagOpenLinkInNewWindow: + case WebMenuItemTagDownloadLinkToDisk: + case WebMenuItemTagCopyLinkToClipboard: + case WebMenuItemTagOpenImageInNewWindow: + case WebMenuItemTagDownloadImageToDisk: + case WebMenuItemTagCopyImageToClipboard: + case WebMenuItemTagOpenFrameInNewWindow: + case WebMenuItemTagGoBack: + case WebMenuItemTagGoForward: + case WebMenuItemTagStop: + case WebMenuItemTagOpenWithDefaultApplication: + case WebMenuItemTagReload: + [webViewMenuItems removeObjectIdenticalTo: menuItem]; + } + } + } + + return webViewMenuItems; +} + +- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request{ + requestedWindow = [[WindowController alloc] initWithRequest:request]; + return requestedWindow.contentView.webView; +} + +- (void)webViewShow:(WebView *)sender{ + [requestedWindow showWindow:sender]; +} + +- (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener +{ + [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + [listener ignore]; +} + +#pragma mark WebScripting protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return YES; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h new file mode 100644 index 000000000..f721376e0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h @@ -0,0 +1,23 @@ +#import + +#import "WindowController.h" + +@interface Window : NSObject{ + CGRect _oldRestoreFrame; +} + +@property (retain, nonatomic) WindowController *windowController; +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (void) open:(NSDictionary *)properties; +- (void) move:(NSDictionary *)properties; +- (void) resize:(NSDictionary *) properties; +- (Boolean) isMaximized; +- (CGFloat) getX; +- (CGFloat) getY; +- (void) maximize; +- (void) restore; +- (void) toggleFullscreen; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m new file mode 100644 index 000000000..2444f62ea --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m @@ -0,0 +1,94 @@ +#import "Window.h" + +@implementation Window + +@synthesize windowController, webView; + +- (id) initWithWebView:(WebView*)view +{ + if(self = [super init]) { + self.webView = view; + } + return self; +} + +- (void) open:(NSDictionary *)properties +{ + self.windowController = [[WindowController alloc] initWithURL:[properties valueForKey:@"url"]]; + [self.windowController showWindow: [NSApplication sharedApplication].delegate]; + [self.windowController.window makeKeyWindow]; +} + +- (void) minimize { + [[NSApp mainWindow] miniaturize:[NSApp mainWindow]]; +} + +- (void) toggleFullscreen { + [[NSApp mainWindow] toggleFullScreen:[NSApp mainWindow]]; +} + +- (void) maximize { + CGRect a = [NSApp mainWindow].frame; + _oldRestoreFrame = CGRectMake(a.origin.x, a.origin.y, a.size.width, a.size.height); + [[NSApp mainWindow] setFrame:[[NSScreen mainScreen] visibleFrame] display:YES]; +} + +- (Boolean) isMaximized { + NSRect a = [NSApp mainWindow].frame; + NSRect b = [[NSScreen mainScreen] visibleFrame]; + return a.origin.x == b.origin.x && a.origin.y == b.origin.y && a.size.width == b.size.width && a.size.height == b.size.height; +} + +- (CGFloat) getX { + NSRect frame = [self.webView window].frame; + return frame.origin.x; +} + +- (CGFloat) getY { + NSRect frame = [self.webView window].frame; + return frame.origin.y; +} + +- (void) move:(NSDictionary *)properties +{ + NSRect frame = [self.webView window].frame; + frame.origin.x = [[properties valueForKey:@"x"] doubleValue]; + frame.origin.y = [[properties valueForKey:@"y"] doubleValue]; + [[self.webView window] setFrame:frame display:YES]; + +} + +- (void) resize:(NSDictionary *) properties +{ + NSRect frame = [self.webView window].frame; + frame.size.width = [[properties valueForKey:@"width"] doubleValue]; + frame.size.height = [[properties valueForKey:@"height"] doubleValue]; + [[self.webView window] setFrame:frame display:YES]; +} + + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector{ + id result = nil; + + if (selector == @selector(open:)) { + result = @"open"; + }else if (selector == @selector(move:)){ + result = @"move"; + }else if (selector == @selector(resize:)){ + result = @"resize"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h new file mode 100644 index 000000000..6c1a2f513 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h @@ -0,0 +1,10 @@ +#import + +@interface Clipboard : NSObject { + +} + +- (void) copy:(NSString*)text; +- (NSString *) paste; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m new file mode 100644 index 000000000..1c18dea38 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m @@ -0,0 +1,51 @@ +// +// clipboard.m +// MacGap +// +// Created by David Zorychta on 2013-07-22. +// Copyright (c) 2013 Twitter. All rights reserved. +// + +#import "Clipboard.h" + +@implementation Clipboard + +- (void) copy:(NSString*)text { + [[NSPasteboard generalPasteboard] clearContents]; + [[NSPasteboard generalPasteboard] setString:text forType:NSStringPboardType]; +} + +- (NSString *) paste { + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; + NSDictionary *options = [NSDictionary dictionary]; + BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; + if (ok) { + NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; + return (NSString *) [objectsToPaste objectAtIndex:0]; + } + return @""; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(copy:)) { + result = @"copy"; + } + + return result; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist new file mode 100644 index 000000000..2031cefcc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ZeroTier One + CFBundleIconFile + application.icns + CFBundleIdentifier + com.zerotier.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ZeroTier One + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.utilities + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch new file mode 100644 index 000000000..ad05e8420 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch @@ -0,0 +1,15 @@ +// +// Prefix header for all source files of the 'MacGap' target in the 'MacGap' project +// + +#ifdef __OBJC__ + #ifdef _DEBUG + #define DebugNSLog(format, ...) NSLog(format, ## __VA_ARGS__) + #else + #define DebugNSLog(format, ...) + #endif + + #import + #import "Constants.h" + #import "Utils.h" +#endif diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h new file mode 100644 index 000000000..72927effa --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h @@ -0,0 +1,13 @@ +#import +#import "ContentView.h" + +@interface WindowController : NSWindowController { + +} + +- (id) initWithURL:(NSString *) url; +- (id) initWithRequest: (NSURLRequest *)request; +@property (retain) NSURL * url; +@property (retain) IBOutlet ContentView *contentView; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m new file mode 100644 index 000000000..2765a2e3c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m @@ -0,0 +1,54 @@ +#import "WindowController.h" + + +@interface WindowController() { + +} + +-(void) notificationCenter; + +@end + +@implementation WindowController + +@synthesize contentView, url; + +- (id) initWithURL:(NSString *) relativeURL{ + self = [super initWithWindowNibName:@"Window"]; + self.url = [NSURL URLWithString:relativeURL relativeToURL:[[NSBundle mainBundle] resourceURL]]; + + [self.window setFrameAutosaveName:@"MacGapWindow"]; + [self notificationCenter]; + + return self; +} + +-(id) initWithRequest: (NSURLRequest *)request{ + self = [super initWithWindowNibName:@"Window"]; + [self notificationCenter]; + [[self.contentView.webView mainFrame] loadRequest:request]; + + return self; +} + +-(void) notificationCenter{ + [[NSNotificationCenter defaultCenter] addObserver:self.contentView + selector:@selector(windowResized:) + name:NSWindowDidResizeNotification + object:[self window]]; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + if (self.url != nil) { + [self.contentView.webView setMainFrameURL:[self.url absoluteString]]; + } + + + // Implement this method to handle any initialization after your + // window controller's window has been loaded from its nib file. +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf new file mode 100644 index 000000000..6f388f662 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf @@ -0,0 +1,13 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\vieww9600\viewh8400\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\b\fs24 \cf0 (c)2011-2015 ZeroTier, Inc.\ +Licensed under the GNU GPLv3\ +\ +UI Wrapper MacGap (c) Twitter, Inc.\ +Licensed under the MIT License\ +http://macgap.com/\ +} \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib new file mode 100644 index 000000000..998c505a8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib @@ -0,0 +1,3404 @@ + + + + 1080 + 14D136 + 7702 + 1347.57 + 758.70 + + com.apple.InterfaceBuilder.CocoaPlugin + 7702 + + + NSCustomObject + NSMenu + NSMenuItem + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AppDelegate + + + AMainMenu + + + + ZeroTier One + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + + ZeroTier One + + + + About ZeroTier One + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide MacGap + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit ZeroTier One + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + + Format + + + + Font + + 2147483647 + + + submenuAction: + + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + + Ligature + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + + Help + + + + ZeroTier One Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 547 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + delegate + + + + 545 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + 546 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 547 + + + + + AppDelegate + NSObject + + IBProjectSource + ../MacGap/AppDelegate.h + + + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSDocument + NSObject + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocument.h + + + + NSDocumentController + NSObject + + id + id + id + id + + + + clearRecentDocuments: + id + + + newDocument: + id + + + openDocument: + id + + + saveAllDocuments: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentController.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSPopover + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSPopover.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTableView + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextView + NSText + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSView + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSViewController + NSResponder + + view + NSView + + + view + + view + NSView + + + + IBFrameworkSource + AppKit.framework/Headers/NSViewController.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + WebView + NSView + + id + id + id + id + id + id + id + id + id + id + id + + + + goBack: + id + + + goForward: + id + + + makeTextLarger: + id + + + makeTextSmaller: + id + + + makeTextStandardSize: + id + + + reload: + id + + + reloadFromOrigin: + id + + + stopLoading: + id + + + takeStringURLFrom: + id + + + toggleContinuousSpellChecking: + id + + + toggleSmartInsertDelete: + id + + + + IBFrameworkSource + WebKit.framework/Headers/WebView.h + + + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {12, 12} + {10, 2} + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib new file mode 100644 index 000000000..70d0c57b8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib @@ -0,0 +1,337 @@ + + + + 1070 + 11C74 + 1938 + 1138.23 + 567.00 + + YES + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + YES + 1938 + 822 + + + + YES + NSWindowTemplate + NSView + NSCustomObject + WebView + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + WindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {758, 410}} + 544735232 + Window + NSWindow + + + + + 256 + + YES + + + 274 + + YES + + YES + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple URL pasteboard type + Apple Web Archive pasteboard type + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + WebURLsWithTitlesPboardType + public.png + public.url + public.url-name + + + {758, 410} + + + + 2 + _NS:51 + + + + + + YES + + YES + WebKitDefaultFixedFontSize + WebKitDefaultFontSize + WebKitMinimumFontSize + + + YES + + + + + + + YES + YES + + + {758, 410} + + + + + {{0, 0}, {1920, 1178}} + {10000000000000, 10000000000000} + 128 + YES + + + + + YES + + + contentView + + + + 23 + + + + window + + + + 25 + + + + title: contentView.webView.mainFrameTitle + + + + + + title: contentView.webView.mainFrameTitle + title + contentView.webView.mainFrameTitle + 2 + + + 31 + + + + webView + + + + 19 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + YES + + + + + + 5 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 2.CustomClassName + 2.IBPluginDependency + 5.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + ContentView + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + + YES + + + + + + YES + + + + + 31 + + + + YES + + ContentView + NSView + + webView + WebView + + + webView + + webView + WebView + + + + IBProjectSource + ./Classes/ContentView.h + + + + WebView + + reloadFromOrigin: + id + + + reloadFromOrigin: + + reloadFromOrigin: + id + + + + IBProjectSource + ./Classes/WebView.h + + + + WindowController + NSWindowController + + contentView + ContentView + + + contentView + + contentView + ContentView + + + + IBProjectSource + ./Classes/WindowController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/main.m b/ext/mac-ui-macgap1-wrapper/MacGap/main.m new file mode 100644 index 000000000..4ad50ad59 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/main.m @@ -0,0 +1,14 @@ +// +// main.m +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/ext/mac-ui-macgap1-wrapper/README.md b/ext/mac-ui-macgap1-wrapper/README.md new file mode 100644 index 000000000..bc69b1326 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/README.md @@ -0,0 +1,36 @@ +#MacGap + +The MacGap project provides HTML/JS/CSS developers an Xcode project for developing Native OSX Apps that run in OSX's WebView and take advantage of WebKit technologies. + +The project exposes a JavaScript API for OS X integration, such as displaying native OS X 10.9 notifications. The MacGap project is extremely lightweight and nimble; a blank application is about 980KB. + +### Features: +* tiny compiled app sizes +* Mac App Store compatible +* access to many Mac OS X-specific features + +##Pre-requisites + +MacGap works on OSX 10.6 and later. + +Generate apps with the [macgap generator](http://github.com/maccman/macgap-rb), no compile necessary. + + gem install macgap + + macgap new myapp + macgap build myapp + +##API + +MacGap exposes an object called `macgap` inside JavaScript. You can use it to alter the Dock icon and display Growl notifications, amongst other things. The API is documented in the WIKI on GitHub: https://github.com/maccman/macgap/wiki + + +##Attributes + +MacGap was forked/ported from Phonegap-mac. It's under the same license (MIT). + +##Custom Build + +To build, make sure you have installed the latest Mac OSX Core Library. Download at [http://developer.apple.com/](http://developer.apple.com/). + +Just clone the repository and build in Xcode. The file `public/index.html` is loaded on startup. diff --git a/ext/mac-ui-macgap1-wrapper/application.icns b/ext/mac-ui-macgap1-wrapper/application.icns new file mode 100644 index 0000000000000000000000000000000000000000..e4bcb2819c56c81aad36c3bf615e777727a0a158 GIT binary patch literal 88566 zcmc~y&MRhMjQo~aY;459z_hXHKjXiDUH{qt{r~^_`;Q-gTK=>A`~U0f-v*F)^M9_t z-+%mH9XDakjsO3e{?~v0Kh;Z~fti8j!vEj@|Nr^_C`V3Nck7W0*-QU_`~Uy<|H81m zm(^Fk|35ze|M&lY|39t0Jo#D0nJ@p3PX7Pn|DXTQ+RsgSQFY?y|Fb>+fBygf>tl3l z)r+H>C`xP->3U0Zh3@3A053`4bsoRA}*OaWA}%LmtS>* z)gg zTmH@e&+xDRKf}L<|Lnhh{rvv@$FIM0|1;I&nQZY_db%xYm_g?>e`gktaga3d2|7-a#@$df! zF$Q*qs@*rN8~@*X0#a*!@c)nh|62cxe>$Z$`Jm>G+xOi|{(pS+_y3pw&YS;#`~R=; zzx2QVKmVt(>mC2^wfFxMul)ZXUi|+5^}qL$|6ie2wm&R5_1km%|7SrN|3AO{_5aiV zkct04LnZqj=HLA9yXF70h{XS2UjF$1>3?DqTyo;a(#!vSHvE4UAO8RA%kTd`{m(B4 zNrG+t^*`Rtb=UvEwf|pd1pNQ{;_LrU|LarW(m($%aa3CO-*wrC8`w0Bzeg$ztPEm-;flJSU%&bN z|I7a{tN-s>{!9J)zdur%kqK0+F)%SiG$w^QsY^51|Ns5}SL1)SU;mpJSQr=^7?_#Z z*jZW_*clmlBKjWu|JU%J?azOG22p0lRt5&P26iDf7LXB)?2AF=@UQ>949pBojLb|- zjEt=eY>dpJ40iv2HGqopGij>54D2i%j11iS{{L?H&++g7xBn9u1Q^+xSR2_mIXIXZ z7+8F-|NqW|S>3Q7@@|Ni$q%)c>s zQ>o5qDjh9LA*qzevh>AhSxWD+GzZ)QVu7|1;0*!_8H`{+gdx}(BMb}-EUawo?5v2U z7cP@nAWa<rtEX~SbS)3Mi z;KtdrM~|O7^I!u56S6F*A(zw9+;;WDi??^qoIQDRpD?llMg|ET#j5_!nlrB+KEHqJ z?3weKrfJsl@4TQ>3J+ea@SoIZ2r)ENZ^W`rXdS$IeYS= z4#I(q3<6Rfp|(AX7f(F=?$L`!XHK6xe$5ix^a8t)kwHktBiyEQ@#2XG-#vQq`0VNP z$8I=*`Z8c?21W)!X^(K5j>U^7?R)p=#glWV&mX<*%fJq^pOHaO$}QZweaWIpd)|ZO zPn|z{Ck9zwSk@!bx^>B-$vfXadhzu9sS8K%WFpIR^4s`Xwk%mRY5V&}&!1iZ$(JDH zL9JXPXY=MIi>GdW|LFO%i>EFez1@ItA4p!`%c^PV!oJNP9zTC}>D2k7H+vEOV_;xn zRH!Wwd&Q~hj$-5czW+$uYec}G>REnd4#2v4eUH(QzpHC{r>HXyQeqwIBLoA z!P6lVE046UQ)G5S_pYm__AKu!ig2`07iEW74<2ccve|{%`PuND@z?KGP_yplf0ln=lR*7$ZYE|K z{lLWTl_&20{L=*LdVp2k{?GdBZwLb?Ya<5}8#7}g12-eHu#S6T@1jH3zx-|b&+_N{ z&;S2U|8Mx$1S&*-{GY|Z!@$_gz|O?V&cVUX!qmjT%fzi=7gN9Z(DkqX|Ns7X@;}4B zmj4a^*#H0j1;Jz)|Al`4Y1L$B zVUaR4h>LDquj{wN zz5n_C{r~a5mVp=4O=V(XVQ=7IWM^(=U}R)yW9((%U}WH6X#4;D|GxwOSwE_P%AP(3 z2F4zSHpWJXWF1Iy$N#2(Z2$lM2l=6ip@p%TfsK)YnVprDt&yFXm4%tHi-C)gfsuio zp&rx`+XfCt*1!LsN;5D`U|?in>SSPIVr6UOU}k4!VQygHWCYn;4>EfDf5yK*8h*3? z0gdEMc$QG}luQWM*JxVqjx% zhL|Gy=l`>Hr!Jqn{p?tpt~Fj|y>{c;8&Kzx@7L?w zCleT17}ywGLE5+cSNrp;OPqm~gGEqZU(bOLRBke|F)=VOGBLBVaj<~=nDh4Xle;bV zS#Q1i|LfO}#_s|@fBpIQ|M&l11|}8;7mzU<|8s+)sGNbFnU$G^sf~e+nSoPEn1`*2 zL70(&m0`-uYjloM>m>L;d7?@cYYHv0ikve+n*rVV7E7@hFxwrlQ{{PqS zpI;u|z5_DjU;BUVe}Dh~{O`=bEb$Cv0w>5X%?un2jEpS|Dj@e;oZr6xz=8ey_UwQ8 zzl>Ed z!otMB&QN%6&(Q-14;?;q?Ct*sHYrK=#bARP{;~YMf9Lk&E|4+b{}(XuFzf>5t+k+V z1-Yh^ft`VwwS_?v%>)_J0P2Fixpn8^zfOoL)i6`m z|JMQy9PDCXWnf}8^>wl`)Y0N&;9@90zw_YUJ^K$HJoMs!FUXvUaC1K0y7K^LPCEk+ z!#;>>bbkH%{r}tl9Sm#?!dw6T`~UC%*IyB$`a-k*zxn+3>G6Gs4n6-rg*}y`|nTxcQ9}>EdKxV-;ZB^fBcUVHxiu#vgiNz;|C5s z{XdICQi`<^ZqS!ockcfI8}#G;jAZ>U*Y8F(3*Kr*ZT>;L=zS`JixfO4R~ z;vE}yeft0Z*Z)*eBatbfVb*{D-|av6@c#-a=8F&|N*}CN>$bC5?#=_kY13w-- zaPR+CZV4&2bWk{hM=^fhzI*!z)WARgZ*a0h${(-`fBxUaz?!ys#j08AQkth9AK7>V zWMF}aiEul_z)yz`-21@kM5fhxp(L0 zXOLl>|Ng&IWMGhg_5a^WP^A9)e~=*>H2(9}M&0z`|KEGBfXu2AHW97?h0?$OUqNP_ z7ZH=<^7;R(YUxjV`hO`~UFHt@ogUh6|LJT^N`ppCkDWVwR1%;obj# z_Fw$}|L6Z^5o3`;kW>Hv|9))mjsJIKMWlEwzW;3o&0svbed{gAEFO?qAq<>MXFy|| z%VA*!HtnsAy8i9|e-406YY{dU$%UBq+-*}B_!zoCv5(}o&wqZtw$;$O{QvKvGa%C@ix`SWgG}T9dv^Dw|6k1cBt>NI zfCiNtK(2dv>-H0CFHCKmIQiHIVZ84KeT1uJb?sdvi%i@Ew7h_u?t; z<$qR4z0ky<%FHl%*Or5yKvA(=%s|@X=imST{{8)PYR}nk{{uNCC3wIUCD?5rZ{4}~ zryEpCJ`rPKa0A%^F4%tm-)thxtY%=r&C1aG>*lwg-+q1kzeH3|%Juu-|DXosz5}Pe z{g2>~lHl3_iaoGlpKso|`@0)d1-z7DWHA2qcm02zzqil6{qt0ofk7S=t)QH|McPo# z>GRL;Uq9VDaA^O@FaP5?q$D{v!cF;l>+YRjJ^wlWeO6~+5`X;v@7n*mzkdDu|NGxV zNd{&HnZ{*{r*u^nyK@LID<3^}_|X162M_K)`T2h;yOb3B3KV00_WbAg^T&{ZN%HCc zzw7^V{`n1VDKj!Lw=qaCF-Yz_xc}h6!v_!UKk@N@HmF4~52Bsp-~SIc@7?|hFB6$1 zo`T!~nwsJM`~Qg)0}}%?2OB$k0|y5i0~3S5hNFiLH5}kQbl~Kt|3#oi%C!IA|2O?( z|Nr>by<6YmNy(FeRp>q_AFTb)`S1VV|Bt0WlQ*rP1```Y=lN|%4;?;qVBg`_|BKip zC0Tnxj%obQ{`%J4yP*09+=mZvgi10r3Vq{S>(N~fb(|?}7KeHIv88{fg&9S8*SN{L^JnPw!v3d~y4N&iqJQZ8=`X1_o|M zRt8X?r1Af^|NoZ$=lS*L|K~X-tPBh+9Bhme85$Wo82DHiT&8VWKfR+M%1KvIn6;IG zpOKY~gM$UsVdP*a|NrBE11(8Se` zpa1^<|2N}5$45s74p1MAaU}yYBO?PtGvjmyE>cAOG#>R0gQ^eFW@#1}1g} z<4wQ+&i&5|Qtzkc>@C%8yf?g z+TQ=ae*OEm5EOpj|IY+z-V2fDVdP+DVldwQ{{Q#C|NkulDfj{DOzvc8U~FLEV`O7z zVqkRN`tJXqU;qF8TMSb1{r>_6P6no}3=NEp4E#)N?2L>IBB=*{|Nr~*-~WH$D)xg8 z11CcR<64GB#wG?q7Ish|3s}y2{Qv*2AE2bS@;}?({|^-yxELE4Rx>s;@H4Z6vJHcz z)vO1<|Nr~(v*AC(zg3_T_Rs$#t_&>fY-<@+F5sVWRiOzbN`LpF^J+|0_seJ4SEpI<-zfTut=fK2=K^Z%pyo-9nO7}!{q ztkY&5`Oxs6`Ogo~@Cf6-f15!u1S%-L-JBDh6u&5eJw7R>Zsp1Me;fWY|NZg(7kJ&u z_W!K^{{R2`?bq7>tbai>tdK0b7hHle{{FENG?e$R>3_q&L!hj@{(r;26aUx#!!|59 z6Pq9wvC+}O(a}OkcYk!WaL|tyKBHi?@YgUHEj)Pe#UL3ioCzB(JV?dS!r7n^K5+9C z++i9lqlJ$!M+@)V85X03XPylE(L!r#jTTx{YqZb?G+OxQ!02e94s5jW$>?Yyd?XWT zv=BV@I67K5tVRoahU94Bw_A7b49sXDXxMR>j27}!Z?w?&`QRKaY`nyRJXpAPT9xML zU?F&%Yjm)1bg*!Aun;t8H#%52y0ma~Y2oP7LaEWEg`-Og|C7J8aF7lbjxH@6U0V2W zbZOz}(!%fmsj;*Wwl4kq|Iwv|I~fLiY2n?`rG=wQ3;$8Dw9shSEG>L9y0j3oe$M&- z=+eS}qe}}%mllqkrG+Kn!wDRyd^iDUi}NTR4S~@R7!85Z5Eu=C(GVC7fzc44Q3!wz zqQP;<6OC*{HWqI4z&L}EfsvJ+9dxWB%u#f92kfv$KoE3j~(0S!7<#%tI0JGXCMIJ|LYV}_TWEHBg=7SQQppp!{KyAPpa)TThEk3`-( zf8yxT<0sEuzH$4`t;@%^EojdRGEo$Sp6kTS3fh@QZHpo1fqbua>BPzN=g*%%d-~+@ zqeqXOID6^(tvk1_o!-5)wrUe$9xdytATYd_Bt;kD`@N+a)la}0g>BQ-ir%s(dedY`fXPmll>{csido?B2!t^pTn02%_H#W7l zcXoAkwzbq;e0KNl&Ffb#T{w64^r=&)&R_<_nKP#^>=gkWe42?ty0xyRzM;OZ zwx*`0rnbKB%A02|U%Ytn{MpmT5AWZ(cJ?$D2b?{5$%r~hkcAyp|P>Csi~={ zp{eHl>&MTYK7IQ1*|X=*pTBtVLa)Mtz=IW4uw_E(-jwg1`E=a(=Fg!4!56j5Y9q`YHfWMpQ|ZL4o;Yy>-@ zzM-zU^5{Dh|37>B;s!SRYbmjxk%5t&lMPgtGBTt!*VNb5fg-=Lv7xTH;?TRtFQCy6 zrk=jIdFm``6oArS8wKf)kwL)7*4Em>)KE`Ht!i?2Pe*%eOH*S*T|<3y#r}7XUpxid z3?ZJrxP@W=x#Kscke~k;8HAmk9UUBvOXe<^KY#v$1q&B0p4Ze|vGd&{H2>ehwEx7_ zrHr6j3zm&YquH&U9331S92^}ToNYUo&0Dwt0_H8A+Elp>bV?{B=)vUE7xyrVz_TYW zuLqq!K$^91)oj*IAnP3*9PFKJ+7b3ISTMJ(d^3jq_c851bz!F<`4s>gDD=TDuy?X< zL$-f@SJ_5%`=5i(e1(_2V8+?g=MJEp5exSkQ4BU~aPWiuZ`HbNE-d^PESTR_x)#I! zhZz1pbLPx(&^c~I*@meI$$n?6mgUIycbBa~Pyf#!f&Gj^oIQ134Rl%yrr88Uz+EX& z`g3#yg@L`ZWfQXf3%bizpp`$*oa|Kl(+{qMb96-9ZrV*EK-sn zAmbYn7!(v3>S=H9Y*Djf<+hvtYseg?;67UnANd-~#B`v-7Cc&zUo)&mX;$PKN!= zl2RZb;};qf92^wt0kXduVgJJUi~7rFy~3~`qXh)AznFacrF|jxdx7k)Trn5s|Aq4x z_E${Du>bi*^a9}Y`D3@MsAPWyiv1HRr@TP(|I-&(8bIXr0HEOy^S?L9|78gK7tCKc zp>opmr^xL;Pz&%fMg@5O*o}!~9~*5`~um36W#x3&YnJZ7<7^w0so>)W3xXO#r`R^t#@CbW&m&l7`+5O zbLO-n=?MU4zc)DkLw)S+oh`Ew_Ai*fXlh;a?U(5GV>Cd|fFeMH^cFbOeo18evyk)u zqG@%FH;J(S^tlsPO-L^Qu-Tu1;{R#&4cE{L;HNL{V#GhF0bobI{a#4npN``H=?(Q) z&?>;EFYaU7fBx7_(3Mn-=qU_8ALf6k{l1|1Pet+n^oF{N==Ni20E2pf;iUHfA@)m4 zdWC`OUy%J4$td>EXskVtVL!GJfMd5)NUs2)_Dgtz?GFK^e~Uy!`L|&Hq8Uv!$O9nY z5*SMZ7*ql0kz+ro`6DIa5gHg26a>kC2`Ki@Y^pki-T=eW00xb~RFZB#gNUrOth9`j zS9nNhNC>$7XBmfN|AK`xo2$?VKyWoc+ewdq1||U!AwfZ2dmncXH#Y}+M|)?>SmgfC z!dWeqN8h3jKsfz@e``7Dnh#X_pIyLc0G~T?btSpe0E~<# z&i0_*7pVVj6}bf2{yDAXyU{v;&z@o0f9CATOPje#EPbG%&%nrNjAVZ}iv4rj%XgyN z{}i(UeCF)w^Lxl00!FdlI&ATLME`5y-1c(x0gz`;UtB_OfS);Y`rHv|GRNQ<8Ib&M z9g1xKg4rzo6yAz7A;)3VBx|A3l`2_ zI;p7&eE{Uy)8|((DxfoGPn{#90RVO;6N9dcos%O7I5^veESkS?;lhQB7A;<~WZB&2 z_UiTTAHM{ReZ!lfSQ_AG&YU}O*@(;nfRRDa&C%Y$!O_XZ+1)vM`O;;}mMvYnWYL28 z)7o3R>({-10PK7XgTooxf9o{$+RDI60ws9XavB+&DGX#&deE8r%dec z?e6Mq@9ykvUi;xGXaeE|Xc7YKf@d#poIhgsBG}IJjrNqSf zR69C4J3G6&dwP2N`uck(wyy*cC5tpFMx>9M}o4p%7371iAy0v?73!iJ66! zjf0bmmz#^5hfhFASW;A{ufKo7gozU;Oa$X8J?q{-d-W0yK%wyJ&bbTc&!ad2WIyQ6 zO;YR!-}u4K$;Hjf$1fx*CLtvyBO@=PKVjm;Ns}i}nKE_i)Tz^^&X}eOk|r%#_TW9H16 zvu4hjy5arHH?Khe?uHjvE?vBM@dDTh(0BliKs1oh004(PI|mmJFW7boDOouMB^5Pw zZB2_QGiS`2HGB4)IdkXEoi}&E%#H6~y?q05!Ryzcka&Cd($&kCFJHO@aRoRg&RjTt zyOa3z2M&4;PHtX40U;4Fu-BDT)iktq^$kq>=gpoocOG;Ie8J**n?AgL`vwGFzkUs( z-afi^{o1vwSFc{Vas}iHa8R7Pc=Fav1};WsCSpC$COmMz%${>{6$Z{NLp|Ni~Ew{KoOzklQA&6_uFT)%$( z8ps(CM_jmk`pyg{es&HvRwA4LihEGtLwqkSE3c#i^1OkOshO39_xy$P7A*#YrOQ{W zS-tDS`w#Emy?Ooe*^@^P?%ln8`|h3Fw{PFRbqnN*8{nY0a^=$1Qx98N#d-L6xHv$^ zGJ^|NoCG5?3&{Jt{DQ)w;*!#G3d*YLAm5vqSz6g!$1Ga4eA)8VYu9hwxM9tTxr<*s zee(F>gZuYD;QsylV8-3McR-ihfE{uD`n9W9uARRh&nG7=BFGPR0sd%U1Rb8q$qlt% zMov*#RYObHz{teh(#F=wHn4H#!UeM?bvIU( z*c~8O+`a{hj2qXk9oJJ-kd_n^5d?<;VtophP=NWLPXN{b#-h-~iCkH#9c0u(o&d@b&W#j*3rC%go6w$gjHd^f71x7&HY8>VJUQPo6vm zhsUD__wL-fas9@vm$UUvb+pu!Sw{dj!@(T`+PDshfDJZU}s;`^;{Mn0FuU@_a6+f?Ey?puN<*T>v z-oJnIlW(kcimCw5NUs-Z{L6X`04$thgXknTROG9rX)W%D8DzhnO;tr1 zkoUPb@FqX7^`PswnLw9rv2$?p@C%De%d2YW8kvLq53)ZcGq0$;x}l}Bcf!<3Yc4)| z@$~NHQwMfzShZ}?g8B1i&zREJ(Nt4jn3J9q6CUL2?qq9eqOYZ@Br7QjiG7$I1ZYN3 zRm9H4CnP2*r>voCWM=K?>Kzag6`zusS6p7x*xK1UamuWjvlg#fwS2|O)oa(RUb$@H z+!>SmI$IlR%8PQ+6Jx>xecYXFEsXWGR23oCbKuSW7%pOB<>VCNT$$edIO|=!pd6~&^ksKfSHw(n_n1~0BoJyeFMXy6H~MDip#6&o7=nlCQP0>W9F<` zvu4hmK5fdx-mbQ$x~j6m+>GS-sL%j!H%D6wV?8Z3C0R)^A%1QS(A^4XHsIwlv9NRU z2!IlRiUueE?43RRg2H1GQ!{f5ODk*Yn_AjC!OhX$p6<@})~5QJ%F@Ez%+$n~2$0`F zw(D!DE6GcV5t;DOT*Ji5&czG1Um27G%^@XFSQMxP$|)!+t*ET71ucjGtqH2CC@U$< z%g#tnh=~jd@OF2$w>C4<(^6BE1KZ98UPOUrJ^?Nx$bKFHAu%agMO95*Lla9IM;8yD zfZ*_`*o2g{jI5lz{DQ*5qQZiLyxi=p^wgw;n8?r|f3W4|#`@aoDhe`^qC))K#AJFb zj$vY9<7J;EW3%xvsjykG~&DXD5`>l>PyTiH4|xq5i{`1uD0 z1&4q^a8O`?zpt04n~S5JwWX<%zK*7vvb>BW$Z}AkgRaL!m`gN^k(rg9i-%uGL|jrv zUJ29`(Kj+Rx3spkcW`ueadCBXb8~fdb#Zobu(!3gG&eOe(ACyZQ&y0X5(iiI9K^Kw z@VN%$08n#C2-Fw_wZ_ymwRQCjjEqf8&CD%8z}(!-)YRC>Kwno|Q(aX_K^Anms31Qt zH|X+8Vw$}8tOu3E%&hF7<~XP;A|WXwC$Ffatg5E2uA!-=simc*rKzEzuBNJ@q$n>Z zBPAgwA|wEAWwA1oAL?i>Vq^lhNkMgyu!yL*gp{<5tgM_o7|6-V$;wDeNlJ)|iUh0DkU>W;F4u0!GEnQUOez~ETKz`($h6`-KN%hk@sz`!7q zR#I7zRbZq5awnAb&nhs=U|?Vn%gjhAf^6?$WMF_?-^9ScpPZjl1ZndKFfcGEC8wmO zK^NaJLKh)|WSPLzG0ae7lmGkw4`eU`@j#Lw3}S;Yhz-IZHUr2SMn-lR`X9u=18N>I zva+x+F#eBW5LO6?h)95;h=72I|0xWD42<51*@-Eox@D$%MtX+-Coq7##^BJ(!1#ai z`GXo_$wysF<}d!&sparY)^66t^K;bo9t&28SDdz!57XuR8k@7|Q2)QRb_KyRv%{t| zc{*`!y*2w5(|gVDhvxna`f&TO&hdzESKCfV>}hB?e~?GeFGJGqz`L4N?(c&IPraGE zp08G5+Hujq;;!v{+f;M!{5a;2Y`ZHUcPw!wc9VwJxOky ztZ@86v3%p7y7UD3sb6Kbw|2i=exXpt!^0K4YMjf?5xeleS*76#G&b8=i_blC4Y1@-_7|aH;Mhm zx6Gr#i+YVCQO|hE_;?WG#q}b*M2LK z{Z^RnqORZ9n3UEyE>zZ^=tY%Xns`ux63mODq=h-uYs=}Eh{ zMsnpG_d6d?@;XTf_&SnouWefE zf6xBt-LK0hyFa{^#VYsJ@9&QIeECE3i&^-?jnZFrws4<3QphlG&&yeBKb0-~dvtRN zd%*X(%3t0K_ym0aa3sWW<@xV9H|jMX*)qDEF8H_k)M& zi|4%hp4RlH8{e2RYCEoQdM{rgEzQ2aKIqa7Ey1?(^!W7D(p5e+{j;YlP5v>_W$Npo zsUhDrOWCc&vtIqq{Vv;R^?bVQL96Z-PWgnyO_mqdz1c3<5@q`I$>IwJI)dA{&zBrG zUKX)(qGsG-ZTpt}<))cSQ`k4>%sd%od{1Y?ilQlT-JPfZU3K01?pV0m#a*qhR5;2a z3c8oqW!-!gbFJviMCHChmxptA@Xidp=e#^8%4Pdr<=+!7eYAY`tEBAD^m~`*tukxK z%#QmgWIgABLdwV4+ZJ(}l^Yj^_B^<5-@=fbeJ@V;^}M}~CYx+F-i`~gn$r1&$E<5o zl)$#~!&%8kCjYREWmGh~I?>N7U3Z(tsb>r`dkVelKXR<>V8}H)rKp{>F`@RKsa5!E zzcSMfqoX>dpDa?22KO|st}e>|B$F=hG4;Nb#JlXZQh9z0vK`ZIMBiO^bpIRygCjRK zC@$v`UDU14AlJ}v{J~TC<`8?<3o|1!U#|7eX!kngvRrxY>Dc*w(VCxkTO}PebDQw{ zXyE_+Df?c;9IbZ|NvaBFKBye^^hmkT`uzB&r(vNf)fH8l-xr3wb_nv-UHw&@SO)%AM5z0I5g3o$Fz4B3@yIobD2 zJsH_?@?O)2a~k%aSKe2iUi4z>Qjz=>A4-^}?`nP@bZ-&+;_{gaXY(C$TMq~){#iYF z`AJdrl_H#~QZGj3-R+tTs2`X=9B-;%TIF8ID&SH9Gh zYw51d{by~skF81)iAg+rbg!M?^u_Au-*?%`<%xRlb^&v_Rdc6{?Z{&4NaAK4=Iyf(Ay zC0>7SaoB8LX!5Xj#e{9;4q-cmwVtmn*zvDr?Y*Yt&Xmjd-{55^_D@(+Pa%-!-mZ$8vhYT8^Nv+Nr@y+?TNzyqtRIpU}4eo3NwZ9}92CTQ01cbc;23>WKr67Z1Ps zrlxXzj?$Eivp8}lCLX+dT2RQdMd4svUPIBuRndj}o|W)j`*)>9@WZCe!=EHwL*Kn) z-x*`Pi|e(8=Al13PRzKMaH>hermW}FzuK*>O7;isNO@-mu{Tu@2~q6M@$xIu$ye>db62T&nWdr$-Nm08!u1$ zc*>5KoP7f2gaUfy#u0r+GfeyC+l@G~D8*X4TtajP*PS-)CLUzv1r$lsN?#`!C(b#Zr9%DkEN{%JdGV_y- zKChb6n~Sm@d+eLQckulVXNQU={-Dy<5_cwnmR~J%R)17!-@m4x`$@ymU7L-QPM-T) zr;=lNZJNzZ&4-(wHchFHy>sJKqWLY;shU-Lpm8hIj z+mTb*1?>kHxZRFhIP2X?o1EV&UROA5i^7BJ?ljL`tzx+7#G<F1TM zr{!lNE^g0Gb=hrvaXsI`w}Dz}0nPvUH!b_m5a_#k-Lp5>w!QTDHEZ6BlTFcYR!*#1 zaaTL<&u`zG77fCp-K_noOm=>r_m5}x7F{WxIiGp9*qIsrv-0m{UoT3JvSYe8r}xX! zJNBpBX7(B>?~W0v+7xx{`c*TotZ$5OW*JJE<*r>4_iN9BO~r!3bN;&A*m&mIY{^$U z!a0^|^fvPE>b^6xno0Xv=-c<-FH8KlV3#?zW;*Yjf)y-EcT*~b>Kh+QOs+psZWn%l z;{nSAMu~GPcJ8~mRrJDseGGxaZ}&d_uruLzPQa|RoT39?o0kSi@+_`gvNyW;(Z1z9 zbzhIzN*47r+?3gCV(u1Fdh?|6i`Gt;?zDiL?{EA%9enZB^9^@*pXe}}Djjt-=2%76 zeGiwuqP(kXS$Bm!TwT~Q``}sDy4R;zFFS-O-sC)R^h{jdu8D#nb(+>5Ne3pF?fSv@ zQ;Pe|ti3nZnm*ee@Th%NW2V{!tMoG+Z`y4ha0Tih7F4QgYDw(oLVQeE*zf+}5Yhoi%UvNBvcc5>=YN?K4#tKk?1?Cl;k!RpDnIRYlwdzyz6rL zl&haVxTM^-6?wgV#slk+4|86uJYhN`H~&?+?e+go%;qWQrXSSV9LD%IcLx`j(FZZL z*PBDPJdpY|8J7pvc~;W%Y>!0uuG)_wacedn#5bh~B!msK0Q9W0)) z%vt;6_kms8+}b9-=$$oJm5={_k#s<1_}Q3kvBqDT-u+9GkPV+2`ePj)Wa9S=5^7^J{(grIN94#hdeiem5QnDKEA&z3cOmLCU3PRh{+TL*gc(iq(t#jr+qZ7am%#`1bfW&jVd2GQ>P4?RQO&da`Ov2;z1(C}jDU-#(o z;ybrWf8DtF<=cPPU2{yj_wN!FJgI)>iFN-q-WQs8ek)0Dj$@dbBIInVux#_kn!S2= znToHnRvlXSQhZ9d-Nb+XaVBmFzlC>-FO6({xih6u{*_(#jBBlvg?v9BjFP;&{*CdY zUl)HrQ!`6m6W!;!*7$pe-Dg|=J>Hz%&F`);T>da4AWMTMRqn~_%eR%z2JAYfSk3xE z^U#4WOLuM9R8$z3dy>t^|G&5MlM5%?Eh;voTK(wV#+bujwv_vSmDhBJ@B=TrX1N>+ z`}RCaM8S?ttgVV!xueV?CFH}|ndeUBTR-TbBhD{lvw+8$@T z!EjM`f6c*#@~hT`{8V2S=jlHTE1;FXjYzY@Am;L#fxUgZJZQ^~IYMnXl}Yi!yjE zdn$bHA({75_oULhCL42ygS`<uWL~6Hh$F~DoQ6VO!8)st+xKr zse9D;32(_wpUp>Ju)7{!adDoDacyLC=bPmVHJ_cIv&r_!(F@NvJbor|&C2Iv-PwY; z^cVY|wW~h9<==GGI4QG8V&0OB@5?Lw_qc=$cW>Iq;pKJgtv=73^Vi(jb^J)MROtnO9T5%V$?%d{ST+O@TgsgjTNYj%N6Llxr-t-qX$`Clw9d>!Mn zHS6!RVo#NZlAUX>70>IkYUw$9Jo233yqtMKtw)^ZnJ_Q=d8e8)@X3K+`+hDnS~{&S zc*fbPGd>p+m!4Q>%JRIXHYLd@|HEg7zpJ&KR5shzl`$Ooxcbi*nVM}Pwnwww`Dd>< zUb<3j-v0GDZ#}0fteCT=B>jGXWX|rE6~cK7>z};KH|G7mn_u;DmgDlsBOm)h_r`r< z(8-!stF%^s$*O&wCv3_lS-t3Td%mlrL|pd9?c$a{U!Tn^JCyU^r}=tP0S{k^k;?ID zy-7{l%P>HnKl|aQZy{pKA1F|I_m_t76XVRC`j*FLJrX>HDYs z7p|7atljz2CrVv^&i#`Wmk%&7veYH)X8mq2GXKi#z;7RQUmEytWqlw#r9l2z+T0|r zC#mLhMV2;B?^<}jtMJ7<4T*`@cBQ`MOn`huoJ&qH4w3t{K!4fsWv%iDFMdyy-nA%mga4(1jNJ1OxMjZ2ammnuG zp|I0%@qdw>T|0yO{ig;uw8cN2QV>7E#o|Ac%!ltbRqnle-?!+^zfyt|KMhSKJPPVb#d~5y0>f}9}RT;&e85-epqr+Ez zXP)p|NILRsVA1vMiqU5;o2|R)t+i7>Q%c)%r$*=Rgx>a0W{ocu<$6q0D#{* zpcLeAi0eYHqQHCA_h0t}y1KEsFWj%;;rG&G%QD`x2Ycr4o!$RNM0Lf>2ZeQhD_)me z*?U;f&R@0a{nyurHU~^sGRS3Yu1Y`V%klW=&t)wx_ckimGS9tzGy7IqWfBL&`U{G} z&*m-Oc0#doe@Vc}mKXXz6AcdXRW0gC()ORIrqvKUHSO%tCtoscm#c3pQ1jvl(Ylaw zEPUQ7dy_c7@bBA;AN=x{c>DN&%BthJuWx^DzQ@|T-RCRU@oo3_zA@~oooLLm;p`P9 z@fFMbUoEq$wDf7o-C(jNxjJtP%a%irxdo)33S65rq4izv%w1{$#}%U2%3afnJX?HF zU|uheP4X^hc{YZIUq{O#Ugh=q8l|^rWE+G_KJ7j6ysT31>xwt?=bt)x^#JDszKIN4 z3~#+Z96BhG_vvZt8SmZwqVMc)_rCc3&5?lg@rM_C?C$>VKb(Ky+3Z8U+O^tmxvbNc z>8_Y`jQ{c^`O^hQ<|%a-iJboU;`CAZyS-1iU*9@v6H+I>dFiVix#eZW5@i{iLSCQz zU#jMp)uUEky>N%$hR+S36kI(cZob_<alCfK4@Jhae9>3?)@KxWt6rU`pL7BKOWpUMQ*3B<}=HlPvJj5p8UYya&%6H%AeJ%_WQ4x#piOVIPLxQ zSq!%>H_LUteZS!HOS(E3l` zrYdY=+0I!v?{TpE-dpFiZQsjnz7pI~x1x(vB6!iwD8V?p$ItE`nDl6q^+Z+od40Pr z_WYhEEs!jBz-q5-`qccq&~y7FBFgk8Pa!f}*t^uBRT{Tk(2J81J1E*$dn58Rn#Zk7gH~;HYv@Q?Em1T@K&5t=*-^ z1uZAd;7;NcyxsG=?{($zzZ=$1vp*XC`Okxy_st$9wKKTi7IqTt^5~aY!ZL}M;d$<3 zxev>yTufe|yIxmdN=^#D?dDk>!R>l43$#Bs&rDePb@RFD^4I1xy_is-wqJ%^0L-!g>&oGyjI$K{m-{a^jukG zu6k*saBt1qoji=c*;WQB&)dOi=i}^U{QDWVeci#wvcF_BA6#Lc|8u>3{S>bYCzfXK zT7Pb>jA9Xsu{NL<72iD8p zY`s}_%V%X{RTxrf3;t}XN%dz9Av8`^Xy~h zL&mP+!`8ADyldyq{=uyD>__kvzU5s1B1Nj>O{OJ(SQNiqJL0AD>AezfS`#Mao9|#* zUXZ_F@x!%$c1^h$8>96+KCQgia>-@qZ?x>Rdb(G;Helm6j>7vp zVv@5NGK9KjXAAqkU|pj%iz3AaR zt4q?wbyDx{%Q7MN3MgRX!5Ru;%gOt!Ir;m~1U=&A zTbtX{{%ohhl=}GrM`yRYZpqv(y`-)9^okWb9)J6)_`CG^w=YwFmo1myUbH`NY2Ce+ z|K^1s{_b|Hjne#Gw)@-b1@Bu|tZAR{D!@@_lZw`YIe!|CFkaO@p2E?7+Oy1PPEX6U zm-{9DPL8dNEZi>BVZCCv;-8XRZEc&U{JkT6;n1XG&$F%O`T7RTx@&XFZ(7C8X1%&; zSMx;8=ONx7?eW~nBCEZ({C@h)}ZUJnB{EZ z<{@O5CU`R6kNzIld`KQ&N0#7Vi9lihC?I4xb zhdr)htKCZ1rk8M@OMLdFC)e~Rw>;lVleTZsABp1`OB$UQC?_`>q zsrO@_+e58bzg)49;5lkxSGT<}dU;~~*C~DnZfAJkFw3e*6C$*_h5}Tcr zEEqhKZH1Z}>vq|0g?P{9u>ljAc13aV?4K^U%=4ed6%BTYQhyQsE%n8|Sx#T(38<^S zV9fNYp1n$J$9E2|mnXB?3L6;WY#KhdKYLhZYAus+`a|!58>8#wxJe7xxOb&L8(<(Y@K{N0?Ku!BKA_p;`;C6AKlNk?>f_-4)f zx8q~;6Spekg)FO^j!nt$dT?`5V#so)ZC@Q+tHUWYWrwmFxVcXP)=skN4~UYoB~9A3jOWE2=U?Ip$Ma4(F#2dE&{;;AhQMRXPnl*RzgDMu+NsydlZ^Fu&pQ2k&4wViplQ7tW@?!Ys%wIGoh|#aEdRv3B~It( zEL`AogHh(0jA>Qnl<9#p6;WxeqB_lJ&~(lfWe<2rrELN1AYnc!5` zFvrN7`*y1b-CNyuZlPasb)9H!j%qCL#1{#g&RyAw?YvIrU9Rz8ideFm3wVRNk4;{t=FcHs-YdSkx$;K@D@*Cq7` zoq6n%wm~Q|?*67Y!!472XVwJGTVj#5xcb;lA+seQkdNK5F|qKinwaiw z#V>o;79@3wE5 zVQ<3DI~M-O1J!yeby1t~9|m?w5jk@NlX^{KXi(c}wr;ui)nu| zvHr38vRUx1(2J@OWygLgmcP{GwqcW6bVqx^4~tU|&hC1&mUGF()lPa=q8~FgZSUP& zqB5=WVd-gJvr`24wO7Bo@n=tz<--bKCx|7eU zG)QeuKQm#m@oOW#iqzd=cQYAOnhn+Zw%@$Uw_o+PlZ1|H=*-0l=I%!h&A+nT@si~x zEBONs9GdHND}30d*c;ti-*jnCxroB~dM%mz34gv#yWjHEC*LG<-tIFl^L^*+ti6!< zfJ3OUL}>GG<;LYJYx}!-ryVdhsB=;AeN_>YdF$MF zM&{A}M~^u>m>(QWTv>QYDmCrd(VQhcl2xmlpGYhHmC@d|`^vU|GETW($EMi-cWSyl ziN(XIb>Zc|_1`{}%T&g_{3E1i(W$&Q-7$P3b5&ZHMd9hC`%F(tFWtM|H9E`S*^!>F z0vBcOUz;45c8mXN#+iaZ$(NII^}oC;lJc!u#;jj@-Fb#swOVVk zlzG1FY z*kwAq=eyH-x!6~FduOr-Dw|nWo9(TWJ^1#_g131K|AgJlXfVk2e%GgbwYuObmwIZx zzF^f(hgnstuFuXi6}A0%Nk3#A-`)m3@z)*ua_7_tIqwgd;8$ssq~4zF0R*%mULYD^zG`y zJ3C6c*FBD``n$E|;gjQsD_!k5O?F1zvQjX}bBemia9cozlW}UR#$nNEPJ)qjJwDUktVv6v!+h0^mAB!&! z)@qUNxbO7OV8I@)Nm*UDKEL?y(6h5?&hGz;=9_hjmpx}l6w^Exkn*rhpgwDjlwz^O zwAj|qTa}{oCQY;#E1hMW7h#oPqOO`*@rrxKia%GoGFSg+zvh&-!&jf}PvGCzlk06y zd^om6R?FbsX6y7@4S#AmPRTnpuCqUPU{27+ubxNt%Qxl!HGj6{%f~%Squx*9ym)NJ zvlkr6Cv~)Mv7gru@bRCwkoD-Ae=;9DxzxpWzj##o>>P{MOUCyeGh^G9nHNhg+1j?} zmNx72Op9ZB)fDZDm<#Ok4$t4VD&E}x zT9oLM;x6&$k-PW){5nm9q2Iu%z~lG7Ke$14W;T-l{h!BDbAd)^-OsA% zTnpAab-iG@F;=pOm#;Coc_N5^ItIY^~yI7LRTH;l3LN&z3t|2rcCuxC60=v z%U66`*r<1h`8OA5@y;!aqkj3UvWz+rA(Xamvh@zuP{*|`+&k9(xanxeI!P^9NNR2< zi?p?_?S6|kt ztJM5ToW{)g!e`pzL^^G`+zcXQV;{Rl7#W61&-wBAS^GS#eJ_Slj5{9pL(vQ9W#4- z?mlDBy2r|&T(}uUUK;UotZJxP^ZS~E!hB8Xmp{vA{I^W_vv=w3qG?+$Y@AZ?B)U@W zzE<+yb$|ZXmvKKk`c$@X%hmWR>x2z1iidsUIo?(o;CLkX}#!U z&ZYXmub|FXF<|zEWp_3wu6-74e^!f;&wexC!b0z@0UBmcCV8q%@>JeFXU`ReOP3F~ ztv@yKMe}uEl|Pz+DXE%g6Ly{c=G3CD^LFp!g{k|c#g^qAT9dqJ+GDR}=T&+rz`8*T)_=CCq-8>nG4G&2EMzp;bxtsf}vD0-;+Is zzf;Z^-&vCI@+HqH)eE~PzIrYfXYysMgp$BSD9*Tp(^MdhtA zyzp#-1>3SU&r|JF_iDmymuX1Hx(?7yn6Oj^2Cj+)j#%K={)fELBP+9ch3L$ zr{zzOu=w@!w$;-aH#>@oLL663$#`XYyFtk0U|Z7Ojmi?y$*p1cX3YGi@|AV|+<5s& zemkiP|M+H!PnYG~+xH+>J4u0&^*)qvws`J2VTMJo_f32MT)%>& z;!SD74zcMI{?zWhwv6qSO_LwvPru|o*7G_3-(+g9mQ^Z?wmkE-4S49WRQnQl-5=)( z3p*#jJ#5RcYqO|l>i2smtTs$w?9AMrcP(k&?Y`O5yBDgpJlgS`FIe%4m7W7zQ9|D5 zo5p=&W(mHnKfN84g0B1BKlt_j#HFbLyX%%-e7TpSD$2JgHmlE-GhEnr)Aap!9@|-D zA2axqZ@grqe9K~qx$ezP4cnfS7;a9T6(8K=G|6^diNYe!OO}jDhVT0)1?|(ictSBk zwfoLPweYE-Z)Vpyig=bxoODP+ht(|Yt?HuUA3~88Pk#kJ-y|87wZ%~|pQ*=lX*-ja zQ|I$Zzji4;s@?oQw!JYpFtPi@Ew}yhs!P}91xeo#j4^7P5;T|bP~F_wevFblTR(=U zAMH$jAQbptf4OQ$@ie1HY8#oRO8(+!yJ3*^Z-;#K{$;(7S{bt=Pu%;)SJL|;{@dcG zJej4X-xqx7t`ac${#bpkhU4+xKUz1NPUI$(`Q)-Q?^4clF&o9p#3uRmh$ z`i0J_7d?*rIU4%;+ui9sv5DbUCs?!{{snc}{8dc8csg1vHqNvxJHB9!+lz^XYYv9p z`){?PcLuNG3A@JDTW2T5op-KTra!5Yv-wEo%`eyeKen-#{?G5YvfppJ@%O?*dtMbS zi2L`vPLO+Qbg1xk;YzDle*(QCO1$?=J_yUoIaB_8-;=xTx7I!Am=JMb;g1^MzdG;4 z*2m3RP^W%GmSySl8<|H|J^XQ`wf}>{rX203^7$)vL~Zm8@4skz;KI_|v5$^^UbT>? z^-Pzujm)Qhj+Sd~rvJ7s-{$N0+u~4)XS?UVceDDw{P>~CKO?IA-PO5o&l=8_eBNdK z{E)=NYheptG0)H6!>E^k;iuJ{#MP4*%yNy?}SKhp&P0!}Z6_FF8eB;>d!TAOmAs(tJdu= z2!B_%s7xu5f$!Vhmg%##L^S_rshJ&?e9Am6l+{#f>%pVKhV#YGbLSN_nmIc0%oh`I zaQhqZ;&!1^Q@)X{xLlC>?**Ydz9cnU$fSI3j<}Jl)unglzvchrfcq037Ut-2zgM~$ zHRV2Ex5q}s4fD)npB+^@Rj|!n@u}=<{wqdm-5>R5O%UOWuhgmdb5%{w*Qz1ua?z~V zLd}ckCud}79S|^z{^Fy&f6Zruok3YqIbY>jnhv`yBvaZ89X=X=yIwea%gYf1~&uF>jgA z|K)g|+1Bk&hj$7;Xp7#hIzis@ijw4izit1erYhe{nw`X&D>iR$(G|@_Qm%6ZEPZ;9 zPJDJ(LeKk1!6JbPmuB93)gZM&>{0*9Hl?|j_pDr@{@8N~*PLjpD&hI(?^fS$3Ayo* zqvU$x^hfF)+KfG&J0C8tJN#>(O@r;Ct1J1|h(C1~oX~0dbuWMOw5p3C(NA}EE%9|f z*1GA4*PrWeHl!L$Exnm`E+Mmh`PU;Aho1@jU{PNc8r}Uw!6h`v1YH}XYM|+zdV>$g&*i;V9$AbZRO?%0{cF$KI?E)&rLx<@7&VU;BpT?x~e+6<+DuYA@A1uP?n9d#};NaQA^tizE(rPRKgi=;#s@ zw*2peE3ekG-*h^y)pcaTx~f+X{PKV2-k(>~HDQ6e%E~LMLR%Jj>HM8@^W_BTiN>Wx z8Gdz@lLH>`memF`e9f}jw&DQq)>YTv3Vi9*a(un_=3=Ki0?9fdpAz_IPd3fyz2~3u zb6?(z@^e3Qrq3{BX{ljR^1C$8N#po;p_M7~>OVJX^_l9WEPu1irZqPsN5%Cy^R0s!z4W?$>@`odIuK+^NM2Fs^-1;*U++e?FI_CD+7-q<@mt4N~r zyXE7lJDfhVSsG2Z-G0cTbb7FD`1S|9X&@(hS#6ulV0LbG{A!R3zgz9tw4S}>A0GDw zdnTRAlG(dbAp+fXPtCtw#o@9~%WyjE++3IV#wqPLwrs9@{O#5Hw>#diUa+5%?#dgzjMdz_Q+?WfK`#rF z%57)V<_WKkNlyCo`%d({HXXVBo6En7B>E_oDE)5C_DbvgXX+Al*!p$u2b~J$t77&} ztIYCp%ir(UiCur@_6)X(J*O_J>hF1U%0A_FfiH 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

{XNhWAYG&mNkkWKeur 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 + + + MacGap + + + + + + + +

MacGap

+ + \ No newline at end of file diff --git a/ui/main.jsx b/ui/main.jsx index 01c300e99..aa4c8bf1c 100644 --- a/ui/main.jsx +++ b/ui/main.jsx @@ -1,4 +1,51 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * 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 3 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 . + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +function getUrlParameter(parameter) +{ + var currLocation = window.location.search; + if (currLocation.indexOf('?') < 0) + return ''; + var parArr = currLocation.split("?")[1].split("&"); + for(var i = 0; i < parArr.length; i++){ + parr = parArr[i].split("="); + if (parr[0] == parameter) { + return decodeURIComponent(parr[1]); + } + } + return ''; +} + +var ztAuthToken = getUrlParameter('authToken'); +if ((!ztAuthToken)||(ztAuthToken.length <= 0)) { + ztAuthToken = prompt('No authToken specified in URL. Enter token from\nauthtoken.secret to authorize.'); +} + React.render( - , + , document.getElementById('main') ); From d56e9fce415e5b764091921dd5cedde175fbcf7d Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 20:45:02 -0700 Subject: [PATCH 2/3] Get user data out of repo. --- .gitignore | 1 + .../MacGap.xcodeproj/project.pbxproj | 6 + .../xcshareddata/MacGap.xccheckout | 18 +- .../UserInterfaceState.xcuserstate | Bin 18268 -> 19568 bytes .../xcdebugger/Breakpoints.xcbkptlist | 131 -------------- .../xcschemes/MacGap.xcscheme | 86 ---------- .../xcschemes/xcschememanagement.plist | 22 --- .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 - .../xcdebugger/Breakpoints.xcbkptlist | 161 ------------------ .../xcschemes/MacGap.xcscheme | 84 --------- .../xcschemes/xcschememanagement.plist | 22 --- .../AppIcon.appiconset/Contents.json | 63 +++++++ .../AppIcon.appiconset/application128x128.png | Bin 0 -> 11247 bytes .../AppIcon.appiconset/application16x16.png | Bin 0 -> 715 bytes .../AppIcon.appiconset/application256x256.png | Bin 0 -> 29043 bytes .../AppIcon.appiconset/application32x32.png | Bin 0 -> 1787 bytes .../AppIcon.appiconset/application512x512.png | Bin 0 -> 57374 bytes .../MacGap/MacGap-Info.plist | 2 - ext/mac-ui-macgap1-wrapper/README.md | 38 +---- 19 files changed, 83 insertions(+), 556 deletions(-) delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application128x128.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application16x16.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application256x256.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application32x32.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application512x512.png diff --git a/.gitignore b/.gitignore index db660e147..f789b3b78 100755 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ /root-topology/*.secret /root-topology/test/supernodes /root-topology/test/test-root-topology +xcuserdata diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj index ea339cf0a..9d71ceccd 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0645F14BDE10A00E4BCE2 /* Window.m */; }; 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88C0646414BDEC5800E4BCE2 /* Window.xib */; }; 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0646C14BDF6A600E4BCE2 /* WindowController.m */; }; + C13A649D1AFB171100CB31FE /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C13A649C1AFB171100CB31FE /* Images.xcassets */; }; C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1C2B9901AFB0CF10060D7C2 /* Security.framework */; }; F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B80015179E0FC100B069A8 /* Clipboard.m */; }; FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA32509C14BA813600BF0781 /* WebKit.framework */; }; @@ -74,6 +75,7 @@ 88C0646514BDEC5800E4BCE2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Window.xib; sourceTree = ""; }; 88C0646B14BDF6A600E4BCE2 /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowController.h; sourceTree = ""; }; 88C0646C14BDF6A600E4BCE2 /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowController.m; sourceTree = ""; }; + C13A649C1AFB171100CB31FE /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; C1C2B9901AFB0CF10060D7C2 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; F2B80014179E0FC100B069A8 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = ""; }; F2B80015179E0FC100B069A8 /* Clipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clipboard.m; sourceTree = ""; }; @@ -227,6 +229,7 @@ FAE451D114BA79C600190544 /* AppDelegate.m */, FAE451D314BA79C600190544 /* MainMenu.xib */, 88C0646414BDEC5800E4BCE2 /* Window.xib */, + C13A649C1AFB171100CB31FE /* Images.xcassets */, FAE451C514BA79C600190544 /* Supporting Files */, ); path = MacGap; @@ -299,6 +302,7 @@ files = ( FA3250E514BA883A00BF0781 /* public in Resources */, FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */, + C13A649D1AFB171100CB31FE /* Images.xcassets in Resources */, FAE451CF14BA79C600190544 /* Credits.rtf in Resources */, FAE451D514BA79C600190544 /* MainMenu.xib in Resources */, FA3250E714BA8BCE00BF0781 /* application.icns in Resources */, @@ -426,6 +430,7 @@ FAE451D914BA79C600190544 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_CXX_LIBRARY = "compiler-default"; COMBINE_HIDPI_IMAGES = YES; @@ -447,6 +452,7 @@ FAE451DA14BA79C600190544 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_CXX_LIBRARY = "compiler-default"; COMBINE_HIDPI_IMAGES = YES; diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout index b2ea215df..2a06dbc55 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout @@ -10,31 +10,31 @@ MacGap IDESourceControlProjectOriginsDictionary - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED - https://github.com/MacGapProject/MacGap1.git + ABA3617E9F0148F844A82502F0D808DE6591AA97 + http://adam.ierymenko@git.int.zerotier.com/zerotier/zerotierone IDESourceControlProjectPath - MacGap.xcodeproj + ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj IDESourceControlProjectRelativeInstallPathDictionary - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED - ../.. + ABA3617E9F0148F844A82502F0D808DE6591AA97 + ../../../.. IDESourceControlProjectURL - https://github.com/MacGapProject/MacGap1.git + http://adam.ierymenko@git.int.zerotier.com/zerotier/zerotierone IDESourceControlProjectVersion 111 IDESourceControlProjectWCCIdentifier - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ABA3617E9F0148F844A82502F0D808DE6591AA97 IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ABA3617E9F0148F844A82502F0D808DE6591AA97 IDESourceControlWCCName - MacGap1 + ZeroTierOne diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate index 04ade238606e9d7a8d4efba88066f44ffaac7322..6dfcf6d063cad694d23a1f13b2cf3f49bbd662ca 100644 GIT binary patch delta 11184 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 LwmJw6Bke-~BmG_R delta 10315 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 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist deleted file mode 100644 index 38f661269..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme deleted file mode 100644 index 0aaad5827..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 921f1a6fe..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - MacGap.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - FAE451B914BA79C600190544 - - primary - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b45415..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist deleted file mode 100644 index 8e541eaba..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme deleted file mode 100644 index 872d6d7d5..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 921f1a6fe..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - MacGap.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - FAE451B914BA79C600190544 - - primary - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..2592eae9a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "application16x16.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "application32x32.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "application128x128.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "application256x256.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "application512x512.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application128x128.png b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..93dd80a1e3b10f09d5f640d062e0790217f231da GIT binary patch literal 11247 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 literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application256x256.png b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..c30106b7df58bb6f81f42b33a5b4e042dff4a7c4 GIT binary patch literal 29043 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%0ApA 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

E9nc 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 II;Vst0CZ};rT_o{ literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application32x32.png b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..05ff6cb8d4df79180123b584c256de8fe3ada6a7 GIT binary patch literal 1787 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 C{JWa~ literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist index 2031cefcc..3730da8f3 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist @@ -6,8 +6,6 @@ en CFBundleExecutable ZeroTier One - CFBundleIconFile - application.icns CFBundleIdentifier com.zerotier.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion diff --git a/ext/mac-ui-macgap1-wrapper/README.md b/ext/mac-ui-macgap1-wrapper/README.md index bc69b1326..daf3eae9c 100644 --- a/ext/mac-ui-macgap1-wrapper/README.md +++ b/ext/mac-ui-macgap1-wrapper/README.md @@ -1,36 +1,6 @@ -#MacGap +Mac Web UI Wrapper +====== -The MacGap project provides HTML/JS/CSS developers an Xcode project for developing Native OSX Apps that run in OSX's WebView and take advantage of WebKit technologies. +This is a modified version of MacGap1 which launches a WebKit view and accesses the local ZeroTier service at its web URL. It builds the URL from the authtoken.secret file in the system home (or the user home) and the zerotier-one.port file that ZeroTier creates to advertise its control port. -The project exposes a JavaScript API for OS X integration, such as displaying native OS X 10.9 notifications. The MacGap project is extremely lightweight and nimble; a blank application is about 980KB. - -### Features: -* tiny compiled app sizes -* Mac App Store compatible -* access to many Mac OS X-specific features - -##Pre-requisites - -MacGap works on OSX 10.6 and later. - -Generate apps with the [macgap generator](http://github.com/maccman/macgap-rb), no compile necessary. - - gem install macgap - - macgap new myapp - macgap build myapp - -##API - -MacGap exposes an object called `macgap` inside JavaScript. You can use it to alter the Dock icon and display Growl notifications, amongst other things. The API is documented in the WIKI on GitHub: https://github.com/maccman/macgap/wiki - - -##Attributes - -MacGap was forked/ported from Phonegap-mac. It's under the same license (MIT). - -##Custom Build - -To build, make sure you have installed the latest Mac OSX Core Library. Download at [http://developer.apple.com/](http://developer.apple.com/). - -Just clone the repository and build in Xcode. The file `public/index.html` is loaded on startup. +It's based on the original MacGap1 source by Twitter, Inc. which is licensed under the MIT license. From 4426899e8c9469518325f39f173151b3535ac20e Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 21:02:59 -0700 Subject: [PATCH 3/3] Add support for local user account caching of authtoken.secret as in old UI -- this is now pretty much working. --- .gitignore | 2 +- .../UserInterfaceState.xcuserstate | Bin 19568 -> 0 bytes .../api.xcuserdatad/xcschemes/MacGap.xcscheme | 88 ---------- .../xcschemes/xcschememanagement.plist | 22 --- .../MacGap/AppDelegate.m | 157 +++++++++++------- 5 files changed, 97 insertions(+), 172 deletions(-) delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore index f789b3b78..4a24c4db6 100755 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,4 @@ /root-topology/*.secret /root-topology/test/supernodes /root-topology/test/test-root-topology -xcuserdata +/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/* diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 6dfcf6d063cad694d23a1f13b2cf3f49bbd662ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19568 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 i6?PF=S={ diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme deleted file mode 100644 index 2555dc89c..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 921f1a6fe..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - MacGap.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - FAE451B914BA79C600190544 - - primary - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m index 96a3e8201..3e25ca13f 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m @@ -7,6 +7,8 @@ // #import "AppDelegate.h" +#include +#include @implementation AppDelegate @@ -29,75 +31,108 @@ } - (void) applicationDidFinishLaunching:(NSNotification *)aNotification { - // Create authorization reference - OSStatus status; - AuthorizationRef authorizationRef; - - // AuthorizationCreate and pass NULL as the initial - // AuthorizationRights set so that the AuthorizationRef gets created - // successfully, and then later call AuthorizationCopyRights to - // determine or extend the allowable rights. - // http://developer.apple.com/qa/qa2001/qa1172.html - status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); - if (status != errAuthorizationSuccess) - { - NSLog(@"Error Creating Initial Authorization: %d", status); - return; - } - - // kAuthorizationRightExecute == "system.privilege.admin" - AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; - AuthorizationRights rights = {1, &right}; - AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | - kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; - - // Call AuthorizationCopyRights to determine or extend the allowable rights. - status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); - if (status != errAuthorizationSuccess) - { - NSLog(@"Copy Rights Unsuccessful: %d", status); - return; - } - - // use rm tool with -rf - char *tool = "/bin/cat"; - char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; - FILE *pipe = NULL; - - status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); - if (status != errAuthorizationSuccess) - { - NSLog(@"Error: %d", status); - } - - char url[16384]; - memset(url,0,sizeof(url)); - if (pipe) { - char buf[16384]; + char buf[16384],userAuthTokenPath[4096]; - FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + long port = 9993; // default + if (pf) { long n = fread(buf,1,sizeof(buf)-1,pf); - long port = 9993; // default if (n > 0) { buf[n] = (char)0; port = strtol(buf,(char **)0,10); } fclose(pf); - - n = (long)fread(buf,1,sizeof(buf)-1,pipe); - if (n > 0) { - buf[n] = (char)0; - snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); - } - fclose(pipe); } - - // The only way to guarantee that a credential acquired when you - // request a right is not shared with other authorization instances is - // to destroy the credential. To do so, call the AuthorizationFree - // function with the flag kAuthorizationFlagDestroyRights. - // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html - status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + + char url[16384]; + memset(url,0,sizeof(url)); + + const char *homeDir = getenv("HOME"); + if (homeDir) { + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier/One/authtoken.secret",homeDir); + pf = fopen(userAuthTokenPath,"r"); + if (pf) { + long n = fread(buf,1,sizeof(buf)-1,pf); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + } + fclose(pf); + } + } + + if (!url[0]) { + // Create authorization reference + OSStatus status; + AuthorizationRef authorizationRef; + + // AuthorizationCreate and pass NULL as the initial + // AuthorizationRights set so that the AuthorizationRef gets created + // successfully, and then later call AuthorizationCopyRights to + // determine or extend the allowable rights. + // http://developer.apple.com/qa/qa2001/qa1172.html + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error Creating Initial Authorization: %d", status); + return; + } + + // kAuthorizationRightExecute == "system.privilege.admin" + AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights rights = {1, &right}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; + + // Call AuthorizationCopyRights to determine or extend the allowable rights. + status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) + { + NSLog(@"Copy Rights Unsuccessful: %d", status); + return; + } + + // use rm tool with -rf + char *tool = "/bin/cat"; + char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; + FILE *pipe = NULL; + + status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error: %d", status); + } + + if (pipe) { + long n = (long)fread(buf,1,sizeof(buf)-1,pipe); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + + if (homeDir) { + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier",homeDir); + mkdir(userAuthTokenPath,0755); + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier/One",homeDir); + mkdir(userAuthTokenPath,0755); + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier/One/authtoken.secret",homeDir); + pf = fopen(userAuthTokenPath,"w"); + if (pf) { + fwrite(buf,1,strlen(buf),pf); + fclose(pf); + chmod(userAuthTokenPath,0600); + } + } + } + fclose(pipe); + } + + // The only way to guarantee that a credential acquired when you + // request a right is not shared with other authorization instances is + // to destroy the credential. To do so, call the AuthorizationFree + // function with the flag kAuthorizationFlagDestroyRights. + // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html + status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + } NSString *urlStr = [[NSString alloc] initWithCString:url]; self.windowController = [[WindowController alloc] initWithURL: urlStr];