Begin processing read commands. master
authorRobert Sesek <rsesek@chromium.org>
Thu, 22 Jan 2015 04:52:59 +0000 (23:52 -0500)
committerRobert Sesek <rsesek@chromium.org>
Thu, 22 Jan 2015 04:52:59 +0000 (23:52 -0500)
jni/minibind/channel.cc
jni/minibind/channel.h
jni/minibind/command.cc
jni/minibind/common.h
jni/minibind/minibind.cc
jni/minibind/parcel.cc
jni/minibind/parcel.h
run_tests.sh

index 717cbb8d42549456ea39c35093682ea851baced4..ab9b4c2c483905fa04813931bc852f31fb69880f 100644 (file)
@@ -107,7 +107,79 @@ int Channel::Call(uint32_t code, const Parcel& in, Parcel* out) {
 
   int rv = ioctl(driver_, BINDER_WRITE_READ, &bwr);
   ALOG("BINDER_WRITE_READ %d (written %d/%d, read %d/%d)", rv, bwr.write_consumed, bwr.write_size, bwr.read_consumed, bwr.read_size);
+  if (rv != 0)
+    return -errno;
+
+  for (binder_size_t index = 0;
+       index < bwr.read_consumed;
+       index = reader_.DataPosition()) {
+    size_t remaining = bwr.read_consumed - index;
+    if (remaining < sizeof(uint32_t))
+      break;
+
+    uint32_t command = 0;
+    if (!reader_.ReadUInt32(&command))
+      break;
+
+    if (!ProcessCommand(command, remaining))
+      break;
+  }
+
   return rv;
 }
 
+bool Channel::ProcessCommand(uint32_t command, size_t data_remaining) {
+  ALOG("ProcessCommand: 0x%x", command);
+  switch (command) {
+    case BR_ERROR: {
+      if (data_remaining < sizeof(int))
+        return false;
+
+      uint32_t error_code = 0;
+      if (!reader_.ReadUInt32(&error_code))
+        return false;
+
+      ALOG("BR_ERROR: %d", error_code);
+      break;
+    }
+    case BR_OK:
+      ALOG("BR_OK");
+      break;
+    case BR_TRANSACTION:
+      break;
+    case BR_REPLY:
+      break;
+    case BR_ACQUIRE_RESULT:
+      break;
+    case BR_DEAD_REPLY:
+      break;
+    case BR_TRANSACTION_COMPLETE:
+      break;
+    case BR_INCREFS:
+      break;
+    case BR_ACQUIRE:
+      break;
+    case BR_RELEASE:
+      break;
+    case BR_DECREFS:
+      break;
+    case BR_ATTEMPT_ACQUIRE:
+      break;
+    case BR_NOOP:
+      ALOG("BR_NOOP");
+      break;
+    case BR_SPAWN_LOOPER:
+      break;
+    case BR_FINISHED:
+      break;
+    case BR_DEAD_BINDER:
+      break;
+    case BR_CLEAR_DEATH_NOTIFICATION_DONE:
+      break;
+    case BR_FAILED_REPLY:
+      ALOG("BR_FAILED_REPLY");
+      break;
+  };
+}
+
 }  // namespace minibind
index edfa500cef310a6e7abfe3c6401289a867371c79..1f8a7dfebe822ce100fd534cc14bcfbec3ddc2e4 100644 (file)
@@ -34,6 +34,8 @@ class Channel {
   uint32_t handle() const { return handle_; }
 
  private:
+  bool ProcessCommand(uint32_t command, size_t data_remaining);
+
   uint32_t handle_;
   int driver_;
 
index d6f060d8d7ce1a66bc60ac8318741f52b1c27540..2465ecfdf39955daf4377d193ef000a8aed42240 100644 (file)
@@ -10,7 +10,8 @@
 namespace minibind {
 
 TransactionCommand::TransactionCommand(TransactionCommand::Type type)
-    : command_(type == TWO_WAY ? BC_TRANSACTION : BC_REPLY) {
+    : command_(type == TWO_WAY ? BC_TRANSACTION : BC_REPLY),
+      transaction_() {
 }
 
 TransactionCommand::~TransactionCommand() {}
index 2384af96d12b935964711da6c49742830afeea3c..f9002f88890904ad394a2c493c29cb0c8dfeebdd 100644 (file)
@@ -6,8 +6,10 @@
 
 #include <android/log.h>
 #include <errno.h>
+#include <stdio.h>
 
-#define ALOG(...) __android_log_print(ANDROID_LOG_WARN, "minibind", __VA_ARGS__)
+//#define ALOG(...) __android_log_print(ANDROID_LOG_WARN, "minibind", __VA_ARGS__)
+#define ALOG(...) printf(__VA_ARGS__); putc('\n', stdout)
 
 #define AERR(msg) ALOG(msg ": %s", strerror(errno))
 
index d39b3d8e26fe0e5ebcd3e88515a3dcb05913e456..fdc23a9ed183b69028943c76fe4902c4c4df4a84 100644 (file)
@@ -20,7 +20,7 @@ Channel* GetServiceManager() {
 
     Parcel in, out;
     service_manager->Call(Channel::PING_TRANSACTION, in, &out);
-    service_manager->reader()->Print();
+    //service_manager->reader()->Print();
   }
 
   return service_manager;
@@ -33,18 +33,10 @@ Channel* LookupService(const std::string& name) {
   data.WriteInterfaceToken("android.os.IServiceManager");
   data.WriteUTF8(name);
 
+  Channel* channel = GetServiceManager();
   Parcel reply;
 
-  Channel* channel = GetServiceManager();
   channel->Call(2 /*CHECK_SERVICE_TRANSACTION*/, data, &reply);
-
-  channel->reader()->Print();
-
-  uint32_t cmd = 0;
-  CHECK(channel->reader()->ReadUInt32(&cmd));
-  ALOG("Got command: %x (dec %d %u)", cmd, cmd, cmd);
-  CHECK(channel->reader()->ReadUInt32(&cmd));
-  ALOG("Got command: %x (dec %d %u)", cmd, cmd, cmd);
 }
 
 }  // namespace minibind
index 9e2367a3d60b0ab41b5c09ff67e70ad74926c86a..89f72dc36910d8ee025a90fb35985026cad9e7eb 100644 (file)
@@ -61,6 +61,10 @@ void Parcel::SetDataPosition(size_t pos) {
   data_position_ = pos;
 }
 
+size_t Parcel::DataPosition() const {
+  return data_position_;
+}
+
 void Parcel::Print() const {
   for (size_t i = 0; i < data_.size(); i += 4) {
     ALOG("%0x %0x %0x %0x", data_[i], data_[i+1], data_[i+2], data_[i+3]);
index ba017f2037834862310ce98487fe428b23fd2456..5c2af753bd1ef12e03a68bef4e83b3d4a19c0bcc 100644 (file)
@@ -28,9 +28,11 @@ class Parcel {
   bool ReadBytes(size_t count, void* buffer);
 
   binder_uintptr_t DataPointer() const;
+
   size_t DataSize() const;
   void SetDataSize(size_t size);
 
+  size_t DataPosition() const;
   void SetDataPosition(size_t pos);
 
   void Print() const;
index feee2b338525ecf86f41066b3df66f065895e611..e0ad7db80afd3dce2711c1c817375d71b061492b 100755 (executable)
@@ -1,5 +1,6 @@
-set -e
+set -ex
 
+ndk-build
 adb push ./libs/armeabi/minibind_test /data/local/tmp
 adb shell /data/local/tmp/minibind_test
-adb logcat -s -d minibind:V
+#adb logcat -s -d minibind:V