1// Copyright 2013 The Chromium Authors. All rights reserved.
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 "base/android/command_line_android.h"
6
7#include "base/android/jni_array.h"
8#include "base/android/jni_string.h"
9#include "base/command_line.h"
10#include "base/logging.h"
11#include "jni/CommandLine_jni.h"
12
13using base::android::ConvertUTF8ToJavaString;
14using base::android::ConvertJavaStringToUTF8;
15using base::android::JavaParamRef;
16using base::android::ScopedJavaLocalRef;
17using base::CommandLine;
18
19namespace {
20
21void AppendJavaStringArrayToCommandLine(JNIEnv* env,
22                                        jobjectArray array,
23                                        bool includes_program) {
24  std::vector<std::string> vec;
25  if (array)
26    base::android::AppendJavaStringArrayToStringVector(env, array, &vec);
27  if (!includes_program)
28    vec.insert(vec.begin(), "");
29  CommandLine extra_command_line(vec);
30  CommandLine::ForCurrentProcess()->AppendArguments(extra_command_line,
31                                                    includes_program);
32}
33
34}  // namespace
35
36static void Reset(JNIEnv* env, const JavaParamRef<jclass>& clazz) {
37  CommandLine::Reset();
38}
39
40static jboolean HasSwitch(JNIEnv* env,
41                          const JavaParamRef<jclass>& clazz,
42                          const JavaParamRef<jstring>& jswitch) {
43  std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
44  return CommandLine::ForCurrentProcess()->HasSwitch(switch_string);
45}
46
47static ScopedJavaLocalRef<jstring> GetSwitchValue(
48    JNIEnv* env,
49    const JavaParamRef<jclass>& clazz,
50    const JavaParamRef<jstring>& jswitch) {
51  std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
52  std::string value(CommandLine::ForCurrentProcess()->GetSwitchValueNative(
53      switch_string));
54  if (value.empty())
55    return ScopedJavaLocalRef<jstring>();
56  return ConvertUTF8ToJavaString(env, value);
57}
58
59static void AppendSwitch(JNIEnv* env,
60                         const JavaParamRef<jclass>& clazz,
61                         const JavaParamRef<jstring>& jswitch) {
62  std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
63  CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
64}
65
66static void AppendSwitchWithValue(JNIEnv* env,
67                                  const JavaParamRef<jclass>& clazz,
68                                  const JavaParamRef<jstring>& jswitch,
69                                  const JavaParamRef<jstring>& jvalue) {
70  std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
71  std::string value_string (ConvertJavaStringToUTF8(env, jvalue));
72  CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_string,
73                                                      value_string);
74}
75
76static void AppendSwitchesAndArguments(
77    JNIEnv* env,
78    const JavaParamRef<jclass>& clazz,
79    const JavaParamRef<jobjectArray>& array) {
80  AppendJavaStringArrayToCommandLine(env, array, false);
81}
82
83namespace base {
84namespace android {
85
86void InitNativeCommandLineFromJavaArray(JNIEnv* env, jobjectArray array) {
87  // TODO(port): Make an overload of Init() that takes StringVector rather than
88  // have to round-trip via AppendArguments.
89  CommandLine::Init(0, NULL);
90  AppendJavaStringArrayToCommandLine(env, array, true);
91}
92
93bool RegisterCommandLine(JNIEnv* env) {
94  return RegisterNativesImpl(env);
95}
96
97}  // namespace android
98}  // namespace base
99