Home | History | Annotate | Download | only in feedback
      1 // Copyright (c) 2012 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 CHROME_BROWSER_FEEDBACK_FEEDBACK_DATA_H_
      6 #define CHROME_BROWSER_FEEDBACK_FEEDBACK_DATA_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/memory/ref_counted.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "url/gurl.h"
     15 
     16 namespace base {
     17 class FilePath;
     18 class RefCountedString;
     19 }
     20 class Profile;
     21 
     22 class FeedbackData : public base::RefCountedThreadSafe<FeedbackData> {
     23  public:
     24   typedef std::map<std::string, std::string> SystemLogsMap;
     25 
     26   // Determine if the given feedback value is small enough to not need to
     27   // be compressed.
     28   static bool BelowCompressionThreshold(const std::string& content);
     29 
     30   FeedbackData();
     31 
     32   // Called once we've updated all the data from the feedback page.
     33   void OnFeedbackPageDataComplete();
     34 
     35   // Sets the system information for this instance and kicks off its
     36   // compression.
     37   void SetAndCompressSystemInfo(scoped_ptr<SystemLogsMap> sys_info);
     38 
     39   // Sets the histograms for this instance and kicks off its
     40   // compression.
     41   void SetAndCompressHistograms(scoped_ptr<std::string> histograms);
     42 
     43   // Sets the attached file data and kicks off its compression.
     44   void AttachAndCompressFileData(scoped_ptr<std::string> attached_filedata);
     45 
     46   // Called once we have compressed our system logs.
     47   void OnCompressLogsComplete(scoped_ptr<std::string> compressed_logs);
     48 
     49   // Called once we have compressed our histograms.
     50   void OnCompressHistogramsComplete(
     51       scoped_ptr<std::string> compressed_histograms);
     52 
     53   // Called once we have compressed our attached file.
     54   void OnCompressFileComplete(scoped_ptr<std::string> compressed_file);
     55 
     56   // Returns true if we've completed all the tasks needed before we can send
     57   // feedback - at this time this is includes getting the feedback page data
     58   // and compressing the system logs.
     59   bool IsDataComplete();
     60 
     61   // Sends the feedback report if we have all our data complete.
     62   void SendReport();
     63 
     64   // Getters
     65   Profile* profile() const { return profile_; }
     66   const std::string& category_tag() const { return category_tag_; }
     67   const std::string& page_url() const { return page_url_; }
     68   const std::string& description() const { return description_; }
     69   const std::string& user_email() const { return user_email_; }
     70   std::string* image() const { return image_.get(); }
     71   const std::string attached_filename() const { return attached_filename_; }
     72   const std::string attached_file_uuid() const { return attached_file_uuid_; }
     73   std::string* attached_filedata() const { return attached_filedata_.get(); }
     74   const std::string screenshot_uuid() const { return screenshot_uuid_; }
     75   int trace_id() const { return trace_id_; }
     76   SystemLogsMap* sys_info() const { return sys_info_.get(); }
     77   std::string* compressed_logs() const { return compressed_logs_.get(); }
     78   std::string* histograms() const { return histograms_.get(); }
     79   std::string* compressed_histograms() const {
     80     return compressed_histograms_.get();
     81   }
     82 
     83   // Setters
     84   void set_profile(Profile* profile) { profile_ = profile; }
     85   void set_category_tag(const std::string& category_tag) {
     86     category_tag_ = category_tag;
     87   }
     88   void set_page_url(const std::string& page_url) { page_url_ = page_url; }
     89   void set_description(const std::string& description) {
     90     description_ = description;
     91   }
     92   void set_user_email(const std::string& user_email) {
     93     user_email_ = user_email;
     94   }
     95   void set_image(scoped_ptr<std::string> image) { image_ = image.Pass(); }
     96   void set_attached_filename(const std::string& attached_filename) {
     97     attached_filename_ = attached_filename;
     98   }
     99   void set_attached_file_uuid(const std::string& uuid) {
    100     attached_file_uuid_ = uuid;
    101   }
    102   void set_screenshot_uuid(const std::string& uuid) {
    103     screenshot_uuid_ = uuid;
    104   }
    105   void set_trace_id(int trace_id) { trace_id_ = trace_id; }
    106 
    107  private:
    108   friend class base::RefCountedThreadSafe<FeedbackData>;
    109 
    110   virtual ~FeedbackData();
    111 
    112   void OnGetTraceData(int trace_id,
    113                       scoped_refptr<base::RefCountedString> trace_data);
    114 
    115   Profile* profile_;
    116 
    117   std::string category_tag_;
    118   std::string page_url_;
    119   std::string description_;
    120   std::string user_email_;
    121   scoped_ptr<std::string> image_;
    122   std::string attached_filename_;
    123   scoped_ptr<std::string> attached_filedata_;
    124 
    125   std::string attached_file_uuid_;
    126   std::string screenshot_uuid_;
    127 
    128   int trace_id_;
    129 
    130   scoped_ptr<SystemLogsMap> sys_info_;
    131   scoped_ptr<std::string> compressed_logs_;
    132 
    133   scoped_ptr<std::string> histograms_;
    134   scoped_ptr<std::string> compressed_histograms_;
    135 
    136   // TODO(rkc): Refactor compressing logic into a simpler common implementation.
    137   bool feedback_page_data_complete_;
    138   bool syslogs_compression_complete_;
    139   bool histograms_compression_complete_;
    140   bool attached_file_compression_complete_;
    141   bool report_sent_;
    142 
    143   DISALLOW_COPY_AND_ASSIGN(FeedbackData);
    144 };
    145 
    146 #endif  // CHROME_BROWSER_FEEDBACK_FEEDBACK_DATA_H_
    147