diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 7a09353..86ba027 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -139,7 +139,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $this->sccpvalues = $this->dbinterface->get_db_SccpSetting(); //Initialise core settings $this->initializeSccpPath(); //Set required Paths $this->updateTimeZone(); // Get timezone from FreePBX - $this->findInstLangs(); + //$this->findInstLangs(); $this->saveSccpSettings(); } @@ -172,7 +172,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { 'h_show' => $show_Header, 'form_prefix' => $form_prefix, 'fvalues' => $form_values, - 'installedLangs' => $this->installedLangs, + 'installedLangs' => $this->findInstLangs(), 'chanSccpHelp' => $this->sccpHelpInfo, 'sccp_defaults' => $this->sccpvalues ) @@ -496,141 +496,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $res; } - function saveSccpDevice($get_settings, $validateonly = false) { - $hdr_prefix = 'sccp_hw_'; - $hdr_arprefix = 'sccp_hw-ar_'; - $hdr_vendPrefix = 'sccp_hw_vendorconfig'; - - $save_buttons = array(); - $save_settings = array(); - $save_codec = array(); - $name_dev = ''; - $db_field = $this->dbinterface->getSccpDeviceTableData("get_columns_sccpdevice"); - $hw_id = (empty($get_settings['sccp_deviceid'])) ? 'new' : $get_settings['sccp_deviceid']; - $hw_type = (empty($get_settings['sccp_device_typeid'])) ? 'sccpdevice' : $get_settings['sccp_device_typeid']; - $update_hw = ($hw_id == 'new') ? 'add' : 'clear'; // Possible values are delete, replace, add, clear. - $hw_prefix = 'SEP'; - if (!empty($get_settings[$hdr_prefix . 'type'])) { - $value = $get_settings[$hdr_prefix . 'type']; - if (strpos($value, 'ATA') !== false) { - $hw_prefix = 'ATA'; - } - if (strpos($value, 'VG') !== false) { - $hw_prefix = 'VG'; - } - } - foreach ($db_field as $data) { - $key = (string) $data['Field']; - $value = ""; - switch ($key) { - case 'name': - if (!empty($get_settings[$hdr_prefix . 'mac'])) { - $value = $get_settings[$hdr_prefix . 'mac']; - $value = strtoupper(str_replace(array('.', '-', ':'), '', $value)); // Delete mac separators from string - $value = sprintf("%012s", $value); - if ($hw_prefix == 'VG') { - $value = $hw_prefix . $value . '0'; - } else { - $value = $hw_prefix . $value; - } - $name_dev = $value; - } - break; - case 'phonecodepage': - $value = 'null'; - // TODO: getExtConfig(sccp_lang ....) does not accept any additional arguments and will return an array - if (!empty($get_settings[$hdr_prefix . 'devlang'])) { - $lang_data = $this->extconfigs->getExtConfig('sccp_lang', $get_settings[$hdr_prefix . 'devlang']); - if (!empty($lang_data)) { - $value = $lang_data['codepage']; - } - } - break; - case '_hwlang': - if (empty($get_settings[$hdr_prefix . 'netlang']) || empty($get_settings[$hdr_prefix . 'devlang'])) { - $value = 'null'; - } else { - $value = $get_settings[$hdr_prefix . 'netlang'] . ':' . $get_settings[$hdr_prefix . 'devlang']; - } - break; - default: - // handle vendor prefix - if (!empty($get_settings[$hdr_vendPrefix . $key])) { - $value = $get_settings[$hdr_vendPrefix . $key]; - } - // handle array prefix - if (!empty($get_settings[$hdr_arprefix . $key])) { - $arr_data = ''; - $arr_clear = false; - foreach ($get_settings[$hdr_arprefix . $key] as $vkey => $vval) { - $tmp_data = ''; - foreach ($vval as $vkey => $vval) { - switch ($vkey) { - case 'inherit': - if ($vval == 'on') { - $arr_clear = true; - // Злобный ХАК ?!TODO!? - if ($key == 'permit') { - $save_settings['deny'] = 'NONE'; - } - } - break; - case 'internal': - if ($vval == 'on') { - $tmp_data .= 'internal;'; - } - break; - default: - $tmp_data .= $vval . '/'; - break; - } - } - if (strlen($tmp_data) > 2) { - while (substr($tmp_data, -1) == '/') { - $tmp_data = substr($tmp_data, 0, -1); - } - $arr_data .= $tmp_data . ';'; - } - } - while (substr($arr_data, -1) == ';') { - $arr_data = substr($arr_data, 0, -1); - } - if ($arr_clear) { - $value = 'NONE'; - } else { - $value = $arr_data; - } - } - // Now only have normal prefix - if (!empty($get_settings["{$hdr_prefix}{$key}"])) { - $value = $get_settings["{$hdr_prefix}{$key}"]; - } else if (!empty($get_settings["sccp_hw{$key}"])) { - //have an underscore db field - $value = $get_settings["sccp_hw{$key}"]; - } - } - if (!empty($value)) { - $save_settings[$key] = $value; - } - } - // Save this device. - $this->dbinterface->write('sccpdevice', $save_settings, 'replace'); - // Retrieve the phone buttons and write back to - // update sccpdeviceconfig via Trigger - $save_buttons = $this->getPhoneButtons($get_settings, $name_dev, $hw_type); - $this->dbinterface->write('sccpbuttons', $save_buttons, $update_hw, '', $name_dev); - // Create new XML for this device, and then reset or restart the device - // so that it loads the file from TFT. - $this->createSccpDeviceXML($name_dev); - if ($hw_id == 'new') { - $this->aminterface->sccpDeviceReset($name_dev, 'reset'); - } else { - $this->aminterface->sccpDeviceReset($name_dev, 'restart'); - } - - return $save_settings; - } - function handleRoamingUsers($get_settings, $validateonly = false) { $hdr_prefix = 'sccp_ru_'; $hdr_arprefix = 'sccp_ru-ar_'; @@ -650,13 +515,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { case 'name': $value = $name_dev; break; - case '_hwlang': - if (empty($get_settings[$hdr_prefix . 'netlang']) || empty($get_settings[$hdr_prefix . 'devlang'])) { - $value = 'null'; - } else { - $value = $get_settings[$hdr_prefix . 'netlang'] . ':' . $get_settings[$hdr_prefix . 'devlang']; - } - break; default: if (!empty($get_settings[$hdr_prefix . $key])) { $value = $get_settings[$hdr_prefix . $key]; @@ -758,25 +616,59 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { */ private function findInstLangs() { - //locales and languages are installed in the tftp_lang_path - $result = array(); - $langDir = '/'; //set default for when called by installer on virgin system - if (!empty($this->sccppath["tftp_lang_path"])) { - $langDir = $this->sccppath["tftp_lang_path"]; - } - $localeJar = 'be-sccp.jar'; // This jar should exist if the locale is populated - $langArr = $this->extconfigs->getExtConfig('sccp_lang'); - $localeArray = array_combine(array_keys($langArr),array_column($langArr, 'locale')); + //locales and country tones are installed in the tftp_lang_path + //Available packs from provisioner are in masterFilesStructure.xml in tftpRoot Path + // TODO: Need to include this file as part of module in case download not allowed/available - foreach (array_diff(scandir($langDir),array('.', '..')) as $subDir) { - if (is_dir($langDir . DIRECTORY_SEPARATOR . $subDir)) { - $filename = $langDir . DIRECTORY_SEPARATOR . $subDir . DIRECTORY_SEPARATOR . $localeJar; - if (file_exists($filename)) { - $result = array_merge(array_intersect($localeArray,array($subDir)),$result); + $searchDir = '/'; //set default for when called by installer on virgin system + $result = array(); + + if (!file_exists("{$this->sccppath['tftp_path']}/masterFilesStructure.xml")) { + $this->getFileListFromProvisioner(); + } + $tftpBootXml = simplexml_load_file("{$this->sccppath['tftp_path']}/masterFilesStructure.xml"); + + foreach (array('languages', 'countries') as $pack) { + switch ($pack) { + case 'languages': + if (!empty($this->sccppath['tftp_lang_path'])) { + $searchDir = $this->sccppath['tftp_lang_path']; + } + $simpleXmlArr = $tftpBootXml->xpath("//Directory[@name='languages']//DirectoryPath[contains(.,'languages/')]"); + array_shift($simpleXmlArr); // First element is the parent directory + foreach ($simpleXmlArr as $rowIn) { + $tmpArr = explode('/',(string)$rowIn); + array_pop($tmpArr); //last element is empty + $result[$pack]['available'][] = array_pop($tmpArr); + } + $fileToFind = 'be-sccp.jar'; // This file should exist if the locale is populated + break; + case 'countries': + if (!empty($this->sccppath["tftp_countries_path"])) { + $searchDir = $this->sccppath['tftp_countries_path']; + } + $simpleXmlArr = $tftpBootXml->xpath("//Directory[@name='countries']//DirectoryPath[contains(.,'countries/')]"); + array_shift($simpleXmlArr); // First element is the parent directory + foreach ($simpleXmlArr as $rowIn) { + $tmpArr = explode('/',(string)$rowIn); + array_pop($tmpArr); //last element is empty + $result[$pack]['available'][] = array_pop($tmpArr); + } + $fileToFind = 'g3-tones.xml'; // This file should exist if the locale is populated + break; + } + + foreach (array_diff(scandir($searchDir),array('.', '..')) as $subDir) { + if (is_dir($searchDir . DIRECTORY_SEPARATOR . $subDir)) { + $filename = $searchDir . DIRECTORY_SEPARATOR . $subDir . DIRECTORY_SEPARATOR . $fileToFind; + if (file_exists($filename)) { + $result[$pack]['have'][] = $subDir; + } } } } $this->installedLangs = $result; + return $result; } /* @@ -1131,14 +1023,14 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $this->sccp_conf_init['general'][$key] = explode(';', $content); break; case "devlang": - + /* $lang_data = $this->extconfigs->getExtConfig('sccp_lang', $value['data']); if (!empty($lang_data)) { - // TODO: getExtConfig(sccp_lang ....) does not accept any additional arguments and will return an array // TODO: will always get here, but lang_data['codepage'] will be empty as not a valid key $this->sccp_conf_init['general']['phonecodepage'] = $lang_data['codepage']; } break; + */ case "netlang": // Remove Key case "tftp_path": case "sccp_compatible": // This is equal to SccpDBmodel diff --git a/assets/js/sccp_manager.js b/assets/js/sccp_manager.js index 9503f6d..dc0ad4f 100644 --- a/assets/js/sccp_manager.js +++ b/assets/js/sccp_manager.js @@ -666,7 +666,7 @@ $(document).ready(function () { // ----------------------- Get external Files---------------- if ($(this).data('id') === 'get_ext_files') { var dev_cmd = 'get_ext_files'; - var dev_fld = ["device", "locale"]; + var dev_fld = ["device", "locale", "country"]; datas = 'type=' + $(this).data('type') + '&' + 'name=' + '&'; for (var i = 0; i < dev_fld.length; i++) { @@ -697,7 +697,9 @@ $(document).ready(function () { success: function (data) { $('#pleaseWaitDialog').modal('hide'); + console.log(data); data = JSON.parse(data.replace(/^(.*\{)/,"\{")); + console.log(data); if (data.status === true) { if (data.table_reload === true) { $('table').bootstrapTable('refresh'); diff --git a/conf/sccpgeneral.xml.v433 b/conf/sccpgeneral.xml.v433 index 191f5c3..01528b3 100644 --- a/conf/sccpgeneral.xml.v433 +++ b/conf/sccpgeneral.xml.v433 @@ -242,22 +242,23 @@ and open the template in the editor. Base Version before all crash :-) SCCP Language: This is the language for your hints and other features of the phone. If you don't have any languages installed or are using a single language, you can leave this blank. - - SCCP Network Device Language - netlang - English_United_States - - The Network locales allows the phone to play tones (ringing, busy etc.) native to the phone's country. If No language packs found is shown, you need to add locales in the tftp server - - - SCCP Phone Device Language + + Default Device Language devlang English_United_States The user locale allows the phone to display text (menu items, soft keys etc.) native to the phone's language. If No language packs found is shown, you need to add locales in the tftp server + + Network Country + netlang + United_States + + The Network locales allows the phone to play tones (ringing, busy etc.) native to the phone's country. If No language packs found is shown, you need to add locales in the tftp server + + SCCP Device general config @@ -1335,13 +1336,6 @@ and open the template in the editor. Base Version before all crash :-) Time Zone offset - - SCCP Network Device Language - netlang - English_United_States - - The Network locales allows the phone to play tones (ringing, busy etc.) native to the phone's country. If No language packs found is shown, you need to add locales in the tftp server - SCCP Phone Device Language devlang @@ -1349,6 +1343,13 @@ and open the template in the editor. Base Version before all crash :-) The user locale allows the phone to display text (menu items, soft keys etc.) native to the phone's language. If No language packs found is shown, you need to add locales in the tftp server + + SCCP Network Device Language + netlang + English_United_States + + The Network locales allows the phone to play tones (ringing, busy etc.) native to the phone's country. If No language packs found is shown, you need to add locales in the tftp server + phonepersonalization Allow push background from server diff --git a/install.php b/install.php index 16d4116..b6b9506 100644 --- a/install.php +++ b/install.php @@ -249,7 +249,10 @@ function Get_DB_config($sccp_compatible) '_sccp_cos' => array('create' => "VARCHAR(11) NOT NULL default '0x4'", 'modify' => "VARCHAR(11)"), '_dev_sshPassword' => array('create' => "VARCHAR(25) NOT NULL default 'cisco'"), '_dev_sshUserId' => array('create' => "VARCHAR(25) NOT NULL default 'cisco'"), - '_phonepersonalization' => array('create' => "VARCHAR(25) NOT NULL default '0'", 'modify' => "VARCHAR(25)") + '_phonepersonalization' => array('create' => "VARCHAR(25) NOT NULL default '0'", 'modify' => "VARCHAR(25)"), + '_hwlang' => array ('drop' => 'yes'), + '_devlang' => array('create' => "VARCHAR(25) NULL default NULL", 'modify' => "VARCHAR(25)"), + '_netlang' => array('create' => "VARCHAR(25) NULL default NULL", 'modify' => "VARCHAR(25)") ), 'sccpline' => array ( '_regcontext' => array('create' => "VARCHAR(20) NULL default 'sccpregistration'", 'modify' => "VARCHAR(20)"), @@ -927,13 +930,10 @@ function cleanUpSccpSettings() { global $sccp_compatible; // Get current default settings from db - $stmt = $db->prepare("SELECT * FROM sccpsettings"); + $stmt = $db->prepare("SELECT keyword, sccpsettings.* FROM sccpsettings"); $stmt->execute(); - $settingsFromDb = $stmt->fetchAll(\PDO::FETCH_ASSOC); - foreach ($settingsFromDb as $key => $rowArray) { - $settingsFromDb[$rowArray['keyword']] = $rowArray; - unset($settingsFromDb[$key]); - } + $settingsFromDb = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); + // See if a previous version was installed outn("" . _("Checking for previous version of Sccp_manager.") . ""); if (!isset($settingsFromDb['sccp_compatible']['data'])) { @@ -970,7 +970,7 @@ function cleanUpSccpSettings() { } $settingsFromDb = array_merge($settingsFromDb, array_diff_key($thisInstaller->sccpvalues, $settingsFromDb)); unset($thisInstaller->sccpvalues); - + // get chan-sccp defaults $sysConfiguration = $aminterface->getSCCPConfigMetaData('general'); @@ -1019,7 +1019,6 @@ function cleanUpSccpSettings() { unset($sysConfiguration[$key]); } unset($sysConfiguration['Options']); - // Write settings back to db $sql = "TRUNCATE sccpsettings"; $results = $db->query($sql); diff --git a/module.xml b/module.xml index 3e5c4c2..28e6e6d 100644 --- a/module.xml +++ b/module.xml @@ -71,7 +71,6 @@ - diff --git a/sccpManClasses/formcreate.class.php b/sccpManClasses/formcreate.class.php index 6125126..9251361 100644 --- a/sccpManClasses/formcreate.class.php +++ b/sccpManClasses/formcreate.class.php @@ -502,10 +502,17 @@ class formcreate $select_opt= $syslangs; break; case 'SLTD': + // Device Language $select_opt = array('xx' => 'No language packs found'); - if (!empty($installedLangs)) { - $select_opt = (array)$installedLangs; - + if (!empty($installedLangs['languages']['have'])) { + $select_opt = (array)$installedLangs['languages']['have']; + } + break; + case 'SLTN': + // Network Language + $select_opt = array('xx' => 'No country packs found'); + if (!empty($installedLangs['countries']['have'])) { + $select_opt = (array)$installedLangs['countries']['have']; } break; case 'SLZ': @@ -620,22 +627,40 @@ class formcreate name; $res_id = $npref.$res_n; $child->value =''; + $selectArray = array(); // $select_opt is an associative array for these types. if (!empty($metainfo[$res_n])) { if ($child->meta_help == '1' || $child->help == 'Help!') { $child->help = $metaInfo[$res_n]; } } - $select_opt = array('xx' => 'No language packs found'); - if (!empty($installedLangs)) { - $select_opt = $installedLangs; + + switch ($child['type']) { + case 'SLDA': + $select_opt = array('xx' => 'No language packs found'); + if (!empty($installedLangs['languages']['have'])) { + $select_opt = $installedLangs['languages']['have']; + } + $selectArray = $installedLangs['languages']['available']; + $requestType = 'locale'; + break; + + case 'SLNA': + $select_opt = array('xx' => 'No country packs found'); + if (!empty($installedLangs['countries']['have'])) { + $select_opt = $installedLangs['countries']['have']; + } + $selectArray = $installedLangs['countries']['available']; + $requestType = 'country'; + break; } + if (empty($child->class)) { $child->class = 'form-control'; } @@ -649,9 +674,7 @@ class formcreate $child->value = $child->default; } } - $langArr = \FreePBX::Sccp_manager()->extconfigs->getExtConfig('sccp_lang'); - $selectArray = array_combine(array_keys($langArr),array_column($langArr, 'locale')); - $requestType = 'locale'; + ?> @@ -671,9 +694,8 @@ class formcreate foreach ($select_opt as $key => $val) { $opt_key = $key; $opt_val = $val; - - echo 'value) { + echo 'value) { echo ' selected="selected"'; } echo "> {$opt_val} "; @@ -683,7 +705,7 @@ class formcreate - + diff --git a/sccpManClasses/xmlinterface.class.php b/sccpManClasses/xmlinterface.class.php index 7b55cf2..e744acf 100644 --- a/sccpManClasses/xmlinterface.class.php +++ b/sccpManClasses/xmlinterface.class.php @@ -122,6 +122,47 @@ class xmlinterface // Need to merge the two arrays so that device specific values override system values // Values that cannot be sent to the device by chan-sccp are prefixed by an underscore // so need to be sure that we apply the same convention to system wide defaults. + $langCodeArray = array( + 'Arabic_Saudi_Arabia' => 'ar', + 'Bulgarian_Bulgaria' => 'bg', + 'Czech_Czech_Republic' => 'cz', + 'Danish_Denmark' => 'da', + 'German_Germany' => 'de', + 'Greek_Greece' => 'el', + 'AU_English_United_States' => 'en', + 'English_United_Kingdom' => 'en', + 'English_United_States' => 'en', + 'Spanish_Spain' => 'es', + 'Estonian_Estonia' => 'et', + 'Finnish_Finland' => 'fi', + 'French_Canada' => 'fr', + 'French_France' => 'fr', + 'Hebrew_Israel' => 'he', + 'Croatian_Croatia' => 'hr', + 'Hungarian_Hungary' => 'hu', + 'Italian_Italy' => 'it', + 'Japanese_Japan' => 'ja', + 'Korean_Korea_Republic' => 'ko', + 'Lithuanian_Lithuania' => 'lt', + 'Latvian_Latvia' => 'lv', + 'Dutch_Netherlands' => 'nl', + 'Norwegian_Norway' => 'no', + 'Polish_Poland' => 'pl', + 'Portuguese_Brazil' => 'pt', + 'Portuguese_Portugal' => 'pt', + 'Romanian_Romania' => 'ro', + 'Russian_Russian_Federation' => 'ru', + 'Slovak_Slovakia' => 'sk', + 'Slovenian_Slovenia' => 'sl', + 'Serbian_Republic_of_Montenegro' => 'sr', + 'Serbian_Republic_of_Serbia' => 'rs', + 'Swedish_Sweden' => 'sv', + 'Thai_Thailand' => 'th', + 'Turkish_Turkey' => 'tr', + 'Chinese_China' => 'cn', + 'Chinese_Taiwan' => 'zh' + ); + $data_values = array_merge($data_values, $dev_config); $var_xml_general_fields = array('authenticationurl' => 'dev_authenticationURL', 'informationurl' => 'dev_informationURL', 'messagesurl' => 'dev_messagesURL', 'servicesurl' => 'dev_servicesURL', 'directoryurl' => 'dev_directoryURL', 'idleurl' => 'dev_idleURL', @@ -313,31 +354,39 @@ class xmlinterface break; case 'userlocale': - case 'networklocaleinfo': + // Device language + $lang = $data_values['devlang']; + if (!empty($dev_config['_devlang'])) { + $lang = $dev_config['_devlang']; + } + $xml_node->winCharSet = $dev_config['phonecodepage']; + $xml_node->name = $dev_config['_devlang']; + $xml_node->langCode = 'en'; + if (isset($langCodeArray['_devlang'])) { + $xml_node->langCode = $langCodeArray['_devlang']; + } + $this->replaceSimpleXmlNode($xml_work->$key, $xml_node); + break; case 'networklocale': - $hwlang = ''; - $lang = ''; - if (!empty($dev_config["_hwlang"])) { - $hwlang = explode(':', $dev_config["_hwlang"]); + $lang = $data_values['_netlang']; + if (!empty($dev_config['_netlang'])) { + $lang = $dev_config['_netlang']; } - if (($key_l == 'networklocaleinfo') || ($key_l == 'networklocale')) { - $lang = (empty($hwlang[0])) ? $data_values['netlang'] : $hwlang[0]; + if (($lang != null) && (!empty($lang))) { + $xml_work->$key = $lang; + $this->replaceSimpleXmlNode($xml_work->$key, $xml_node); } else { - $lang = (empty($hwlang[1])) ? $data_values['devlang'] : $hwlang[1]; + $xml_work->$key = ''; + } + break; + case 'networklocaleinfo': + $lang = $data_values['_netlang']; + if (!empty($dev_config['_netlang'])) { + $lang = $dev_config['_netlang']; } - if (($lang != 'null') && (!empty($lang))) { - if ($key_l == 'networklocale') { - $xml_work->$key = $lang; - } else { - if (isset($lang_info[$lang])) { - $xml_node->name = $lang_info[$lang]['locale']; - $xml_node->langCode = $lang_info[$lang]['code']; - if ($key_l == 'userlocale') { - $xml_node->winCharSet = $lang_info[$lang]['codepage']; - } - $this->replaceSimpleXmlNode($xml_work->$key, $xml_node); - } - } + if (($lang != null) && (!empty($lang))) { + $xml_node->name = $dev_config['_netlang']; + $this->replaceSimpleXmlNode($xml_work->$key, $xml_node); } else { $xml_work->$key = ''; } @@ -714,7 +763,7 @@ class xmlinterface $put_file = (string) $get_settings['idtemplate']; } } else { - $errors = array('Fields Dial Plan Name is requered !!'); + $errors = array('Fields Dial Plan Name is required !!'); } if (empty($errors)) { diff --git a/sccpManTraits/ajaxHelper.php b/sccpManTraits/ajaxHelper.php index f3a7013..5c0112c 100644 --- a/sccpManTraits/ajaxHelper.php +++ b/sccpManTraits/ajaxHelper.php @@ -433,7 +433,7 @@ trait ajaxHelper { // Value unchanged or null so ignore and go to next key. continue; } - $dbSaveArray[] = array('table' => 'sccpdevice', 'field' => $key, 'Default' => $value); + $dbSaveArray[$key] = array('table' => 'sccpdevice', 'field' => $key, 'Default' => $value); continue; } $key = (str_replace('sccpline_', '', $key, $count_mods)); @@ -450,24 +450,11 @@ trait ajaxHelper { // Value unchanged so ignore and get next key. continue; } - $dbSaveArray[] = array('table' => 'sccpline', 'field' => $key, 'Default' => $value); + $dbSaveArray[$key] = array('table' => 'sccpline', 'field' => $key, 'Default' => $value); unset($request[$key]); continue; } - $key = (str_replace($hdr_prefix, '', $key, $count_mods)); - if ($count_mods) { - if (!empty($this->sccpvalues[$key]) && ($this->sccpvalues[$key]['data'] != $value)) { - $save_settings[$key] = array( - 'keyword' => $key, - 'data' => $value, - 'seq' => $this->sccpvalues[$key]['seq'], - 'type' => $this->sccpvalues[$key]['type'], - 'systemdefault' => $this->sccpvalues[$key]['systemdefault'] - ); - } - - } $key = (str_replace($hdr_arprefix, '', $key, $count_mods)); if ($count_mods) { $arr_data = ''; @@ -508,6 +495,21 @@ trait ajaxHelper { } } } + + $key = (str_replace($hdr_prefix, '', $key, $count_mods)); + if ($count_mods) { + if (!empty($this->sccpvalues[$key]) && ($this->sccpvalues[$key]['data'] != $value)) { + $save_settings[$key] = array( + 'keyword' => $key, + 'data' => $value, + 'seq' => $this->sccpvalues[$key]['seq'], + 'type' => $this->sccpvalues[$key]['type'], + 'systemdefault' => $this->sccpvalues[$key]['systemdefault'] + ); + } + + } + switch ($key) { case 'audiocodecs': foreach ($value as $keycodeс => $valcodeс) { @@ -545,6 +547,7 @@ trait ajaxHelper { } break; } + } $extSettings = $this->extconfigs->updateTftpStructure(array_merge($this->sccpvalues, $save_settings)); @@ -554,12 +557,12 @@ trait ajaxHelper { $this->sccpvalues = $this->dbinterface->get_db_SccpSetting(); } - foreach ($dbSaveArray as $rowToSave) { + foreach ($dbSaveArray as $key => $rowToSave) { $this->dbinterface->updateTableDefaults($rowToSave['table'], $rowToSave['field'], $rowToSave['Default']); } $this->createDefaultSccpConfig(); // Rewrite Config. - $save_settings[] = array('status' => true); + $save_settings[] = array('status' => true, ); $this->createDefaultSccpXml(); return $save_settings; @@ -624,10 +627,9 @@ trait ajaxHelper { $msg = "Firmware for {$device} has been successfully downloaded"; break; case 'locale': - $locale = $request['locale']; + $language = $request['locale']; $totalFiles = 0; - $langArr = \FreePBX::Sccp_manager()->extconfigs->getExtConfig('sccp_lang'); - $language = $langArr[$locale]['locale']; + if (!is_dir("{$this->sccppath['tftp_lang_path']}/{$language}")) { mkdir("{$this->sccppath['tftp_lang_path']}/{$language}", 0755); @@ -678,14 +680,176 @@ trait ajaxHelper { flush(); } } - $msg = "{$locale} Locale and Country tones have been successfully downloaded"; + $msg = "{$language} Locale and Country tones have been successfully downloaded"; + break; + case 'country': + $countryName = $request['country']; + $totalFiles = 0; + + if (!is_dir("{$this->sccppath['tftp_countries_path']}/{$countryName}")) { + mkdir("{$this->sccppath['tftp_countries_path']}/{$countryName}", 0755); + } + + $result = $tftpBootXml->xpath("//Directory[@name='{$countryName}']"); + $filesToGet['countries'] = (array)$result[0]->FileName; + $totalFiles += count($filesToGet['countries']); + $countriesSrcDir = (string)$result[0]->DirectoryPath; + $countriesDstDir = "{$this->sccppath['tftp_countries_path']}/{$countryName}"; + + $filesRetrieved = 0; + + foreach (array('countries') as $section){ + $srcDir = ${"{$section}SrcDir"}; + $dstDir = ${"{$section}DstDir"}; + foreach ($filesToGet[$section] as $srcFile) { + file_put_contents("{$dstDir}/{$srcFile}", + file_get_contents($provisionerUrl . $srcDir . $srcFile)); + $filesRetrieved ++; + $percentComplete = $filesRetrieved *100 / $totalFiles; + $data = "{$percentComplete},"; + echo $data; + ob_flush(); + flush(); + } + } + $msg = "{$countryName} country tones have been successfully downloaded"; + break; + default: + return false; break; - default: - return false; - break; } return array('status' => true, 'message' => $msg, 'reload' => true); } + + function saveSccpDevice($get_settings, $validateonly = false) { + dbug($get_settings); + $hdr_prefix = 'sccp_hw_'; + $hdr_arprefix = 'sccp_hw-ar_'; + $hdr_vendPrefix = 'sccp_hw_vendorconfig'; + + $save_buttons = array(); + $save_settings = array(); + $save_codec = array(); + $name_dev = ''; + $db_field = $this->dbinterface->getSccpDeviceTableData("get_columns_sccpdevice"); + $hw_id = (empty($get_settings['sccp_deviceid'])) ? 'new' : $get_settings['sccp_deviceid']; + $hw_type = (empty($get_settings['sccp_device_typeid'])) ? 'sccpdevice' : $get_settings['sccp_device_typeid']; + $update_hw = ($hw_id == 'new') ? 'add' : 'clear'; // Possible values are delete, replace, add, clear. + $hw_prefix = 'SEP'; + if (!empty($get_settings[$hdr_prefix . 'type'])) { + $value = $get_settings[$hdr_prefix . 'type']; + if (strpos($value, 'ATA') !== false) { + $hw_prefix = 'ATA'; + } + if (strpos($value, 'VG') !== false) { + $hw_prefix = 'VG'; + } + } + foreach ($db_field as $data) { + $key = (string) $data['Field']; + $value = ""; + switch ($key) { + case 'name': + if (!empty($get_settings[$hdr_prefix . 'mac'])) { + $value = $get_settings[$hdr_prefix . 'mac']; + $value = strtoupper(str_replace(array('.', '-', ':'), '', $value)); // Delete mac separators from string + $value = sprintf("%012s", $value); + if ($hw_prefix == 'VG') { + $value = $hw_prefix . $value . '0'; + } else { + $value = $hw_prefix . $value; + } + $name_dev = $value; + } + break; + case 'phonecodepage': + $value = 'ISO8859-1'; + // TODO: May be other exceptions. Historically this is the only one handled + if (!empty($get_settings["{$hdr_prefix}devlang"])) { + if ($get_settings["{$hdr_prefix}devlang"] == "Russian_Russian_Federation") { + $value = 'CP1251'; + } + } + break; + default: + // handle vendor prefix + if (!empty($get_settings[$hdr_vendPrefix . $key])) { + $value = $get_settings[$hdr_vendPrefix . $key]; + } + // handle array prefix + if (!empty($get_settings[$hdr_arprefix . $key])) { + $arr_data = ''; + $arr_clear = false; + foreach ($get_settings[$hdr_arprefix . $key] as $vkey => $vval) { + $tmp_data = ''; + foreach ($vval as $vkey => $vval) { + switch ($vkey) { + case 'inherit': + if ($vval == 'on') { + $arr_clear = true; + // Злобный ХАК ?!TODO!? + if ($key == 'permit') { + $save_settings['deny'] = 'NONE'; + } + } + break; + case 'internal': + if ($vval == 'on') { + $tmp_data .= 'internal;'; + } + break; + default: + $tmp_data .= $vval . '/'; + break; + } + } + if (strlen($tmp_data) > 2) { + while (substr($tmp_data, -1) == '/') { + $tmp_data = substr($tmp_data, 0, -1); + } + $arr_data .= $tmp_data . ';'; + } + } + while (substr($arr_data, -1) == ';') { + $arr_data = substr($arr_data, 0, -1); + } + if ($arr_clear) { + $value = 'NONE'; + } else { + $value = $arr_data; + } + } + // Now only have normal prefix + if (!empty($get_settings["{$hdr_prefix}{$key}"])) { + $value = $get_settings["{$hdr_prefix}{$key}"]; + } else if (!empty($get_settings["sccp_hw{$key}"])) { + //have an underscore db field + $value = $get_settings["sccp_hw{$key}"]; + } + } + if (!empty($value)) { + $save_settings[$key] = $value; + } + } + // Save this device. + $this->dbinterface->write('sccpdevice', $save_settings, 'replace'); + // Retrieve the phone buttons and write back to + // update sccpdeviceconfig via Trigger + $save_buttons = $this->getPhoneButtons($get_settings, $name_dev, $hw_type); + $this->dbinterface->write('sccpbuttons', $save_buttons, $update_hw, '', $name_dev); + // Create new XML for this device, and then reset or restart the device + // so that it loads the file from TFT. + $this->createSccpDeviceXML($name_dev); + if ($hw_id == 'new') { + $this->aminterface->sccpDeviceReset($name_dev, 'reset'); + } else { + $this->aminterface->sccpDeviceReset($name_dev, 'restart'); + } + $msg = "Device Saved"; + + return array('status' => true, 'message' => $msg, 'reload' => true); + } + } ?> diff --git a/sccpManTraits/helperFunctions.php b/sccpManTraits/helperFunctions.php index 7815b61..a5a2bf9 100644 --- a/sccpManTraits/helperFunctions.php +++ b/sccpManTraits/helperFunctions.php @@ -307,7 +307,7 @@ trait helperfunctions { $this->sccpvalues[(string) $child->name] = array('keyword' => (string) $child->name, 'data' => $datav, 'type' => '2', 'seq' => $seq, 'systemdefault' => ''); } } - if (in_array($child['type'], array('SLD', 'SLS', 'SLT', 'SL', 'SLM', 'SLZ', 'SLTZN', 'SLA'))) { + if (in_array($child['type'], array('SLD', 'SLS', 'SLT', 'SLNA', 'SLDA', 'SL', 'SLM', 'SLZ', 'SLTZN', 'SLA'))) { if (empty($child->value)) { $datav = (string) $child->default; } else { diff --git a/views/formShowSysDefs.php b/views/formShowSysDefs.php index bcb1022..e03936e 100644 --- a/views/formShowSysDefs.php +++ b/views/formShowSysDefs.php @@ -78,13 +78,15 @@ foreach ($items as $child) { case 'SLP': case 'SLS': case 'SLTD': + case 'SLTN': case 'SLA': case 'SLZ': case 'SL': \FreePbx::sccp_manager()->formcreate->addElementSL($child, $fvalues, $sccp_defaults,$npref, $installedLangs); break; - case 'SLT': - \FreePbx::sccp_manager()->formcreate->addElementSLT($child, $fvalues, $sccp_defaults,$npref, $installedLangs); + case 'SLDA': + case 'SLNA': + \FreePbx::sccp_manager()->formcreate->addElementSLNA($child, $fvalues, $sccp_defaults,$npref, $installedLangs); break; case 'SDM': case 'SDMS': diff --git a/views/getFileModal.html b/views/getFileModal.html index 30aec63..f9733be 100644 --- a/views/getFileModal.html +++ b/views/getFileModal.html @@ -1,5 +1,5 @@ - + @@ -27,14 +27,20 @@ "; - } else { - echo ""; + switch ($requestType) { + case 'firmware': + echo ""; + break; + case 'locale': + echo ""; + break; + case 'country': + echo ""; + break; } foreach ($selectArray as $key => $val) { - echo "{$val}";