Index: trunk/FACT++/dim/src/benchmark/benchClient.cxx
===================================================================
--- trunk/FACT++/dim/src/benchmark/benchClient.cxx	(revision 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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 15282)
+++ 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);
