preparation for object serialization to JSON
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 18 May 2017 19:58:07 +0000 (22:58 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 18 May 2017 19:58:07 +0000 (22:58 +0300)
include/nms_util.h
include/uuid.h
src/libnetxms/Makefile.am
src/libnetxms/inetaddr.cpp
src/libnetxms/json.cpp [new file with mode: 0644]
src/server/core/events.cpp
src/server/core/netobj.cpp
src/server/core/tools.cpp
src/server/include/nms_core.h
src/server/include/nms_objects.h

index 7fdbab9..b7f5908 100644 (file)
@@ -37,6 +37,7 @@
 #include <nms_cscp.h>
 #include <nms_threads.h>
 #include <time.h>
+#include <jansson.h>
 
 #if HAVE_POLL_H
 #include <poll.h>
@@ -712,6 +713,8 @@ public:
    void replace(int index, T value) { Array::replace(index, m_storePointers ? CAST_TO_POINTER(value, void *) : &value); }
 
    T *getBuffer() const { return (T*)__getBuffer(); }
+
+   json_t *toJson() const { json_t *a = json_array(); for(int i = 0; i < m_size; i++) json_array_append_new(a, json_integer(get(i))); return a; }
 };
 
 /**
@@ -1441,6 +1444,8 @@ public:
    char *toStringA(char *buffer) const { return toString(buffer); }
 #endif
 
+   json_t *toJson() const;
+
    BYTE *buildHashKey(BYTE *key) const;
 
    TCHAR *getHostByAddr(TCHAR *buffer, size_t buflen) const;
@@ -2289,6 +2294,15 @@ void LIBNETXMS_EXPORTABLE BlockAllSignals(bool processWide, bool allowInterrupt)
 void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain);
 #endif
 
+
+// JSON helpers
+json_t LIBNETXMS_EXPORTABLE *json_string_w(const WCHAR *s);
+#ifdef UNICODE
+#define json_string_t json_string_w
+#else
+#define json_string_t json_string
+#endif
+
 #endif
 
 #endif   /* _nms_util_h_ */
index 98bcb6d..1d0cf9d 100644 (file)
@@ -59,6 +59,7 @@ public:
    TCHAR *toString(TCHAR *buffer) const { return _uuid_to_string(m_value, buffer); }
    String toString() const { TCHAR buffer[64]; return String(_uuid_to_string(m_value, buffer)); }
    char *toStringA(char *buffer) const { return _uuid_to_stringA(m_value, buffer); }
+   json_t *toJson() const { char buffer[64]; return json_string(toStringA(buffer)); }
 
    /**
     * Generate new UUID
index f637f64..1eae524 100644 (file)
@@ -1,8 +1,8 @@
 SOURCES = array.cpp base64.cpp bytestream.cpp cc_mb.cpp cc_ucs2.cpp \
           cc_ucs4.cpp cc_utf8.cpp cch.cpp config.cpp crypto.cpp \
          dirw_unix.c geolocation.cpp getopt.c dload.cpp hash.cpp \
-         hashmapbase.cpp ice.c icmp.cpp icmp6.cpp iconv.cpp \
-         inet_pton.c inetaddr.cpp log.cpp lz4.c main.cpp md5.cpp message.cpp \
+         hashmapbase.cpp ice.c icmp.cpp icmp6.cpp iconv.cpp inet_pton.c \
+         inetaddr.cpp json.cpp log.cpp lz4.c main.cpp md5.cpp message.cpp \
          msgrecv.cpp msgwq.cpp net.cpp nxcp.cpp pa.cpp parisc_atomic.cpp \
           qsort.c queue.cpp rwlock.cpp scandir.c serial.cpp sha1.cpp sha2.cpp \
           solaris9_atomic.c spoll.cpp streamcomp.cpp string.cpp \
@@ -18,11 +18,17 @@ libnetxms_la_SOURCES = ldcw.s $(SOURCES)
 else
 libnetxms_la_SOURCES = $(SOURCES)
 endif
+
 libnetxms_la_CPPFLAGS=-I@top_srcdir@/include
 if USE_INTERNAL_EXPAT
 libnetxms_la_CPPFLAGS+=-I@top_srcdir@/src/libexpat/libexpat
 endif
+if USE_INTERNAL_ZLIB
+libnetxms_la_CPPFLAGS += -I../zlib
+endif
+
 libnetxms_la_LDFLAGS = -version-info $(NETXMS_LIBRARY_VERSION)
+
 libnetxms_la_LIBADD =
 if USE_INTERNAL_EXPAT
 libnetxms_la_LIBADD += ../libexpat/libexpat/libnxexpat.la
@@ -31,9 +37,14 @@ if USE_INTERNAL_LIBTRE
 libnetxms_la_LIBADD += ../libtre/libnxtre.la
 endif
 if USE_INTERNAL_ZLIB
-libnetxms_la_CPPFLAGS += -I../zlib
 libnetxms_la_LIBADD += ../zlib/libnxzlib.la
 endif
+if USE_INTERNAL_JANSSON
+libnetxms_la_LIBADD += @top_srcdir@/src/jansson/libnxjansson.la
+else
+libnetxms_la_LIBADD += -ljansson
+endif
+
 
 EXTRA_DIST = \
        libnetxms.vcproj \
index 36ea2f5..7a5f0de 100644 (file)
@@ -164,6 +164,24 @@ char *InetAddress::toStringA(char *buffer) const
 #endif
 
 /**
+ * Convert to JSON object
+ */
+json_t *InetAddress::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "family", json_integer(m_family));
+
+   char buffer[64];
+   if (m_family == AF_INET)
+      json_object_set_new(root, "address", json_string(IpToStrA(m_addr.v4, buffer)));
+   else if (m_family == AF_INET)
+      json_object_set_new(root, "address", json_string(Ip6ToStrA(m_addr.v6, buffer)));
+
+   json_object_set_new(root, "prefixLength", json_integer(m_maskBits));
+   return root;
+}
+
+/**
  * Build hash key. Supplied array must be at least 18 bytes long.
  */
 BYTE *InetAddress::buildHashKey(BYTE *key) const
diff --git a/src/libnetxms/json.cpp b/src/libnetxms/json.cpp
new file mode 100644 (file)
index 0000000..81cb01f
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+** NetXMS - Network Management System
+** Utility Library
+** Copyright (C) 2003-2017 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 the Free Software Foundation; either version 3 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** File: json.cpp
+**/
+
+#include "libnetxms.h"
+
+/**
+ * Create JSON string from wide character string
+ */
+json_t LIBNETXMS_EXPORTABLE *json_string_w(const WCHAR *s)
+{
+   char *us = UTF8StringFromWideString(s);
+   json_t *js = json_string(us);
+   free(us);
+   return js;
+}
index 5064cfc..86d7229 100644 (file)
@@ -64,8 +64,7 @@ json_t *EventTemplate::toJson() const
 {
    json_t *root = json_object();
    json_object_set_new(root, "code", json_integer(m_code));
-   char guidText[64];
-   json_object_set_new(root, "guid", json_string(m_guid.toStringA(guidText)));
+   json_object_set_new(root, "guid", m_guid.toJson());
    json_object_set_new(root, "severity", json_integer(m_severity));
    json_object_set_new(root, "flags", json_integer(m_flags));
    json_object_set_new(root, "message", json_string_t(m_messageTemplate));
index 3e1c513..4ec8514 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -2224,3 +2224,11 @@ NXSL_Value *NetObj::createNXSLObject()
 {
    return new NXSL_Value(new NXSL_Object(&g_nxslNetObjClass, this));
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *NetObj::toJson()
+{
+   return NULL;
+}
index 57cbe83..95de838 100644 (file)
@@ -471,14 +471,3 @@ ObjectArray<ObjectsDistance> *FindNearestObjects(UINT32 currObjectId, int maxDis
    currObj->decRefCount();
    return result;
 }
-
-/**
- * Create JSON string from wide character string
- */
-json_t *json_string_w(const WCHAR *s)
-{
-   char *us = UTF8StringFromWideString(s);
-   json_t *js = json_string(us);
-   free(us);
-   return js;
-}
index 88a50e2..72a8772 100644 (file)
@@ -1130,13 +1130,6 @@ void OnSyslogConfigurationChange(const TCHAR *name, const TCHAR *value);
 
 void EscapeString(String &str);
 
-json_t *json_string_w(const WCHAR *s);
-#ifdef UNICODE
-#define json_string_t json_string_w
-#else
-#define json_string_t json_string
-#endif
-
 void InitAuditLog();
 void NXCORE_EXPORTABLE WriteAuditLog(const TCHAR *subsys, bool isSuccess, UINT32 userId,
                                      const TCHAR *workstation, int sessionId, UINT32 objectId,
index 92949cf..190b6ef 100644 (file)
@@ -26,6 +26,7 @@
 #include <nms_agent.h>
 #include <netxms_maps.h>
 #include <geolocation.h>
+#include <jansson.h>
 #include "nxcore_jobs.h"
 #include "nms_topo.h"
 
@@ -684,6 +685,8 @@ public:
 
    void sendPollerMsg(UINT32 dwRqId, const TCHAR *pszFormat, ...);
 
+   virtual json_t *toJson();
+
    // Debug methods
    const TCHAR *dbgGetParentList(TCHAR *szBuffer);
    const TCHAR *dbgGetChildList(TCHAR *szBuffer);