added method StringList::loadMessage; const modifiers added in NXCPMessage class...
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 8 Jan 2016 16:29:39 +0000 (18:29 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 8 Jan 2016 16:29:39 +0000 (18:29 +0200)
include/nms_util.h
include/nxcpapi.h
src/agent/core/sa.cpp
src/agent/core/session.cpp
src/libnetxms/message.cpp
src/libnetxms/net.cpp
src/libnetxms/strmap.cpp
src/server/core/objtools.cpp
src/server/libnxsrv/agent.cpp

index c239ec3..427803a 100644 (file)
@@ -596,6 +596,7 @@ public:
        bool getBoolean(const TCHAR *key, bool defaultValue) const;
 
    void fillMessage(NXCPMessage *msg, UINT32 sizeFieldId, UINT32 baseFieldId) const;
+   void loadMessage(const NXCPMessage *msg, UINT32 sizeFieldId, UINT32 baseFieldId);
 };
 
 /**
index 22b2504..6e1c8e2 100644 (file)
@@ -62,8 +62,8 @@ private:
    size_t m_dataSize;      // binary data size
 
    void *set(UINT32 fieldId, BYTE type, const void *value, bool isSigned = false, size_t size = 0);
-   void *get(UINT32 fieldId, BYTE requiredType, BYTE *fieldType = NULL);
-   NXCP_MESSAGE_FIELD *find(UINT32 fieldId);
+   void *get(UINT32 fieldId, BYTE requiredType, BYTE *fieldType = NULL) const;
+   NXCP_MESSAGE_FIELD *find(UINT32 fieldId) const;
 
 public:
    NXCPMessage(int version = NXCP_VERSION);
@@ -73,24 +73,24 @@ public:
 
    NXCP_MESSAGE *createMessage();
 
-   UINT16 getCode() { return m_code; }
+   UINT16 getCode() const { return m_code; }
    void setCode(UINT16 code) { m_code = code; }
 
-   UINT32 getId() { return m_id; }
+   UINT32 getId() const { return m_id; }
    void setId(UINT32 id) { m_id = id; }
 
-   bool isEndOfFile() { return (m_flags & MF_END_OF_FILE) ? true : false; }
-   bool isEndOfSequence() { return (m_flags & MF_END_OF_SEQUENCE) ? true : false; }
-   bool isReverseOrder() { return (m_flags & MF_REVERSE_ORDER) ? true : false; }
-   bool isBinary() { return (m_flags & MF_BINARY) ? true : false; }
-   bool isControl() { return (m_flags & MF_CONTROL) ? true : false; }
-   bool isCompressed() { return (m_flags & MF_COMPRESSED) ? true : false; }
+   bool isEndOfFile() const { return (m_flags & MF_END_OF_FILE) ? true : false; }
+   bool isEndOfSequence() const { return (m_flags & MF_END_OF_SEQUENCE) ? true : false; }
+   bool isReverseOrder() const { return (m_flags & MF_REVERSE_ORDER) ? true : false; }
+   bool isBinary() const { return (m_flags & MF_BINARY) ? true : false; }
+   bool isControl() const { return (m_flags & MF_CONTROL) ? true : false; }
+   bool isCompressed() const { return (m_flags & MF_COMPRESSED) ? true : false; }
 
-   BYTE *getBinaryData() { return m_data; }
-   size_t getBinaryDataSize() { return m_dataSize; }
+   const BYTE *getBinaryData() const { return m_data; }
+   size_t getBinaryDataSize() const { return m_dataSize; }
 
-   bool isFieldExist(UINT32 fieldId) { return find(fieldId) != NULL; }
-   int getFieldType(UINT32 fieldId);
+   bool isFieldExist(UINT32 fieldId) const { return find(fieldId) != NULL; }
+   int getFieldType(UINT32 fieldId) const;
 
    void setField(UINT32 fieldId, INT16 value) { set(fieldId, NXCP_DT_INT16, &value, true); }
    void setField(UINT32 fieldId, UINT16 value) { set(fieldId, NXCP_DT_INT16, &value, false); }
@@ -115,24 +115,24 @@ public:
    void setFieldFromInt32Array(UINT32 fieldId, IntegerArray<UINT32> *data);
    bool setFieldFromFile(UINT32 fieldId, const TCHAR *pszFileName);
 
-   INT16 getFieldAsInt16(UINT32 fieldId);
-   UINT16 getFieldAsUInt16(UINT32 fieldId);
-   INT32 getFieldAsInt32(UINT32 fieldId);
-   UINT32 getFieldAsUInt32(UINT32 fieldId);
-   INT64 getFieldAsInt64(UINT32 fieldId);
-   UINT64 getFieldAsUInt64(UINT32 fieldId);
-   double getFieldAsDouble(UINT32 fieldId);
-   bool getFieldAsBoolean(UINT32 fieldId);
-   time_t getFieldAsTime(UINT32 fieldId);
-   UINT32 getFieldAsInt32Array(UINT32 fieldId, UINT32 numElements, UINT32 *buffer);
-   UINT32 getFieldAsInt32Array(UINT32 fieldId, IntegerArray<UINT32> *data);
-   BYTE *getBinaryFieldPtr(UINT32 fieldId, size_t *size);
-   TCHAR *getFieldAsString(UINT32 fieldId, TCHAR *buffer = NULL, size_t bufferSize = 0);
-       char *getFieldAsMBString(UINT32 fieldId, char *buffer = NULL, size_t bufferSize = 0);
-       char *getFieldAsUtf8String(UINT32 fieldId, char *buffer = NULL, size_t bufferSize = 0);
-   UINT32 getFieldAsBinary(UINT32 fieldId, BYTE *buffer, size_t bufferSize);
-   InetAddress getFieldAsInetAddress(UINT32 fieldId);
-   uuid getFieldAsGUID(UINT32 fieldId);
+   INT16 getFieldAsInt16(UINT32 fieldId) const;
+   UINT16 getFieldAsUInt16(UINT32 fieldId) const;
+   INT32 getFieldAsInt32(UINT32 fieldId) const;
+   UINT32 getFieldAsUInt32(UINT32 fieldId) const;
+   INT64 getFieldAsInt64(UINT32 fieldId) const;
+   UINT64 getFieldAsUInt64(UINT32 fieldId) const;
+   double getFieldAsDouble(UINT32 fieldId) const;
+   bool getFieldAsBoolean(UINT32 fieldId) const;
+   time_t getFieldAsTime(UINT32 fieldId) const;
+   UINT32 getFieldAsInt32Array(UINT32 fieldId, UINT32 numElements, UINT32 *buffer) const;
+   UINT32 getFieldAsInt32Array(UINT32 fieldId, IntegerArray<UINT32> *data) const;
+   const BYTE *getBinaryFieldPtr(UINT32 fieldId, size_t *size) const;
+   TCHAR *getFieldAsString(UINT32 fieldId, TCHAR *buffer = NULL, size_t bufferSize = 0) const;
+       char *getFieldAsMBString(UINT32 fieldId, char *buffer = NULL, size_t bufferSize = 0) const;
+       char *getFieldAsUtf8String(UINT32 fieldId, char *buffer = NULL, size_t bufferSize = 0) const;
+   UINT32 getFieldAsBinary(UINT32 fieldId, BYTE *buffer, size_t bufferSize) const;
+   InetAddress getFieldAsInetAddress(UINT32 fieldId) const;
+   uuid getFieldAsGUID(UINT32 fieldId) const;
 
    void deleteAllFields();
 
@@ -140,7 +140,7 @@ public:
    void setEndOfSequence() { m_flags |= MF_END_OF_SEQUENCE; }
    void setReverseOrderFlag() { m_flags |= MF_REVERSE_ORDER; }
 
-   static String dump(NXCP_MESSAGE *msg, int version);
+   static String dump(const NXCP_MESSAGE *msg, int version);
 };
 
 /**
index b7bbfd7..c57f4c4 100644 (file)
@@ -243,7 +243,7 @@ void SessionAgentConnector::takeScreenshot(NXCPMessage *masterResponse)
    {
       masterResponse->setField(VID_RCC, ERR_SUCCESS);
       size_t imageSize;
-      BYTE *image = response->getBinaryFieldPtr(VID_FILE_DATA, &imageSize);
+      const BYTE *image = response->getBinaryFieldPtr(VID_FILE_DATA, &imageSize);
       if (image != NULL)
          masterResponse->setField(VID_FILE_DATA, image, (UINT32)imageSize);
    }
index 5776465..3041814 100644 (file)
@@ -222,7 +222,7 @@ void CommSession::readThread()
                   int dataSize;
                   if (msg->isCompressed())
                   {
-                     BYTE *in = msg->getBinaryData();
+                     const BYTE *in = msg->getBinaryData();
                      if (m_compressor == NULL)
                      {
                         NXCPCompressionMethod method = (NXCPCompressionMethod)(*in);
index 87c1d40..eefc412 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Foundation Library
-** Copyright (C) 2003-2014 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published
@@ -231,7 +231,7 @@ NXCPMessage::~NXCPMessage()
 /**
  * Find field by ID
  */
-NXCP_MESSAGE_FIELD *NXCPMessage::find(UINT32 fieldId)
+NXCP_MESSAGE_FIELD *NXCPMessage::find(UINT32 fieldId) const
 {
    MessageField *entry;
    HASH_FIND_INT(m_fields, &fieldId, entry);
@@ -342,7 +342,7 @@ void *NXCPMessage::set(UINT32 fieldId, BYTE type, const void *value, bool isSign
 /**
  * Get field value
  */
-void *NXCPMessage::get(UINT32 fieldId, BYTE requiredType, BYTE *fieldType)
+void *NXCPMessage::get(UINT32 fieldId, BYTE requiredType, BYTE *fieldType) const
 {
    NXCP_MESSAGE_FIELD *field = find(fieldId);
    if (field == NULL)
@@ -366,7 +366,7 @@ void *NXCPMessage::get(UINT32 fieldId, BYTE requiredType, BYTE *fieldType)
 /**
  * Get 16 bit field as boolean
  */
-bool NXCPMessage::getFieldAsBoolean(UINT32 fieldId)
+bool NXCPMessage::getFieldAsBoolean(UINT32 fieldId) const
 {
    BYTE type;
    void *value = (void *)get(fieldId, 0xFF, &type);
@@ -391,7 +391,7 @@ bool NXCPMessage::getFieldAsBoolean(UINT32 fieldId)
  *
  * @return field type or -1 if field with given ID does not exist
  */
-int NXCPMessage::getFieldType(UINT32 fieldId)
+int NXCPMessage::getFieldType(UINT32 fieldId) const
 {
    NXCP_MESSAGE_FIELD *field = find(fieldId);
    return (field != NULL) ? (int)field->type : -1;
@@ -400,7 +400,7 @@ int NXCPMessage::getFieldType(UINT32 fieldId)
 /**
  * get signed integer field
  */
-INT32 NXCPMessage::getFieldAsInt32(UINT32 fieldId)
+INT32 NXCPMessage::getFieldAsInt32(UINT32 fieldId) const
 {
    char *value = (char *)get(fieldId, NXCP_DT_INT32);
    return (value != NULL) ? *((INT32 *)value) : 0;
@@ -409,7 +409,7 @@ INT32 NXCPMessage::getFieldAsInt32(UINT32 fieldId)
 /**
  * get unsigned integer field
  */
-UINT32 NXCPMessage::getFieldAsUInt32(UINT32 fieldId)
+UINT32 NXCPMessage::getFieldAsUInt32(UINT32 fieldId) const
 {
    void *value = get(fieldId, NXCP_DT_INT32);
    return (value != NULL) ? *((UINT32 *)value) : 0;
@@ -418,7 +418,7 @@ UINT32 NXCPMessage::getFieldAsUInt32(UINT32 fieldId)
 /**
  * get signed 16-bit integer field
  */
-INT16 NXCPMessage::getFieldAsInt16(UINT32 fieldId)
+INT16 NXCPMessage::getFieldAsInt16(UINT32 fieldId) const
 {
    void *value = get(fieldId, NXCP_DT_INT16);
    return (value != NULL) ? *((INT16 *)value) : 0;
@@ -427,7 +427,7 @@ INT16 NXCPMessage::getFieldAsInt16(UINT32 fieldId)
 /**
  * get unsigned 16-bit integer variable
  */
-UINT16 NXCPMessage::getFieldAsUInt16(UINT32 fieldId)
+UINT16 NXCPMessage::getFieldAsUInt16(UINT32 fieldId) const
 {
    void *value = get(fieldId, NXCP_DT_INT16);
    return value ? *((WORD *)value) : 0;
@@ -436,7 +436,7 @@ UINT16 NXCPMessage::getFieldAsUInt16(UINT32 fieldId)
 /**
  * get signed 64-bit integer field
  */
-INT64 NXCPMessage::getFieldAsInt64(UINT32 fieldId)
+INT64 NXCPMessage::getFieldAsInt64(UINT32 fieldId) const
 {
    void *value = get(fieldId, NXCP_DT_INT64);
    return (value != NULL) ? *((INT64 *)value) : 0;
@@ -445,7 +445,7 @@ INT64 NXCPMessage::getFieldAsInt64(UINT32 fieldId)
 /**
  * get unsigned 64-bit integer field
  */
-UINT64 NXCPMessage::getFieldAsUInt64(UINT32 fieldId)
+UINT64 NXCPMessage::getFieldAsUInt64(UINT32 fieldId) const
 {
    void *value = get(fieldId, NXCP_DT_INT64);
    return value ? *((UINT64 *)value) : 0;
@@ -454,7 +454,7 @@ UINT64 NXCPMessage::getFieldAsUInt64(UINT32 fieldId)
 /**
  * get 64-bit floating point variable
  */
-double NXCPMessage::getFieldAsDouble(UINT32 fieldId)
+double NXCPMessage::getFieldAsDouble(UINT32 fieldId) const
 {
    void *value = get(fieldId, NXCP_DT_FLOAT);
    return (value != NULL) ? *((double *)value) : 0;
@@ -463,7 +463,7 @@ double NXCPMessage::getFieldAsDouble(UINT32 fieldId)
 /**
  * get time_t field
  */
-time_t NXCPMessage::getFieldAsTime(UINT32 fieldId)
+time_t NXCPMessage::getFieldAsTime(UINT32 fieldId) const
 {
    BYTE type;
    void *value = (void *)get(fieldId, 0xFF, &type);
@@ -484,7 +484,7 @@ time_t NXCPMessage::getFieldAsTime(UINT32 fieldId)
 /**
  * Get field as inet address
  */
-InetAddress NXCPMessage::getFieldAsInetAddress(UINT32 fieldId)
+InetAddress NXCPMessage::getFieldAsInetAddress(UINT32 fieldId) const
 {
    NXCP_MESSAGE_FIELD *f = find(fieldId);
    if (f == NULL)
@@ -513,7 +513,7 @@ InetAddress NXCPMessage::getFieldAsInetAddress(UINT32 fieldId)
  * be placed to buffer and pointer to buffer will be returned.
  * Note: bufferSize is buffer size in characters, not bytes!
  */
-TCHAR *NXCPMessage::getFieldAsString(UINT32 fieldId, TCHAR *buffer, size_t bufferSize)
+TCHAR *NXCPMessage::getFieldAsString(UINT32 fieldId, TCHAR *buffer, size_t bufferSize) const
 {
    if ((buffer != NULL) && (bufferSize == 0))
       return NULL;   // non-sense combination
@@ -563,7 +563,7 @@ TCHAR *NXCPMessage::getFieldAsString(UINT32 fieldId, TCHAR *buffer, size_t buffe
 /**
  * get variable as multibyte string
  */
-char *NXCPMessage::getFieldAsMBString(UINT32 fieldId, char *buffer, size_t bufferSize)
+char *NXCPMessage::getFieldAsMBString(UINT32 fieldId, char *buffer, size_t bufferSize) const
 {
    if ((buffer != NULL) && (bufferSize == 0))
       return NULL;   // non-sense combination
@@ -601,7 +601,7 @@ char *NXCPMessage::getFieldAsMBString(UINT32 fieldId, char *buffer, size_t buffe
 /**
  * get field as multibyte string
  */
-char *NXCPMessage::getFieldAsMBString(UINT32 fieldId, char *buffer, size_t bufferSize)
+char *NXCPMessage::getFieldAsMBString(UINT32 fieldId, char *buffer, size_t bufferSize) const
 {
        return getFieldAsString(fieldId, buffer, bufferSize);
 }
@@ -611,7 +611,7 @@ char *NXCPMessage::getFieldAsMBString(UINT32 fieldId, char *buffer, size_t buffe
 /**
  * get field as UTF-8 string
  */
-char *NXCPMessage::getFieldAsUtf8String(UINT32 fieldId, char *buffer, size_t bufferSize)
+char *NXCPMessage::getFieldAsUtf8String(UINT32 fieldId, char *buffer, size_t bufferSize) const
 {
    if ((buffer != NULL) && (bufferSize == 0))
       return NULL;   // non-sense combination
@@ -658,7 +658,7 @@ char *NXCPMessage::getFieldAsUtf8String(UINT32 fieldId, char *buffer, size_t buf
  * and actual size of data will be returned
  * If pBuffer is NULL, just actual data length is returned
  */
-UINT32 NXCPMessage::getFieldAsBinary(UINT32 fieldId, BYTE *pBuffer, size_t bufferSize)
+UINT32 NXCPMessage::getFieldAsBinary(UINT32 fieldId, BYTE *pBuffer, size_t bufferSize) const
 {
    UINT32 size;
    void *value = get(fieldId, NXCP_DT_BINARY);
@@ -680,7 +680,7 @@ UINT32 NXCPMessage::getFieldAsBinary(UINT32 fieldId, BYTE *pBuffer, size_t buffe
  * Returns pointer to internal buffer or NULL if field not found
  * Data length set in size parameter.
  */
-BYTE *NXCPMessage::getBinaryFieldPtr(UINT32 fieldId, size_t *size)
+const BYTE *NXCPMessage::getBinaryFieldPtr(UINT32 fieldId, size_t *size) const
 {
    BYTE *data;
    void *value = get(fieldId, NXCP_DT_BINARY);
@@ -701,7 +701,7 @@ BYTE *NXCPMessage::getBinaryFieldPtr(UINT32 fieldId, size_t *size)
  * Get field as GUID
  * Returns NULL GUID on error
  */
-uuid NXCPMessage::getFieldAsGUID(UINT32 fieldId)
+uuid NXCPMessage::getFieldAsGUID(UINT32 fieldId) const
 {
    NXCP_MESSAGE_FIELD *f = find(fieldId);
    if (f == NULL)
@@ -880,7 +880,7 @@ void NXCPMessage::setFieldFromInt32Array(UINT32 fieldId, IntegerArray<UINT32> *d
 /**
  * get binary field as an array of 32 bit unsigned integers
  */
-UINT32 NXCPMessage::getFieldAsInt32Array(UINT32 fieldId, UINT32 numElements, UINT32 *buffer)
+UINT32 NXCPMessage::getFieldAsInt32Array(UINT32 fieldId, UINT32 numElements, UINT32 *buffer) const
 {
    UINT32 size = getFieldAsBinary(fieldId, (BYTE *)buffer, numElements * sizeof(UINT32));
    size /= sizeof(UINT32);   // Convert bytes to elements
@@ -892,7 +892,7 @@ UINT32 NXCPMessage::getFieldAsInt32Array(UINT32 fieldId, UINT32 numElements, UIN
 /**
  * get binary field as an array of 32 bit unsigned integers
  */
-UINT32 NXCPMessage::getFieldAsInt32Array(UINT32 fieldId, IntegerArray<UINT32> *data)
+UINT32 NXCPMessage::getFieldAsInt32Array(UINT32 fieldId, IntegerArray<UINT32> *data) const
 {
    data->clear();
 
@@ -962,7 +962,7 @@ static TCHAR *GetStringFromField(void *df)
 /**
  * Dump NXCP message
  */
-String NXCPMessage::dump(NXCP_MESSAGE *msg, int version)
+String NXCPMessage::dump(const NXCP_MESSAGE *msg, int version)
 {
    String out;
    int i;
index 1ab6f5c..1b9526f 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2012 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -55,6 +55,7 @@ SocketConnection::SocketConnection()
 {
        m_dataPos = 0;
        m_data[0] = 0;
+       m_socket = INVALID_SOCKET;
 }
 
 /**
index 6d8e4a6..ff18792 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Foundation Library
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published
@@ -129,3 +129,18 @@ void StringMap::fillMessage(NXCPMessage *msg, UINT32 sizeFieldId, UINT32 baseFie
       msg->setField(id++, (TCHAR *)entry->value);
    }
 }
+
+/**
+ * Load data from NXCP message
+ */
+void StringMap::loadMessage(const NXCPMessage *msg, UINT32 sizeFieldId, UINT32 baseFieldId)
+{
+   int count = msg->getFieldAsInt32(sizeFieldId);
+   UINT32 id = baseFieldId;
+   for(int i = 0; i < count; i++)
+   {
+      TCHAR *key = msg->getFieldAsString(id++);
+      TCHAR *value = msg->getFieldAsString(id++);
+      setPreallocated(key, value);
+   }
+}
index 4a2b66d..012394d 100644 (file)
@@ -711,7 +711,7 @@ UINT32 UpdateObjectToolFromMessage(NXCPMessage *pMsg)
    DBBind(hStmt, 9, DB_SQLTYPE_VARCHAR, pMsg->getFieldAsString(VID_COMMAND_SHORT_NAME), DB_BIND_DYNAMIC);
 
    size_t size;
-   BYTE *imageData = pMsg->getBinaryFieldPtr(VID_IMAGE_DATA, &size);
+   const BYTE *imageData = pMsg->getBinaryFieldPtr(VID_IMAGE_DATA, &size);
    if (size > 0)
    {
       TCHAR *imageHexData = (TCHAR *)malloc((size * 2 + 1) * sizeof(TCHAR));
index 875eb2a..3fb50e9 100644 (file)
@@ -1824,7 +1824,7 @@ UINT32 AgentConnection::takeScreenshot(const TCHAR *sessionName, BYTE **data, si
          UINT32 rcc = response->getFieldAsUInt32(VID_RCC);
          if (rcc == ERR_SUCCESS)
          {
-            BYTE *p = response->getBinaryFieldPtr(VID_FILE_DATA, size);
+            const BYTE *p = response->getBinaryFieldPtr(VID_FILE_DATA, size);
             if (p != NULL)
             {
                *data = (BYTE *)malloc(*size);