Объект jsext - имеет набор вспомогательных функций, которые доступны в контексте исполнения программы JavaScript на стороне сервера jCjS.


Свойства (property)

не имеет


Сигналы

не имеет


Функции

Пример использования:

// Функция (возвращает некое значение)
var arg1 = 12;
var arg2 = 'text' + '/' + 'xml';
var retVal = jsext.function(arg1, arg2, .....);


String jsext.objToString(Variant, bool req = false) Функция
выдать строковое значение представление объекта (сериализации).
Если req=true, выдаваемая строка не будет обрамлена скобками () (Стандартный JSON), в противном случае вывод имеет формат '( JSON )' и пригодна к выполнению JS функции eval в качестве аргумента
Если использование eval не предвидиться используйте нативную функцию JSON.stringify() которая успешно работает на стороне jCjS и в браузере клиента или post.stringify() на стороне сервера jCjS.

//проверка текстовой сериализации строки
var o = obj = {};
obj.a = {};
obj.a.a = "vdfvtrvfdvdfvbg";
obj.a.b = [1,2,3,4,5];
obj.b = new Date();
obj.c = { a: "dewdwed", c: true, d: 123, e: 0.124, f: undefined };

// сериализация
s = jsext.objToString(obj);
o = eval(s);
s += "\r\n --> \r\n" + jsext.objToString(o);

// рекомендуется к использованию следующий код
/*
s = JSON.stringify(obj, null, 0);
o = JSON.parse(s);  // или так o = eval('('+s+')');
s += "\r\n --> \r\n" + JSON.stringify(o, null, 0);
*/
http.respPlainText(s);
Выведет в браузер следующий код
{"a":{"a":"vdfvtrvfdvdfvbg","b":[1,2,3,4,5]},"b":"2015-01-14T13:35:47.620Z","c":{"a":"dewdwed","c":true,"d":123,"e":0.124}}
 -->
{"a":{"a":"vdfvtrvfdvdfvbg","b":[1,2,3,4,5]},"b":"2015-01-14T13:35:47.620Z","c":{"a":"dewdwed","c":true,"d":123,"e":0.124}}

ВНИМАНИЕ!!! В функции JSON.stringify() есть одно досадное свойство, если в объекте встречается ссылка на удаленный Qt объект, функция вернет ошибку.

var obj = {}
obj.a = ''
obj.b = 123
obj.c = new Timer()
obj.d = new Timer()
obj.d.timeout.connect(function(){
    try{
        post.log(JSON.stringify(obj, 0, 2)) // Ошибка!!!  В объекте есть битый объект
    }catch(e){
        post.log(jsext.stringify(obj, 0, 2)) // Все ОК
    }
})
obj.d.start(1000)

// Удалить таймер
post.deleteObject(obj.c)

// Если передать корень объекта в функцию удаления, то jCjS найдет все Qt объекты в нем и корректно удалит

post.deleteObject(obj)                 // Удаление всех Qt объектов, содержащихся в obj

post.log(JSON.stringify(obj, 0, 2)) // Все норма!!!

ВНИМАНИЕ!!! В функции jsext.stringify() тоже есть минусы - при передаче ей в аргументе Qt объекта, она выводит только его свойства, и не видит именованые параметры созданые в контексте JS
Функция post.stringify() лишена всех минусов и рекомендована к использованию

var tmr = new Timer()
tmr.myObj = {}
tmr.myObj.a = ''
tmr.myObj.b = 123

post.log(jsext.stringify(tmr, 0, 2)) // Не выводятся поля объекта tmr.myObj.  Только свойства tmr

post.log(post.stringify(tmr, 0, 2)) // post.stringify() лишена всех минусов и рекомендована к использованию

Функцию jsext.objToString(Variant) удобно использовать для вывода для отладки скриптов. С помощью ее выводятся описание всех ключей и значений объекта, но в отличии от JSON, они выводятся отсортироваными по ключу.
Вот пример вывода всех свойст объекта http в браузер.

http.respPlainText(jsext.objToString(http));

String jsext.stringify(Variant, bool req = false) Функция
выдать строковое значение представление объекта (сериализации).

http.respPlainText(jsext.stringify(http));
// равносильно следующей строке
http.respPlainText(jsext.objToString(http), true);

String jsext.intFormat(int val, fieldWidth = 0, base = 10, fillChar = "") Функция
String jsext.uintFormat(int val, fieldWidth = 0, base = 10, fillChar = "") Функция
String jsext.realFormat(double val, fieldWidth = 0, format = "g", precision = -1, fillChar = "") Функция
Функции для гибкого форматирования чисел
Аргументы:

Пример использования

// форматирование чисел
jsext.intFormat(  12, 4, 10, "0");          // возвратит  '0012'
jsext.intFormat( -12, 4, 10, "0");          // возвратит '-0012'
jsext.uintFormat(-12, 4, 10, "0");          // возвратит '4294967284'
jsext.uintFormat(-12, 4, 16, "0");          // возвратит 'fffffff4'
jsext.realFormat( 12.145, 6, "g", 4, "0");  // возвратит '012.14'
jsext.realFormat( 12.145, 6, "f", 4, "0");  // возвратит '012.14'
jsext.realFormat( 12.145, 6, "e", 4, "0");  // возвратит '012.14'


String jsext.format(str, arg) Функция
Функции для гибкого форматирования строк
Аргументы:

Пример использования

// форматирование строк
var obj = {}

obj.format_1 = jsext.format('%d', 12);                   // возвратит  '12'
obj.format_2 = jsext.format('%0.1f', 12.345);            // возвратит  '12.3'
obj.format_3 = jsext.format('dd.MM.yyyy',   new Date()); // возвратит  '21.05.2014'
obj.format_4 = jsext.format('ddd MMMM d yy',new Date()); // возвратит  'Ср Май 21 14'
obj.format_5 = jsext.format('hh:mm:ss.zzz', new Date()); // возвратит  '14:13:09.042'
obj.format_6 = jsext.format('%02X ', [1, 2, 3, 254] );   // возвратит  '01 02 03 FF '

var ba = new ByteArray([1, 2, 3, 254])
obj.format_7 = jsext.format('%02X ', ba);   // возвратит  '01 02 03 FF '

//http.respPlainText(JSON.stringify(obj,  null, 5));
http.respPlainText(jsext.stringify(obj));

Выведет в браузер следующий код
{
    format_1: "12",
    format_2: "12.3",
    format_3: "21.05.2014",
    format_4: "Ср Май 21 14",
    format_5: "14:13:09.042",
    format_6: "01 02 03 FE ",
    format_7: "01 02 03 FE "
}


String jsext.toStrHex(str, arg) Функция
Функции для форматирования числа в HEX
Аргументы:

Пример использования

if(http.argExist("toStrHex"))
{
    var obj = {}
    obj.toStrHex = jsext.toStrHex(111, 2);                  // возвратит  '6F'

    http.respPlainText(JSON.stringify(obj,  null, 1));
    return;
}
Выведет в браузер следующий код
{
 "toStrHex" : "6F"
}


String jsext.printHex(varArray) Функция
Функции для форматирования массива чисел в HEX
Аргумент varArray - Массив чисел [1,2,3,4,5,6,7...]

Пример использования

if(http.argExist("printHex"))
{
    var obj = {}
    obj.printHex = jsext.printHex([1,2,3,4,5,6,7]);                  // возвратит  '0x01 0x02 0x03 0x04 0x05 0x06 0x07 '

    http.respPlainText(JSON.stringify(obj,  null, 1));
    return;
}
Выведет в браузер следующий код
{
 "printHex": "0x01 0x02 0x03 0x04 0x05 0x06 0x07 "
}


String jsext.timeStamp() Функция
Функции для вывода текущего времени ан сервере jCjS в формате "yyyy-MM-dd-hh:mm:ss.zzz"
Аргумент varArray - Массив чисел [1,2,3,4,5,6,7...]

Пример использования

if(http.argExist("timeStamp"))
{
    var obj = {}
    obj.printHex = jsext.timeStamp();

    http.respPlainText(JSON.stringify(obj,  null, 1));
    return;
}
Выведет в браузер следующий код
{
 "printHex": "2014-05-21-17:46:41.193"
}


String jsext.toBase64(arg) Функция
Функции для шифрования данных по алгоритму Base64
В отличии от функции server.toBase64(), которая может принимать только строковый тип данных, аргументами могут служить типы данных:

Пример использования можно посмотреть в stuff/examples/repository/cmdRepository.js


String jsext.fromBase64Str(String) Функция
jCjSByteArray jsext.fromBase64ByteArr(String) Функция
array jsext.fromBase64Arr(String) Функция
Функции для дешифрования данных по алгоритму Base64
Пример использования можно посмотреть в stuff/examples/repository/cmdRepository.js


int jsext.fromBase64ToObj(String, QObject) Функция
Функции для дешифрования данных по алгоритму Base64
возвращает количество переданных байт данных. -1 если объект QObject не получил данные.
Пример использования можно посмотреть в stuff/examples/repository/cmdRepository.js


ByteArray jsext.crc16(data, len=0) Функция для расчета контрольной суммы CRC-16 IBM для Modbus RTU
ByteArray jsext.crc16_ccitt(data, len=0) Функция для расчета контрольной суммы CRC-16 CCITT
ByteArray jsext.crc32(data, len=0) Функция для расчета контрольной суммы CRC-32 IBM
hexString jsext.csAscii(data, len) Функция для расчета контрольной суммы Modbus ASCII
hex или int jsext.csAscii(data, numb)
hex или int jsext.csAscii(data, len, numb)
hex или int jsext.csAscii(data, numb, len)
Аргументы:
data - обрабатываемые данные len - длинна обрабатываемых данных (если отрицательное значение, то данные будут обрезаны с конца массива)
numb - числовое представление (по умолчанию выдает HEX значение)
ВНИМАНИЕ!!! аргумент numb может принимать только булевое значение true или false
quint16 jsext.csElemer(Variant) Функция для приборов контроля температуры Элемер
Array jsext.csPolimaster(Variant) Функция для приборов ООО Полимастер
Функции для расчета контрольных сумм
Если вы проверяете данные полученные от объекта SerialTaskWrap, то лучше воспользоваться встроенным функционалом контроля контрольных сумм
Если вы преобразуете данные из ByteArray, то лучше воспользоваться встроенным функционалом ByteArray
Аргументами могут служить типы данных:

Пример использования

var getCrc16  = jsext.crc16(task.readArray.slice(0, 4)); // первых четыре байта
var testCrc16 = task.readArray.slice(4, 6);              // Два последних байта

if(getCrc16[0] !== testCrc16[0] || getCrc16[1] !== testCrc16[1])
{
    post.log('e', "в ответе ошибка контрольной суммы");
}

Array jsext.toShort(Variant, swap2LE = false) Функция
List(Number) jsext.toInt16(Variant, swap2LE = false) Функция
List(Number) jsext.toUInt16(Variant, swap2LE = false) Функция
List(Number) jsext.toInt(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toUInt(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toInt32(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toUInt32(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toInt64(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toUInt64(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toFloat(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toDouble(Variant, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toInt64d(Variant, div = 10000.0, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) jsext.toUInt64d(Variant, div = 10000.0, swap2LE = false, swapWords = false, swapBytes = false) Функция
Функции для преобразования массива байт в масив чисел. Если вы преобразуете данные из ByteArray, то лучше воспользоваться встроенным функционалом ByteArray
Агрументы:

Поддерживаются входные типы данных:

Пример использования

if(http.argExist("format"))
{
    var arr = [0,0,0,1, 0,0,0,2, 0,0,1,0, 0,1,0,0, 1,0,0,0];

    var obj = {};
    obj.toShort  = jsext.toShort(arr);       // возвратит [0, 1, 0, 2, 0, 256, 1, 0, 256, 0]
    obj.toShorL  = jsext.toShort(arr, true); // возвратит [0, 256, 0, 512, 0, 1, 256, 0, 1, 0]

    obj.toInt    = jsext.toInt(arr);         // возвратит [1, 2, 256, 65536, 16777216]
    obj.toIntL   = jsext.toInt(arr, true);   // возвратит [16777216, 33554432, 65536, 256, 1]

    obj.toInt64  = jsext.toInt64(arr);       // возвратит [4294967298, 1099511693312]
    obj.toInt64L = jsext.toInt64(arr, true); // возвратит [1.44115188092633e+17, 1099511693312]

    obj.toFloat  = jsext.toFloat([0x40, 0xb0, 0x00, 0x00]);             // возвратит [5.5]
    obj.toFloatL = jsext.toFloat([0x00, 0x00, 0x40, 0xb0], false, true);// возвратит [5.5]
    obj.toFloatL = jsext.toFloat([0x00, 0x00, 0xb0, 0x40], true);       // возвратит [5.5]
    obj.toFloatL = jsext.toFloat([0xb0, 0x40, 0x00, 0x00], true, true); // возвратит [5.5]

    obj.toFloat  = jsext.toFloat([0x40, 0xb0, 0x00, 0x00]);       // возвратит [5.5]
    obj.toFloatL = jsext.toFloat([0x00, 0x00, 0xb0, 0x40], true); // возвратит [5.5]

    obj.toDouble = jsext.toDouble([0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x27, 0x40], true); // возвратит [11.9]
    obj.toDoubleL= jsext.toDouble([0x40, 0x27, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD]);       // возвратит [11.9]

    http.respPlainText(jsext.stringify(obj));
    return;
}

Если уровень вывода сообщений будет выше 3 (см. конфигурационный файл jCjS пераметр sever->logTrsh), и в логе вы увидите предупреждающие сообщения как в листинге ниже, то это говорит о том, что не все байты были преобразованы и в остатке остались байты.

13:07:50.007 +0 jCjSExtention::toDouble() не весь буфер трансформирован. Всего 2. Остаток 4 b
13:07:50.008 +0 jCjSExtention::toInt64()  не весь буфер трансформирован. Всего 2. Остаток 4 b

int jsext.existsFile(fileName) Функция
bool jsext.existsDir(dirName) Функция
Проверка наличия файла или директории


String jsext.md4(data) Функция для расчета хэша md4
String jsext.md5(data) Функция для расчета хэша md5
String jsext.sha1(data) Функция для расчета хэша sha1

Пример использования

var data = user + ':' + pass;

post.log( jsext.md4(data) );
post.log( jsext.md5(data) );
post.log( jsext.sha1(data) );

String jsext.escape(String) Функция
Заэкранировать HTML символы


StringList jsext.keys(obj, obj = true, all = false) Функция
Запросить список всех полей у объекта и скрытые от энумератора (кроме cpp свойств Q_PROPERTY)
obj - по умолчанию включен. В списке полей будут только поля содержащие объекты
all - по умолчанию выключен. Если true будут выведены все поля, включая имена функций


var testObj = console

// вывод всех полей, включая имена функций
jsext.keys(testObj,0,1).forEach(function(k){
  post.log('e', typeof this[k] + ': ' + k)
}, testObj)

/*  выведет в лог
    string: mapName
    function: toString
    function: file_line
    function: file
    function: line
    function: position_stack
    function: position
    function: _debug
    function: stack
    function: isVA
    function: isBA
    function: type
    function: fromVariant
    function: _trace
    function: trace
    function: _log
    function: log
*/

// не выводит скрытые от энумератора поля
Object.keys(testObj).forEach(function(k){
  post.log('e', typeof this[k] + ': ' + k)
}, testObj)

// вывод всех полей, включая имена функций, но для Qt объектов имена функции имеют вид name()
Object.getOwnPropertyNames(testObj,0,1).forEach(function(k){
  post.log('e', typeof this[k] + ': ' + k)
}, testObj)