vnc: Simplify everything

Previous design was using extra threads needlessly and had some
hacky data sharing going on. Slim this down to just two classes
and utilize threads appropriately.
diff --git a/src/VNCFlinger.h b/src/VNCFlinger.h
index 8c026b9..4535fb6 100644
--- a/src/VNCFlinger.h
+++ b/src/VNCFlinger.h
@@ -1,8 +1,7 @@
 #ifndef VNCFLINGER_H
 #define VNCFLINGER_H
 
-#include "VirtualDisplay.h"
-
+#include <gui/CpuConsumer.h>
 #include <ui/DisplayInfo.h>
 
 #include "rfb/rfb.h"
@@ -27,39 +26,67 @@
     virtual size_t addClient();
     virtual size_t removeClient();
 
-    virtual void markFrame(void* frame, size_t stride);
 
 private:
 
-    virtual status_t setup_l();
-    virtual void release_l();
+    class FrameListener : public CpuConsumer::FrameAvailableListener {
+    public:
+        FrameListener(VNCFlinger *vnc) : mVNC(vnc) {}
 
+        virtual void onFrameAvailable(const BufferItem& item);
+
+    private:
+        FrameListener(FrameListener&) {}
+        VNCFlinger *mVNC;
+    };
+
+    virtual void eventLoop();
+
+    virtual status_t createVirtualDisplay();
+    virtual status_t destroyVirtualDisplay();
+    virtual status_t createVNCServer();
+
+    virtual void processFrame();
+
+    // vncserver callbacks
     static ClientGoneHookPtr onClientGone(rfbClientPtr cl);
     static enum rfbNewClientAction onNewClient(rfbClientPtr cl);
     static void onFrameStart(rfbClientPtr cl);
     static void onFrameDone(rfbClientPtr cl, int result);
     static void rfbLogger(const char *format, ...);
 
-    Condition mCondition;
+    bool mRunning;
+    bool mFrameAvailable;
+
+    Mutex mEventMutex;
+    Mutex mUpdateMutex;
+
+    Condition mEventCond;
 
     rfbScreenInfoPtr mVNCScreen;
     uint8_t *mVNCBuf;
 
     uint32_t mWidth, mHeight;
-    bool mRotate;
 
     sp<IBinder> mMainDpy;
     DisplayInfo mMainDpyInfo;
-    
-    Mutex mMutex;
-    static Mutex sUpdateMutex;
-
-    sp<VirtualDisplay> mVirtualDisplay;
 
     int mArgc;
     char **mArgv;
 
     size_t mClientCount;
+
+    sp<FrameListener> mListener;
+
+    // Producer side of queue, passed into the virtual display.
+    sp<IGraphicBufferProducer> mProducer;
+
+    // This receives frames from the virtual display and makes them available
+    sp<CpuConsumer> mCpuConsumer;
+
+    // The virtual display instance
+    sp<IBinder> mDpy;
+
 };
 
 };