Serenity Operating System
at master 108 lines 3.2 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include "RemoteProcess.h" 8#include "RemoteObject.h" 9#include "RemoteObjectGraphModel.h" 10#include "RemoteObjectPropertyModel.h" 11 12namespace Inspector { 13 14RemoteProcess* s_the; 15 16RemoteProcess& RemoteProcess::the() 17{ 18 return *s_the; 19} 20 21RemoteProcess::RemoteProcess(pid_t pid) 22 : m_pid(pid) 23 , m_object_graph_model(RemoteObjectGraphModel::create(*this)) 24{ 25 s_the = this; 26 m_client = InspectorServerClient::try_create().release_value_but_fixme_should_propagate_errors(); 27} 28 29void RemoteProcess::handle_identify_response(JsonObject const& response) 30{ 31 int pid = response.get_i32("pid"sv).value_or(0); 32 VERIFY(pid == m_pid); 33 34 m_process_name = response.get_deprecated_string("process_name"sv).value_or({}); 35 36 if (on_update) 37 on_update(); 38} 39 40void RemoteProcess::handle_get_all_objects_response(JsonObject const& response) 41{ 42 // FIXME: It would be good if we didn't have to make a local copy of the array value here! 43 auto& object_array = response.get_array("objects"sv).value(); 44 45 Vector<NonnullOwnPtr<RemoteObject>> remote_objects; 46 HashMap<FlatPtr, RemoteObject*> objects_by_address; 47 48 for (auto& value : object_array.values()) { 49 VERIFY(value.is_object()); 50 auto& object = value.as_object(); 51 auto remote_object = make<RemoteObject>(); 52 remote_object->address = object.get_addr("address"sv).value_or(0); 53 remote_object->parent_address = object.get_addr("parent"sv).value_or(0); 54 remote_object->name = object.get_deprecated_string("name"sv).value_or({}); 55 remote_object->class_name = object.get_deprecated_string("class_name"sv).value_or({}); 56 remote_object->json = object; 57 objects_by_address.set(remote_object->address, remote_object); 58 remote_objects.append(move(remote_object)); 59 } 60 61 for (size_t i = 0; i < remote_objects.size(); ++i) { 62 auto& remote_object = remote_objects[i]; 63 auto* parent = objects_by_address.get(remote_object->parent_address).value_or(nullptr); 64 if (!parent) { 65 m_roots.append(move(remote_object)); 66 } else { 67 remote_object->parent = parent; 68 parent->children.append(move(remote_object)); 69 } 70 } 71 72 m_object_graph_model->invalidate(); 73 74 if (on_update) 75 on_update(); 76} 77 78void RemoteProcess::set_inspected_object(FlatPtr address) 79{ 80 m_client->async_set_inspected_object(m_pid, address); 81} 82 83void RemoteProcess::set_property(FlatPtr object, StringView name, JsonValue const& value) 84{ 85 m_client->async_set_object_property(m_pid, object, name, value.to_deprecated_string()); 86} 87 88bool RemoteProcess::is_inspectable() 89{ 90 return m_client->is_inspectable(m_pid); 91} 92 93void RemoteProcess::update() 94{ 95 { 96 auto raw_json = m_client->identify(m_pid); 97 auto json = JsonValue::from_string(raw_json); 98 handle_identify_response(json.value().as_object()); 99 } 100 101 { 102 auto raw_json = m_client->get_all_objects(m_pid); 103 auto json = JsonValue::from_string(raw_json); 104 handle_get_all_objects_response(json.value().as_object()); 105 } 106} 107 108}