blob: 90849791e1e31684a9d8882b33973d47aec553d6 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_UPDATE_CLIENT_PROTOCOL_PARSER_H_
#define COMPONENTS_UPDATE_CLIENT_PROTOCOL_PARSER_H_
#include <cstdint>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/version.h"
#include "url/gurl.h"
namespace update_client {
class ProtocolParser {
public:
// The result of parsing one |app| entity in an update check response.
struct Data {
Data();
Data(const std::string& install_data_index, const std::string& text);
Data(const Data& other);
Data& operator=(const Data&);
~Data();
// The `install_data_index` specified by the update check.
std::string install_data_index;
// The server data corresponding to the `name`/`install_data_index pair`.
std::string text;
};
struct Operation {
Operation();
Operation(const Operation& other);
Operation& operator=(const Operation&);
~Operation();
std::string type;
std::string sha256_in;
std::string sha256_out;
std::string sha256_previous;
std::string path;
std::string arguments;
int64_t size = 0;
std::vector<GURL> urls;
};
struct Pipeline {
Pipeline();
Pipeline(const Pipeline& other);
Pipeline& operator=(const Pipeline&);
~Pipeline();
std::string pipeline_id;
std::vector<Operation> operations;
};
struct App {
App();
App(const App& other);
App& operator=(const App&);
~App();
std::string app_id;
// status indicates the outcome of the check. It can be filled from either
// the app or updatecheck node.
std::string status;
// App-specific additions in the updatecheck response, including the
// mandatory '_' prefix (which prevents collision with formal protocol
// elements).
std::map<std::string, std::string> custom_attributes;
// The server has instructed the client to set its [key] to [value] for each
// key-value pair in this string.
std::optional<std::string> cohort;
std::optional<std::string> cohort_name;
std::optional<std::string> cohort_hint;
// Contains the data responses corresponding to the data elements specified
// in the update request.
std::vector<Data> data;
// When an update is available, these fields will be filled.
base::Version nextversion;
std::vector<Pipeline> pipelines;
};
static constexpr int kNoDaystart = -1;
struct Results {
Results();
Results(const Results& other);
Results& operator=(const Results&);
~Results();
// This will be >= 0, or kNoDaystart if the <daystart> tag was not present.
int daystart_elapsed_days = kNoDaystart;
std::vector<App> apps;
};
static std::unique_ptr<ProtocolParser> Create();
ProtocolParser(const ProtocolParser&) = delete;
ProtocolParser& operator=(const ProtocolParser&) = delete;
virtual ~ProtocolParser();
// Parses an update response string into Result data. Returns a bool
// indicating success or failure. On success, the results are available by
// calling results(). In case of success, only results corresponding to
// the update check status |ok| or |noupdate| are included.
// The details for any failures are available by calling errors().
bool Parse(const std::string& response);
const Results& results() const { return results_; }
const std::string& errors() const { return errors_; }
protected:
ProtocolParser();
// Appends parse error details to |errors_| string.
void ParseError(const char* details, ...);
private:
virtual bool DoParse(std::string_view response, Results* results) = 0;
Results results_;
std::string errors_;
};
} // namespace update_client
#endif // COMPONENTS_UPDATE_CLIENT_PROTOCOL_PARSER_H_