1*3c7ae9deSAndroid Build Coastguard Worker /**
2*3c7ae9deSAndroid Build Coastguard Worker * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*3c7ae9deSAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0.
4*3c7ae9deSAndroid Build Coastguard Worker */
5*3c7ae9deSAndroid Build Coastguard Worker #include "crt.h"
6*3c7ae9deSAndroid Build Coastguard Worker #include "java_class_ids.h"
7*3c7ae9deSAndroid Build Coastguard Worker #include <aws/io/uri.h>
8*3c7ae9deSAndroid Build Coastguard Worker #include <jni.h>
9*3c7ae9deSAndroid Build Coastguard Worker
s_encoding_common(JNIEnv * env,jbyteArray buffer,jbyteArray cursor,int (* encoding_fn)(struct aws_byte_buf *,const struct aws_byte_cursor *))10*3c7ae9deSAndroid Build Coastguard Worker static jbyteArray s_encoding_common(
11*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
12*3c7ae9deSAndroid Build Coastguard Worker jbyteArray buffer,
13*3c7ae9deSAndroid Build Coastguard Worker jbyteArray cursor,
14*3c7ae9deSAndroid Build Coastguard Worker int (*encoding_fn)(struct aws_byte_buf *, const struct aws_byte_cursor *)) {
15*3c7ae9deSAndroid Build Coastguard Worker
16*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor c_intermediate_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, buffer);
17*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor c_byte_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, cursor);
18*3c7ae9deSAndroid Build Coastguard Worker jbyteArray uri_encoding = NULL;
19*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_buf c_byte_buf;
20*3c7ae9deSAndroid Build Coastguard Worker aws_byte_buf_init_copy_from_cursor(&c_byte_buf, aws_jni_get_allocator(), c_intermediate_cursor);
21*3c7ae9deSAndroid Build Coastguard Worker if (encoding_fn(&c_byte_buf, &c_byte_cursor)) {
22*3c7ae9deSAndroid Build Coastguard Worker aws_jni_throw_runtime_exception(env, "uri.encodingCommon: failed to encode buffer");
23*3c7ae9deSAndroid Build Coastguard Worker goto clean_up;
24*3c7ae9deSAndroid Build Coastguard Worker }
25*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor uri_encoding_cursor = aws_byte_cursor_from_buf(&c_byte_buf);
26*3c7ae9deSAndroid Build Coastguard Worker uri_encoding = aws_jni_byte_array_from_cursor(env, &uri_encoding_cursor);
27*3c7ae9deSAndroid Build Coastguard Worker clean_up:
28*3c7ae9deSAndroid Build Coastguard Worker aws_jni_byte_cursor_from_jbyteArray_release(env, buffer, c_intermediate_cursor);
29*3c7ae9deSAndroid Build Coastguard Worker aws_jni_byte_cursor_from_jbyteArray_release(env, cursor, c_byte_cursor);
30*3c7ae9deSAndroid Build Coastguard Worker aws_byte_buf_clean_up(&c_byte_buf);
31*3c7ae9deSAndroid Build Coastguard Worker return uri_encoding;
32*3c7ae9deSAndroid Build Coastguard Worker }
33*3c7ae9deSAndroid Build Coastguard Worker
Java_software_amazon_awssdk_crt_io_Uri_appendEncodingUriPath(JNIEnv * env,jclass jni_class,jbyteArray encoded,jbyteArray path)34*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jbyteArray JNICALL Java_software_amazon_awssdk_crt_io_Uri_appendEncodingUriPath(
35*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
36*3c7ae9deSAndroid Build Coastguard Worker jclass jni_class,
37*3c7ae9deSAndroid Build Coastguard Worker jbyteArray encoded,
38*3c7ae9deSAndroid Build Coastguard Worker jbyteArray path) {
39*3c7ae9deSAndroid Build Coastguard Worker (void)jni_class;
40*3c7ae9deSAndroid Build Coastguard Worker aws_cache_jni_ids(env);
41*3c7ae9deSAndroid Build Coastguard Worker
42*3c7ae9deSAndroid Build Coastguard Worker return s_encoding_common(env, encoded, path, aws_byte_buf_append_encoding_uri_path);
43*3c7ae9deSAndroid Build Coastguard Worker }
44*3c7ae9deSAndroid Build Coastguard Worker
Java_software_amazon_awssdk_crt_io_Uri_appendEncodingUriParam(JNIEnv * env,jclass jni_class,jbyteArray encoded,jbyteArray param)45*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jbyteArray JNICALL Java_software_amazon_awssdk_crt_io_Uri_appendEncodingUriParam(
46*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
47*3c7ae9deSAndroid Build Coastguard Worker jclass jni_class,
48*3c7ae9deSAndroid Build Coastguard Worker jbyteArray encoded,
49*3c7ae9deSAndroid Build Coastguard Worker jbyteArray param) {
50*3c7ae9deSAndroid Build Coastguard Worker (void)jni_class;
51*3c7ae9deSAndroid Build Coastguard Worker aws_cache_jni_ids(env);
52*3c7ae9deSAndroid Build Coastguard Worker
53*3c7ae9deSAndroid Build Coastguard Worker return s_encoding_common(env, encoded, param, aws_byte_buf_append_encoding_uri_param);
54*3c7ae9deSAndroid Build Coastguard Worker }
55*3c7ae9deSAndroid Build Coastguard Worker
Java_software_amazon_awssdk_crt_io_Uri_appendDecodingUri(JNIEnv * env,jclass jni_class,jbyteArray base,jbyteArray encoded)56*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jbyteArray JNICALL Java_software_amazon_awssdk_crt_io_Uri_appendDecodingUri(
57*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
58*3c7ae9deSAndroid Build Coastguard Worker jclass jni_class,
59*3c7ae9deSAndroid Build Coastguard Worker jbyteArray base,
60*3c7ae9deSAndroid Build Coastguard Worker jbyteArray encoded) {
61*3c7ae9deSAndroid Build Coastguard Worker (void)jni_class;
62*3c7ae9deSAndroid Build Coastguard Worker aws_cache_jni_ids(env);
63*3c7ae9deSAndroid Build Coastguard Worker
64*3c7ae9deSAndroid Build Coastguard Worker return s_encoding_common(env, base, encoded, aws_byte_buf_append_decoding_uri);
65*3c7ae9deSAndroid Build Coastguard Worker }
66