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