From c8d763e64ac38bc2582289d4ea444133598277f9 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Tue, 7 Feb 2023 17:36:23 +0600 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=20=D0=B7?= =?UTF-8?q?=D0=BE=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/CMakeLists.txt | 5 +- source/ubl-settings-datetime.cc | 208 ++++++++++++++++++++++++-------- source/ubl-settings-datetime.h | 12 ++ test | Bin 0 -> 17176 bytes 4 files changed, 170 insertions(+), 55 deletions(-) create mode 100755 test diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 87ca686..5289d63 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -7,6 +7,7 @@ pkg_check_modules(GTK REQUIRED gtkmm-3.0) include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) +find_package(ICU REQUIRED COMPONENTS uc dt in io) #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a -g") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -g") @@ -21,5 +22,5 @@ set(LIBRARIES pthread) add_executable(ubl-settings-datetime ${SOURCE_FILES}) -target_link_libraries(ubl-settings-datetime ${LIBRARIES}) -install(TARGETS ubl-settings-datetime DESTINATION bin) +target_link_libraries(ubl-settings-datetime ${LIBRARIES} ${ICU_LIBRARIES}) +install(TARGETS ubl-settings-datetime DESTINATION bin) \ No newline at end of file diff --git a/source/ubl-settings-datetime.cc b/source/ubl-settings-datetime.cc index fe0e88e..3bc6bcf 100644 --- a/source/ubl-settings-datetime.cc +++ b/source/ubl-settings-datetime.cc @@ -22,6 +22,16 @@ #include #include #include +#include +#include +#include +#include +#include "unicode/utypes.h" +#include "unicode/utext.h" + +#include +#include +#include #include "ubl-settings-datetime.h" using namespace std; @@ -36,7 +46,8 @@ bool flag_ntp = false; bool flag_update = false; CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) -: Glib::OptionGroup{p_name, p_description, p_help}{ +: Glib::OptionGroup{p_name, p_description, p_help} +{ Glib::OptionEntry socketIDArg; socketIDArg.set_long_name("socket-id"); socketIDArg.set_short_name('s'); @@ -97,6 +108,7 @@ void MainWindow::settings(){ lblRegGlob->set_sensitive(false); lblZone1Glob->set_sensitive(false); lblDateTimeSetting->set_sensitive(false); + } } @@ -108,7 +120,6 @@ int MainWindow::check_root(){ } return 0; } - void MainWindow::lacalization(){ txtDate->set_tooltip_text(gettext("Date of\nFormat: DD.MM.YYYY")); lblSynchronizebChkGLob->set_text(gettext("Synchronize via NTP")); @@ -135,10 +146,14 @@ void MainWindow::lacalization(){ lblBanerStopNtp->set_text(gettext("Active service detected\nAutomatic time and date synchronization service detected")); lblNtpStop->set_text(gettext("Stop the synchronization service")); lblNtpClose->set_text(gettext("Close")); + //_lblSynchronizebChk->set_text(gettext("Synchronize via NTP")); } void MainWindow::flag_block_gui(){ if (flag_datetime==true){ + //numTimeHrs->set_sensitive(false); + //numTimeMin->set_sensitive(false); + //txtDate->set_sensitive(false); btnUpdateDateTime->set_sensitive(false); numTimeHrs->set_sensitive(false); numTimeMin->set_sensitive(false); @@ -148,12 +163,14 @@ void MainWindow::flag_block_gui(){ btnHardwareTime->set_sensitive(false); lblTime->set_sensitive(false); lblData->set_sensitive(false); + //cbxSynchronizeNtpGlob->set_sensitive(false); } if (flag_timezone==true){ cbRegion->set_sensitive(false); cbZone->set_sensitive(false); cbRegionGlob->set_sensitive(false); cbZoneGlob->set_sensitive(false); + //btnChooseDate->set_sensitive(false); cbDhcp->set_sensitive(false); } if (flag_ntp==true){ @@ -163,6 +180,7 @@ void MainWindow::flag_block_gui(){ } if (flag_update==true){ lblDateTimeSettingGlob->set_sensitive(false); + //lblSynchronizebChkGLob->set_sensitive(false); cbxSynchronizeNtpGlob->set_sensitive(false); lblTimeZoneGlob->set_sensitive(false); lblRegGlob->set_sensitive(false); @@ -178,8 +196,8 @@ void MainWindow::add_CSS(){ Glib::RefPtr cssProvider = Gtk::CssProvider::create(); cssProvider->load_from_path(path_css); Glib::RefPtr styleContext = Gtk::StyleContext::create(); - Glib::RefPtr screen = Gdk::Screen::get_default(); - styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + Glib::RefPtr screen = Gdk::Screen::get_default();//get default screen + styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);//add provider for screen in all application Glib::RefPtr context = boxColor->get_style_context(); Glib::RefPtr context_lbl_head = lblHead->get_style_context(); context->add_class("cssboxColor1"); @@ -216,6 +234,7 @@ void MainWindow::get_builder(){ builder->get_widget("lblRegGlob",lblRegGlob); builder->get_widget("lblZone1Glob",lblZone1Glob); builder->get_widget("lblTimeZoneGlob",lblTimeZoneGlob); + //builder->get_widget("lblSynchronizebChk",_lblSynchronizebChk); builder->get_widget("lblSynchronizebChkGLob",lblSynchronizebChkGLob); builder->get_widget("lblSynchronizeBtn",lblSynchronizeBtn); builder->get_widget("lblDateTimeSettingGlob",lblDateTimeSettingGlob); @@ -230,9 +249,11 @@ void MainWindow::get_builder(){ builder->get_widget("lblNtpStop",lblNtpStop); builder->get_widget("lblNtpClose",lblNtpClose); builder->get_widget("lblBanerStopNtp",lblBanerStopNtp); + + //builder->get_widget("cbxSynchronizeNtp",cbxSynchronizeNtp); + this->add_CSS(); } - void MainWindow::gui_exit(){ exit(1); } @@ -263,7 +284,6 @@ void MainWindow::event(){ btnNtpWinClose->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::wind_close_ntp)); btnNtpStop->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::stop_ntp)); } - void MainWindow::wind_close_ntp(){ windowsNnpClose->hide(); } @@ -282,6 +302,7 @@ void MainWindow::stop_ntp(){ this->call(cmd.c_str()); } } + system(cmd.c_str()); this->update_time_date(); @@ -307,6 +328,7 @@ bool MainWindow::focus_ntp(GdkEventFocus* event){ cmd = "/usr/bin/ubconfig set network NTPSERVERS=" + txtNtpServer->get_text(); this->call(cmd.c_str()); } + return true; } @@ -447,6 +469,8 @@ void MainWindow::get_config(){ this->update_hour_minute(); this->update_calendar(); this->enry_dhcp_mess(); + + string read_reg_zon_cfg = this->call("/usr/bin/ubconfig get clock ZONE"); if ((read_reg_zon_cfg != "") && (strstr(read_reg_zon_cfg.c_str() ,"(null)")==NULL)){ read_reg_zon_cfg = read_reg_zon_cfg.substr(read_reg_zon_cfg.find("=")+1,read_reg_zon_cfg.length()); @@ -463,15 +487,29 @@ void MainWindow::get_config(){ } void MainWindow::enter_zone(){ - Glib::ustring zone_text = cbZone->get_active_text(); - Glib::ustring reg_text = cbRegion->get_active_text(); - if(!(zone_text.empty()) && !(reg_text.empty())){ - str_zone=zone_text.substr(zone_text.find(") ")+2,zone_text.length()); - str_region=reg_text; - string cmd = "rm -f /etc/localtime"; - system(cmd.c_str()); - string cmd1 = "ln -s /usr/share/zoneinfo/" + str_region + "/" + str_zone+" /etc/localtime"; - system(cmd1.c_str()); + string reg_text = cbRegion->get_active_text(); + int activ_index = cbZone->get_active_row_number(); + string zone_text = ""; + if(!(reg_text.empty())){ + int index=0; + for (const auto &zone :time_reg_map.at(reg_text)){ + if (index==activ_index){ + zone_text=zone; + } + index+=1; + } + if (!(zone_text.empty())){ + str_zone=zone_text; + str_region=reg_text; + string cmd = "rm -f /etc/localtime"; + system(cmd.c_str()); + string cmd1 = "ln -s /usr/share/zoneinfo/" + str_region + "/" + str_zone+" /etc/localtime"; + system(cmd1.c_str()); + } + else{ + str_zone=""; + str_region=""; + } } else{ str_zone=""; @@ -489,16 +527,30 @@ void MainWindow::parse_text_date(){ } void MainWindow::enter_zone_glob(){ - Glib::ustring zone_text = cbZoneGlob->get_active_text(); - Glib::ustring reg_text = cbRegionGlob->get_active_text(); - if(!(zone_text.empty()) && !(reg_text.empty())){ + string reg_text = cbRegionGlob->get_active_text(); + int activ_index = cbZoneGlob->get_active_row_number(); + string zone_text=""; + if(!(reg_text.empty())){ + int index=0; + for (const auto &zone :time_reg_map.at(reg_text)){ + if (index==activ_index){ + zone_text=zone; + } + index+=1; + } + if (!(zone_text.empty())){ //str_zoneGlob = zone_text.substr(zone_text.find(") ")+2,zone_text.length()); - string cmd = "/usr/bin/ubconfig set clock ZONE=" +reg_text +"/" + zone_text; - system(cmd.c_str()); + string cmd = "/usr/bin/ubconfig set clock ZONE=" +reg_text +"/" + zone_text; + system(cmd.c_str()); + } + else{ + str_zoneGlob=""; + str_region_glob=""; + } } else{ str_zoneGlob=""; - str_region_glob=""; + str_region_glob=""; } } @@ -518,9 +570,12 @@ void MainWindow::set_ntp_toggle_glob(){ void MainWindow::append_region_zone(string region, string zone){ int index = 0; - for ( const auto &text : time_reg_map ) { - cbRegion->append(text.first); - cbRegionGlob->append(text.first); + string reg_local = ""; + for (auto &text : time_reg_map ) { + reg_local = text.first; + //reg_local = string(gettext(reg_local.c_str())); + cbRegion->append(reg_local); + cbRegionGlob->append(reg_local); if (text.first == region){ cbRegionGlob->set_active(index); cbRegion->set_active(index); @@ -528,9 +583,13 @@ void MainWindow::append_region_zone(string region, string zone){ index+=1; } index = 0; + string zone_mixing = ""; + string path_dir = ""; for (const auto &_str_zone : time_reg_map.at(region)){ - cbZone->append(_str_zone); - cbZoneGlob->append(_str_zone); + path_dir=region+"/"+_str_zone; + zone_mixing = this->zone_file_read(path_dir) + string(gettext(_str_zone.c_str())); + cbZone->append(zone_mixing); + cbZoneGlob->append(zone_mixing); if (_str_zone!=""){ if (_str_zone == zone){ cbZone->set_active(index); @@ -541,7 +600,6 @@ void MainWindow::append_region_zone(string region, string zone){ } } - string MainWindow::call(string cmd){ FILE *fp; int status; @@ -551,6 +609,7 @@ string MainWindow::call(string cmd){ exit(1); } while (fgets(path, PATH_MAX, fp) != NULL){ + //printf("%s", path); break; } status = pclose(fp); @@ -562,23 +621,35 @@ string MainWindow::call(string cmd){ } void MainWindow::append_zone(){ - Glib::ustring text = cbRegion->get_active_text(); cbZone->remove_all(); + Glib::ustring text = cbRegion->get_active_text(); + string zone_mixing=""; + string path_dir=""; + if(!(text.empty())){ str_region = text; for (const auto &_str_zone : time_reg_map.at(str_region)){ - cbZone->append(_str_zone); + path_dir=str_region+"/"+_str_zone; + zone_mixing = this->zone_file_read(path_dir) + string(gettext(_str_zone.c_str())); + cbZone->append(zone_mixing); + //cbZone->append(_str_zone); } } } void MainWindow::append_zone_glob(){ - Glib::ustring text = cbRegionGlob->get_active_text(); cbZoneGlob->remove_all(); + Glib::ustring text = cbRegionGlob->get_active_text(); + string zone_mixing=""; + string path_dir=""; + if(!(text.empty())){ str_region_glob = text; for (const auto &_str_zone : time_reg_map.at(str_region_glob)){ - cbZoneGlob->append(_str_zone); + path_dir=str_region+"/"+_str_zone; + zone_mixing = this->zone_file_read(path_dir) + string(gettext(_str_zone.c_str())); + cbZoneGlob->append(zone_mixing); + //cbZoneGlob->append(_str_zone); } } } @@ -595,6 +666,7 @@ void MainWindow::wrapper_update_time_date(){ } void MainWindow::update_time_date(){ + //this->enter_zone(); string cmd = ""; if ((year!=0) && (month !=0) && (day !=0)){ string str_month = ""; @@ -642,29 +714,24 @@ void MainWindow::update_time_date(){ system(cmd.c_str()); } - void MainWindow::post_entry_data(){ string cmd = ""; - string data = txtDate->get_text(); - if (data.length()==10){ - string str_day = data.substr(0,2); - string str_month = data.substr(3,2); - string str_year = data.substr(6,data.length()); - cmd = "date +%Y%m%d -s \"" + str_year+ - str_month+str_day+"\""; - string str_error_clock = this->call(cmd); - size_t index = str_error_clock.find("date: "); - if (index==std::string::npos){ + string data = txtDate->get_text(); + if (data.length()==10){ + string str_day = data.substr(0,2); + string str_month = data.substr(3,2); + string str_year = data.substr(6,data.length()); + cmd = "date +%Y%m%d -s \"" + str_year+ + str_month+str_day+"\""; + string str_error_clock = this->call(cmd); + size_t index = str_error_clock.find("date: "); + if (index==std::string::npos){ + } } else{ lblMessage->set_text(gettext("Incorrect date format")); - mess_dchp->show(); + mess_dchp->show(); } - } - else{ - lblMessage->set_text(gettext("Incorrect date format")); - mess_dchp->show(); - } } void MainWindow::update_hour_minute(){ @@ -703,7 +770,7 @@ void MainWindow::read_file(){ std::string line; namespace fs = std::filesystem; for (const auto & entry : fs::directory_iterator("/usr/share/zoneinfo/")){ - std::ifstream in(entry.path()); + std::ifstream in(entry.path()); // окрываем файл для чтения if (in.is_open()){ string key_reg = entry.path().filename().string(); string path_dir = "/usr/share/zoneinfo/"+key_reg; @@ -715,16 +782,17 @@ void MainWindow::read_file(){ vector zone; zone.push_back(""); for (const auto & entry_zone : fs::directory_iterator(path_dir)){ - std::ifstream in1(entry_zone.path()); + std::ifstream in1(entry_zone.path()); // окрываем файл для чтения if (in1.is_open()){ string key_zone = entry_zone.path().filename().string(); if (key_zone.length()!=0 || key_zone!=" "){ - zone.push_back(string(gettext(key_zone.c_str()))); + zone.push_back(key_zone); } } in1.close(); } - key_reg = string(gettext(key_reg.c_str())); + + key_reg = string(key_reg); time_reg_map.insert({key_reg, zone}); }}}} } @@ -733,6 +801,39 @@ void MainWindow::read_file(){ } } +string MainWindow::zone_file_read(string zone){ + UErrorCode success = U_ZERO_ERROR; + UDate curDate; + int32_t stdOffset,dstOffset; + U_ICU_NAMESPACE::TimeZone *tzWest = U_ICU_NAMESPACE::TimeZone::createTimeZone(zone.c_str()); + U_ICU_NAMESPACE::Calendar* calendar = U_ICU_NAMESPACE::Calendar::createInstance(success); + curDate = calendar->getNow(); + tzWest->getOffset(curDate,true,stdOffset,dstOffset,success); + int offset = stdOffset/(1000*60*60); + string str_utc = ""; + if (offset>=0){ + if (offset<=9){ + str_utc = "(UTC +0" + to_string(offset) + ") "; + } + else{ + str_utc = "(UTC +" + to_string(offset) + ") "; + } + + } + else{ + if (offset>=-9){ + offset*=-1; + str_utc = "(UTC -0" + to_string(offset) + ") "; + } + else{ + str_utc = "(UTC " + to_string(offset) + ") "; + } + } + delete calendar; + delete tzWest; + return str_utc; +} + vector MainWindow::split(const std::string &s, char delim){ std::stringstream ss(s); std::string item; @@ -744,7 +845,8 @@ vector MainWindow::split(const std::string &s, char delim){ } SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder) -: Gtk::Plug{p_socketID}{ +: Gtk::Plug{p_socketID} +{ builder->get_widget("plugBox", plugBox); plugBox->get_parent()->remove(*plugBox); add(*plugBox); diff --git a/source/ubl-settings-datetime.h b/source/ubl-settings-datetime.h index dd8ff92..33abbd2 100644 --- a/source/ubl-settings-datetime.h +++ b/source/ubl-settings-datetime.h @@ -21,6 +21,16 @@ #include #include #include +#include +#include +#include +#include +#include "unicode/utypes.h" +#include "unicode/utext.h" + +#include +#include +#include using namespace std; extern string path_app; @@ -81,6 +91,7 @@ class MainWindow : public Gtk::ApplicationWindow { void stop_ntp(); void wind_close_ntp(); void wrapper_update_time_date(); + string zone_file_read(string zone); string str_remove(std::string& source, const std::string to_remove); vector split(const std::string &s, char delim); private: @@ -130,6 +141,7 @@ class MainWindow : public Gtk::ApplicationWindow { Gtk::Entry *txtNtpServer; Gtk::Entry *txtDate; std::map > time_reg_map; + std::map time_reg_map_local; unsigned int year=0; unsigned int month=0; unsigned int day=0; diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..cd1ec7171f6f2a8941733fb3ebc34fcff844b698 GIT binary patch literal 17176 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 literal 0 HcmV?d00001