Index: trunk/FACT++/dim/README_v20.txt
===================================================================
--- trunk/FACT++/dim/README_v20.txt	(revision 18057)
+++ trunk/FACT++/dim/README_v20.txt	(revision 18058)
@@ -1,4 +1,4 @@
 
-                    DIM version 20r7 Release Notes
+                    DIM version 20r11 Release Notes
 
 Notes 1 and 2 for Unix Users only
@@ -17,5 +17,32 @@
 		Dns </dev/null >& dns.log &
 
-NOTE 3: The Version Number service provided by servers is now set to 2007.
+NOTE 3: The Version Number service provided by servers is now set to 2011.
+
+24/10/2014
+Changes for version 2011:
+    - Increased the Max. num of connections for DNS and servers to 16384 (from 8192)
+    - Increased also slightly the DNS hash table
+
+
+17/09/2014
+Changes for version 2010:
+    - When a client connects to a server using the IP Address, instead of IP name,
+      a reverse lookup "validity" test is no longer performed.
+    - Fixed the Error reporting for tcpip connections, messages like:
+      "(ERROR) Client Connecting to XXX on YYY: Success"
+      should no longer exist.
+    - The "C" version can now be called directly from C++ using only dis.h or dic.h
+      instead of dis.hxx or dic.hxx.
+      (several const definitions and "extern "C" added in included prototypes)
+
+
+17/07/2014
+Changes for version 2009:
+    - Tried to fix more "Invalid Service ID" messages when creating/deleting services/commands in a server.
+      (By protecting the service/command creation/destruction in C++)
+    - Fixed a problem for Raspberry Pi (where "char" is "unsigned char" by default)
+    - The feature of increasing the maximum nember of connections stopped working with glibc 2.19.
+      Fixed.
+
 
 05/04/2013
Index: trunk/FACT++/dim/WebDID/did.js
===================================================================
--- trunk/FACT++/dim/WebDID/did.js	(revision 18057)
+++ trunk/FACT++/dim/WebDID/did.js	(revision 18058)
@@ -99,10 +99,10 @@
     {
 	storeServices.load();
-	serviceInfo.setVisible(1);
+	serviceInfoArea.setVisible(1);
 	commandInfoArea.setVisible(0);
-	serviceInfo.update("");
+	serviceInfoArea.update("");
     }
  
-    var serviceInfo = Ext.create('Ext.Panel', {
+    var serviceInfoArea = Ext.create('Ext.Panel', {
         layout: 'fit',
         id: 'details-panel',
@@ -112,7 +112,72 @@
         autoScroll: true,
 	border: false,
-        html: ''
-    });
-
+        html: '',
+    	tools: [{ 
+		type: 'gear',
+		id: 'update',
+		handler: function(e, toolEl, panel, tc) {
+			UpdateButton = tc;
+			if(UpdateService)
+			{
+				UpdateService = 0;
+				tc.setType('refresh');
+//				tc.show();
+//console.log("changed icon 1", UpdateService);
+			}
+			else
+			{
+				UpdateService = 1;
+				tc.setType('gear');
+//				tc.show();
+//console.log("changed icon 2", UpdateService);
+			}
+		} 
+  	}]
+    });
+
+    var serviceButton = Ext.create('Ext.Button', {
+        text: 'Stop Updating',
+        margin: '5 5 5 5',
+	handler: function() {
+//console.log('changed icon');
+//	    var pattern = commandData.getRawValue();
+//	    query(pattern, -1);	
+	}
+    });
+/*
+    var serviceInfoArea = Ext.create('Ext.form.Panel', {
+        layout: 'vbox',
+        id: 'svc-details-panel',
+        title: 'Service Info',
+        width: 580,
+//	flex: 3,
+//        autoScroll: true,
+	border: false,
+//        html: 'Command test'
+	align:'stretch',
+    	tools: [{ 
+		type: 'gear',
+		handler: function(e, toolEl, panel, tc) {
+			UpdateButton = tc;
+			if(UpdateService)
+			{
+				UpdateService = 0;
+				tc.setType('refresh');
+//				tc.show();
+//console.log("changed icon 1", UpdateService);
+			}
+			else
+			{
+				UpdateService = 1;
+				tc.setType('gear');
+//				tc.show();
+				doGetService();
+//console.log("changed icon 2", UpdateService);
+			}
+		} 
+  	}],
+	items: [serviceButton,serviceInfo]	
+    });
+*/
     var commandInfo = Ext.create('Ext.Panel', {
         layout: 'fit',
@@ -164,5 +229,5 @@
     });
 
-    var serviceInfoArea = Ext.create('Ext.form.Panel', {
+    var serviceCommandArea = Ext.create('Ext.form.Panel', {
         layout: 'vbox',
 //        title: 'Service Info',
@@ -170,5 +235,5 @@
         region: 'east',
 	align:'stretch',
-	items: [serviceInfo, commandInfoArea]	
+	items: [serviceInfoArea, commandInfoArea]	
     });
 /*
@@ -200,4 +265,8 @@
     var OldNnodes = 0;
     var OldNSearch = -1;
+    var UpdateService = 1;
+    var UpdateButton = 0;
+
+
     function poll()
     {
@@ -274,5 +343,6 @@
     function doGetService()
     {
-	getService(LastService, LastId);
+	if(LastService != "")
+		getService(LastService, LastId);
     }
     function getService(name, id)
@@ -285,4 +355,7 @@
 	{
 		forceUpdate = 1;
+		UpdateService = 1;
+		if(UpdateButton)
+			UpdateButton.setType('gear');
 		LastService = name;
 		LastId = id;
@@ -304,10 +377,13 @@
 		CurrService = name1;
 	requestNumber = requestNumber + 1;
-	HTTPPacket.open( "GET", "/didServiceData.json/src?dimservice="+name1+"&id=src&reqNr="+requestNumber+"&reqId="+randomNumber+"&force="+forceUpdate, true ); 
-	HTTPPacket.send( null );
+	if(UpdateService)
+	{
+		HTTPPacket.open( "GET", "/didServiceData.json/src?dimservice="+name1+"&id=src&reqNr="+requestNumber+"&reqId="+randomNumber+"&force="+forceUpdate, true ); 
+		HTTPPacket.send( null );
+	}
     }
     function process() 
     {
-	serviceInfo.update("Updating - state "+HTTPPacket.readyState+"...");
+	serviceInfoArea.update("Updating - state "+HTTPPacket.readyState+"...");
 	if ( HTTPPacket.readyState != 4 )
 		return; 
@@ -320,12 +396,15 @@
 	if(forceUpdate != -1)
 	{
-		serviceInfo.update(HTTPPacket.responseText);
-		serviceInfo.setVisible(1);
-		commandInfoArea.setVisible(0);
+//		if(UpdateService)
+//		{
+			serviceInfoArea.update(HTTPPacket.responseText);
+			serviceInfoArea.setVisible(1);
+			commandInfoArea.setVisible(0);
+//		}
 	}
 	else
 	{
 		commandInfo.update(HTTPPacket.responseText);
-		serviceInfo.setVisible(0);
+		serviceInfoArea.setVisible(0);
 		commandInfoArea.setVisible(1);
 	}
@@ -526,5 +605,5 @@
             minSize: 100,
             maxSize: 600,
-            items: [serviceInfoArea]
+            items: [serviceCommandArea]
         }
         ],
Index: trunk/FACT++/dim/WebDID/index.html
===================================================================
--- trunk/FACT++/dim/WebDID/index.html	(revision 18057)
+++ trunk/FACT++/dim/WebDID/index.html	(revision 18058)
@@ -5,9 +5,9 @@
 <link rel="icon" href="favicon.ico" type="image/x-icon"> 
 <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> 
-<link rel="stylesheet" type="text/css" href="ext-4.1.1a/resources/css/ext-all.css" />
+<link rel="stylesheet" type="text/css" href="ext-4.2.1.883/resources/css/ext-all.css" />
 
     <!-- GC -->
 
-<script type="text/javascript" src="ext-4.1.1a/ext-all.js"></script>
+<script type="text/javascript" src="ext-4.2.1.883/ext-all.js"></script>
 <script type="text/javascript" src="did.js"></script>
 </head>
Index: trunk/FACT++/dim/dim/dic.h
===================================================================
--- trunk/FACT++/dim/dim/dic.h	(revision 18057)
+++ trunk/FACT++/dim/dim/dic.h	(revision 18058)
@@ -21,23 +21,29 @@
 
 /* Routine definition */
+#ifdef __cplusplus
+extern "C" {
+#define __CXX_CONST const
+#else
+#define __CXX_CONST
+#endif
 
-_DIM_PROTOE( unsigned dic_info_service, (char *service_name, int req_type,
+_DIM_PROTOE( unsigned dic_info_service, (__CXX_CONST char *service_name, int req_type,
 				    int req_timeout, void *service_address,
 				    int service_size, void (*usr_routine)(void*, void*, int*),
 				    dim_long tag, void *fill_addr, int fill_size) );
-_DIM_PROTOE( unsigned dic_info_service_stamped, (char *service_name, int req_type,
+_DIM_PROTOE( unsigned dic_info_service_stamped, (__CXX_CONST char *service_name, int req_type,
 				    int req_timeout, void *service_address,
 				    int service_size, void (*usr_routine)(void*, void*, int*),
 				    dim_long tag, void *fill_addr, int fill_size) );
-_DIM_PROTOE( int dic_cmnd_callback,      (char *service_name, void *service_address,
+_DIM_PROTOE( int dic_cmnd_callback,      (__CXX_CONST char *service_name, void *service_address,
 				    int service_size, void (*usr_routine)(void*, int*),
 				    dim_long tag) );
-_DIM_PROTOE( int dic_cmnd_service,      (char *service_name, void *service_address,
+_DIM_PROTOE( int dic_cmnd_service,      (__CXX_CONST char *service_name, void *service_address,
 				    int service_size) );
 _DIM_PROTOE( void dic_change_address,  (unsigned service_id, void *service_address,
 				    int service_size) );
 _DIM_PROTOE( void dic_release_service,  (unsigned service_id) );
-_DIM_PROTOE( int dic_find_service,      (char *service_name) );
-_DIM_PROTOE( int dic_get_id,      		(char *name) );
+_DIM_PROTOE( int dic_find_service,      (__CXX_CONST char *service_name) );
+_DIM_PROTOE( int dic_get_id,      		(__CXX_CONST char *name) );
 _DIM_PROTOE( int dic_get_quality,  		(unsigned service_id) );
 _DIM_PROTOE( int dic_get_timestamp,  (unsigned service_id, int *secs, int *milisecs) );
@@ -53,4 +59,9 @@
 _DIM_PROTOE( int dic_get_server_pid,       (int *pid ) );
 
+#ifdef __cplusplus
+#undef __CXX_CONST
+}
+#endif
+
 #endif
 
Index: trunk/FACT++/dim/dim/dim.h
===================================================================
--- trunk/FACT++/dim/dim/dim.h	(revision 18057)
+++ trunk/FACT++/dim/dim/dim.h	(revision 18058)
@@ -14,5 +14,5 @@
 #include "dim_common.h"
 
-#define DIM_VERSION_NUMBER 2007
+#define DIM_VERSION_NUMBER 2011
 
 
@@ -483,14 +483,20 @@
 
 /* PROTOTYPES */
+#ifdef __cplusplus
+extern "C" {
+#define __CXX_CONST const
+#else
+#define __CXX_CONST
+#endif
 
 /* DNA */
 _DIM_PROTOE( int dna_start_read,    (int conn_id, int size) );
 _DIM_PROTOE( void dna_test_write,   (int conn_id) );
-_DIM_PROTOE( int dna_write,         (int conn_id, void *buffer, int size) );
-_DIM_PROTOE( int dna_write_nowait,  (int conn_id, void *buffer, int size) );
-_DIM_PROTOE( int dna_open_server,   (char *task, void (*read_ast)(), int *protocol,
+_DIM_PROTOE( int dna_write,         (int conn_id, __CXX_CONST void *buffer, int size) );
+_DIM_PROTOE( int dna_write_nowait,  (int conn_id, __CXX_CONST void *buffer, int size) );
+_DIM_PROTOE( int dna_open_server,   (__CXX_CONST char *task, void (*read_ast)(), int *protocol,
 				int *port, void (*error_ast)()) );
 _DIM_PROTOE( int dna_get_node_task, (int conn_id, char *node, char *task) );
-_DIM_PROTOE( int dna_open_client,   (char *server_node, char *server_task, int port,
+_DIM_PROTOE( int dna_open_client,   (__CXX_CONST char *server_node, __CXX_CONST char *server_task, int port,
                                 int server_protocol, void (*read_ast)(), void (*error_ast)(), SRC_TYPES src_type ));
 _DIM_PROTOE( int dna_close,         (int conn_id) );
@@ -582,4 +588,10 @@
 _DIM_PROTO( void _swaps_buffer, (short *sout, short *sin, int n) );
 
+#ifdef __cplusplus
+#undef __CXX_CONST
+}
+#endif
+
+
 #define SIZEOF_CHAR 1
 #define SIZEOF_SHORT 2
Index: trunk/FACT++/dim/dim/dim_common.h
===================================================================
--- trunk/FACT++/dim/dim/dim_common.h	(revision 18057)
+++ trunk/FACT++/dim/dim/dim_common.h	(revision 18058)
@@ -153,8 +153,15 @@
 #include <pthread.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 _DIM_PROTOE( void dim_lock,		() );
 _DIM_PROTOE( void dim_unlock,	() );
 _DIM_PROTOE( void dim_wait_cond,		() );
 _DIM_PROTOE( void dim_signal_cond,	() );
+#ifdef __cplusplus
+}
+#endif
 
 #define DIM_LOCK 	dim_lock();
@@ -175,4 +182,10 @@
 #endif
 
+#ifdef __cplusplus
+extern "C" {
+#define __CXX_CONST const
+#else
+#define __CXX_CONST
+#endif
 
 _DIM_PROTOE( int id_get,           (void *ptr, int type) );
@@ -187,5 +200,5 @@
 _DIM_PROTOE( void dna_set_test_write,	(int conn_id, int time) );
 _DIM_PROTOE( void dna_rem_test_write,	(int conn_id) );
-_DIM_PROTOE( int dim_set_dns_node,		(char *node) );
+_DIM_PROTOE( int dim_set_dns_node,		(__CXX_CONST char *node) );
 _DIM_PROTOE( int dim_get_dns_node,		(char *node) );
 _DIM_PROTOE( int dim_set_dns_port,		(int port) );
@@ -193,5 +206,5 @@
 _DIM_PROTOE( void dic_set_debug_on,		() );
 _DIM_PROTOE( void dic_set_debug_off,	() );
-_DIM_PROTOE( void dim_print_msg,		(char *msg, int severity) );
+_DIM_PROTOE( void dim_print_msg,		(__CXX_CONST char *msg, int severity) );
 _DIM_PROTOE( void dim_print_date_time,		() );
 _DIM_PROTOE( void dim_set_write_timeout,		(int secs) );
@@ -204,9 +217,9 @@
 _DIM_PROTOE( int dim_get_scheduler_class,		(int *sched_class) );
 _DIM_PROTOE( dim_long dim_start_thread,    (void(*rout)(void*), void *tag) );
-_DIM_PROTOE( int dic_set_dns_node,		(char *node) );
+_DIM_PROTOE( int dic_set_dns_node,		(__CXX_CONST char *node) );
 _DIM_PROTOE( int dic_get_dns_node,		(char *node) );
 _DIM_PROTOE( int dic_set_dns_port,		(int port) );
 _DIM_PROTOE( int dic_get_dns_port,		() );
-_DIM_PROTOE( int dis_set_dns_node,		(char *node) );
+_DIM_PROTOE( int dis_set_dns_node,		(__CXX_CONST char *node) );
 _DIM_PROTOE( int dis_get_dns_node,		(char *node) );
 _DIM_PROTOE( int dis_set_dns_port,		(int port) );
@@ -214,7 +227,7 @@
 _DIM_PROTOE( void dim_stop,				() );
 _DIM_PROTOE( int dim_stop_thread,		(dim_long tid) );
-_DIM_PROTOE( dim_long dis_add_dns,		(char *node, int port) );
-_DIM_PROTOE( dim_long dic_add_dns,		(char *node, int port) );
-_DIM_PROTOE( int dim_get_env_var,		(char *env_var, char *value, int value_size) );
+_DIM_PROTOE( dim_long dis_add_dns,		(__CXX_CONST char *node, int port) );
+_DIM_PROTOE( dim_long dic_add_dns,		(__CXX_CONST char *node, int port) );
+_DIM_PROTOE( int dim_get_env_var,		(__CXX_CONST char *env_var, char *value, int value_size) );
 _DIM_PROTOE( int dim_set_write_buffer_size,		(int bytes) );
 _DIM_PROTOE( int dim_get_write_buffer_size,		() );
@@ -246,4 +259,9 @@
 #endif
 
+#ifdef __cplusplus
+}
+#undef __CXX_CONST
+#endif
+
 _DIM_PROTOE( void dim_print_date_time_millis,		() );
 
Index: trunk/FACT++/dim/dim/dim_tcpip.h
===================================================================
--- trunk/FACT++/dim/dim/dim_tcpip.h	(revision 18057)
+++ trunk/FACT++/dim/dim/dim_tcpip.h	(revision 18058)
@@ -6,51 +6,65 @@
 
 #ifdef WIN32
-#define FD_SETSIZE      8192
+#define FD_SETSIZE      16384
 #else
 #ifdef linux
 #ifndef NOMORECONNS
 /* CG: Copied here bits/typesizes.h */
-#ifndef	_BITS_TYPESIZES_H
-#define	_BITS_TYPESIZES_H	1
+#ifndef _BITS_TYPESIZES_H
+#define _BITS_TYPESIZES_H   1
 
 /* See <bits/types.h> for the meaning of these macros.  This file exists so
-   that <bits/types.h> need not vary across different GNU platforms.  */
+that <bits/types.h> need not vary across different GNU platforms.  */
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
-#define __UID_T_TYPE		__U32_TYPE
-#define __GID_T_TYPE		__U32_TYPE
-#define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
-#define __MODE_T_TYPE		__U32_TYPE
-#define __NLINK_T_TYPE		__UWORD_TYPE
-#define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
-#define __PID_T_TYPE		__S32_TYPE
-#define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
-#define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
-#define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
-#define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
-#define	__ID_T_TYPE		__U32_TYPE
-#define __CLOCK_T_TYPE		__SLONGWORD_TYPE
-#define __TIME_T_TYPE		__SLONGWORD_TYPE
-#define __USECONDS_T_TYPE	__U32_TYPE
-#define __SUSECONDS_T_TYPE	__SLONGWORD_TYPE
-#define __DADDR_T_TYPE		__S32_TYPE
+#define __DEV_T_TYPE        __UQUAD_TYPE
+#define __UID_T_TYPE        __U32_TYPE
+#define __GID_T_TYPE        __U32_TYPE    
+#define __INO_T_TYPE        __ULONGWORD_TYPE    
+#define __INO64_T_TYPE      __UQUAD_TYPE
+#define __MODE_T_TYPE       __U32_TYPE
+#define __NLINK_T_TYPE      __UWORD_TYPE
+#define __OFF_T_TYPE        __SLONGWORD_TYPE
+#define __OFF64_T_TYPE      __SQUAD_TYPE
+#define __PID_T_TYPE        __S32_TYPE
+#define __RLIM_T_TYPE       __ULONGWORD_TYPE
+#define __RLIM64_T_TYPE     __UQUAD_TYPE
+#define __BLKCNT_T_TYPE     __SLONGWORD_TYPE
+#define __BLKCNT64_T_TYPE   __SQUAD_TYPE
+#define __FSBLKCNT_T_TYPE   __ULONGWORD_TYPE
+#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE
+#define __FSFILCNT_T_TYPE   __ULONGWORD_TYPE
+#define __FSFILCNT64_T_TYPE __UQUAD_TYPE
+#define __FSWORD_T_TYPE     __SWORD_TYPE
+#define __ID_T_TYPE     __U32_TYPE
+#define __CLOCK_T_TYPE      __SLONGWORD_TYPE
+#define __TIME_T_TYPE       __SLONGWORD_TYPE
+#define __USECONDS_T_TYPE   __U32_TYPE
+#define __SUSECONDS_T_TYPE  __SLONGWORD_TYPE
+#define __DADDR_T_TYPE      __S32_TYPE
 #define __SWBLK_T_TYPE		__SLONGWORD_TYPE
-#define __KEY_T_TYPE		__S32_TYPE
-#define __CLOCKID_T_TYPE	__S32_TYPE
-#define __TIMER_T_TYPE		__S32_TYPE
-#define __BLKSIZE_T_TYPE	__SLONGWORD_TYPE
-#define __FSID_T_TYPE		struct { int __val[2]; }
-#define __SSIZE_T_TYPE		__SWORD_TYPE
+#define __KEY_T_TYPE        __S32_TYPE
+#define __CLOCKID_T_TYPE    __S32_TYPE
+#define __TIMER_T_TYPE      void *
+#define __BLKSIZE_T_TYPE    __SLONGWORD_TYPE
+#define __FSID_T_TYPE       struct { int __val[2]; }
+#define __SSIZE_T_TYPE      __SWORD_TYPE
+#define __SYSCALL_SLONG_TYPE    __SLONGWORD_TYPE
+#define __SYSCALL_ULONG_TYPE    __ULONGWORD_TYPE
+
+#ifdef __LP64__
+/* Tell the libc code that off_t and off64_t are actually the same type
+for all ABI purposes, even if possibly expressed as different base types    
+for C type-checking purposes.  */
+# define __OFF_T_MATCHES_OFF64_T    1
+
+/* Same for ino_t and ino64_t.  */
+# define __INO_T_MATCHES_INO64_T    1
+#endif
 
 /* Number of descriptors that can fit in an `fd_set'.  */
-#define	__FD_SETSIZE		8192
+#define __FD_SETSIZE        16384
 
-#endif /* bits/typesizes.h */
+
+#endif /* bits/typesizes.h */ 
 
 /* CG: Copied here linux/posix_types.h */
@@ -64,5 +78,5 @@
 
 #undef __FD_SETSIZE
-#define __FD_SETSIZE	8192
+#define __FD_SETSIZE	16384
 
 #undef __FDSET_LONGS
@@ -84,4 +98,5 @@
 /* Type of a SYSV IPC key.  */
 typedef int __kernel_key_t;
+typedef int __kernel_mqd_t;
 
 #include <asm/posix_types.h>
Index: trunk/FACT++/dim/dim/dis.h
===================================================================
--- trunk/FACT++/dim/dim/dis.h	(revision 18057)
+++ trunk/FACT++/dim/dim/dis.h	(revision 18058)
@@ -25,13 +25,20 @@
 #define dis_get_timestamp dis_get_timestamp_
 
-_DIM_PROTOE( int dis_start_serving,    (char *task_name) );
+#ifdef __cplusplus
+extern "C" {
+#define __CXX_CONST const
+#else
+#define __CXX_CONST
+#endif
+
+_DIM_PROTOE( int dis_start_serving,    (__CXX_CONST char *task_name) );
 _DIM_PROTOE( void dis_stop_serving,    () );
 _DIM_PROTOE( int dis_get_next_cmnd,    (dim_long *tag, int *buffer, int *size ) );
 _DIM_PROTOE( int dis_get_client,       (char *name ) );
 _DIM_PROTOE( int dis_get_conn_id,      () );
-_DIM_PROTOE( unsigned dis_add_service, (char *service_name, char *service_type,
+_DIM_PROTOE( unsigned dis_add_service, (__CXX_CONST char *service_name, __CXX_CONST char *service_type,
 				   void *service_address, int service_size,
 				   void (*usr_routine)(void*,void**,int*,int*), dim_long tag) );
-_DIM_PROTOE( unsigned dis_add_cmnd,        (char *service_name, char *service_type,
+_DIM_PROTOE( unsigned dis_add_cmnd,        (__CXX_CONST char *service_name, __CXX_CONST char *service_type,
 			           void (*usr_routine)(void*,void*,int*), dim_long tag) );
 _DIM_PROTOE( void dis_add_client_exit_handler,(void (*usr_routine)(int*)) );
@@ -39,5 +46,5 @@
 _DIM_PROTOE( void dis_add_exit_handler,(void (*usr_routine)(int*)) );
 _DIM_PROTOE( void dis_add_error_handler,(void (*usr_routine)(int, int, char*)) );
-_DIM_PROTOE( void dis_report_service,  (char *service_name) );
+_DIM_PROTOE( void dis_report_service,  (__CXX_CONST char *service_name) );
 _DIM_PROTOE( int dis_update_service,   (unsigned service_id) );
 _DIM_PROTOE( int dis_remove_service,   (unsigned service_id) );
@@ -54,14 +61,18 @@
 _DIM_PROTOE( char *dis_get_error_services,	() );
 _DIM_PROTOE( char *dis_get_client_services,	(int conn_id) );
-_DIM_PROTOE( int dis_start_serving_dns,		(dim_long dns_id, char *task_name/*, int *id_list*/) );
+_DIM_PROTOE( int dis_start_serving_dns,		(dim_long dns_id, __CXX_CONST char *task_name/*, int *id_list*/) );
 _DIM_PROTOE( void dis_stop_serving_dns,		(dim_long dns_id) );
-_DIM_PROTOE( unsigned dis_add_service_dns,	(dim_long dns_id, char *service_name, char *service_type,
+_DIM_PROTOE( unsigned dis_add_service_dns,	(dim_long dns_id, __CXX_CONST char *service_name, __CXX_CONST char *service_type,
 				   void *service_address, int service_size,
 				   void (*usr_routine)(void*,void**,int*,int*), dim_long tag) );
-_DIM_PROTOE( unsigned dis_add_cmnd_dns,		(dim_long dns_id, char *service_name, char *service_type,
+_DIM_PROTOE( unsigned dis_add_cmnd_dns,		(dim_long dns_id, __CXX_CONST char *service_name, __CXX_CONST char *service_type,
 			       void (*usr_routine)(void*,void*,int*), dim_long tag) );
 _DIM_PROTOE( int dis_get_n_clients,	(unsigned service_id) );
 _DIM_PROTOE( int dis_get_timestamp,     (unsigned service_id, 
 					int *secs, int *millisecs) );
+#ifdef __cplusplus
+#undef __CXX_CONST
+}
+#endif
 
 #endif
Index: trunk/FACT++/dim/src/benchmark/benchClient.cxx
===================================================================
--- trunk/FACT++/dim/src/benchmark/benchClient.cxx	(revision 18057)
+++ trunk/FACT++/dim/src/benchmark/benchClient.cxx	(revision 18058)
@@ -35,5 +35,5 @@
 
 	if(argc){}
-	if(argc){}
+	if(argv){}
 	br.getServices("BENCH_SERVICE_*");
 
Index: trunk/FACT++/dim/src/dic.c
===================================================================
--- trunk/FACT++/dim/src/dic.c	(revision 18057)
+++ trunk/FACT++/dim/src/dic.c	(revision 18058)
@@ -1363,5 +1363,5 @@
 	}
 	node_name = packet->node_name; 
-	if(node_name[0] == -1)
+	if(node_name[0] == (char)0xFF)
 	{
 		error_handler(0, DIM_FATAL, DIMDNSREFUS, "DIM_DNS refuses connection");
Index: trunk/FACT++/dim/src/discpp.cxx
===================================================================
--- trunk/FACT++/dim/src/discpp.cxx	(revision 18057)
+++ trunk/FACT++/dim/src/discpp.cxx	(revision 18058)
@@ -83,5 +83,10 @@
 void DimService::storeIt(void *data, int size)
 {
-
+	DISABLE_AST
+	if(!itsId)
+	{
+		ENABLE_AST
+		return;
+	}
 	if(!itsDataSize)
 	{
@@ -97,4 +102,5 @@
 	memcpy(itsData, data, (size_t)size);
 	itsSize = size;
+	ENABLE_AST
 }
 
@@ -131,4 +137,5 @@
 {
 //	itsTagId = 0;
+	itsId = 0;
 	itsDns = dns;
 	itsName = new char[(int)strlen(name)+1];
@@ -241,4 +248,6 @@
 {
 //	itsTagId = 0;
+	itsIdIn = 0;
+	itsIdOut = 0;
 	itsDns = dns;
 	itsName = new char[(int)strlen(name)+1];
@@ -287,5 +296,10 @@
 void DimRpc::storeIt(void *data, int size)
 {
-
+	DISABLE_AST
+	if(!itsIdIn)
+	{
+		ENABLE_AST
+		return;
+	}
 	if(!itsDataOutSize)
 	{
@@ -301,4 +315,5 @@
 	memcpy(itsDataOut, data, (size_t)size);
 	itsSizeOut = size;
+	ENABLE_AST
 }
 
@@ -776,8 +791,12 @@
 {
 //	itsTagId = 0;
+	itsId = 0;
+	itsName = 0;
 }
 
 DimService::DimService(const char *name, int &value) 
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(int);
@@ -788,4 +807,6 @@
 DimService::DimService(const char *name, float &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(float);
@@ -796,4 +817,6 @@
 DimService::DimService(const char *name, double &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(double);
@@ -804,4 +827,6 @@
 DimService::DimService(const char *name, longlong &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(longlong);
@@ -812,4 +837,6 @@
 DimService::DimService(const char *name, short &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(short);
@@ -820,4 +847,6 @@
 DimService::DimService(const char *name, char *string)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = string;
 	itsSize = (int)strlen(string)+1;
@@ -828,4 +857,6 @@
 DimService::DimService(const char *name, char *format, void *structure, int size)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = structure;
 	itsSize = size;
@@ -836,4 +867,6 @@
 DimService::DimService(const char *name, char *format, DimServiceHandler *handler)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = 0;
 	itsSize = 0;
@@ -844,4 +877,6 @@
 DimService::DimService(const char *name, const char *format, void *structure, int size)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = structure;
 	itsSize = size;
@@ -852,4 +887,6 @@
 DimService::DimService(const char *name, const char *format, DimServiceHandler *handler)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = 0;
 	itsSize = 0;
@@ -862,4 +899,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, int &value) 
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(int);
@@ -870,4 +909,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, float &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(float);
@@ -878,4 +919,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, double &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(double);
@@ -886,4 +929,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, longlong &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(longlong);
@@ -894,4 +939,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, short &value)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = &value;
 	itsSize = sizeof(short);
@@ -902,4 +949,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, char *string)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = string;
 	itsSize = (int)strlen(string)+1;
@@ -910,4 +959,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, char *format, void *structure, int size)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = structure;
 	itsSize = size;
@@ -918,4 +969,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, char *format, DimServiceHandler *handler)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = 0;
 	itsSize = 0;
@@ -927,4 +980,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, const char *format, void *structure, int size)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = structure;
 	itsSize = size;
@@ -935,4 +990,6 @@
 DimService::DimService(DimServerDns *dns, const char *name, const char *format, DimServiceHandler *handler)
 {
+	itsId = 0;
+	itsName = 0;
 	itsData = 0;
 	itsSize = 0;
@@ -944,14 +1001,21 @@
 DimService::~DimService()
 {
-	delete[] itsName;
+	DISABLE_AST
+	if(itsName)
+		delete[] itsName;
 	if(itsDataSize)
 		delete[] (char *)itsData;
 //	if(itsTagId)
 //		id_free(itsTagId, SRC_DIS);
-	dis_remove_service( itsId );
+	if(itsId)
+		dis_remove_service( itsId );
+	itsId = 0;
+	ENABLE_AST
 }
 
 int DimService::updateService()
 {
+	if(!itsId)
+		return 0;
 	return dis_update_service( itsId );
 }
@@ -959,4 +1023,6 @@
 int DimService::updateService( int &value )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisINT)
 	{
@@ -969,4 +1035,6 @@
 int DimService::updateService( float &value )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisFLOAT) {
 		itsData = &value;
@@ -978,4 +1046,6 @@
 int DimService::updateService( double &value )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisDOUBLE) {
 		itsData = &value;
@@ -987,4 +1057,6 @@
 int DimService::updateService( longlong &value )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisXLONG)
 	{
@@ -997,4 +1069,6 @@
 int DimService::updateService( short &value )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisSHORT)
 	{
@@ -1007,4 +1081,6 @@
 int DimService::updateService( char *string )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisSTRING)
 	{
@@ -1018,4 +1094,6 @@
 int DimService::updateService( void *structure, int size )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisPOINTER)
 	{
@@ -1029,4 +1107,6 @@
 int DimService::selectiveUpdateService(int *cids)
 {
+	if(!itsId)
+		return 0;
 	if( cids == 0)
 	{
@@ -1041,4 +1121,6 @@
 int DimService::selectiveUpdateService( int &value, int *cids)
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisINT)
 	{
@@ -1058,4 +1140,6 @@
 int DimService::selectiveUpdateService( float &value, int *cids )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisFLOAT)
 	{
@@ -1075,4 +1159,6 @@
 int DimService::selectiveUpdateService( double &value, int *cids )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisDOUBLE)
 	{
@@ -1092,4 +1178,6 @@
 int DimService::selectiveUpdateService( longlong &value, int *cids )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisXLONG) 
 	{
@@ -1109,4 +1197,6 @@
 int DimService::selectiveUpdateService( short &value, int *cids )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisSHORT) 
 	{
@@ -1126,4 +1216,6 @@
 int DimService::selectiveUpdateService( char *string, int *cids )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisSTRING)
 	{
@@ -1144,4 +1236,6 @@
 int DimService::selectiveUpdateService( void *structure, int size, int *cids )
 {
+	if(!itsId)
+		return 0;
 	if( itsType == DisPOINTER)
 	{
@@ -1162,4 +1256,6 @@
 void DimService::setQuality(int quality)
 {
+	if(!itsId)
+		return;
 	dis_set_quality( itsId, quality );
 }
@@ -1167,4 +1263,6 @@
 void DimService::setTimestamp(int secs, int millisecs)
 { 
+	if(!itsId)
+		return;
 	dis_set_timestamp( itsId, secs, millisecs );
 }
@@ -1357,5 +1455,10 @@
 
 	if(secs == 0)
-		dis_get_timestamp(itsId, &secs, &millisecs);
+	{
+		DISABLE_AST
+		if(itsId)
+			dis_get_timestamp(itsId, &secs, &millisecs);
+		ENABLE_AST
+	}
 	return(secs);
 }
@@ -1384,9 +1487,13 @@
 DimCommand::~DimCommand()
 {
+	DISABLE_AST
 	delete[] itsName;
 	delete[] itsFormat;
 //	if(itsTagId)
 //		id_free(itsTagId, SRC_DIS);
-	dis_remove_service( itsId );
+	if(itsId)
+		dis_remove_service( itsId );
+	itsId = 0;
+	ENABLE_AST
 }
 
@@ -1407,4 +1514,5 @@
 DimRpc::~DimRpc()
 {
+	DISABLE_AST
 	delete[] itsName;
 	delete[] itsNameIn;
@@ -1412,6 +1520,11 @@
 //	if(itsTagId)
 //		id_free(itsTagId, SRC_DIS);
-	dis_remove_service( itsIdIn );
-	dis_remove_service( itsIdOut );
+	if(itsIdIn)
+		dis_remove_service( itsIdIn );
+	if(itsIdOut)
+		dis_remove_service( itsIdOut );
+	itsIdIn = 0;
+	itsIdOut = 0;
+	ENABLE_AST
 }
 
Index: trunk/FACT++/dim/src/dns.c
===================================================================
--- trunk/FACT++/dim/src/dns.c	(revision 18057)
+++ trunk/FACT++/dim/src/dns.c	(revision 18058)
@@ -21,5 +21,5 @@
 #define MAX_HASH_ENTRIES 5000
 */
-#define MAX_HASH_ENTRIES 20000
+#define MAX_HASH_ENTRIES 25000
 FILE	*foutptr;
 
@@ -260,7 +260,7 @@
 		{
 			if(!get_dns_accepted_domains(DNS_accepted_domains))
-				DNS_accepted_domains[0] = -1;
-		}
-		if((DNS_accepted_domains[0] != -1) && (strcmp(Dns_conns[conn_id].task_name,"DIS_DNS")))
+				DNS_accepted_domains[0] = (char)0xFF;
+		}
+		if((DNS_accepted_domains[0] != (char)0xFF) && (strcmp(Dns_conns[conn_id].task_name,"DIS_DNS")))
 		{
 			ptr = DNS_accepted_domains;
@@ -683,7 +683,7 @@
 	{
 		if(!get_dns_accepted_nodes(DNS_accepted_nodes))
-			DNS_accepted_nodes[0] = -1;
-	}
-	if(DNS_accepted_nodes[0] != -1)
+			DNS_accepted_nodes[0] = (char)0xFF;
+	}
+	if(DNS_accepted_nodes[0] != (char)0xFF)
 	{
 		ptr = DNS_accepted_nodes;
@@ -712,5 +712,5 @@
 		{
 			dic_packet.service_id = serv_regp->service_id;
-			dic_packet.node_name[0] = -1; 
+			dic_packet.node_name[0] = (char)0xFF; 
 			dic_packet.task_name[0] = 0;
 			dic_packet.node_addr[0] = 0;
Index: trunk/FACT++/dim/src/examples/pvss_dim_client.cxx
===================================================================
--- trunk/FACT++/dim/src/examples/pvss_dim_client.cxx	(revision 18057)
+++ trunk/FACT++/dim/src/examples/pvss_dim_client.cxx	(revision 18058)
@@ -19,5 +19,5 @@
 	}
 public :
-	SimpleService(char *name) : DimInfo(name, -1.0) {};
+	SimpleService(const char *name) : DimInfo(name, -1.0) {};
 };
 
@@ -39,5 +39,5 @@
 	}
 public :
-	DimDoubleArray(char *name) : DimInfo(name, no_link_darray, 8*sizeof(double)) {};
+	DimDoubleArray(const char *name) : DimInfo(name, no_link_darray, 8*sizeof(double)) {};
 };
 
@@ -76,5 +76,5 @@
 	}
 public :
-	ComplexService(char *name) : DimInfo(name, -1.0) {};
+	ComplexService(const char *name) : DimInfo(name, -1.0) {};
 };
 
@@ -88,5 +88,5 @@
 		cout << "RPC Service received: " << value << "\n" << endl;
 	}
-	RpcService(char *name, int timeout) :	DimRpcInfo(name, timeout, -1) {};
+	RpcService(const char *name, int timeout) :	DimRpcInfo(name, timeout, -1) {};
 };
 
Index: trunk/FACT++/dim/src/examples/pvss_dim_server.cxx
===================================================================
--- trunk/FACT++/dim/src/examples/pvss_dim_server.cxx	(revision 18057)
+++ trunk/FACT++/dim/src/examples/pvss_dim_server.cxx	(revision 18058)
@@ -31,5 +31,5 @@
 	}
 public :
-	RecvCommand(char *name) : DimCommand(name,"C") {reset_flag = 0;};
+	RecvCommand(const char *name) : DimCommand(name,"C") {reset_flag = 0;};
 	int isReset() {return reset_flag;};
 	void clearReset() {reset_flag = 0;};
@@ -47,5 +47,5 @@
 	}
 public :
-	RecvCommandComplex(char *name) : DimCommand(name,"I:1;C:1;I:1;F:1;C") {};
+	RecvCommandComplex(const char *name) : DimCommand(name,"I:1;C:1;I:1;F:1;C") {};
 };
 /*
@@ -95,5 +95,5 @@
 	}
 public:
-	RpcService(char *name): DimRpc(name,"I","I") {val = 0;};
+	RpcService(const char *name): DimRpc(name,"I","I") {val = 0;};
 };
 
Index: trunk/FACT++/dim/src/examples/rpc_client.cxx
===================================================================
--- trunk/FACT++/dim/src/examples/rpc_client.cxx	(revision 18057)
+++ trunk/FACT++/dim/src/examples/rpc_client.cxx	(revision 18058)
@@ -2,4 +2,5 @@
 #include <iostream>
 using namespace std;
+#include <stdio.h>
 
 class Rpc : public DimRpcInfo
@@ -10,5 +11,5 @@
 		cout << "Callback RPC Received : " << getInt() << endl;
 	}
-	Rpc(char *name) :	DimRpcInfo(name, 1, -1) {};
+	Rpc(const char *name) :	DimRpcInfo(name, 1, -1) {};
 };
 
@@ -31,5 +32,5 @@
 		cout << val->str1 << " " << val->str2 << " " << val->int1 << endl;
 	}
-	RpcStruct(char *name) :	DimRpcInfo(name, "dead") {};
+	RpcStruct(const char *name) :	DimRpcInfo(name, (char *)"dead") {};
 };
 
@@ -41,5 +42,5 @@
 	int out, in;
 	
-	sprintf(name,"TESTRPC%d/INT",(dim_long)tag);
+	sprintf(name,"TESTRPC%ld/INT",(dim_long)tag);
 	myRpc = new DimRpcInfo(name, 10, -1);
 //	myRpc = new Rpc(name);
@@ -65,5 +66,5 @@
 	Rpc *myRpc;
 	char name[64];
-	int out, in;
+	int out;
 	
 	sprintf(name,"TESTRPC/INT");
Index: trunk/FACT++/dim/src/examples/rpc_server.cxx
===================================================================
--- trunk/FACT++/dim/src/examples/rpc_server.cxx	(revision 18057)
+++ trunk/FACT++/dim/src/examples/rpc_server.cxx	(revision 18058)
@@ -3,4 +3,5 @@
 #include <iostream>
 using namespace std;
+#include <stdio.h>
 
 class RpcInt : public DimRpc
@@ -20,5 +21,5 @@
 	}
 public:
-	RpcInt(char *name): DimRpc(name,"I","I") {val = 0;};
+	RpcInt(const char *name): DimRpc(name,"I","I") {val = 0;};
 };
 
@@ -56,5 +57,5 @@
 	}
 public:
-	RpcStruct(char *name): DimRpc(name,"C:16;I:5;C:18;F:4;I:1;F:16",
+	RpcStruct(const char *name): DimRpc(name,"C:16;I:5;C:18;F:4;I:1;F:16",
 		"C:16;I:5;C:18;F:4;I:1;F:16") {val = 0;};
 };
@@ -75,5 +76,5 @@
 	}
 public:
-	JeffRpcStruct(char *name): DimRpc(name,"C:1;C:1;C:1;C",
+	JeffRpcStruct(const char *name): DimRpc(name,"C:1;C:1;C:1;C",
 		"I:1;C:1;C") {counter = 0;};
 };
Index: trunk/FACT++/dim/src/tcpip.c
===================================================================
--- trunk/FACT++/dim/src/tcpip.c	(revision 18057)
+++ trunk/FACT++/dim/src/tcpip.c	(revision 18058)
@@ -436,4 +436,24 @@
 	return(1);
 }
+
+#ifdef __linux__
+int tcpip_get_send_space(int conn_id)
+{
+	int ret, n_bytes;
+		
+	ret = ioctl(Net_conns[conn_id].channel, TIOCOUTQ, &n_bytes );
+	if(ret == -1) 
+	{
+#ifdef DEBUG
+		printf("Couln't get send buffer free size, ret =  %d\n", ret);
+#endif
+		return(0);
+	}
+/*
+	printf("tcpip_get_send_space %d\n", Write_buffer_size - n_bytes);
+*/
+	return(Write_buffer_size - n_bytes);
+}
+#endif
 
 /*
@@ -905,4 +925,5 @@
 	    ipaddr[3] = (unsigned char)d;
 	    host_number = 1;
+/*
 #ifndef VxWorks
 		if( gethostbyaddr(ipaddr, sizeof(ipaddr), AF_INET) == (struct hostent *)0 )
@@ -913,11 +934,12 @@
 			ret = WSAGetLastError();
 #endif
-			if((ret == HOST_NOT_FOUND) || (ret == NO_DATA))
-			{
-				if(!check_node_addr(node, ipaddr))
-					return(0);
-			}
-		}
-#endif
+//			if((ret == HOST_NOT_FOUND) || (ret == NO_DATA))
+//			{
+//				if(!check_node_addr(node, ipaddr))
+//					return(0);
+//			}
+		}
+#endif
+*/
 	}
 #ifndef VxWorks
@@ -1306,4 +1328,9 @@
 	
 	set_non_blocking(Net_conns[conn_id].channel);
+/*
+#ifdef __linux__
+	tcpip_get_send_space(conn_id);
+#endif
+*/
 	wrote = (int)writesock( Net_conns[conn_id].channel, buffer, (size_t)size, 0 );
 #ifndef WIN32
@@ -1696,5 +1723,5 @@
 #ifndef WIN32
 	if(code){}
-	if((errno == ENOENT) && (h_errno == HOST_NOT_FOUND))
+	if((errno == 0) && (h_errno == HOST_NOT_FOUND))
 		strcpy(str,"Host not found");
 	else
Index: trunk/FACT++/dim/src/util/dim_get_service.c
===================================================================
--- trunk/FACT++/dim/src/util/dim_get_service.c	(revision 18057)
+++ trunk/FACT++/dim/src/util/dim_get_service.c	(revision 18058)
@@ -46,5 +46,5 @@
 	else
 	{
-		sprintf(str,argv[1]);
+		sprintf(str,"%s",argv[1]);
 	}
 	dic_info_service(str,ONCE_ONLY,60,0,0,rout,0,&no_link,4);
Index: trunk/FACT++/dim/src/webDid/webDid.c
===================================================================
--- trunk/FACT++/dim/src/webDid/webDid.c	(revision 18057)
+++ trunk/FACT++/dim/src/webDid/webDid.c	(revision 18058)
@@ -46,4 +46,17 @@
 CURR_SERVICE *Curr_service_head = (CURR_SERVICE *)0;
 
+typedef struct objstate{
+	char name[MAX_NAME];
+	char state[512];
+	int sid;
+	int mode_index;
+	void *browserp;
+}OBJSTATE;
+/*
+typedef struct domainitem{
+	char name[MAX_NAME];
+	OBJSTATE objs[1];
+}CURR_SMIDOMAIN;
+*/
 typedef struct bitem{
     struct bitem *next;
@@ -53,4 +66,5 @@
 	time_t last_updated;
 	time_t last_polled;
+	time_t last_changed;
 	int conn_id;
 	int n_services;
@@ -60,7 +74,15 @@
 	char *JSONBuffer;
 	int JSONBufferSize;
+	char *JSONSmiBuffer;
+	int JSONSmiBufferSize;
 	char pattern[256];
 	char curr_command[MAX_NAME];
 	char *service_format_ptr;
+	int isSMI;
+	int n_domains;
+	char curr_smidomain[MAX_NAME];
+	int curr_smidomain_size;
+	int curr_smidomain_nobjs;
+	OBJSTATE *smidomainp;
 }BROWSER;
 BROWSER *Browser_head = (BROWSER *)0;
@@ -69,4 +91,8 @@
 int JSONBufferSize = 0;
 char JSONHeader[256] = {'\0'};
+char JSONSmiHeader[256] = {'\0'};
+
+char *JSONSmiBuffer = 0;
+int JSONSmiBufferSize = 0;
 
 int First_time = 1;
@@ -80,4 +106,5 @@
 int N_services = 0;	
 static char no_link = -1;
+static char no_link_str[5] = "DEAD";
 int no_link_int = -1;
 FILE	*fptr;
@@ -424,5 +451,5 @@
 	NODE *nodep;
 	SERVER *servp;
-	char *ptr;
+	char *ptr = 0;
 	BROWSER *browserp;
 	char *prepareJSONServiceList();
@@ -441,4 +468,45 @@
 		{
 			ptr = prepareJSONServiceList(servp, node, pid, browserp);
+		}
+	}
+	return ptr;
+}
+
+void got_update_smi_objects(BROWSER **tag, char *buffer, int *size)
+{
+	BROWSER *browserp;
+
+	if(size){}
+	browserp = (BROWSER *)*tag;
+	if(browserp->service_format_ptr)
+		free(browserp->service_format_ptr);
+	browserp->service_format_ptr = (char *)malloc(strlen(buffer)+1);
+	strcpy(browserp->service_format_ptr, buffer);
+}
+
+char *update_smi_objects(char *node, char *server, int pid, int browser)
+{
+	char str[MAX_NAME];
+	NODE *nodep;
+	SERVER *servp;
+	char *ptr = 0;
+	BROWSER *browserp;
+	char *prepareJSONSmiObjectList();
+	BROWSER *create_browser();
+
+	if(!(browserp = find_browser(browser)))
+	{
+		browserp = create_browser(browser);
+		browserp->isSMI = 1;
+	}
+	if(server){}
+	sprintf(str,"%s/SERVICE_LIST",server);
+	dic_info_service(str,ONCE_ONLY,20,0,0,
+		got_update_smi_objects,(dim_long)browserp,"None",5);
+	if((nodep = find_node(node)))
+	{
+	    if((servp = find_server(nodep, pid)))
+		{
+			ptr = prepareJSONSmiObjectList(servp, node, pid, browserp);
 		}
 	}
@@ -604,7 +672,8 @@
 	browserp = (BROWSER *)malloc(sizeof(BROWSER));
 	browserp->id = id;
-      	browserp->last_subscribed = 0;
+    browserp->last_subscribed = 0;
 	browserp->last_updated = 0;
 	browserp->last_polled = 0;
+    browserp->last_changed = 0;
 	browserp->n_nodes = 0;
 	browserp->n_servers = 0;
@@ -613,7 +682,11 @@
 	browserp->JSONBuffer = 0;
 	browserp->JSONBufferSize = 0;
+	browserp->JSONSmiBuffer = 0;
+	browserp->JSONSmiBufferSize = 0;
 	browserp->pattern[0] = '\0';
 	browserp->service_format_ptr = 0;
 	browserp->curr_command[0] = '\0';
+	browserp->curr_smidomain[0] = '\0';
+	browserp->smidomainp = 0;
 	sll_insert_queue((SLL *)Browser_head,(SLL *)browserp);
 	dtq_start_timer(10, check_browser, browserp);
@@ -744,4 +817,11 @@
 				}
 			}
+		}
+	}
+	if(browserp->isSMI)
+	{
+		if((browserp->last_changed >= browserp->last_polled) || (force))
+		{
+				service_changed = 1;
 		}
 	}
@@ -1177,5 +1257,14 @@
 				if(isprint(asc[j]))
 				{
-					sprintf(str,"%c",asc[j]);
+					if(asc[j] == ' ')
+						sprintf(str,"&nbsp");
+					else if(asc[j] == '<')
+						sprintf(str,"&lt");
+					else if(asc[j] == '>')
+						sprintf(str,"&gt");
+					else if(asc[j] == '&')
+						sprintf(str,"&amp");
+					else
+						sprintf(str,"%c",asc[j]);
 					strcat(tmp,str);
 				}
@@ -1345,8 +1434,38 @@
 }
 
-char *getJSONHeader()
+char *getJSONSmiBuffer(char *node, int browser)
+{
+	BROWSER *browserp;
+	int prepareJSONSmiTree();
+
+	if(!(browserp = find_browser(browser)))
+	{
+		browserp = create_browser(browser);
+		browserp->isSMI = 1;
+		strcpy(browserp->pattern,"SMI/");
+	}
+	if(browser)
+	{
+	    if((browserp = find_browser(browser)))
+		{
+			if(browserp->pattern[0] != '\0')
+			{
+			  prepareJSONSmiTree(node, browserp);
+			  return(browserp->JSONSmiBuffer);
+			}
+//			browserp->n_services = 0;
+//			browserp->n_servers = 0;
+//			browserp->n_nodes = 0;
+		}
+	}
+	prepareJSONSmiTree(node, 0);
+	return(JSONSmiBuffer);
+}
+
+char *getJSONHeader(int isSMI)
 {
   int prepareJSONHeader();
 
+  if(isSMI){}
   if(JSONHeader[0] == '\0')
     prepareJSONHeader();
@@ -1526,4 +1645,173 @@
 printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
 	*/
+	return(1);
+}
+
+int prepareJSONSmiTree(char *node, BROWSER *browserp)
+{
+	char *ptr;
+	NODE *nodep;
+	SERVER *servp;
+	char str[256], aux[128];
+	int selective = 0;
+	int n_nodes, tot_n_nodes;
+	int n_servers, tot_n_servers;
+	int ret, n_found = 0;
+	char pattern[256] = {'\0'};
+	char *sptr;
+
+	if(browserp)
+	{
+		if(browserp->pattern[0] != '\0')
+		{
+			selective = 1;
+			strcpy(pattern, browserp->pattern);
+		}
+//		else
+//			return(0);
+	}
+//	selective = 1;
+//	strcpy(pattern,"SMI/*");
+	if(!selective)
+	{
+		if(JSONSmiBufferSize == 0)
+		{
+			JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
+		}
+		else if (JSONSmiBufferSize < N_nodes*128+N_servers*128)
+		{
+			free(JSONSmiBuffer);
+			JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
+		}
+		ptr = JSONSmiBuffer;
+	}
+	else
+	{
+		if(browserp->JSONSmiBufferSize == 0)
+		{
+			browserp->JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
+		}
+		else if (browserp->JSONSmiBufferSize < N_nodes*128+N_servers*128)
+		{
+			free(browserp->JSONSmiBuffer);
+			browserp->JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
+		}
+		ptr = browserp->JSONSmiBuffer;
+	}
+	*ptr = '\0';
+	if(!strcmp(node, "src"))
+	{
+	ptr = addJSONStart(ptr);
+	ptr = addJSONNodeStart(ptr,"children");
+		sprintf(str,"text: \"%s\", id: \"Nodes\", expanded: false", Title);
+			ptr = addJSONChildStart(ptr,str,1);
+		ptr = addJSONNodeStart(ptr,"children");
+	nodep = Node_head;
+	tot_n_nodes = 0;
+	while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
+	{
+		nodep->match = 1;
+		if(selective)
+		{
+			if(!(ret = find_service_pattern(nodep, 0, pattern, &tot_n_servers)))
+			{
+				nodep->match = 0;
+				continue;
+			}
+			else
+			{
+				n_found += ret;
+			}
+		}
+		tot_n_nodes++;
+	}
+	n_nodes = 0;
+	nodep = Node_head;
+	while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
+	{
+		if(!nodep->match)
+			continue;
+		getNodeLabel(nodep->name, aux);
+		sprintf(str,"text: \"%s\", id: \"%s\", qtip: \"%s\"",
+			aux, nodep->name, nodep->name);
+		ptr = addJSONChildStart(ptr,str,0);
+		n_nodes++;
+if(WebDID_Debug)
+		printf("adding %s %d %d\n",nodep->name, n_nodes, tot_n_nodes);
+		if(n_nodes < tot_n_nodes)
+			ptr = addJSONChildEnd(ptr,1);
+		else
+			ptr = addJSONChildEnd(ptr,0);
+	}
+		ptr = addJSONNodeEnd(ptr);
+		ptr = addJSONChildEnd(ptr,0);
+	ptr = addJSONNodeEnd(ptr);
+	ptr = addJSONEnd(ptr);
+	if(selective)
+	{
+		browserp->n_services = n_found;
+		browserp->n_servers = tot_n_servers;
+		browserp->n_nodes = tot_n_nodes;
+	}
+	}
+	else
+	{
+	  if((nodep = find_node(node)))
+	  {
+	ptr = addJSONStart(ptr);
+	ptr = addJSONNodeStart(ptr,"children");
+		servp = nodep->server_head;
+		tot_n_servers = 0;
+		while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
+		{
+			servp->match = 1;
+			if(servp->busy != 1)
+			{
+				servp->match = 0;
+				continue;
+			}
+			if(selective)
+			{
+				if(!(ret = find_service_pattern(nodep, servp, pattern, 0)))
+				{
+					servp->match = 0;
+					continue;
+				}
+				else
+				{
+					n_found += ret;
+				}
+			}
+			tot_n_servers++;
+		}
+		n_servers = 0;
+		servp = nodep->server_head;
+		while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
+		{
+			if(!servp->match)
+				continue;
+			strcpy(aux, servp->name);
+			sptr = strstr(aux,"_SMI");
+			if(sptr)
+				*sptr = '\0';
+			sprintf(str,"text: \"%s\", id: \"%d\", leaf: true, icon: \"server.png\", name: \"%s\"",aux, servp->server.pid, servp->name);
+			ptr = addJSONChildStart(ptr,str,0);
+			n_servers++;
+			if(n_servers < tot_n_servers)
+				ptr = addJSONChildEnd(ptr,1);
+			else
+				ptr = addJSONChildEnd(ptr,0);
+		}
+	ptr = addJSONNodeEnd(ptr);
+	ptr = addJSONEnd(ptr);
+	  }
+	}
+	/*
+if(!selective)
+printf(" Nodes&Servers %s\n",JSONBuffer);
+else
+printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
+	*/
+printf("%s\n",browserp->JSONSmiBuffer);
 	return(1);
 }
@@ -1566,10 +1854,12 @@
 	if(JSONServicesSize == 0)
 	{
-		JSONServices = malloc((size_t)(n_services*256));
+		JSONServicesSize = n_services*256;
+		JSONServices = malloc((size_t)JSONServicesSize);
 	}
 	else if (JSONServicesSize < n_services*256)
 	{
 		free(JSONServices);
-		JSONServices = malloc((size_t)(n_services*256));
+		JSONServicesSize = n_services*256;
+		JSONServices = malloc((size_t)JSONServicesSize);
 	}
 	if(browserp)
@@ -1626,4 +1916,293 @@
 	ptr = addJSONEnd(ptr);
 	return JSONServices;
+}
+
+char *JSONSmiServices = 0;
+int JSONSmiServicesSize = 0;
+
+char *prepareJSONSmiObjectList(SERVER *servp, char *node, int pid, BROWSER *browserp)
+{
+	DNS_SERVICE_INFO *servicep;
+	char *ptr;
+	int n_services, i;
+	char str[512], type_str[512];
+	int selective = 0;
+	int n_found = 0, n, mode_index;
+	char aux[512], *sptr, state[512], *stptr;
+	OBJSTATE *smidomainp;
+	int findSmiServices();
+
+printf("prepareJSONSmiObjectList name %s\n", servp->name);
+	servicep = servp->service_ptr;
+	n_services = servp->server.n_services;
+	if(JSONSmiServicesSize == 0)
+	{
+		JSONSmiServicesSize = n_services*512;
+		JSONSmiServices = malloc((size_t)JSONSmiServicesSize);
+	}
+	else if (JSONSmiServicesSize < n_services*512)
+	{
+		free(JSONSmiServices);
+		JSONSmiServicesSize = n_services*512;
+		JSONSmiServices = malloc((size_t)JSONSmiServicesSize);
+	}
+	if(browserp)
+	{
+		if(browserp->pattern[0] != '\0')
+			selective = 1;
+	}
+	n_found = n_services;
+	/*
+	if(selective)
+	{
+		n_found = find_server_service_pattern(servp, browserp->pattern);
+	}
+	*/
+
+	n_found = findSmiServices(browserp, servp);
+	smidomainp = browserp->smidomainp;
+
+printf("prepareJSONSmiObjectList1 name %s\n", servp->name);
+
+
+	ptr = JSONSmiServices;
+	*ptr = '\0';
+	ptr = addJSONStart(ptr);
+	ptr = addJSONNodeStart(ptr,"children");
+	/*
+	if(selective)
+		sprintf(str,"name: \"%s (%d/%d services, pid %d)\"",servp->name, n_found, n_services, servp->server.pid);
+	else
+		sprintf(str,"name: \"%s (%d services, pid %d)\"",servp->name, n_services, servp->server.pid);
+	*/
+	sprintf(str,"name: \"%s (%d objects, pid %d)\"",servp->name, n_found, servp->server.pid);
+    ptr = addJSONChildStart(ptr,str,1);
+	ptr = addJSONNodeStart(ptr,"children");
+	servicep = servp->service_ptr;
+	n = 0;
+	for(i = 0; i < n_services; i++)
+	{
+/*
+printf("Service type = %d\n",servicep->type);
+*/
+printf("prepareJSONSmiObjectList2 obj name %s\n", servicep->name);
+		if((!selective) || (strstr(servicep->name, browserp->pattern)))
+		{
+/*
+			if(servicep->type == 1)
+			{
+				sprintf(type_str,"%d@%s|%s|CMD", pid, node, servicep->name);
+				sprintf(str,"name: \"%s\", id: \"%s\", leaf: true, icon: \"leaf_cmd.gif\"",servicep->name, type_str);
+			}
+			else
+			{
+				sprintf(type_str,"%d@%s|%s", pid, node, servicep->name);
+				sprintf(str,"name: \"%s\", state: \"RUNNING\", id: \"%s\", leaf: true",servicep->name, type_str);
+			}
+*/
+			if(servicep->status == 2)
+			{
+				sprintf(type_str,"%d@%s|%s", pid, node, servicep->name);
+				strcpy(aux, servicep->name);
+				sptr = strchr(aux,'/');
+				if(sptr)
+				{
+					sptr++;
+					sptr = strchr(sptr,'/');
+					if(sptr)
+						sptr++;
+				}
+				strcpy(state, smidomainp[i].state);
+				stptr = strchr(state,'/');
+				if(stptr)
+				{
+					*stptr = '\0';
+				}
+				mode_index = smidomainp[i].mode_index;
+//				sprintf(str,"name: \"%s\", state: \"%s\", id: \"%s\", leaf: true, fname: \"%s\"",sptr, state, type_str, servicep->name);
+				sprintf(str,"name: \"%s\", state: \"%s\", mode: \"%s\",id: \"%s\", leaf: true, fname: \"%s\"",
+					sptr, state, smidomainp[mode_index].state, type_str, servicep->name);
+			
+				ptr = addJSONChildStart(ptr,str,0);
+				n++;
+				if(n < n_found)
+					ptr = addJSONChildEnd(ptr,1);
+				else
+					ptr = addJSONChildEnd(ptr,0);
+			}
+		}
+		servicep++;
+	}
+	ptr = addJSONNodeEnd(ptr);
+	ptr = addJSONChildEnd(ptr,0);
+	ptr = addJSONNodeEnd(ptr);
+	ptr = addJSONEnd(ptr);
+printf("%s\n",JSONSmiServices);
+	return JSONSmiServices;
+}
+
+void update_smi_state(OBJSTATE **tag, char *data, int *size)
+{
+	OBJSTATE *servicep;
+	time_t tsecs;
+
+	if(*size){}
+	servicep = *tag;
+
+	if(strcmp(servicep->state, data))
+	{
+		strcpy(servicep->state, data); 
+		tsecs = time((time_t *)0);
+		((BROWSER *)(servicep->browserp))->last_changed = tsecs;
+	}
+//printf("SMI State %s %s %08x\n", servicep->name, servicep->state, (unsigned int)servicep);
+}
+
+int findSmiServices(BROWSER *browserp, SERVER *servp)
+{
+	DNS_SERVICE_INFO *servicep;
+	int n_services, i, index;
+	int n_found = 0, sid;
+	int checkSmiObjName();
+	int findSmiModeObj();
+
+	n_services = servp->server.n_services;
+	if(strcmp(browserp->curr_smidomain,servp->name))
+	{
+		if(browserp->curr_smidomain[0] != '\0')
+		{
+// unsubscribe; free
+			for(i = 0; i < browserp->curr_smidomain_size; i++)
+			{
+				if(browserp->smidomainp[i].sid)
+					dic_release_service(browserp->smidomainp[i].sid);
+			}
+			free(browserp->smidomainp);
+			browserp->curr_smidomain[0] = '\0';
+			browserp->curr_smidomain_size = 0;
+		}
+		strcpy(browserp->curr_smidomain, servp->name);
+		browserp->smidomainp = malloc(n_services * sizeof(OBJSTATE));
+		browserp->curr_smidomain_size = n_services;
+	}
+	else
+		return browserp->curr_smidomain_nobjs;
+	servicep = servp->service_ptr;
+	for(i = 0; i < n_services; i++)
+	{
+		browserp->smidomainp[i].sid = 0;
+		browserp->smidomainp[i].state[0] = '\0';
+		if(checkSmiObjName(servicep))
+		{
+			strcpy(browserp->smidomainp[i].name, servicep->name);
+//			strcpy(browserp->smidomainp[i].state, "");
+			browserp->smidomainp[i].browserp = browserp;
+//printf("address %s %08x\n",browserp->smidomainp[i].name, (unsigned int)&(browserp->smidomainp[i]));
+			sid = dic_info_service(servicep->name,MONITORED,0,0,0,update_smi_state, &(browserp->smidomainp[i]),
+						no_link_str, 5);
+			browserp->smidomainp[i].sid = sid;
+			if(servicep->status == 2)
+				n_found++;
+		}
+		servicep++;
+	}
+	servicep = servp->service_ptr;
+	for(i = 0; i < n_services; i++)
+	{
+		if(servicep->status == 2)
+		{
+			index = findSmiModeObj(servp->service_ptr, n_services, servicep->name);
+			browserp->smidomainp[i].mode_index = index;
+		}
+		servicep++;
+	}
+	browserp->curr_smidomain_nobjs = n_found;
+	return n_found;
+}
+
+int findSmiModeObj(DNS_SERVICE_INFO *serviceptr, int n_services, char *name)
+{
+	int i;
+	DNS_SERVICE_INFO *servicep;
+	char mode_name[256], *ptr, *ptr1, *ptr2;
+
+	servicep = serviceptr;
+	strcpy(mode_name, name);
+	ptr1 = mode_name;
+	if((ptr = strstr(mode_name,"::")))
+	{
+		*ptr = '\0';
+		ptr2 = ptr1;
+		while((ptr1 = strchr(ptr1,'/')))
+		{
+			ptr1++;
+			ptr2 = ptr1;
+		}
+		if(strcmp(ptr2, ptr+2))
+			*ptr = ':';
+	}
+	strcat(mode_name,"_FWM");
+printf("Find SMI Mode %s %s\n",name, mode_name);
+	for(i = 0; i < n_services; i++)
+	{
+		if(servicep->status == 3)
+		{
+			if(!strcmp(servicep->name, mode_name))
+			{
+printf("Find SMI Mode index %s %s %d\n",mode_name, servicep->name, i);
+				return i;
+			}
+		}
+		servicep++;
+	}
+	return 0;
+}
+
+int checkSmiObjName(DNS_SERVICE_INFO *servicep)
+{
+	int ismode = 0, ret = 0;
+	char *name;
+	int matchString();
+
+	name = servicep->name;
+	if(matchString(name,"SMI/*"))
+	{
+		ret = 1;
+		if(matchString(name,"*&ALLOC*"))
+			ret = 0;
+		else if(matchString(name,"*/ACTIONS&PARS"))
+			ret = 0;
+		else if(matchString(name,"*/BUSY"))
+			ret = 0;
+		else if(matchString(name,"*/CMD"))
+			ret = 0;
+		else if(matchString(name,"*/OBJECTSET_LIST"))
+			ret = 0;
+		else if(matchString(name,"*/OBJECT_LIST"))
+			ret = 0;
+		else if(matchString(name,"*/SMI_VERSION_NUMBER"))
+			ret = 0;
+		else if(matchString(name,"*/SET/*"))
+			ret = 0;
+// If JCOP framework
+		else if(matchString(name,"*_FWDM"))
+			ret = 0;
+		else if(matchString(name,"*_FWCNM"))
+			ret = 0;
+		else if(matchString(name,"*_FWM"))
+		{
+			ismode = 1;
+			if(matchString(name,"*::*")) 
+				ret = 0;
+		}
+	}
+	if(ret)
+	{
+		if(ismode)
+			servicep->status = 3;
+		else
+			servicep->status = 2;
+	}
+	return ret;
 }
 
Index: trunk/FACT++/dim/src/webDid/webServer.c
===================================================================
--- trunk/FACT++/dim/src/webDid/webServer.c	(revision 18057)
+++ trunk/FACT++/dim/src/webDid/webServer.c	(revision 18058)
@@ -257,5 +257,5 @@
 	if(type == 0)
 	{
-	  ptr = getJSONHeader();
+	  ptr = getJSONHeader(0);
 	}
 	else if(type == 1)
@@ -350,8 +350,8 @@
 	char node[128], server[256], service[256];
 	int pid, ret, req, browser, force;
-	extern char *update_services();
+	extern char *update_services(), *update_smi_objects();
 	extern char *update_service_data();
 	extern char *getJSONHeader();
-	extern char *getJSONBuffer();
+	extern char *getJSONBuffer(), *getJSONSmiBuffer();
 	char datatype[128];
 	char *conv_buffer;
@@ -361,10 +361,10 @@
 	if(type == 0)
 	{
-	  ptr = getJSONHeader();
+	  ptr = getJSONHeader(1);
 	}
 	else if(type == 1)
 	{
 	    ret = getNodeParameters(conv_buffer, node, &browser);
-		ptr = getJSONBuffer(node, browser);
+		ptr = getJSONSmiBuffer(node, browser);
 	}
 	else if(type == 2)
@@ -378,5 +378,5 @@
 		else
 		{
-			ptr = update_services(node, server, pid, browser);
+			ptr = update_smi_objects(node, server, pid, browser);
 		}
 	}
@@ -550,5 +550,10 @@
 				return;
 			}
-			else if(!strncmp(&buffer[5],"smiObjects",11))
+			else if(!strncmp(&buffer[5],"smiData",7))
+			{
+				sendSmiData(conn_id, &buffer[5], 1);
+				return;
+			}
+			else if(!strncmp(&buffer[5],"smiObjects",10))
 			{
 				sendSmiData(conn_id, &buffer[5], 2);
