ProcessFileDescriptorMapModel.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "ProcessFileDescriptorMapModel.h"
  2. #include <AK/JsonObject.h>
  3. #include <AK/StringBuilder.h>
  4. #include <LibCore/CFile.h>
  5. void ProcessFileDescriptorMapModel::update()
  6. {
  7. CFile file(String::format("/proc/%d/fds", m_pid));
  8. if (!file.open(CIODevice::ReadOnly)) {
  9. dbg() << "Unable to open " << file.filename();
  10. return;
  11. }
  12. auto json = JsonValue::from_string(file.read_all());
  13. ASSERT(json.is_array());
  14. m_process_fds = json.as_array();
  15. did_update();
  16. }
  17. int ProcessFileDescriptorMapModel::row_count(const GModelIndex&) const
  18. {
  19. return m_process_fds.size();
  20. }
  21. String ProcessFileDescriptorMapModel::column_name(int column) const
  22. {
  23. switch (column) {
  24. case Column::FileDescriptor:
  25. return "FD";
  26. case Column::ClassName:
  27. return "Class";
  28. case Column::Offset:
  29. return "Offset";
  30. case Column::Access:
  31. return "Access";
  32. case Column::Path:
  33. return "Path";
  34. default:
  35. ASSERT_NOT_REACHED();
  36. }
  37. }
  38. GModel::ColumnMetadata ProcessFileDescriptorMapModel::column_metadata(int column) const
  39. {
  40. switch (column) {
  41. case Column::FileDescriptor:
  42. return { 32, TextAlignment::CenterRight };
  43. case Column::ClassName:
  44. return { 80, TextAlignment::CenterLeft };
  45. case Column::Offset:
  46. return { 40, TextAlignment::CenterRight };
  47. case Column::Access:
  48. return { 60, TextAlignment::CenterLeft };
  49. case Column::Path:
  50. return { 300, TextAlignment::CenterLeft };
  51. default:
  52. ASSERT_NOT_REACHED();
  53. }
  54. return {};
  55. }
  56. GVariant ProcessFileDescriptorMapModel::data(const GModelIndex& index, Role role) const
  57. {
  58. auto& fd_object = m_process_fds.at(index.row()).as_object();
  59. if (role == GModel::Role::Display) {
  60. switch (index.column()) {
  61. case Column::FileDescriptor:
  62. return fd_object.get("fd").to_int();
  63. case Column::ClassName:
  64. return fd_object.get("class").to_string();
  65. case Column::Offset:
  66. return fd_object.get("offset").to_int();
  67. case Column::Access:
  68. return fd_object.get("seekable").to_bool() ? "Seekable" : "Sequential";
  69. case Column::Path:
  70. return fd_object.get("absolute_path").to_string();
  71. default:
  72. ASSERT_NOT_REACHED();
  73. }
  74. }
  75. return {};
  76. }
  77. void ProcessFileDescriptorMapModel::set_pid(pid_t pid)
  78. {
  79. if (m_pid == pid)
  80. return;
  81. m_pid = pid;
  82. update();
  83. }