diff options
author | garykac@chromium.org <garykac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-09 20:01:16 +0000 |
---|---|---|
committer | garykac@chromium.org <garykac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-09 20:01:16 +0000 |
commit | 9aa4254430a5d4e713a0a866972a1d71ae088188 (patch) | |
tree | 1ad22e867953bb87888250f639555f19a1ad74c6 /remoting | |
parent | 5276c66be140d1f63f2ca94f72c697aba156a33d (diff) | |
download | chromium_src-9aa4254430a5d4e713a0a866972a1d71ae088188.zip chromium_src-9aa4254430a5d4e713a0a866972a1d71ae088188.tar.gz chromium_src-9aa4254430a5d4e713a0a866972a1d71ae088188.tar.bz2 |
Initial version of the Chromoting installer for Mac.
This must be built manually (run build.sh) and isn't integrated into the gyp
build system yet.
It also requires that you have Iceberg installed on your local machine.
Review URL: https://chromiumcodereview.appspot.com/9958083
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@131416 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting')
18 files changed, 2882 insertions, 0 deletions
diff --git a/remoting/host/installer/mac/Chrome Remote Desktop.packproj b/remoting/host/installer/mac/Chrome Remote Desktop.packproj new file mode 100644 index 0000000..ff0dc91 --- /dev/null +++ b/remoting/host/installer/mac/Chrome Remote Desktop.packproj @@ -0,0 +1,778 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Hierarchy</key> + <dict> + <key>Attributes</key> + <dict> + <key>Components</key> + <array> + <dict> + <key>Attributes</key> + <dict> + <key>Documents</key> + <dict> + <key>Background Image</key> + <dict> + <key>IFPkgFlagBackgroundAlignment</key> + <integer>4</integer> + <key>IFPkgFlagBackgroundScaling</key> + <integer>1</integer> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + <key>License</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>ReadMe</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>Welcome</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + </dict> + <key>Files</key> + <dict> + <key>Hierarchy</key> + <dict/> + <key>IFPkgFlagDefaultLocation</key> + <string>/</string> + <key>Imported Options</key> + <dict> + <key>IFPkgFlagInstalledSize</key> + <integer>4</integer> + </dict> + <key>Imported Package</key> + <true/> + <key>Package Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg</string> + <key>Package Path Type</key> + <integer>2</integer> + </dict> + <key>Plugins</key> + <dict> + <key>PluginsList</key> + <array> + <dict> + <key>Path</key> + <string>Introduction</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>ReadMe</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>License</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Target</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>PackageSelection</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Install</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>FinishUp</string> + <key>Type</key> + <integer>0</integer> + </dict> + </array> + </dict> + <key>Scripts</key> + <dict> + <key>Additional Resources</key> + <dict> + <key>English</key> + <array> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/English.lproj/InstallationCheck.strings</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + </array> + <key>International</key> + <array> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/IFRequirement.strings</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/install.py</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/InstallationCheck</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/Keystone.tbz</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + </array> + </dict> + <key>Installation Scripts</key> + <dict> + <key>IFInstallationScriptsPostflight</key> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/postflight</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <key>IFInstallationScriptsPostinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPostupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreflight</key> + <dict> + <key>Path</key> + <string>Keystone/GoogleSoftwareUpdate.pkg/Contents/Resources/preflight</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <key>IFInstallationScriptsPreinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + </dict> + <key>Requirements</key> + <array/> + </dict> + <key>Settings</key> + <dict> + <key>Description</key> + <dict> + <key>International</key> + <dict> + <key>IFPkgDescriptionDeleteWarning</key> + <string></string> + <key>IFPkgDescriptionDescription</key> + <string></string> + <key>IFPkgDescriptionTitle</key> + <string>Google Software Update</string> + <key>IFPkgDescriptionVersion</key> + <string>Google Software Update 1.0.9.2865, © 2005-2010 Google Inc.</string> + </dict> + </dict> + <key>Display Information</key> + <dict> + <key>CFBundleGetInfoString</key> + <string>Google Software Update 1.0.9.2865, © 2005-2010 Google Inc.</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIconFile Path Type</key> + <integer>1</integer> + <key>CFBundleIdentifier</key> + <string>com.google.pkg.Keystone</string> + <key>CFBundleName</key> + <string>GoogleSoftwareUpdate</string> + <key>CFBundleShortVersionString</key> + <string>1.0.9</string> + </dict> + <key>Options</key> + <dict> + <key>IFPkgFlagAllowBackRev</key> + <true/> + <key>IFPkgFlagAuthorizationAction</key> + <integer>2</integer> + <key>IFPkgFlagFollowLinks</key> + <false/> + <key>IFPkgFlagIsRequired</key> + <false/> + <key>IFPkgFlagOverwritePermissions</key> + <false/> + <key>IFPkgFlagRelocatable</key> + <false/> + <key>IFPkgFlagRestartAction</key> + <integer>0</integer> + <key>IFPkgFlagRootVolumeOnly</key> + <true/> + <key>IFPkgFlagUpdateInstalledLanguages</key> + <false/> + </dict> + <key>Version</key> + <dict> + <key>IFMajorVersion</key> + <integer>1</integer> + <key>IFMinorVersion</key> + <integer>0</integer> + </dict> + </dict> + </dict> + <key>IFPkgFlagPackageSelection</key> + <integer>1</integer> + <key>Name</key> + <string>GoogleSoftwareUpdate</string> + <key>Status</key> + <integer>1</integer> + <key>Type</key> + <integer>1</integer> + </dict> + <dict> + <key>Attributes</key> + <dict> + <key>Documents</key> + <dict> + <key>Background Image</key> + <dict> + <key>IFPkgFlagBackgroundAlignment</key> + <integer>4</integer> + <key>IFPkgFlagBackgroundScaling</key> + <integer>1</integer> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + <key>License</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>ReadMe</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>Welcome</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + </dict> + <key>Files</key> + <dict> + <key>Hierarchy</key> + <dict/> + <key>IFPkgFlagDefaultLocation</key> + <string>/</string> + <key>Imported Options</key> + <dict> + <key>IFPkgFlagInstalledSize</key> + <integer>19572</integer> + </dict> + <key>Imported Package</key> + <true/> + <key>Package Path</key> + <string>build/Chromoting.pkg</string> + <key>Package Path Type</key> + <integer>2</integer> + </dict> + <key>Plugins</key> + <dict> + <key>PluginsList</key> + <array> + <dict> + <key>Path</key> + <string>Introduction</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>ReadMe</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>License</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Target</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>PackageSelection</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Install</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>FinishUp</string> + <key>Type</key> + <integer>0</integer> + </dict> + </array> + </dict> + <key>Scripts</key> + <dict> + <key>Additional Resources</key> + <dict> + <key>International</key> + <array/> + </dict> + <key>Installation Scripts</key> + <dict> + <key>IFInstallationScriptsPostflight</key> + <dict> + <key>Path</key> + <string>build/Chromoting.pkg/Contents/Resources/postflight</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <key>IFInstallationScriptsPostinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPostupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreflight</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + </dict> + <key>Requirements</key> + <array/> + </dict> + <key>Settings</key> + <dict> + <key>Description</key> + <dict> + <key>International</key> + <dict> + <key>IFPkgDescriptionDeleteWarning</key> + <string></string> + <key>IFPkgDescriptionDescription</key> + <string></string> + <key>IFPkgDescriptionTitle</key> + <string>Chromoting</string> + <key>IFPkgDescriptionVersion</key> + <string>0.2</string> + </dict> + </dict> + <key>Display Information</key> + <dict> + <key>CFBundleGetInfoString</key> + <string>Chromoting 0.2 Copyright © 2012 The Chromium Authors.</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIconFile Path Type</key> + <integer>1</integer> + <key>CFBundleIdentifier</key> + <string>org.chromium.pkg.Chromoting</string> + <key>CFBundleName</key> + <string>Chromoting</string> + <key>CFBundleShortVersionString</key> + <string>0.2</string> + </dict> + <key>Options</key> + <dict> + <key>IFPkgFlagAllowBackRev</key> + <false/> + <key>IFPkgFlagAuthorizationAction</key> + <integer>1</integer> + <key>IFPkgFlagFollowLinks</key> + <false/> + <key>IFPkgFlagIsRequired</key> + <false/> + <key>IFPkgFlagOverwritePermissions</key> + <false/> + <key>IFPkgFlagRelocatable</key> + <false/> + <key>IFPkgFlagRestartAction</key> + <integer>0</integer> + <key>IFPkgFlagRootVolumeOnly</key> + <true/> + <key>IFPkgFlagUpdateInstalledLanguages</key> + <false/> + </dict> + <key>Version</key> + <dict> + <key>IFMajorVersion</key> + <integer>0</integer> + <key>IFMinorVersion</key> + <integer>2</integer> + </dict> + </dict> + </dict> + <key>IFPkgFlagPackageSelection</key> + <integer>1</integer> + <key>Name</key> + <string>Chromoting</string> + <key>Status</key> + <integer>1</integer> + <key>Type</key> + <integer>1</integer> + </dict> + </array> + <key>Documents</key> + <dict> + <key>Background Image</key> + <dict> + <key>IFPkgFlagBackgroundAlignment</key> + <integer>4</integer> + <key>IFPkgFlagBackgroundScaling</key> + <integer>1</integer> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + <key>License</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>ReadMe</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>Welcome</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + </dict> + <key>Plugins</key> + <dict> + <key>PluginsList</key> + <array> + <dict> + <key>Path</key> + <string>Introduction</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>ReadMe</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>License</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Target</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>PackageSelection</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Install</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>FinishUp</string> + <key>Type</key> + <integer>0</integer> + </dict> + </array> + </dict> + <key>Scripts</key> + <dict> + <key>Additional Resources</key> + <dict> + <key>International</key> + <array/> + </dict> + <key>Installation Scripts</key> + <dict> + <key>IFInstallationScriptsPostflight</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPostinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPostupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreflight</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + </dict> + <key>Requirements</key> + <array/> + </dict> + <key>Settings</key> + <dict> + <key>Description</key> + <dict> + <key>International</key> + <dict> + <key>IFPkgDescriptionDeleteWarning</key> + <string></string> + <key>IFPkgDescriptionDescription</key> + <string></string> + <key>IFPkgDescriptionTitle</key> + <string>Chrome Remote Desktop</string> + <key>IFPkgDescriptionVersion</key> + <string>1.4.4</string> + </dict> + </dict> + <key>Display Information</key> + <dict> + <key>CFBundleGetInfoString</key> + <string>Chrome Remote Desktop 1.4.4</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIconFile Path Type</key> + <integer>1</integer> + <key>CFBundleIdentifier</key> + <string>com.google.pkg.Chrome Remote Desktop</string> + <key>CFBundleName</key> + <string>Chrome Remote Desktop</string> + <key>CFBundleShortVersionString</key> + <string>1.4.4</string> + </dict> + <key>Version</key> + <dict> + <key>IFMajorVersion</key> + <integer>1</integer> + <key>IFMinorVersion</key> + <integer>4</integer> + </dict> + </dict> + </dict> + <key>IFPkgFlagComponentDirectory</key> + <string>.</string> + <key>IFPkgFlagPackageSelection</key> + <integer>0</integer> + <key>Name</key> + <string>Chrome Remote Desktop</string> + <key>Status</key> + <integer>1</integer> + <key>Type</key> + <integer>0</integer> + </dict> + <key>Name</key> + <string>Project</string> + <key>Settings</key> + <dict> + <key>10.1 Compatibility</key> + <true/> + <key>Build Path</key> + <string>build</string> + <key>Build Path Type</key> + <integer>2</integer> + <key>Comment</key> + <string></string> + <key>Remove .DS_Store</key> + <true/> + <key>Remove .pbdevelopment</key> + <true/> + </dict> +</dict> +</plist> diff --git a/remoting/host/installer/mac/Chromoting.packproj b/remoting/host/installer/mac/Chromoting.packproj new file mode 100644 index 0000000..d35ce06 --- /dev/null +++ b/remoting/host/installer/mac/Chromoting.packproj @@ -0,0 +1,676 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Hierarchy</key> + <dict> + <key>Attributes</key> + <dict> + <key>Documents</key> + <dict> + <key>Background Image</key> + <dict> + <key>IFPkgFlagBackgroundAlignment</key> + <integer>4</integer> + <key>IFPkgFlagBackgroundScaling</key> + <integer>1</integer> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + <key>License</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>ReadMe</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + <key>Welcome</key> + <dict> + <key>International</key> + <dict> + <key>Mode</key> + <integer>0</integer> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>1</integer> + </dict> + </dict> + </dict> + <key>Files</key> + <dict> + <key>Compress</key> + <true/> + <key>Hierarchy</key> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Utilities</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Applications</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Application Support</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Documentation</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Filesystems</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Frameworks</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Internet Plug-Ins</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>0</integer> + <key>Path</key> + <string>LaunchAgents/org.chromium.chromoting.plist</string> + <key>Path Type</key> + <integer>2</integer> + <key>Privileges</key> + <integer>420</integer> + <key>Type</key> + <integer>3</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>LaunchAgents</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>2</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>PreferencePanes</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Preferences</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Printers</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>PrivilegedHelperTools/org.chromium.chromoting.json</string> + <key>Path Type</key> + <integer>2</integer> + <key>Privileges</key> + <integer>420</integer> + <key>Type</key> + <integer>3</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>PrivilegedHelperTools/org.chromium.chromoting.me2me.sh</string> + <key>Path Type</key> + <integer>2</integer> + <key>Privileges</key> + <integer>493</integer> + <key>Type</key> + <integer>3</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>PrivilegedHelperTools/org.chromium.chromoting.me2me_host</string> + <key>Path Type</key> + <integer>2</integer> + <key>Privileges</key> + <integer>493</integer> + <key>Type</key> + <integer>3</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>PrivilegedHelperTools</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>2</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>QuickTime</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Scripts</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>509</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>Library</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>1021</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array> + <dict> + <key>Children</key> + <array/> + <key>GID</key> + <integer>0</integer> + <key>Path</key> + <string>Extensions</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>493</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>0</integer> + <key>Path</key> + <string>Library</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>493</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>0</integer> + <key>Path</key> + <string>System</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>493</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + </array> + <key>GID</key> + <integer>80</integer> + <key>Path</key> + <string>/</string> + <key>Path Type</key> + <integer>1</integer> + <key>Privileges</key> + <integer>1021</integer> + <key>Type</key> + <integer>1</integer> + <key>UID</key> + <integer>0</integer> + </dict> + <key>IFPkgFlagDefaultLocation</key> + <string>/</string> + <key>Imported Package</key> + <false/> + <key>Package Path</key> + <string></string> + <key>Split Forks</key> + <true/> + </dict> + <key>Plugins</key> + <dict> + <key>PluginsList</key> + <array> + <dict> + <key>Path</key> + <string>Introduction</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>ReadMe</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>License</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Target</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>PackageSelection</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>Install</string> + <key>Type</key> + <integer>0</integer> + </dict> + <dict> + <key>Path</key> + <string>FinishUp</string> + <key>Type</key> + <integer>0</integer> + </dict> + </array> + </dict> + <key>Scripts</key> + <dict> + <key>Additional Resources</key> + <dict> + <key>International</key> + <array/> + </dict> + <key>Installation Scripts</key> + <dict> + <key>IFInstallationScriptsPostflight</key> + <dict> + <key>Path</key> + <string>Scripts/remoting_postflight.sh</string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <true/> + </dict> + <key>IFInstallationScriptsPostinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPostupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreflight</key> + <dict> + <key>Path</key> + <string></string> + <key>Path Type</key> + <integer>2</integer> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreinstall</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + <key>IFInstallationScriptsPreupgrade</key> + <dict> + <key>Path</key> + <string></string> + <key>Status</key> + <false/> + </dict> + </dict> + <key>Requirements</key> + <array> + <dict> + <key>AlertDialog</key> + <dict> + <key>International</key> + <dict> + <key>MessageKey</key> + <string></string> + <key>TitleKey</key> + <string></string> + </dict> + </dict> + <key>LabelKey</key> + <string>OS >= 10.6</string> + <key>Level</key> + <integer>0</integer> + <key>SpecArgument</key> + <string>sysv</string> + <key>SpecTag</key> + <integer>2</integer> + <key>SpecType</key> + <string>gestalt</string> + <key>Status</key> + <true/> + <key>TestObject</key> + <string>4192</string> + <key>TestOperator</key> + <string>>=</string> + </dict> + </array> + </dict> + <key>Settings</key> + <dict> + <key>Description</key> + <dict> + <key>International</key> + <dict> + <key>IFPkgDescriptionDeleteWarning</key> + <string></string> + <key>IFPkgDescriptionDescription</key> + <string></string> + <key>IFPkgDescriptionTitle</key> + <string>Chromoting</string> + <key>IFPkgDescriptionVersion</key> + <string>0.2</string> + </dict> + </dict> + <key>Display Information</key> + <dict> + <key>CFBundleGetInfoString</key> + <string>Chromoting 0.2 Copyright © 2012 The Chromium Authors.</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIconFile Path Type</key> + <integer>1</integer> + <key>CFBundleIdentifier</key> + <string>org.chromium.pkg.Chromoting</string> + <key>CFBundleName</key> + <string>Chromoting</string> + <key>CFBundleShortVersionString</key> + <string>0.2</string> + </dict> + <key>Options</key> + <dict> + <key>IFPkgFlagAllowBackRev</key> + <false/> + <key>IFPkgFlagAuthorizationAction</key> + <integer>1</integer> + <key>IFPkgFlagFollowLinks</key> + <false/> + <key>IFPkgFlagIsRequired</key> + <false/> + <key>IFPkgFlagOverwritePermissions</key> + <false/> + <key>IFPkgFlagRelocatable</key> + <false/> + <key>IFPkgFlagRestartAction</key> + <integer>0</integer> + <key>IFPkgFlagRootVolumeOnly</key> + <true/> + <key>IFPkgFlagUpdateInstalledLanguages</key> + <false/> + </dict> + <key>Version</key> + <dict> + <key>IFMajorVersion</key> + <integer>0</integer> + <key>IFMinorVersion</key> + <integer>2</integer> + </dict> + </dict> + </dict> + <key>IFPkgFlagPackageSelection</key> + <integer>0</integer> + <key>Name</key> + <string>Chromoting</string> + <key>Status</key> + <integer>1</integer> + <key>Type</key> + <integer>1</integer> + </dict> + <key>Name</key> + <string>Project</string> + <key>Settings</key> + <dict> + <key>10.1 Compatibility</key> + <false/> + <key>Build Path</key> + <string>build</string> + <key>Build Path Type</key> + <integer>2</integer> + <key>Comment</key> + <string></string> + <key>Remove .DS_Store</key> + <true/> + <key>Remove .pbdevelopment</key> + <true/> + <key>Remove CVS</key> + <true/> + </dict> +</dict> +</plist> diff --git a/remoting/host/installer/mac/LaunchAgents/org.chromium.chromoting.plist b/remoting/host/installer/mac/LaunchAgents/org.chromium.chromoting.plist new file mode 100644 index 0000000..5e74439 --- /dev/null +++ b/remoting/host/installer/mac/LaunchAgents/org.chromium.chromoting.plist @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Label</key> + <string>org.chromium.chromoting</string> + <key>LimitLoadToSessionType</key> + <array> + <string>Aqua</string> + <string>LoginWindow</string> + </array> + <key>KeepAlive</key> + <dict> + <key>PathState</key> + <dict> + <key>/Library/PrivilegedHelperTools/org.chromium.chromoting.me2me_enabled</key> + <true/> + </dict> + </dict> + <key>Disabled</key> + <false/> + <key>ProgramArguments</key> + <array> + <string>/Library/PrivilegedHelperTools/org.chromium.chromoting.me2me.sh</string> + </array> +</dict> +</plist> diff --git a/remoting/host/installer/mac/PrivilegedHelperTools/org.chromium.chromoting.json b/remoting/host/installer/mac/PrivilegedHelperTools/org.chromium.chromoting.json new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/remoting/host/installer/mac/PrivilegedHelperTools/org.chromium.chromoting.json diff --git a/remoting/host/installer/mac/PrivilegedHelperTools/org.chromium.chromoting.me2me.sh b/remoting/host/installer/mac/PrivilegedHelperTools/org.chromium.chromoting.me2me.sh new file mode 100755 index 0000000..eb7029c --- /dev/null +++ b/remoting/host/installer/mac/PrivilegedHelperTools/org.chromium.chromoting.me2me.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +NAME=org.chromium.chromoting +CONFIG_DIR=/Library/PrivilegedHelperTools +HOST_EXE=$CONFIG_DIR/$NAME.me2me_host +ENABLED_FILE=$CONFIG_DIR/$NAME.me2me_enabled + +if [ "$1" = "--disable" ]; then + # This script is executed from base::mac::ExecuteWithPrivilegesAndWait(), + # which requires the child process to write its PID to stdout before + # anythine else. See base/mac/authorization_util.h for details. + echo $$ + rm -f "$ENABLED_FILE" +elif [ "$1" = "--enable" ]; then + echo $$ + touch "$ENABLED_FILE" +else + exec "$HOST_EXE" \ + --auth-config="$CONFIG_DIR/$NAME.json" \ + --host-config="$CONFIG_DIR/$NAME.json" +fi diff --git a/remoting/host/installer/mac/Scripts/keystone_install.sh b/remoting/host/installer/mac/Scripts/keystone_install.sh new file mode 100755 index 0000000..2ef3b4b --- /dev/null +++ b/remoting/host/installer/mac/Scripts/keystone_install.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +/usr/sbin/installer -pkg "$1/Chrome Remote Desktop.mpkg" -target / diff --git a/remoting/host/installer/mac/Scripts/remoting_postflight.sh b/remoting/host/installer/mac/Scripts/remoting_postflight.sh new file mode 100755 index 0000000..0b30ed2 --- /dev/null +++ b/remoting/host/installer/mac/Scripts/remoting_postflight.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +HELPERTOOLS=/Library/PrivilegedHelperTools +NAME=org.chromium.chromoting +AUTH_FILE="$HELPERTOOLS/$NAME.json" +PLIST=/Library/LaunchAgents/org.chromium.chromoting.plist + +KSADMIN=/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/MacOS/ksadmin +KSUPDATE=https://tools.google.com/service/update2 +KSPID=com.google.chrome_remote_desktop +KSPVERSION=0.5 + +trap onexit ERR + +function onexit { + # Log an error but don't report an install failure if this script has errors. + logger An error occurred while launching the service + exit 0 +} + +# Update owner and permissions for auth file. +chown $USER "$AUTH_FILE" +chmod 600 "$AUTH_FILE" + +# Load the service. +# The launchctl command we'd like to run: +# launchctl load -w -S Aqua $PLIST +# However, since we're installing as an admin, the launchctl command is run +# as if it had a sudo prefix, which means it tries to load the service in +# system rather than user space. +# To launch the service in user space, we need to get the current user (using +# ps and grepping for the loginwindow.app) and run the launchctl cmd as that +# user (using launchctl bsexec). +set `ps aux | grep loginwindow.app | grep -v grep` +# At this point, $1=username and $2=userid +if [[ -n $1 && -n $2 ]]; then + launchctl bsexec "$2" sudo -u "$1" launchctl load -w -S Aqua $PLIST +fi + +# Register a ticket with Keystone so we're updated. +$KSADMIN --register --productid $KSPID --version $KSPVERSION --xcpath $PLIST --url $KSUPDATE diff --git a/remoting/host/installer/mac/Scripts/uninstall.sh b/remoting/host/installer/mac/Scripts/uninstall.sh new file mode 100755 index 0000000..b2bf00e --- /dev/null +++ b/remoting/host/installer/mac/Scripts/uninstall.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# TODO(garykac): Replace this with a proper double-clickable uninstaller app. +NAME=org.chromium.chromoting +LAUNCHAGENTS=/Library/LaunchAgents +HELPERTOOLS=/Library/PrivilegedHelperTools +PLIST="$LAUNCHAGENTS/$NAME.plist" + +# Stop service if currently running. +# TODO(garykac): Trap errors and replace sleep with a check for when the +# service is stopped. +launchctl stop $NAME +launchctl unload -w -S Aqua $PLIST +sleep 1 + +# Cleanup files from old versions of installer. +sudo rm -f "$LAUNCHAGENTS/com.google.chrome_remote_desktop.plist" +sudo rm -f "$HELPERTOOLS/remoting_me2me_host" +sudo rm -f "$HELPERTOOLS/me2me.sh" +sudo rm -f "$HELPERTOOLS/com.google.chrome_remote_desktop.me2me_host" +sudo rm -f "$HELPERTOOLS/com.google.chrome_remote_desktop.me2me.sh" +sudo rm -f ~/.ChromotingConfig.json +sudo rm -f "$HELPERTOOLS/auth.json" +sudo rm -f "$HELPERTOOLS/host.json" +sudo rm -f "$HELPERTOOLS/me2me_enabled" +sudo rm -f "$HELPERTOOLS/com.google.chrome_remote_desktop.me2me_enabled" +sudo rm -rf /ChromotingSetup + +# Cleanup installed files. +sudo rm -f $PLIST +sudo rm -f "$HELPERTOOLS/$NAME.me2me_host" +sudo rm -f "$HELPERTOOLS/$NAME.me2me.sh" +sudo rm -f "$HELPERTOOLS/$NAME.json" +sudo rm -f "$HELPERTOOLS/$NAME.me2me_enabled" + +# Unregister our ticket from Keystone. +KSADMIN=/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/MacOS/ksadmin +KSPID=com.google.chrome_remote_desktop +$KSADMIN --delete --productid $KSPID diff --git a/remoting/host/installer/mac/build.sh b/remoting/host/installer/mac/build.sh new file mode 100755 index 0000000..7754891 --- /dev/null +++ b/remoting/host/installer/mac/build.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This script builds the Chrome Remote Desktop installer and packages +# it into a .dmg. It requires that Iceberg be installed (for 'freeze'). + +# The Chrome Remote Desktop installer consists of 2 components: +# * Chromoting installer package +# * Keystone (Google auto-update) + +PKG_DIR=build +PKGPROJ_CHROMOTING='Chromoting.packproj' +PKGPROJ_CHROME_REMOTE_DESKTOP='Chrome Remote Desktop.packproj' +PKG_CHROMOTING='Chromoting.pkg' +PKG_CRD='Chrome Remote Desktop.mpkg' + +DMG_TEMP=dmg_tmp +DMG_NAME='Chrome Remote Desktop' +DMG_DIR="$DMG_TEMP/$DMG_NAME" +DMG_FILENAME='Chrome Remote Desktop.dmg' + +# Clean out previous build. +rm -rf "$PKG_DIR" +rm -f "$DMG_FILENAME" +rm -rf "$DMG_TEMP" # In case previous build failed. + +# Copy latest release build. +# TODO(garykac): Get from proper location. +HOST_BINARY=PrivilegedHelperTools/org.chromium.chromoting.me2me_host +cp ../../../../out/Release/remoting_me2me_host ./$HOST_BINARY + +# Build the .pkg. +echo "Building .pkg..." +freeze "$PKGPROJ_CHROMOTING" +freeze "$PKGPROJ_CHROME_REMOTE_DESKTOP" + +# Create the .dmg. +echo "Building .dmg..." +mkdir -p "$DMG_DIR/$PKG_CRD" +# Copy .mpkg installer. +ditto "$PKG_DIR/$PKG_CRD" "$DMG_DIR/$PKG_CRD" +# Copy uninstall script. +# TODO(garykac): This should be made into a proper App and installed in the +# Applications directory. +cp Scripts/uninstall.sh "$DMG_DIR" +# Copy .keystone_install script to top level of .dmg. +# Keystone calls this script during upgrades. +cp Scripts/keystone_install.sh "$DMG_DIR/.keystone_install" +# Build the .dmg from the directory. +hdiutil create "$DMG_FILENAME" -srcfolder "$DMG_DIR" -ov -quiet +rm -rf "$DMG_TEMP" diff --git a/remoting/host/installer/mac/tools/ksregister.sh b/remoting/host/installer/mac/tools/ksregister.sh new file mode 100755 index 0000000..92f29a8 --- /dev/null +++ b/remoting/host/installer/mac/tools/ksregister.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +NAME=org.chromium.chromoting +PLIST=/Library/LaunchAgents/$NAME.plist + +KSADMIN=/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/MacOS/ksadmin +KSUPDATE=https://tools.google.com/service/update2 +KSPID=com.google.chrome_remote_desktop +KSPVERSION=0.5 + +# Register a ticket with Keystone so we're updated. +$KSADMIN --register --productid $KSPID --version $KSPVERSION --xcpath $PLIST --url $KSUPDATE diff --git a/remoting/host/installer/mac/tools/ksunregister.sh b/remoting/host/installer/mac/tools/ksunregister.sh new file mode 100755 index 0000000..3d1735d --- /dev/null +++ b/remoting/host/installer/mac/tools/ksunregister.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +KSADMIN=/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/MacOS/ksadmin +KSPID=com.google.chrome_remote_desktop + +# Unregister our ticket from Keystone. +$KSADMIN --delete --productid $KSPID diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/CRDAppDelegate.h b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/CRDAppDelegate.h new file mode 100644 index 0000000..74f69ce --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/CRDAppDelegate.h @@ -0,0 +1,20 @@ +// +// CRDAppDelegate.h +// Chrome Remote Desktop Uninstaller +// +// Created by Gary Kacmarcik on 4/3/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import <Cocoa/Cocoa.h> + +@interface CRDAppDelegate : NSObject <NSApplicationDelegate> + +@property (assign) IBOutlet NSWindow *window; + +- (IBAction)uninstall:(NSButton *)sender; +- (IBAction)cancel:(id)sender; + +- (IBAction)handleMenuClose:(NSMenuItem *)sender; + +@end diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/CRDAppDelegate.m b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/CRDAppDelegate.m new file mode 100644 index 0000000..f601fad --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/CRDAppDelegate.m @@ -0,0 +1,225 @@ +// +// CRDAppDelegate.m +// Chrome Remote Desktop Uninstaller +// +// Created by Gary Kacmarcik on 4/3/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import "CRDAppDelegate.h" + +@implementation CRDAppDelegate + +@synthesize window = _window; + +NSString * const kServiceName = @"org.chromium.chromoting"; +NSString * const kLaunchAgents = @"/Library/LaunchAgents"; +NSString * const kHelperTools = @"/Library/PrivilegedHelperTools"; + +// Keystone +NSString * const kKeystoneAdmin = @"/Library/Google/GoogleSoftwareUpdate/" + "GoogleSoftwareUpdate.bundle/Contents/MacOS/" + "ksadmin"; +NSString * const kKeystonePID = @"com.google.chrome_remote_desktop"; + + +- (void)dealloc { + [super dealloc]; +} + +- (void)applicationDidFinishLaunching: (NSNotification *)aNotification { +} + +- (void)logOutput: (FILE *) pipe { + char readBuffer[128]; + for (;;) { + long bytesRead = read(fileno(pipe), readBuffer, sizeof(readBuffer)-1); + if (bytesRead < 1) + break; + readBuffer[bytesRead] = '\0'; + NSLog(@"%s", readBuffer); + } +} + +- (void)messageBox: (char *)message { + CFStringRef message_ref = CFStringCreateWithCString(NULL, message, + (int)strlen(message)); + CFOptionFlags result; + CFUserNotificationDisplayAlert(0, kCFUserNotificationNoteAlertLevel, + NULL, NULL, NULL, + CFSTR("Chrome Remote Desktop Uninstaller"), + message_ref, NULL, NULL, NULL, &result); + CFRelease(message_ref); +} + +- (void)sudoDelete:(const char* const)filename + usingAuth:(AuthorizationRef)authRef { + OSStatus status; + + if ([[NSFileManager defaultManager] fileExistsAtPath:@"/bin/rm"]) { + NSLog(@"rm exists"); + } else { + NSLog(@"rm doesn't exist"); + } + if (![[NSFileManager defaultManager] + fileExistsAtPath:[NSString stringWithFormat:@"%s", filename]]) { + return; + } + + NSLog(@"Executing (as Admin) rm -f %s", filename); + char* tool = "/bin/rm"; + char* const args[] = {"-f", (char* const)filename, NULL}; + FILE* pipe = NULL; + status = AuthorizationExecuteWithPrivileges(authRef, tool, + kAuthorizationFlagDefaults, args, + &pipe); + + // The status 0x8115ffff is endian-swapped 0xffff1581 + // (=errAuthorizationToolExecuteFailure) + if (status == 0xffff1581 || status == 0x8115ffff) { + NSLog(@"Error errAuthorizationToolExecuteFailure"); + } else if (status != errAuthorizationSuccess) { + NSLog(@"Error while executing rm. Status=%x", status); + } else { + [self logOutput: pipe]; + } + + if ([[NSFileManager defaultManager] fileExistsAtPath:@"/bin/rm"]) { + NSLog(@"rm exists"); + } else { + NSLog(@"rm doesn't exist"); + } +} + +-(void)runCommand:(NSString*)cmd + withArguments:(NSArray*)args { + NSTask* task; + NSPipe* output = [NSPipe pipe]; + NSString* result; + + NSLog(@"Executing: %@ %@", cmd, [args componentsJoinedByString:@" "]); + + @try { + task = [[NSTask alloc] init]; + [task setLaunchPath: cmd]; + [task setArguments: args]; + [task setStandardInput: [NSPipe pipe]]; + [task setStandardOutput: output]; + [task launch]; + + NSData* data = [[output fileHandleForReading] readDataToEndOfFile]; + + [task waitUntilExit]; + + if ([task terminationStatus] != 0) { + NSLog(@"Command terminated status=%d reason=%ld", + [task terminationStatus], [task terminationReason]); + } + + result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + if ([result length] != 0) { + NSLog(@"%@", result); + } + } + @catch (NSException *exception) { + NSLog(@"Exception %@ %@", [exception name], [exception reason]); + } + + [task release]; + [result release]; +} + +-(void)shutdownService { + NSArray* argsStop = [NSArray arrayWithObjects: @"stop", + kServiceName, nil]; + [self runCommand: @"/bin/launchctl" withArguments: argsStop]; + + NSString* plist = [NSString stringWithFormat:@"%@/%@.plist", kLaunchAgents, + kServiceName]; + if ([[NSFileManager defaultManager] fileExistsAtPath:plist]) { + NSArray* argsUnload = [NSArray arrayWithObjects: @"unload", + @"-w", @"-S", @"Aqua", plist, nil]; + [self runCommand: @"/bin/launchctl" withArguments: argsUnload]; + } +} + +-(void)keystoneUnregister { + NSArray* args = [NSArray arrayWithObjects: @"--delete", + @"--productid", kKeystonePID, nil]; + [self runCommand: kKeystoneAdmin withArguments: args]; +} + +- (IBAction)uninstall: (NSButton *)sender { + AuthorizationRef authRef; + OSStatus status; + bool success = false; + + NSLog(@"Chrome Remote Desktop uninstall starting."); + + @try { + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, + kAuthorizationFlagDefaults, &authRef); + if (status != errAuthorizationSuccess) + NSLog(@"Error during AuthorizationCreate status=%d", status); + + AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights rights = {1, &right}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | + kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagPreAuthorize | + kAuthorizationFlagExtendRights; + status = AuthorizationCopyRights(authRef, &rights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) + NSLog(@"Error during AuthorizationCopyRights status=%d", status); + + NSString* host_enabled = [NSString stringWithFormat:@"%@/%@.me2me_enabled", + kHelperTools, kServiceName]; + [self sudoDelete: [host_enabled UTF8String] usingAuth: authRef]; + + [self shutdownService]; + + NSString* plist = [NSString stringWithFormat:@"%@/%@.plist", + kLaunchAgents, kServiceName]; + [self sudoDelete: [plist UTF8String] usingAuth: authRef]; + + NSString* host_binary = [NSString stringWithFormat:@"%@/%@.me2me_host", + kHelperTools, kServiceName]; + [self sudoDelete: [host_binary UTF8String] usingAuth: authRef]; + + NSString* host_script = [NSString stringWithFormat:@"%@/%@.me2me.sh", + kHelperTools, kServiceName]; + [self sudoDelete: [host_script UTF8String] usingAuth: authRef]; + + NSString* auth = [NSString stringWithFormat:@"%@/%@.json", + kHelperTools, kServiceName]; + [self sudoDelete: [auth UTF8String] usingAuth: authRef]; + + [self keystoneUnregister]; + + success = true; + } + @catch (NSException *exception) { + NSLog(@"Exception %@ %@", [exception name], [exception reason]); + } + + @finally { + status = AuthorizationFree(authRef, kAuthorizationFlagDestroyRights); + } + + NSLog(@"Chrome Remote Desktop uninstall complete."); + if (success) + [self messageBox:"Chrome Remote Desktop was successfully uninstalled."]; + + [NSApp terminate:self]; +} + +- (IBAction)cancel: (id)sender { + [NSApp terminate: self]; +} + +- (IBAction)handleMenuClose: (NSMenuItem *)sender { + [NSApp terminate: self]; +} + +@end diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/Chrome Remote Desktop Uninstaller-Info.plist b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/Chrome Remote Desktop Uninstaller-Info.plist new file mode 100644 index 0000000..4644404 --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/Chrome Remote Desktop Uninstaller-Info.plist @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.google.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSMinimumSystemVersion</key> + <string>${MACOSX_DEPLOYMENT_TARGET}</string> + <key>NSHumanReadableCopyright</key> + <string>Copyright © 2012 Google. All rights reserved.</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/Chrome Remote Desktop Uninstaller-Prefix.pch b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/Chrome Remote Desktop Uninstaller-Prefix.pch new file mode 100644 index 0000000..6199ebf --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/Chrome Remote Desktop Uninstaller-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'Chrome Remote Desktop Uninstaller' target in the 'Chrome Remote Desktop Uninstaller' project +// + +#ifdef __OBJC__ + #import <Cocoa/Cocoa.h> +#endif diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/en.lproj/InfoPlist.strings b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/en.lproj/MainMenu.xib b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/en.lproj/MainMenu.xib new file mode 100644 index 0000000..b6509f5 --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/en.lproj/MainMenu.xib @@ -0,0 +1,898 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> + <data> + <int key="IBDocument.SystemTarget">1060</int> + <string key="IBDocument.SystemVersion">10K549</string> + <string key="IBDocument.InterfaceBuilderVersion">1938</string> + <string key="IBDocument.AppKitVersion">1038.36</string> + <string key="IBDocument.HIToolboxVersion">461.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">1938</string> + </object> + <array key="IBDocument.IntegratedClassDependencies"> + <string>NSTextField</string> + <string>NSView</string> + <string>NSWindowTemplate</string> + <string>NSMenu</string> + <string>NSMenuItem</string> + <string>NSTextFieldCell</string> + <string>NSButtonCell</string> + <string>NSButton</string> + <string>NSCustomObject</string> + </array> + <array key="IBDocument.PluginDependencies"> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </array> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> + <object class="NSCustomObject" id="1021"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSCustomObject" id="1014"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1050"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSMenu" id="649796088"> + <string key="NSTitle">AMainMenu</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="694149608"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Chrome Remote Desktop Host Uninstaller</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSOnImage" id="35465992"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="502551668"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="110575045"> + <string key="NSTitle">Chrome Remote Desktop Host Uninstaller</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="238522557"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">About Chrome Remote Desktop Uninstaller</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="304266470"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="609285721"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Preferences…</string> + <string key="NSKeyEquiv">,</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="481834944"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1046388886"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Services</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="752062318"> + <string key="NSTitle">Services</string> + <array class="NSMutableArray" key="NSMenuItems"/> + <string key="NSName">_NSServicesMenu</string> + </object> + </object> + <object class="NSMenuItem" id="646227648"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="755159360"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Chrome Remote Desktop Uninstaller</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="342932134"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Others</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="908899353"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Show All</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1056857174"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="632727374"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Quit Chrome Remote Desktop Uninstaller</string> + <string key="NSKeyEquiv">q</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + <string key="NSName">_NSAppleMenu</string> + </object> + </object> + <object class="NSMenuItem" id="379814623"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">File</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="720053764"> + <string key="NSTitle">File</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="705341025"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">New</string> + <string key="NSKeyEquiv">n</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="722745758"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open…</string> + <string key="NSKeyEquiv">o</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="425164168"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="776162233"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Close</string> + <string key="NSKeyEquiv">w</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="952259628"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Edit</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="789758025"> + <string key="NSTitle">Edit</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="1058277027"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Undo</string> + <string key="NSKeyEquiv">z</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="790794224"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Redo</string> + <string key="NSKeyEquiv">Z</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1040322652"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="296257095"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Cut</string> + <string key="NSKeyEquiv">x</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="860595796"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Copy</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="29853731"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + </object> + </object> + <object class="NSMenuItem" id="448692316"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Help</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="992780483"> + <string key="NSTitle">Help</string> + <array class="NSMutableArray" key="NSMenuItems"> + <object class="NSMenuItem" id="105068016"> + <reference key="NSMenu" ref="992780483"/> + <string key="NSTitle">Chrome Remote Desktop Uninstaller Help</string> + <string key="NSKeyEquiv">?</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </array> + <string key="NSName">_NSHelpMenu</string> + </object> + </object> + </array> + <string key="NSName">_NSMainMenu</string> + </object> + <object class="NSWindowTemplate" id="972006081"> + <int key="NSWindowStyleMask">3</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{335, 863}, {459, 112}}</string> + <int key="NSWTFlags">1954022400</int> + <string key="NSWindowTitle">Chrome Remote Desktop Uninstaller</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <object class="NSView" key="NSWindowView" id="439893737"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTextField" id="723400866"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{23, 75}, {379, 17}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSNextKeyView" ref="765168480"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="414645780"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">This will completely remove Chrome Remote Desktop Host.</string> + <object class="NSFont" key="NSSupport" id="720184760"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1044</int> + </object> + <reference key="NSControlView" ref="723400866"/> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSButton" id="538240118"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{350, 12}, {95, 32}}</string> + <reference key="NSSuperview" ref="439893737"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="866114168"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Uninstall</string> + <reference key="NSSupport" ref="720184760"/> + <reference key="NSControlView" ref="538240118"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSButton" id="765168480"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{268, 12}, {82, 32}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSNextKeyView" ref="538240118"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="124666294"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Cancel</string> + <reference key="NSSupport" ref="720184760"/> + <reference key="NSControlView" ref="765168480"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string type="base64-UTF8" key="NSKeyEquivalent">Gw</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + </array> + <string key="NSFrameSize">{459, 112}</string> + <reference key="NSSuperview"/> + <reference key="NSNextKeyView" ref="723400866"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string> + <string key="NSMaxSize">{1e+13, 1e+13}</string> + </object> + <object class="NSCustomObject" id="976324537"> + <string key="NSClassName">CRDAppDelegate</string> + </object> + <object class="NSCustomObject" id="755631768"> + <string key="NSClassName">NSFontManager</string> + </object> + </array> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <array class="NSMutableArray" key="connectionRecords"> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">terminate:</string> + <reference key="source" ref="1050"/> + <reference key="destination" ref="632727374"/> + </object> + <int key="connectionID">449</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontStandardAboutPanel:</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="238522557"/> + </object> + <int key="connectionID">142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="976324537"/> + </object> + <int key="connectionID">495</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hide:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="755159360"/> + </object> + <int key="connectionID">367</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hideOtherApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="342932134"/> + </object> + <int key="connectionID">368</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unhideAllApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="908899353"/> + </object> + <int key="connectionID">370</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showHelp:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="105068016"/> + </object> + <int key="connectionID">493</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="972006081"/> + </object> + <int key="connectionID">532</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">uninstall:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="538240118"/> + </object> + <int key="connectionID">541</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">cancel:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="765168480"/> + </object> + <int key="connectionID">542</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">handleMenuClose:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="776162233"/> + </object> + <int key="connectionID">544</int> + </object> + </array> + <object class="IBMutableOrderedSet" key="objectRecords"> + <array key="orderedObjects"> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <array key="object" id="0"/> + <reference key="children" ref="1048"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1021"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1014"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1050"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">29</int> + <reference key="object" ref="649796088"/> + <array class="NSMutableArray" key="children"> + <reference ref="694149608"/> + <reference ref="952259628"/> + <reference ref="379814623"/> + <reference ref="448692316"/> + </array> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">56</int> + <reference key="object" ref="694149608"/> + <array class="NSMutableArray" key="children"> + <reference ref="110575045"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">217</int> + <reference key="object" ref="952259628"/> + <array class="NSMutableArray" key="children"> + <reference ref="789758025"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">83</int> + <reference key="object" ref="379814623"/> + <array class="NSMutableArray" key="children"> + <reference ref="720053764"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">81</int> + <reference key="object" ref="720053764"/> + <array class="NSMutableArray" key="children"> + <reference ref="722745758"/> + <reference ref="705341025"/> + <reference ref="776162233"/> + <reference ref="425164168"/> + </array> + <reference key="parent" ref="379814623"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">72</int> + <reference key="object" ref="722745758"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">82</int> + <reference key="object" ref="705341025"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">73</int> + <reference key="object" ref="776162233"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">79</int> + <reference key="object" ref="425164168"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">205</int> + <reference key="object" ref="789758025"/> + <array class="NSMutableArray" key="children"> + <reference ref="1058277027"/> + <reference ref="296257095"/> + <reference ref="29853731"/> + <reference ref="860595796"/> + <reference ref="1040322652"/> + <reference ref="790794224"/> + </array> + <reference key="parent" ref="952259628"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">207</int> + <reference key="object" ref="1058277027"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">199</int> + <reference key="object" ref="296257095"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">203</int> + <reference key="object" ref="29853731"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">197</int> + <reference key="object" ref="860595796"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">206</int> + <reference key="object" ref="1040322652"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">215</int> + <reference key="object" ref="790794224"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">57</int> + <reference key="object" ref="110575045"/> + <array class="NSMutableArray" key="children"> + <reference ref="238522557"/> + <reference ref="755159360"/> + <reference ref="908899353"/> + <reference ref="632727374"/> + <reference ref="646227648"/> + <reference ref="609285721"/> + <reference ref="481834944"/> + <reference ref="304266470"/> + <reference ref="1046388886"/> + <reference ref="1056857174"/> + <reference ref="342932134"/> + </array> + <reference key="parent" ref="694149608"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">58</int> + <reference key="object" ref="238522557"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">134</int> + <reference key="object" ref="755159360"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">150</int> + <reference key="object" ref="908899353"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">136</int> + <reference key="object" ref="632727374"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">144</int> + <reference key="object" ref="646227648"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">129</int> + <reference key="object" ref="609285721"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">143</int> + <reference key="object" ref="481834944"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">236</int> + <reference key="object" ref="304266470"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">131</int> + <reference key="object" ref="1046388886"/> + <array class="NSMutableArray" key="children"> + <reference ref="752062318"/> + </array> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">149</int> + <reference key="object" ref="1056857174"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">145</int> + <reference key="object" ref="342932134"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">130</int> + <reference key="object" ref="752062318"/> + <reference key="parent" ref="1046388886"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">371</int> + <reference key="object" ref="972006081"/> + <array class="NSMutableArray" key="children"> + <reference ref="439893737"/> + </array> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">372</int> + <reference key="object" ref="439893737"/> + <array class="NSMutableArray" key="children"> + <reference ref="723400866"/> + <reference ref="538240118"/> + <reference ref="765168480"/> + </array> + <reference key="parent" ref="972006081"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">420</int> + <reference key="object" ref="755631768"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">490</int> + <reference key="object" ref="448692316"/> + <array class="NSMutableArray" key="children"> + <reference ref="992780483"/> + </array> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">491</int> + <reference key="object" ref="992780483"/> + <array class="NSMutableArray" key="children"> + <reference ref="105068016"/> + </array> + <reference key="parent" ref="448692316"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">492</int> + <reference key="object" ref="105068016"/> + <reference key="parent" ref="992780483"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">494</int> + <reference key="object" ref="976324537"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">533</int> + <reference key="object" ref="723400866"/> + <array class="NSMutableArray" key="children"> + <reference ref="414645780"/> + </array> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">534</int> + <reference key="object" ref="414645780"/> + <reference key="parent" ref="723400866"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">537</int> + <reference key="object" ref="538240118"/> + <array class="NSMutableArray" key="children"> + <reference ref="866114168"/> + </array> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">538</int> + <reference key="object" ref="866114168"/> + <reference key="parent" ref="538240118"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">539</int> + <reference key="object" ref="765168480"/> + <array class="NSMutableArray" key="children"> + <reference ref="124666294"/> + </array> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">540</int> + <reference key="object" ref="124666294"/> + <reference key="parent" ref="765168480"/> + </object> + </array> + </object> + <dictionary class="NSMutableDictionary" key="flattenedProperties"> + <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="197.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="199.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="205.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="206.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="207.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="215.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="217.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="YES" key="371.IBNSWindowAutoPositionCentersHorizontal"/> + <boolean value="YES" key="371.IBNSWindowAutoPositionCentersVertical"/> + <string key="371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="371.IBWindowTemplateEditedContentRect">{{380, 496}, {480, 360}}</string> + <integer value="1" key="371.NSWindowTemplate.visibleAtLaunch"/> + <string key="372.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="490.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="491.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="492.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="494.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="534.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="539.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="540.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="72.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="73.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="79.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="81.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="82.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="83.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> + <nil key="activeLocalization"/> + <dictionary class="NSMutableDictionary" key="localizations"/> + <nil key="sourceID"/> + <int key="maxID">544</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"/> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <string key="NSMenuCheckmark">{9, 8}</string> + <string key="NSMenuMixedState">{7, 2}</string> + </dictionary> + </data> +</archive> diff --git a/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/main.m b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/main.m new file mode 100644 index 0000000..7cde29d --- /dev/null +++ b/remoting/host/installer/mac/uninstaller/Chrome Remote Desktop Uninstaller/main.m @@ -0,0 +1,14 @@ +// +// main.m +// Chrome Remote Desktop Uninstaller +// +// Created by Gary Kacmarcik on 4/3/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import <Cocoa/Cocoa.h> + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} |