Home | History | Annotate | Download | only in component_updater
      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 
     14 namespace 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.
     58 class 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