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