Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / ui / cocoa / applescript / apple_event_util.mm
blobaa4ac44ab12466e112ebe2dd000b5b9002c15325
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "chrome/browser/ui/cocoa/applescript/apple_event_util.h"
7 #import <Carbon/Carbon.h>
9 #include "base/logging.h"
10 #include "base/strings/sys_string_conversions.h"
11 #include "base/values.h"
13 namespace chrome {
14 namespace mac {
16 NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value* value) {
17   NSAppleEventDescriptor* descriptor = nil;
19   switch (value->GetType()) {
20     case base::Value::TYPE_NULL:
21       descriptor = [NSAppleEventDescriptor
22           descriptorWithTypeCode:cMissingValue];
23       break;
25     case base::Value::TYPE_BOOLEAN: {
26       bool bool_value;
27       value->GetAsBoolean(&bool_value);
28       descriptor = [NSAppleEventDescriptor descriptorWithBoolean:bool_value];
29       break;
30     }
32     case base::Value::TYPE_INTEGER: {
33       int int_value;
34       value->GetAsInteger(&int_value);
35       descriptor = [NSAppleEventDescriptor descriptorWithInt32:int_value];
36       break;
37     }
39     case base::Value::TYPE_DOUBLE: {
40       double double_value;
41       value->GetAsDouble(&double_value);
42       descriptor = [NSAppleEventDescriptor
43           descriptorWithDescriptorType:typeIEEE64BitFloatingPoint
44                                  bytes:&double_value
45                                 length:sizeof(double_value)];
46       break;
47     }
49     case base::Value::TYPE_STRING: {
50       std::string string_value;
51       value->GetAsString(&string_value);
52       descriptor = [NSAppleEventDescriptor descriptorWithString:
53           base::SysUTF8ToNSString(string_value)];
54       break;
55     }
57     case base::Value::TYPE_BINARY:
58       NOTREACHED();
59       break;
61     case base::Value::TYPE_DICTIONARY: {
62       const base::DictionaryValue* dictionary_value;
63       value->GetAsDictionary(&dictionary_value);
64       descriptor = [NSAppleEventDescriptor recordDescriptor];
65       NSAppleEventDescriptor* userRecord = [NSAppleEventDescriptor
66           listDescriptor];
67       for (base::DictionaryValue::Iterator iter(*dictionary_value);
68            !iter.IsAtEnd();
69            iter.Advance()) {
70         [userRecord insertDescriptor:[NSAppleEventDescriptor
71             descriptorWithString:base::SysUTF8ToNSString(iter.key())]
72                              atIndex:0];
73         [userRecord insertDescriptor:ValueToAppleEventDescriptor(&iter.value())
74                              atIndex:0];
75       }
76       // Description of what keyASUserRecordFields does.
77       // http://lists.apple.com/archives/cocoa-dev/2009/Jul/msg01216.html
78       [descriptor setDescriptor:userRecord forKeyword:keyASUserRecordFields];
79       break;
80     }
82     case base::Value::TYPE_LIST: {
83       const base::ListValue* list_value;
84       value->GetAsList(&list_value);
85       descriptor = [NSAppleEventDescriptor listDescriptor];
86       for (size_t i = 0; i < list_value->GetSize(); ++i) {
87         const base::Value* item;
88         list_value->Get(i, &item);
89         [descriptor insertDescriptor:ValueToAppleEventDescriptor(item)
90                              atIndex:0];
91       }
92       break;
93     }
94   }
96   return descriptor;
99 }  // namespace mac
100 }  // namespace chrome