Implement LOCALE
authorfyraimar <fyraimar@gmail.com>
Thu, 1 Aug 2013 06:34:58 +0000 (14:34 +0800)
committerHalton Huo <halton.huo@intel.com>
Thu, 1 Aug 2013 21:23:27 +0000 (05:23 +0800)
system_info/system_info.gypi
system_info/system_info_context.cc
system_info/system_info_locale.cc [new file with mode: 0644]
system_info/system_info_locale.h [new file with mode: 0644]

index d3d5c88..b66cc81 100644 (file)
@@ -23,6 +23,8 @@
         'system_info_context_mobile.cc',
         'system_info_display.h',
         'system_info_display_x11.cc',
+        'system_info_locale.cc',
+        'system_info_locale.h',
         'system_info_storage.cc',
         'system_info_storage.h',
         'system_info_utils.cc',
index dfb55a0..6f896ff 100644 (file)
@@ -10,6 +10,7 @@
 #include "system_info/system_info_battery.h"
 #include "system_info/system_info_build.h"
 #include "system_info/system_info_display.h"
+#include "system_info/system_info_locale.h"
 #include "system_info/system_info_storage.h"
 #include "system_info/system_info_utils.h"
 
@@ -130,10 +131,19 @@ void SystemInfoContext::GetBuild(picojson::value& error,
 
 void SystemInfoContext::GetLocale(picojson::value& error,
                                   picojson::value& data) {
-  // FIXME(halton): Add actual implementation
-  SetPicoJsonObjectValue(data, "language", picojson::value("zh_CN"));
-  SetPicoJsonObjectValue(data, "country", picojson::value("PRC"));
-  SetPicoJsonObjectValue(error, "message", picojson::value(""));
+  SysInfoLocale& locale = SysInfoLocale::GetSysInfoLocale(error);
+
+  std::string Lang;
+  std::string Locale;
+  // FIXME(faimar): Convert the city name to actual "country" name
+  if (locale.GetLocaleInfo(Lang, Locale)) {
+    SetPicoJsonObjectValue(data, "language", picojson::value(Lang));
+    SetPicoJsonObjectValue(data, "country", picojson::value(Locale));
+    SetPicoJsonObjectValue(error, "message", picojson::value(""));
+  } else {
+    SetPicoJsonObjectValue(error, "message",
+        picojson::value("Unable to get info."));
+  }
 }
 
 void SystemInfoContext::HandleGetPropertyValue(const picojson::value& input,
diff --git a/system_info/system_info_locale.cc b/system_info/system_info_locale.cc
new file mode 100644 (file)
index 0000000..4fbb907
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright (c) 2013 Intel Corporation. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "system_info/system_info_locale.h"
+
+#include <libudev.h>
+#include <locale.h>
+
+#include <fstream>
+
+#include "common/picojson.h"
+#include "system_info/system_info_utils.h"
+
+using namespace system_info;
+
+SysInfoLocale::SysInfoLocale(picojson::value& error) {
+  udev_ = udev_new();
+  if (!udev_) {
+    SetPicoJsonObjectValue(error, "message",
+        picojson::value("Can't create udev."));
+  }
+}
+
+SysInfoLocale::~SysInfoLocale() {
+  if(udev_)
+    udev_unref(udev_);
+}
+
+bool SysInfoLocale::GetLocaleInfo(std::string& Language,
+                                  std::string& Locale) {
+  setlocale(LC_ALL, "");
+  const struct lconv * const currentlocale = localeconv();
+  std::string info = setlocale(LC_ALL, NULL);
+  int pos = info.find('.', 0);
+  Language.assign(info, 0, pos);
+
+  std::ifstream in;
+  in.open("/etc/timezone");
+  getline(in, info);
+  in.close();
+  pos = info.find('/', 0);
+  Locale.assign(info, pos + 1, info.length() - pos - 1);
+
+  return !(Language.empty() || Locale.empty());
+}
diff --git a/system_info/system_info_locale.h b/system_info/system_info_locale.h
new file mode 100644 (file)
index 0000000..d24c027
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright (c) 2013 Intel Corporation. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SYSTEM_INFO_SYSTEM_INFO_LOCALE_H_
+#define SYSTEM_INFO_SYSTEM_INFO_LOCALE_H_
+
+#include <libudev.h>
+
+#include <string>
+
+#include "common/picojson.h"
+#include "common/utils.h"
+
+class SysInfoLocale {
+ public:
+  static SysInfoLocale& GetSysInfoLocale(picojson::value& error) {
+    static SysInfoLocale instance(error);
+    return instance;
+  }
+  ~SysInfoLocale();
+  bool GetLocaleInfo(std::string& Language,
+                     std::string& Locale);
+
+ private:
+  SysInfoLocale(picojson::value& error);
+
+  struct udev* udev_;
+
+  DISALLOW_COPY_AND_ASSIGN(SysInfoLocale);
+};
+
+#endif  // SYSTEM_INFO_SYSTEM_INFO_LOCALE_H_