• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef REPORTER_H
18 #define REPORTER_H
19 
20 #include <android/os/IIncidentReportStatusListener.h>
21 #include <android/os/IncidentReportArgs.h>
22 
23 #include <string>
24 #include <vector>
25 
26 #include <time.h>
27 
28 using namespace android;
29 using namespace android::os;
30 using namespace std;
31 
32 // ================================================================================
33 struct ReportRequest : public virtual RefBase
34 {
35     IncidentReportArgs args;
36     sp<IIncidentReportStatusListener> listener;
37     int fd;
38     status_t err;
39 
40     ReportRequest(const IncidentReportArgs& args,
41             const sp<IIncidentReportStatusListener> &listener, int fd);
42     virtual ~ReportRequest();
43 };
44 
45 // ================================================================================
46 class ReportRequestSet
47 {
48 public:
49     ReportRequestSet();
50     ~ReportRequestSet();
51 
52     void add(const sp<ReportRequest>& request);
53     void setMainFd(int fd);
54 
55     // Write to all of the fds for the requests. If a write fails, it stops
56     // writing to that fd and returns NO_ERROR. When we are out of fds to write
57     // to it returns an error.
58     status_t write(uint8_t const* buf, size_t size);
59 
60     typedef vector<sp<ReportRequest>>::iterator iterator;
61 
begin()62     iterator begin() { return mRequests.begin(); }
end()63     iterator end() { return mRequests.end(); }
64 
65 private:
66     vector<sp<ReportRequest>> mRequests;
67     int mWritableCount;
68     int mMainFd;
69 };
70 
71 // ================================================================================
72 class Reporter : public virtual RefBase
73 {
74 public:
75     enum run_report_status_t {
76         REPORT_FINISHED = 0,
77         REPORT_NEEDS_DROPBOX = 1
78     };
79 
80     IncidentReportArgs args;
81     ReportRequestSet batch;
82 
83     Reporter();
84     virtual ~Reporter();
85 
86     // Run the report as described in the batch and args parameters.
87     run_report_status_t runReport();
88 
89     static run_report_status_t upload_backlog();
90 
91 private:
92     string mFilename;
93     off_t mMaxSize;
94     size_t mMaxCount;
95     time_t mStartTime;
96 
97     status_t create_file(int* fd);
98 };
99 
100 
101 #endif // REPORTER_H
102