Index: webrtc/base/macutils.cc |
diff --git a/webrtc/base/macutils.cc b/webrtc/base/macutils.cc |
index 44eb4af19f828427f34c795ee89f75cbd272e091..3a07b815c90d864a3f7346e5b5a9d17357b718ac 100644 |
--- a/webrtc/base/macutils.cc |
+++ b/webrtc/base/macutils.cc |
@@ -46,6 +46,7 @@ |
return NULL != *str16; |
} |
+#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) |
void DecodeFourChar(UInt32 fc, std::string* out) { |
std::stringstream ss; |
ss << '\''; |
@@ -127,4 +128,82 @@ |
} |
return kMacOSNewer; |
} |
+ |
+bool RunAppleScript(const std::string& script) { |
+ // TODO(thaloun): Add a .mm file that contains something like this: |
+ // NSString source from script |
+ // NSAppleScript* appleScript = [[NSAppleScript alloc] initWithSource:&source] |
+ // if (appleScript != nil) { |
+ // [appleScript executeAndReturnError:nil] |
+ // [appleScript release] |
+#ifndef CARBON_DEPRECATED |
+ ComponentInstance component = NULL; |
+ AEDesc script_desc; |
+ AEDesc result_data; |
+ OSStatus err; |
+ OSAID script_id, result_id; |
+ |
+ AECreateDesc(typeNull, NULL, 0, &script_desc); |
+ AECreateDesc(typeNull, NULL, 0, &result_data); |
+ script_id = kOSANullScript; |
+ result_id = kOSANullScript; |
+ |
+ component = OpenDefaultComponent(kOSAComponentType, typeAppleScript); |
+ if (component == NULL) { |
+ LOG(LS_ERROR) << "Failed opening Apple Script component"; |
+ return false; |
+ } |
+ err = AECreateDesc(typeUTF8Text, script.data(), script.size(), &script_desc); |
+ if (err != noErr) { |
+ CloseComponent(component); |
+ LOG(LS_ERROR) << "Failed creating Apple Script description"; |
+ return false; |
+ } |
+ |
+ err = OSACompile(component, &script_desc, kOSAModeCanInteract, &script_id); |
+ if (err != noErr) { |
+ AEDisposeDesc(&script_desc); |
+ if (script_id != kOSANullScript) { |
+ OSADispose(component, script_id); |
+ } |
+ CloseComponent(component); |
+ LOG(LS_ERROR) << "Error compiling Apple Script"; |
+ return false; |
+ } |
+ |
+ err = OSAExecute(component, script_id, kOSANullScript, kOSAModeCanInteract, |
+ &result_id); |
+ |
+ if (err == errOSAScriptError) { |
+ LOG(LS_ERROR) << "Error when executing Apple Script: " << script; |
+ AECreateDesc(typeNull, NULL, 0, &result_data); |
+ OSAScriptError(component, kOSAErrorMessage, typeChar, &result_data); |
+ int len = AEGetDescDataSize(&result_data); |
+ char* data = (char*)malloc(len); |
+ if (data != NULL) { |
+ err = AEGetDescData(&result_data, data, len); |
+ LOG(LS_ERROR) << "Script error: " << std::string(data, len); |
+ } |
+ AEDisposeDesc(&script_desc); |
+ AEDisposeDesc(&result_data); |
+ return false; |
+ } |
+ AEDisposeDesc(&script_desc); |
+ if (script_id != kOSANullScript) { |
+ OSADispose(component, script_id); |
+ } |
+ if (result_id != kOSANullScript) { |
+ OSADispose(component, result_id); |
+ } |
+ CloseComponent(component); |
+ return true; |
+#else |
+ // TODO(thaloun): Support applescripts with the NSAppleScript API. |
+ return false; |
+#endif // CARBON_DEPRECATED |
+} |
+#endif // WEBRTC_MAC && !defined(WEBRTC_IOS) |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
} // namespace rtc |