| // Copyright 2023 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "modemloggerd/manager.h" | |
| #include <memory> | |
| #include <string> | |
| #include <brillo/proto_file_io.h> | |
| #include <cros_config/cros_config.h> | |
| #include "modemloggerd/helper_manifest.pb.h" | |
| #include "modemloggerd/modem.h" | |
| namespace { | |
| constexpr char const* kDevicesSupportingLogging[] = {"em060", "fm101", "nl668", | |
| "fm350"}; | |
| const char kManifest[] = | |
| "/usr/local/usr/share/modemloggerd/helper_manifest.textproto"; | |
| std::string GetModemName() { | |
| brillo::CrosConfig config; | |
| std::string fw_variant; | |
| if (!config.GetString("/modem", "firmware-variant", &fw_variant)) { | |
| LOG(INFO) | |
| << "No modem firmware variant is specified. Cannot parse modem name."; | |
| return std::string(); | |
| } | |
| // TODO(b/312535821): Use udev/MM instead of cros_config for modem detection | |
| for (auto modem : kDevicesSupportingLogging) { | |
| if (fw_variant.find(modem) != std::string::npos) | |
| return modem; | |
| } | |
| LOG(INFO) << fw_variant << " does not support modem logging"; | |
| return std::string(); | |
| } | |
| } // namespace | |
| namespace modemloggerd { | |
| Manager::Manager(dbus::Bus* bus, AdaptorFactoryInterface* adaptor_factory) | |
| : bus_(bus), | |
| dbus_adaptor_(adaptor_factory->CreateManagerAdaptor(this, bus_)) { | |
| LOG(INFO) << __func__; | |
| HelperManifest parsed_manifest; | |
| if (!brillo::ReadTextProtobuf(base::FilePath(kManifest), &parsed_manifest)) { | |
| LOG(ERROR) << "Could not parse helper manifest"; | |
| return; | |
| } | |
| auto modem_name = GetModemName(); | |
| for (const HelperEntry& entry : parsed_manifest.helper()) { | |
| if (entry.modem_name() == modem_name) { | |
| // TODO(b/312535821): Introduce DBus method so that MM tells when a modem | |
| // has been found/ monitor udev | |
| available_modems_.push_back( | |
| std::make_unique<Modem>(bus_, adaptor_factory, entry)); | |
| break; | |
| } | |
| } | |
| UpdateAvailableModemsProperty(); | |
| } | |
| void Manager::UpdateAvailableModemsProperty() { | |
| LOG(INFO) << __func__; | |
| std::vector<dbus::ObjectPath> modem_paths; | |
| for (const auto& modem : available_modems_) { | |
| modem_paths.push_back(modem->GetDBusPath()); | |
| } | |
| dbus_adaptor_->SetAvailableModems(modem_paths); | |
| } | |
| } // namespace modemloggerd |