Restructure languages and locales management

Base off of provision file structure
Store netlang and devlang
Stop usage of extconfig ->sccplang
This commit is contained in:
steve-lad 2021-07-23 12:14:46 +02:00
parent 215cacae41
commit 4151b4fdae
11 changed files with 394 additions and 258 deletions

View file

@ -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

View file

@ -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');

View file

@ -242,22 +242,23 @@ and open the template in the editor. Base Version before all crash :-)
<select></select>
<help>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.</help>
</item>
<item type="SLT" id="2">
<label>SCCP Network Device Language</label>
<name>netlang</name>
<default>English_United_States</default>
<select></select>
<help>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</help>
</item>
<item type="SLTD" id="3">
<label>SCCP Phone Device Language</label>
<item type="SLDA" id="3">
<label>Default Device Language</label>
<name>devlang</name>
<default>English_United_States</default>
<select> </select>
<help>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</help>
</item>
<item type="SLNA" id="2">
<label>Network Country</label>
<name>netlang</name>
<default>United_States</default>
<select></select>
<help>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</help>
</item>
</page_group>
<page_group name="sccp_dev_config">
<label>SCCP Device general config</label>
<item type="IE" id="1">
@ -1335,13 +1336,6 @@ and open the template in the editor. Base Version before all crash :-)
<select></select>
<help>Time Zone offset</help>
</item>
<item type="SLTD" id="4" seq="98">
<label>SCCP Network Device Language</label>
<name>netlang</name>
<default>English_United_States</default>
<select></select>
<help>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</help>
</item>
<item type="SLTD" id="5" seq="98">
<label>SCCP Phone Device Language</label>
<name>devlang</name>
@ -1349,6 +1343,13 @@ and open the template in the editor. Base Version before all crash :-)
<select> </select>
<help>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</help>
</item>
<item type="SLTN" id="4" seq="98">
<label>SCCP Network Device Language</label>
<name>netlang</name>
<default>English_United_States</default>
<select></select>
<help>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</help>
</item>
<item type="IS" id="11" seq="98">
<name>phonepersonalization</name>
<label>Allow push background from server </label>

View file

@ -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("<li>" . _("Checking for previous version of Sccp_manager.") . "</li>");
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);

View file

@ -71,7 +71,6 @@
<field name="backgroundThumbnail" type="string" length="255" notnull="false"/>
<field name="ringtone" type="string" length="255" notnull="false"/>
<field name="callhistory_answered_elsewhere" type="string" notnull="false"/>
<field name="_hwlang" type="string" length="12" notnull="false"/>
<field name="_loginname" type="string" length="20" notnull="false"/>
<field name="_profileid" type="integer" default="0"/>
<field name="_dialrules" type="string" length="255" notnull="false"/>

View file

@ -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
<?php
}
function addElementSLT($child, $fvalues, $sccp_defaults,$npref, $installedLangs) {
// Input element Select SLS - System Language
function addElementSLNA($child, $fvalues, $sccp_defaults,$npref, $installedLangs) {
// Input element Select SLS - System Language with add from external
$res_n = (string)$child ->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';
?>
<div class="element-container">
<div class="row">
@ -671,9 +694,8 @@ class formcreate
foreach ($select_opt as $key => $val) {
$opt_key = $key;
$opt_val = $val;
echo '<option value="' . $opt_key . '"';
if ($opt_key == $child->value) {
echo '<option value="' . $opt_val . '"';
if ($opt_val == $child->value) {
echo ' selected="selected"';
}
echo "> {$opt_val} </option>";
@ -683,7 +705,7 @@ class formcreate
</div>
</div>
<div class="col-md-3">
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target=".get_ext_file"><i class="fa fa-bolt"></i> <?php echo _("Get language from Provisioner");?>
<button type="button" class="btn btn-primary btn-lg" id="<?php echo $requestType;?>" data-toggle="modal" data-target=".get_ext_file_<?php echo $requestType;?>"><i class="fa fa-bolt"></i> <?php echo _("Get $requestType from Provisioner");?>
</button>
</div>
</div>

View file

@ -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)) {

View file

@ -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);
}
}
?>

View file

@ -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 {

View file

@ -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':

View file

@ -1,5 +1,5 @@
<!--Begin modal include-->
<div class="modal fade get_ext_file" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
<div class="modal fade get_ext_file_<?php echo $requestType;?>" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
@ -27,14 +27,20 @@
<div class="col-md-3">
<div class = "lnet form-group form-inline" data-nextid=1>
<?php
if ($requestType == 'firmware') {
echo "<select class='form-control' id='ext_device'>";
} else {
echo "<select class='form-control' id='ext_locale'>";
switch ($requestType) {
case 'firmware':
echo "<select class='form-control' id='ext_device'>";
break;
case 'locale':
echo "<select class='form-control' id='ext_locale'>";
break;
case 'country':
echo "<select class='form-control' id='ext_country'>";
break;
}
foreach ($selectArray as $key => $val) {
echo "<option value= '{$key}'";
if ($key == 'en_GB') {
echo "<option value= '{$val}'";
if (($val == 'English_United_Kingdom') || ($val == 'United_Kingdom')) {
echo ' selected="selected"';
}
echo ">{$val}</option>";