1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-04 06:31:13 -08:00

Eliminate minor wart in EmacsService.java

* java/org/gnu/emacs/EmacsService.java (openContentUri): Replace
arg BYTES with URI and change its type to String.

* src/android.c (android_init_emacs_service):

* src/androidvfs.c (android_authority_name)
(android_authority_open): Adjust commentary and code to match.
This commit is contained in:
Po Lu 2024-04-20 20:44:30 +08:00
parent 9ea415cde3
commit 571fd42d48
3 changed files with 21 additions and 58 deletions

View file

@ -962,11 +962,13 @@ public final class EmacsService extends Service
string; make it writable if WRITABLE, and readable if READABLE.
Truncate the file if TRUNCATE.
Value is the resulting file descriptor or -1 upon failure. */
Value is the resulting file descriptor or an exception will be
raised. */
public int
openContentUri (byte[] bytes, boolean writable, boolean readable,
openContentUri (String uri, boolean writable, boolean readable,
boolean truncate)
throws FileNotFoundException, IOException
{
String name, mode;
ParcelFileDescriptor fd;
@ -985,39 +987,16 @@ public final class EmacsService extends Service
if (truncate)
mode += "t";
/* Try to open an associated ParcelFileDescriptor. */
/* Try to open a corresponding ParcelFileDescriptor. Though
`fd.detachFd' is exclusive to Honeycomb and up, this function is
never called on systems older than KitKat, which is Emacs's
minimum requirement for access to /content/by-authority. */
try
{
/* The usual file name encoding question rears its ugly head
again. */
fd = resolver.openFileDescriptor (Uri.parse (uri), mode);
i = fd.detachFd ();
fd.close ();
name = new String (bytes, "UTF-8");
fd = resolver.openFileDescriptor (Uri.parse (name), mode);
/* Use detachFd on newer versions of Android or plain old
dup. */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1)
{
i = fd.detachFd ();
fd.close ();
return i;
}
else
{
i = EmacsNative.dup (fd.getFd ());
fd.close ();
return i;
}
}
catch (Exception exception)
{
exception.printStackTrace ();
return -1;
}
return i;
}
/* Return whether Emacs is directly permitted to access the

View file

@ -1632,7 +1632,7 @@ android_init_emacs_service (void)
FIND_METHOD (reset_ic, "resetIC",
"(Lorg/gnu/emacs/EmacsWindow;I)V");
FIND_METHOD (open_content_uri, "openContentUri",
"([BZZZ)I");
"(Ljava/lang/String;ZZZ)I");
FIND_METHOD (check_content_uri, "checkContentUri",
"(Ljava/lang/String;ZZ)Z");
FIND_METHOD (query_battery, "queryBattery", "()[J");

View file

@ -3130,8 +3130,10 @@ android_authority_name (struct android_vnode *vnode, char *name,
return NULL;
}
/* NAME must be a valid JNI string, so that it can be encoded
properly. */
/* If the URI is not a valid JNI string, return immediately. This
should not be possible, since /content file names are encoded
into JNI strings at the naming stage; the check is performed
only out of an abundance of caution. */
if (android_verify_jni_string (name))
goto no_entry;
@ -3169,7 +3171,6 @@ android_authority_open (struct android_vnode *vnode, int flags,
AAsset **asset)
{
struct android_authority_vnode *vp;
size_t length;
jobject string;
int fd;
JNIEnv *env;
@ -3189,22 +3190,11 @@ android_authority_open (struct android_vnode *vnode, int flags,
feasible. */
env = android_java_env;
/* Allocate a buffer to hold the file name. */
length = strlen (vp->uri);
string = (*env)->NewByteArray (env, length);
if (!string)
{
(*env)->ExceptionClear (env);
errno = ENOMEM;
return -1;
}
/* Copy the URI into this byte array. */
(*env)->SetByteArrayRegion (env, string, 0, length,
(jbyte *) vp->uri);
/* Allocate a JNI string to hold VP->uri. */
string = (*env)->NewStringUTF (env, vp->uri);
android_exception_check ();
/* Try to open the file descriptor. */
fd = (*env)->CallNonvirtualIntMethod (env, emacs_service,
service_class.class,
service_class.open_content_uri,
@ -3215,13 +3205,7 @@ android_authority_open (struct android_vnode *vnode, int flags,
(jboolean) !(mode & O_WRONLY),
(jboolean) ((mode & O_TRUNC)
!= 0));
if ((*env)->ExceptionCheck (env))
{
(*env)->ExceptionClear (env);
errno = ENOMEM;
ANDROID_DELETE_LOCAL_REF (string);
return -1;
}
android_exception_check_1 (string);
/* If fd is -1, just assume that the file does not exist,
and return -1 with errno set to ENOENT. */