/**
* Copyright (c) 2016, 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 "dumpstate"
#include <android/os/IncidentReportArgs.h>
#include <log/log.h>
namespace android {
namespace os {
IncidentReportArgs::IncidentReportArgs()
:mSections(),
mAll(false),
mPrivacyPolicy(-1)
{
}
IncidentReportArgs::IncidentReportArgs(const IncidentReportArgs& that)
:mSections(that.mSections),
mHeaders(that.mHeaders),
mAll(that.mAll),
mPrivacyPolicy(that.mPrivacyPolicy),
mReceiverPkg(that.mReceiverPkg),
mReceiverCls(that.mReceiverCls)
{
}
IncidentReportArgs::~IncidentReportArgs()
{
}
status_t
IncidentReportArgs::writeToParcel(Parcel* out) const
{
status_t err;
err = out->writeInt32(mAll);
if (err != NO_ERROR) {
return err;
}
err = out->writeInt32(mSections.size());
if (err != NO_ERROR) {
return err;
}
for (set<int>::const_iterator it=mSections.begin(); it!=mSections.end(); it++) {
err = out->writeInt32(*it);
if (err != NO_ERROR) {
return err;
}
}
err = out->writeInt32(mHeaders.size());
if (err != NO_ERROR) {
return err;
}
for (vector<vector<uint8_t>>::const_iterator it = mHeaders.begin(); it != mHeaders.end(); it++) {
err = out->writeByteVector(*it);
if (err != NO_ERROR) {
return err;
}
}
err = out->writeInt32(mPrivacyPolicy);
if (err != NO_ERROR) {
return err;
}
err = out->writeString16(String16(mReceiverPkg.c_str()));
if (err != NO_ERROR) {
return err;
}
err = out->writeString16(String16(mReceiverCls.c_str()));
if (err != NO_ERROR) {
return err;
}
return NO_ERROR;
}
status_t
IncidentReportArgs::readFromParcel(const Parcel* in)
{
status_t err;
int32_t all;
err = in->readInt32(&all);
if (err != NO_ERROR) {
return err;
}
if (all != 0) {
mAll = all;
}
mSections.clear();
int32_t sectionCount;
err = in->readInt32(§ionCount);
if (err != NO_ERROR) {
return err;
}
for (int i=0; i<sectionCount; i++) {
int32_t section;
err = in->readInt32(§ion);
if (err != NO_ERROR) {
return err;
}
mSections.insert(section);
}
int32_t headerCount;
err = in->readInt32(&headerCount);
if (err != NO_ERROR) {
return err;
}
mHeaders.resize(headerCount);
for (int i=0; i<headerCount; i++) {
err = in->readByteVector(&mHeaders[i]);
if (err != NO_ERROR) {
return err;
}
}
int32_t privacyPolicy;
err = in->readInt32(&privacyPolicy);
if (err != NO_ERROR) {
return err;
}
mPrivacyPolicy = privacyPolicy;
mReceiverPkg = String8(in->readString16()).string();
mReceiverCls = String8(in->readString16()).string();
return OK;
}
void
IncidentReportArgs::setAll(bool all)
{
mAll = all;
if (all) {
mSections.clear();
}
}
void
IncidentReportArgs::setPrivacyPolicy(int privacyPolicy)
{
mPrivacyPolicy = privacyPolicy;
}
void
IncidentReportArgs::addSection(int section)
{
if (!mAll) {
mSections.insert(section);
}
}
void
IncidentReportArgs::setReceiverPkg(const string& pkg)
{
mReceiverPkg = pkg;
}
void
IncidentReportArgs::setReceiverCls(const string& cls)
{
mReceiverCls = cls;
}
void
IncidentReportArgs::addHeader(const vector<uint8_t>& headerProto)
{
mHeaders.push_back(headerProto);
}
bool
IncidentReportArgs::containsSection(int section, bool specific) const
{
if (specific) {
return mSections.find(section) != mSections.end();
} else {
return mAll || mSections.find(section) != mSections.end();
}
}
void
IncidentReportArgs::merge(const IncidentReportArgs& that)
{
for (const vector<uint8_t>& header: that.mHeaders) {
mHeaders.push_back(header);
}
if (!mAll) {
if (that.mAll) {
mAll = true;
mSections.clear();
} else {
for (set<int>::const_iterator it=that.mSections.begin();
it!=that.mSections.end(); it++) {
mSections.insert(*it);
}
}
}
}
}
}