vnc: Initial binder service

Use aidl-cpp to generate binder boilerplate from an initial
interface description. This will allow configuring the service
from within Android.
diff --git a/src/VNCFlinger.cpp b/src/VNCFlinger.cpp
index a637c47..cd7da0f 100644
--- a/src/VNCFlinger.cpp
+++ b/src/VNCFlinger.cpp
@@ -41,21 +41,23 @@
     String8 v4("127.0.0.1");
     String8 v6("::1");
 
-    setListenAddress(v4, false);
-    setListenAddress(v6, true);
+    setV4Address(v4);
+    setV6Address(v6);
 }
 
-status_t VNCFlinger::setListenAddress(String8& address, bool v6) {
-    if (v6) {
-        mVNCScreen->listen6Interface = const_cast<char *>(address.string());
-        return NO_ERROR;
-    }
+status_t VNCFlinger::setV4Address(const String8& address) {
     if (!rfbStringToAddr(const_cast<char *>(address.string()), &(mVNCScreen->listenInterface))) {
         return BAD_VALUE;
     }
     return NO_ERROR;
 }
 
+status_t VNCFlinger::setV6Address(const String8& address) {
+    ALOGD("v6: %s", const_cast<char *>(address.string()));
+    mVNCScreen->listen6Interface = const_cast<char *>(address.string());
+    return NO_ERROR;
+}
+
 status_t VNCFlinger::setPort(unsigned int port) {
     if (port > 65535) {
         port = 0;
@@ -76,7 +78,7 @@
     return OK;
 }
 
-status_t VNCFlinger::setPassword(String8& passwd) {
+status_t VNCFlinger::setPassword(const String8& passwd) {
     String8 path(VNC_AUTH_FILE);
     if (rfbEncryptAndStorePasswd(const_cast<char *>(passwd.string()),
                                  const_cast<char *>(path.string())) != 0) {
diff --git a/src/VNCFlinger.h b/src/VNCFlinger.h
index 7433f0c..856bbb7 100644
--- a/src/VNCFlinger.h
+++ b/src/VNCFlinger.h
@@ -23,6 +23,7 @@
 #include <utils/String8.h>
 
 #include <rfb/rfb.h>
+#undef max
 
 #define VNC_AUTH_FILE "/data/system/vncauth"
 #define NUM_BUFS 1
@@ -42,11 +43,12 @@
     virtual size_t addClient();
     virtual size_t removeClient();
 
-    virtual status_t setListenAddress(String8& address, bool v6);
     virtual status_t setPort(unsigned int port);
+    virtual status_t setV4Address(const String8& address);
+    virtual status_t setV6Address(const String8& address);
 
     virtual status_t clearPassword();
-    virtual status_t setPassword(String8& passwd);
+    virtual status_t setPassword(const String8& passwd);
 
   private:
     class FrameListener : public CpuConsumer::FrameAvailableListener {
diff --git a/src/VNCService.h b/src/VNCService.h
new file mode 100644
index 0000000..6362798
--- /dev/null
+++ b/src/VNCService.h
@@ -0,0 +1,50 @@
+#include "org/chemlab/BnVNCService.h"
+
+#include "VNCFlinger.h"
+
+namespace android {
+
+class VNCService : public org::chemlab::BnVNCService {
+
+public:
+    VNCService(sp<VNCFlinger> flinger) : mVNC(flinger) {}
+
+    binder::Status start(bool* ret) {
+        *ret = mVNC->start();
+        return binder::Status::ok();
+    }
+
+    binder::Status stop(bool* ret) {
+        *ret = mVNC->stop() == NO_ERROR;
+        return binder::Status::ok();
+    }
+
+    binder::Status setPort(int32_t port, bool* ret) {
+        *ret = mVNC->setPort(port) == NO_ERROR;
+        return binder::Status::ok();
+    }
+
+    binder::Status setV4Address(const String16& addr, bool* ret) {
+        *ret = mVNC->setV4Address(String8(addr)) == NO_ERROR;
+        return binder::Status::ok();
+    }
+
+    binder::Status setV6Address(const String16& addr, bool* ret) {
+        *ret = mVNC->setV6Address(String8(addr)) == NO_ERROR;
+        return binder::Status::ok();
+    }
+
+    binder::Status setPassword(const String16& addr, bool* ret) {
+        *ret = mVNC->setPassword(String8(addr)) == NO_ERROR;
+        return binder::Status::ok();
+    }
+
+    binder::Status clearPassword(bool* ret) {
+        *ret = mVNC->clearPassword() == NO_ERROR;
+        return binder::Status::ok();
+    }
+
+private:
+    sp<VNCFlinger> mVNC;
+};
+};
diff --git a/src/main.cpp b/src/main.cpp
index 8ef24fb..e1e8ac1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -19,7 +19,10 @@
 #include <csignal>
 #include <iostream>
 
+#include <binder/IServiceManager.h>
+
 #include "VNCFlinger.h"
+#include "VNCService.h"
 
 using namespace android;
 
@@ -84,7 +87,7 @@
 
             case '4':
                 arg = optarg;
-                if (gVNC->setListenAddress(arg, false) != OK) {
+                if (gVNC->setV4Address(arg) != OK) {
                     std::cerr << "Failed to set IPv4 address\n";
                     exit(1);
                 }
@@ -92,14 +95,13 @@
 
             case '6':
                 arg = optarg;
-                if (gVNC->setListenAddress(arg, true) != OK) {
+                if (gVNC->setV6Address(arg) != OK) {
                     std::cerr << "Failed to set IPv6 address\n";
                     exit(1);
                 }
                 break;
 
             case 'p':
-                std::cerr << "port=" << optarg << std::endl;
                 if (gVNC->setPort(std::stoi(optarg)) != OK) {
                     std::cerr << "Failed to set port\n";
                     exit(1);
@@ -127,5 +129,8 @@
 
     parseArgs(argc, argv);
 
+    // binder interface
+    defaultServiceManager()->addService(String16("vnc"), new VNCService(gVNC));
+
     gVNC->start();
 }