blob: 75fc2aa993baab0654681b9a828625b40fd44fd6 [file] [log] [blame]
// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modemfwd/firmware_directory.h"
#include <memory>
#include <utility>
#include <base/files/file_path.h>
#include <base/macros.h>
#include "modemfwd/proto_bindings/firmware_manifest.pb.h"
#include "modemfwd/proto_file_reader.h"
namespace {
const char kManifestName[] = "manifest.proto";
} // namespace
namespace modemfwd {
const char FirmwareDirectory::kGenericCarrierId[] = "generic";
class FirmwareDirectoryImpl : public FirmwareDirectory {
public:
explicit FirmwareDirectoryImpl(const FirmwareManifest& manifest,
const base::FilePath& directory)
: manifest_(manifest), directory_(directory) {}
// modemfwd::FirmwareDirectory overrides.
bool FindMainFirmware(const std::string& device_id,
FirmwareFileInfo* out_info) override {
DCHECK(out_info);
for (const MainFirmware& file_info : manifest_.main_firmware()) {
if (file_info.device_id() == device_id &&
!file_info.filename().empty() && !file_info.version().empty()) {
out_info->firmware_path = directory_.Append(file_info.filename());
out_info->version = file_info.version();
return true;
}
}
return false;
}
bool FindCarrierFirmware(const std::string& device_id,
std::string* carrier_id,
FirmwareFileInfo* out_info) override {
DCHECK(carrier_id);
if (FindSpecificCarrierFirmware(device_id, *carrier_id, out_info))
return true;
if (FindSpecificCarrierFirmware(device_id, kGenericCarrierId, out_info)) {
*carrier_id = kGenericCarrierId;
return true;
}
return false;
}
private:
bool FindSpecificCarrierFirmware(const std::string& device_id,
const std::string& carrier_id,
FirmwareFileInfo* out_info) {
DCHECK(out_info);
for (const CarrierFirmware& file_info : manifest_.carrier_firmware()) {
if (file_info.device_id() != device_id ||
file_info.filename().empty() || file_info.version().empty()) {
continue;
}
for (const std::string& supported_carrier : file_info.carrier_id()) {
if (supported_carrier == carrier_id) {
out_info->firmware_path = directory_.Append(file_info.filename());
out_info->version = file_info.version();
return true;
}
}
}
return false;
}
FirmwareManifest manifest_;
base::FilePath directory_;
DISALLOW_COPY_AND_ASSIGN(FirmwareDirectoryImpl);
};
std::unique_ptr<FirmwareDirectory> CreateFirmwareDirectory(
const base::FilePath& directory) {
FirmwareManifest parsed_manifest;
if (!ReadProtobuf(directory.Append(kManifestName), &parsed_manifest))
return nullptr;
return std::make_unique<FirmwareDirectoryImpl>(parsed_manifest, directory);
}
} // namespace modemfwd