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