Files
mpd/src/java/String.hxx
2022-07-14 13:03:23 +02:00

134 lines
3.6 KiB
C++

/*
* Copyright 2010-2021 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
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef JAVA_STRING_HXX
#define JAVA_STRING_HXX
#include "Ref.hxx"
#include <jni.h>
#include <cstddef>
#include <string>
#include <string_view>
namespace Java {
class StringUTFChars {
JNIEnv *env;
jstring string;
const char *chars = nullptr;
public:
StringUTFChars() noexcept = default;
StringUTFChars(std::nullptr_t) noexcept {}
StringUTFChars(JNIEnv *_env,
const jstring _string,
const char *const _chars) noexcept
:env(_env), string(_string), chars(_chars) {}
StringUTFChars(StringUTFChars &&src) noexcept
:env(src.env), string(src.string),
chars(std::exchange(src.chars, nullptr)) {}
~StringUTFChars() noexcept {
if (chars != nullptr)
env->ReleaseStringUTFChars(string, chars);
}
StringUTFChars &operator=(StringUTFChars &&src) noexcept {
using std::swap;
swap(env, src.env);
swap(string, src.string);
swap(chars, src.chars);
return *this;
}
const char *c_str() const noexcept {
return chars;
}
operator bool() const noexcept {
return chars != nullptr;
}
};
/**
* Wrapper for a local "jstring" reference.
*/
class String : public LocalRef<jstring> {
public:
using LocalRef::LocalRef;
String(JNIEnv *_env, const char *_value) noexcept
:LocalRef<jstring>(_env, _env->NewStringUTF(_value)) {}
String(JNIEnv *_env, std::string_view _value) noexcept;
static StringUTFChars GetUTFChars(JNIEnv *env, jstring s) noexcept {
return {env, s, env->GetStringUTFChars(s, nullptr)};
}
StringUTFChars GetUTFChars() const noexcept {
return GetUTFChars(GetEnv(), Get());
}
/**
* Copy the value to the specified buffer. Truncates
* the value if it does not fit into the buffer.
*
* @return a pointer to the terminating null byte,
* nullptr on error
*/
static char *CopyTo(JNIEnv *env, jstring value,
char *buffer, size_t max_size) noexcept;
/**
* Copy the value to the specified buffer. Truncates
* the value if it does not fit into the buffer.
*
* @return a pointer to the terminating null byte,
* nullptr on error
*/
char *CopyTo(char *buffer, size_t max_size) const noexcept {
return CopyTo(GetEnv(), Get(), buffer, max_size);
}
static std::string ToString(JNIEnv *env, jstring s) noexcept;
std::string ToString() const noexcept {
return ToString(GetEnv(), Get());
}
};
} // namespace Java
#endif