Home | History | Annotate | Download | only in android
      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 
     13 using base::android::ConvertUTF8ToJavaString;
     14 using base::android::ConvertJavaStringToUTF8;
     15 
     16 namespace {
     17 
     18 void AppendJavaStringArrayToCommandLine(JNIEnv* env,
     19                                         jobjectArray array,
     20                                         bool includes_program) {
     21   std::vector<std::string> vec;
     22   if (array)
     23     base::android::AppendJavaStringArrayToStringVector(env, array, &vec);
     24   if (!includes_program)
     25     vec.insert(vec.begin(), "");
     26   CommandLine extra_command_line(vec);
     27   CommandLine::ForCurrentProcess()->AppendArguments(extra_command_line,
     28                                                     includes_program);
     29 }
     30 
     31 }  // namespace
     32 
     33 static void Reset(JNIEnv* env, jclass clazz) {
     34   CommandLine::Reset();
     35 }
     36 
     37 static jboolean HasSwitch(JNIEnv* env, jclass clazz, jstring jswitch) {
     38   std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
     39   return CommandLine::ForCurrentProcess()->HasSwitch(switch_string);
     40 }
     41 
     42 static jstring GetSwitchValue(JNIEnv* env, jclass clazz, jstring jswitch) {
     43   std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
     44   std::string value(CommandLine::ForCurrentProcess()->GetSwitchValueNative(
     45       switch_string));
     46   if (value.empty())
     47     return 0;
     48   // OK to release, JNI binding.
     49   return ConvertUTF8ToJavaString(env, value).Release();
     50 }
     51 
     52 static void AppendSwitch(JNIEnv* env, jclass clazz, jstring jswitch) {
     53   std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
     54   CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
     55 }
     56 
     57 static void AppendSwitchWithValue(JNIEnv* env, jclass clazz,
     58                                   jstring jswitch, jstring jvalue) {
     59   std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
     60   std::string value_string (ConvertJavaStringToUTF8(env, jvalue));
     61   CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_string,
     62                                                       value_string);
     63 }
     64 
     65 static void AppendSwitchesAndArguments(JNIEnv* env, jclass clazz,
     66                                        jobjectArray array) {
     67   AppendJavaStringArrayToCommandLine(env, array, false);
     68 }
     69 
     70 namespace base {
     71 namespace android {
     72 
     73 void InitNativeCommandLineFromJavaArray(JNIEnv* env, jobjectArray array) {
     74   // TODO(port): Make an overload of Init() that takes StringVector rather than
     75   // have to round-trip via AppendArguments.
     76   CommandLine::Init(0, NULL);
     77   AppendJavaStringArrayToCommandLine(env, array, true);
     78 }
     79 
     80 bool RegisterCommandLine(JNIEnv* env) {
     81   return RegisterNativesImpl(env);
     82 }
     83 
     84 }  // namespace android
     85 }  // namespace base
     86