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 #pragma once 17 18 #ifndef INCIDENT_SERVICE_H 19 #define INCIDENT_SERVICE_H 20 21 #include "Reporter.h" 22 23 #include "Broadcaster.h" 24 #include "Throttler.h" 25 #include "WorkDirectory.h" 26 27 #include <android/os/BnIncidentManager.h> 28 #include <utils/Looper.h> 29 30 #include <vector> 31 #include <mutex> 32 33 34 namespace android { 35 namespace os { 36 namespace incidentd { 37 38 using namespace android; 39 using namespace android::base; 40 using namespace android::binder; 41 using namespace android::os; 42 43 class BringYourOwnSection; 44 45 // ================================================================================ 46 class ReportHandler : public MessageHandler { 47 public: 48 ReportHandler(const sp<WorkDirectory>& workDirectory, 49 const sp<Broadcaster>& broadcaster, 50 const sp<Looper>& handlerLooper, 51 const sp<Throttler>& throttler, 52 const vector<BringYourOwnSection*>& registeredSections); 53 virtual ~ReportHandler(); 54 55 virtual void handleMessage(const Message& message); 56 57 /** 58 * Schedule a report for the "main" report, where it will be delivered to 59 * the uploaders and/or dropbox. 60 */ 61 void schedulePersistedReport(const IncidentReportArgs& args); 62 63 /** 64 * Adds a ReportRequest to the queue for one that has a listener an and fd 65 */ 66 void scheduleStreamingReport(const IncidentReportArgs& args, 67 const sp<IIncidentReportStatusListener>& listener, 68 int streamFd); 69 70 /** 71 * Resets mBacklogDelay to the default and schedules sending 72 * the messages to dropbox. 73 */ 74 void scheduleSendBacklog(); 75 76 private: 77 mutex mLock; 78 79 sp<WorkDirectory> mWorkDirectory; 80 sp<Broadcaster> mBroadcaster; 81 82 sp<Looper> mHandlerLooper; 83 nsecs_t mBacklogDelay; 84 sp<Throttler> mThrottler; 85 86 const vector<BringYourOwnSection*>& mRegisteredSections; 87 88 sp<ReportBatch> mBatch; 89 90 /** 91 * Runs all of the reports that have been queued. 92 */ 93 void take_report(); 94 95 /** 96 * Schedules permission controller approve the reports. 97 */ 98 void schedule_send_approvals_locked(); 99 100 /** 101 * Sends the approvals to the PermissionController 102 */ 103 void send_approvals(); 104 105 /** 106 * Schedules the broadcasts that reports are complete mBacklogDelay nanoseconds from now. 107 * The delay is because typically when an incident report is taken, the system is not 108 * really in a happy state. So we wait a bit before sending the report to let things 109 * quiet down if they can. The urgency is in taking the report, not sharing the report. 110 * However, we don 111 */ 112 void schedule_send_broadcasts_locked(); 113 114 /** 115 * Sends the broadcasts to the dropbox service. 116 */ 117 void send_broadcasts(); 118 }; 119 120 // ================================================================================ 121 class IncidentService : public BnIncidentManager { 122 public: 123 explicit IncidentService(const sp<Looper>& handlerLooper); 124 virtual ~IncidentService(); 125 126 virtual Status reportIncident(const IncidentReportArgs& args); 127 128 virtual Status reportIncidentToStream(const IncidentReportArgs& args, 129 const sp<IIncidentReportStatusListener>& listener, 130 unique_fd stream); 131 132 virtual Status reportIncidentToDumpstate(unique_fd stream, 133 const sp<IIncidentReportStatusListener>& listener); 134 135 virtual Status registerSection(int id, const String16& name, 136 const sp<IIncidentDumpCallback>& callback); 137 138 virtual Status unregisterSection(int id); 139 140 virtual Status systemRunning(); 141 142 virtual Status getIncidentReportList(const String16& pkg, const String16& cls, 143 vector<String16>* result); 144 145 virtual Status getIncidentReport(const String16& pkg, const String16& cls, 146 const String16& id, IncidentManager::IncidentReport* result); 147 148 virtual Status deleteIncidentReports(const String16& pkg, const String16& cls, 149 const String16& id); 150 151 virtual Status deleteAllIncidentReports(const String16& pkg); 152 153 // Implement commands for debugging purpose. 154 virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, 155 uint32_t flags) override; 156 virtual status_t command(FILE* in, FILE* out, FILE* err, Vector<String8>& args); 157 158 private: 159 sp<WorkDirectory> mWorkDirectory; 160 sp<Broadcaster> mBroadcaster; 161 sp<ReportHandler> mHandler; 162 sp<Throttler> mThrottler; 163 vector<BringYourOwnSection*> mRegisteredSections; 164 165 /** 166 * Commands print out help. 167 */ 168 status_t cmd_help(FILE* out); 169 170 /** 171 * Commands related to privacy filtering. 172 */ 173 status_t cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<String8>& args); 174 }; 175 176 } // namespace incidentd 177 } // namespace os 178 } // namespace android 179 180 #endif // INCIDENT_SERVICE_H 181