Index: remoting/client/jni/chromoting_jni_runtime.cc |
diff --git a/remoting/client/jni/chromoting_jni_runtime.cc b/remoting/client/jni/chromoting_jni_runtime.cc |
index 059a4b2b150cb9a63c3d2afea2fccad8f94f30eb..108bb71339d937272e1885c7dd39b03e04d73a1a 100644 |
--- a/remoting/client/jni/chromoting_jni_runtime.cc |
+++ b/remoting/client/jni/chromoting_jni_runtime.cc |
@@ -6,15 +6,23 @@ |
#include "base/android/base_jni_registrar.h" |
#include "base/android/jni_android.h" |
+#include "base/android/scoped_java_ref.h" |
#include "base/memory/singleton.h" |
+#include "base/stl_util.h" |
#include "base/synchronization/waitable_event.h" |
#include "media/base/yuv_convert.h" |
#include "net/android/net_jni_registrar.h" |
#include "remoting/base/url_request_context.h" |
+namespace { |
+ |
// Class and package name of the Java class supporting the methods we call. |
const char* const kJavaClass = "org/chromium/chromoting/jni/JniInterface"; |
+const int kBytesPerPixel = 4; |
+ |
+} // namespace |
+ |
namespace remoting { |
// static |
@@ -181,6 +189,34 @@ void ChromotingJniRuntime::UpdateImageBuffer(int width, |
buffer); |
} |
+void ChromotingJniRuntime::UpdateCursorShape( |
+ const protocol::CursorShapeInfo& cursor_shape) { |
+ DCHECK(display_task_runner_->BelongsToCurrentThread()); |
+ |
+ // const_cast<> is safe as long as the Java updateCursorShape() method copies |
+ // the data out of the buffer without mutating it, and doesn't keep any |
+ // reference to the buffer afterwards. Unfortunately, there seems to be no way |
+ // to create a read-only ByteBuffer from a pointer-to-const. |
+ char* data = string_as_array(const_cast<std::string*>(&cursor_shape.data())); |
+ int cursor_total_bytes = |
+ cursor_shape.width() * cursor_shape.height() * kBytesPerPixel; |
+ |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ base::android::ScopedJavaLocalRef<jobject> buffer(env, |
+ env->NewDirectByteBuffer(data, cursor_total_bytes)); |
+ env->CallStaticVoidMethod( |
+ class_, |
+ env->GetStaticMethodID( |
+ class_, |
+ "updateCursorShape", |
+ "(IIIILjava/nio/ByteBuffer;)V"), |
+ cursor_shape.width(), |
+ cursor_shape.height(), |
+ cursor_shape.hotspot_x(), |
+ cursor_shape.hotspot_y(), |
+ buffer.obj()); |
+} |
+ |
void ChromotingJniRuntime::RedrawCanvas() { |
DCHECK(display_task_runner_->BelongsToCurrentThread()); |