1- var baEnum = require ( './bacnet-enum' ) ;
1+ var iconv = require ( 'iconv-lite' ) ;
2+ var baEnum = require ( './bacnet-enum' ) ;
23
34var BACNET_MAX_OBJECT = module . exports . BACNET_MAX_OBJECT = 0x3FF ;
45var BACNET_INSTANCE_BITS = module . exports . BACNET_INSTANCE_BITS = 22 ;
@@ -9,6 +10,26 @@ var BACNET_NO_PRIORITY = module.exports.BACNET_NO_PRIORITY = 0;
910var BACNET_MIN_PRIORITY = module . exports . BACNET_MIN_PRIORITY = 1 ;
1011var BACNET_MAX_PRIORITY = module . exports . BACNET_MAX_PRIORITY = 16 ;
1112
13+ var getEncodingType = function ( encoding , decodingBuffer , decodingOffset ) {
14+ switch ( encoding ) {
15+ case baEnum . BacnetCharacterStringEncodings . CHARACTER_UTF8 :
16+ return 'utf8' ;
17+ case baEnum . BacnetCharacterStringEncodings . CHARACTER_UCS2 :
18+ if ( ( decodingBuffer [ decodingOffset ] === 0xFF ) && ( decodingBuffer [ decodingOffset + 1 ] === 0xFE ) ) {
19+ return 'ucs2' ;
20+ }
21+ return ; //UCS-2BE
22+ case baEnum . BacnetCharacterStringEncodings . CHARACTER_ISO8859_1 :
23+ return 'latin1' ;
24+ case baEnum . BacnetCharacterStringEncodings . CHARACTER_UCS4 :
25+ case baEnum . BacnetCharacterStringEncodings . CHARACTER_MS_DBCS :
26+ case baEnum . BacnetCharacterStringEncodings . CHARACTER_JISX_0208 :
27+ return ;
28+ default :
29+ return 'utf8' ;
30+ }
31+ } ;
32+
1233var encodeUnsigned = function ( buffer , value , length ) {
1334 buffer . buffer . writeUIntBE ( value , buffer . offset , length , true ) ;
1435 buffer . offset += length ;
@@ -460,7 +481,7 @@ var bacappEncodeApplicationData = module.exports.bacappEncodeApplicationData = f
460481 encodeApplicationOctetString ( buffer , value . value , 0 , value . value . length ) ;
461482 break ;
462483 case baEnum . BacnetApplicationTags . BACNET_APPLICATION_TAG_CHARACTER_STRING :
463- encodeApplicationCharacterString ( buffer , value . value ) ;
484+ encodeApplicationCharacterString ( buffer , value . value , value . encoding ) ;
464485 break ;
465486 case baEnum . BacnetApplicationTags . BACNET_APPLICATION_TAG_BIT_STRING :
466487 encodeApplicationBitstring ( buffer , value . value ) ;
@@ -699,11 +720,14 @@ var bacappDecodeApplicationData = module.exports.bacappDecodeApplicationData = f
699720 var len = result . len ;
700721 result = bacappDecodeData ( buffer , offset + len , maxOffset , result . tagNumber , result . value ) ;
701722 if ( ! result ) return ;
702- return {
723+ var resObj = {
703724 len : len + result . len ,
704725 type : result . type ,
705726 value : result . value
706727 } ;
728+ // HACK: Drop string specific handling ASAP
729+ if ( result . encoding !== undefined ) resObj . encoding = result . encoding ;
730+ return resObj ;
707731 }
708732 } else {
709733 return bacappDecodeContextApplicationData ( buffer , offset , maxOffset , objectType , propertyId ) ;
@@ -779,7 +803,13 @@ var decodeReadAccessResult = module.exports.decodeReadAccessResult = function(bu
779803 var localResult = bacappDecodeApplicationData ( buffer , offset + len , apduLen + offset - 1 , value . objectIdentifier . type , newEntry . propertyIdentifier ) ;
780804 if ( ! localResult ) return ;
781805 len += localResult . len ;
782- localValues . push ( { value : localResult . value , type : localResult . type } ) ;
806+ var resObj = {
807+ value : localResult . value ,
808+ type : localResult . type
809+ } ;
810+ // HACK: Drop string specific handling ASAP
811+ if ( localResult . encoding !== undefined ) resObj . encoding = localResult . encoding ;
812+ localValues . push ( resObj ) ;
783813 }
784814 if ( ! decodeIsClosingTagNumber ( buffer , offset + len , 4 ) ) return ;
785815 if ( ( localValues . count === 2 ) && ( localValues [ 0 ] . tag === baEnum . BacnetApplicationTags . BACNET_APPLICATION_TAG_DATE ) && ( localValues [ 1 ] . tag === baEnum . BacnetApplicationTags . BACNET_APPLICATION_TAG_TIME ) ) {
@@ -888,32 +918,12 @@ var decodeContextOctetString = function(buffer, offset, maxLength, tagNumber, oc
888918} ;
889919
890920var multiCharsetCharacterstringDecode = function ( buffer , offset , maxLength , encoding , length ) {
891- var nodeEncoding ;
892- switch ( encoding ) {
893- case baEnum . BacnetCharacterStringEncodings . CHARACTER_UTF8 :
894- nodeEncoding = 'utf8' ;
895- break ;
896- case baEnum . BacnetCharacterStringEncodings . CHARACTER_UCS2 :
897- if ( ( buffer [ offset ] === 0xFF ) && ( buffer [ offset + 1 ] === 0xFE ) ) {
898- nodeEncoding = 'ucs2' ;
899- } else {
900- return ;
901- }
902- break ;
903- case baEnum . BacnetCharacterStringEncodings . CHARACTER_ISO8859 :
904- nodeEncoding = 'latin1' ;
905- break ;
906- case baEnum . BacnetCharacterStringEncodings . CHARACTER_UCS4 :
907- case baEnum . BacnetCharacterStringEncodings . CHARACTER_MS_DBCS :
908- case baEnum . BacnetCharacterStringEncodings . CHARACTER_JISX_0208 :
909- return ;
910- default :
911- nodeEncoding = 'latin1' ;
912- break ;
913- }
921+ var stringBuf = Buffer . alloc ( length ) ;
922+ buffer . copy ( stringBuf , 0 , offset , offset + length ) ;
914923 return {
915- value : buffer . toString ( nodeEncoding , offset , offset + length ) ,
916- len : length + 1
924+ value : iconv . decode ( stringBuf , getEncodingType ( encoding , buffer , offset ) ) ,
925+ len : length + 1 ,
926+ encoding : encoding
917927 } ;
918928} ;
919929
@@ -1092,6 +1102,7 @@ var bacappDecodeData = function(buffer, offset, maxLength, tagDataType, lenValue
10921102 result = decodeCharacterString ( buffer , offset , maxLength , lenValueType ) ;
10931103 value . len += result . len ;
10941104 value . value = result . value ;
1105+ value . encoding = result . encoding ;
10951106 break ;
10961107 case baEnum . BacnetApplicationTags . BACNET_APPLICATION_TAG_BIT_STRING :
10971108 result = decodeBitstring ( buffer , offset , lenValueType ) ;
@@ -1571,10 +1582,13 @@ var bacappDecodeContextApplicationData = function(buffer, offset, maxOffset, obj
15711582 var bacappResult = bacappDecodeData ( buffer , offset + len + subResult . len , maxOffset , subResult . tagNumber , subResult . value ) ;
15721583 if ( ! bacappResult ) return ;
15731584 if ( bacappResult . len === subResult . value ) {
1574- list . push ( {
1585+ var resObj = {
15751586 value : bacappResult . value ,
15761587 type : bacappResult . type
1577- } ) ;
1588+ } ;
1589+ // HACK: Drop string specific handling ASAP
1590+ if ( bacappResult . encoding !== undefined ) resObj . encoding = bacappResult . encoding ;
1591+ list . push ( resObj ) ;
15781592 len += subResult . len + subResult . value ;
15791593 } else {
15801594 list . push ( {
@@ -1642,7 +1656,8 @@ var decodeContextCharacterString = module.exports.decodeContextCharacterString =
16421656 len += result . value ;
16431657 return {
16441658 len : len ,
1645- value : decodedValue . value
1659+ value : decodedValue . value ,
1660+ encoding : decodedValue . encoding
16461661 } ;
16471662} ;
16481663
@@ -1709,28 +1724,30 @@ var bacappDecodeContextData = function(buffer, offset, maxApduLen, propertyTag)
17091724 } ;
17101725} ;
17111726
1712- var encodeBacnetCharacterString = function ( buffer , value ) {
1713- buffer . buffer [ buffer . offset ++ ] = baEnum . BacnetCharacterStringEncodings . CHARACTER_UTF8 ;
1714- buffer . offset += buffer . buffer . write ( value , buffer . offset , undefined , 'utf8' ) ;
1727+ var encodeBacnetCharacterString = function ( buffer , value , encoding ) {
1728+ encoding = encoding || baEnum . BacnetCharacterStringEncodings . CHARACTER_UTF8 ;
1729+ buffer . buffer [ buffer . offset ++ ] = encoding ;
1730+ var bufEncoded = iconv . encode ( value , getEncodingType ( encoding ) ) ;
1731+ buffer . offset += bufEncoded . copy ( buffer . buffer , buffer . offset ) ;
17151732} ;
17161733
1717- var encodeApplicationCharacterString = function ( buffer , value ) {
1734+ var encodeApplicationCharacterString = function ( buffer , value , encoding ) {
17181735 var tmp = {
17191736 buffer : Buffer . alloc ( 1472 ) ,
17201737 offset : 0
17211738 } ;
1722- encodeBacnetCharacterString ( tmp , value ) ;
1739+ encodeBacnetCharacterString ( tmp , value , encoding ) ;
17231740 encodeTag ( buffer , baEnum . BacnetApplicationTags . BACNET_APPLICATION_TAG_CHARACTER_STRING , false , tmp . offset ) ;
17241741 tmp . buffer . copy ( buffer . buffer , buffer . offset , 0 , tmp . offset ) ;
17251742 buffer . offset += tmp . offset ;
17261743} ;
17271744
1728- var encodeContextCharacterString = module . exports . encodeContextCharacterString = function ( buffer , tagNumber , value ) {
1745+ var encodeContextCharacterString = module . exports . encodeContextCharacterString = function ( buffer , tagNumber , value , encoding ) {
17291746 var tmp = {
17301747 buffer : Buffer . alloc ( 1472 ) ,
17311748 offset : 0
17321749 } ;
1733- encodeBacnetCharacterString ( tmp , value ) ;
1750+ encodeBacnetCharacterString ( tmp , value , encoding ) ;
17341751 encodeTag ( buffer , tagNumber , true , tmp . offset ) ;
17351752 tmp . buffer . copy ( buffer . buffer , buffer . offset , 0 , tmp . offset ) ;
17361753 buffer . offset += tmp . offset ;
0 commit comments