1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_COMPONENT_UPDATER_UPDATE_RESPONSE_H_
6#define COMPONENTS_COMPONENT_UPDATER_UPDATE_RESPONSE_H_
7
8#include <string>
9#include <vector>
10
11#include "base/macros.h"
12#include "url/gurl.h"
13
14namespace component_updater {
15
16// Parses responses for the update protocol version 3.
17// (http://code.google.com/p/omaha/wiki/ServerProtocol)
18//
19// An update response looks like this:
20//
21// <?xml version="1.0" encoding="UTF-8"?>
22//  <response protocol="3.0" server="prod">
23//    <daystart elapsed_seconds="56508"/>
24//    <app appid="{430FD4D0-B729-4F61-AA34-91526481799D}" status="ok">
25//      <updatecheck status="noupdate"/>
26//      <ping status="ok"/>
27//    </app>
28//    <app appid="{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}" status="ok">
29//      <updatecheck status="ok">
30//        <urls>
31//          <url codebase="http://host/edgedl/chrome/install/782.112/"
32//          <url codebasediff="http://fallback/chrome/diff/782.112/"/>
33//        </urls>
34//        <manifest version="13.0.782.112" prodversionmin="2.0.143.0">
35//          <packages>
36//            <package name="component.crx"
37//                     namediff="diff_1.2.3.4.crx"
38//                     fp="1.123"
39//                     hash_sha256="9830b4245c4..." size="23963192"
40//                     hashdiff_sha256="cfb6caf3d0..." sizediff="101"/>
41//          </packages>
42//        </manifest>
43//      </updatecheck>
44//      <ping status="ok"/>
45//    </app>
46//  </response>
47//
48// The <daystart> tag contains a "elapsed_seconds" attribute which refers to
49// the server's notion of how many seconds it has been since midnight.
50//
51// The "appid" attribute of the <app> tag refers to the unique id of the
52// extension. The "codebase" attribute of the <updatecheck> tag is the url to
53// fetch the updated crx file, and the "prodversionmin" attribute refers to
54// the minimum version of the chrome browser that the update applies to.
55//
56// The diff data members correspond to the differential update package, if
57// a differential update is specified in the response.
58class UpdateResponse {
59 public:
60  // The result of parsing one <app> tag in an xml update check response.
61  struct Result {
62    struct Manifest {
63      struct Package {
64        Package();
65        ~Package();
66
67        std::string fingerprint;
68
69        // Attributes for the full update.
70        std::string name;
71        std::string hash_sha256;
72        int size;
73
74        // Attributes for the differential update.
75        std::string namediff;
76        std::string hashdiff_sha256;
77        int sizediff;
78      };
79
80      Manifest();
81      ~Manifest();
82
83      std::string version;
84      std::string browser_min_version;
85      std::vector<Package> packages;
86    };
87
88    Result();
89    ~Result();
90
91    std::string extension_id;
92
93    // The list of fallback urls, for full and diff updates respectively.
94    // These urls are base urls; they don't include the filename.
95    std::vector<GURL> crx_urls;
96    std::vector<GURL> crx_diffurls;
97
98    Manifest manifest;
99  };
100
101  static const int kNoDaystart = -1;
102  struct Results {
103    Results();
104    ~Results();
105
106    // This will be >= 0, or kNoDaystart if the <daystart> tag was not present.
107    int daystart_elapsed_seconds;
108    std::vector<Result> list;
109  };
110
111  UpdateResponse();
112  ~UpdateResponse();
113
114  // Parses an update response xml string into Result data. Returns a bool
115  // indicating success or failure. On success, the results are available by
116  // calling results(). The details for any failures are available by calling
117  // errors().
118  bool Parse(const std::string& manifest_xml);
119
120  const Results& results() const { return results_; }
121  const std::string& errors() const { return errors_; }
122
123 private:
124  Results results_;
125  std::string errors_;
126
127  // Adds parse error details to |errors_| string.
128  void ParseError(const char* details, ...);
129
130  DISALLOW_COPY_AND_ASSIGN(UpdateResponse);
131};
132
133}  // namespace component_updater
134
135#endif  // COMPONENTS_COMPONENT_UPDATER_UPDATE_RESPONSE_H_
136