blob: 4d98ef494b771b2c180b7bf1c3936787d049d792 [file] [log] [blame]
/*
* Copyright (C) 2019 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 com.android.tradefed.util;
import com.android.ddmlib.IShellOutputReceiver;
import com.android.tradefed.log.LogUtil.CLog;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.annotation.Nullable;
/** Utility subclass of OutputStream that writes into an IShellOutputReceiver. */
public final class ShellOutputReceiverStream extends OutputStream {
private IShellOutputReceiver mReceiver;
private FileOutputStream mFileOutput;
/**
* Create a new adapter for the given {@link IShellOutputReceiver}.
*
* <p>It is valid to provide a null receiver here to simplify code using the adapter, i.e. so
* that it can use this with try-with-resources without checking for a null receiver itself.
*/
public ShellOutputReceiverStream(@Nullable IShellOutputReceiver receiver) {
mReceiver = receiver;
}
public ShellOutputReceiverStream(
@Nullable IShellOutputReceiver receiver, @Nullable FileOutputStream fileOutput) {
this(receiver);
mFileOutput = fileOutput;
}
@Override
public void write(int b) {
if (mReceiver == null) {
return;
}
final byte converted = (byte) (b & 0xFF);
mReceiver.addOutput(new byte[] {converted}, 0, 1);
}
@Override
public void write(byte[] b) {
write(b, 0, b.length);
}
@Override
public void write(byte[] b, int off, int len) {
if (mReceiver == null) {
return;
}
mReceiver.addOutput(b, off, len);
if (mFileOutput != null) {
try {
mFileOutput.write(b, off, len);
} catch (IOException e) {
CLog.e(e);
}
}
}
@Override
public void flush() throws IOException {
super.flush();
if (mReceiver == null) {
return;
}
mReceiver.flush();
if (mFileOutput != null) {
mFileOutput.flush();
}
}
@Override
public void close() throws IOException {
super.close();
StreamUtil.close(mFileOutput);
}
}