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