11754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/*
21754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Copyright (C) 2016 The Android Open Source Project
31754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
41754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * you may not use this file except in compliance with the License.
61754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * You may obtain a copy of the License at
71754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
81754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Unless required by applicable law or agreed to in writing, software
111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * See the License for the specific language governing permissions and
141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * limitations under the License.
151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
16b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin#pragma once
171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#ifndef REPORTER_H
191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#define REPORTER_H
201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <android/os/IIncidentReportStatusListener.h>
221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <android/os/IncidentReportArgs.h>
231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
24329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin#include <map>
251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <string>
261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <vector>
271754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <time.h>
291754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
304e843106a6f510a7d77fedfbeaec8e95b57905b7Yi Jin#include "Throttler.h"
314e843106a6f510a7d77fedfbeaec8e95b57905b7Yi Jin#include "frameworks/base/libs/incident/proto/android/os/metadata.pb.h"
324e843106a6f510a7d77fedfbeaec8e95b57905b7Yi Jin
336cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinnamespace android {
346cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinnamespace os {
356cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinnamespace incidentd {
361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
38b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jinstruct ReportRequest : public virtual RefBase {
391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    IncidentReportArgs args;
401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    sp<IIncidentReportStatusListener> listener;
411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int fd;
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    status_t err;
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
44b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    ReportRequest(const IncidentReportArgs& args, const sp<IIncidentReportStatusListener>& listener,
45b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin                  int fd);
461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual ~ReportRequest();
47edfd5bb7888899976762623a4c940710026480eaYi Jin
48b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    bool ok();  // returns true if the request is ok for write.
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
52b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jinclass ReportRequestSet {
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratopublic:
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ReportRequestSet();
551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ~ReportRequestSet();
561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    void add(const sp<ReportRequest>& request);
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    void setMainFd(int fd);
593ec5cc792e932dc668bf9fb2cf5e6c6288a7f9b4Yi Jin    void setMainDest(int dest);
601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    typedef vector<sp<ReportRequest>>::iterator iterator;
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    iterator begin() { return mRequests.begin(); }
641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    iterator end() { return mRequests.end(); }
651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
6699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin    int mainFd() { return mMainFd; }
673ec5cc792e932dc668bf9fb2cf5e6c6288a7f9b4Yi Jin    int mainDest() { return mMainDest; }
68329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin    IncidentMetadata& metadata() { return mMetadata; }
6986dce413f808ca9ef160e8762f74deaafd7c23aeYi Jin    map<int, IncidentMetadata::SectionStats>& allSectionStats() { return mSectionStats; }
70329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin
71329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin    bool containsSection(int id);
72329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin    IncidentMetadata::SectionStats* sectionStats(int id);
73329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin
741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoprivate:
751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    vector<sp<ReportRequest>> mRequests;
76add11e9176f2a5a2e5193726b863d03c281a4eddYi Jin    IncidentReportArgs mSections;
771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    int mMainFd;
783ec5cc792e932dc668bf9fb2cf5e6c6288a7f9b4Yi Jin    int mMainDest;
79329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin
80329130b7e40d27f660aa275ef6905bd7ee91f64cYi Jin    IncidentMetadata mMetadata;
8186dce413f808ca9ef160e8762f74deaafd7c23aeYi Jin    map<int, IncidentMetadata::SectionStats> mSectionStats;
821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato// ================================================================================
85b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jinclass Reporter : public virtual RefBase {
861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratopublic:
87b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    enum run_report_status_t { REPORT_FINISHED = 0, REPORT_NEEDS_DROPBOX = 1 };
881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    ReportRequestSet batch;
901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
91b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    Reporter();                       // PROD must use this constructor.
92b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    Reporter(const char* directory);  // For testing purpose only.
931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    virtual ~Reporter();
941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    // Run the report as described in the batch and args parameters.
964e843106a6f510a7d77fedfbeaec8e95b57905b7Yi Jin    run_report_status_t runReport(size_t* reportByteSize);
971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    static run_report_status_t upload_backlog();
991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoprivate:
101add11e9176f2a5a2e5193726b863d03c281a4eddYi Jin    String8 mIncidentDirectory;
102add11e9176f2a5a2e5193726b863d03c281a4eddYi Jin
1031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    string mFilename;
1041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    off_t mMaxSize;
1051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    size_t mMaxCount;
1061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    time_t mStartTime;
1071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    status_t create_file(int* fd);
109add11e9176f2a5a2e5193726b863d03c281a4eddYi Jin
110b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin    bool isTest = true;  // default to true for testing
1111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato};
1121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1136cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin}  // namespace incidentd
1146cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin}  // namespace os
1156cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin}  // namespace android
1166cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin
117b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin#endif  // REPORTER_H
118