1 /**
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0.
4 */
5
6 #include "crt.h"
7 #include "java_class_ids.h"
8 #include <aws/io/retry_strategy.h>
9 #include <inttypes.h>
10 #include <jni.h>
11
12 /* on 32-bit platforms, casting pointers to longs throws a warning we don't need */
13 #if UINTPTR_MAX == 0xffffffff
14 # if defined(_MSC_VER)
15 # pragma warning(push)
16 # pragma warning(disable : 4305) /* 'type cast': truncation from 'jlong' to 'jni_tls_ctx_options *' */
17 # pragma warning(disable : 4221)
18 # else
19 # pragma GCC diagnostic push
20 # pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
21 # pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
22 # endif
23 #endif
24
aws_exponential_backoff_retry_options_from_java(JNIEnv * env,jobject jni_backoff_retry_options,struct aws_exponential_backoff_retry_options * backoff_retry_options)25 int aws_exponential_backoff_retry_options_from_java(
26 JNIEnv *env,
27 jobject jni_backoff_retry_options,
28 struct aws_exponential_backoff_retry_options *backoff_retry_options) {
29
30 struct aws_event_loop_group *el_group = NULL;
31
32 jobject jni_el_group = (*env)->GetObjectField(
33 env, jni_backoff_retry_options, exponential_backoff_retry_options_properties.el_group_field_id);
34
35 if (jni_el_group != NULL) {
36 el_group = (struct aws_event_loop_group *)(*env)->CallLongMethod(
37 env, jni_el_group, crt_resource_properties.get_native_handle_method_id);
38 }
39
40 jlong jni_max_retries = (*env)->GetLongField(
41 env, jni_backoff_retry_options, exponential_backoff_retry_options_properties.max_retries_field_id);
42
43 jlong jni_backoff_scale_factor_ms = (*env)->GetLongField(
44 env, jni_backoff_retry_options, exponential_backoff_retry_options_properties.backoff_scale_factor_ms_field_id);
45
46 jobject jni_jitter_mode_obj = (*env)->GetObjectField(
47 env, jni_backoff_retry_options, exponential_backoff_retry_options_properties.jitter_mode_field_id);
48
49 jint jni_jitter_mode = (*env)->GetIntField(
50 env, jni_jitter_mode_obj, exponential_backoff_retry_options_properties.jitter_mode_value_field_id);
51
52 if (jni_max_retries < 0 || (uint64_t)jni_max_retries > SIZE_MAX) {
53 aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
54 aws_jni_throw_runtime_exception(
55 env,
56 "ExponentialBackoffRetryOptions.exponentialBackoffRetryOptionsNew: Max-Retries value must be between 0 and "
57 "%" PRIu64,
58 (uint64_t)SIZE_MAX);
59 return AWS_OP_ERR;
60 }
61
62 if (jni_backoff_scale_factor_ms < 0 || jni_backoff_scale_factor_ms > UINT_MAX) {
63 aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
64 aws_jni_throw_runtime_exception(
65 env,
66 "ExponentialBackoffRetryOptions.exponentialBackoffRetryOptionsNew: Backoff-Scale-Factor-MS must be between "
67 "0 and %u",
68 UINT_MAX);
69 return AWS_OP_ERR;
70 }
71
72 AWS_ZERO_STRUCT(*backoff_retry_options);
73 backoff_retry_options->el_group = el_group;
74 backoff_retry_options->max_retries = (size_t)jni_max_retries;
75 backoff_retry_options->backoff_scale_factor_ms = (uint32_t)jni_backoff_scale_factor_ms;
76 backoff_retry_options->jitter_mode = jni_jitter_mode;
77
78 return AWS_OP_SUCCESS;
79 }
80
aws_standard_retry_options_from_java(JNIEnv * env,jobject jni_standard_retry_options,struct aws_standard_retry_options * standard_retry_options)81 int aws_standard_retry_options_from_java(
82 JNIEnv *env,
83 jobject jni_standard_retry_options,
84 struct aws_standard_retry_options *standard_retry_options) {
85
86 jobject jni_backoff_retry_options = (*env)->GetObjectField(
87 env, jni_standard_retry_options, standard_retry_options_properties.backoff_retry_options_field_id);
88 jlong jni_initial_bucket_capacity = (*env)->GetLongField(
89 env, jni_standard_retry_options, standard_retry_options_properties.initial_bucket_capacity_field_id);
90
91 if (jni_initial_bucket_capacity < 0 || (uint64_t)jni_initial_bucket_capacity > SIZE_MAX) {
92 aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
93 aws_jni_throw_runtime_exception(
94 env,
95 "StandardRetryOptions.standardRetryOptionsNew: Initial-Bucket-Capacity value must be between 0 and "
96 "%" PRIu64,
97 (uint64_t)SIZE_MAX);
98 return AWS_OP_ERR;
99 }
100
101 AWS_ZERO_STRUCT(*standard_retry_options);
102
103 if (jni_backoff_retry_options != NULL) {
104 aws_exponential_backoff_retry_options_from_java(
105 env, jni_backoff_retry_options, &standard_retry_options->backoff_retry_options);
106 }
107
108 standard_retry_options->initial_bucket_capacity = (size_t)jni_initial_bucket_capacity;
109
110 return AWS_OP_SUCCESS;
111 }
112
113 #if UINTPTR_MAX == 0xffffffff
114 # if defined(_MSC_VER)
115 # pragma warning(pop)
116 # else
117 # pragma GCC diagnostic pop
118 # endif
119 #endif
120