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();
}