- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / applescript / apple_event_util.mm
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.
4
5 #import "chrome/browser/ui/cocoa/applescript/apple_event_util.h"
6
7 #import <Carbon/Carbon.h>
8
9 #include "base/logging.h"
10 #include "base/strings/sys_string_conversions.h"
11 #include "base/values.h"
12
13 namespace chrome {
14 namespace mac {
15
16 NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value* value) {
17   NSAppleEventDescriptor* descriptor = nil;
18
19   switch (value->GetType()) {
20     case base::Value::TYPE_NULL:
21       descriptor = [NSAppleEventDescriptor
22           descriptorWithTypeCode:cMissingValue];
23       break;
24
25     case base::Value::TYPE_BOOLEAN: {
26       bool bool_value;
27       value->GetAsBoolean(&bool_value);
28       descriptor = [NSAppleEventDescriptor descriptorWithBoolean:bool_value];
29       break;
30     }
31
32     case base::Value::TYPE_INTEGER: {
33       int int_value;
34       value->GetAsInteger(&int_value);
35       descriptor = [NSAppleEventDescriptor descriptorWithInt32:int_value];
36       break;
37     }
38
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     }
48
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     }
56
57     case base::Value::TYPE_BINARY:
58       NOTREACHED();
59       break;
60
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 (DictionaryValue::Iterator iter(*dictionary_value); !iter.IsAtEnd();
68            iter.Advance()) {
69         [userRecord insertDescriptor:[NSAppleEventDescriptor
70             descriptorWithString:base::SysUTF8ToNSString(iter.key())]
71                              atIndex:0];
72         [userRecord insertDescriptor:ValueToAppleEventDescriptor(&iter.value())
73                              atIndex:0];
74       }
75       // Description of what keyASUserRecordFields does.
76       // http://lists.apple.com/archives/cocoa-dev/2009/Jul/msg01216.html
77       [descriptor setDescriptor:userRecord forKeyword:keyASUserRecordFields];
78       break;
79     }
80
81     case base::Value::TYPE_LIST: {
82       const base::ListValue* list_value;
83       value->GetAsList(&list_value);
84       descriptor = [NSAppleEventDescriptor listDescriptor];
85       for (size_t i = 0; i < list_value->GetSize(); ++i) {
86         const base::Value* item;
87         list_value->Get(i, &item);
88         [descriptor insertDescriptor:ValueToAppleEventDescriptor(item)
89                              atIndex:0];
90       }
91       break;
92     }
93   }
94
95   return descriptor;
96 }
97
98 }  // namespace mac
99 }  // namespace chrome