From 61b2ae0f7cdab867af7a41e279ac14c58092b338 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Wed, 24 Apr 2019 13:55:15 +0200
Subject: [PATCH] java/String: add method ToString()

---
 src/java/String.cxx | 20 +++++++++++++++++++-
 src/java/String.hxx | 10 +++++++++-
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/java/String.cxx b/src/java/String.cxx
index 899f670c4..d072b818f 100644
--- a/src/java/String.cxx
+++ b/src/java/String.cxx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
+ * Copyright 2010-2019 Max Kellermann <max.kellermann@gmail.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,6 +29,7 @@
 
 #include "String.hxx"
 #include "util/TruncateString.hxx"
+#include "util/ScopeExit.hxx"
 
 char *
 Java::String::CopyTo(JNIEnv *env, jstring value,
@@ -42,3 +43,20 @@ Java::String::CopyTo(JNIEnv *env, jstring value,
 	env->ReleaseStringUTFChars(value, p);
 	return result;
 }
+
+std::string
+Java::String::ToString(JNIEnv *env, jstring s) noexcept
+{
+	assert(env != nullptr);
+	assert(s != nullptr);
+
+	const char *p = env->GetStringUTFChars(s, nullptr);
+	if (p == nullptr)
+		return std::string();
+
+	AtScopeExit(env, s, p) {
+		env->ReleaseStringUTFChars(s, p);
+	};
+
+	return std::string(p);
+}
diff --git a/src/java/String.hxx b/src/java/String.hxx
index 6cf39b240..7cd7f2c13 100644
--- a/src/java/String.hxx
+++ b/src/java/String.hxx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2018 Max Kellermann <max.kellermann@gmail.com>
+ * Copyright 2010-2019 Max Kellermann <max.kellermann@gmail.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -34,6 +34,8 @@
 
 #include <jni.h>
 
+#include <string>
+
 #include <stddef.h>
 
 namespace Java {
@@ -69,6 +71,12 @@ namespace Java {
 			     char *buffer, size_t max_size) noexcept {
 			return CopyTo(env, Get(), buffer, max_size);
 		}
+
+		static std::string ToString(JNIEnv *env, jstring s) noexcept;
+
+		std::string ToString() const noexcept {
+			return ToString(GetEnv(), Get());
+		}
 	};
 }