001 package com.skype.ipc;
002
003 import java.io.BufferedInputStream;
004 import java.io.FileOutputStream;
005 import java.io.IOException;
006 import java.io.InputStream;
007
008 public class LoggedBufferedInputStream extends BufferedInputStream implements InputTransporting {
009
010 public LoggedBufferedInputStream(InputStream in, ClientConfiguration cfg) {
011 super(in);
012 if (cfg.generateTransportLog()) {
013 try {
014 mTransportLog = new FileOutputStream(cfg.getInputTransportLogName());
015 } catch (IOException e) {
016 mTransportLog = null;
017 }
018 }
019 }
020
021 public void skipBytes(final int numBytes) throws IOException {
022 if (mTransportLog != null) {
023 byte[] chunk = new byte[numBytes];
024 readBytes(chunk, 0, numBytes);
025 } else {
026 super.skip(numBytes);
027 }
028 }
029
030 public void readBytes(final byte [] dest) throws IOException {
031 readBytes(dest, 0, dest.length);
032 }
033
034 public void readBytes(final byte [] dest, final int offset, final int numBytes) throws IOException {
035 int consumed = 0;
036 while (consumed < numBytes) {
037 int r = super.read(dest, offset+consumed, numBytes - consumed);
038 if (r == -1) {
039 throw new IOException("EOF");
040 } else {
041 if (mTransportLog != null) {
042 try {
043 mTransportLog.write(dest, offset+consumed, r);
044 } catch (IOException e) {
045 mTransportLog = null;
046 }
047 }
048 consumed += r;
049 if (consumed < numBytes) Thread.yield();
050 }
051 }
052 }
053
054 public int readByte() throws IOException {
055 int b = super.read();
056 if (mTransportLog != null && b != -1) {
057 try {
058 mTransportLog.write(b);
059 } catch (IOException e) {
060 mTransportLog = null;
061 }
062 }
063 return b;
064 }
065
066 public void close() throws IOException {
067 try {
068 if (mTransportLog != null)
069 mTransportLog.close();
070 } catch (IOException e) {
071 }
072 super.close();
073 }
074
075 private FileOutputStream mTransportLog;
076 }
077