• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_FEEDBACK_FEEDBACK_COMMON_H_
6 #define COMPONENTS_FEEDBACK_FEEDBACK_COMMON_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "base/file_util.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/scoped_vector.h"
15 #include "base/synchronization/lock.h"
16 
17 namespace userfeedback {
18 class ExtensionSubmit;
19 }
20 
21 namespace feedback_util {
22 bool ZipString(const base::FilePath& filename,
23                const std::string& data,
24                std::string* compressed_data);
25 }
26 
27 // This is the base class for FeedbackData. It primarily knows about
28 // data common to all feedback reports and how to zip things.
29 class FeedbackCommon : public base::RefCountedThreadSafe<FeedbackCommon> {
30  public:
31   typedef std::map<std::string, std::string> SystemLogsMap;
32 
33   struct AttachedFile {
34     explicit AttachedFile(const std::string& filename,
35                           scoped_ptr<std::string> data);
36     ~AttachedFile();
37 
38     std::string name;
39     scoped_ptr<std::string> data;
40   };
41 
42   // Determine if the given feedback value is small enough to not need to
43   // be compressed.
44   static bool BelowCompressionThreshold(const std::string& content);
45 
46   FeedbackCommon();
47 
48   void CompressFile(const base::FilePath& filename,
49                     const std::string& zipname,
50                     scoped_ptr<std::string> data);
51   void AddFile(const std::string& filename, scoped_ptr<std::string> data);
52 
53   void AddLog(const std::string& name, const std::string& value);
54   void AddLogs(scoped_ptr<SystemLogsMap> logs);
55   void CompressLogs();
56 
57   void AddFilesAndLogsToReport(
58       userfeedback::ExtensionSubmit* feedback_data) const;
59 
60   // Fill in |feedback_data| with all the data that we have collected.
61   // CompressLogs() must have already been called.
62   void PrepareReport(userfeedback::ExtensionSubmit* feedback_data) const;
63 
64   // Getters
category_tag()65   const std::string& category_tag() const { return category_tag_; }
page_url()66   const std::string& page_url() const { return page_url_; }
description()67   const std::string& description() const { return description_; }
user_email()68   const std::string& user_email() const { return user_email_; }
image()69   const std::string* image() const { return image_.get(); }
sys_info()70   const SystemLogsMap* sys_info() const { return logs_.get(); }
product_id()71   int32_t product_id() const { return product_id_; }
user_agent()72   std::string user_agent() const { return user_agent_; }
locale()73   std::string locale() const { return locale_; }
74 
attachment(size_t i)75   const AttachedFile* attachment(size_t i) const { return attachments_[i]; }
attachments()76   size_t attachments() const { return attachments_.size(); }
77 
78   // Setters
set_category_tag(const std::string & category_tag)79   void set_category_tag(const std::string& category_tag) {
80     category_tag_ = category_tag;
81   }
set_page_url(const std::string & page_url)82   void set_page_url(const std::string& page_url) { page_url_ = page_url; }
set_description(const std::string & description)83   void set_description(const std::string& description) {
84     description_ = description;
85   }
set_user_email(const std::string & user_email)86   void set_user_email(const std::string& user_email) {
87     user_email_ = user_email;
88   }
set_image(scoped_ptr<std::string> image)89   void set_image(scoped_ptr<std::string> image) { image_ = image.Pass(); }
set_product_id(int32_t product_id)90   void set_product_id(int32_t product_id) { product_id_ = product_id; }
set_user_agent(const std::string & user_agent)91   void set_user_agent(const std::string& user_agent) {
92     user_agent_ = user_agent;
93   }
set_locale(const std::string & locale)94   void set_locale(const std::string& locale) { locale_ = locale; }
95 
96  protected:
97   friend class base::RefCountedThreadSafe<FeedbackCommon>;
98   friend class FeedbackCommonTest;
99 
100   virtual ~FeedbackCommon();
101 
102  private:
103   std::string category_tag_;
104   std::string page_url_;
105   std::string description_;
106   std::string user_email_;
107   int32_t product_id_;
108   std::string user_agent_;
109   std::string locale_;
110 
111   scoped_ptr<std::string> image_;
112 
113   // It is possible that multiple attachment add calls are running in
114   // parallel, so synchronize access.
115   base::Lock attachments_lock_;
116   ScopedVector<AttachedFile> attachments_;
117 
118   scoped_ptr<SystemLogsMap> logs_;
119 };
120 
121 #endif  // COMPONENTS_FEEDBACK_FEEDBACK_COMMON_H_
122