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.
5 #ifndef COMPONENTS_FEEDBACK_FEEDBACK_COMMON_H_
6 #define COMPONENTS_FEEDBACK_FEEDBACK_COMMON_H_
11 #include "base/files/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"
17 namespace userfeedback
{
18 class ExtensionSubmit
;
21 namespace feedback_util
{
22 bool ZipString(const base::FilePath
& filename
,
23 const std::string
& data
,
24 std::string
* compressed_data
);
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
> {
31 typedef std::map
<std::string
, std::string
> SystemLogsMap
;
34 explicit AttachedFile(const std::string
& filename
,
35 scoped_ptr
<std::string
> data
);
39 scoped_ptr
<std::string
> data
;
42 // Determine if the given feedback value is small enough to not need to
44 static bool BelowCompressionThreshold(const std::string
& content
);
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
);
53 void AddLog(const std::string
& name
, const std::string
& value
);
54 void AddLogs(scoped_ptr
<SystemLogsMap
> logs
);
57 void AddFilesAndLogsToReport(
58 userfeedback::ExtensionSubmit
* feedback_data
) const;
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;
65 const std::string
& category_tag() const { return category_tag_
; }
66 const std::string
& page_url() const { return page_url_
; }
67 const std::string
& description() const { return description_
; }
68 const std::string
& user_email() const { return user_email_
; }
69 const std::string
* image() const { return image_
.get(); }
70 const SystemLogsMap
* sys_info() const { return logs_
.get(); }
71 int32_t product_id() const { return product_id_
; }
72 std::string
user_agent() const { return user_agent_
; }
73 std::string
locale() const { return locale_
; }
75 const AttachedFile
* attachment(size_t i
) const { return attachments_
[i
]; }
76 size_t attachments() const { return attachments_
.size(); }
79 void set_category_tag(const std::string
& category_tag
) {
80 category_tag_
= category_tag
;
82 void set_page_url(const std::string
& page_url
) { page_url_
= page_url
; }
83 void set_description(const std::string
& description
) {
84 description_
= description
;
86 void set_user_email(const std::string
& user_email
) {
87 user_email_
= user_email
;
89 void set_image(scoped_ptr
<std::string
> image
) { image_
= image
.Pass(); }
90 void set_product_id(int32_t product_id
) { product_id_
= product_id
; }
91 void set_user_agent(const std::string
& user_agent
) {
92 user_agent_
= user_agent
;
94 void set_locale(const std::string
& locale
) { locale_
= locale
; }
97 friend class base::RefCountedThreadSafe
<FeedbackCommon
>;
98 friend class FeedbackCommonTest
;
100 virtual ~FeedbackCommon();
103 std::string category_tag_
;
104 std::string page_url_
;
105 std::string description_
;
106 std::string user_email_
;
108 std::string user_agent_
;
111 scoped_ptr
<std::string
> image_
;
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_
;
118 scoped_ptr
<SystemLogsMap
> logs_
;
121 #endif // COMPONENTS_FEEDBACK_FEEDBACK_COMMON_H_