/* * Copyright (C) 2006 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. */ package android.server.data; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import static com.android.internal.util.Objects.nonNull; /** * Crash data transfer object. Keep in sync. with the server side version. */ public class CrashData { final String id; final String activity; final long time; final BuildData buildData; final ThrowableData throwableData; final byte[] state; public CrashData(String id, String activity, BuildData buildData, ThrowableData throwableData) { this.id = nonNull(id); this.activity = nonNull(activity); this.buildData = nonNull(buildData); this.throwableData = nonNull(throwableData); this.time = System.currentTimeMillis(); this.state = null; } public CrashData(String id, String activity, BuildData buildData, ThrowableData throwableData, byte[] state) { this.id = nonNull(id); this.activity = nonNull(activity); this.buildData = nonNull(buildData); this.throwableData = nonNull(throwableData); this.time = System.currentTimeMillis(); this.state = state; } public CrashData(DataInput in) throws IOException { int dataVersion = in.readInt(); if (dataVersion != 0 && dataVersion != 1) { throw new IOException("Expected 0 or 1. Got: " + dataVersion); } this.id = in.readUTF(); this.activity = in.readUTF(); this.time = in.readLong(); this.buildData = new BuildData(in); this.throwableData = new ThrowableData(in); if (dataVersion == 1) { int len = in.readInt(); if (len == 0) { this.state = null; } else { this.state = new byte[len]; in.readFully(this.state, 0, len); } } else { this.state = null; } } public CrashData(String tag, Throwable throwable) { id = ""; activity = tag; buildData = new BuildData(); throwableData = new ThrowableData(throwable); time = System.currentTimeMillis(); state = null; } public void write(DataOutput out) throws IOException { // version if (this.state == null) { out.writeInt(0); } else { out.writeInt(1); } out.writeUTF(this.id); out.writeUTF(this.activity); out.writeLong(this.time); buildData.write(out); throwableData.write(out); if (this.state != null) { out.writeInt(this.state.length); out.write(this.state, 0, this.state.length); } } public BuildData getBuildData() { return buildData; } public ThrowableData getThrowableData() { return throwableData; } public String getId() { return id; } public String getActivity() { return activity; } public long getTime() { return time; } public byte[] getState() { return state; } /** * Return a brief description of this CrashData record. The details of the * representation are subject to change. * * @return Returns a String representing the contents of the object. */ @Override public String toString() { return "[CrashData: id=" + id + " activity=" + activity + " time=" + time + " buildData=" + buildData.toString() + " throwableData=" + throwableData.toString() + "]"; } }