Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2009 The Chromium OS 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 #include <dlfcn.h> | |
| 6 #include <glib-object.h> | |
| 7 #include <map> | |
| 8 #include <vector> | |
| 9 | |
| 10 #include <base/logging.h> | |
| 11 #include <base/time.h> | |
| 12 #include <base/values.h> | |
| 13 | |
| 14 #include "chromeos_cros_api.h" // NOLINT | |
| 15 #include "chromeos_network.h" // NOLINT | |
| 16 #include "chromeos/dbus/dbus.h" // NOLINT | |
| 17 #include "chromeos/glib/object.h" // NOLINT | |
| 18 #include "monitor_utils.h" //NOLINT | |
| 19 | |
| 20 static void PrintProperty(const char* path, | |
| 21 const char* key, | |
| 22 const Value* value) { | |
| 23 std::string prelude("PropertyChanged ["); | |
| 24 prelude += path; | |
| 25 prelude += "] "; | |
| 26 prelude += key; | |
| 27 prelude += " : "; | |
| 28 if (value->IsType(Value::TYPE_STRING)) { | |
| 29 std::string strval; | |
| 30 value->GetAsString(&strval); | |
| 31 LOG(INFO) << prelude << "\"" << strval << "\""; | |
| 32 } else if (value->IsType(Value::TYPE_BOOLEAN)) { | |
| 33 bool boolval; | |
| 34 value->GetAsBoolean(&boolval); | |
| 35 LOG(INFO) << prelude << boolval; | |
| 36 } else if (value->IsType(Value::TYPE_INTEGER)) { | |
| 37 int intval; | |
| 38 value->GetAsInteger(&intval); | |
| 39 LOG(INFO) << prelude << intval; | |
| 40 } else if (value->IsType(Value::TYPE_LIST)) { | |
| 41 const ListValue* list = static_cast<const ListValue*>(value); | |
| 42 Value *itemval; | |
| 43 std::string liststr; | |
| 44 size_t index = 0; | |
| 45 while (list->Get(index, &itemval)) { | |
| 46 if (!itemval->IsType(Value::TYPE_STRING)) { | |
| 47 ++index; | |
| 48 continue; | |
| 49 } | |
| 50 std::string itemstr; | |
| 51 itemval->GetAsString(&itemstr); | |
| 52 liststr += itemstr; | |
| 53 ++index; | |
| 54 if (index < list->GetSize()) | |
| 55 liststr += ", "; | |
| 56 } | |
| 57 LOG(INFO) << prelude << "\"" << liststr << "\""; | |
| 58 } else if (value->IsType(Value::TYPE_DICTIONARY)) { | |
| 59 const DictionaryValue* dict = static_cast<const DictionaryValue*>(value); | |
| 60 std::string items; | |
| 61 std::string itemval; | |
| 62 size_t n = 0; | |
| 63 DictionaryValue::key_iterator iter = dict->begin_keys(); | |
| 64 while (iter != dict->end_keys()) { | |
| 65 std::string key = *iter; | |
| 66 items += "{'" + key + "': '"; | |
| 67 if (dict->GetStringWithoutPathExpansion(key, &itemval)) | |
| 68 items += itemval + "'}"; | |
| 69 else | |
| 70 items += "<not-a-string>'}"; | |
| 71 if (n < dict->size()) | |
| 72 items += ", "; | |
| 73 ++iter; | |
| 74 ++n; | |
| 75 } | |
| 76 LOG(INFO) << prelude << items; | |
| 77 } else | |
| 78 LOG(INFO) << prelude << "<type " << value->GetType() << ">"; | |
| 79 } | |
| 80 | |
| 81 class CallbackMonitorNetwork { | |
| 82 public: | |
| 83 static void Run(void *object, | |
| 84 const char *path, | |
| 85 const char *key, | |
| 86 const Value* value) { | |
| 87 PrintProperty(path, key, value); | |
| 88 } | |
| 89 }; | |
| 90 | |
| 91 // A simple program exercising the {Set,Clear}{Device,Service}Property methods. | |
|
Eric Shienbrood
2011/04/21 21:48:26
This is all a little bit bogus, since (a) the empt
| |
| 92 int main(int argc, const char** argv) { | |
| 93 ::g_type_init(); | |
| 94 GMainLoop* loop = ::g_main_loop_new(NULL, false); | |
| 95 | |
| 96 DCHECK(loop) << "Failed to create main loop"; | |
| 97 if (!LoadCrosLibrary(argv)) | |
| 98 LOG(INFO) << "Failed to load cros .so"; | |
| 99 | |
| 100 if (argc != 4) { | |
| 101 LOG(INFO) << "Program must be invoked with one path argument, " | |
| 102 << "one property name, and one value."; | |
| 103 return 1; | |
| 104 } | |
| 105 | |
| 106 chromeos::PropertyChangeMonitor device_mon; | |
| 107 if (strncmp(argv[1], "/service/", 9) == 0) { | |
| 108 | |
| 109 LOG(INFO) << "Requesting properties messages on service '" | |
| 110 << argv[1] << "'"; | |
| 111 | |
| 112 device_mon = chromeos::MonitorNetworkService(&CallbackMonitorNetwork::Run, | |
| 113 argv[1], NULL); | |
| 114 if (strlen(argv[3]) != 0) { | |
| 115 LOG(INFO) << "Setting property '" << argv[2] << "' on '" | |
| 116 << argv[1] << "'"; | |
| 117 chromeos::SetNetworkServiceProperty(argv[1], argv[2], | |
| 118 Value::CreateStringValue(argv[3])); | |
| 119 } else { | |
| 120 LOG(INFO) << "Clearing property '" << argv[2] << "' on '" | |
| 121 << argv[1] << "'"; | |
| 122 chromeos::ClearNetworkServiceProperty(argv[1], argv[2]); | |
| 123 } | |
| 124 } else if (strncmp(argv[1], "/device/", 8) == 0) { | |
| 125 LOG(INFO) << "Requesting properties messages on device '" << argv[1] << "'"; | |
| 126 | |
| 127 device_mon = chromeos::MonitorNetworkDevice(&CallbackMonitorNetwork::Run, | |
| 128 argv[1], NULL); | |
| 129 | |
| 130 if (strlen(argv[3]) != 0) { | |
| 131 LOG(INFO) << "Setting property '" << argv[2] << "' on '" | |
| 132 << argv[1] << "'"; | |
| 133 chromeos::SetNetworkDeviceProperty(argv[1], argv[2], | |
| 134 Value::CreateStringValue(argv[3])); | |
| 135 } else { | |
| 136 LOG(INFO) << "Clearing property '" << argv[2] << "' on '" | |
| 137 << argv[1] << "'"; | |
| 138 chromeos::ClearNetworkDeviceProperty(argv[1], argv[2]); | |
| 139 } | |
| 140 } else { | |
| 141 LOG(INFO) << "Don't know what to do with path '" << argv[1] << "' " | |
| 142 << "neither a device nor a service"; | |
| 143 return 1; | |
| 144 } | |
| 145 | |
| 146 LOG(INFO) << "Starting g_main_loop."; | |
| 147 | |
| 148 ::g_main_loop_run(loop); | |
| 149 | |
| 150 LOG(INFO) << "Shutting down."; | |
| 151 | |
| 152 chromeos::DisconnectPropertyChangeMonitor(device_mon); | |
| 153 return 0; | |
| 154 } | |
| OLD | NEW |