15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2007 Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sstream>
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h"
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h"
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/macutils.h"
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/scoped_ptr.h"
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/stringutils.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base {
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org///////////////////////////////////////////////////////////////////////////////
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ToUtf8(const CFStringRef str16, std::string* str8) {
4185a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  if ((NULL == str16) || (NULL == str8)) {
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
4385a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  }
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_t maxlen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(str16),
4585a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org                                                    kCFStringEncodingUTF8) + 1;
46582fe818e571fa2571267f5e369715188472f352wu@webrtc.org  scoped_ptr<char[]> buffer(new char[maxlen]);
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!buffer || !CFStringGetCString(str16, buffer.get(), maxlen,
4885a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org                                     kCFStringEncodingUTF8)) {
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
5085a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  }
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  str8->assign(buffer.get());
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ToUtf16(const std::string& str8, CFStringRef* str16) {
5685a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  if (NULL == str16) {
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
5885a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  }
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *str16 = CFStringCreateWithBytes(kCFAllocatorDefault,
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                   reinterpret_cast<const UInt8*>(str8.data()),
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                   str8.length(), kCFStringEncodingUTF8,
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                   false);
6385a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  return NULL != *str16;
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef OSX
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid DecodeFourChar(UInt32 fc, std::string* out) {
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::stringstream ss;
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ss << '\'';
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool printable = true;
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (int i = 3; i >= 0; --i) {
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    char ch = (fc >> (8 * i)) & 0xFF;
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (isprint(static_cast<unsigned char>(ch))) {
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ss << ch;
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    } else {
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      printable = false;
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (printable) {
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss << '\'';
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss.str("");
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss << "0x" << std::hex << fc;
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  out->append(ss.str());
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic bool GetGestalt(OSType ostype, int* value) {
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(NULL != value);
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  SInt32 native_value;
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  OSStatus result = Gestalt(ostype, &native_value);
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (noErr == result) {
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *value = native_value;
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string str;
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  DecodeFourChar(ostype, &str);
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LOG_E(LS_ERROR, OS, result) << "Gestalt(" << str << ")";
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return false;
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool GetOSVersion(int* major, int* minor, int* bugfix) {
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(major && minor && bugfix);
10585a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  if (!GetGestalt(gestaltSystemVersion, major)) {
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
10785a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  }
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (*major < 0x1040) {
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *bugfix = *major & 0xF;
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *minor = (*major >> 4) & 0xF;
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *major = (*major >> 8);
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
11485a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  return GetGestalt(gestaltSystemVersionMajor, major) &&
11585a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org         GetGestalt(gestaltSystemVersionMinor, minor) &&
11685a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org         GetGestalt(gestaltSystemVersionBugFix, bugfix);
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMacOSVersionName GetOSVersionName() {
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int major = 0, minor = 0, bugfix = 0;
12185a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  if (!GetOSVersion(&major, &minor, &bugfix)) {
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return kMacOSUnknown;
12385a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  }
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (major > 10) {
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return kMacOSNewer;
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if ((major < 10) || (minor < 3)) {
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return kMacOSOlder;
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  switch (minor) {
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case 3:
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return kMacOSPanther;
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case 4:
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return kMacOSTiger;
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case 5:
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return kMacOSLeopard;
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case 6:
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return kMacOSSnowLeopard;
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case 7:
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return kMacOSLion;
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case 8:
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return kMacOSMountainLion;
14385a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org    case 9:
14485a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org      return kMacOSMavericks;
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return kMacOSNewer;
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool GetQuickTimeVersion(std::string* out) {
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int ver;
15185a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  if (!GetGestalt(gestaltQuickTimeVersion, &ver)) {
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
15385a56f7357d9a68fe6de51061d81849db77e5185sergeyu@chromium.org  }
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::stringstream ss;
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ss << std::hex << ver;
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *out = ss.str();
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool RunAppleScript(const std::string& script) {
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // TODO(thaloun): Add a .mm file that contains something like this:
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // NSString source from script
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // NSAppleScript* appleScript = [[NSAppleScript alloc] initWithSource:&source]
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // if (appleScript != nil) {
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  //   [appleScript executeAndReturnError:nil]
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  //   [appleScript release]
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef CARBON_DEPRECATED
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ComponentInstance component = NULL;
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AEDesc script_desc;
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AEDesc result_data;
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  OSStatus err;
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  OSAID script_id, result_id;
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AECreateDesc(typeNull, NULL, 0, &script_desc);
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AECreateDesc(typeNull, NULL, 0, &result_data);
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  script_id = kOSANullScript;
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  result_id = kOSANullScript;
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  component = OpenDefaultComponent(kOSAComponentType, typeAppleScript);
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (component == NULL) {
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    LOG(LS_ERROR) << "Failed opening Apple Script component";
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  err = AECreateDesc(typeUTF8Text, script.data(), script.size(), &script_desc);
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (err != noErr) {
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    CloseComponent(component);
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    LOG(LS_ERROR) << "Failed creating Apple Script description";
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  err = OSACompile(component, &script_desc, kOSAModeCanInteract, &script_id);
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (err != noErr) {
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AEDisposeDesc(&script_desc);
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (script_id != kOSANullScript) {
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      OSADispose(component, script_id);
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    CloseComponent(component);
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    LOG(LS_ERROR) << "Error compiling Apple Script";
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  err = OSAExecute(component, script_id, kOSANullScript, kOSAModeCanInteract,
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   &result_id);
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (err == errOSAScriptError) {
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    LOG(LS_ERROR) << "Error when executing Apple Script: " << script;
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AECreateDesc(typeNull, NULL, 0, &result_data);
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    OSAScriptError(component, kOSAErrorMessage, typeChar, &result_data);
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int len = AEGetDescDataSize(&result_data);
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    char* data = (char*) malloc(len);
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (data != NULL) {
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      err = AEGetDescData(&result_data, data, len);
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      LOG(LS_ERROR) << "Script error: " << data;
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AEDisposeDesc(&script_desc);
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AEDisposeDesc(&result_data);
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AEDisposeDesc(&script_desc);
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (script_id != kOSANullScript) {
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    OSADispose(component, script_id);
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (result_id != kOSANullScript) {
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    OSADispose(component, result_id);
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CloseComponent(component);
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // TODO(thaloun): Support applescripts with the NSAppleScript API.
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return false;
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // CARBON_DEPRECATED
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // OSX
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org///////////////////////////////////////////////////////////////////////////////
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace talk_base
239