1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "url/android/parsed_android.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <jni.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
10*6777b538SAndroid Build Coastguard Worker #include "url/url_jni_headers/Parsed_jni.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker using base::android::AttachCurrentThread;
13*6777b538SAndroid Build Coastguard Worker using base::android::JavaRef;
14*6777b538SAndroid Build Coastguard Worker using base::android::ScopedJavaLocalRef;
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace url {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker
CreateJavaParsed(JNIEnv * env,const Parsed & parsed,const JavaRef<jobject> & inner)20*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobject> CreateJavaParsed(JNIEnv* env,
21*6777b538SAndroid Build Coastguard Worker const Parsed& parsed,
22*6777b538SAndroid Build Coastguard Worker const JavaRef<jobject>& inner) {
23*6777b538SAndroid Build Coastguard Worker static constexpr bool is_signed =
24*6777b538SAndroid Build Coastguard Worker std::is_signed<decltype(parsed.scheme.begin)>::value;
25*6777b538SAndroid Build Coastguard Worker static constexpr size_t offset_size = sizeof(parsed.scheme.begin);
26*6777b538SAndroid Build Coastguard Worker static_assert((is_signed && sizeof(jint) >= offset_size) ||
27*6777b538SAndroid Build Coastguard Worker (!is_signed && sizeof(jint) > offset_size),
28*6777b538SAndroid Build Coastguard Worker "Java size offsets for Parsed Components must be large enough "
29*6777b538SAndroid Build Coastguard Worker "to store the full C++ offset.");
30*6777b538SAndroid Build Coastguard Worker return Java_Parsed_Constructor(
31*6777b538SAndroid Build Coastguard Worker env, parsed.scheme.begin, parsed.scheme.len, parsed.username.begin,
32*6777b538SAndroid Build Coastguard Worker parsed.username.len, parsed.password.begin, parsed.password.len,
33*6777b538SAndroid Build Coastguard Worker parsed.host.begin, parsed.host.len, parsed.port.begin, parsed.port.len,
34*6777b538SAndroid Build Coastguard Worker parsed.path.begin, parsed.path.len, parsed.query.begin, parsed.query.len,
35*6777b538SAndroid Build Coastguard Worker parsed.ref.begin, parsed.ref.len, parsed.potentially_dangling_markup,
36*6777b538SAndroid Build Coastguard Worker inner);
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker } // namespace
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // static
InitFromParsed(JNIEnv * env,const Parsed & parsed)42*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobject> ParsedAndroid::InitFromParsed(
43*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
44*6777b538SAndroid Build Coastguard Worker const Parsed& parsed) {
45*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobject> inner;
46*6777b538SAndroid Build Coastguard Worker if (parsed.inner_parsed())
47*6777b538SAndroid Build Coastguard Worker inner = CreateJavaParsed(env, *parsed.inner_parsed(), nullptr);
48*6777b538SAndroid Build Coastguard Worker return CreateJavaParsed(env, parsed, inner);
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker
JNI_Parsed_InitNative(JNIEnv * env,jlong native_ptr,jboolean is_inner,jint scheme_begin,jint scheme_length,jint username_begin,jint username_length,jint password_begin,jint password_length,jint host_begin,jint host_length,jint port_begin,jint port_length,jint path_begin,jint path_length,jint query_begin,jint query_length,jint ref_begin,jint ref_length,jboolean potentially_dangling_markup)51*6777b538SAndroid Build Coastguard Worker static void JNI_Parsed_InitNative(JNIEnv* env,
52*6777b538SAndroid Build Coastguard Worker jlong native_ptr,
53*6777b538SAndroid Build Coastguard Worker jboolean is_inner,
54*6777b538SAndroid Build Coastguard Worker jint scheme_begin,
55*6777b538SAndroid Build Coastguard Worker jint scheme_length,
56*6777b538SAndroid Build Coastguard Worker jint username_begin,
57*6777b538SAndroid Build Coastguard Worker jint username_length,
58*6777b538SAndroid Build Coastguard Worker jint password_begin,
59*6777b538SAndroid Build Coastguard Worker jint password_length,
60*6777b538SAndroid Build Coastguard Worker jint host_begin,
61*6777b538SAndroid Build Coastguard Worker jint host_length,
62*6777b538SAndroid Build Coastguard Worker jint port_begin,
63*6777b538SAndroid Build Coastguard Worker jint port_length,
64*6777b538SAndroid Build Coastguard Worker jint path_begin,
65*6777b538SAndroid Build Coastguard Worker jint path_length,
66*6777b538SAndroid Build Coastguard Worker jint query_begin,
67*6777b538SAndroid Build Coastguard Worker jint query_length,
68*6777b538SAndroid Build Coastguard Worker jint ref_begin,
69*6777b538SAndroid Build Coastguard Worker jint ref_length,
70*6777b538SAndroid Build Coastguard Worker jboolean potentially_dangling_markup) {
71*6777b538SAndroid Build Coastguard Worker Parsed inner_parsed;
72*6777b538SAndroid Build Coastguard Worker Parsed* outer_parsed = reinterpret_cast<Parsed*>(native_ptr);
73*6777b538SAndroid Build Coastguard Worker Parsed* target = is_inner ? &inner_parsed : outer_parsed;
74*6777b538SAndroid Build Coastguard Worker target->scheme.begin = scheme_begin;
75*6777b538SAndroid Build Coastguard Worker target->scheme.len = scheme_length;
76*6777b538SAndroid Build Coastguard Worker target->username.begin = username_begin;
77*6777b538SAndroid Build Coastguard Worker target->username.len = username_length;
78*6777b538SAndroid Build Coastguard Worker target->password.begin = password_begin;
79*6777b538SAndroid Build Coastguard Worker target->password.len = password_length;
80*6777b538SAndroid Build Coastguard Worker target->host.begin = host_begin;
81*6777b538SAndroid Build Coastguard Worker target->host.len = host_length;
82*6777b538SAndroid Build Coastguard Worker target->port.begin = port_begin;
83*6777b538SAndroid Build Coastguard Worker target->port.len = port_length;
84*6777b538SAndroid Build Coastguard Worker target->path.begin = path_begin;
85*6777b538SAndroid Build Coastguard Worker target->path.len = path_length;
86*6777b538SAndroid Build Coastguard Worker target->query.begin = query_begin;
87*6777b538SAndroid Build Coastguard Worker target->query.len = query_length;
88*6777b538SAndroid Build Coastguard Worker target->ref.begin = ref_begin;
89*6777b538SAndroid Build Coastguard Worker target->ref.len = ref_length;
90*6777b538SAndroid Build Coastguard Worker target->potentially_dangling_markup = potentially_dangling_markup;
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker if (is_inner) {
93*6777b538SAndroid Build Coastguard Worker outer_parsed->set_inner_parsed(inner_parsed);
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker } // namespace url
98