CLStatus CLMsgLoopManagerForSTLqueue::Initialize()
{
	if(m_pMsgReceiver == 0)
		return CLStatus(-1, 0);

	CLMessagePoster *pMsgPoster = 0;

	try
	{
		CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
		if(pNameServer == 0)
		{
			CLLogger::WriteLogMsg("In CLMsgLoopManagerForSTLqueue::Initialize(), CLExecutiveNameServer::GetInstance error", 0);
			throw CLStatus(-1, 0);
		}

		pMsgPoster = new CLMessagePoster(new CLMsgToPointerSerializer, 0, new CLDataPostChannelBySTLqueueMaintainer(m_pSTLqueue), m_pEvent);

		CLStatus s2 = pMsgPoster->Initialize(new CLInitialDataPostChannelNotifier(), 0);
		if(!s2.IsSuccess() && (s2.m_clErrorCode == DATA_POSTER_INITIALIZE_ERROR))
		{
			CLLogger::WriteLogMsg("In CLMsgLoopManagerForSTLqueue::Initialize(), pMsgPoster->Initialize error", 0);
			throw CLStatus(-1, 0);
		}
		
		CLStatus s = pNameServer->Register(m_strThreadName.c_str(), pMsgPoster, m_pMsgReceiver);
		if(!s.IsSuccess())
		{
			CLLogger::WriteLogMsg("In CLMsgLoopManagerForSTLqueue::Initialize(), pNameServer->Register error", 0);
			
			m_pMsgReceiver = 0;
			return CLStatus(-1, 0);
		}

		return CLStatus(0, 0);
	}
	catch(CLStatus& s1)
	{
		if(m_pMsgReceiver)
		{
			delete m_pMsgReceiver;
			m_pMsgReceiver = 0;
		}

		if(pMsgPoster)
			delete pMsgPoster;
		else
		{
			delete m_pEvent;
			delete m_pSTLqueue;
		}

		return s1;
	}
}
CLStatus CLMsgLoopManagerForSTLqueue::Uninitialize()
{
	CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
	if(pNameServer == 0)
	{
		CLLogger::WriteLogMsg("In CLMsgLoopManagerForMsgQueue::Uninitialize(), CLExecutiveNameServer::GetInstance error", 0);
		return CLStatus(-1, 0);
	}

	return pNameServer->ReleaseCommunicationPtr(m_strThreadName.c_str());
}
TEST(CLExecutiveNameServer, ReleaseCommunicationPtr)
{
	CLExecutiveNameServer *p = CLExecutiveNameServer::GetInstance();
	EXPECT_NE(p, (CLExecutiveNameServer *)0);

	EXPECT_FALSE(p->ReleaseCommunicationPtr(0).IsSuccess());
	EXPECT_FALSE(p->ReleaseCommunicationPtr("").IsSuccess());

	CLLogger::WriteLogMsg("The Following bug is produced on purpose", 0);
	EXPECT_FALSE(p->ReleaseCommunicationPtr("1").IsSuccess());
}
TEST(CLExecutiveNameServer, MsgReceiver_Register_Test)
{
	const char *strPipeName = "/tmp/NamedPipe_For_CLExecutiveNameServer_Test";

	CLMessageReceiver *mr = new CLMessageReceiver(new CLBufferManager(), new CLDataReceiverByNamedPipe(strPipeName), new CLPointerToMsgDeserializer(), new CLProtocolDecapsulatorBySplitPointer);

	CLMessagePoster *mp = new CLMessagePoster(new CLMsgToPointerSerializer, 0, new CLDataPostChannelByNamedPipeMaintainer(strPipeName), 0);
	EXPECT_TRUE(mp->Initialize(new CLInitialDataPostChannelNotifier, 0).IsSuccess());

	CLExecutiveNameServer *p = CLExecutiveNameServer::GetInstance();
	EXPECT_NE(p, (CLExecutiveNameServer *)0);

	EXPECT_FALSE(p->Register("", mp, mr).IsSuccess());
}
CLStatus CLMsgLoopManagerForPipeQueue::Uninitialize()
{
	CLPrivateMsgQueuebyNamedPipe *pQueue = dynamic_cast<CLPrivateMsgQueuebyNamedPipe *>(m_pMsgQueue);
	if(pQueue == 0)
		return CLStatus(0, 0);

	CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
	if(pNameServer == 0)
	{
		CLLogger::WriteLogMsg("In CLMsgLoopManagerForPipeQueue::Uninitialize(), CLExecutiveNameServer::GetInstance error", 0);
		return CLStatus(-1, 0);
	}

	return pNameServer->ReleaseCommunicationPtr(m_strThreadName.c_str());
}
CLStatus CLMsgLoopManagerForSTLQueue::Initialize(){
    CLExecutiveNameServer* pNameServer = CLExecutiveNameServer::GetInstance();
    if(pNameServer == NULL){
	delete m_pMsgQueue;
	m_pMsgQueue = NULL;
	CLLogger::WriteLogMsg("In CLMsgLoopManagerForMsgQueue::Initialize(), CLExecutiveNameServer::GetInstance error", 0);
	return CLStatus(-1,0);
    }

    CLStatus s = pNameServer->Register(m_strThreadName.c_str(),new CLThreadCommunicationBySTLQueue(m_pMsgQueue));
    if(!s.IsSuccess()){
	delete m_pMsgQueue;
	m_pMsgQueue = 0;
	CLLogger::WriteLogMsg("In CLMsgLoopManagerForMsgQueue::Initialize()    , pNameServer->Register error", 0);
	return CLStatus(-1,0);
    }

    return CLStatus(0,0);
}
	CLStatus On_2(CLMessage *pm)
	{
		CLMsg2ForCLNonThreadForMsgLoopTest *p = dynamic_cast<CLMsg2ForCLNonThreadForMsgLoopTest*>(pm);
		EXPECT_TRUE(p != 0);

		g_for_on2++;

		if(g_for_on2 == count)
		{
			EXPECT_TRUE(CLExecutiveNameServer::PostExecutiveMessage(test1_pipe_name, new CLMsg2ForCLNonThreadForMsgLoopTest, true).IsSuccess());

			CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
			EXPECT_TRUE(pNameServer != 0);
			pNameServer->ReleaseCommunicationPtr(test1_pipe_name);

			return CLStatus(QUIT_MESSAGE_LOOP, 0);
		}

		return CLStatus(0, 0);
	}
TEST(CLExecutiveNameServer, MsgReceiver_Features_Test)
{
	const char *strPipeName = "/tmp/NamedPipe_For_CLExecutiveNameServer_Test";
	
	CLMessageReceiver *mr = new CLMessageReceiver(new CLBufferManager(), new CLDataReceiverByNamedPipe(strPipeName), new CLPointerToMsgDeserializer(), new CLProtocolDecapsulatorBySplitPointer);
	
	CLMessagePoster *mp = new CLMessagePoster(new CLMsgToPointerSerializer, 0, new CLDataPostChannelByNamedPipeMaintainer(strPipeName), 0);
	EXPECT_TRUE(mp->Initialize(new CLInitialDataPostChannelNotifier, 0).IsSuccess());

	CLExecutiveNameServer *p = CLExecutiveNameServer::GetInstance();
	EXPECT_NE(p, (CLExecutiveNameServer *)0);

	EXPECT_TRUE(p->Register("SDFdfd1", mp, mr).IsSuccess());

	for(int i = 1; i < 40960 / 8; i++)
	{
		EXPECT_TRUE(CLExecutiveNameServer::PostExecutiveMessage("SDFdfd1", new CLMessage(i)).IsSuccess());
	}

	EXPECT_TRUE(p->ReleaseCommunicationPtr("SDFdfd1").IsSuccess());
}
CLStatus CLExecutiveNameServer::PostExecutiveMessage(const char* pstrExecutiveName, CLMessage* pMessage){

    if(pMessage == 0)
	return CLStatus(-1, 0);

    if((pstrExecutiveName == 0) || (strlen(pstrExecutiveName) == 0)){
	delete pMessage;
	return CLStatus(-1, 0);
    }

    CLExecutiveNameServer* pNameServer = CLExecutiveNameServer::GetInstance();
    if(pNameServer == NULL){
	CLLogger::WriteLogMsg("In CLExecutiveNameServer::PostExecutiveMessage(), CLExecutiveNameServer::GetInstance error", 0);
	delete pMessage;
	return CLStatus(-1,0);
    }

    CLExecutiveCommunication* pComm = pNameServer->GetCommunicationPtr(pstrExecutiveName);
    if(pComm == NULL){
	CLLogger::WriteLogMsg("In CLExecutiveNameServer::PostExecutiveMessage(), pNameServer->GetCommunicationPtr error", 0);
	delete pMessage;
	return CLStatus(-1,0);
    }

    CLStatus s = pComm->PostExecutiveMessage(pMessage);
    if(!s.IsSuccess()){
	 CLLogger::WriteLogMsg("In CLExecutiveNameServer::PostExecutiveMessage(), pComm->PostExecutiveMessage error", 0);

	 CLStatus s = pNameServer->ReleaseCommunicationPtr(pstrExecutiveName);
	 if(!s.IsSuccess())
	     CLLogger::WriteLogMsg("In CLExecutiveNameServer::PostExecutiveMessage(), pNameServer->ReleaseCommunicationPtr error", 0);
	 return CLStatus(-1,0);
    }

    CLStatus s2 = pNameServer->ReleaseCommunicationPtr(pstrExecutiveName);
    if(!s2.IsSuccess())
	CLLogger::WriteLogMsg("In CLExecutiveNameServer::PostExecutiveMessage(), pNameServer->ReleaseCommunicationPtr error", 0);

    return CLStatus(0, 0);
}
CLStatus CLMsgLoopManagerForPipeQueue::Initialize()
{
	CLPrivateMsgQueuebyNamedPipe *pQueue = dynamic_cast<CLPrivateMsgQueuebyNamedPipe *>(m_pMsgQueue);
	if(pQueue == 0)
		return CLStatus(0, 0);

	CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
	if(pNameServer == 0)
	{
		CLLogger::WriteLogMsg("In CLMsgLoopManagerForPipeQueue::Initialize(), CLExecutiveNameServer::GetInstance error", 0);
		return CLStatus(-1, 0);
	}

	CLStatus s = pNameServer->Register(m_strThreadName.c_str(), new CLPrivateExecutiveCommunicationByNamedPipe(m_strThreadName.c_str()));
	if(!s.IsSuccess())
	{
		CLLogger::WriteLogMsg("In CLMsgLoopManagerForPipeQueue::Initialize(), pNameServer->Register error", 0);
		return CLStatus(-1, 0);
	}

	return CLStatus(0, 0);
}
TEST(CLExecutiveNameServer, PostExecutiveMessage_Features_Test)
{
	const char *strPipeName = "/tmp/NamedPipe_For_CLExecutiveNameServer_Test";
	CLNamedPipe np(strPipeName, true);
	CLMessagePoster *mp = new CLMessagePoster(new CLMsgToPointerSerializer, 0, new CLDataPostChannelByNamedPipeMaintainer(strPipeName), 0);

	CLExecutiveNameServer *p = CLExecutiveNameServer::GetInstance();
	EXPECT_NE(p, (CLExecutiveNameServer *)0);

	EXPECT_TRUE(mp->Initialize(new CLInitialDataPostChannelNotifier, 0).IsSuccess());

	EXPECT_TRUE(p->Register("SDFdfd1", mp).IsSuccess());
	
	CLMessage *pmsg1 = new CLMessage(1);
	EXPECT_TRUE(CLExecutiveNameServer::PostExecutiveMessage("SDFdfd1", pmsg1, true).IsSuccess());
	CLIOVectors iov;
	long j;
	EXPECT_TRUE(iov.PushBack((char *)(&j), 8).IsSuccess());
	EXPECT_TRUE(np.Read(iov).IsSuccess());
	EXPECT_EQ(j, (long)pmsg1);

	EXPECT_TRUE(p->ReleaseCommunicationPtr("SDFdfd1").IsSuccess());
}
	CLStatus On_1(CLMessage *pm)
	{
		CLMsg1ForCLNonThreadForMsgLoopTest *p = dynamic_cast<CLMsg1ForCLNonThreadForMsgLoopTest*>(pm);
		EXPECT_TRUE(p != 0);

		g_for_on1++;

		CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
		EXPECT_TRUE(pNameServer != 0);

		CLEvent *m_pEvent = new CLEvent(test1_pipe_name, true);
		CLMultiMsgSerializer *m_pMsgSerializer = new CLMultiMsgSerializer;
		EXPECT_TRUE(m_pMsgSerializer->RegisterSerializer(1, new CLMsg1ForCLNonThreadForMsgLoopTest_Serializer).IsSuccess());
		EXPECT_TRUE(m_pMsgSerializer->RegisterSerializer(2, new CLMsg2ForCLNonThreadForMsgLoopTest_Serializer).IsSuccess());

		CLMessagePoster *pMsgPoster = new CLMessagePoster(m_pMsgSerializer, 0, new CLDataPostChannelByNamedPipeMaintainer(test1_pipe_namepath), m_pEvent);
		EXPECT_TRUE(pMsgPoster->Initialize(new CLInitialDataPostChannelNotifier(), 0).IsSuccess());

		EXPECT_TRUE(pNameServer->Register(test1_pipe_name, pMsgPoster).IsSuccess());

		EXPECT_TRUE(CLExecutiveNameServer::PostExecutiveMessage(test1_pipe_name, new CLMsg1ForCLNonThreadForMsgLoopTest, true).IsSuccess());

		return CLStatus(0, 0);
	}
TEST(CLExecutiveNameServer, GetCommunicationPtr)
{
	CLExecutiveNameServer *p = CLExecutiveNameServer::GetInstance();
	EXPECT_NE(p, (CLExecutiveNameServer *)0);

	EXPECT_EQ(p->GetCommunicationPtr(0), (CLMessagePoster *)0);
	EXPECT_EQ(p->GetCommunicationPtr(""), (CLMessagePoster *)0);
	CLLogger::WriteLogMsg("The Following bug is produced on purpose", 0);
	EXPECT_EQ(p->GetCommunicationPtr("3423"), (CLMessagePoster *)0);

	const char *strPipeName = "/tmp/NamedPipe_For_CLExecutiveNameServer_Test";
	CLNamedPipe np(strPipeName, true);
	CLMessagePoster *mp = new CLMessagePoster(new CLMsgToPointerSerializer, 0, new CLDataPostChannelByNamedPipeMaintainer(strPipeName), 0);
	EXPECT_TRUE(mp->Initialize(new CLInitialDataPostChannelNotifier, 0).IsSuccess());
	EXPECT_TRUE(p->Register("SDFdfd", mp).IsSuccess());

	CLMessagePoster *qq = p->GetCommunicationPtr("SDFdfd");
	EXPECT_TRUE(qq == mp);
	EXPECT_TRUE(p->ReleaseCommunicationPtr("SDFdfd").IsSuccess());

	EXPECT_TRUE(p->ReleaseCommunicationPtr("SDFdfd").IsSuccess());
}