From af5bea6a3d707f57e789bbc8edf41e693a6b8afe Mon Sep 17 00:00:00 2001 From: Vibhav Pant Date: Sat, 22 Jul 2023 15:28:32 +0530 Subject: [PATCH] Initial sketch. --- internal/platform/implementation/linux/BUILD | 18 +++ .../implementation/linux/device_info.cc | 121 ++++++++++++++++++ .../implementation/linux/device_info.h | 51 ++++++++ .../platform/implementation/linux/platform.cc | 12 ++ 4 files changed, 202 insertions(+) create mode 100644 internal/platform/implementation/linux/BUILD create mode 100644 internal/platform/implementation/linux/device_info.cc create mode 100644 internal/platform/implementation/linux/device_info.h create mode 100644 internal/platform/implementation/linux/platform.cc diff --git a/internal/platform/implementation/linux/BUILD b/internal/platform/implementation/linux/BUILD new file mode 100644 index 00000000..5eb73e71 --- /dev/null +++ b/internal/platform/implementation/linux/BUILD @@ -0,0 +1,18 @@ +licenses(["notice"]) + +cc_library( + name = "types", + hdrs = [ + "device_info.h", + ], + srcs = [ + "device_info.cc", + ], + deps = [ + "//internal/platform/implementation:types", + "//internal/platform:logging", + "@com_google_absl//absl/strings", + "@libsystemd//:lib", + ], +) + diff --git a/internal/platform/implementation/linux/device_info.cc b/internal/platform/implementation/linux/device_info.cc new file mode 100644 index 00000000..80fa2c30 --- /dev/null +++ b/internal/platform/implementation/linux/device_info.cc @@ -0,0 +1,121 @@ +#include +#include +#include + +#include +#include +#include + +#include "internal/platform/implementation/device_info.h" +#include "internal/platform/implementation/linux/device_info.h" +#include "internal/platform/logging.h" + +namespace nearby { + +namespace linux { + +const char *HOSTNAME_DEST = "org.freedesktop.hostname1"; +const char *HOSTNAME_PATH = "/org/freedesktop/hostname1"; +const char *HOSTNAME_INTERFACE = "org.freedesktop.hostname1"; + +std::optional DeviceInfo::GetOsDeviceName() const { + sd_bus *bus = nullptr; + if (sd_bus_default_system(&bus) < 0) { + NEARBY_LOGS(ERROR) << __func__ << ": Error connecting to systemd bus."; + return std::nullopt; + } + + sd_bus_error err = SD_BUS_ERROR_NULL; + + char *hostname = nullptr; + if (sd_bus_get_property_string(bus, HOSTNAME_DEST, HOSTNAME_PATH, + HOSTNAME_INTERFACE, "PrettyHostname", &err, + &hostname) < 0) { + NEARBY_LOGS(ERROR) + << __func__ + << ": Error getting PrettyHostname from org.freedesktop.hostname1: " + << err.message; + } + if (!hostname || hostname[0] == '\0') { + int ret = sd_bus_get_property_string(bus, HOSTNAME_DEST, HOSTNAME_PATH, + HOSTNAME_INTERFACE, "Hostname", &err, + &hostname); + if (ret < 0) { + NEARBY_LOGS(ERROR) + << __func__ + << ": Error getting Hostname from org.freedesktop.hostname1: " + << err.message; + sd_bus_error_free(&err); + sd_bus_unref(bus); + return std::nullopt; + } + } + + sd_bus_error_free(&err); + sd_bus_unref(bus); + + std::wstring_convert, char16_t> convert; + + std::u16string name = convert.from_bytes(hostname); + free(hostname); + return name; +} + +api::DeviceInfo::DeviceType DeviceInfo::GetDeviceType() const { + sd_bus *bus; + if (sd_bus_default_system(&bus) < 0) { + NEARBY_LOGS(ERROR) << __func__ << ": Error connecting to systemd bus."; + return api::DeviceInfo::DeviceType::kUnknown; + } + sd_bus_error err = SD_BUS_ERROR_NULL; + char *chasis = nullptr; + + if (sd_bus_get_property_string(bus, HOSTNAME_DEST, HOSTNAME_PATH, + HOSTNAME_INTERFACE, "Chasis", &err, + &chasis) < 0) { + NEARBY_LOGS(ERROR) + << __func__ << ": Error getting Chasis from org.freedesktop.hostname1: " + << err.message; + sd_bus_error_free(&err); + sd_bus_unref(bus); + return api::DeviceInfo::DeviceType::kUnknown; + } + + sd_bus_unref(bus); + + api::DeviceInfo::DeviceType device = api::DeviceInfo::DeviceType::kUnknown; + + if (strcmp(chasis, "phone") == 0) { + device = api::DeviceInfo::DeviceType::kPhone; + } else if (strcmp(chasis, "laptop") == 0 || strcmp(chasis, "desktop") == 0) { + device = api::DeviceInfo::DeviceType::kLaptop; + } else if (strcmp(chasis, "tablet") == 0) { + device = api::DeviceInfo::DeviceType::kTablet; + } else if (strcmp(chasis, "handset") == 0) { + device = api::DeviceInfo::DeviceType::kPhone; + } + free(chasis); + return device; +} + +std::optional DeviceInfo::GetFullName() const { + struct passwd *pwd = getpwuid(getuid()); + if (!pwd) { + return std::nullopt; + } + char *name = strtok(pwd->pw_gecos, ","); + + std::wstring_convert, char16_t> convert; + return convert.from_bytes(name ? name : pwd->pw_gecos); +} + +std::optional DeviceInfo::GetProfileUserName() const { + struct passwd *pwd = getpwuid(getuid()); + if (!pwd) { + return std::nullopt; + } + char *name = strtok(pwd->pw_gecos, ","); + return std::string(name); +} +} // namespace linux +} // namespace nearby diff --git a/internal/platform/implementation/linux/device_info.h b/internal/platform/implementation/linux/device_info.h new file mode 100644 index 00000000..43cef077 --- /dev/null +++ b/internal/platform/implementation/linux/device_info.h @@ -0,0 +1,51 @@ +#ifndef PLATFORM_IMPL_LINUX_DEVICE_INFO_H_ +#define PLATFORM_IMPL_LINUX_DEVICE_INFO_H_ + +#include + +#include +#include + +#include "absl/strings/string_view.h" +#include "internal/platform/implementation/device_info.h" + +namespace nearby { +namespace linux { + +class DeviceInfo : public api::DeviceInfo { +public: + ~DeviceInfo() override; + + std::optional GetOsDeviceName() const override; + api::DeviceInfo::DeviceType GetDeviceType() const override; + api::DeviceInfo::OsType GetOsType() const override { + return api::DeviceInfo::OsType::kWindows; // Or ChromeOS? + } + std::optional GetFullName() const override; + std::optional GetGivenName() const override { + return GetFullName(); + } + std::optional GetLastName() const override { + return GetFullName(); + } + std::optional GetProfileUserName() const override; + + std::optional GetDownloadPath() const override; + std::optional GetLocalAppDataPath() const override; + std::optional GetCommonAppDataPath() const override; + std::optional GetTemporaryPath() const override; + std::optional GetLogPath() const override; + std::optional GetCrashDumpPath() const override; + + bool IsScreenLocked() const override; + void RegisterScreenLockedListener( + absl::string_view listener_name, + std::function callback) override; + void UnregisterScreenLockedListener(absl::string_view listener_name) override; + + sd_bus *system_bus; +}; +} // namespace linux +} // namespace nearby + +#endif // PLATFORM_IMPL_LINUX_DEVICE_INFO_H_ diff --git a/internal/platform/implementation/linux/platform.cc b/internal/platform/implementation/linux/platform.cc new file mode 100644 index 00000000..11b37bcf --- /dev/null +++ b/internal/platform/implementation/linux/platform.cc @@ -0,0 +1,12 @@ +#include "internal/platform/implementation/platform.h" + +#include +#include + +namespace nearby { +namespace api { +namespace { + std::string ImplementationPlatform::GetCustomSavePath() +} +} // namespace api +} // namespace nearby