added macro DISABLE_COPY_CTOR; minor refactoring
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 25 Oct 2017 08:50:54 +0000 (11:50 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 25 Oct 2017 08:50:54 +0000 (11:50 +0300)
configure.ac
include/nms_common.h
include/nms_util.h
src/libnetxms/net.cpp
src/libnetxms/stringlist.cpp
src/libnetxms/tools.cpp
src/server/core/smclp.cpp
src/server/include/nms_objects.h

index 206601d..8d2f32e 100644 (file)
@@ -1110,6 +1110,25 @@ AC_C_CONST
 AC_PROG_GCC_TRADITIONAL
 AC_C_BIGENDIAN
 
 AC_PROG_GCC_TRADITIONAL
 AC_C_BIGENDIAN
 
+AC_LANG_PUSH([C++])
+
+AC_MSG_CHECKING(whether C++ compiler supports deletion of copy constructor)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+class A {
+public:
+   A(const A &s) = delete;
+};
+]],[[ ]])
+],[
+       AC_MSG_RESULT(yes)
+       AC_DEFINE(CAN_DELETE_COPY_CTOR,1,Define to 1 if C++ compiler supports copy constructor deletion)
+],[
+       AC_MSG_RESULT(no)
+       AC_DEFINE(CAN_DELETE_COPY_CTOR,0,Define to 1 if C++ compiler supports copy constructor deletion)
+])
+
+AC_LANG_POP([C++])
+
 
 #--------------------------------------------------------------------
 # Private extensions
 
 #--------------------------------------------------------------------
 # Private extensions
@@ -1214,6 +1233,16 @@ if test "x$ac_compiler_gnu" = "xyes" ; then
 
        AC_LANG_PUSH([C++])
 
 
        AC_LANG_PUSH([C++])
 
+       AC_MSG_CHECKING(whether C++ compiler accepts -std=c++11)
+       OLD_CXXFLAGS="$CXXFLAGS"
+       CXXFLAGS="$CXXFLAGS -std=c++11"
+       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])],
+               [ AC_MSG_RESULT(yes) ], 
+               [ 
+                       CXXFLAGS="$OLD_CXXFLAGS"
+                       AC_MSG_RESULT(no)
+               ])
+
        AC_MSG_CHECKING(whether C++ compiler accepts -fno-rtti)
        OLD_CXXFLAGS="$CXXFLAGS"
        CXXFLAGS="$CXXFLAGS -fno-rtti"
        AC_MSG_CHECKING(whether C++ compiler accepts -fno-rtti)
        OLD_CXXFLAGS="$CXXFLAGS"
        CXXFLAGS="$CXXFLAGS -fno-rtti"
index dc8f562..0391cac 100644 (file)
@@ -1208,6 +1208,15 @@ enum EnumerationCallbackResult
    _CONTINUE = 1
 };
 
    _CONTINUE = 1
 };
 
+/**
+ * Disable copy constructor if compiler supports it
+ */
+#if CAN_DELETE_COPY_CTOR
+#define DISABLE_COPY_CTOR(c) c (const c &s) = delete;
+#else
+#define DISABLE_COPY_CTOR(c)
+#endif
+
 #endif
 
 #endif   /* _nms_common_h_ */
 #endif
 
 #endif   /* _nms_common_h_ */
index f20691f..798ec12 100644 (file)
@@ -635,6 +635,11 @@ public:
  */
 class LIBNETXMS_EXPORTABLE AbstractIterator
 {
  */
 class LIBNETXMS_EXPORTABLE AbstractIterator
 {
+   DISABLE_COPY_CTOR(AbstractIterator)
+
+protected:
+   AbstractIterator();
+
 public:
    virtual ~AbstractIterator();
 
 public:
    virtual ~AbstractIterator();
 
@@ -648,6 +653,8 @@ public:
  */
 template <class T> class Iterator
 {
  */
 template <class T> class Iterator
 {
+   DISABLE_COPY_CTOR(Iterator)
+
 private:
    AbstractIterator *m_worker;
 
 private:
    AbstractIterator *m_worker;
 
@@ -665,6 +672,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE Array
 {
  */
 class LIBNETXMS_EXPORTABLE Array
 {
+   DISABLE_COPY_CTOR(Array)
+
 private:
        int m_size;
        int m_allocated;
 private:
        int m_size;
        int m_allocated;
@@ -715,6 +724,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE ArrayIterator : public AbstractIterator
 {
  */
 class LIBNETXMS_EXPORTABLE ArrayIterator : public AbstractIterator
 {
+   DISABLE_COPY_CTOR(ArrayIterator)
+
 private:
    Array *m_array;
    int m_pos;
 private:
    Array *m_array;
    int m_pos;
@@ -732,6 +743,8 @@ public:
  */
 template <class T> class ObjectArray : public Array
 {
  */
 template <class T> class ObjectArray : public Array
 {
+   DISABLE_COPY_CTOR(ObjectArray)
+
 private:
        static void destructor(void *object) { delete (T*)object; }
 
 private:
        static void destructor(void *object) { delete (T*)object; }
 
@@ -768,6 +781,8 @@ public:
  */
 template <class T> class ObjectRefArray : public Array
 {
  */
 template <class T> class ObjectRefArray : public Array
 {
+   DISABLE_COPY_CTOR(ObjectRefArray)
+
 private:
        static void destructor(void *object) { }
 
 private:
        static void destructor(void *object) { }
 
@@ -794,6 +809,8 @@ public:
  */
 template <class T> class IntegerArray : public Array
 {
  */
 template <class T> class IntegerArray : public Array
 {
+   DISABLE_COPY_CTOR(IntegerArray)
+
 private:
        static void destructor(void *element) { }
 
 private:
        static void destructor(void *element) { }
 
@@ -819,6 +836,8 @@ public:
  */
 template <class T> class StructArray : public Array
 {
  */
 template <class T> class StructArray : public Array
 {
+   DISABLE_COPY_CTOR(StructArray)
+
 private:
        static void destructor(void *element) { }
 
 private:
        static void destructor(void *element) { }
 
@@ -938,6 +957,8 @@ public:
  */
 template <class T> class StringObjectMap : public StringMapBase
 {
  */
 template <class T> class StringObjectMap : public StringMapBase
 {
+   DISABLE_COPY_CTOR(StringObjectMap)
+
 private:
        static void destructor(void *object) { delete (T*)object; }
 
 private:
        static void destructor(void *object) { delete (T*)object; }
 
@@ -963,6 +984,7 @@ private:
 public:
        StringList();
        StringList(const StringList *src);
 public:
        StringList();
        StringList(const StringList *src);
+   StringList(const StringList &src);
        StringList(const TCHAR *src, const TCHAR *separator);
        ~StringList();
 
        StringList(const TCHAR *src, const TCHAR *separator);
        ~StringList();
 
@@ -1022,6 +1044,8 @@ class StringSet;
  */
 class LIBNETXMS_EXPORTABLE StringSetIterator : public AbstractIterator
 {
  */
 class LIBNETXMS_EXPORTABLE StringSetIterator : public AbstractIterator
 {
+   DISABLE_COPY_CTOR(StringSetIterator)
+
 private:
    StringSet *m_stringSet;
    StringSetEntry *m_curr;
 private:
    StringSet *m_stringSet;
    StringSetEntry *m_curr;
@@ -1121,6 +1145,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE HashMapIterator : public AbstractIterator
 {
  */
 class LIBNETXMS_EXPORTABLE HashMapIterator : public AbstractIterator
 {
+   DISABLE_COPY_CTOR(HashMapIterator)
+
 private:
    HashMapBase *m_hashMap;
    HashMapEntry *m_curr;
 private:
    HashMapBase *m_hashMap;
    HashMapEntry *m_curr;
@@ -1178,6 +1204,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE RingBuffer
 {
  */
 class LIBNETXMS_EXPORTABLE RingBuffer
 {
+   DISABLE_COPY_CTOR(RingBuffer)
+
 private:
    BYTE *m_data;
    size_t m_size;
 private:
    BYTE *m_data;
    size_t m_size;
@@ -1202,6 +1230,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE ByteStream
 {
  */
 class LIBNETXMS_EXPORTABLE ByteStream
 {
+   DISABLE_COPY_CTOR(ByteStream)
+
 private:
    BYTE *m_data;
    size_t m_size;
 private:
    BYTE *m_data;
    size_t m_size;
@@ -1258,6 +1288,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE RefCountObject
 {
  */
 class LIBNETXMS_EXPORTABLE RefCountObject
 {
+   DISABLE_COPY_CTOR(RefCountObject)
+
 private:
        VolatileCounter m_refCount;
 
 private:
        VolatileCounter m_refCount;
 
@@ -1289,6 +1321,8 @@ class NXCPMessage;
  */
 class LIBNETXMS_EXPORTABLE TableColumnDefinition
 {
  */
 class LIBNETXMS_EXPORTABLE TableColumnDefinition
 {
+   DISABLE_COPY_CTOR(TableColumnDefinition)
+
 private:
    TCHAR *m_name;
    TCHAR *m_displayName;
 private:
    TCHAR *m_name;
    TCHAR *m_displayName;
@@ -1318,6 +1352,8 @@ public:
  */
 class TableCell
 {
  */
 class TableCell
 {
+   DISABLE_COPY_CTOR(TableCell)
+
 private:
    TCHAR *m_value;
    int m_status;
 private:
    TCHAR *m_value;
    int m_status;
@@ -1349,6 +1385,8 @@ public:
  */
 class TableRow
 {
  */
 class TableRow
 {
+   DISABLE_COPY_CTOR(TableRow)
+
 private:
    ObjectArray<TableCell> *m_cells;
    UINT32 m_objectId;
 private:
    ObjectArray<TableCell> *m_cells;
    UINT32 m_objectId;
@@ -1388,6 +1426,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE Table : public RefCountObject
 {
  */
 class LIBNETXMS_EXPORTABLE Table : public RefCountObject
 {
+   DISABLE_COPY_CTOR(Table)
+
 private:
    ObjectArray<TableRow> *m_data;
    ObjectArray<TableColumnDefinition> *m_columns;
 private:
    ObjectArray<TableRow> *m_data;
    ObjectArray<TableColumnDefinition> *m_columns;
@@ -1709,6 +1749,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE InetAddressList
 {
  */
 class LIBNETXMS_EXPORTABLE InetAddressList
 {
+   DISABLE_COPY_CTOR(InetAddressList)
+
 private:
    ObjectArray<InetAddress> *m_list;
 
 private:
    ObjectArray<InetAddress> *m_list;
 
@@ -1746,13 +1788,16 @@ public:
  */
 class LIBNETXMS_EXPORTABLE SocketConnection
 {
  */
 class LIBNETXMS_EXPORTABLE SocketConnection
 {
+   DISABLE_COPY_CTOR(SocketConnection)
+
 protected:
        SOCKET m_socket;
        char m_data[4096];
        int m_dataPos;
 
 protected:
        SOCKET m_socket;
        char m_data[4096];
        int m_dataPos;
 
+   SocketConnection();
+
 public:
 public:
-       SocketConnection();
        virtual ~SocketConnection();
 
        bool connectTCP(const TCHAR *hostName, WORD port, UINT32 timeout);
        virtual ~SocketConnection();
 
        bool connectTCP(const TCHAR *hostName, WORD port, UINT32 timeout);
@@ -1774,15 +1819,21 @@ public:
  */
 class LIBNETXMS_EXPORTABLE TelnetConnection : public SocketConnection
 {
  */
 class LIBNETXMS_EXPORTABLE TelnetConnection : public SocketConnection
 {
+   DISABLE_COPY_CTOR(TelnetConnection)
+
 protected:
 protected:
+   TelnetConnection() : SocketConnection() { }
+
        bool connectTCP(const TCHAR *hostName, WORD port, UINT32 timeout);
        bool connectTCP(const InetAddress& ip, WORD port, UINT32 timeout);
 
        bool connectTCP(const TCHAR *hostName, WORD port, UINT32 timeout);
        bool connectTCP(const InetAddress& ip, WORD port, UINT32 timeout);
 
+   bool connect(const TCHAR *hostName, WORD port, UINT32 timeout);
+   bool connect(const InetAddress& ip, WORD port, UINT32 timeout);
+
 public:
        static TelnetConnection *createConnection(const TCHAR *hostName, WORD port, UINT32 timeout);
 public:
        static TelnetConnection *createConnection(const TCHAR *hostName, WORD port, UINT32 timeout);
+   static TelnetConnection *createConnection(const InetAddress& ip, WORD port, UINT32 timeout);
 
 
-   bool connect(const TCHAR *hostName, WORD port, UINT32 timeout);
-       bool connect(const InetAddress& ip, WORD port, UINT32 timeout);
        virtual int read(char *pBuff, int nSize, UINT32 timeout = INFINITE);
        int readLine(char *buffer, int size, UINT32 timeout = INFINITE);
 };
        virtual int read(char *pBuff, int nSize, UINT32 timeout = INFINITE);
        int readLine(char *buffer, int size, UINT32 timeout = INFINITE);
 };
@@ -1792,6 +1843,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE PostalAddress
 {
  */
 class LIBNETXMS_EXPORTABLE PostalAddress
 {
+   DISABLE_COPY_CTOR(PostalAddress)
+
 private:
    TCHAR *m_country;
    TCHAR *m_city;
 private:
    TCHAR *m_country;
    TCHAR *m_city;
@@ -1826,6 +1879,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE SocketPoller
 {
  */
 class LIBNETXMS_EXPORTABLE SocketPoller
 {
+   DISABLE_COPY_CTOR(SocketPoller)
+
 private:
    bool m_write;
    int m_count;
 private:
    bool m_write;
    int m_count;
@@ -1853,6 +1908,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE AbstractCommChannel : public RefCountObject
 {
  */
 class LIBNETXMS_EXPORTABLE AbstractCommChannel : public RefCountObject
 {
+   DISABLE_COPY_CTOR(AbstractCommChannel)
+
 protected:
    virtual ~AbstractCommChannel();
 
 protected:
    virtual ~AbstractCommChannel();
 
@@ -1871,6 +1928,8 @@ public:
  */
 class LIBNETXMS_EXPORTABLE SocketCommChannel : public AbstractCommChannel
 {
  */
 class LIBNETXMS_EXPORTABLE SocketCommChannel : public AbstractCommChannel
 {
+   DISABLE_COPY_CTOR(SocketCommChannel)
+
 private:
    SOCKET m_socket;
    bool m_owner;
 private:
    SOCKET m_socket;
    bool m_owner;
index 706f06c..b25f467 100644 (file)
@@ -369,3 +369,23 @@ TelnetConnection *TelnetConnection::createConnection(const TCHAR *hostName, WORD
 
        return tc;
 }
 
        return tc;
 }
+
+/**
+ * Helper fuction to create connected TelnetConnection object.
+ *
+ * @param ip IP address
+ * @param port port number
+ * @param timeout connection timeout in milliseconds
+ * @return connected TelnetConnection object or NULL on connection failure
+ */
+TelnetConnection *TelnetConnection::createConnection(const InetAddress& ip, WORD port, UINT32 timeout)
+{
+   TelnetConnection *tc = new TelnetConnection();
+   if (!tc->connect(ip, port, timeout))
+   {
+      delete tc;
+      tc = NULL;
+   }
+
+   return tc;
+}
index 9d4460a..a0d984c 100644 (file)
@@ -50,6 +50,18 @@ StringList::StringList(const StringList *src)
 }
 
 /**
 }
 
 /**
+ * Copy constructor
+ */
+StringList::StringList(const StringList &src)
+{
+   m_count = 0;
+   m_allocated = src.m_allocated;
+   m_values = (TCHAR **)malloc(sizeof(TCHAR *) * m_allocated);
+   memset(m_values, 0, sizeof(TCHAR *) * m_allocated);
+   addAll(&src);
+}
+
+/**
  * Constructor: create string list by splitting source string at separators
  */
 StringList::StringList(const TCHAR *src, const TCHAR *separator)
  * Constructor: create string list by splitting source string at separators
  */
 StringList::StringList(const TCHAR *src, const TCHAR *separator)
index 2b63250..b7fad92 100644 (file)
@@ -2747,6 +2747,13 @@ TCHAR LIBNETXMS_EXPORTABLE *GetHeapInfo()
 }
 
 /**
 }
 
 /**
+ * Constructor for abstract iterator
+ */
+AbstractIterator::AbstractIterator()
+{
+}
+
+/**
  * Destructor for abstract iterator
  */
 AbstractIterator::~AbstractIterator()
  * Destructor for abstract iterator
  */
 AbstractIterator::~AbstractIterator()
index 8286c2c..608166a 100644 (file)
@@ -53,8 +53,8 @@ bool SMCLP_Connection::connect(const TCHAR *login, const TCHAR *password)
                delete m_conn;
    }
 
                delete m_conn;
    }
 
-   m_conn = new TelnetConnection();
-   if (m_conn->connect(m_ip, m_port, m_timeout))
+   m_conn = TelnetConnection::createConnection(m_ip, m_port, m_timeout);
+   if (m_conn != NULL)
    {
 #ifdef UNICODE
       char *_login = UTF8StringFromWideString(login);
    {
 #ifdef UNICODE
       char *_login = UTF8StringFromWideString(login);
index 058caf7..46eda3f 100644 (file)
@@ -472,6 +472,8 @@ public:
  */
 class NXCORE_EXPORTABLE NetObj
 {
  */
 class NXCORE_EXPORTABLE NetObj
 {
+   DISABLE_COPY_CTOR(NetObj)
+
 private:
        static void onObjectDeleteCallback(NetObj *object, void *data);
 
 private:
        static void onObjectDeleteCallback(NetObj *object, void *data);