Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 853dd7d2 authored by Roman Kiryanov's avatar Roman Kiryanov
Browse files

Cleanup in EmulatorClipboardMonitor (3)



make more functions static, less places to
mess with the global state.

Bug: 231345789
Test: presubmit
Signed-off-by: default avatarRoman Kiryanov <rkir@google.com>
Change-Id: I236b039c4fbbbfb519ba1432326bba9a89d008c2
Merged-In: I236b039c4fbbbfb519ba1432326bba9a89d008c2
parent 185fd896
Loading
Loading
Loading
Loading
+31 −32
Original line number Diff line number Diff line
@@ -82,11 +82,8 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
        return null;
    }

    private void openPipe() throws InterruptedException {
        FileDescriptor fd = getPipeFD();

        if (fd == null) {
            fd = openPipeImpl();
    private static FileDescriptor openPipe() throws InterruptedException {
        FileDescriptor fd = openPipeImpl();

        // There's no guarantee that QEMU pipes will be ready at the moment
        // this method is invoked. We simply try to get the pipe open and
@@ -95,32 +92,21 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
            Thread.sleep(100);
            fd = openPipeImpl();
        }
        }

        setPipeFD(fd);
    }

    private synchronized void closePipe() {
        try {
            final FileDescriptor fd = mPipe;
            mPipe = null;
            if (fd != null) {
                Os.close(fd);
            }
        } catch (ErrnoException ignore) {
        }
        return fd;
    }

    private byte[] receiveMessage() throws ErrnoException, InterruptedIOException, EOFException {
    private static byte[] receiveMessage(final FileDescriptor fd) throws ErrnoException,
            InterruptedIOException, EOFException {
        final byte[] lengthBits = new byte[4];
        readFully(mPipe, lengthBits, 0, lengthBits.length);
        readFully(fd, lengthBits, 0, lengthBits.length);

        final ByteBuffer bb = ByteBuffer.wrap(lengthBits);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        final int msgLen = bb.getInt();

        final byte[] msg = new byte[msgLen];
        readFully(mPipe, msg, 0, msg.length);
        readFully(fd, msg, 0, msg.length);

        return msg;
    }
@@ -139,11 +125,16 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {

    EmulatorClipboardMonitor(final Consumer<ClipData> setAndroidClipboard) {
        this.mHostMonitorThread = new Thread(() -> {
            FileDescriptor fd = null;

            while (!Thread.interrupted()) {
                try {
                    openPipe();
                    if (fd == null) {
                        fd = openPipe();
                        setPipeFD(fd);
                    }

                    final byte[] receivedData = receiveMessage();
                    final byte[] receivedData = receiveMessage(fd);

                    final String str = new String(receivedData);
                    final ClipData clip = new ClipData("host clipboard",
@@ -154,9 +145,17 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
                        Slog.i(TAG, "Setting the guest clipboard to '" + str + "'");
                    }
                    setAndroidClipboard.accept(clip);
                } catch (ErrnoException | EOFException | InterruptedIOException e) {
                    closePipe();
                } catch (InterruptedException | IllegalArgumentException e) {
                } catch (ErrnoException | EOFException | InterruptedIOException
                         | InterruptedException e) {
                    setPipeFD(null);

                    try {
                        Os.close(fd);
                    } catch (ErrnoException e2) {
                        // ignore
                    }

                    fd = null;
                }
            }
        });