diff --git a/Include/Mql/Lang/Native.mqh b/Include/Mql/Lang/Native.mqh index f4b6ccd..6c34434 100644 --- a/Include/Mql/Lang/Native.mqh +++ b/Include/Mql/Lang/Native.mqh @@ -143,16 +143,10 @@ string StringFromUtf8Pointer(intptr_t psz,int len) if(len < 0) return NULL; string res; int required=MultiByteToWideChar(CP_UTF8,0,psz,len,res,0); - StringInit(res,required); - int resLength = MultiByteToWideChar(CP_UTF8,0,psz,len,res,required); - if(resLength != required) - { - return NULL; - } - else - { - return res; - } +// need to include the NULL terminating character + StringInit(res,required+1); + int rlen=MultiByteToWideChar(CP_UTF8,0,psz,len,res,required); + return rlen != required ? NULL : res; } //+------------------------------------------------------------------+ //| for null-terminated string | diff --git a/Include/Zmq/ZmqMsg.mqh b/Include/Zmq/ZmqMsg.mqh index 194fcdb..f17e107 100644 --- a/Include/Zmq/ZmqMsg.mqh +++ b/Include/Zmq/ZmqMsg.mqh @@ -46,10 +46,10 @@ int zmq_msg_close(zmq_msg_t &msg); int zmq_msg_move(zmq_msg_t &dest,zmq_msg_t &src); int zmq_msg_copy(zmq_msg_t &dest,zmq_msg_t &src); // char * -intptr_t zmq_msg_data(zmq_msg_t const &msg); -int zmq_msg_size(zmq_msg_t const &msg); -int zmq_msg_more(zmq_msg_t const &msg); -int zmq_msg_get(zmq_msg_t const &msg,int property); +intptr_t zmq_msg_data(zmq_msg_t &msg); +int zmq_msg_size(zmq_msg_t &msg); +int zmq_msg_more(zmq_msg_t &msg); +int zmq_msg_get(zmq_msg_t &msg,int property); int zmq_msg_set(zmq_msg_t &msg,int property,int optval); // const char * intptr_t zmq_msg_gets(zmq_msg_t &msg,const char &property[]); @@ -62,7 +62,7 @@ struct ZmqMsg: public zmq_msg_t protected: int get(int property) {return zmq_msg_get(this,property);} bool set(int property,int value) {return 0==zmq_msg_set(this,property,value);} - intptr_t data() const {return zmq_msg_data(this);} + intptr_t data() {return zmq_msg_data(this);} bool setStringData(string data,bool nullterminated=false); public: ZmqMsg() {zmq_msg_init(this);} @@ -88,17 +88,9 @@ public: size_t size() {return zmq_msg_size(this);} + void getData(uchar &data[]); string getData(); - - template - void getData(T &array[]) const {ArrayFromPointer(array,data());} - template - void setData(const T &array[]) {ArrayToPointer(array,data());} - - template - void getData(T &value) const {ValueFromPointer(value,data());} - template - void setData(const T &value) {ValueToPointer(value,data());} + void setData(const uchar &data[]); bool more() {return 1==zmq_msg_more(this);} @@ -119,6 +111,16 @@ bool ZmqMsg::setStringData(string data,bool nullterminated) return res; } //+------------------------------------------------------------------+ +//| Get message data as bytes array | +//+------------------------------------------------------------------+ +void ZmqMsg::getData(uchar &data[]) + { + size_t size=size(); + intptr_t src=data(); + if(ArraySize(data)