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