OLD | NEW |
| (Empty) |
1 // Copyright 2010 Google Inc. All Rights Reserved. | |
2 // Author: ajwong@google.com (Albert Wong) | |
3 | |
4 #include "remoting/client/plugin/chromoting_scriptable_object.h" | |
5 | |
6 #include "remoting/client/client_config.h" | |
7 #include "remoting/client/plugin/chromoting_plugin.h" | |
8 | |
9 #include "third_party/ppapi/cpp/var.h" | |
10 | |
11 using pp::Var; | |
12 | |
13 namespace remoting { | |
14 ChromotingScriptableObject::ChromotingScriptableObject( | |
15 ChromotingPlugin* instance) | |
16 : instance_(instance) { | |
17 } | |
18 | |
19 ChromotingScriptableObject::~ChromotingScriptableObject() { | |
20 } | |
21 | |
22 void ChromotingScriptableObject::Init() { | |
23 // Property addition order should match the interface description at the | |
24 // top of chromoting_scriptable_object.h. | |
25 AddAttribute("onreadystatechange", Var()); | |
26 | |
27 AddAttribute("NOT_CONNECTED", Var(0)); | |
28 AddAttribute("CONNECTED", Var(1)); | |
29 | |
30 AddMethod("connect", &ChromotingScriptableObject::DoConnect); | |
31 | |
32 // TODO(ajwong): Figure out how to implement the status variable. | |
33 AddAttribute("status", Var("not_implemented_yet")); | |
34 } | |
35 | |
36 bool ChromotingScriptableObject::HasProperty(const Var& name, Var* exception) { | |
37 // TODO(ajwong): Check if all these name.is_string() sentinels are required. | |
38 if (!name.is_string()) { | |
39 *exception = Var("HasProperty expects a string for the name."); | |
40 return false; | |
41 } | |
42 | |
43 PropertyNameMap::const_iterator iter = property_names_.find(name.AsString()); | |
44 if (iter == property_names_.end()) { | |
45 return false; | |
46 } | |
47 | |
48 return properties_[iter->second].method == NULL; | |
49 } | |
50 | |
51 bool ChromotingScriptableObject::HasMethod(const Var& name, Var* exception) { | |
52 // TODO(ajwong): Check if all these name.is_string() sentinels are required. | |
53 if (!name.is_string()) { | |
54 *exception = Var("HasMethod expects a string for the name."); | |
55 return false; | |
56 } | |
57 | |
58 PropertyNameMap::const_iterator iter = property_names_.find(name.AsString()); | |
59 if (iter == property_names_.end()) { | |
60 return false; | |
61 } | |
62 | |
63 return properties_[iter->second].method != NULL; | |
64 } | |
65 | |
66 Var ChromotingScriptableObject::GetProperty(const Var& name, Var* exception) { | |
67 // TODO(ajwong): Check if all these name.is_string() sentinels are required. | |
68 if (!name.is_string()) { | |
69 *exception = Var("GetProperty expects a string for the name."); | |
70 return Var(); | |
71 } | |
72 | |
73 PropertyNameMap::const_iterator iter = property_names_.find(name.AsString()); | |
74 | |
75 // No property found. | |
76 if (iter == property_names_.end()) { | |
77 return ScriptableObject::GetProperty(name, exception); | |
78 } | |
79 | |
80 // TODO(ajwong): This incorrectly return a null object if a function | |
81 // property is requested. | |
82 return properties_[iter->second].attribute; | |
83 } | |
84 | |
85 void ChromotingScriptableObject::GetAllPropertyNames( | |
86 std::vector<Var>* properties, | |
87 Var* exception) { | |
88 for (size_t i = 0; i < properties_.size(); i++) { | |
89 properties->push_back(Var(properties_[i].name)); | |
90 } | |
91 } | |
92 | |
93 void ChromotingScriptableObject::SetProperty(const Var& name, | |
94 const Var& value, | |
95 Var* exception) { | |
96 // TODO(ajwong): Check if all these name.is_string() sentinels are required. | |
97 if (!name.is_string()) { | |
98 *exception = Var("SetProperty expects a string for the name."); | |
99 return; | |
100 } | |
101 | |
102 // Only allow writing to onreadystatechange. See top of | |
103 // chromoting_scriptable_object.h for the object interface definition. | |
104 std::string property_name = name.AsString(); | |
105 if (property_name != "onstatechange") { | |
106 *exception = | |
107 Var("Cannot set property " + property_name + " on this object."); | |
108 return; | |
109 } | |
110 | |
111 // Since we're whitelisting the propertie that are settable above, we can | |
112 // assume that the property exists in the map. | |
113 properties_[property_names_[property_name]].attribute = value; | |
114 } | |
115 | |
116 Var ChromotingScriptableObject::Call(const Var& method_name, | |
117 const std::vector<Var>& args, | |
118 Var* exception) { | |
119 PropertyNameMap::const_iterator iter = | |
120 property_names_.find(method_name.AsString()); | |
121 if (iter == property_names_.end()) { | |
122 return pp::ScriptableObject::Call(method_name, args, exception); | |
123 } | |
124 | |
125 return (this->*(properties_[iter->second].method))(args, exception); | |
126 } | |
127 | |
128 void ChromotingScriptableObject::AddAttribute(const std::string& name, | |
129 Var attribute) { | |
130 property_names_[name] = properties_.size(); | |
131 properties_.push_back(PropertyDescriptor(name, attribute)); | |
132 } | |
133 | |
134 void ChromotingScriptableObject::AddMethod(const std::string& name, | |
135 MethodHandler handler) { | |
136 property_names_[name] = properties_.size(); | |
137 properties_.push_back(PropertyDescriptor(name, handler)); | |
138 } | |
139 | |
140 pp::Var ChromotingScriptableObject::DoConnect(const std::vector<Var>& args, | |
141 Var* exception) { | |
142 if (args.size() != 3) { | |
143 *exception = Var("Usage: connect(username, host_jid, auth_token"); | |
144 return Var(); | |
145 } | |
146 | |
147 ClientConfig config; | |
148 | |
149 if (!args[0].is_string()) { | |
150 *exception = Var("The username must be a string."); | |
151 return Var(); | |
152 } | |
153 config.username = args[0].AsString(); | |
154 | |
155 if (!args[1].is_string()) { | |
156 *exception = Var("The host_jid must be a string."); | |
157 return Var(); | |
158 } | |
159 config.host_jid = args[1].AsString(); | |
160 | |
161 if (!args[2].is_string()) { | |
162 *exception = Var("The auth_token must be a string."); | |
163 return Var(); | |
164 } | |
165 config.auth_token = args[2].AsString(); | |
166 | |
167 instance_->Connect(config); | |
168 | |
169 return Var(); | |
170 } | |
171 | |
172 } // namespace remoting | |
OLD | NEW |