incubator-bluesky-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mabo...@apache.org
Subject svn commit: r1022999 [2/3] - /incubator/bluesky/branches/apache-bluesky-realclass0.2.0/TserverQT-0.2.0/
Date Fri, 15 Oct 2010 16:26:25 GMT
Modified: incubator/bluesky/branches/apache-bluesky-realclass0.2.0/TserverQT-0.2.0/adminserver.cpp
URL: http://svn.apache.org/viewvc/incubator/bluesky/branches/apache-bluesky-realclass0.2.0/TserverQT-0.2.0/adminserver.cpp?rev=1022999&r1=1022998&r2=1022999&view=diff
==============================================================================
--- incubator/bluesky/branches/apache-bluesky-realclass0.2.0/TserverQT-0.2.0/adminserver.cpp (original)
+++ incubator/bluesky/branches/apache-bluesky-realclass0.2.0/TserverQT-0.2.0/adminserver.cpp Fri Oct 15 16:26:25 2010
@@ -23,24 +23,13 @@
 #include <fcntl.h>
 
 
-#include "languagechoose.h"  //language change    2007.11.10
-
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
-//extern GtkWidget *textview_info;
-//extern GtkTextBuffer *buffer;
-//extern GtkTextIter end;
-//extern GtkWidget *clist_room;
-//extern GtkWidget *clist_teacher;
-//extern GtkWidget *clist_student;
-//extern GtkWidget *clist_mcu;
-//extern GtkWidget *clist_semcu;
 
 #define PACKET_SIZE 4096  
 #define MAX_WAIT_TIME 5  
 #define MAX_NO_PACKETS 3 
-#define TEXTBUFFERLEN 500
 
 char sendpacket[PACKET_SIZE];  
 char recvpacket[PACKET_SIZE];  
@@ -51,5440 +40,5138 @@ pid_t pid;  
 struct sockaddr_in from;  
 struct timeval tvrecv; 
 
-void  SendThreadProc( void* args );
-void  ScanTimerProc(int hwnd, UINT uMSG, UINT idEvent, DWORD dwTime);
-
-void  SendThreadProc( void* pv )
-{
-	//event
-	
-	if(pv == NULL)
-	{
-		
-		return;
-	}
-	CAdminServer *pAdminServer = (CAdminServer*)pv;
-	CRCLSendMSG *pRM = NULL;
-    msgbuf msg1;
-
-}
-
+/**
+  * @deprecated SendThreadProc(void *pv);
+  */
+/**
+  * @deprecated ScanTimerProc(int hwnd, UINT uMSG, UINT idEvent, DWORD dwTime);
+  */
 CAdminServer *pAdminServer = NULL;
 
 CAdminServer::CAdminServer()
 {
-	rclSendThreadHandle = 0;
-	rclSendThreadID = 0;
+    rclSendThreadHandle = 0;
+    rclSendThreadID = 0;
 
-	umu.Init();
-	tmu.Init();
-	mmu.Init();
-	smu.Init();
-	rmu.Init();
-	imu.Init();
-        dmu.Init();
-	Jtext_layoutC.Init();
-	Jtext_layoutT.Init();
+//    umu.Init();
+//   /tmu.Init();
+//    mmu.Init();
+//    smu.Init();
+//    rmu.Init();
+//    imu.Init();
+//    dmu.Init();
+//    Jtext_layoutC.Init();
+//    Jtext_layoutT.Init();
+
+    rclSysMax = 1000;
+    rclGroupMax = 100;
+    rclMCUChoose = 0;
 
-	rclSysMax = 1000;
-	rclGroupMax = 100;
-	rclMCUChoose = 0;
-
-	//rander = time(0);
-	//hScan = SetTimer(NULL, 1, 5000, ScanTimerProc);
-	pAdminServer = this;
+    pAdminServer = this;
 
 }
 
 
-void ScanTimerProc(int hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
-{
-	pAdminServer->rclScanSys();
-}
-
 CAdminServer::~CAdminServer()
 {
-	//return ;
-	umu.Lock();
-	if(UserList.size())
-	{
-		rclUserList::iterator it;
-	    for(it = UserList.begin();it != UserList.end();++it)
-	    {
-		     delete *it;
-		     *it = NULL;
-	     }
-	    UserList.clear();
-     }
-	 umu.Unlock();
+    //return ;
+    umu.lock();
+    if(UserList.size())
+    {
+        rclUserList::iterator it;
+        for(it = UserList.begin();it != UserList.end();++it)
+        {
+            delete *it;
+            *it = NULL;
+        }
+        UserList.clear();
+    }
+    umu.unlock();
 
-	tmu.Lock();
+    tmu.lock();
     if(TeacherList.size())
     {
-	    rclTeacherList::iterator it;
-	    for(it = TeacherList.begin();it != TeacherList.end();++it)
-	    {
-		    delete *it;
-		    *it =NULL;
-	    }
-	    TeacherList.clear();
+        rclTeacherList::iterator it;
+        for(it = TeacherList.begin();it != TeacherList.end();++it)
+        {
+            delete *it;
+            *it =NULL;
+        }
+        TeacherList.clear();
     }
-    tmu.Unlock();
+    tmu.unlock();
 
-    mmu.Lock();
+    mmu.lock();
     if(MCUList.size())
     {
-	    rclMCUList::iterator it;
-	    for(it = MCUList.begin();it != MCUList.end();++it)
-	    {
-		    delete *it;
-		    *it =NULL;
-	    }
-	    MCUList.clear();
+        rclMCUList::iterator it;
+        for(it = MCUList.begin();it != MCUList.end();++it)
+        {
+            delete *it;
+            *it =NULL;
+        }
+        MCUList.clear();
     }
-    mmu.Unlock();
+    mmu.unlock();
 
-    smu.Lock();
+    smu.lock();
     if(SeMCUList.size())
     {
-	    rclSeMCUList::iterator it;
-	    for(it = SeMCUList.begin();it != SeMCUList.end();++it)
-	    {
-		    delete *it;
-		    *it =NULL;
-	    }
-	    SeMCUList.clear();
+        rclSeMCUList::iterator it;
+        for(it = SeMCUList.begin();it != SeMCUList.end();++it)
+        {
+            delete *it;
+            *it =NULL;
+        }
+        SeMCUList.clear();
     }
-    smu.Unlock();
+    smu.unlock();
 
-    rmu.Lock();
+    rmu.lock();
     if(RoomList.size())
     {
-	    rclRoomList::iterator it;
-	    for(it = RoomList.begin();it != RoomList.end();++it)
-	    {
-		    (*it)->rclUserRoom.clear();
-		    (*it)->rclSeMCURoom.clear();
-		    delete *it;
-		    *it =NULL;
-	    }
-	    RoomList.clear();
+        rclRoomList::iterator it;
+        for(it = RoomList.begin();it != RoomList.end();++it)
+        {
+            (*it)->rclUserRoom.clear();
+            (*it)->rclSeMCURoom.clear();
+            delete *it;
+            *it =NULL;
+        }
+        RoomList.clear();
     }
-    rmu.Unlock();
+    rmu.unlock();
 
-    imu.Lock();
+    imu.lock();
     if(IPList.size())
     {
-	    IPList.clear();
+        IPList.clear();
     }
-    imu.Unlock();
+    imu.unlock();
 
-    dmu.Lock();
+    dmu.lock();
     if(IDList.size())
     {
-	    IDList.clear();
+        IDList.clear();
     }
-    dmu.Unlock();
+    dmu.unlock();
 
     
 }
 
 
-void CAdminServer::rclScanSys()
-{
-	//if(bRun)
-	//{
-	    
-		CAsyncSocketEx asy;
-		rclIPList::iterator itp;
-		imu.Lock();
-		for(itp = IPList.begin();itp != IPList.end(); ++itp)
-		{
-			char bb[10] = "abcdefghi";
-            asy.Attach((*itp)->s, 0);
-            asy.Send(&bb, 10, 0);
-			asy.Detach( );
-		}
-		imu.Unlock();
-	//}
-}
-
 int CAdminServer::Init()
 {
-//	//	gtk_text_buffer_insert(buffer,&end,pInit,-1);
+    //	bRun = TRUE;
+    bRun = 1;
+    ClientTalk = 1;
+    //NodeInfoOut = pNcn;
+    rclSysMax = 1000;
+    rclTeacherMax = 10;
+    rclStudentMax = 1000;
+    ListenPort = 8000;
+    MaxOnline = 1000;
+    MaxTeacherOnline = 10;
+    MaxStudentOnline = 1000;
 
-//	bRun = TRUE;
-        bRun = 1;
-	ClientTalk = 1;
-	//NodeInfoOut = pNcn;
-	rclSysMax = 1000;
-	rclTeacherMax = 10;
-	rclStudentMax = 1000;
-	ListenPort = 8000;
-	MaxOnline = 1000;
-	MaxTeacherOnline = 10;
-	MaxStudentOnline = 1000;
-	
     rclCurrentNum = 0;
     sum = 0;
-    count = 1;	
-	InitializeIDList(rclSysMax);
+    count = 1;
+    InitializeIDList(rclSysMax);
 
-	
-	m_listemsocket.m_pServer = this;
-	if(!m_listemsocket.Create(12345)){
-		printf("create failed!\n");
-		bool re = true;
-		int one = 1;
-		if(!m_listemsocket.SetSockOpt(SO_REUSEADDR, (char *) &one, sizeof(int), SOL_SOCKET))
-			printf("set failed!!\n");
-
-	}
-	if(!m_listemsocket.Listen()){
-		int d;
-
-		printf("\nListen faild:\n");
-		return false;
-	}
-	m_listen.Init()	;
-	m_listen.Start();
 
-	
-//	gtk_text_buffer_insert(buffer,&end,pstarted,-1);
-	m_listen.Attach(&m_listemsocket);
-	int i;
-	for(i=0; i<THREADCOUNT; i++){
-		m_accept[i].Init();
-		m_accept[i].Start();
-	}
-	return true;
+    m_listemsocket.m_pServer = this;
+    if(!m_listemsocket.Create(12345)){
+        printf("create failed!\n");
+        bool re = true;
+        int one = 1;
+        if(!m_listemsocket.SetSockOpt(SO_REUSEADDR, (char *) &one, sizeof(int), SOL_SOCKET))
+            printf("set failed!!\n");
+
+    }
+    if(!m_listemsocket.Listen()){
+        int d;
+        printf("\nListen faild:\n");
+        return false;
+    }
+    //test sever
+    printf("server has started.\n");
+
+    m_listen.Init()	;
+    m_listen.Start();
+    m_listen.Attach(&m_listemsocket);
+    int i;
+    for(i=0; i<THREADCOUNT; i++){
+        m_accept[i].Init();
+        m_accept[i].Start();
+    }
+    return true;
 }
 
 int CAdminServer::InitializeIDList(DWORD IDCount)
 {
-	if((IDCount + 1) >= (0xFFFFFFFF - 2))
-		return 0;
-	dmu.Lock();
-	for(int i = 0;i<IDCount;i++)
-		IDList.push_back(i+1);
-	dmu.Unlock();
-	return 1;
+    if((IDCount + 1) >= (0xFFFFFFFF - 2))
+        return 0;
+    dmu.lock();
+    for(int i = 0;i<IDCount;i++)
+        IDList.push_back(i+1);
+    dmu.unlock();
+    return 1;
 }
-
+//TODO: move switch out of this request parse function
 BOOL CAdminServer::ParseRequest(CRCLMSG* pM, int event, SOCKET s, BOOL &bKeepAlive)
 {
-	int i;
-	
-	
+    int i;
 
+    bKeepAlive = true;
+    printf("%d\n",pM->rclType);
+    printf("%d\n",pM->msglen);
 
-	bKeepAlive = true;
-	printf("%d\n",pM->rclType);
-	printf("%d\n",pM->msglen);
+    if(pM->rclType >= 10000)
+    {
 
-	if(pM->rclType >= 10000)
-	{
-		
-		switch (pM->rclType)
-		{
-			case 10000:
-				
-				rclTeacherCreateGroup((CRCLCreateGroup*)&pM->msg,s);
-				break;
-			case 10010:
-				
-				rclTeacherLeaveGroup((CRCLDestroyGroup*)&pM->msg,s);
-				break;
-			case 10020:
-				
-				rclClientJoinGroup((CRCLClientJoinInGroup*)&pM->msg,s);
-				break;
-			case 10030:
-				
-				rclClientLeaveGroup((CRCLClientLeaveGroup*)&pM->msg,s);
-				break;
-				
-			case 10040:
-				rclMCULeaveGroup((CRCLMCULeaveGroup*)&pM->msg,s);
-				break;
-				
-			case 10050:
-				rclClientGetGroupInfo((CRCLClientGetCroupInfo*)&pM->msg,s);
-				break;
-				
-			case 10060:
-				rclSeMCUGetGroupInfo((CRCLSeMCUGetGroupInfo*)&pM->msg,s);
-				break;
-				
-			case 10070:
-				rclSeMCUJoinGroup((CRCLSeMCUJoinGroup*)&pM->msg,s);
-				break;
-				
-			case 10080:
-				rclSeMCULeaveGroup((CRCLSeMCULeaveGroup*)&pM->msg,s);
-				break;
-			default:
-				return false;
-		}
-		return true;
-	}
-	
+        switch (pM->rclType)
+        {
+        case 10000:
+
+            rclTeacherCreateGroup((CRCLCreateGroup*)&pM->msg,s);
+            break;
+        case 10010:
+
+            rclTeacherLeaveGroup((CRCLDestroyGroup*)&pM->msg,s);
+            break;
+        case 10020:
+
+            rclClientJoinGroup((CRCLClientJoinInGroup*)&pM->msg,s);
+            break;
+        case 10030:
+
+            rclClientLeaveGroup((CRCLClientLeaveGroup*)&pM->msg,s);
+            break;
+
+        case 10040:
+            rclMCULeaveGroup((CRCLMCULeaveGroup*)&pM->msg,s);
+            break;
+
+        case 10050:
+            rclClientGetGroupInfo((CRCLClientGetCroupInfo*)&pM->msg,s);
+            break;
+
+        case 10060:
+            rclSeMCUGetGroupInfo((CRCLSeMCUGetGroupInfo*)&pM->msg,s);
+            break;
+
+        case 10070:
+            rclSeMCUJoinGroup((CRCLSeMCUJoinGroup*)&pM->msg,s);
+            break;
+
+        case 10080:
+            rclSeMCULeaveGroup((CRCLSeMCULeaveGroup*)&pM->msg,s);
+            break;
+        default:
+            return false;
+        }
+        return true;
+    }
 
-	
-	if(pM->rclType >= 5000)
-	{
-		
-		switch(pM->rclType) 
-		{
-		case 5000:
-			
-			rclTeacherLogin((CRCLTeacherLogin*)&pM->msg,s,event);//pass 4.26
-			break;
-		case 5010:
-			
-			rclMCULogin((CRCLMCULogin*)&pM->msg,s,event);//pass 4.26
-			break;
-		case 5020:
-			
-			rclClientLogin((CRCLClientLogin*)&pM->msg,s,event);//pass 4.27
- 			break;
-		case 5030:
-			
-			rclTeacherLogout((CRCLTeacherLogout*)&pM->msg,s);//4.27
-			break;
-		case 5040:
-			
-			rclMCULogout((CRCLMCULogout*)&pM->msg,s);//4.27
-			break;
-		case 5050:
-			
-			rclClientLogout((CRCLClientLogout*)&pM->msg,s);//4.27
-			break;
-		case 5060:
-			
-			rclSeMCULogin((CRLCSeMCULogin*)&pM->msg,s,event);//4.27
-			break;
-		case 5070:
-			
-			rclSeMCULogout((CRCLSeMCULogout*)&pM->msg,s);
-			break;
-		default:
-			return false;
-		}
-		return true;
-	}
 
-	
-	if(pM->rclType >= 1000)
-	{
-		
-		switch(pM->rclType) 
-		{
-		case 1000:
-			
-			rclTeacherTextBroadcast((CRCLTeacherTextBroadcast*)&pM->msg,s);
-			break;
-		case 1010:
-			
-			rclClientApplyFocus((CRCLClientApplyFocus*)&pM->msg,s);
-			break;
-		case 1020:
-			
-			rclClientDestroyFocus((CRCLClientDestroyFocus*)&pM->msg,s);
-			break;
-		case 1030:
-			
-			rclClientTextBroadcast((CRCLClientTextBroadcast*)&pM->msg,s);
-			break;
-		case 1040:
-			
-			rclClientGetClientInfo((CRCLClientGetClientInfo*)&pM->msg,s);
-			break;
-		case 1050:
-			
-			rclTeacherAllowClientFocus((CRCLTeacherAllowClientFocus*)&pM->msg,s);
-			break;
-		case 1060:
-			
-			rclTeacherCancelClientFocus((CRCLTeacherCancelClientFocus*)&pM->msg,s);
-			break;
-		case 1070:
-			
-			rclTeacherGetClientList((CRCLTeacherGetClientList*)&pM->msg,s);
-			break;
-		case 1080:
-			
-			rclTeacherSwitchMode((CRCLTeacherSwitchMode*)&pM->msg,s);
-			break;
-		case 1090:
-			rclTeacherChat((CRCLTeacherChat *)&pM->msg ,s);
-			break;
-			
-		default:
-			return false;
-		}
-	}
 
-	return true;
+    if(pM->rclType >= 5000)
+    {
+
+        switch(pM->rclType)
+        {
+        case 5000:
+
+            rclTeacherLogin((CRCLTeacherLogin*)&pM->msg,s,event);//pass 4.26
+            break;
+        case 5010:
+
+            rclMCULogin((CRCLMCULogin*)&pM->msg,s,event);//pass 4.26
+            break;
+        case 5020:
+
+            rclClientLogin((CRCLClientLogin*)&pM->msg,s,event);//pass 4.27
+            break;
+        case 5030:
+
+            rclTeacherLogout((CRCLTeacherLogout*)&pM->msg,s);//4.27
+            break;
+        case 5040:
+
+            rclMCULogout((CRCLMCULogout*)&pM->msg,s);//4.27
+            break;
+        case 5050:
+
+            rclClientLogout((CRCLClientLogout*)&pM->msg,s);//4.27
+            break;
+        case 5060:
+
+            rclSeMCULogin((CRLCSeMCULogin*)&pM->msg,s,event);//4.27
+            break;
+        case 5070:
+
+            rclSeMCULogout((CRCLSeMCULogout*)&pM->msg,s);
+            break;
+        default:
+            return false;
+        }
+        return true;
+    }
+
+
+    if(pM->rclType >= 1000)
+    {
+
+        switch(pM->rclType)
+        {
+        case 1000:
+
+            rclTeacherTextBroadcast((CRCLTeacherTextBroadcast*)&pM->msg,s);
+            break;
+        case 1010:
+
+            rclClientApplyFocus((CRCLClientApplyFocus*)&pM->msg,s);
+            break;
+        case 1020:
+
+            rclClientDestroyFocus((CRCLClientDestroyFocus*)&pM->msg,s);
+            break;
+        case 1030:
+
+            rclClientTextBroadcast((CRCLClientTextBroadcast*)&pM->msg,s);
+            break;
+        case 1040:
+
+            rclClientGetClientInfo((CRCLClientGetClientInfo*)&pM->msg,s);
+            break;
+        case 1050:
+
+            rclTeacherAllowClientFocus((CRCLTeacherAllowClientFocus*)&pM->msg,s);
+            break;
+        case 1060:
+
+            rclTeacherCancelClientFocus((CRCLTeacherCancelClientFocus*)&pM->msg,s);
+            break;
+        case 1070:
+
+            rclTeacherGetClientList((CRCLTeacherGetClientList*)&pM->msg,s);
+            break;
+        case 1080:
+
+            rclTeacherSwitchMode((CRCLTeacherSwitchMode*)&pM->msg,s);
+            break;
+        case 1090:
+            rclTeacherChat((CRCLTeacherChat *)&pM->msg ,s);
+            break;
+
+        default:
+            return false;
+        }
+    }
+
+    return true;
 }
 int CAdminServer::rclSendMessage(DWORD userid, std::string msg)
 {
-	
 
-	//search user's socket
-	
-	rclUserList::iterator it;
-		
-	for(it = UserList.begin();it != UserList.end(); ++it)
-	{
-		if((*it)->rclClientID == userid)
-		{
-			SOCKET s = (*it)->s;
-
-	       
-	        CRCLSendMSG *pRCSM = new CRCLSendMSG;
-
-	        pRCSM->msg = msg;
-	        pRCSM->s = s;
-
-	        if(!rclSendThreadID)
-	        {
-		        return 1;
-	        }
-			
-			//06.03.31
-	        return 0;
-		}
-	}	
-	if(it == UserList.end())
-	{
-		return 1;
-	}
-}
 
-int CAdminServer::rclSendM()
-{
-	return 1;
+    //search user's socket
+
+    rclUserList::iterator it;
+
+    for(it = UserList.begin();it != UserList.end(); ++it)
+    {
+        if((*it)->rclClientID == userid)
+        {
+            SOCKET s = (*it)->s;
+
+
+            CRCLSendMSG *pRCSM = new CRCLSendMSG;
+
+            pRCSM->msg = msg;
+            pRCSM->s = s;
+
+            if(!rclSendThreadID)
+            {
+                return 1;
+            }
+
+            //06.03.31
+            return 0;
+        }
+    }
+    if(it == UserList.end())
+    {
+        return 1;
+    }
 }
 
+
 int CAdminServer::GotConnection(SOCKET s, char* ip, int port)
 {
-	CRCLNodeIP* Node = new CRCLNodeIP;
-	Node->s = s;
-	memcpy(Node->IP,ip,16);
-	rclIPList::iterator itp;
-	imu.Lock();
-	for(itp = IPList.begin();itp != IPList.end();++itp)
-	{
-		if((*itp)->s == s)
-		{
-			imu.Unlock();
-			printf("same socket\n");
-			return 1;
-		}
-	}
-	IPList.push_back(Node);
-	imu.Unlock();
-	rclCurrentNum++;
-	return 1;
+    CRCLNodeIP* Node = new CRCLNodeIP;
+    Node->s = s;
+    memcpy(Node->IP,ip,16);
+    rclIPList::iterator itp;
+    imu.lock();
+    for(itp = IPList.begin();itp != IPList.end();++itp)
+    {
+        if((*itp)->s == s)
+        {
+            imu.unlock();
+            printf("same socket\n");
+            return 1;
+        }
+    }
+    IPList.push_back(Node);
+    imu.unlock();
+    rclCurrentNum++;
+    return 1;
 }
 
 int CAdminServer::Disconnect(SOCKET s)
 {
-	
-	rclIPList::iterator itp;
+
+    rclIPList::iterator itp;
     printf("enter ip lock\n");	
-	imu.Lock();
-	printf("entered ip lock\n");
-	for(itp = IPList.begin();itp != IPList.end(); ++itp)
-	{
-		if((*itp)->s == s)
-		{
-	        if(itp != IPList.end())
-	        {
-				delete (*itp);
-				(*itp) = NULL;
-		        IPList.erase(itp);
-				rclCurrentNum--;
-	        }
-			break;
-		}		
-	}	
-	imu.Unlock();
+    imu.lock();
+    printf("entered ip lock\n");
+    for(itp = IPList.begin();itp != IPList.end(); ++itp)
+    {
+        if((*itp)->s == s)
+        {
+            if(itp != IPList.end())
+            {
+                delete (*itp);
+                (*itp) = NULL;
+                IPList.erase(itp);
+                rclCurrentNum--;
+            }
+            break;
+        }
+    }
+    imu.unlock();
 
-	
-	rclUserList::iterator itu;
-	printf("enter user lock\n");
-	umu.Lock();
-	printf("entered user lock\n");
+
+    rclUserList::iterator itu;
+    printf("enter user lock\n");
+    umu.lock();
+    printf("entered user lock\n");
     for(itu = UserList.begin();itu != UserList.end(); ++itu)
-	{
-		if((*itu)->s == s)
-		{
-	        if(itu != UserList.end())
-	        {
-		       
-		        CRCLClientLogout Msg;
-		        Msg.ClientID = (*itu)->rclClientID;
-
-		       
-		        
-		        umu.Unlock();
-				printf("out user lock\n");
-		        rclClientLogout(&Msg,s);
+    {
+        if((*itu)->s == s)
+        {
+            if(itu != UserList.end())
+            {
+
+                CRCLClientLogout Msg;
+                Msg.ClientID = (*itu)->rclClientID;
+
+
+
+                umu.unlock();
+                printf("out user lock\n");
+                rclClientLogout(&Msg,s);
 		
-		        return 0;
-	        }
-		}
-	}
-	umu.Unlock();
+                return 0;
+            }
+        }
+    }
+    umu.unlock();
 
-	
-	rclTeacherList::iterator itt;
-	printf("enter teacher lock\n");
-	tmu.Lock();
-	printf("entered teacher lock\n");
+
+    rclTeacherList::iterator itt;
+    printf("enter teacher lock\n");
+    tmu.lock();
+    printf("entered teacher lock\n");
     for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
-	{
-		if((*itt)->s == s)
-		{
-	        if(itt != TeacherList.end())
-	        {
-		     
-		        CRCLTeacherLogout Msg;
-		        Msg.TeacherID = (*itt)->rclTeacherID;
-		
-		        tmu.Unlock();
-		        rclTeacherLogout(&Msg,s);
-		
-		        return 0;
-	        }
-		}
-	}
-	tmu.Unlock();
+    {
+        if((*itt)->s == s)
+        {
+            if(itt != TeacherList.end())
+            {
+
+                CRCLTeacherLogout Msg;
+                Msg.TeacherID = (*itt)->rclTeacherID;
+		
+                tmu.unlock();
+                rclTeacherLogout(&Msg,s);
+		
+                return 0;
+            }
+        }
+    }
+    tmu.unlock();
 
-	
-	rclMCUList::iterator itm;
-	printf("enter mcu lock\n");
-	mmu.Lock();
-	printf("entered mcu lock\n");
+
+    rclMCUList::iterator itm;
+    printf("enter mcu lock\n");
+    mmu.lock();
+    printf("entered mcu lock\n");
     for(itm = MCUList.begin();itm != MCUList.end();++itm)
-	{
+    {
         if((*itm)->s == s)
         {			
-	        if(itm != MCUList.end())
-	        {
-		      
-		        CRCLMCULogout Msg;
-		        Msg.MCUID = (*itm)->rclMCUID;
-		
-		        mmu.Unlock();
-		        rclMCULogout(&Msg,s);
+            if(itm != MCUList.end())
+            {
 
-		        return 0;
-	        }
-		}
-	}
-	mmu.Unlock();
-
-
-	rclSeMCUList::iterator its;
-	printf("enter semcu lock\n");
-	smu.Lock();
-	printf("entered semcu lock\n");
-	for(its = SeMCUList.begin();its != SeMCUList.end();++its)
-	{
-		if((*its)->s == s)
-		{
-	        if(its != SeMCUList.end())
-	        {
-		     
-		        CRCLSeMCULogout Msg;
-		        Msg.MCUID = (*its)->rclMCUID;
-
-		        smu.Unlock();
-		        rclSeMCULogout(&Msg,s);
-
-		        return 0;
-	        }
-		}
-	}
-	smu.Unlock();
+                CRCLMCULogout Msg;
+                Msg.MCUID = (*itm)->rclMCUID;
+		
+                mmu.unlock();
+                rclMCULogout(&Msg,s);
 
-	return 1;
-}
+                return 0;
+            }
+        }
+    }
+    mmu.unlock();
 
-int CAdminServer::rclBroadCast(DWORD)
-{
-	rclUserList::iterator it;
-	for(it = UserList.begin();it != UserList.end();++it)
-	{
-		rclSendMessage((*it)->rclClientID,"hello");
-	}
-	return 1;
-}
 
-int CAdminServer::DataSent(DWORD)
-{
-	
-}
+    rclSeMCUList::iterator its;
+    printf("enter semcu lock\n");
+    smu.lock();
+    printf("entered semcu lock\n");
+    for(its = SeMCUList.begin();its != SeMCUList.end();++its)
+    {
+        if((*its)->s == s)
+        {
+            if(its != SeMCUList.end())
+            {
+
+                CRCLSeMCULogout Msg;
+                Msg.MCUID = (*its)->rclMCUID;
+
+                smu.unlock();
+                rclSeMCULogout(&Msg,s);
+
+                return 0;
+            }
+        }
+    }
+    smu.unlock();
 
-BOOL CAdminServer::IsComplete(std::string)
-{
-	return 1;
+    return 1;
 }
-
-int CAdminServer::rclUserSendTextToUser()
+//TODO: change the parameter to String xxxx and send it out
+int CAdminServer::rclBroadCast(DWORD)
 {
+    rclUserList::iterator it;
+    for(it = UserList.begin();it != UserList.end();++it)
+    {
+        rclSendMessage((*it)->rclClientID,"hello");
+    }
+    return 1;
 }
-
+//TODO: send text message to class member
 int CAdminServer::rclUserSendTextToGroup(DWORD userid, DWORD groupid, std::string text, int flag)
 {
-	char textbuf[TEXTBUFFERLEN];
-	rclUserList::iterator itu;
-	umu.Lock();
-	for(itu = UserList.begin();itu != UserList.end();++itu)
-	{
-		if((*itu)->rclClientID == userid)
-		{
-			sprintf(textbuf,pstu_sed_text,(*itu)->rclName); 
-		}
-	}
-	umu.Unlock();
-	
+    rclUserList::iterator itu;
+    umu.lock();
+    for(itu = UserList.begin();itu != UserList.end();++itu)
+    {
+        if((*itu)->rclClientID == userid)
+        {
+        }
+    }
+    umu.unlock();
+    rclRoomList::iterator it;
+    CAsyncSocketEx asy;
+    rmu.lock();
 
-	rclRoomList::iterator it;
-	CAsyncSocketEx asy;
-	rmu.Lock();
-	
-	for(it = RoomList.begin();it != RoomList.end();++it)
-	{
-		if((*it)->rclRoomID == groupid)
-		{
-			rmu.Unlock();
-			
-			
-//			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//			//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
-	        std::list<DWORD>::iterator ita;
-			(*it)->cs.Lock();
-	        for(ita=(*it)->rclUserRoom.begin();ita!=(*it)->rclUserRoom.end();++ita)
-	        {
-		        if(ita == (*it)->rclUserRoom.end())
-		        {
-			        break;
-		        }
-		        if((*ita == userid) && flag)
-		        {
-			      
-			        break;
-		        }
-		        
-		        rclUserList::iterator itb;
-				umu.Lock();
-		        for(itb = UserList.begin();itb != UserList.end();++itb)
-				{
-					if((*itb)->rclClientID == *ita)
-					{
-						
-		                SOCKET s = (*itb)->s;
-						umu.Unlock();
-		              
-		                char *wBuffer;
-		                wBuffer = (char*)malloc(text.size());
-		                memcpy(wBuffer,text.c_str(),text.size());
-		                asy.Attach(s,0);
-		                asy.Send(wBuffer,text.size(),0);
-						asy.Detach();
-						break;
-					}
-				}
-				if(itb == UserList.end())
-		        {
-					umu.Unlock();
-			       
-			        break;
-		        }		        		
-	        }
-            (*it)->cs.Unlock();
-	        return 0;
-		}
-	}
-	if(it == RoomList.end())
-	{
-		rmu.Unlock();
-		return 1;
-	}
+    for(it = RoomList.begin();it != RoomList.end();++it)
+    {
+        if((*it)->rclRoomID == groupid)
+        {
+            rmu.unlock();
+
+            std::list<DWORD>::iterator ita;
+            (*it)->cs.lock();
+            for(ita=(*it)->rclUserRoom.begin();ita!=(*it)->rclUserRoom.end();++ita)
+            {
+                if(ita == (*it)->rclUserRoom.end())
+                {
+                    break;
+                }
+                if((*ita == userid) && flag)
+                {
+
+                    break;
+                }
+
+                rclUserList::iterator itb;
+                umu.lock();
+                for(itb = UserList.begin();itb != UserList.end();++itb)
+                {
+                    if((*itb)->rclClientID == *ita)
+                    {
+
+                        SOCKET s = (*itb)->s;
+                        umu.unlock();
+
+                        char *wBuffer;
+                        wBuffer = (char*)malloc(text.size());
+                        memcpy(wBuffer,text.c_str(),text.size());
+                        asy.Attach(s,0);
+                        asy.Send(wBuffer,text.size(),0);
+                        asy.Detach();
+                        break;
+                    }
+                }
+                if(itb == UserList.end())
+                {
+                    umu.unlock();
+
+                    break;
+                }
+            }
+            (*it)->cs.unlock();
+            return 0;
+        }
+    }
+    if(it == RoomList.end())
+    {
+        rmu.unlock();
+        return 1;
+    }
 }
 
 int CAdminServer::rclTeacherLogin(CRCLTeacherLogin *pMSG,SOCKET s, int event)
 {
-	char textbuf[TEXTBUFFERLEN];
-	sprintf(textbuf,pteacher_login,pMSG->TeacherName);  //"%",pMSG->TeacherName);
-	printf("%s\n",pMSG->TeacherName);
-	if ((TeacherList.size() +1 ) <= rclTeacherMax) 
-	{
-    
-	    
-	    tmu.Lock();
-	    rclTeacherList::iterator it_online;
-	    for(it_online = TeacherList.begin();it_online != TeacherList.end();++it_online)
-		{
-
-			if(!strcmp((*it_online)->rclName, pMSG->TeacherName))
-			{
-				printf("here in\n");
-	            if(it_online != TeacherList.end())
-	            {
-		          
-		            if(strncmp((*it_online)->rclPass,pMSG->TeacherPass,16) == 0)
-		            {
-
-//						gtk_text_buffer_insert(buffer,&end,perror001,-1);
-						tmu.Unlock();
-			          
-			            
-			            
-
-						rclResponseError(5001,s,RCL_USER_AlREADY_ONLINE);
-						return 1;
-		            }
-		            else
-		            {
-			           
-
-
-//						gtk_text_buffer_insert(buffer,&end,perror002,-1);
-			            tmu.Unlock();
-			            rclResponseError(5001,s,RCL_USER_AlREADY_ONLINE);
-			            return 1;
-		            }
-	            }
-			}
-		}
-	    tmu.Unlock();
+    printf("%s\n",pMSG->TeacherName);
+    if ((TeacherList.size() +1 ) <= rclTeacherMax)
+    {
+
+
+        tmu.lock();
+        rclTeacherList::iterator it_online;
+        for(it_online = TeacherList.begin();it_online != TeacherList.end();++it_online)
+        {
+
+            if(!strcmp((*it_online)->rclName, pMSG->TeacherName))
+            {
+                printf("here in\n");
+                if(it_online != TeacherList.end())
+                {
+
+                    if(strncmp((*it_online)->rclPass,pMSG->TeacherPass,16) == 0)
+                    {
+
+                        tmu.unlock();
+                        rclResponseError(5001,s,RCL_USER_AlREADY_ONLINE);
+                        return 1;
+                    }
+                    else
+                    {
+                        tmu.unlock();
+                        rclResponseError(5001,s,RCL_USER_AlREADY_ONLINE);
+                        return 1;
+                    }
+                }
+            }
+        }
+        tmu.unlock();
 
 	
 	
-	    CRCLTeacher *pNode = new CRCLTeacher;
-	    memcpy(pNode->rclName,pMSG->TeacherName,NAMELEN);//06.10.11
-	    memcpy(pNode->rclPass,pMSG->TeacherPass,16);
-	    pNode->s = s;
-	    memset(pNode->rclIP,0,16);
-		
-	    rclIPList::iterator itp;
-	    imu.Lock();
-	    for(itp = IPList.begin();itp != IPList.end();++itp)
-		{
-			if((*itp)->s == s)
-			{
-				
+        CRCLTeacher *pNode = new CRCLTeacher;
+        memcpy(pNode->rclName,pMSG->TeacherName,NAMELEN);//06.10.11
+        memcpy(pNode->rclPass,pMSG->TeacherPass,16);
+        pNode->s = s;
+        memset(pNode->rclIP,0,16);
+
+        rclIPList::iterator itp;
+        imu.lock();
+        for(itp = IPList.begin();itp != IPList.end();++itp)
+        {
+            if((*itp)->s == s)
+            {
 
-				memcpy(pNode->rclIP,(*itp)->IP,16);
 
-	            imu.Unlock();
-	
-	            memcpy(pNode->rclLocalIP,pMSG->TeacherIP,16);
+                memcpy(pNode->rclIP,(*itp)->IP,16);
 
-				
-	            pNode->rclPort = 0;
-	            pNode->rclSAPort = 0;
-	            pNode->rclSVPort = 0;
-	            pNode->rclRoomID = 0;
-	            pNode->rclTeacherID = rclPopPushID(0);
-	            pNode->ThreadEvent = event;
-	            if(pNode->rclTeacherID == 0)
-	            {
-		            rclResponseError(5001,s,RCL_MAX_USER);
-		            delete pNode;
-		            pNode = NULL;
-		            return 1;
-	            }
-	
-	            
-	            tmu.Lock();
-	            TeacherList.push_back(pNode);
-	            tmu.Unlock();
-	
+                imu.unlock();
 
-	
-	           
-	            CRCLMSG response;
-	            CRCLTeacherLoginR res;
-	
-	            res.ResponseType = 0;
-	            res.TeacherID = pNode->rclTeacherID;
-	
-	           
-	            DWORD ClassCount = 0;
-	            memset(res.ClassInfo,0,sizeof(res.ClassInfo));
-	            res.ClassInfoReturn = 1;
-	            res.ClassInfoCount = 1;
-	
-	            response.msglen = sizeof(CRCLTeacherLoginR) - 15*sizeof(CRCLUserClassInfo);
-	            response.rclType = 5001;
+                memcpy(pNode->rclLocalIP,pMSG->TeacherIP,16);
 
-				rclMakePacket(response.msg,(char*)&res,response.msglen);
 
-                                //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//				//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+                pNode->rclPort = 0;
+                pNode->rclSAPort = 0;
+                pNode->rclSVPort = 0;
+                pNode->rclRoomID = 0;
+                pNode->rclTeacherID = rclPopPushID(0);
+                pNode->ThreadEvent = event;
+                if(pNode->rclTeacherID == 0)
+                {
+                    rclResponseError(5001,s,RCL_MAX_USER);
+                    delete pNode;
+                    pNode = NULL;
+                    return 1;
+                }
 
-	            
-	            return rclSendResponse((char*)&response,response.msglen+8,&s,1);
-				
-			}
-		}
-		if(itp == IPList.end())
-	    {
-		  
-		    imu.Unlock();
-		    rclResponseError(5001,s,RCL_LOGIN_ERROR);
-		    delete pNode;
-		    pNode = NULL;
-		    return 1;
-	    }
+
+                tmu.lock();
+                TeacherList.push_back(pNode);
+                tmu.unlock();
+
+
+
+
+                CRCLMSG response;
+                CRCLTeacherLoginR res;
+
+                res.ResponseType = 0;
+                res.TeacherID = pNode->rclTeacherID;
+
+
+                DWORD ClassCount = 0;
+                memset(res.ClassInfo,0,sizeof(res.ClassInfo));
+                res.ClassInfoReturn = 1;
+                res.ClassInfoCount = 1;
+
+                response.msglen = sizeof(CRCLTeacherLoginR) - 15*sizeof(CRCLUserClassInfo);
+                response.rclType = 5001;
+
+                rclMakePacket(response.msg,(char*)&res,response.msglen);
+
+                //				//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+
+
+                return rclSendResponse((char*)&response,response.msglen+8,&s,1);
+
+            }
+        }
+        if(itp == IPList.end())
+        {
+
+            imu.unlock();
+            rclResponseError(5001,s,RCL_LOGIN_ERROR);
+            delete pNode;
+            pNode = NULL;
+            return 1;
+        }
     }
     else
     {
-	    rclResponseError(5001,s,RCL_MAX_TEACHER);
-	    return 1;    
+        rclResponseError(5001,s,RCL_MAX_TEACHER);
+        return 1;
     }
 }
 
 
 int CAdminServer::rclTeacherLogout(CRCLTeacherLogout *pMSG, SOCKET s)
 {
-	char textbuf[TEXTBUFFERLEN];
-	
-	rclTeacherList::iterator itt;
-	tmu.Lock();
-	for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
-	{
-		if((*itt)->rclTeacherID == pMSG->TeacherID)
-		{
-			sprintf(textbuf,pteacher_logout,(*itt)->rclName);  
-			printf("step1\n");
-			
-	        DWORD teacherid = (*itt)->rclTeacherID;
-	        DWORD roomid = (*itt)->rclRoomID;
-	        tmu.Unlock();
-	
+
+    rclTeacherList::iterator itt;
+    tmu.lock();
+    for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
+    {
+        if((*itt)->rclTeacherID == pMSG->TeacherID)
+        {
+            printf("step1\n");
+
+            DWORD teacherid = (*itt)->rclTeacherID;
+            DWORD roomid = (*itt)->rclRoomID;
+            tmu.unlock();
+
 	    
-	        if(roomid)
-	        {
-		       
-				printf("step2\n");
-		        CRCLDestroyGroup msg;
-		        msg.GroupID = roomid;
-		        msg.TeacherID = teacherid;
-		     
-		        rclTeacherLeaveGroup(&msg,s);
-	        }
-	
-	      
-	        tmu.Lock();
-			rclTeacherList::iterator itt1;
-	        for(itt1 = TeacherList.begin();itt1 != TeacherList.end();++itt1)
-			{
-				printf("step9\n");
-				if((*itt1)->rclTeacherID == pMSG->TeacherID)
-				{
-					printf("step10\n");
-					rclPopPushID((*itt1)->rclTeacherID);
-	                delete (*itt1);
-	                (*itt1) = NULL;
-	                TeacherList.erase(itt1);
-	                tmu.Unlock();
-                                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//					//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+            if(roomid)
+            {
 
-	
-	                return 0;
-				}
-			}
-			if(itt1 == TeacherList.end())
-	        {
-		        
-		        tmu.Unlock();
-		       
-		        return 1;
-	        }
-		}
-	}
-	if(itt == TeacherList.end())
-	{
-		
-		tmu.Unlock();
-		
-		return 1;
-	}
+                printf("step2\n");
+                CRCLDestroyGroup msg;
+                msg.GroupID = roomid;
+                msg.TeacherID = teacherid;
+
+                rclTeacherLeaveGroup(&msg,s);
+            }
+
+
+            tmu.lock();
+            rclTeacherList::iterator itt1;
+            for(itt1 = TeacherList.begin();itt1 != TeacherList.end();++itt1)
+            {
+                printf("step9\n");
+                if((*itt1)->rclTeacherID == pMSG->TeacherID)
+                {
+                    printf("step10\n");
+                    rclPopPushID((*itt1)->rclTeacherID);
+                    delete (*itt1);
+                    (*itt1) = NULL;
+                    TeacherList.erase(itt1);
+                    tmu.unlock();
+                    //					//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+
+
+                    return 0;
+                }
+            }
+            if(itt1 == TeacherList.end())
+            {
+
+                tmu.unlock();
+
+                return 1;
+            }
+        }
+    }
+    if(itt == TeacherList.end())
+    {
+
+        tmu.unlock();
+
+        return 1;
+    }
 }
 
 int CAdminServer::rclMCULogin(CRCLMCULogin *pMSG, SOCKET s,int event)
 {
-	char textbuf[TEXTBUFFERLEN];
-	sprintf(textbuf,prmcu_login,pMSG->MCUName);  
-	
-	mmu.Lock();
-	rclMCUList::iterator it_online;
 
-	for(it_online = MCUList.begin();it_online != MCUList.end();++it_online)
-	{
-		printf("%s\n",(*it_online)->rclName);
-		printf("%s\n",pMSG->MCUName);
-		if(!strcmp((*it_online)->rclName, pMSG->MCUName))
-		{			
-	        if(it_online != MCUList.end())
-	        {
-		        
-		        if(strncmp((*it_online)->rclPass,pMSG->MCUPass,16) == 0)
-		        {
-//			        gtk_text_buffer_insert(buffer,&end,perror003,-1);
-					mmu.Unlock();
-					return 1;
-		        }
-		        else
-		        {
-			      
-
-//					gtk_text_buffer_insert(buffer,&end,perror004,-1);
-			        mmu.Unlock();
-
-			        rclResponseError(5011,s,RCL_USER_AlREADY_ONLINE);
-			        return 1;
-		        }	
-	        }
-	    }
+    mmu.lock();
+    rclMCUList::iterator it_online;
+
+    for(it_online = MCUList.begin();it_online != MCUList.end();++it_online)
+    {
+        printf("%s\n",(*it_online)->rclName);
+        printf("%s\n",pMSG->MCUName);
+        if(!strcmp((*it_online)->rclName, pMSG->MCUName))
+        {
+            if(it_online != MCUList.end())
+            {
+
+                if(strncmp((*it_online)->rclPass,pMSG->MCUPass,16) == 0)
+                {
+                    //			        gtk_text_buffer_insert(buffer,&end,perror003,-1);
+                    mmu.unlock();
+                    return 1;
+                }
+                else
+                {
+
+
+                    //					gtk_text_buffer_insert(buffer,&end,perror004,-1);
+                    mmu.unlock();
+
+                    rclResponseError(5011,s,RCL_USER_AlREADY_ONLINE);
+                    return 1;
+                }
+            }
+        }
     }
-	mmu.Unlock();
-	
+    mmu.unlock();
 
-	CRCLMCU* pNode = new CRCLMCU;
-	memset(pNode->rclIP,0,16);
-	rclIPList::iterator itp;
-	imu.Lock();
-	for(itp = IPList.begin();itp != IPList.end();++itp)
-	{
-		if((*itp)->s == s)
-		{
-			memcpy(pNode->rclIP,(*itp)->IP,16);
-	        imu.Unlock();
-	
-			//06.03.31
-	        pNode->rclMCUID = rclPopPushID(0);
-	        if(pNode->rclMCUID == 0)
-	        {
-				//06.03.31
-		        rclResponseError(5011,s,RCL_MAX_USER);
-		        delete pNode;
-		        pNode = NULL;
-		        return 1;
-	        }
-	        memcpy(pNode->rclLocalIP,pMSG->MCUIP,16);
-	        pNode->rclSAPort = pMSG->CAPort;
-	        pNode->rclSVPort = pMSG->CVPort;
-	        pNode->rclTAPort = pMSG->TAPort;
-	        pNode->rclTSPort = pMSG->TSPort;
-	        pNode->rclTVPort = pMSG->TVPort;
-	        pNode->s = s;
-	        pNode->rclRoomID = 0;
-	        pNode->ThreadEvent = event;
-	        memcpy(pNode->rclPass,pMSG->MCUPass,16);
-	        memcpy(pNode->rclName,pMSG->MCUName,NAMELEN);//06.10.11
-	
-	      
-	        mmu.Lock();
-	        MCUList.push_back(pNode);
-	        mmu.Unlock();
-	
-	      
-	        CRCLMSG response;
-	        CRCLMCULoginR res;
-	        res.ResponseType = 0;
-	        res.MCUID = pNode->rclMCUID;
-	        response.msglen = sizeof(CRCLMCULoginR);
-	        response.rclType = 5011;
-
-
-			//06.03.31
-	        rclMakePacket(response.msg,(char*)&res,response.msglen);
-
-                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//			//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
-	      
-	        rclSendResponse((char*)&response,response.msglen+8,&s,1);
-	        return 0;
-		}
-	}
-	if(itp == IPList.end())
-	{
-		imu.Unlock();
-		//06.03.31
-		rclResponseError(5011,s,RCL_LOGIN_ERROR);
-		delete pNode;
-		pNode = NULL;
-		return 1;
-	}	
+
+    CRCLMCU* pNode = new CRCLMCU;
+    memset(pNode->rclIP,0,16);
+    rclIPList::iterator itp;
+    imu.lock();
+    for(itp = IPList.begin();itp != IPList.end();++itp)
+    {
+        if((*itp)->s == s)
+        {
+            memcpy(pNode->rclIP,(*itp)->IP,16);
+            imu.unlock();
+
+            //06.03.31
+            pNode->rclMCUID = rclPopPushID(0);
+            if(pNode->rclMCUID == 0)
+            {
+                //06.03.31
+                rclResponseError(5011,s,RCL_MAX_USER);
+                delete pNode;
+                pNode = NULL;
+                return 1;
+            }
+            memcpy(pNode->rclLocalIP,pMSG->MCUIP,16);
+            pNode->rclSAPort = pMSG->CAPort;
+            pNode->rclSVPort = pMSG->CVPort;
+            pNode->rclTAPort = pMSG->TAPort;
+            pNode->rclTSPort = pMSG->TSPort;
+            pNode->rclTVPort = pMSG->TVPort;
+            pNode->s = s;
+            pNode->rclRoomID = 0;
+            pNode->ThreadEvent = event;
+            memcpy(pNode->rclPass,pMSG->MCUPass,16);
+            memcpy(pNode->rclName,pMSG->MCUName,NAMELEN);//06.10.11
+
+
+            mmu.lock();
+            MCUList.push_back(pNode);
+            mmu.unlock();
+
+
+            CRCLMSG response;
+            CRCLMCULoginR res;
+            res.ResponseType = 0;
+            res.MCUID = pNode->rclMCUID;
+            response.msglen = sizeof(CRCLMCULoginR);
+            response.rclType = 5011;
+
+
+            //06.03.31
+            rclMakePacket(response.msg,(char*)&res,response.msglen);
+
+            //			//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+
+            rclSendResponse((char*)&response,response.msglen+8,&s,1);
+            return 0;
+        }
+    }
+    if(itp == IPList.end())
+    {
+        imu.unlock();
+        //06.03.31
+        rclResponseError(5011,s,RCL_LOGIN_ERROR);
+        delete pNode;
+        pNode = NULL;
+        return 1;
+    }
 }
 
 
 int CAdminServer::rclMCULogout(CRCLMCULogout *pMSG, SOCKET s)
 {
-	char textbuf[TEXTBUFFERLEN];
 
-	
-	rclMCUList::iterator itm;
-	mmu.Lock();
 
-	for(itm = MCUList.begin();itm != MCUList.end();++itm)
-	{
-		if((*itm)->rclMCUID == pMSG->MCUID)
-		{
-			sprintf(textbuf,prmcu_logout,(*itm)->rclName); 
-			
-			DWORD mcuid = (*itm)->rclMCUID;
-			DWORD roomid = (*itm)->rclRoomID;
-			mmu.Unlock();
-	
-	
-		
-			if(roomid)
-			{
-				
-				CRCLMCULeaveGroup msg;
-				msg.GroupID = roomid;
-				msg.MCUID = mcuid;
-				
-				rclMCULeaveGroup(&msg,s);
-			}
-	
-			
-			mmu.Lock();
-			rclMCUList::iterator itm1;
-
-			for(itm1 = MCUList.begin();itm1 != MCUList.end();++itm1)
-			{
-				if((*itm1)->rclMCUID == pMSG->MCUID)
-				{
-
-					//06.03.31
-			        rclPopPushID((*itm1)->rclMCUID);
-			        delete (*itm1);
-			        (*itm1) = NULL;
-			        MCUList.erase(itm1);
-			        mmu.Unlock();
-
-                                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//					//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
-
-			       
-			        return 0;
-				}
-			}
-			if(itm1 == MCUList.end())	
-			{
-				
-				mmu.Unlock();
-			
-				return 1;
-			}			
-		}
-	}
-	if(itm == MCUList.end())	
-	{
-		
-		mmu.Unlock();
-		
-		return 1;
-	}
-}
+    rclMCUList::iterator itm;
+    mmu.lock();
 
-int CAdminServer::rclClientLogin(CRCLClientLogin *pMSG, SOCKET s, int event)
-{
-	char textbuf[TEXTBUFFERLEN];
-	sprintf(textbuf,pstu_login,pMSG->ClientName);  
+    for(itm = MCUList.begin();itm != MCUList.end();++itm)
+    {
+        if((*itm)->rclMCUID == pMSG->MCUID)
+        {
 
-	if ((UserList.size()+1)<=rclStudentMax)
-	{
-	    
-	    umu.Lock();
-	    rclUserList::iterator it_online;
+            DWORD mcuid = (*itm)->rclMCUID;
+            DWORD roomid = (*itm)->rclRoomID;
+            mmu.unlock();
 
-	    for(it_online = UserList.begin();it_online != UserList.end();++it_online)
-		{
-			if(!strcmp((*it_online)->rclName, pMSG->ClientName))
-			{
-	            if(it_online != UserList.end())
-	            {
-		            
-		            if(strncmp((*it_online)->rclPass,pMSG->ClientPass,16) == 0)
-		            {
-			    
-			           
-			          
-//						gtk_text_buffer_insert(buffer,&end,perror005,-1);
-						umu.Unlock();
-						rclResponseError(5021,s,RCL_USER_AlREADY_ONLINE);
-						return 1;
-		            }
-		            else
-		            {
-			           
-						
-//						gtk_text_buffer_insert(buffer,&end,perror006,-1);
-			            umu.Unlock();
-						//06.04.03
-			            rclResponseError(5021,s,RCL_USER_AlREADY_ONLINE);
-			            return 1;
-		            }
-	            }
-			}
-		}
-	    umu.Unlock();
-	
 
-	    CRCLClient *pNode = new CRCLClient;
-	   
-	    pNode->rclClientID = rclPopPushID(0);
-	    if(pNode->rclClientID == 0)
-	    {
-			//06.04.03
-		    rclResponseError(5021,s,RCL_MAX_USER);
-		    delete pNode;
-		    pNode = NULL;
-		    return 1;
-	    }
-	    memset(pNode->rclIP,0,16);
-	    rclIPList::iterator itp;
-	    imu.Lock();
-	    for(itp = IPList.begin();itp != IPList.end();++itp)
-		{
-			if((*itp)->s == s)
-			{
-				
-                memcpy(pNode->rclIP,(*itp)->IP,16);
-	            imu.Unlock();
-	
-	            
-	            memcpy(pNode->rclLocalIP,pMSG->ClientIP,16);//"192.168.182.27",16);//pMSG->ClientIP,16);
-	            if (strcmp(pNode->rclIP,pNode->rclLocalIP) == 0) 
-	                pNode->rclClientType = 0; 
-	            else
-	                pNode->rclClientType = 1; 
-	  
-	         
-	            memcpy(pNode->rclName,pMSG->ClientName,NAMELEN);//06.10.11
-	            memcpy(pNode->rclPass,pMSG->ClientPass,16);
-	            pNode->rclRoomID = 0;
-	            pNode->rclMCUID = 0;
-	            pNode->rclSAPort = 0;
-	            pNode->rclSVPort = 0;
-	            pNode->rclTAPort = 0;
-	            pNode->rclTVPort = 0;
-	            pNode->rclTSPort = 0;
-				
-	       
-	            pNode->rclSeMCU_SAPort = pMSG->SeMCU_SAPort;
-	            pNode->rclSeMCU_SVPort = pMSG->SeMCU_SVPort;
-	            pNode->rclSeMCU_TAPort = pMSG->SeMCU_TAPort;
-	            pNode->rclSeMCU_TSPort = pMSG->SeMCU_TSPort;
-	            pNode->rclSeMCU_TVPort = pMSG->SeMCU_TVPort;
-
-	            pNode->rclIfSeMCU = 0;
-
-	            pNode->s = s;
-	         
-	            pNode->ThreadEvent = event;
-	
-	         
-	       
-	            umu.Lock();
-	            UserList.push_back(pNode);
-	            umu.Unlock();
-	
-            
-	            CRCLMSG response;
-	            CRCLClientLoginR res;
-	            res.ClientID = pNode->rclClientID;
-	            res.ClientType = pNode->rclClientType;
-	            res.ResponseType = 0;
-	
-	            
-	          
-	            response.rclType = 5021;
-	           
-	            response.msglen = sizeof(CRCLClientLoginR);
-				//06.04.03
-	            rclMakePacket(response.msg,(char*)&res,response.msglen);
 
-                                //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-                                //							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+            if(roomid)
+            {
 
-	            
-	            return rclSendResponse((char*)&response,response.msglen+8,&s,1);
-			}
-		}
-		if(itp == IPList.end())
-	    {
-		    imu.Unlock();
-			//06.04.03
-		    rclResponseError(5021,s,RCL_LOGIN_ERROR);
-		    delete pNode;
-		    pNode = NULL;
-	 	    return 1;
-	    }	  
-	}
-	else
-	{
-		//06.04.03
-        rclResponseError(5021,s,RCL_MAX_STUDENT);
-	    return 1;
-	}	
-}
+                CRCLMCULeaveGroup msg;
+                msg.GroupID = roomid;
+                msg.MCUID = mcuid;
 
-int CAdminServer::rclClientLogout(CRCLClientLogout *pMSG, SOCKET s)
-{
-	char textbuf[TEXTBUFFERLEN];
-	
-	
-	rclUserList::iterator it;
-	umu.Lock();
-	for(it = UserList.begin();it != UserList.end();++it)
-	{
-		if((*it)->rclClientID == pMSG->ClientID)
-		{
-			sprintf(textbuf,pstu_logout,(*it)->rclName);  
-			
-	        DWORD roomid = (*it)->rclRoomID;
-	        DWORD userid = (*it)->rclClientID;
-	
-	        umu.Unlock();	
-	
-	        if(roomid)
-	        {
-		      
-		        CRCLClientLeaveGroup msg;
-		        msg.ClientID = userid;
-		        msg.GroupID = roomid;
-		        
-		        rclClientLeaveGroup(&msg,s);
-	        }
-	
-	        umu.Lock();
-			rclUserList::iterator it1;
-	       
-
-	        for(it1 = UserList.begin();it1 != UserList.end();++it1)
-			{
-				if((*it1)->rclClientID == pMSG->ClientID)
-				{
-
-					//06.04.03
-	                rclPopPushID((*it1)->rclClientID);
-	                delete (*it1);
-	                (*it1) = NULL;
-	                UserList.erase(it1);
-	                umu.Unlock();
-
-                                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//					//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
-
-	                return 0;
-				}
-			}
-			if(it1 == UserList.end())
-	        {
-		       
-		        
-		        umu.Unlock();
-		        return 1;
-	        }
-		}
-	}	
-	if(it == UserList.end())
-	{
-		
-		
-		umu.Unlock();
-		return 1;
-	}	
-}
+                rclMCULeaveGroup(&msg,s);
+            }
 
-int CAdminServer::rclTeacherCreateGroup(CRCLCreateGroup *pMSG, SOCKET s)
-{
 
-	char textbuf[TEXTBUFFERLEN];
-	
-	rclTeacherList::iterator itt;
-	tmu.Lock();
+            mmu.lock();
+            rclMCUList::iterator itm1;
 
-	for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
-	{
-		if((*itt)->rclTeacherID == pMSG->TeacherID)
-		{
-
-			sprintf(textbuf,ptcher_crclass,(*itt)->rclName,pMSG->GroupName);  
-	        tmu.Unlock();
-
-	      
-	        DWORD GroupID = rclPopPushID(0);
-	        if(GroupID == 0)
-	        {
-
-				printf("no id\n");
-		        rclResponseError(10001,s,RCL_MAX_GROUP);
-		        return 1;
-	        }
-
-	        
-	        rclMCUList::iterator itm;
-	        DWORD MCUID = 0;
-	        mmu.Lock();
-	        for(itm=MCUList.begin();itm!=MCUList.end();++itm)
-	        {
-		        if(!(*itm)->rclRoomID)
-		        {
-			    
-			        MCUID = (*itm)->rclMCUID;
-
-			        (*itm)->rclRoomID = GroupID;
-			        break;
-		        }
-	        }
-	        mmu.Unlock();
-
-	        
-	        if(!MCUID)
-	        {
-
-				printf("no mcu\n");
-		        rclResponseError(10001,s,RCL_TEACHER_CREATE_GROUP_NOMCU);
-		        return 1;
-	        }
-
-	        
-	        CRCLRoom *pNode = new CRCLRoom;
-	        pNode->rclMCUID = MCUID;
-	        memcpy(pNode->rclName,pMSG->GroupName,128);
-	        pNode->rclRoomID = GroupID;
-	        pNode->rclTeacherID = pMSG->TeacherID;
-	        pNode->rclFocusUserID = 0;
+            for(itm1 = MCUList.begin();itm1 != MCUList.end();++itm1)
+            {
+                if((*itm1)->rclMCUID == pMSG->MCUID)
+                {
 
-	        pNode->rclRoomMode = 1; 
-	
-	        pNode->cs.Init();
-	        pNode->ms.Init();
+                    //06.03.31
+                    rclPopPushID((*itm1)->rclMCUID);
+                    delete (*itm1);
+                    (*itm1) = NULL;
+                    MCUList.erase(itm1);
+                    mmu.unlock();
 
-	        rmu.Lock();
-	        RoomList.push_back(pNode);
-	        rmu.Unlock();
+                    //					//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
 
-    
-	        (*itt)->rclRoomID = GroupID;
-	        (*itt)->rclSAPort = pMSG->CAPort;
-	        (*itt)->rclSVPort = pMSG->CVPort;
 
-      
-	    
-	        CRCLMSG response;
-	        CRCLCreateGroupR res;
-	
-	       
-	        res.ResponseType = 0;
-	        res.TAPort = (*itm)->rclTAPort;
-	        res.TSPort = (*itm)->rclTSPort;
-	        res.TVPort = (*itm)->rclTVPort;
-	        res.GroupID = GroupID;
-	     
-	        memcpy(res.MCUIP,(*itm)->rclLocalIP,16);
+                    return 0;
+                }
+            }
+            if(itm1 == MCUList.end())
+            {
 
-		
-	        response.rclType = 10001;
-	     
-	        response.msglen = sizeof(CRCLCreateGroupR);
-			//06.04.03
-	        rclMakePacket(response.msg,(char*)&res,response.msglen);
-	        
-
-	        rclSendResponse((char*)&response,response.msglen+8,&s,1);
-
-	       
-	        CRCLCreateGroupRMCU resm;
-	        resm.CAPort = (*itt)->rclSAPort;
-	        resm.CVPort = (*itt)->rclSVPort;
-	        resm.GroupID = (*itt)->rclRoomID;
-	        resm.TeacherID = (*itt)->rclTeacherID;
-	        memcpy(resm.GroupName,pMSG->GroupName,128);
-	        memcpy(resm.TeacherIP,(*itt)->rclIP,16);
-	        response.rclType = 10002;
-	        response.msglen = sizeof(CRCLCreateGroupRMCU);
-			//06.04.03
-	        rclMakePacket(response.msg,(char*)&resm,response.msglen);
-
-	        rclSendResponse((char*)&response,response.msglen+8,&(*itm)->s,1);
-                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//			//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
-			return 0;
-		}
-	}
-	if(itt == TeacherList.end())
-	{
-		tmu.Unlock();
-		//06.04.03
-		rclResponseError(10001,s,RCL_TEACHER_CREATE_GROUP_FAIL);
-		return 1;
-	}	
+                mmu.unlock();
+
+                return 1;
+            }
+        }
+    }
+    if(itm == MCUList.end())
+    {
+
+        mmu.unlock();
+
+        return 1;
+    }
 }
 
-int CAdminServer::rclTeacherLeaveGroup(CRCLDestroyGroup *pMSG, SOCKET s)
+int CAdminServer::rclClientLogin(CRCLClientLogin *pMSG, SOCKET s, int event)
 {
-	char textbuf[TEXTBUFFERLEN];
-	printf("step3\n");
-	
-	rclRoomList::iterator itr;
-	rmu.Lock();
 
-	for(itr = RoomList.begin();itr != RoomList.end();++itr)
-	{
-		if((*itr)->rclRoomID == pMSG->GroupID)
-		{
-			printf("step4\n");
-		
-	        SOCKET sk[2000];
-	        DWORD skn = 1;
-	        std::list<DWORD>::iterator itd;
-	      
-	        (*itr)->cs.Lock();
-			printf("enter cs lock\n");
-	        for(itd = (*itr)->rclUserRoom.begin();itd != (*itr)->rclUserRoom.end();++itd)
-	        {
-				printf("step5\n");
-		        rclUserList::iterator itu;
-		       
-				umu.Lock();
-
-		        for(itu = UserList.begin();itu != UserList.end();++itu)
-				{
-					if((*itu)->rclClientID == *itd)
-					{
-						
-		                (*itu)->rclRoomID = 0;
-		                
-		                if((*itu)->rclIfSeMCU == 1)
-		                {
-							printf("nothing\n");							
-			              
-
-		                }
-
-		                sk[skn] = (*itu)->s;
-		                skn++;
-						break;
-						
-					}
-				}
-				if(itu == UserList.end())
-		        {
-					printf("no user\n");
-					umu.Unlock();
-			        (*itr)->cs.Unlock();
-			        rmu.Unlock();
-
-			        rclResponseError(10011,s,RCL_TEACHER_LEAVE_GROUP_FAIL);
-			        return 1;
-		        }
-				umu.Unlock();
-			}
-		
-	        (*itr)->rclUserRoom.clear();
-	        (*itr)->cs.Unlock();
+    if ((UserList.size()+1)<=rclStudentMax)
+    {
 
-	       
-	        (*itr)->ms.Lock();
-	        for(itd = (*itr)->rclSeMCURoom.begin();itd != (*itr)->rclSeMCURoom.end();++itd)
-	        {
-				printf("step6\n");
-		        rclSeMCUList::iterator its;
-		        smu.Lock();
-		        
-
-		        for(its = SeMCUList.begin();its != SeMCUList.end();++its)
-		        {
-					printf("step12\n");
-			        if((*its)->rclMCUID == *itd)
-			        {
-				    
-		                (*its)->rclRoomID = 0;
-		                sk[skn] = (*its)->s;
-		
-		                SeMCUList.erase(its);
-		                delete (*its);
-		                (*its) = NULL;
-		
-		                skn++;
-						break;
+        umu.lock();
+        rclUserList::iterator it_online;
 
-			        }
-		        }
-				
-		        if(its == SeMCUList.end())
-		        {
-					printf("no seMCU\n");
-			        smu.Unlock();
-			        (*itr)->ms.Unlock();
-			        rmu.Unlock();
-
-			        rclResponseError(10011,s,10001);
-			        return 1;
-		        }	
-				smu.Unlock();				
-	        }
-
-	        
-			printf("step11\n");
-	        (*itr)->rclSeMCURoom.clear();
-	        (*itr)->ms.Unlock();
-
-	       
-	        rclTeacherList::iterator itt;
-	        tmu.Lock();
-
-	        for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
-	        {
-		        if((*itt)->rclTeacherID == pMSG->TeacherID)
-		        {
-					sprintf(textbuf,ptcher_canlclass,(*itt)->rclName);  
-					printf("step7\n");
-			        (*itt)->rclRoomID = 0;
-
-	                tmu.Unlock();
-					
-	        		rclMCUList::iterator itm;
-	        		mmu.Lock();
-
-	        		for(itm = MCUList.begin();itm != MCUList.end();++itm)
-	        		{
-						printf("step8\n");
-		        		if((*itm)->rclMCUID == (*itr)->rclMCUID)
-		        		{
-			        		(*itm)->rclRoomID = 0;
-	                		
-	                		sk[0] = (*itm)->s;
-	                		mmu.Unlock();
-
-	                		
-
-
-	                		rclPopPushID((*itr)->rclRoomID);
-
-	                		delete (*itr);
-	                		(*itr) = NULL;
-	                		RoomList.erase(itr);
-	                		rmu.Unlock();
-			        		
-	                		
-	                		CRCLMSG response;
-	                		CRCLDestroyGroupR res;
-	
-	                		res.ResponseType = 0;
-	                		response.rclType = 10011;
-	                		response.msglen = sizeof(CRCLDestroyGroupR);
+        for(it_online = UserList.begin();it_online != UserList.end();++it_online)
+        {
+            if(!strcmp((*it_online)->rclName, pMSG->ClientName))
+            {
+                if(it_online != UserList.end())
+                {
+
+                    if(strncmp((*it_online)->rclPass,pMSG->ClientPass,16) == 0)
+                    {
 
-	                		rclMakePacket(response.msg,(char*)&res,response.msglen);
 
-	                		rclSendResponse((char*)&response,response.msglen+8,&s,1);
-	
-	                		
-	                		CRCLDestroyGroupRClient resM;
-	                		resM.GroupID = pMSG->GroupID;
-	                		response.rclType = 10012;
-	                		response.msglen = sizeof(CRCLDestroyGroupRClient);
-
-	                		rclMakePacket(response.msg,(char*)&resM,response.msglen);
-
-	                		rclSendResponse((char*)&response,response.msglen+8,sk,skn);
-                                                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//							//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
 
+                        //						gtk_text_buffer_insert(buffer,&end,perror005,-1);
+                        umu.unlock();
+                        rclResponseError(5021,s,RCL_USER_AlREADY_ONLINE);
+                        return 1;
+                    }
+                    else
+                    {
+
+
+                        //						gtk_text_buffer_insert(buffer,&end,perror006,-1);
+                        umu.unlock();
+                        //06.04.03
+                        rclResponseError(5021,s,RCL_USER_AlREADY_ONLINE);
+                        return 1;
+                    }
+                }
+            }
+        }
+        umu.unlock();
+	
+
+        CRCLClient *pNode = new CRCLClient;
+
+        pNode->rclClientID = rclPopPushID(0);
+        if(pNode->rclClientID == 0)
+        {
+            //06.04.03
+            rclResponseError(5021,s,RCL_MAX_USER);
+            delete pNode;
+            pNode = NULL;
+            return 1;
+        }
+        memset(pNode->rclIP,0,16);
+        rclIPList::iterator itp;
+        imu.lock();
+        for(itp = IPList.begin();itp != IPList.end();++itp)
+        {
+            if((*itp)->s == s)
+            {
 
+                memcpy(pNode->rclIP,(*itp)->IP,16);
+                imu.unlock();
 
 
+                memcpy(pNode->rclLocalIP,pMSG->ClientIP,16);//"192.168.182.27",16);//pMSG->ClientIP,16);
+                if (strcmp(pNode->rclIP,pNode->rclLocalIP) == 0)
+                    pNode->rclClientType = 0;
+                else
+                    pNode->rclClientType = 1;
 
-	                		return 0;
-		        		}
-	        		}
-	        		if(itm == MCUList.end())
-	        		{
-		       			mmu.Unlock();
-		        		rmu.Unlock();
-		        		//06.04.03
-		        		rclResponseError(10011,s,RCL_TEACHER_LEAVE_GROUP_FAIL);
-		        		return 1;
-	        		}		
-		        }
-	        }
-	        if(itt == TeacherList.end())
-	        {
-				printf("can't find teacher\n");
-		        tmu.Unlock();
-		        rmu.Unlock();
-		        //06.04.03
-		        rclResponseError(10011,s,RCL_TEACHER_LEAVE_GROUP_FAIL);
-		        return 1;
-	        }	        		
-		}
-		if(itr == RoomList.end())
-	    {
-		    rmu.Unlock();
-		    rclResponseError(10011,s,RCL_TEACHER_LEAVE_GROUP_FAIL);
-		    return 1;
-	    }		
-	}
-    rmu.Unlock();
-    return 1;	
-}
 
-int CAdminServer::rclClientJoinGroup(CRCLClientJoinInGroup *pMSG, SOCKET s)
-{//1
-	char textbuf[TEXTBUFFERLEN];
-	
-	rmu.Lock();
-	rclRoomList::iterator itr;
+                memcpy(pNode->rclName,pMSG->ClientName,NAMELEN);//06.10.11
+                memcpy(pNode->rclPass,pMSG->ClientPass,16);
+                pNode->rclRoomID = 0;
+                pNode->rclMCUID = 0;
+                pNode->rclSAPort = 0;
+                pNode->rclSVPort = 0;
+                pNode->rclTAPort = 0;
+                pNode->rclTVPort = 0;
+                pNode->rclTSPort = 0;
 
-	for(itr = RoomList.begin();itr != RoomList.end();++itr)
-	{//2
-		if((*itr)->rclRoomID == pMSG->GroupID)
-		{//3
-			printf("find room\n");
-			DWORD RoomMode;
-	        RoomMode = (*itr)->rclRoomMode;
-	
-	        rmu.Unlock();
-	
-	       
-	        rclUserList::iterator itb;
-	        umu.Lock();
-
-	        for(itb = UserList.begin();itb != UserList.end();++itb)
-			{//4
-				if((*itb)->rclClientID == pMSG->ClientID)
-				{//5
-					sprintf(textbuf,pstu_join,(*itb)->rclName,(*itr)->rclName);
-					if((*itb)->rclRoomID)
-	                {//6
-		              
-						printf("have joined\n");
-		                umu.Unlock();
-
-		                rclResponseError(10021,s,RCL_STUDENT_JOIN_GROUP_FAIL);
-		                return 1;
-	                }//6
 
-	               
-	
-	                (*itb)->rclTVPort = pMSG->TVPort;
-	                (*itb)->rclTAPort = pMSG->TAPort;
-	                (*itb)->rclTSPort = pMSG->TSPort;
-	                (*itb)->rclSVPort = pMSG->CVPort;
-	                (*itb)->rclSAPort = pMSG->CAPort;
-
-	                (*itb)->rclRoomID = pMSG->GroupID;
-	                umu.Unlock();
-
-	               
-	                CRCLClientJoinInGroupR res;
-	                DWORD ClientNum = 0;
-	                DWORD SocketNum = 0;
-	                SOCKET skk[300];
-	              
-	                rclTeacherList::iterator itt;
-	                tmu.Lock();
-
-	                for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
-					{//7
-						if((*itt)->rclTeacherID == (*itr)->rclTeacherID)
-						{//8
-							printf("find teacher s\n");
-							skk[SocketNum] = (*itt)->s;
-	                        SocketNum++;
-	                        tmu.Unlock();
-
-	                       
-	                        std::list<DWORD>::iterator itc;
-	                        (*itr)->cs.Lock();
-	                        for(itc=(*itr)->rclUserRoom.begin();itc!=(*itr)->rclUserRoom.end();++itc)
-	                        {//9
-		                      
-		                        rclUserList::iterator itu;
-		                        umu.Lock();
-
-		                        for(itu = UserList.begin();itu != UserList.end();++itu)
-								{//10
-									printf("%d\n",*itc);
-									if((*itu)->rclClientID == *itc)
-									{//11
-										printf("get client s\n");
-										
-		                                skk[SocketNum] = (*itu)->s;
-		                                SocketNum++;
-		                                ClientNum++;
-	
-		                                umu.Unlock();
-	                                }//11
-								}//10
-							
-							}//9
-
-	                     
-							printf("join group\n");
-	                        (*itr)->rclUserRoom.push_back(pMSG->ClientID);
+                pNode->rclSeMCU_SAPort = pMSG->SeMCU_SAPort;
+                pNode->rclSeMCU_SVPort = pMSG->SeMCU_SVPort;
+                pNode->rclSeMCU_TAPort = pMSG->SeMCU_TAPort;
+                pNode->rclSeMCU_TSPort = pMSG->SeMCU_TSPort;
+                pNode->rclSeMCU_TVPort = pMSG->SeMCU_TVPort;
 
-	                        (*itr)->cs.Unlock();
-	
-	                        
-	                        char rclClient_IP[16];
-	                        char rclClient_LocalIP[16];
-	                        char ClientPass[16];
-	                        DWORD ClientType;
-	                        SOCKET Client_s;
-	                        int Client_ThreadEvent;
-	                        CClientInfo ClientInfo;
-	                        DWORD SeMCU_TAPort;
-	                        DWORD SeMCU_TVPort;
-	                        DWORD SeMCU_TSPort;
-	                        DWORD SeMCU_SAPort;
-	                        DWORD SeMCU_SVPort;
-
-	                        rclUserList::iterator itu;
-	                        umu.Lock();
-	                        
-	                        for(itu = UserList.begin();itu != UserList.end();++itu)
-							{//12
-								if((*itu)->rclClientID == pMSG->ClientID)
-								{//13
-									
-									printf("get ip\n");
-                                    memcpy(rclClient_IP,(*itu)->rclIP,16);
-	                                memcpy(rclClient_LocalIP,(*itu)->rclLocalIP,16);
-	                                
-	                                ClientType = (*itu)->rclClientType;
-	                                memcpy(ClientPass,(*itu)->rclPass,16);
-	                                Client_s = (*itu)->s;
-	                                Client_ThreadEvent = (*itu)->ThreadEvent;
-	                                SeMCU_TVPort = (*itu)->rclSeMCU_TVPort;
-	                                SeMCU_TAPort = (*itu)->rclSeMCU_TAPort;
-	                                SeMCU_TSPort = (*itu)->rclSeMCU_TSPort;
-	                                SeMCU_SVPort = (*itu)->rclSeMCU_SVPort;
-	                                SeMCU_SAPort = (*itu)->rclSeMCU_SAPort;
-
-	                                ClientInfo.ClientID = pMSG->ClientID;
-	                                memcpy(ClientInfo.ClienName,(*itu)->rclName,NAMELEN);//06.10.11
-	                                ClientInfo.IsFocus = 1; 
-	                                umu.Unlock();
-	
-	                              
-	                                rclMCUList::iterator itm;
-	                                mmu.Lock();
-
-	                                for(itm = MCUList.begin();itm != MCUList.end();++itm)
-									{//14
-										if((*itm)->rclMCUID == (*itr)->rclMCUID)
-										{//15
-										
-	                                       
-											printf("send to client\n");
-	                                        CRCLMSG response;
-	                                        res.ResponseType = 0;
-	                                        res.GroupID = pMSG->GroupID;
-	
-	                                        res.TVPort = (*itm)->rclTVPort;
-	                                        res.TAPort = (*itm)->rclTAPort;
-	                                        res.TSPort = (*itm)->rclTSPort;
-	                                        res.CVPort = (*itm)->rclSVPort;
-	                                        res.CAPort = (*itm)->rclSAPort;
-	                                    
-	                                        res.RoomMode = RoomMode;
-	                                        memcpy(res.MCUIP,(*itm)->rclLocalIP,16);
-	                                        mmu.Unlock();
-	
-	                                        DWORD IfSeMCU;
-	                                        if (ClientType == 0)
-	                                        {//16
-	                                            memcpy(res.SeMCUIP,"",16); 
-	                                            IfSeMCU = 0;
-	                                        }//16
-	                                        else  
-	                                        {//17
-
-												printf("nei wang\n");
-	                                            rclSeMCUList::iterator itsem;
-	                                            smu.Lock();
-	                                            for (itsem = SeMCUList.begin();itsem != SeMCUList.end();++itsem)
-	                                            {//18
-		                                            //*********//
-													printf("search semcu\n");
-		                                            char rcltest_rclIP[16];
-		                                            memcpy(rcltest_rclIP,(*itsem)->rclIP,16);
-		                                            DWORD rcltest_rclIP_rclRoomID;
-		                                            rcltest_rclIP_rclRoomID = (*itsem)->rclRoomID;
-		                                            SOCKET rclSeMCU_s;
-		
-		                                            rclSeMCU_s = (*itsem)->s;
-		                                            if (strcmp((*itsem)->rclIP,rclClient_IP) == 0 && (*itsem)->rclRoomID == pMSG->GroupID)  //该内网同一组中已经存在一个辅MCU
-		                                            { //19  
-		                                                IfSeMCU = 0; 
-		                                                memcpy(res.SeMCUIP,(*itsem)->rclLocalIP,16); 
-		                                                //********//
-		                                                CRCLClientJoinInGroupRSeMCU resSeM;
-		                                                resSeM.ClientID = pMSG->ClientID;
-		                                                memcpy(resSeM.ClientIP,rclClient_LocalIP,16);
-		                                                resSeM.TVPort = pMSG->TVPort;
-		                                                resSeM.TAPort = pMSG->TAPort;
-		                                                resSeM.TSPort = pMSG->TSPort;
-		                                                resSeM.CVPort = pMSG->CVPort;
-		                                                resSeM.CAPort = pMSG->CAPort;
-		    
-		                                                response.rclType = 10024;
-		                                                response.msglen = sizeof(CRCLClientJoinInGroupRSeMCU);
-		                                                rclMakePacket(response.msg,(char*)&resSeM,response.msglen);
-		                                                rclSendResponse((char*)&response,response.msglen+8,&rclSeMCU_s,1);
-
-		                                                break;
-		                                            }//19
-	                                             }//18
-	                                             smu.Unlock();
-
-	                                             if(itsem == SeMCUList.end())
-	                                             {//20
-		                                             IfSeMCU =1; 
-		                                             memcpy(res.SeMCUIP,rclClient_IP,16);
-													 printf("no semcu for this user");
-													 return 1;
-		                                             
-		
+                pNode->rclIfSeMCU = 0;
 
+                pNode->s = s;
 
-	                                             }//20
+                pNode->ThreadEvent = event;
 
 
-	                                        }//17
-	
-	                                        										
-	                                        umu.Lock();
-											rclUserList::iterator itu1;
-
-	                                        for(itu1 = UserList.begin();itu1 != UserList.end();++itu1)
-											{//21
-												if((*itu1)->rclClientID == pMSG->ClientID)
-												{//22
-													printf("send to other\n");
-													(*itu1)->rclIfSeMCU = IfSeMCU;
-	                                                umu.Unlock();
-	
 
+                umu.lock();
+                UserList.push_back(pNode);
+                umu.unlock();
 
-	                                                response.rclType = 10021;
-	                                                response.msglen = sizeof(CRCLClientJoinInGroupR);
-	                                                rclMakePacket(response.msg,(char*)&res,response.msglen);
-	                                                rclSendResponse((char*)&response,response.msglen+8,&s,1);
-                                                                                                        //			gtk_text_buffer_insert(buffer,&end,textbuf,-1);
-//													//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
-	
-	                                               
-	                                          
-	                                                CRCLClientJoinInGroupRAll resA;
-	                                                resA.ClientInfo = ClientInfo;
-	                                                response.rclType = 10022;
-	                                                response.msglen = sizeof(CRCLClientJoinInGroupRAll);
-	                                                rclMakePacket(response.msg,(char*)&resA,response.msglen);
 
-	                                                rclSendResponse((char*)&response,response.msglen+8,skk,SocketNum);
-	
-	                                               
-	                                                CRCLClientJoinInGroupRMCU resM;
+                CRCLMSG response;
+                CRCLClientLoginR res;
+                res.ClientID = pNode->rclClientID;
+                res.ClientType = pNode->rclClientType;
+                res.ResponseType = 0;
 
-	                                              
 
-	                                             
 
-                                                    DWORD ID_MCU; //
-	                                                char ip_Client[16]; //
-	                                                SOCKET s_MCU;
-	                                                if (IfSeMCU == 0)
-	                                                {//23
-														printf("choose mcu\n");
-	                                                   
-	                                                    memset(ip_Client,0,16);
-	                                                    if(rclChooseMCU(pMSG->ClientID,pMSG->GroupID,&s_MCU,ip_Client,&ID_MCU))
-	                                                    {//24
-		                                                    
-															printf("choose mcu error\n");
-		                                                    return 1;
-	                                                    }//24
-	                                                    
-	                                                    resM.TVPort = pMSG->TVPort;
-	                                                    resM.TAPort = pMSG->TAPort;
-	                                                    resM.TSPort = pMSG->TSPort;
-	                                                    resM.CVPort = pMSG->CVPort;
-	                                                    resM.CAPort = pMSG->CAPort;	   
-	                                                }//23
-	                                                else
-	                                                {//25
-														printf("main mcu\n");
-	                                                    ID_MCU = pMSG->ClientID;
-	                                                    memcpy(ip_Client,rclClient_IP,16);
-	                                                    mmu.Lock();
-	                                                    s_MCU = (*itm)->s;
-	                                                    mmu.Unlock();
-	                                                    
-	  
-	                                                    resM.TVPort = SeMCU_TVPort;
-	                                                    resM.TAPort = SeMCU_TAPort;
-	                                                    resM.TSPort = SeMCU_TSPort;
-	                                                    resM.CVPort = SeMCU_SVPort;
-	                                                    resM.CAPort = SeMCU_SAPort;	  
-	                                                }//25
-
-	                                              
-	                                                umu.Lock();
-													rclUserList::iterator itu2;
-
-	                                                for(itu2 = UserList.begin();itu2 != UserList.end();++itu2)
-													{//26
-														if((*itu2)->rclClientID == pMSG->ClientID)
-														{//27
-															printf("change mcu id\n");
-															(*itu2)->rclMCUID = ID_MCU;
-	                                                        umu.Unlock();
-
-	                                                        
-	                                                        
-	                                                        resM.ClientInfo = ClientInfo;
+                response.rclType = 5021;
 
-	                                                        memcpy(resM.ClientIP,ip_Client,16);
+                response.msglen = sizeof(CRCLClientLoginR);
+                //06.04.03
+                rclMakePacket(response.msg,(char*)&res,response.msglen);
 
-	                                                        resM.ClientType = ClientType;
-	
-	                                                        response.rclType = 10023;
-	
-	                                                        response.msglen = sizeof(CRCLClientJoinInGroupRMCU);
-	                                                        rclMakePacket(response.msg,(char*)&resM,response.msglen);
-															
-	                                                        rclSendResponse((char*)&response,response.msglen+8,&s_MCU,1);
-															
-															
-	                                                        return 0;
-														}//27
-													}//26
-													if(itu2 == UserList.end())
-	                                                {//28
-														printf("error 1\n");
-		                                                umu.Unlock();
-		                                                mmu.Unlock();
-		                                                return 1;
-	                                                }//28
-												}//22
-											}//21
-											if(itu1 == UserList.end())
-	                                        {
-												printf("error 2\n");
-	                                            umu.Unlock();
-	                                            return 1;
-	                                        }
-										}//15
-									}//14												
-	                                if(itm == MCUList.end())
-	                                {
-										printf("error 3\n");
-		                                mmu.Unlock();
-		                                rclResponseError(10021,s,RCL_STUDENT_JOIN_GROUP_FAIL);
-		                                return 1;
-	                                }
-								}//13
-							}//12										
-	                        if(itu == UserList.end())
-	                        {
-								printf("error 4\n");
-	                            umu.Unlock();
-	                            return 1;
-	                        }                            
-                        }//8
-                    }//7						
-	                if(itt == TeacherList.end())
-	                {
-						printf("error 6\n");
-		                tmu.Unlock();
-		                rclResponseError(10021,s,RCL_STUDENT_JOIN_GROUP_FAIL);
-		                return 1;
-	                }
-                }//5
-            }//4				
-			if(itb == UserList.end())
-	        {
-				printf("error 7\n");
-		        umu.Unlock();
-		        rclResponseError(10021,s,RCL_STUDENT_JOIN_GROUP_FAIL);
-		        return 1;
-	        }
+                //							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+
+
+                return rclSendResponse((char*)&response,response.msglen+8,&s,1);
+            }
+        }
+        if(itp == IPList.end())
+        {
+            imu.unlock();
+            //06.04.03
+            rclResponseError(5021,s,RCL_LOGIN_ERROR);
+            delete pNode;
+            pNode = NULL;
+            return 1;
+        }
+    }
+    else
+    {
+        //06.04.03
+        rclResponseError(5021,s,RCL_MAX_STUDENT);
+        return 1;
+    }
+}
+
+int CAdminServer::rclClientLogout(CRCLClientLogout *pMSG, SOCKET s)
+{
+
+
+    rclUserList::iterator it;
+    umu.lock();
+    for(it = UserList.begin();it != UserList.end();++it)
+    {
+        if((*it)->rclClientID == pMSG->ClientID)
+        {
+
+            DWORD roomid = (*it)->rclRoomID;
+            DWORD userid = (*it)->rclClientID;
+
+            umu.unlock();
+
+            if(roomid)
+            {
+
+                CRCLClientLeaveGroup msg;
+                msg.ClientID = userid;
+                msg.GroupID = roomid;
+
+                rclClientLeaveGroup(&msg,s);
+            }
+
+            umu.lock();
+            rclUserList::iterator it1;
+
+
+            for(it1 = UserList.begin();it1 != UserList.end();++it1)
+            {
+                if((*it1)->rclClientID == pMSG->ClientID)
+                {
+
+                    //06.04.03
+                    rclPopPushID((*it1)->rclClientID);
+                    delete (*it1);
+                    (*it1) = NULL;
+                    UserList.erase(it1);
+                    umu.unlock();
+
+                    //					//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+
+                    return 0;
+                }
+            }
+            if(it1 == UserList.end())
+            {
+
+
+                umu.unlock();
+                return 1;
+            }
+        }
+    }
+    if(it == UserList.end())
+    {
+
+
+        umu.unlock();
+        return 1;
+    }
+}
+
+int CAdminServer::rclTeacherCreateGroup(CRCLCreateGroup *pMSG, SOCKET s)
+{
+
+
+    rclTeacherList::iterator itt;
+    tmu.lock();
+
+    for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
+    {
+        if((*itt)->rclTeacherID == pMSG->TeacherID)
+        {
+
+            tmu.unlock();
+
+
+            DWORD GroupID = rclPopPushID(0);
+            if(GroupID == 0)
+            {
+
+                printf("no id\n");
+                rclResponseError(10001,s,RCL_MAX_GROUP);
+                return 1;
+            }
+
+
+            rclMCUList::iterator itm;
+            DWORD MCUID = 0;
+            mmu.lock();
+            for(itm=MCUList.begin();itm!=MCUList.end();++itm)
+            {
+                if(!(*itm)->rclRoomID)
+                {
+
+                    MCUID = (*itm)->rclMCUID;
+
+                    (*itm)->rclRoomID = GroupID;
+                    break;
+                }
+            }
+            mmu.unlock();
+
+
+            if(!MCUID)
+            {
+
+                printf("no mcu\n");
+                rclResponseError(10001,s,RCL_TEACHER_CREATE_GROUP_NOMCU);
+                return 1;
+            }
+
+
+            CRCLRoom *pNode = new CRCLRoom;
+            pNode->rclMCUID = MCUID;
+            memcpy(pNode->rclName,pMSG->GroupName,128);
+            pNode->rclRoomID = GroupID;
+            pNode->rclTeacherID = pMSG->TeacherID;
+            pNode->rclFocusUserID = 0;
+
+            pNode->rclRoomMode = 1;
+
+            rmu.lock();
+            RoomList.push_back(pNode);
+            rmu.unlock();
+
+
+            (*itt)->rclRoomID = GroupID;
+            (*itt)->rclSAPort = pMSG->CAPort;
+            (*itt)->rclSVPort = pMSG->CVPort;
+
+
+	    
+            CRCLMSG response;
+            CRCLCreateGroupR res;
+
+
+            res.ResponseType = 0;
+            res.TAPort = (*itm)->rclTAPort;
+            res.TSPort = (*itm)->rclTSPort;
+            res.TVPort = (*itm)->rclTVPort;
+            res.GroupID = GroupID;
+
+            memcpy(res.MCUIP,(*itm)->rclLocalIP,16);
+
+
+            response.rclType = 10001;
+
+            response.msglen = sizeof(CRCLCreateGroupR);
+            //06.04.03
+            rclMakePacket(response.msg,(char*)&res,response.msglen);
+
+
+            rclSendResponse((char*)&response,response.msglen+8,&s,1);
+
+
+            CRCLCreateGroupRMCU resm;
+            resm.CAPort = (*itt)->rclSAPort;
+            resm.CVPort = (*itt)->rclSVPort;
+            resm.GroupID = (*itt)->rclRoomID;
+            resm.TeacherID = (*itt)->rclTeacherID;
+            memcpy(resm.GroupName,pMSG->GroupName,128);
+            memcpy(resm.TeacherIP,(*itt)->rclIP,16);
+            response.rclType = 10002;
+            response.msglen = sizeof(CRCLCreateGroupRMCU);
+            //06.04.03
+            rclMakePacket(response.msg,(char*)&resm,response.msglen);
+
+            rclSendResponse((char*)&response,response.msglen+8,&(*itm)->s,1);
+            //			//							gtk_text_buffer_insert(buffer,&end,"\n",-1);
+            return 0;
+        }
+    }
+    if(itt == TeacherList.end())
+    {
+        tmu.unlock();
+        //06.04.03
+        rclResponseError(10001,s,RCL_TEACHER_CREATE_GROUP_FAIL);
+        return 1;
+    }
+}
+
+int CAdminServer::rclTeacherLeaveGroup(CRCLDestroyGroup *pMSG, SOCKET s)
+{
+    printf("step3\n");
+
+    rclRoomList::iterator itr;
+    rmu.lock();
+
+    for(itr = RoomList.begin();itr != RoomList.end();++itr)
+    {
+        if((*itr)->rclRoomID == pMSG->GroupID)
+        {
+            printf("step4\n");
+
+            SOCKET sk[2000];
+            DWORD skn = 1;
+            std::list<DWORD>::iterator itd;
+
+            (*itr)->cs.lock();
+            printf("enter cs lock\n");
+            for(itd = (*itr)->rclUserRoom.begin();itd != (*itr)->rclUserRoom.end();++itd)
+            {
+                printf("step5\n");
+                rclUserList::iterator itu;
+
+                umu.lock();
+
+                for(itu = UserList.begin();itu != UserList.end();++itu)
+                {
+                    if((*itu)->rclClientID == *itd)
+                    {
+
+                        (*itu)->rclRoomID = 0;
+
+                        if((*itu)->rclIfSeMCU == 1)
+                        {
+                            printf("nothing\n");
+
+
+                        }
+
+                        sk[skn] = (*itu)->s;
+                        skn++;
+                        break;
+
+                    }
+                }
+                if(itu == UserList.end())
+                {
+                    printf("no user\n");
+                    umu.unlock();
+                    (*itr)->cs.unlock();
+                    rmu.unlock();
+
+                    rclResponseError(10011,s,RCL_TEACHER_LEAVE_GROUP_FAIL);
+                    return 1;
+                }
+                umu.unlock();
+            }
+
+            (*itr)->rclUserRoom.clear();
+            (*itr)->cs.unlock();
+
+
+            (*itr)->ms.lock();
+            for(itd = (*itr)->rclSeMCURoom.begin();itd != (*itr)->rclSeMCURoom.end();++itd)
+            {
+                printf("step6\n");
+                rclSeMCUList::iterator its;
+                smu.lock();
+
+
+                for(its = SeMCUList.begin();its != SeMCUList.end();++its)
+                {
+                    printf("step12\n");
+                    if((*its)->rclMCUID == *itd)
+                    {
+
+                        (*its)->rclRoomID = 0;
+                        sk[skn] = (*its)->s;
+
+                        SeMCUList.erase(its);
+                        delete (*its);
+                        (*its) = NULL;
+
+                        skn++;
+                        break;
+
+                    }
+                }
+
+                if(its == SeMCUList.end())
+                {
+                    printf("no seMCU\n");
+                    smu.unlock();
+                    (*itr)->ms.unlock();
+                    rmu.unlock();
+
+                    rclResponseError(10011,s,10001);
+                    return 1;
+                }
+                smu.unlock();
+            }
+
+
+            printf("step11\n");
+            (*itr)->rclSeMCURoom.clear();
+            (*itr)->ms.unlock();
+
+
+            rclTeacherList::iterator itt;
+            tmu.lock();
+
+            for(itt = TeacherList.begin();itt != TeacherList.end();++itt)
+            {
+                if((*itt)->rclTeacherID == pMSG->TeacherID)
+                {
+                    printf("step7\n");
+                    (*itt)->rclRoomID = 0;
+
+                    tmu.unlock();
+
+                    rclMCUList::iterator itm;
+                    mmu.lock();
+
+                    for(itm = MCUList.begin();itm != MCUList.end();++itm)
+                    {
+                        printf("step8\n");
+                        if((*itm)->rclMCUID == (*itr)->rclMCUID)
+                        {
+                            (*itm)->rclRoomID = 0;
+
+                            sk[0] = (*itm)->s;
+                            mmu.unlock();
+
+
+
+
+                            rclPopPushID((*itr)->rclRoomID);
+
+                            delete (*itr);
+                            (*itr) = NULL;
+                            RoomList.erase(itr);
+                            rmu.unlock();
+
+
+                            CRCLMSG response;
+                            CRCLDestroyGroupR res;
+
+                            res.ResponseType = 0;
+                            response.rclType = 10011;
+                            response.msglen = sizeof(CRCLDestroyGroupR);
+
+                            rclMakePacket(response.msg,(char*)&res,response.msglen);
+
+                            rclSendResponse((char*)&response,response.msglen+8,&s,1);
+
+
+                            CRCLDestroyGroupRClient resM;
+                            resM.GroupID = pMSG->GroupID;
+                            response.rclType = 10012;
+                            response.msglen = sizeof(CRCLDestroyGroupRClient);
+

[... 6951 lines stripped ...]


Mime
View raw message