| /** | |
| * Copyright (c) 2020, The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #define LOG_TAG "libincident" | |
| #include <incident/incident_report.h> | |
| #include <android/os/IIncidentManager.h> | |
| #include <android/os/IncidentReportArgs.h> | |
| #include <binder/IServiceManager.h> | |
| #include <binder/Status.h> | |
| #include <log/log.h> | |
| using android::sp; | |
| using android::binder::Status; | |
| using android::os::IncidentReportArgs; | |
| using android::os::IIncidentManager; | |
| using std::string; | |
| using std::vector; | |
| AIncidentReportArgs* AIncidentReportArgs_init() { | |
| return reinterpret_cast<AIncidentReportArgs*>(new IncidentReportArgs()); | |
| } | |
| AIncidentReportArgs* AIncidentReportArgs_clone(AIncidentReportArgs* that) { | |
| return reinterpret_cast<AIncidentReportArgs*>( | |
| new IncidentReportArgs(*reinterpret_cast<IncidentReportArgs*>(that))); | |
| } | |
| void AIncidentReportArgs_delete(AIncidentReportArgs* args) { | |
| delete reinterpret_cast<IncidentReportArgs*>(args); | |
| } | |
| void AIncidentReportArgs_setAll(AIncidentReportArgs* args, bool all) { | |
| reinterpret_cast<IncidentReportArgs*>(args)->setAll(all); | |
| } | |
| void AIncidentReportArgs_setPrivacyPolicy(AIncidentReportArgs* args, int privacyPolicy) { | |
| reinterpret_cast<IncidentReportArgs*>(args)->setPrivacyPolicy(privacyPolicy); | |
| } | |
| void AIncidentReportArgs_addSection(AIncidentReportArgs* args, int section) { | |
| reinterpret_cast<IncidentReportArgs*>(args)->addSection(section); | |
| } | |
| void AIncidentReportArgs_setReceiverPackage(AIncidentReportArgs* args, char const* pkg) { | |
| reinterpret_cast<IncidentReportArgs*>(args)->setReceiverPkg(string(pkg)); | |
| } | |
| void AIncidentReportArgs_setReceiverClass(AIncidentReportArgs* args, char const* cls) { | |
| reinterpret_cast<IncidentReportArgs*>(args)->setReceiverCls(string(cls)); | |
| } | |
| void AIncidentReportArgs_addHeader(AIncidentReportArgs* args, uint8_t const* buf, size_t size) { | |
| vector<uint8_t> vec(buf, buf+size); | |
| reinterpret_cast<IncidentReportArgs*>(args)->addHeader(vec); | |
| } | |
| int AIncidentReportArgs_takeReport(AIncidentReportArgs* argp) { | |
| IncidentReportArgs* args = reinterpret_cast<IncidentReportArgs*>(argp); | |
| sp<IIncidentManager> service = android::interface_cast<IIncidentManager>( | |
| android::defaultServiceManager()->getService(android::String16("incident"))); | |
| if (service == nullptr) { | |
| ALOGW("Failed to fetch incident service."); | |
| return false; | |
| } | |
| Status s = service->reportIncident(*args); | |
| return s.transactionError(); | |
| } |