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