blob: 0337f4a3cc52ac0c08eb641cafa395d73de86691 [file] [log] [blame]
// Copyright 2018 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.
#ifndef SHILL_CELLULAR_CELLULAR_PCO_H_
#define SHILL_CELLULAR_CELLULAR_PCO_H_
#include <stdint.h>
#include <memory>
#include <utility>
#include <vector>
#include <base/macros.h>
namespace shill {
// A class that encapsulates elements extracted from the raw data of Protocol
// Configuration Options (PCO) structure.
class CellularPco {
public:
struct Element {
Element(uint16_t id, std::vector<uint8_t> data)
: id(id), data(std::move(data)) {}
uint16_t id;
std::vector<uint8_t> data;
};
// Parses the provided raw data representing a PCO structure and returns a
// CellularPco object that encapsulates the elements found in the PCO
// structure. Returns nullptr for an incomplete or malformed PCO structure.
static std::unique_ptr<CellularPco> CreateFromRawData(
const std::vector<uint8_t>& raw_data);
~CellularPco();
// Returns a pointer to the element with the provided element identifier if
// it's found in the PCO structure, or nullptr otherwise. The element is
// owned by this CellularPco object and thus the returned pointer remains
// valid until the CellularPco object is destructed.
const Element* FindElement(uint16_t element_id) const;
private:
// Used by CreateFromRawData to construct a CellularPco object with the
// elements extracted from a PCO structure.
explicit CellularPco(std::vector<Element> elements);
CellularPco(const CellularPco&) = delete;
CellularPco& operator=(const CellularPco&) = delete;
const std::vector<Element> elements_;
};
} // namespace shill
#endif // SHILL_CELLULAR_CELLULAR_PCO_H_