15c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez/* 25c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Copyright (C) 2017 The Android Open Source Project 35c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * 45c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Licensed under the Apache License, Version 2.0 (the "License"); 55c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * you may not use this file except in compliance with the License. 65c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * You may obtain a copy of the License at 75c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * 85c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * http://www.apache.org/licenses/LICENSE-2.0 95c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * 105c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Unless required by applicable law or agreed to in writing, software 115c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * distributed under the License is distributed on an "AS IS" BASIS, 125c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * See the License for the specific language governing permissions and 145c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * limitations under the License. 155c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez */ 165c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 175c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezpackage com.android.layout.remote.util; 185c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 195c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.layout.remote.util.RemoteInputStream.EndOfStreamException; 205c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport com.android.tools.layoutlib.annotations.NotNull; 215c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 225c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.io.IOException; 235c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.io.InputStream; 245c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezimport java.rmi.RemoteException; 255c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 265c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perezpublic class StreamUtil { 275c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez /** 285c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez * Returns a local {@link InputStream} from a {@link RemoteInputStream} 295c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez */ 305c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @NotNull 315c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public static InputStream getInputStream(@NotNull RemoteInputStream is) { 325c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return new InputStream() { 335c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 345c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public int read() throws IOException { 355c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return is.read(); 365c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 375c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 385c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @SuppressWarnings("NullableProblems") 395c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 405c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public int read(byte[] b) throws IOException { 415c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return read(b, 0, b.length); 425c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 435c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 445c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @SuppressWarnings("NullableProblems") 455c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 465c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public int read(byte[] b, int off, int len) throws IOException { 475c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 485c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez byte[] read = is.read(off, len); 495c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez int actualLength = Math.min(len, read.length); 505c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez System.arraycopy(read, 0, b, off, actualLength); 515c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return actualLength; 525c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (EndOfStreamException e) { 535c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return -1; 545c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 555c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 565c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 575c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 585c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public long skip(long n) throws IOException { 595c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return is.skip(n); 605c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 615c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 625c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 635c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public int available() throws IOException { 645c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return is.available(); 655c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 665c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 675c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 685c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public void close() throws IOException { 695c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez is.close(); 705c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 715c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 725c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 735c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public synchronized void mark(int readlimit) { 745c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 755c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez is.mark(readlimit); 765c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 775c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 785c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 795c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 805c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 815c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 825c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public synchronized void reset() throws IOException { 835c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez is.reset(); 845c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 855c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez 865c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez @Override 875c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez public boolean markSupported() { 885c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez try { 895c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez return is.markSupported(); 905c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } catch (RemoteException e) { 915c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez throw new RuntimeException(e); 925c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 935c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 945c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez }; 955c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez } 965c5efc433eb4cc81f59bcfaf28f5e72b38f7a829Diego Perez} 97