打印

贴三段代码,一起分析一下优劣。

[复制链接]
2738|28
手机看帖
扫描二维码
随时随地手机跟帖
沙发
keer_zu|  楼主 | 2015-8-11 09:29 | 只看该作者
本帖最后由 keer_zu 于 2015-8-12 09:49 编辑

1-----------

#include <iostream>
#include <stdio.h>
        
#include <pthread.h>
#include <sys/time.h>
#include <error.h>
#include <stdlib.h>
#include <memory.h>
#include <fstream>
//#include <log4cxx/logger.h>
//#include <log4cxx/logstring.h>
//#include <log4cxx/propertyconfigurator.h>
#include "log4cxx_wrapper.h"
#include "interface_api.h"
#include "disp_task.h"
#include "queue_manager.h"


//using namespace log4cxx;
//extern LoggerPtr g_Dslogger;

extern DsManage g_cDsManage;

BOOL32 DsGetTimeInfo( TaskTimeInfo* ptTimeInfo )
{
    if( NULL == ptTimeInfo )
    {
        return FALSE;
    }

    struct tm tmTemp;
    struct timeval ttTemp;
    if( 0 != gettimeofday( &ttTemp , NULL ) )
    {
        return FALSE;
    }
    tmTemp = *localtime( &ttTemp.tv_sec );
    ptTimeInfo->m_wYear = tmTemp.tm_year+1900;
    ptTimeInfo->m_wMonth = tmTemp.tm_mon+1;
    ptTimeInfo->m_wDay = tmTemp.tm_mday;
    ptTimeInfo->m_wHour = tmTemp.tm_hour;
    ptTimeInfo->m_wMinute = tmTemp.tm_min;
    ptTimeInfo->m_wSecond = tmTemp.tm_sec;
    return TRUE;

}


void DsManage::OnRegister(RegisterInfo ®Info, TsSession &session)
{
    string json;
    TsMessageCodec tmpTsMessageCodec;
    RegisterResponse* pResponse = new RegisterResponse;
    u32 dwTsIndex=0;
    u32 dwTsFreeIndex = 0;
    bool bFind = FALSE;
    bool bResult = TRUE;
    TsType tsType = regInfo.GetTsType();
    LoggerWrapper dsLog= LoggerWrapper::GetInstance();
    dsLog.Log(TRUE,LOGGER_DEBUG,"session:%d,GetTsId:%s,GetTsIp:%s,GetTstype:%d , [%s][%s][%d]\n",&session,regInfo.GetTsId().c_str(),regInfo.GetTsIp().c_str(),regInfo.GetTsType(),__FILE__,__PRETTY_FUNCTION__,__LINE__);   

//    printf("GetTsId:%s,GetTsIp:%s,GetTstype:%d\n",regInfo.GetTsId().c_str(),regInfo.GetTsIp().c_str(),regInfo.GetTsType());
    //添加注册的转换服务器进入转换服务器队列
    if(TS_DYNAMIC_PPT == tsType)
    {
        for(dwTsIndex=1;dwTsIndex<MAX_DANAMIC_PPT_TRANS_SERVER_NUM;dwTsIndex++)
        {

            if(TS_UNREGISTERED == g_cDsManage.PPTTs[dwTsIndex].GetState())
            {
                if(FALSE == bFind)
                {
                    bFind = TRUE;
                    dwTsFreeIndex = dwTsIndex;
                }

            }
            else if((TS_FREE == g_cDsManage.PPTTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.PPTTs[dwTsIndex].GetState()))
            {
                if((g_cDsManage.PPTTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.PPTTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
                {
                    bResult = FALSE;
                    break;
                }
            }
        }

        if(bFind && bResult)
        {
            PPTTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
            PPTTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
            PPTTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
            PPTTs[dwTsFreeIndex].SetTsSession( &session);
            PPTTs[dwTsFreeIndex].SetState(TS_FREE);

        }

    }
    else if(TS_DOCUMENT_WINDOWS == tsType)
    {
        for(dwTsIndex=1;dwTsIndex<MAX_DOC_WINDOWS_TRANS_SERVER_NUM;dwTsIndex++)
        {

            if(TS_UNREGISTERED == g_cDsManage.DocWindowsTs[dwTsIndex].GetState())
            {
                if(FALSE == bFind)
                {
                    bFind = TRUE;
                    dwTsFreeIndex = dwTsIndex;
                }

            }
            else if((TS_FREE == g_cDsManage.DocWindowsTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.DocWindowsTs[dwTsIndex].GetState()))
            {
                if((g_cDsManage.DocWindowsTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.DocWindowsTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
                {
                    bResult = FALSE;
                    break;
                }
            }
        }

        if(bFind && bResult)
        {
            DocWindowsTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
            DocWindowsTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
            DocWindowsTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
            DocWindowsTs[dwTsFreeIndex].SetTsSession( &session);
            DocWindowsTs[dwTsFreeIndex].SetState(TS_FREE);
        }

    }   
    else if(TS_DOCUMENT == tsType)
    {
        for(dwTsIndex=1;dwTsIndex<MAX_DOC_TRANS_SERVER_NUM;dwTsIndex++)
        {
            
            if(TS_UNREGISTERED == g_cDsManage.DocTs[dwTsIndex].GetState())
            {
                if(FALSE == bFind)
                {
                    bFind = TRUE;
                    dwTsFreeIndex = dwTsIndex;
                }
               
            }
            else if((TS_FREE == g_cDsManage.DocTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.DocTs[dwTsIndex].GetState()))
            {
                if((g_cDsManage.DocTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.DocTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
                {
                    bResult = FALSE;
                    break;
                }
            }
        }

        if(bFind && bResult)
        {
            DocTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
            DocTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
            DocTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
            DocTs[dwTsFreeIndex].SetTsSession( &session);
            DocTs[dwTsFreeIndex].SetState(TS_FREE);
        }
        
    }
    else if(TS_VIDEO == tsType)
    {
        for(dwTsIndex=1;dwTsIndex<MAX_VIDEO_TRANS_SERVER_NUM;dwTsIndex++)
        {
            
            if(TS_UNREGISTERED == g_cDsManage.VideoTs[dwTsIndex].GetState())
            {
                if(FALSE == bFind)
                {
                    bFind = TRUE;
                    dwTsFreeIndex = dwTsIndex;
                }
               
            }
            else if((TS_FREE == g_cDsManage.VideoTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.VideoTs[dwTsIndex].GetState()))
            {
                if((g_cDsManage.VideoTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.VideoTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
                {
                    bResult = FALSE;
                    break;
                }
            }
        }

        if(bFind && bResult)
        {
            VideoTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
            VideoTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
            VideoTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
            VideoTs[dwTsFreeIndex].SetTsSession( &session);
            VideoTs[dwTsFreeIndex].SetState(TS_FREE);

        }
        
    }
    else
    {
        dsLog.Log(TRUE,LOGGER_DEBUG,"error message from transfer server. Register invalid ts server type::%d , [%s][%s][%d]\n",tsType,__FILE__,__PRETTY_FUNCTION__,__LINE__);        
//        LOG4CXX_ERROR(g_Dslogger, "error message from transfer server. Register invalid ts server type: ");
//        LOG4CXX_ERROR(g_Dslogger, tsType);   
        return;
    }
   
    //发送响应消息给转换服务器
    if(bFind && bResult)
    {
        pResponse->SetResult(TRUE);
        pResponse->SetErrorCode(RET_OK);
        pResponse->SetErrorDetail("");
    }
    else if(FALSE == bResult)
    {
        pResponse->SetResult(FALSE);
        pResponse->SetErrorCode(RET_E_REPEATED_TS_ID);
        pResponse->SetErrorDetail("Same ts id   can not be registered repeated!");
    }
    else if(FALSE == bFind)
    {
        pResponse->SetResult(FALSE);
        pResponse->SetErrorCode(RET_E_TS_USED_UP);
        pResponse->SetErrorDetail("No enough ts resource can be registered!");
    }

    session.SendMessage(*pResponse);
    if((FALSE == bResult) || (FALSE == bFind))
    {
        session.Close();
        return;
    }

    //如果注册成功检查任务等待队列是否有转换任务在等待,没有则直接返回
    //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
    if(TS_DYNAMIC_PPT == tsType)
    {
        if (( !m_TransDynamicPptWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
        {
            AppTaskMessage*  pTaskMessage = m_TransDynamicPptWaitQueue.top( );
//                printf("4444  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
      //          printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());  
            m_TransDynamicPptWaitQueue.pop( );   
            TaskTimeInfo tTaskTimeInfo ;
            if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
            {
                return;
            }
            pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
            m_TransDynamicPptRunQueue.push_back(pTaskMessage);
     
            PPTTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
            PPTTs[dwTsFreeIndex].SetState(TS_RUNNING);
            pTaskMessage->SetTsNum(dwTsFreeIndex);
            
            TransitionRequest* pTransitionRequest = new TransitionRequest;
            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
        
            PPTTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransitionRequest);
//                printf("55555  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
    //            printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         
            if(NULL !=  pTransitionRequest)
            {
                delete pTransitionRequest;
                pTransitionRequest = NULL;
            }
//               printf("666  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
   //             printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         

        }

    }
    else if(TS_DOCUMENT_WINDOWS == tsType)
    {
        if (( !m_TransDocWindowsWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
        {
            AppTaskMessage*  pTaskMessage = m_TransDocWindowsWaitQueue.top( );
//                printf("4444  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
      //          printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());  
            m_TransDocWindowsWaitQueue.pop( );
            TaskTimeInfo tTaskTimeInfo ;
            if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
            {
                return;
            }
            pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);

            m_TransDocWindowsRunQueue.push_back(pTaskMessage);
     
            DocWindowsTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
            DocWindowsTs[dwTsFreeIndex].SetState(TS_RUNNING);
            pTaskMessage->SetTsNum(dwTsFreeIndex);
            
            TransitionRequest* pTransitionRequest = new TransitionRequest;
            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
        
            DocWindowsTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransitionRequest);
//                printf("55555  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
    //            printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         
            if(NULL !=  pTransitionRequest)
            {
                delete pTransitionRequest;
                pTransitionRequest = NULL;
            }
//               printf("666  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
   //             printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         

        }

    }   
    else if(TS_DOCUMENT == tsType)
    {
        if (( !m_TransDocWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
        {
            AppTaskMessage*  pTaskMessage = m_TransDocWaitQueue.top( );
//                printf("4444  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
    //            printf("m_TransDocWaitQueue.size:%d\n",m_TransDocWaitQueue.size());  
            m_TransDocWaitQueue.pop( );      
            TaskTimeInfo tTaskTimeInfo ;
            if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
            {
                return;
            }
            pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);

            m_TransDocRunQueue.push_back(pTaskMessage);
     
            DocTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
            DocTs[dwTsFreeIndex].SetState(TS_RUNNING);
            pTaskMessage->SetTsNum(dwTsFreeIndex);
            
            TransitionRequest* pTransitionRequest = new TransitionRequest;
            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

            DocTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransitionRequest);
//                printf("55555  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
//               printf("m_TransDocWaitQueue.size:%d\n",m_TransDocWaitQueue.size());         
            if(NULL !=  pTransitionRequest)
            {
                delete pTransitionRequest;
                pTransitionRequest = NULL;
            }
//                printf("666  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
//               printf("m_TransDocWaitQueue.size:%d\n",m_TransDocWaitQueue.size());         

        }
    }
    else  //(TS_VIDEO == tsType)
    {
        if (( !m_VideoWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
        {            
            AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
            m_VideoWaitQueue.pop( );
            TaskTimeInfo tTaskTimeInfo ;
            if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
            {
                return;
            }
            pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);

            m_VideoRunQueue.push_back(pTaskMessage);
     
            VideoTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
            VideoTs[dwTsFreeIndex].SetState(TS_RUNNING);
            pTaskMessage->SetTsNum(dwTsFreeIndex);

            if(APP_MESSAGE_VIDEO_TRANS_TASK == pTaskMessage->GetAppMessageType())
            {   
                TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
                pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());

                char cFormat[100];
                sprintf(cFormat, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwFormat);
                pTransVideoRequest->SetFormat(cFormat);

                char cBitRate[100];
                sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
                pTransVideoRequest->SetBitRate(cBitRate);

                char cWidth[100];
                char cHeight[100];
                string strWidth,strHeight,strResolution;
                sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
                sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
                strWidth = cWidth;
                strHeight = cHeight;
                strResolution = strWidth +"*"+strHeight;
                pTransVideoRequest->SetResolution(strResolution);
               
                VideoTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransVideoRequest);
                if(NULL !=  pTransVideoRequest)
                {
                    delete pTransVideoRequest;
                    pTransVideoRequest = NULL;
                }
            }
            else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == pTaskMessage->GetAppMessageType())
            {
                CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
                pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());

                char cStart[100];
                sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
                pCapVideoRequest->SetStart(cStart);

                char cCount[100];
                sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
                pCapVideoRequest->SetCount(cCount);


                char cInterval[100];
                sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
                pCapVideoRequest->SetInterval(cInterval);
               
                VideoTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pCapVideoRequest);
                if(NULL !=  pCapVideoRequest)
                {
                    delete pCapVideoRequest;
                    pCapVideoRequest = NULL;
                }
            }
            else if(APP_MESSAGE_VIDEO_INFO_TASK == pTaskMessage->GetAppMessageType())
            {
                GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
                pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
                pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
               
                VideoTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pVideoInfoRequest);
                if(NULL !=  pVideoInfoRequest)
                {
                    delete pVideoInfoRequest;
                    pVideoInfoRequest = NULL;
                }
            }
            else //error
            {
                dsLog.Log(TRUE,LOGGER_DEBUG,"error task in the wait queue  appMessage type::%d , [%s][%s][%d]\n",pTaskMessage->GetAppMessageType(),__FILE__,__PRETTY_FUNCTION__,__LINE__);        

            }

        }
    }
   
}

void DsManage::OnTaskResult(TaskResult &taskResult, TsSession &session)
{
    LoggerWrapper dsLog= LoggerWrapper::GetInstance();
    //    printf("OnTaskResult,  result:%d, session:%d  ***************\n",taskResult.GetResult(),&session);
    dsLog.Log(TRUE,LOGGER_DEBUG,"OnTaskResult,  result:%d, session:%d , [%s][%s][%d]\n",taskResult.GetResult(),&session,__FILE__,__PRETTY_FUNCTION__,__LINE__);        
    string json;
    TsMessageCodec tmpTsMessageCodec;
    ResultResponse* pResponse = new ResultResponse;

    TsTaskResultType tsTaskResultType = taskResult.GetTsTaskResultType();
    bool bFind =FALSE;

    //对视频服务器消息的部分单独处理
    if(TS_MESSAGE_VIDEO_TRANS_RESULT == tsTaskResultType)
    {
        pResponse->SetMessageId(taskResult.GetMessageId());
        pResponse->SetServerType("Transfer");
    }
    else if(TS_MESSAGE_VIDEO_CAPTURE_RESULT == tsTaskResultType)
    {
        pResponse->SetMessageId(taskResult.GetMessageId());
        pResponse->SetServerType("CapVideo");

    }
    else if(TS_MESSAGE_VIDEO_INFO_RESULT == tsTaskResultType)
    {
        pResponse->SetMessageId(taskResult.GetMessageId());
        pResponse->SetServerType("Message");
    }
    //回复收到转换服务器消息resultresponse   
    session.SendMessage(*pResponse);
    if(NULL != pResponse)
    {
        delete pResponse;
        pResponse = NULL;
    }

    if(TS_MESSAGE_DOC_TRANS_RESULT == tsTaskResultType)
    {
        AppDocTransResultMessage* pResult = new AppDocTransResultMessage;
        //连接和发送转换结果给应用客户端
        pResult->SetMessageId(taskResult.GetMessageId());
        pResult->SetResult((taskResult).GetResult());
        pResult->SetErrorCode((taskResult).GetErrorCode());      
        pResult->SetPages((taskResult).GetPages());      

        //根据转换结果执行相应处理
        
        //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
        TaskMessageList::iterator iterIdCheck;
        for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
            {
                u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
                u32 dwWindowsRepeatedTimes = pTaskMessage->GetMessagePara().unTransDoc.m_dwWindowsRepeatTimes;
//                if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
                if( TRUE == taskResult.GetResult())
                {
                    string strAppTargetIp;
                    u32 dwAppTargetPort;
                    if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                    {
                        pResult->SetAppTargetIp(strAppTargetIp);
                        pResult->SetAppTargetPort(dwAppTargetPort);
                        bFind = TRUE;
                        
                    }
                    else
                    {
                    //error
                    }

                    DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                    
                    //将该任务从运行队列移除,并归还给空闲队列
                    pTaskMessage->Initialize();
                    m_FreeMessageQueue.push_back(pTaskMessage);
                    m_TransDocRunQueue.erase(iterIdCheck);            
               
                }
                else if((dwRepeatedTimes<MAX_DOC_TRANS_REPEATED_TIMES)&&(FALSE == taskResult.GetResult()))
                {
                    bool bFindSecond = FALSE;
                    //查找是否存在除了自己以外的空闲转换服务器,如果找到,把任务交给它重新处理,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DOC_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {
                        if((TS_FREE== DocTs[dwFreeTsNo].GetState()) && (dwFreeTsNo != pTaskMessage->GetTsNum()))
                        {
                            DocTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            DocTs[dwFreeTsNo].SetState(TS_RUNNING);                           
                            DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                            TransitionRequest* pTransitionRequest = new TransitionRequest;
                            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

                            DocTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                            if(NULL != pTransitionRequest)
                            {
                                delete pTransitionRequest;
                                pTransitionRequest = NULL;
                            }
                           
                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindSecond = TRUE;
                            break;
                        }
                    }
                    //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                    if(FALSE == bFindSecond)
                    {
                        pTaskMessage->SetPriority(9);
                        m_TransDocWaitQueue.push(pTaskMessage);
                        DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                        DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
                        TaskMessageList::iterator iterIdCheck;
                        for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
                        {
                            if(*iterIdCheck ==pTaskMessage)
                            {
                                m_TransDocRunQueue.erase(iterIdCheck);
                                break;
                            }
                        }
                    }

                    dwRepeatedTimes++;
                    pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
                }
                else if(((MAX_DOC_TRANS_REPEATED_TIMES == dwRepeatedTimes)&&(FALSE == taskResult.GetResult()))&&(0 == dwWindowsRepeatedTimes))
                {
                //将该任务交给windows版本文档转换处理,同时从运行队列删除
                    bool bFindWindows = FALSE;
                    //查找是否存在空闲windows 转换服务器,如果找到,把任务交给它重新处理,并添加到运行队列中,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {   
                        if((TS_FREE== DocWindowsTs[dwFreeTsNo].GetState()))
                        {
                            DocWindowsTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            DocWindowsTs[dwFreeTsNo].SetState(TS_RUNNING);                           
                            DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                            TransitionRequest* pTransitionRequest = new TransitionRequest;
                            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

                            DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                            if(NULL != pTransitionRequest)
                            {
                                delete pTransitionRequest;
                                pTransitionRequest = NULL;
                            }

                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindWindows = TRUE;
                            //将该任务添加到windows版本文档转换运行队列中
                            TaskTimeInfo tTaskTimeInfo ;
                            if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                            {
                                return;
                            }
                            pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                           
                            m_TransDocWindowsRunQueue.push_back(pTaskMessage);
                            break;
                        }
                    }
                    //如果没有windows 转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列
                    if(FALSE == bFindWindows)
                    {
                        pTaskMessage->SetPriority(9);
                        m_TransDocWindowsWaitQueue.push(pTaskMessage);
                    }

                    //将该任务从linux版文档转换服务器运行队列移除
                    
                    m_TransDocRunQueue.erase(iterIdCheck);

                }
                break;
            }
        }
        
        if(bFind)
        {
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
        }

        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列

        for(u32 dwTsNo =1; dwTsNo <MAX_DOC_TRANS_SERVER_NUM; dwTsNo++)
        {
            if(&session ==DocTs[dwTsNo].GetTsSession())
            {
    //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
                if( !m_TransDocWaitQueue.empty() )
                {
                    AppTaskMessage*  pTaskMessage = m_TransDocWaitQueue.top( );
                    m_TransDocWaitQueue.pop( );   
                    TaskTimeInfo tTaskTimeInfo ;
                    if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                    {
                        return;
                    }
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    
                    m_TransDocRunQueue.push_back(pTaskMessage);
            
                    DocTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    DocTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);
                    TransitionRequest* pTransitionRequest = new TransitionRequest;
                    pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                    pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);


                    DocTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                    if(NULL !=  pTransitionRequest)
                    {
                        delete pTransitionRequest;
                        pTransitionRequest = NULL;
                    }
                }
                else
                {
                    DocTs[dwTsNo].SetState(TS_FREE);
                    DocTs[dwTsNo].SetMessageInTs(NULL);                                    
                }
               
                break;
            }
        
        }         
        
        if(NULL != pResult)
        {
            delete pResult;
            pResult = NULL;
        }
        
    }
    else  if(TS_MESSAGE_DOC_WINDOWS_TRANS_RESULT == tsTaskResultType)   
    {
        
        //后面跟应用定了协议之后需要创建新的动态PPT的类        
       AppDocTransResultMessage*  pResult = new AppDocTransResultMessage;
        //连接和发送转换结果给应用客户端
        pResult->SetMessageId(taskResult.GetMessageId());
        pResult->SetResult(taskResult.GetResult());
        pResult->SetErrorCode(taskResult.GetErrorCode());   
        pResult->SetPages((taskResult).GetPages());

        //根据转换结果执行相应处理
//          printf("m_TransDocWindowsRunQueue.size():%d\n",m_TransDocWindowsRunQueue.size());
          //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
        TaskMessageList::iterator iterIdCheck;
        for (iterIdCheck=m_TransDocWindowsRunQueue.begin(); iterIdCheck!=m_TransDocWindowsRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
            {
                u32 dwWindowsRepeatedTimes = pTaskMessage->GetMessagePara().unTransDoc.m_dwWindowsRepeatTimes;
                if(((MAX_DOC_WINDOWS_TRANS_REPEATED_TIMES == dwWindowsRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
                {
                    string strAppTargetIp;
                    u32 dwAppTargetPort;
                    if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                    {
                        pResult->SetAppTargetIp(strAppTargetIp);
                        pResult->SetAppTargetPort(dwAppTargetPort);
                        bFind = TRUE;
                          
                    }
                    else
                    {
                    //error
                    }


                    DocWindowsTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    DocWindowsTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
                    //将该任务从运行队列移除,并归还给空闲队列
                    pTaskMessage->Initialize();
                    m_FreeMessageQueue.push_back(pTaskMessage);
                    m_TransDocWindowsRunQueue.erase(iterIdCheck);            
                  
                }
                else
                {
                    bool bFindSecond = FALSE;
                    //查找是否存在除了自己以外的空闲转换服务器,如果找到,把任务交给它重新处理,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {   
                        if((TS_FREE== DocWindowsTs[dwFreeTsNo].GetState()) && (dwFreeTsNo != pTaskMessage->GetTsNum()))
                        {
                            DocWindowsTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            DocWindowsTs[dwFreeTsNo].SetState(TS_RUNNING);
                            DocWindowsTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            DocWindowsTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                            TransitionRequest* pTransitionRequest = new TransitionRequest;
                            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

                            DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                            if(NULL != pTransitionRequest)
                            {
                                delete pTransitionRequest;
                                pTransitionRequest = NULL;
                             }
                              
                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindSecond = TRUE;
                            break;
                         }
                     }
                     //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                     if(FALSE == bFindSecond)
                     {
                         pTaskMessage->SetPriority(9);
                         m_TransDocWindowsWaitQueue.push(pTaskMessage);
                         DocWindowsTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                         DocWindowsTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        

                         m_TransDocWindowsRunQueue.erase(iterIdCheck);                  
                     }
                     
                     dwWindowsRepeatedTimes++;
//                     pTaskMessage->SetRepeatedTimes( dwWindowsRepeatedTimes);
                     UnionMessageParam unMessagePara;
                     unMessagePara = pTaskMessage->GetMessagePara();
                     unMessagePara.unTransDoc.m_dwWindowsRepeatTimes = dwWindowsRepeatedTimes;
                     pTaskMessage->SetMessagePara(unMessagePara);

                 }
        
                 break;
             }
         }


         if(bFind)
         {
             (SessionManager::GetInstance()).SendAppMessage(*pResult);
         }
        
         //检查任务等待队列是否有转换任务在等待,没有则直接返回
         //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
        
         for(u32 dwTsNo =1; dwTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwTsNo++)
         {
             if(&session ==DocWindowsTs[dwTsNo].GetTsSession())
             {
   //              printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
                 if( !m_TransDocWindowsWaitQueue.empty() )
                 {
                     AppTaskMessage*  pTaskMessage = m_TransDocWindowsWaitQueue.top( );
                     m_TransDocWindowsWaitQueue.pop( );      
                     
                     TaskTimeInfo tTaskTimeInfo ;
                     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                     {
                         return;
                     }
                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                     m_TransDocWindowsRunQueue.push_back(pTaskMessage);
               
                     DocWindowsTs[dwTsNo].SetMessageInTs(pTaskMessage);
                     DocWindowsTs[dwTsNo].SetState(TS_RUNNING);
                     pTaskMessage->SetTsNum(dwTsNo);
                     TransitionRequest* pTransitionRequest = new TransitionRequest;
                     pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                     pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                     pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                     pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                     pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
                  
                     DocWindowsTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                     if(NULL !=  pTransitionRequest)
                     {
                         delete pTransitionRequest;
                         pTransitionRequest = NULL;
                     }
                 }
                 else
                 {
                     DocWindowsTs[dwTsNo].SetState(TS_FREE);
                     DocWindowsTs[dwTsNo].SetMessageInTs(NULL);
                 }
                  
                 break;
             }
         
         }         
        
        if(NULL != pResult)
        {
            delete pResult;
            pResult = NULL;
        }

    }   
    else  if(TS_MESSAGE_DYNAMIC_PPT_RESULT == tsTaskResultType)
    {

        //后面跟应用定了协议之后需要创建新的动态PPT的类        
       AppDynamicPptTransResultMessage*  pResult = new AppDynamicPptTransResultMessage;
        //连接和发送转换结果给应用客户端
        pResult->SetMessageId(taskResult.GetMessageId());
        pResult->SetResult(taskResult.GetResult());
        pResult->SetErrorCode(taskResult.GetErrorCode());   
        pResult->SetPages((taskResult).GetPages());

        //根据转换结果执行相应处理
         
          //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
        TaskMessageList::iterator iterIdCheck;
        for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
            {
                u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
                if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
                {
                    string strAppTargetIp;
                    u32 dwAppTargetPort;
                    if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                    {
                        pResult->SetAppTargetIp(strAppTargetIp);
                        pResult->SetAppTargetPort(dwAppTargetPort);
                        bFind = TRUE;
                          
                    }
                    else
                    {
                    //error
                    }


                    PPTTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    PPTTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
                    //将该任务从运行队列移除,并归还给空闲队列
                    pTaskMessage->Initialize();
                    m_FreeMessageQueue.push_back(pTaskMessage);
                    m_TransDynamicPptRunQueue.erase(iterIdCheck);            
                  
                }
                else
                {
                    bool bFindSecond = FALSE;
                    //查找是否存在除了自己以外的空闲转换服务器,如果找到,把任务交给它重新处理,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {   
                        if((TS_FREE== PPTTs[dwFreeTsNo].GetState()) && (dwFreeTsNo != pTaskMessage->GetTsNum()))
                        {
                            PPTTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            PPTTs[dwFreeTsNo].SetState(TS_RUNNING);
                            PPTTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            PPTTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                            TransitionRequest* pTransitionRequest = new TransitionRequest;
                            pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                            pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                            pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                            pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

                            PPTTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                            if(NULL != pTransitionRequest)
                            {
                                delete pTransitionRequest;
                                pTransitionRequest = NULL;
                             }
                              
                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindSecond = TRUE;
                            break;
                         }
                     }
                     //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                     if(FALSE == bFindSecond)
                     {
                         pTaskMessage->SetPriority(9);
                         m_TransDynamicPptWaitQueue.push(pTaskMessage);
                         PPTTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                         PPTTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
                        
                         TaskMessageList::iterator iterIdCheck;
                         for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
                         {
                             if(*iterIdCheck ==pTaskMessage)
                             {
                                 m_TransDynamicPptRunQueue.erase(iterIdCheck);
                                 break;
                             }
                         }                    
                     }
                     
                     dwRepeatedTimes++;
                     pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
                 }
        
                 break;
             }
         }
         
         if(bFind)
         {
             (SessionManager::GetInstance()).SendAppMessage(*pResult);
         }
        
         //检查任务等待队列是否有转换任务在等待,没有则直接返回
         //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
        
         for(u32 dwTsNo =1; dwTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwTsNo++)
         {
             if(&session ==PPTTs[dwTsNo].GetTsSession())
             {
   //              printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
                 if( !m_TransDynamicPptWaitQueue.empty() )
                 {
                     AppTaskMessage*  pTaskMessage = m_TransDynamicPptWaitQueue.top( );
                     m_TransDynamicPptWaitQueue.pop( );   
                     
                     TaskTimeInfo tTaskTimeInfo ;
                     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                     {
                         return;
                     }
                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                     m_TransDynamicPptRunQueue.push_back(pTaskMessage);
               
                     PPTTs[dwTsNo].SetMessageInTs(pTaskMessage);
                     PPTTs[dwTsNo].SetState(TS_RUNNING);
                     pTaskMessage->SetTsNum(dwTsNo);
                     TransitionRequest* pTransitionRequest = new TransitionRequest;
                     pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                     pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                     pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                     pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                     pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
                  
                     PPTTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                     if(NULL !=  pTransitionRequest)
                     {
                         delete pTransitionRequest;
                         pTransitionRequest = NULL;
                     }
                 }
                 else
                 {
                     PPTTs[dwTsNo].SetState(TS_FREE);
                     PPTTs[dwTsNo].SetMessageInTs(NULL);
                 }
                  
                 break;
             }
         
         }         
        
        if(NULL != pResult)
        {
            delete pResult;
            pResult = NULL;
        }

    }
    else  if(TS_MESSAGE_VIDEO_TRANS_RESULT == tsTaskResultType)
    {
        AppVideoTransResultMessage* pResult;
        pResult = new AppVideoTransResultMessage;
        //连接和发送转换结果给应用客户端
        pResult->SetMessageId(taskResult.GetMessageId());
        pResult->SetResult((taskResult).GetResult());
        pResult->SetErrorCode((taskResult).GetErrorCode());
        if(FALSE != (taskResult).GetResult())
        {
            pResult->SetTargetFullPathFileName( taskResult.GetTargetFolder());
        }
        else
        {
            pResult->SetTargetFullPathFileName("");
        }
        //根据转换结果执行相应处理

        //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
        TaskMessageList::iterator iterIdCheck;
        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
            {
                u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
                if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
                {
                    string strAppTargetIp;
                    u32 dwAppTargetPort;
                    if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                    {
                        pResult->SetAppTargetIp(strAppTargetIp);
                        pResult->SetAppTargetPort(dwAppTargetPort);
                        bFind = TRUE;
                        
                    }
                    else
                    {
                    //error
                    }

                    VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                    
                    //将该任务从运行队列移除,并归还给空闲队列
                    pTaskMessage->Initialize();
                    m_FreeMessageQueue.push_back(pTaskMessage);
                    m_VideoRunQueue.erase(iterIdCheck);            
               
                }
                else
                {
                    bool bFindSecond = FALSE;
                    //查找是否存在除了自己以外的空闲转换服务器,如果找到,把任务交给它重新处理,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {   
                        if((TS_FREE== VideoTs[dwFreeTsNo].GetState()) && (dwFreeTsNo != pTaskMessage->GetTsNum()))
                        {
                            VideoTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            VideoTs[dwFreeTsNo].SetState(TS_RUNNING);                           
                            VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);


                            TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
                            pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                            pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());

                            char cFormat[100];
                            sprintf(cFormat, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwFormat);
                            pTransVideoRequest->SetFormat(cFormat);
                           
                            char cBitRate[100];
                            sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
                            pTransVideoRequest->SetBitRate(cBitRate);
                           
                            char cWidth[100];
                            char cHeight[100];
                            string strWidth,strHeight,strResolution;
                            sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
                            sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
                            strWidth = cWidth;
                            strHeight = cHeight;
                            strResolution = strWidth +"*"+strHeight;
                            pTransVideoRequest->SetResolution(strResolution);
                           
                            VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
                            if(NULL !=  pTransVideoRequest)
                            {
                                delete pTransVideoRequest;
                                pTransVideoRequest = NULL;
                            }

                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindSecond = TRUE;
                            break;
                        }
                    }
                    //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                    if(FALSE == bFindSecond)
                    {
                        pTaskMessage->SetPriority(9);
                        m_VideoWaitQueue.push(pTaskMessage);
                        VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                        VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
                        TaskMessageList::iterator iterIdCheck;
                        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
                        {
                            if(*iterIdCheck ==pTaskMessage)
                            {
                                m_VideoRunQueue.erase(iterIdCheck);
                                break;
                            }
                        }
                    }

                    dwRepeatedTimes++;
                    pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
                }

                break;
            }
        }
        
        if(bFind)
        {
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
        }

        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列

        for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
        {
            if(&session ==VideoTs[dwTsNo].GetTsSession())
            {
    //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
                if( !m_VideoWaitQueue.empty() )
                {
                    AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
                    m_VideoWaitQueue.pop( );  
                    
                    TaskTimeInfo tTaskTimeInfo ;
                    if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                    {
                        return;
                    }
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    m_VideoRunQueue.push_back(pTaskMessage);
            
                    VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    VideoTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);

                    TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
                    pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());

                    char cFormat[100];
                    sprintf(cFormat, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwFormat);
                    pTransVideoRequest->SetFormat(cFormat);

                    char cBitRate[100];
                    sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
                    pTransVideoRequest->SetBitRate(cBitRate);
                    
                    char cWidth[100];
                    char cHeight[100];
                    string strWidth,strHeight,strResolution;
                    sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
                    sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
                    strWidth = cWidth;
                    strHeight = cHeight;
                    strResolution = strWidth +"*"+strHeight;
                    pTransVideoRequest->SetResolution(strResolution);
                    
                    VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
                    if(NULL !=  pTransVideoRequest)
                    {
                        delete pTransVideoRequest;
                        pTransVideoRequest = NULL;
                    }
   
                }
                else
                {
                    VideoTs[dwTsNo].SetState(TS_FREE);
                    VideoTs[dwTsNo].SetMessageInTs(NULL);                                    
                }
               
                break;
            }
        
        }         
        
        if(NULL != pResult)
        {
            delete pResult;
            pResult = NULL;
        }
        
    }
    else  if(TS_MESSAGE_VIDEO_CAPTURE_RESULT == tsTaskResultType)
    {
        AppVideoCaptureResultMessage* pResult;
        pResult = new AppVideoCaptureResultMessage;
        //连接和发送转换结果给应用客户端
        pResult->SetMessageId(taskResult.GetMessageId());
        pResult->SetResult(taskResult.GetResult());
        pResult->SetErrorCode(taskResult.GetErrorCode());
        pResult->SetCount(taskResult.GetCount());

        //根据转换结果执行相应处理
        
        //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
        TaskMessageList::iterator iterIdCheck;
        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
            {
                u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
                if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
                {
                    string strAppTargetIp;
                    u32 dwAppTargetPort;
                    if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                    {
                        pResult->SetAppTargetIp(strAppTargetIp);
                        pResult->SetAppTargetPort(dwAppTargetPort);
                        bFind = TRUE;
                        
                    }
                    else
                    {
                    //error
                    }

                    VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                    
                    //将该任务从运行队列移除,并归还给空闲队列
                    pTaskMessage->Initialize();
                    m_FreeMessageQueue.push_back(pTaskMessage);
                    m_VideoRunQueue.erase(iterIdCheck);            
               
                }
                else
                {
                    bool bFindSecond = FALSE;
                    //查找是否存在除了自己以外的空闲转换服务器,如果找到,把任务交给它重新处理,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {   
                        if((TS_FREE== VideoTs[dwFreeTsNo].GetState()) && (dwFreeTsNo != pTaskMessage->GetTsNum()))
                        {
                            VideoTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            VideoTs[dwFreeTsNo].SetState(TS_RUNNING);                           
                            VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                            CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
                            pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                            pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                            pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                           
                            char cStart[100];
                            sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
                            pCapVideoRequest->SetStart(cStart);
                           
                            char cCount[100];
                            sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
                            pCapVideoRequest->SetCount(cCount);
                           
                           
                            char cInterval[100];
                            sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
                            pCapVideoRequest->SetInterval(cInterval);
                           
                            VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
                            if(NULL !=  pCapVideoRequest)
                            {
                                delete pCapVideoRequest;
                                pCapVideoRequest = NULL;
                            }


                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindSecond = TRUE;
                            break;
                        }
                    }
                    //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                    if(FALSE == bFindSecond)
                    {
                        pTaskMessage->SetPriority(9);
                        m_VideoWaitQueue.push(pTaskMessage);
                        VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                        VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
                        TaskMessageList::iterator iterIdCheck;
                        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
                        {
                            if(*iterIdCheck ==pTaskMessage)
                            {
                                m_VideoRunQueue.erase(iterIdCheck);
                                break;
                            }
                        }
                    }

                    dwRepeatedTimes++;
                    pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
                }

                break;
            }
        }
        
        if(bFind)
        {
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
        }

        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列

        for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
        {
            if(&session ==VideoTs[dwTsNo].GetTsSession())
            {
    //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
                if( !m_VideoWaitQueue.empty() )
                {
                    AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
                    m_VideoWaitQueue.pop( );   
                    
                    TaskTimeInfo tTaskTimeInfo ;
                    if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                    {
                        return;
                    }
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    m_VideoRunQueue.push_back(pTaskMessage);
            
                    VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    VideoTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);

                    CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
                    pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                    pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    
                    char cStart[100];
                    sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
                    pCapVideoRequest->SetStart(cStart);
                    
                    char cCount[100];
                    sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
                    pCapVideoRequest->SetCount(cCount);
                    
                    
                    char cInterval[100];
                    sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
                    pCapVideoRequest->SetInterval(cInterval);
                    
                    VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
                    if(NULL !=  pCapVideoRequest)
                    {
                        delete pCapVideoRequest;
                        pCapVideoRequest = NULL;
                    }

   
                }
                else
                {
                    VideoTs[dwTsNo].SetState(TS_FREE);
                    VideoTs[dwTsNo].SetMessageInTs(NULL);                                    
                }
               
                break;
            }
        
        }         
        
        if(NULL != pResult)
        {
            delete pResult;
            pResult = NULL;
        }
        
    }
    else  if(TS_MESSAGE_VIDEO_INFO_RESULT == tsTaskResultType)
    {
        AppVideoInfoResultMessage* pResult;
        pResult = new AppVideoInfoResultMessage;
        //连接和发送转换结果给应用客户端
        pResult->SetMessageId(taskResult.GetMessageId());

        pResult->SetDuration(atoll(taskResult.GetDuration().c_str()));
        pResult->SetResolution(taskResult.GetResolution());
        pResult->SetAudioCode(taskResult.GetAudioCode());
        pResult->SetVideoCode(taskResult.GetVideoCode());
        pResult->SetAudioTrack(taskResult.GetAudioTrack());
        pResult->SetVideoType(taskResult.GetVideoType());
        pResult->SetFrameRate(atoi(taskResult.GetFrameRate().c_str()));
        pResult->SetBitRate(atoi(taskResult.GetBitRate().c_str()));
        pResult->SetResult((taskResult).GetResult());
        pResult->SetErrorCode((taskResult).GetErrorCode());


        //根据转换结果执行相应处理
        
        //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
        TaskMessageList::iterator iterIdCheck;
        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
            {
                u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
                if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
                {
                    string strAppTargetIp;
                    u32 dwAppTargetPort;
                    if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                    {
                        pResult->SetAppTargetIp(strAppTargetIp);
                        pResult->SetAppTargetPort(dwAppTargetPort);
                        bFind = TRUE;
                        
                    }
                    else
                    {
                    //error
                    }

                    VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                    
                    //将该任务从运行队列移除,并归还给空闲队列
                    pTaskMessage->Initialize();
                    m_FreeMessageQueue.push_back(pTaskMessage);
                    m_VideoRunQueue.erase(iterIdCheck);            
               
                }
                else
                {
                    bool bFindSecond = FALSE;
                    //查找是否存在除了自己以外的空闲转换服务器,如果找到,把任务交给它重新处理,发送任务消息给相关服务器
                    for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwFreeTsNo++)
                    {   
                        if((TS_FREE== VideoTs[dwFreeTsNo].GetState()) && (dwFreeTsNo != pTaskMessage->GetTsNum()))
                        {
                            VideoTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                            VideoTs[dwFreeTsNo].SetState(TS_RUNNING);                           
                            VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                            VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                            GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
                            pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
                            pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                           
                            VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
                            if(NULL !=  pVideoInfoRequest)
                            {
                                delete pVideoInfoRequest;
                                pVideoInfoRequest = NULL;
                            }

                            pTaskMessage->SetTsNum(dwFreeTsNo);
                            bFindSecond = TRUE;
                            break;
                        }
                    }
                    //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                    if(FALSE == bFindSecond)
                    {
                        pTaskMessage->SetPriority(9);
                        m_VideoWaitQueue.push(pTaskMessage);
                        VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                        VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
                        TaskMessageList::iterator iterIdCheck;
                        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
                        {
                            if(*iterIdCheck ==pTaskMessage)
                            {
                                m_VideoRunQueue.erase(iterIdCheck);
                                break;
                            }
                        }
                    }

                    dwRepeatedTimes++;
                    pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
                }

                break;
            }
        }
        
        if(bFind)
        {
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
        }

        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列

        for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
        {
            if(&session ==VideoTs[dwTsNo].GetTsSession())
            {
    //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
                if( !m_VideoWaitQueue.empty() )
                {
                    AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
                    m_VideoWaitQueue.pop( );   
                    
                    TaskTimeInfo tTaskTimeInfo ;
                    if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                    {
                        return;
                    }
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    m_VideoRunQueue.push_back(pTaskMessage);
            
                    VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    VideoTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);

                    GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
                    pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());

                    VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
                    if(NULL !=  pVideoInfoRequest)
                    {
                        delete pVideoInfoRequest;
                        pVideoInfoRequest = NULL;
                    }

   
                }
                else
                {
                    VideoTs[dwTsNo].SetState(TS_FREE);
                    VideoTs[dwTsNo].SetMessageInTs(NULL);                                    
                }
               
                break;
            }
        
        }         
        
        if(NULL != pResult)
        {
            delete pResult;
            pResult = NULL;
        }
        
    }
    else  //if(TS_MESSAGE_PRINT_SCREEN_PROGRESS_RESULT == tsTaskResultType)
    {
        
    }


}

void DsManage::OnServerLeave(TsSession &session)    //服务器掉线等事件,网络断开与心跳检测失败;
{
    LoggerWrapper dsLog= LoggerWrapper::GetInstance();
    static int leavecount = 0;
//    printf("OnServerLeave enter++++++++++++++++,count:%d\n",++leavecount);
    dsLog.Log(TRUE,LOGGER_DEBUG,"OnServerLeave enter,session:%d,count:%d , [%s][%s][%d]\n",&session,++leavecount,__FILE__,__PRETTY_FUNCTION__,__LINE__);        
    bool bFindServer = FALSE;
//检查服务器是否有任务在处理,没有直接返回,约定底层已经close  session了
    for(u32 dwTsNo =1; dwTsNo <MAX_DOC_TRANS_SERVER_NUM; dwTsNo++)
    {
  //      printf("OnServerLeave 1111 dwTsNo:%d++++++++++++++++\n",dwTsNo);
        if(&session ==DocTs[dwTsNo].GetTsSession())
        {
            bFindServer = TRUE;
   //         printf("OnServerLeave 2222 dwTsNo:%d++++++++++++++++\n",dwTsNo);
  //          printf("DocTs[dwTsNo].GetState():%d\n",DocTs[dwTsNo].GetState());
            if(NULL ==  DocTs[dwTsNo].GetMessageInTs())
                printf(" DocTs[dwTsNo].GetMessageInTs() is NULL\n");
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if(/*(TS_RUNNING== DocTs[dwTsNo].GetState()) &&*/(NULL != DocTs[dwTsNo].GetMessageInTs() ))
            {
//                printf("OnServerLeave 3333  dwTsNo:%d++++++++++++++++\n",dwTsNo);
                //如果有任务处理,查找是否有可用其他同类转换服务器空闲
                bool bFind = FALSE;
                //如果有同类转换服务器空闲,直接将该任务分配给该服务器,发送任务消息给相关服务器
                for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DOC_TRANS_SERVER_NUM; dwFreeTsNo++)
                {
//                    printf("OnServerLeave 4444 dwTsNo:%d, dwFreeTsNo:%d++++++++++++++++\n",dwTsNo,dwFreeTsNo);
                    if((TS_FREE== DocTs[dwFreeTsNo].GetState())&&(dwFreeTsNo != dwTsNo))
                    {
                        DocTs[dwFreeTsNo].SetMessageInTs(DocTs[dwTsNo].GetMessageInTs());
                        DocTs[dwFreeTsNo].SetState(TS_RUNNING);
                        DocTs[dwTsNo].SetState(TS_UNREGISTERED);
                        DocTs[dwTsNo].SetMessageInTs(NULL);
                        ((AppTaskMessage*)(DocTs[dwFreeTsNo].GetMessageInTs()))->SetTsNum(dwFreeTsNo);

                        TransitionRequest* pTransitionRequest = new TransitionRequest;
                        pTransitionRequest->SetMessageId(((AppTaskMessage*)(DocTs[dwFreeTsNo].GetMessageInTs()))->GetMessageId());
                        pTransitionRequest->SetSrcFile(((AppTaskMessage*)(DocTs[dwFreeTsNo].GetMessageInTs()))->GetFullPathFileName());
                        pTransitionRequest->SetTargetFolder(((AppTaskMessage*)(DocTs[dwFreeTsNo].GetMessageInTs()))->GetTargetFullPathFileName());
                        pTransitionRequest->SetPrefix(((AppTaskMessage*)(DocTs[dwFreeTsNo].GetMessageInTs()))->GetFilePrefix());
                        pTransitionRequest->SetTransType(((AppTaskMessage*)(DocTs[dwFreeTsNo].GetMessageInTs()))->GetMessagePara().unTransDoc.enumTansType);

                        DocTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                        if(NULL != pTransitionRequest)
                        {
                            delete pTransitionRequest;
                            pTransitionRequest = NULL;
                        }
                        bFind = TRUE;
                        break;
                    }
                }
               
                //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                if(FALSE == bFind)
                {
//                    printf("OnServerLeave 555 dwTsNo:%d ++++++++++++++++\n",dwTsNo);
                    ((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs()))->SetPriority(9);                  

                    m_TransDocWaitQueue.push((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs()));
                    TaskMessageList::iterator iterIdCheck;
                    for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
                    {
//                        printf("OnServerLeave 6666 dwTsNo:%d,++++++++++++++++\n",dwTsNo);
                        if(*iterIdCheck ==((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs())))
                        {
//                            printf("OnServerLeave 7777 dwTsNo:%d:%d++++++++++++++++\n",dwTsNo);
                            m_TransDocRunQueue.erase(iterIdCheck);
                            break;
                        }
                    }

                    ((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                          
                }
               
//                break;
            }

            DocTs[dwTsNo].SetState(TS_UNREGISTERED);
            DocTs[dwTsNo].SetMessageInTs(NULL);
            break;
        }
    }           

    if( TRUE == bFindServer)
    {
        return ;
    }

    for(u32 dwTsNo =1; dwTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwTsNo++)
    {
//        printf("OnServerLeave 8888++++++++++++++++\n");
        if(&session ==DocWindowsTs[dwTsNo].GetTsSession())
        {
            bFindServer = TRUE;
//            printf("OnServerLeave 9999++++++++++++++++\n");
//           printf("DocTs[dwTsNo].GetState():%d\n",PPTTs[dwTsNo].GetState());
            if(NULL ==  DocWindowsTs[dwTsNo].GetMessageInTs())
                printf(" DocWindowsTs[dwTsNo].GetMessageInTs() is NULL\n");
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if((NULL != DocWindowsTs[dwTsNo].GetMessageInTs() ))
            {
//               printf("OnServerLeave aaaa++++++++++++++++\n");
                //如果有任务处理,查找是否有可用其他同类转换服务器空闲
                bool bFind = FALSE;
                //如果有同类转换服务器空闲,直接将该任务分配给该服务器,发送任务消息给相关服务器
                for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwFreeTsNo++)
                {
//                   printf("OnServerLeave bbbbb++++++++++++++++\n");

                    if((TS_FREE== DocWindowsTs[dwFreeTsNo].GetState())&&(dwFreeTsNo != dwTsNo))  
                    {
                        DocWindowsTs[dwFreeTsNo].SetMessageInTs(DocWindowsTs[dwTsNo].GetMessageInTs());
                        DocWindowsTs[dwFreeTsNo].SetState(TS_RUNNING);
                        DocWindowsTs[dwTsNo].SetState(TS_UNREGISTERED);
                        DocWindowsTs[dwTsNo].SetMessageInTs(NULL);
                        ((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->SetTsNum(dwFreeTsNo);

                        TransitionRequest* pTransitionRequest = new TransitionRequest;
                        pTransitionRequest->SetMessageId(((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->GetMessageId());
                        pTransitionRequest->SetSrcFile(((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->GetFullPathFileName());
                        pTransitionRequest->SetTargetFolder(((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->GetTargetFullPathFileName());
                        pTransitionRequest->SetPrefix(((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->GetFilePrefix());
                        pTransitionRequest->SetTransType(((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->GetMessagePara().unTransDoc.enumTansType);

                        DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                        if(NULL != pTransitionRequest)
                        {
                            delete pTransitionRequest;
                            pTransitionRequest = NULL;
                        }
                        bFind = TRUE;
                        break;
                    }
                }

                //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                if(FALSE == bFind)
                {
  //                  printf("OnServerLeave cccc++++++++++++++++\n");
                    ((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs()))->SetPriority(9);

                    m_TransDocWindowsWaitQueue.push((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs()));
                    TaskMessageList::iterator iterIdCheck;
                    for (iterIdCheck=m_TransDocWindowsRunQueue.begin(); iterIdCheck!=m_TransDocWindowsRunQueue.end(); iterIdCheck++)
                    {
//                        printf("OnServerLeave dddd++++++++++++++++\n");
                        if(*iterIdCheck ==((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs())))
                        {
//                           printf("OnServerLeave eeeee++++++++++++++++\n");
                            m_TransDocWindowsRunQueue.erase(iterIdCheck);
                            break;
                        }
                    }   

                    ((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                    
                }
               
//                break;
            }

            DocWindowsTs[dwTsNo].SetState(TS_UNREGISTERED);
            DocWindowsTs[dwTsNo].SetMessageInTs(NULL);
            break;
        }
    }      

    if( TRUE == bFindServer)
    {
        return ;
    }

    for(u32 dwTsNo =1; dwTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwTsNo++)
    {
//        printf("OnServerLeave 8888++++++++++++++++\n");
        if(&session ==PPTTs[dwTsNo].GetTsSession())
        {
            bFindServer = TRUE;
//            printf("OnServerLeave 9999++++++++++++++++\n");
//           printf("DocTs[dwTsNo].GetState():%d\n",PPTTs[dwTsNo].GetState());
            if(NULL ==  PPTTs[dwTsNo].GetMessageInTs())
                printf(" PPTTs[dwTsNo].GetMessageInTs() is NULL\n");
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if(/*(TS_RUNNING== PPTTs[dwTsNo].GetState()) &&*/(NULL != PPTTs[dwTsNo].GetMessageInTs() ))
            {
//               printf("OnServerLeave aaaa++++++++++++++++\n");
                //如果有任务处理,查找是否有可用其他同类转换服务器空闲
                bool bFind = FALSE;
                //如果有同类转换服务器空闲,直接将该任务分配给该服务器,发送任务消息给相关服务器
                for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwFreeTsNo++)
                {
//                   printf("OnServerLeave bbbbb++++++++++++++++\n");

                    if((TS_FREE== PPTTs[dwFreeTsNo].GetState())&&(dwFreeTsNo != dwTsNo))  
                    {
                        PPTTs[dwFreeTsNo].SetMessageInTs(PPTTs[dwTsNo].GetMessageInTs());
                        PPTTs[dwFreeTsNo].SetState(TS_RUNNING);
                        PPTTs[dwTsNo].SetState(TS_UNREGISTERED);
                        PPTTs[dwTsNo].SetMessageInTs(NULL);
                        ((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->SetTsNum(dwFreeTsNo);

                        TransitionRequest* pTransitionRequest = new TransitionRequest;
                        pTransitionRequest->SetMessageId(((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->GetMessageId());
                        pTransitionRequest->SetSrcFile(((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->GetFullPathFileName());
                        pTransitionRequest->SetTargetFolder(((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->GetTargetFullPathFileName());
                        pTransitionRequest->SetPrefix(((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->GetFilePrefix());
                        pTransitionRequest->SetTransType(((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->GetMessagePara().unTransDoc.enumTansType);

                        PPTTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                        if(NULL != pTransitionRequest)
                        {
                            delete pTransitionRequest;
                            pTransitionRequest = NULL;
                        }
                        bFind = TRUE;
                        break;
                    }
                }

                //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                if(FALSE == bFind)
                {
  //                  printf("OnServerLeave cccc++++++++++++++++\n");
                    ((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs()))->SetPriority(9);

                    m_TransDynamicPptWaitQueue.push((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs()));
                    TaskMessageList::iterator iterIdCheck;
                    for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
                    {
//                        printf("OnServerLeave dddd++++++++++++++++\n");
                        if(*iterIdCheck ==((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs())))
                        {
//                           printf("OnServerLeave eeeee++++++++++++++++\n");
                            m_TransDynamicPptRunQueue.erase(iterIdCheck);
                            break;
                        }
                    }   

                    ((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                    
                }
               
//                break;
            }

            PPTTs[dwTsNo].SetState(TS_UNREGISTERED);
            PPTTs[dwTsNo].SetMessageInTs(NULL);
            break;
        }
    }      

    if( TRUE == bFindServer)
    {
        return ;
    }

    for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
    {
        if(&session ==VideoTs[dwTsNo].GetTsSession())
        {
            bFindServer = TRUE;

            if(NULL ==  VideoTs[dwTsNo].GetMessageInTs())
                printf(" VideoTs[dwTsNo].GetMessageInTs() is NULL\n");
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if((NULL != VideoTs[dwTsNo].GetMessageInTs() ))
            {
                //如果有任务处理,查找是否有可用其他同类转换服务器空闲
                bool bFind = FALSE;
                //如果有同类转换服务器空闲,直接将该任务分配给该服务器,发送任务消息给相关服务器
                for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwFreeTsNo++)
                {
                    if((TS_FREE== VideoTs[dwFreeTsNo].GetState())&&(dwFreeTsNo != dwTsNo))
                    {
                        VideoTs[dwFreeTsNo].SetMessageInTs(VideoTs[dwTsNo].GetMessageInTs());
                        VideoTs[dwFreeTsNo].SetState(TS_RUNNING);
                        VideoTs[dwTsNo].SetState(TS_UNREGISTERED);
                        VideoTs[dwTsNo].SetMessageInTs(NULL);
                        ((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()))->SetTsNum(dwFreeTsNo);
#if 0
                        TransitionRequest* pTransitionRequest = new TransitionRequest;
                        pTransitionRequest->SetMessageId(((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()))->GetMessageId());
                        pTransitionRequest->SetSrcFile(((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()))->GetFullPathFileName());
                        pTransitionRequest->SetTargetFolder(((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()))->GetTargetFullPathFileName());
                        pTransitionRequest->SetPrefix(((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()))->GetFilePrefix());
                        pTransitionRequest->SetTransType(((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()))->GetMessagePara().unTransDoc.enumTansType);

                        VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                        if(NULL != pTransitionRequest)
                        {
                            delete pTransitionRequest;
                            pTransitionRequest = NULL;
                        }
#endif
                        AppTaskMessage* pAppTaskMessage = ((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()));
                        if(APP_MESSAGE_VIDEO_TRANS_TASK == pAppTaskMessage->GetAppMessageType())
                        {
                            TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
                            pTransVideoRequest->SetMessageId(pAppTaskMessage->GetMessageId());
                            pTransVideoRequest->SetSrcFile(pAppTaskMessage->GetFullPathFileName());
                            pTransVideoRequest->SetTargetFolder(pAppTaskMessage->GetTargetFullPathFileName());
                           
                        
                            char cFormat[100];
                            sprintf(cFormat, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwFormat);
                            pTransVideoRequest->SetFormat(cFormat);
                        
                            char cBitRate[100];
                            sprintf(cBitRate, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
                            pTransVideoRequest->SetBitRate(cBitRate);
                        
                            char cWidth[100];
                            char cHeight[100];
                            string strWidth,strHeight,strResolution;
                            sprintf(cWidth, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
                            sprintf(cHeight, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
                            strWidth = cWidth;
                            strHeight = cHeight;
                            strResolution = strWidth +"*"+strHeight;
                            pTransVideoRequest->SetResolution(strResolution);
                        
                            VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
                            if(NULL != pTransVideoRequest)
                            {
                                delete pTransVideoRequest;
                                pTransVideoRequest = NULL;
                            }
                            break;
                        }
                        else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == pAppTaskMessage->GetAppMessageType())
                        {
                            CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
                            pCapVideoRequest->SetMessageId(pAppTaskMessage->GetMessageId());
                            pCapVideoRequest->SetSrcFile(pAppTaskMessage->GetFullPathFileName());
                            pCapVideoRequest->SetTargetFolder(pAppTaskMessage->GetTargetFullPathFileName());
                            pCapVideoRequest->SetPrefix(pAppTaskMessage->GetFilePrefix());
                        
                            char cStart[100];
                            sprintf(cStart, "%d", pAppTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
                            pCapVideoRequest->SetStart(cStart);
                        
                            char cCount[100];
                            sprintf(cCount, "%d", pAppTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
                            pCapVideoRequest->SetCount(cCount);
                        
                        
                            char cInterval[100];
                            sprintf(cInterval, "%d", pAppTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
                            pCapVideoRequest->SetInterval(cInterval);
                           
                            VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
                            if(NULL !=  pCapVideoRequest)
                            {
                                delete pCapVideoRequest;
                                pCapVideoRequest = NULL;
                            }
                        }
                        else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
                        {
                            GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
                            pVideoInfoRequest->SetMessageId(pAppTaskMessage->GetMessageId());
                            pVideoInfoRequest->SetSrcFile(pAppTaskMessage->GetFullPathFileName());
                           
                            VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
                            if(NULL !=  pVideoInfoRequest)
                            {
                                delete pVideoInfoRequest;
                                pVideoInfoRequest = NULL;
                            }
                        }

                        
                        bFind = TRUE;
                        break;
                    }
                }
               
                //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
                if(FALSE == bFind)
                {
//                    printf("OnServerLeave 555 dwTsNo:%d ++++++++++++++++\n",dwTsNo);
                    ((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs()))->SetPriority(9);                  

                    m_VideoWaitQueue.push((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs()));
                    TaskMessageList::iterator iterIdCheck;
                    for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
                    {
//                        printf("OnServerLeave 6666 dwTsNo:%d,++++++++++++++++\n",dwTsNo);
                        if(*iterIdCheck ==((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs())))
                        {
                            m_VideoRunQueue.erase(iterIdCheck);
                            break;
                        }
                    }

                    ((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                          
                }
               
//                break;
            }

            VideoTs[dwTsNo].SetState(TS_UNREGISTERED);
            VideoTs[dwTsNo].SetMessageInTs(NULL);
            break;
        }
    }        
}

void DsManage::OnSessionError(TsSession &session)   //协议解析失败等,一般仅仅需要关闭session   
{
    LoggerWrapper dsLog= LoggerWrapper::GetInstance();
    dsLog.Log(TRUE,LOGGER_DEBUG,"OnSessionError enter,session:%d , [%s][%s][%d]\n",&session,__FILE__,__PRETTY_FUNCTION__,__LINE__);        

//    printf("OnSessionError enter++++++++++++++++\n");
    OnServerLeave(session);
    //关闭本session
   session.Close();
}

void DsManage::OnNewTask(AppTaskMessage &taskInfo)
{
    string strMessageId = taskInfo.GetMessageId();
    //首先检查该任务是否已在运行列表或者等待列表,如果已存在,给应用客户端返回错误码,并返回
    bool bFind = FALSE;  
    bool bFree = FALSE;
    LoggerWrapper dsLog= LoggerWrapper::GetInstance();
//    g_Dslogger = Logger::getLogger("DsManage::OnNewTask");
    static int count =0;
    count ++;
    dsLog.Log(TRUE,LOGGER_DEBUG,"OnNewTask,count:%d , [%s][%s][%d]\n",count,__FILE__,__PRETTY_FUNCTION__,__LINE__);      


//   printf("OnNewTask,count:%d\n",count);
    AppMessageType tAppMessageType = taskInfo.GetAppMessageType();
    if(APP_MESSAGE_DOC_TRANS_TASK == tAppMessageType)
    {
        TaskMessageList::const_iterator iterIdCheck;
        for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == strMessageId)
            {
                bFind = TRUE;
                break;
            }
        }

        if(FALSE == bFind)
        {
            AppTaskMessage* pTaskMessage;
            TaskMessagePriorityQueue tmpQueue;
            while ( !m_TransDocWaitQueue.empty() )
            {
                pTaskMessage = m_TransDocWaitQueue.top( );
                m_TransDocWaitQueue.pop( );
                if(pTaskMessage->GetMessageId() == strMessageId)
                {
                    bFind = TRUE;
                }

                tmpQueue.push( pTaskMessage );
            }
            while ( !tmpQueue.empty() )
            {
                pTaskMessage = tmpQueue.top( );
                tmpQueue.pop( );
                m_TransDocWaitQueue.push(pTaskMessage );
            }
            
        }

        //检查是否在windows文档转换列表中
        for (iterIdCheck=m_TransDocWindowsRunQueue.begin(); iterIdCheck!=m_TransDocWindowsRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == strMessageId)
            {
                bFind = TRUE;
                break;
            }
        }

        if(FALSE == bFind)
        {
            AppTaskMessage* pTaskMessage;
            TaskMessagePriorityQueue tmpQueue;
            while ( !m_TransDocWindowsWaitQueue.empty() )
            {
                pTaskMessage = m_TransDocWindowsWaitQueue.top( );
                m_TransDocWindowsWaitQueue.pop( );
                if(pTaskMessage->GetMessageId() == strMessageId)
                {
                    bFind = TRUE;
                }

                tmpQueue.push( pTaskMessage );
            }
            while ( !tmpQueue.empty() )
            {
                pTaskMessage = tmpQueue.top( );
                tmpQueue.pop( );
                m_TransDocWindowsWaitQueue.push(pTaskMessage );
            }
            
        }        

        if(TRUE == bFind)
        {
            //发送错误信息给应用客户端
            AppDocTransResultMessage* pResult = new AppDocTransResultMessage;
            pResult->SetMessageId(taskInfo.GetMessageId());
            pResult->SetResult(FALSE);
            pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
            pResult->SetAppTargetIp(taskInfo.GetIpAddr());
            pResult->SetAppTargetPort(taskInfo.GetPort());
  
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
            dsLog.Log(TRUE,LOGGER_ERROR,"error message from application client. Repeated Message ID:%s , [%s][%s][%d]\n",taskInfo.GetMessageId().c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);   
//            LOG4CXX_ERROR(g_Dslogger, "error message from application client. Repeated Message ID: ");
//            LOG4CXX_ERROR(g_Dslogger, taskInfo.GetMessageId());
            if(NULL != pResult )
            {
              delete pResult;
                          pResult = NULL;

                        }
            return;
        }
        
        //分发服务器创建一个消息任务的拷贝,避免下层上报的消息在函数返回后被销毁
//        printf("000  target:%s,prefix:%s,type:%d\n",taskInfo.GetTargetFullPathFileName().c_str(),taskInfo.GetFilePrefix().c_str(),taskInfo.GetMessagePara().unTransDoc.enumTansType);        
        AppTaskMessage* pNewAppTaskMessage;
        MessageNew(&pNewAppTaskMessage);
        memcpy(pNewAppTaskMessage,&taskInfo,sizeof(AppTaskMessage));
//                printf("111  target:%s,prefix:%s,type:%d\n",pNewAppTaskMessage->GetTargetFullPathFileName().c_str(),pNewAppTaskMessage->GetFilePrefix().c_str(),pNewAppTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
        //再检查是否有空闲的转换服务器?
        for(u32 dwTsNo =1; dwTsNo <MAX_DOC_TRANS_SERVER_NUM; dwTsNo++)
        {
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if(TS_FREE == DocTs[dwTsNo].GetState())
            {            
            
                TaskTimeInfo tTaskTimeInfo ;
                if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                {
                    return;
                }
                pNewAppTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                m_TransDocRunQueue.push_back(pNewAppTaskMessage);
                bFree = TRUE;
                DocTs[dwTsNo].SetMessageInTs(pNewAppTaskMessage);
                DocTs[dwTsNo].SetState(TS_RUNNING);
                pNewAppTaskMessage->SetTsNum(dwTsNo);

                TransitionRequest* pTransitionRequest = new TransitionRequest;
                pTransitionRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
                pTransitionRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
                pTransitionRequest->SetTargetFolder(pNewAppTaskMessage->GetTargetFullPathFileName());
                pTransitionRequest->SetPrefix(pNewAppTaskMessage->GetFilePrefix());
                pTransitionRequest->SetTransType(pNewAppTaskMessage->GetMessagePara().unTransDoc.enumTansType);

//                printf("222  target:%s,prefix:%s\n",pTransitionRequest->GetTargetFolder().c_str(),pTransitionRequest->GetPrefix().c_str());
                DocTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                if(NULL != pTransitionRequest)
                {
                    delete pTransitionRequest;
                    pTransitionRequest = NULL;
                }
                break;
            }
        }
        
        //如果没有空闲的转换服务器,将该任务加入等待列表
        if(FALSE == bFree)
        {   
            m_TransDocWaitQueue.push(pNewAppTaskMessage);
//            AppTaskMessage* p=m_TransDocWaitQueue.top();
//            printf("333  target:%s,prefix:%s,type:%d\n",p->GetTargetFullPathFileName().c_str(),p->GetFilePrefix().c_str(),p->GetMessagePara().unTransDoc.enumTansType);        
            printf("m_TransDocWaitQueue.size:%d\n",m_TransDocWaitQueue.size());
        }
    }
    else if((APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)||(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)||(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType))
    {
        TaskMessageList::const_iterator iterIdCheck;
        for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == strMessageId)
            {
                bFind = TRUE;
                break;
            }
        }

        if(FALSE == bFind)
        {
            AppTaskMessage* pTaskMessage;
            TaskMessagePriorityQueue tmpQueue;
            while ( !m_VideoWaitQueue.empty() )
            {
                pTaskMessage = m_VideoWaitQueue.top( );
                m_VideoWaitQueue.pop( );
                if(pTaskMessage->GetMessageId() == strMessageId)
                {
                    bFind = TRUE;
                }

                tmpQueue.push( pTaskMessage );
            }
            while ( !tmpQueue.empty() )
            {
                pTaskMessage = tmpQueue.top( );
                tmpQueue.pop( );
                m_VideoWaitQueue.push(pTaskMessage );
            }
            
        }

        if(TRUE == bFind)
        {
            //发送错误信息给应用客户端
            if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
            {
                AppVideoTransResultMessage* pResult = new AppVideoTransResultMessage;
                pResult->SetMessageId(taskInfo.GetMessageId());
                pResult->SetResult(FALSE);
                pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
                pResult->SetAppTargetIp(taskInfo.GetIpAddr());
                pResult->SetAppTargetPort(taskInfo.GetPort());
      
                (SessionManager::GetInstance()).SendAppMessage(*pResult);

                                if(NULL != pResult)
                                {
                                   delete pResult;
                                   pResult = NULL;


                                }

  
                               
            }
            else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
            {
                AppVideoCaptureResultMessage* pResult = new AppVideoCaptureResultMessage;
                pResult->SetMessageId(taskInfo.GetMessageId());
                pResult->SetResult(FALSE);
                pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
                pResult->SetAppTargetIp(taskInfo.GetIpAddr());
                pResult->SetAppTargetPort(taskInfo.GetPort());
      
                (SessionManager::GetInstance()).SendAppMessage(*pResult);

                                if(NULL != pResult)
                                {
                                   delete pResult;
                                   pResult = NULL;
                                }
            }
            else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
            {
                AppVideoInfoResultMessage* pResult = new AppVideoInfoResultMessage;
                pResult->SetMessageId(taskInfo.GetMessageId());
                pResult->SetResult(FALSE);
                pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
                pResult->SetAppTargetIp(taskInfo.GetIpAddr());
                pResult->SetAppTargetPort(taskInfo.GetPort());
      
                (SessionManager::GetInstance()).SendAppMessage(*pResult);

                                if(NULL != pResult)
                                {
                                   delete pResult;
                                   pResult = NULL;
                                }
            }
            dsLog.Log(TRUE,LOGGER_ERROR,"error message from application client. Repeated Message ID:%s , [%s][%s][%d]\n",taskInfo.GetMessageId().c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);   
            return;
        }
        
        //分发服务器创建一个消息任务的拷贝,避免下层上报的消息在函数返回后被销毁
//        printf("000  target:%s,prefix:%s,type:%d\n",taskInfo.GetTargetFullPathFileName().c_str(),taskInfo.GetFilePrefix().c_str(),taskInfo.GetMessagePara().unTransDoc.enumTansType);        
        AppTaskMessage* pNewAppTaskMessage;
        MessageNew(&pNewAppTaskMessage);
        memcpy(pNewAppTaskMessage,&taskInfo,sizeof(AppTaskMessage));
//                printf("111  target:%s,prefix:%s,type:%d\n",pNewAppTaskMessage->GetTargetFullPathFileName().c_str(),pNewAppTaskMessage->GetFilePrefix().c_str(),pNewAppTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
        //再检查是否有空闲的转换服务器?
        for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
        {
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if(TS_FREE == VideoTs[dwTsNo].GetState())
            {      
                TaskTimeInfo tTaskTimeInfo ;
                if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                {
                    return;
                }
                pNewAppTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);            
                m_VideoRunQueue.push_back(pNewAppTaskMessage);
                bFree = TRUE;
                VideoTs[dwTsNo].SetMessageInTs(pNewAppTaskMessage);
                VideoTs[dwTsNo].SetState(TS_RUNNING);
                pNewAppTaskMessage->SetTsNum(dwTsNo);

                if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
                {
                    TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
                    pTransVideoRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
                    pTransVideoRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
                    pTransVideoRequest->SetTargetFolder(pNewAppTaskMessage->GetTargetFullPathFileName());
                    

                    char cFormat[100];
                    sprintf(cFormat, "%d", pNewAppTaskMessage->GetMessagePara().unTransVideo.dwFormat);
                    pTransVideoRequest->SetFormat(cFormat);

                    char cBitRate[100];
                    sprintf(cBitRate, "%d", pNewAppTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
                    pTransVideoRequest->SetBitRate(cBitRate);

                    char cWidth[100];
                    char cHeight[100];
                    string strWidth,strHeight,strResolution;
                    sprintf(cWidth, "%d", pNewAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
                    sprintf(cHeight, "%d", pNewAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
                    strWidth = cWidth;
                    strHeight = cHeight;
                    strResolution = strWidth +"*"+strHeight;
                    pTransVideoRequest->SetResolution(strResolution);

                    VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
                    if(NULL != pTransVideoRequest)
                    {
                        delete pTransVideoRequest;
                        pTransVideoRequest = NULL;
                    }
                    break;
                }
                else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
                {
                    CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
                    pCapVideoRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
                    pCapVideoRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
                    pCapVideoRequest->SetTargetFolder(pNewAppTaskMessage->GetTargetFullPathFileName());
                    pCapVideoRequest->SetPrefix(pNewAppTaskMessage->GetFilePrefix());

                    char cStart[100];
                    sprintf(cStart, "%d", pNewAppTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
                    pCapVideoRequest->SetStart(cStart);

                    char cCount[100];
                    sprintf(cCount, "%d", pNewAppTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
                    pCapVideoRequest->SetCount(cCount);


                    char cInterval[100];
                    sprintf(cInterval, "%d", pNewAppTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
                    pCapVideoRequest->SetInterval(cInterval);
                    
                    VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
                    if(NULL !=  pCapVideoRequest)
                    {
                        delete pCapVideoRequest;
                        pCapVideoRequest = NULL;
                    }
                    break;
                }
                else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
                {
                    GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
                    pVideoInfoRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
                    pVideoInfoRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
                    
                    VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
                    if(NULL !=  pVideoInfoRequest)
                    {
                        delete pVideoInfoRequest;
                        pVideoInfoRequest = NULL;
                    }
                    break;
                }
            }
        }
        
        //如果没有空闲的转换服务器,将该任务加入等待列表
        if(FALSE == bFree)
        {   
            m_VideoWaitQueue.push(pNewAppTaskMessage);
//            AppTaskMessage* p=m_TransDocWaitQueue.top();
//            printf("333  target:%s,prefix:%s,type:%d\n",p->GetTargetFullPathFileName().c_str(),p->GetFilePrefix().c_str(),p->GetMessagePara().unTransDoc.enumTansType);        
            printf("m_VideoWaitQueue.size:%d\n",m_VideoWaitQueue.size());
        }
    }   
    else if(APP_MESSAGE_DYNAMIC_PPT_TRANS_TASK == tAppMessageType)
    {
        TaskMessageList::const_iterator iterIdCheck;
        for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
        {
            AppTaskMessage* pTaskMessage = *iterIdCheck;
            if(pTaskMessage->GetMessageId() == strMessageId)
            {
                bFind = TRUE;
                break;
            }
        }

        if(FALSE == bFind)
        {
            AppTaskMessage* pTaskMessage;
            TaskMessagePriorityQueue tmpQueue;
            while ( !m_TransDynamicPptWaitQueue.empty() )
            {
                pTaskMessage = m_TransDynamicPptWaitQueue.top( );
                m_TransDynamicPptWaitQueue.pop( );
                if(pTaskMessage->GetMessageId() == strMessageId)
                {
                    bFind = TRUE;
                }

                tmpQueue.push( pTaskMessage );
            }
            while ( !tmpQueue.empty() )
            {
                pTaskMessage = tmpQueue.top( );
                tmpQueue.pop( );
                m_TransDynamicPptWaitQueue.push(pTaskMessage );
            }
            
        }

        if(TRUE == bFind)
        {
            //发送错误信息给应用客户端
            //后面跟应用定了协议之后需要创建新的动态PPT的类        
            AppDynamicPptTransResultMessage*  pResult = new AppDynamicPptTransResultMessage;

            pResult->SetMessageId(taskInfo.GetMessageId());
            pResult->SetResult(FALSE);
            pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
            pResult->SetAppTargetIp(taskInfo.GetIpAddr());
            pResult->SetAppTargetPort(taskInfo.GetPort());
  
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
            dsLog.Log(TRUE,LOGGER_ERROR,"error message from application client. Repeated Message ID:%s , [%s][%s][%d]\n",taskInfo.GetMessageId().c_str(),__FILE__,__PRETTY_FUNCTION__,__LINE__);               
//            LOG4CXX_ERROR(g_Dslogger, "error message from application client. Repeated Message ID: ");
//            LOG4CXX_ERROR(g_Dslogger, taskInfo.GetMessageId());

            
                                if(NULL != pResult)
                                {
                                   delete pResult;
                                   pResult = NULL;
                                }
             return;
        }

        //分发服务器创建一个消息任务的拷贝,避免下层上报的消息在函数返回后被销毁
  //      printf("aaaa  target:%s,prefix:%s,type:%d\n",taskInfo.GetTargetFullPathFileName().c_str(),taskInfo.GetFilePrefix().c_str(),taskInfo.GetMessagePara().unTransDoc.enumTansType);        
        AppTaskMessage* pNewAppTaskMessage;
        MessageNew(&pNewAppTaskMessage);
        memcpy(pNewAppTaskMessage,&taskInfo,sizeof(AppTaskMessage));
//                printf("bbb  target:%s,prefix:%s,type:%d\n",pNewAppTaskMessage->GetTargetFullPathFileName().c_str(),pNewAppTaskMessage->GetFilePrefix().c_str(),pNewAppTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
        //再检查是否有空闲的转换服务器?      
        for(u32 dwTsNo =1; dwTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwTsNo++)
        {
     //       printf("PPTTs[dwTsNo].GetState():%d,dwTsNo:%d\n",PPTTs[dwTsNo].GetState(),dwTsNo);
            //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
            if(TS_FREE == PPTTs[dwTsNo].GetState())
            {
        //        printf("find free ppt server dwtsno:%d\n",dwTsNo);
                TaskTimeInfo tTaskTimeInfo ;
                if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
                {
                    return;
                }
                pNewAppTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);         
                m_TransDynamicPptRunQueue.push_back(pNewAppTaskMessage);
                bFree = TRUE;
                PPTTs[dwTsNo].SetMessageInTs(pNewAppTaskMessage);
                PPTTs[dwTsNo].SetState(TS_RUNNING);
                pNewAppTaskMessage->SetTsNum(dwTsNo);

                TransitionRequest* pTransitionRequest = new TransitionRequest;
                pTransitionRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
                pTransitionRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
                pTransitionRequest->SetTargetFolder(pNewAppTaskMessage->GetTargetFullPathFileName());
                pTransitionRequest->SetPrefix(pNewAppTaskMessage->GetFilePrefix());
                pTransitionRequest->SetTransType(pNewAppTaskMessage->GetMessagePara().unTransDoc.enumTansType);

//               printf("ccc  target:%s,prefix:%s\n",pTransitionRequest->GetTargetFolder().c_str(),pTransitionRequest->GetPrefix().c_str());
                PPTTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                if(NULL != pTransitionRequest)
                {
                    delete pTransitionRequest;
                    pTransitionRequest = NULL;
                }
                break;
            }
        }

        //如果没有空闲的转换服务器,将该任务加入等待列表
        if(FALSE == bFree)
        {   
            m_TransDynamicPptWaitQueue.push(pNewAppTaskMessage);
            AppTaskMessage* p=m_TransDynamicPptWaitQueue.top();
//           printf("dddd  target:%s,prefix:%s,type:%d\n",p->GetTargetFullPathFileName().c_str(),p->GetFilePrefix().c_str(),p->GetMessagePara().unTransDoc.enumTansType);        
//           printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());
        }
    }        
    else
    {
        //error
    }


}

s32 DsManage::OnTimer()
{
    //初始化是否存在四种队列超时任务
    bool bFindPPT = FALSE;
    bool bFindVideo = FALSE;
    bool bFindDoc = FALSE;
    bool bFindDocWindows = FALSE;
    TaskTimeInfo tTaskTimeInfo;
    if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
    {
        return -1;
    }   

    //检查视频转换列表
    TaskMessageList::iterator iterIdCheck;
    for (iterIdCheck=g_cDsManage.m_VideoRunQueue.begin(); iterIdCheck!=g_cDsManage.m_VideoRunQueue.end(); iterIdCheck++)
    {   
        AppTaskMessage* pTaskMessage = *iterIdCheck;
        string strMessageId;

        if(MAX_VIDEO_TASK_TIMEOUT_MINUTES == (((tTaskTimeInfo.m_wHour)*60+tTaskTimeInfo.m_wMinute)-((pTaskMessage->GetTaskTimeInfo()->m_wHour)*60+pTaskMessage->GetTaskTimeInfo()->m_wMinute)))
        {
            bFindVideo= TRUE;
            AppMessageType tAppMessageType = pTaskMessage->GetAppMessageType();

            if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
            {
                AppVideoTransResultMessage* pResult = new AppVideoTransResultMessage;
                //报告失败
               
                //连接和发送转换结果给应用客户端
                strMessageId = pTaskMessage->GetMessageId();
                pResult->SetMessageId(strMessageId);
                pResult->SetResult(FALSE);
                pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);
                pResult->SetTargetFullPathFileName("");
                //根据转换结果执行相应处理
                string strAppTargetIp;
                u32 dwAppTargetPort;
                if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                {
                    pResult->SetAppTargetIp(strAppTargetIp);
                    pResult->SetAppTargetPort(dwAppTargetPort);
                }
                else
                {
                //error
                }

                g_cDsManage.VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                g_cDsManage.VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
                //将该任务从运行队列移除,并归还给空闲队列
                pTaskMessage->Initialize();
                g_cDsManage.m_FreeMessageQueue.push_back(pTaskMessage);
                g_cDsManage.m_VideoRunQueue.erase(iterIdCheck);            
                (SessionManager::GetInstance()).SendAppMessage(*pResult);
                if(NULL != pResult)
                {
                    delete pResult;
                    pResult = NULL;
                }

                break;                 
            }
            else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
            {
                AppVideoCaptureResultMessage* pResult = new AppVideoCaptureResultMessage;
                //报告失败
               
                //连接和发送转换结果给应用客户端
                strMessageId = pTaskMessage->GetMessageId();
                pResult->SetMessageId(strMessageId);
                pResult->SetResult(FALSE);
                pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);
                pResult->SetCount(0);
                //根据转换结果执行相应处理
                string strAppTargetIp;
                u32 dwAppTargetPort;
                if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                {
                    pResult->SetAppTargetIp(strAppTargetIp);
                    pResult->SetAppTargetPort(dwAppTargetPort);
                }
                else
                {
                //error
                }

                g_cDsManage.VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                g_cDsManage.VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
                //将该任务从运行队列移除,并归还给空闲队列
                pTaskMessage->Initialize();
                g_cDsManage.m_FreeMessageQueue.push_back(pTaskMessage);
                g_cDsManage.m_VideoRunQueue.erase(iterIdCheck);            
                (SessionManager::GetInstance()).SendAppMessage(*pResult);
                if(NULL != pResult)
                {
                    delete pResult;
                    pResult = NULL;
                }

                break;                 

            }
            else if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
            {
                AppVideoInfoResultMessage* pResult = new AppVideoInfoResultMessage;
                //报告失败
               
                //连接和发送转换结果给应用客户端
                strMessageId = pTaskMessage->GetMessageId();
                pResult->SetMessageId(strMessageId);
                pResult->SetResult(FALSE);
                pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);
                pResult->SetDuration(0);
                pResult->SetResolution("");
                pResult->SetAudioCode("");
                pResult->SetVideoCode("");
                pResult->SetAudioTrack("");
                pResult->SetVideoType("");
                pResult->SetFrameRate(0);
                pResult->SetBitRate(0);
                //根据转换结果执行相应处理
                string strAppTargetIp;
                u32 dwAppTargetPort;
                if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
                {
                    pResult->SetAppTargetIp(strAppTargetIp);
                    pResult->SetAppTargetPort(dwAppTargetPort);
                }
                else
                {
                //error
                }

                g_cDsManage.VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                g_cDsManage.VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
                //将该任务从运行队列移除,并归还给空闲队列
                pTaskMessage->Initialize();
                g_cDsManage.m_FreeMessageQueue.push_back(pTaskMessage);
                g_cDsManage.m_VideoRunQueue.erase(iterIdCheck);            
                (SessionManager::GetInstance()).SendAppMessage(*pResult);
                if(NULL != pResult)
                {
                    delete pResult;
                    pResult = NULL;
                }

                break;                 
               
            }
            else
            {
                //错误日志
            }

        }
    }

    if(TRUE == bFindVideo)
    {
        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
        if( !g_cDsManage.m_VideoWaitQueue.empty() )
        {
            for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
            {
                if(TS_FREE == g_cDsManage.VideoTs[dwTsNo].GetState())
                {
                    AppTaskMessage*  pTaskMessage = g_cDsManage.m_VideoWaitQueue.top( );
                    AppMessageType tAppMessageType = pTaskMessage->GetAppMessageType();                                       
                    g_cDsManage.m_VideoWaitQueue.pop( );         
                    //设置时间
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    g_cDsManage.m_VideoRunQueue.push_back(pTaskMessage);
                                            
                    g_cDsManage.VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    g_cDsManage.VideoTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);
                    
                    if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
                    {
                        TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
                        pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                        pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                        pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                        
                    
                        char cFormat[100];
                        sprintf(cFormat, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwFormat);
                        pTransVideoRequest->SetFormat(cFormat);
                    
                        char cBitRate[100];
                        sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
                        pTransVideoRequest->SetBitRate(cBitRate);
                    
                        char cWidth[100];
                        char cHeight[100];
                        string strWidth,strHeight,strResolution;
                        sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
                        sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
                        strWidth = cWidth;
                        strHeight = cHeight;
                        strResolution = strWidth +"*"+strHeight;
                        pTransVideoRequest->SetResolution(strResolution);
                    
                        g_cDsManage.VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
                        if(NULL != pTransVideoRequest)
                        {
                            delete pTransVideoRequest;
                            pTransVideoRequest = NULL;
                        }
                    
                    }
                    else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
                    {
                        CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
                        pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
                        pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                        pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                        pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    
                        char cStart[100];
                        sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
                        pCapVideoRequest->SetStart(cStart);
                    
                        char cCount[100];
                        sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
                        pCapVideoRequest->SetCount(cCount);
                    
                    
                        char cInterval[100];
                        sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
                        pCapVideoRequest->SetInterval(cInterval);
                        
                        g_cDsManage.VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
                        if(NULL !=  pCapVideoRequest)
                        {
                            delete pCapVideoRequest;
                            pCapVideoRequest = NULL;
                        }
                    
                    }
                    else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
                    {
                        GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
                        pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
                        pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                        
                        g_cDsManage.VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
                        if(NULL !=  pVideoInfoRequest)
                        {
                            delete pVideoInfoRequest;
                            pVideoInfoRequest = NULL;
                        }
                    
                    }

                    break;
                }
   
             }
        
         }        

    }

    //检查动态ppt 列表
    for (iterIdCheck=g_cDsManage.m_TransDynamicPptRunQueue.begin(); iterIdCheck!=g_cDsManage.m_TransDynamicPptRunQueue.end(); iterIdCheck++)
    {
        AppTaskMessage* pTaskMessage = *iterIdCheck;
        string strMessageId;

        if(MAX_DYNAMIC_PPT_TASK_TIMEOUT_MINUTES <= (((tTaskTimeInfo.m_wHour)*60+tTaskTimeInfo.m_wMinute)-((pTaskMessage->GetTaskTimeInfo()->m_wHour)*60+pTaskMessage->GetTaskTimeInfo()->m_wMinute)))
        {
            bFindPPT = TRUE;
            //报告失败
            AppDynamicPptTransResultMessage*  pResult = new AppDynamicPptTransResultMessage;
            //连接和发送转换结果给应用客户端
            strMessageId = pTaskMessage->GetMessageId();
            pResult->SetMessageId(strMessageId);
            pResult->SetResult(FALSE);
            pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);   
            pResult->SetPages(0);
   
            //根据转换结果执行相应处理
            string strAppTargetIp;
            u32 dwAppTargetPort;
            if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
            {
                pResult->SetAppTargetIp(strAppTargetIp);
                pResult->SetAppTargetPort(dwAppTargetPort);
            }
            else
            {
            //error
            }

            g_cDsManage.PPTTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
            g_cDsManage.PPTTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
            //将该任务从运行队列移除,并归还给空闲队列
            pTaskMessage->Initialize();
            g_cDsManage.m_FreeMessageQueue.push_back(pTaskMessage);
            g_cDsManage.m_TransDynamicPptRunQueue.erase(iterIdCheck);            
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
            if(NULL != pResult)
            {
                delete pResult;
                pResult = NULL;
            }

            break;

        }
        
    }

    if(TRUE == bFindPPT)
    {
        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
        if( !g_cDsManage.m_TransDynamicPptWaitQueue.empty() )
        {
            for(u32 dwTsNo =1; dwTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwTsNo++)
            {
                if(TS_FREE == g_cDsManage.PPTTs[dwTsNo].GetState())
                {
                    AppTaskMessage*  pTaskMessage = g_cDsManage.m_TransDynamicPptWaitQueue.top( );
                    g_cDsManage.m_TransDynamicPptWaitQueue.pop( );         
                    //设置时间
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    g_cDsManage.m_TransDynamicPptRunQueue.push_back(pTaskMessage);
                                            
                    g_cDsManage.PPTTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    g_cDsManage.PPTTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);
                    TransitionRequest* pTransitionRequest = new TransitionRequest;
                    pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                    pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
        
                    g_cDsManage.PPTTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                    if(NULL !=  pTransitionRequest)
                    {
                        delete pTransitionRequest;
                        pTransitionRequest = NULL;
                    }
                    break;
                }
   
             }
        
         }        

    }

    //检查linux文档转换列表
    for (iterIdCheck=g_cDsManage.m_TransDocRunQueue.begin(); iterIdCheck!=g_cDsManage.m_TransDocRunQueue.end(); iterIdCheck++)
    {
        AppTaskMessage* pTaskMessage = *iterIdCheck;
        string strMessageId;
        
        if(MAX_DOC_TASK_TIMEOUT_MINUTES <= (((tTaskTimeInfo.m_wHour)*60+tTaskTimeInfo.m_wMinute)-((pTaskMessage->GetTaskTimeInfo()->m_wHour)*60+pTaskMessage->GetTaskTimeInfo()->m_wMinute)))
        {
            bFindDoc = TRUE;
            //将该任务交给windows版本文档转换处理,同时从运行队列删除
            bool bFindWindows = FALSE;
            //查找是否存在空闲windows 转换服务器,如果找到,把任务交给它重新处理,并添加到运行队列中,发送任务消息给相关服务器
            for(u32 dwFreeTsNo =1; dwFreeTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwFreeTsNo++)
            {   
                if((TS_FREE== g_cDsManage.DocWindowsTs[dwFreeTsNo].GetState()))
                {
                    g_cDsManage.DocWindowsTs[dwFreeTsNo].SetMessageInTs(pTaskMessage);
                    g_cDsManage.DocWindowsTs[dwFreeTsNo].SetState(TS_RUNNING);                           
                    g_cDsManage.DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
                    g_cDsManage.DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);

                    TransitionRequest* pTransitionRequest = new TransitionRequest;
                    pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                    pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

                    g_cDsManage.DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                    if(NULL != pTransitionRequest)
                    {
                        delete pTransitionRequest;
                        pTransitionRequest = NULL;
                    }

                    pTaskMessage->SetTsNum(dwFreeTsNo);
                    bFindWindows = TRUE;
                    //将该任务添加到windows版本文档转换运行队列中
                    TaskTimeInfo tNewTaskTimeInfo ;
                    if(FALSE == DsGetTimeInfo(&tNewTaskTimeInfo))
                    {
                        return -1;
                    }
                    pTaskMessage->SetTaskTimeInfo(tNewTaskTimeInfo);
                    
                    g_cDsManage.m_TransDocWindowsRunQueue.push_back(pTaskMessage);
                    break;
                }
            }
            //如果没有windows 转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列
            if(FALSE == bFindWindows)
            {
                pTaskMessage->SetPriority(9);
                g_cDsManage.m_TransDocWindowsWaitQueue.push(pTaskMessage);
            }

            //将该任务从linux版文档转换服务器运行队列移除
            g_cDsManage.DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
            g_cDsManage.DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);            
            g_cDsManage.m_TransDocRunQueue.erase(iterIdCheck);
            
            break;
        }        
        
    }

    if(TRUE == bFindDoc)
    {
        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
        if( !g_cDsManage.m_TransDocWaitQueue.empty() )
        {
            for(u32 dwTsNo =1; dwTsNo <MAX_DOC_TRANS_SERVER_NUM; dwTsNo++)
            {
                if(TS_FREE == g_cDsManage.DocTs[dwTsNo].GetState())
                {
                    AppTaskMessage*  pTaskMessage = g_cDsManage.m_TransDocWaitQueue.top( );
                    g_cDsManage.m_TransDocWaitQueue.pop( );         
                    //设置时间
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    g_cDsManage.m_TransDocRunQueue.push_back(pTaskMessage);
                                            
                    g_cDsManage.DocTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    g_cDsManage.DocTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);
                    TransitionRequest* pTransitionRequest = new TransitionRequest;
                    pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                    pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
        
                    g_cDsManage.DocTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                    if(NULL !=  pTransitionRequest)
                    {
                        delete pTransitionRequest;
                        pTransitionRequest = NULL;
                    }
                    break;
                }
   
             }
        
         }        

    }


    //检查windows文档转换列表
    for (iterIdCheck=g_cDsManage.m_TransDocWindowsRunQueue.begin(); iterIdCheck!=g_cDsManage.m_TransDocWindowsRunQueue.end(); iterIdCheck++)
    {   
        AppTaskMessage* pTaskMessage = *iterIdCheck;
        string strMessageId;

        if(MAX_DOC_TASK_TIMEOUT_MINUTES <= (((tTaskTimeInfo.m_wHour)*60+tTaskTimeInfo.m_wMinute)-((pTaskMessage->GetTaskTimeInfo()->m_wHour)*60+pTaskMessage->GetTaskTimeInfo()->m_wMinute)))
        {
            bFindDocWindows = TRUE;
            //报告失败
            AppDocTransResultMessage*  pResult = new AppDocTransResultMessage;
            //连接和发送转换结果给应用客户端
            strMessageId = pTaskMessage->GetMessageId();
            pResult->SetMessageId(strMessageId);
            pResult->SetResult(FALSE);
            pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);   
            pResult->SetPages(0);
   
            //根据转换结果执行相应处理
            string strAppTargetIp;
            u32 dwAppTargetPort;
            if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
            {
                pResult->SetAppTargetIp(strAppTargetIp);
                pResult->SetAppTargetPort(dwAppTargetPort);
            }
            else
            {
            //error
            }

            g_cDsManage.DocWindowsTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
            g_cDsManage.DocWindowsTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);
            //将该任务从运行队列移除,并归还给空闲队列
            pTaskMessage->Initialize();
            g_cDsManage.m_FreeMessageQueue.push_back(pTaskMessage);
            g_cDsManage.m_TransDocWindowsRunQueue.erase(iterIdCheck);            
            (SessionManager::GetInstance()).SendAppMessage(*pResult);
            if(NULL != pResult)
            {
                delete pResult;
                pResult = NULL;
            }

            break;

        }
        
    }

    if(TRUE == bFindDocWindows)
    {
        //检查任务等待队列是否有转换任务在等待,没有则直接返回
        //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
        if( !g_cDsManage.m_TransDocWindowsWaitQueue.empty() )
        {
            for(u32 dwTsNo =1; dwTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwTsNo++)
            {
                if(TS_FREE == g_cDsManage.DocWindowsTs[dwTsNo].GetState())
                {
                    AppTaskMessage*  pTaskMessage = g_cDsManage.m_TransDocWindowsWaitQueue.top( );
                    g_cDsManage.m_TransDocWindowsWaitQueue.pop( );         
                    //设置时间
                    pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
                    g_cDsManage.m_TransDocWindowsRunQueue.push_back(pTaskMessage);
                                            
                    g_cDsManage.DocWindowsTs[dwTsNo].SetMessageInTs(pTaskMessage);
                    g_cDsManage.DocWindowsTs[dwTsNo].SetState(TS_RUNNING);
                    pTaskMessage->SetTsNum(dwTsNo);
                    TransitionRequest* pTransitionRequest = new TransitionRequest;
                    pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
                    pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
                    pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
                    pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
                    pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
        
                    g_cDsManage.DocWindowsTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
                    if(NULL !=  pTransitionRequest)
                    {
                        delete pTransitionRequest;
                        pTransitionRequest = NULL;
                    }
                    break;
                }

             }
        
         }        

    }

}



使用特权

评论回复
板凳
keer_zu|  楼主 | 2015-8-11 09:30 | 只看该作者
本帖最后由 keer_zu 于 2015-8-12 09:45 编辑

2 ------


#include <cassert>

#ifdef _WIN32
#include <WS2tcpip.h>
#else
#include <arpa/inet.h>
//#include <sys/types.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
#endif
#include <errno.h>
#include <memory.h>
#ifndef __NO_LOGGER__

#include "interfaceapiimp.h"
#endif


#include "connbaseimp.h"
#include "eventlooperimp.h"
using namespace cdy;

Connector::Connector(const std::string &host, short port, IConnectorAcceptorSink *sink)
        : m_imp(new ConnectorImp(host, port, sink, this))
{
}
        
Connector::~Connector()
{
        m_imp->Cancel();
        delete m_imp;
        m_imp = NULL;
}

//@param timeout means the connect timeout value in millesecond.
int Connector::Connect(long timeout)
{
        if (m_imp)
                return m_imp->Connect(timeout);
        return -1;
}
        
void Connector::Cancel()
{
        if (m_imp)
                m_imp->Cancel();
}

Acceptor::Acceptor(const std::string &addr, short port, IConnectorAcceptorSink *sink)
        : m_imp(new AcceptorImp(addr, port, sink, this))
{
}

Acceptor::~Acceptor()
{
        delete m_imp;
        m_imp = NULL;
}

int Acceptor::StartListen()
{
        if (m_imp)
                return m_imp->StartListen();
        return -1;
}
        
void Acceptor::Stop()
{
        if (m_imp)
                m_imp->Stop();
}

Connection::~Connection()
{
}

bool StrToAddress(const string &str, short port, struct sockaddr_in *addr)
{
        if (!addr)
                return false;
               
    addr->sin_family = AF_INET;  
    addr->sin_port = htons(port);  
#ifdef WIN32  
    addr->sin_addr.S_un.S_addr = inet_addr(str.c_str());  
#else  
    addr->sin_addr.s_addr = inet_addr(str.data());  
#endif  
    memset(addr->sin_zero, 0x00, 8);
        return true;
}

int SockAddrConvert(sockaddr_storage *addr, socklen_t len, string &str, short &port)
{
        char ipstr[INET6_ADDRSTRLEN];

        if (addr->ss_family == AF_INET){
                struct sockaddr_in *s = (struct sockaddr_in *)addr;
                port = ntohs(s->sin_port);
                inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr));
        } else { // AF_INET6
                struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
                port = ntohs(s->sin6_port);
                inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof(ipstr));
        }

        str.assign(ipstr);
        return 0;
}

int GetPeerAddress(evutil_socket_t sock, string &saddr, short &port)
{
        struct sockaddr_storage addr;
        socklen_t sockLen = sizeof(addr);

        if (getpeername(sock, (struct sockaddr*)&addr, &sockLen) != 0){
                int err = evutil_socket_geterror(sock);
                return err;
        }

        return SockAddrConvert(&addr, sockLen, saddr, port);
}

static void on_connect(evutil_socket_t sock, short events, void * args)
{
        ConnectorImp *connector = (ConnectorImp*)args;
        string addr;
        short port = 0;
        int err = 0;
        if (events & EV_TIMEOUT)
                err = -1;
        else
                err = GetPeerAddress(sock, addr, port);

        if (connector){
                connector->OnConnectResult(sock, err, addr, port);
        }
}

static void on_accept(evutil_socket_t sock, short events, void * args)
{
        AcceptorImp *acceptor = (AcceptorImp*)args;
        string saddr;
        short port = 0;
        sockaddr_storage addr;
#ifdef WIN32  
        int addrLen = sizeof(addr);
#else
        socklen_t addrLen = sizeof(addr);
#endif
        
        int err = 0;
        if (events & EV_TIMEOUT)
                err = -1;
        if (acceptor){
                evutil_socket_t newSock = accept(sock, (sockaddr*)&addr, &addrLen);
                err = GetPeerAddress(newSock, saddr, port);
                acceptor->OnConnectResult(newSock, err, saddr, port);
        }
}

static void on_read(evutil_socket_t sock, short events, void * args)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        ConnectionImp *conn = (ConnectionImp*)args;
        logerUser.Debug("%s  conn:0x%x\n",__FUNCTION__,conn);
        if (events & EV_READ){
                if (conn){
                        conn->OnRead(sock);
                }
        }
}

static void on_write(evutil_socket_t sock, short events, void * args)
{
        ConnectionImp *conn = (ConnectionImp*)args;
        if (events & EV_WRITE){
                if (conn){
                        conn->OnWrite(sock);
                }
        }
}

AcceptorImp::AcceptorImp(const std::string &addr, short port, IConnectorAcceptorSink *sink, Acceptor *wrapper)
        : m_addr(addr)
        , m_port(port)
        , m_sink(sink)
        , m_fd(-1)
        , m_evBase(NULL)
        , m_connectEvent(NULL)
        , m_wrapper(wrapper)
{
}

int AcceptorImp::StartListen()
{
        struct sockaddr_in addr;
        
        if (!StrToAddress(m_addr, m_port, &addr))
                return -1;
        
        m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (evutil_make_socket_nonblocking(m_fd) != 0)
                return -1;
        
        if (evutil_make_listen_socket_reuseable(m_fd) != 0)
                return -1;

        if (bind(m_fd, (struct sockaddr*)&addr, sizeof(addr)) != 0)
                return -1;
               
        EventLooperImp &evLooper = (EventLooperImp&)EventLooper::GetInstance();
        m_evBase = evLooper.CurrentEvBase();
        m_connectEvent = event_new(m_evBase, m_fd, EV_READ | EV_PERSIST, on_accept, (void*)this);
        event_add(m_connectEvent, NULL);
        
        return listen(m_fd, 5);
}

void AcceptorImp::Stop()
{
    evutil_closesocket(m_fd);
    m_fd = -1;
    if (m_connectEvent)
    {
        event_del(m_connectEvent);
    }
    m_connectEvent = NULL;
   
}

void AcceptorImp::OnConnectResult(evutil_socket_t sock, int error, string &peerAddr, short peerPort)
{
        if (!m_sink)
                return;
        
        ConnectionImp *conn = NULL;
        if (!error){
                conn = new ConnectionImp(sock, m_evBase);
                conn->SetPeerAddress(peerAddr);
                conn->SetPeerPort(peerPort);
        }
        m_sink->OnConnection(conn, this->m_wrapper);
}

ConnectorImp::ConnectorImp(const string &host, short port, IConnectorAcceptorSink *sink, Connector *wrapper)
        : m_peerAddr(host)
        , m_peerPort(port)
        , m_sink(sink)
        , m_fd(-1)
        , m_evBase(NULL)
        , m_connectEvent(NULL)
        , m_wrapper(wrapper)
{
        EventLooperImp &el = (EventLooperImp&)EventLooper::GetInstance();
        m_evBase = el.CurrentEvBase();
}

ConnectorImp::~ConnectorImp()
{
        Cancel();

        if (m_fd != -1){
                evutil_closesocket(m_fd);
                m_fd = -1;
        }

        event_del(m_connectEvent);
        event_free(m_connectEvent);
        m_connectEvent = NULL;
}

int ConnectorImp::Connect(long timeout)
{
        struct timeval tv = {timeout/1000, (timeout%1000)*1000};
        struct sockaddr_in peerAddr;
        if (!StrToAddress(m_peerAddr, m_peerPort, &peerAddr))
                return -1;
        
        m_connecting = true;
        m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        evutil_make_socket_nonblocking(m_fd);
        
        m_connectEvent = event_new(m_evBase, m_fd, EV_WRITE, on_connect, (void*)this);
        event_add(m_connectEvent, &tv);
        connect(m_fd, (struct sockaddr*)&peerAddr, sizeof(peerAddr));
        return 0;
}

void ConnectorImp::Cancel()
{
        if (!m_connecting)
                return;

        m_sink = NULL;
        evutil_closesocket(m_fd);
        m_fd = -1;
        
        event_del(m_connectEvent);
        event_free(m_connectEvent);
        m_connectEvent = NULL;
}

void ConnectorImp::OnConnectResult(evutil_socket_t sock, int error, string &peerAddr, short peerPort)
{
        m_connecting = false;

        if (!m_sink)
                return;
        
        ConnectionImp *conn = NULL;
        if (!error){
                conn = new ConnectionImp(sock, m_evBase);
                conn->SetPeerAddress(peerAddr);
                conn->SetPeerPort(peerPort);
                m_fd = -1; //to avoid close it later.
        }
        m_sink->OnConnection(conn, this->m_wrapper);
}

ConnectionImp::ConnectionImp(evutil_socket_t fd, struct event_base *evBase)
        : m_sink(NULL)
        , m_peerPort(0)
        , m_fd(fd)
        , m_evBase(evBase)
        , m_closing(false)
{
        m_readEvent = event_new(m_evBase, m_fd, EV_READ | EV_PERSIST, on_read, (void*)this);
        m_writeEvent = event_new(m_evBase, m_fd, EV_WRITE, on_write, (void*)this);

        event_add(m_readEvent, NULL);
        //event_add(m_writeEvent, NULL);
        m_writeBuffer = evbuffer_new();
}

ConnectionImp::~ConnectionImp()
{
        Close();
}

int ConnectionImp::Send(const char *data, int len)
{
        if (m_closing)
                return -1;
               
        size_t left = evbuffer_get_length(m_writeBuffer);
        if (evbuffer_add(m_writeBuffer, data, len) != 0)
                return -1;
        
        int rt = 0;
        if (left != 0){
                rt = event_add(m_writeEvent, NULL);
        } else {
                rt = evbuffer_write(m_writeBuffer, m_fd);
        }
        return rt;
}

const std::string& ConnectionImp::GetPeerAddress()
{
        return m_peerAddr;
}

short ConnectionImp::GetPeerPort()
{
        return m_peerPort;
}

void ConnectionImp::OnRead(evutil_socket_t sock)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("OnRead");
        assert (sock == m_fd);
        int sz = recv(sock, m_readBuffer, MAX_READ_LEN, 0);
        int err;
        if(sz <= 0){
#ifdef WIN32
                err = WSAGetLastError();
#else
                err = errno;
#endif
                if (err == EWOULDBLOCK || err == EAGAIN)
                        return;
               
                IConnectionSink *sink = m_sink;
                Close();
                if (sink){
                        sink->OnDisconnect(err, this);
                }
        } else {
                if (m_sink){
                        m_sink->OnData(m_readBuffer, sz, this);
                }
        }
}

void ConnectionImp::OnWrite(evutil_socket_t sock)
{
        assert (sock == m_fd);
        size_t left = evbuffer_get_length(m_writeBuffer);
        
        if (left != 0){
                int sz = evbuffer_write(m_writeBuffer, m_fd);
               
                if (sz < 0){
                        int err;
#ifdef WIN32
                        err = WSAGetLastError();
#else
                        err = errno;
#endif
                        if (err != EWOULDBLOCK && err != EAGAIN){
                                IConnectionSink *sink = m_sink;
                                Close();
                                if (sink){
                                        sink->OnDisconnect(err, this);
                                }
                        }
                } else if ((size_t)sz < left){
                        event_add(m_writeEvent, NULL);
                }
        }
}
        
void ConnectionImp::Close()
{
        if (m_closing)
                return;
               
        m_closing = true;
        m_sink = NULL;
        evutil_closesocket(m_fd);
        
        m_fd = -1;
        event_del(m_readEvent);
        event_free(m_readEvent);
        m_readEvent = NULL;
        event_del(m_writeEvent);
        event_free(m_writeEvent);
        m_writeEvent = NULL;
        evbuffer_free(m_writeBuffer);
        m_writeBuffer = NULL;
}


void ConnectionImp::SetPeerAddress(const string addr)
{
        m_peerAddr.assign(addr);
}

void ConnectionImp::SetPeerPort(short port)
{
        m_peerPort = port;
}


使用特权

评论回复
地板
keer_zu|  楼主 | 2015-8-11 09:31 | 只看该作者
本帖最后由 keer_zu 于 2015-8-12 09:51 编辑

3 ---------

#include <iostream>
#include "interfaceapiimp.h"

#include <log4cxx/logger.h>
#include <log4cxx/logstring.h>
#include <log4cxx/propertyconfigurator.h>

using namespace log4cxx;
extern LoggerPtr g_logger;

using namespace std;


void SessionImp::ProcessFrame(const char *buf, int length)
{
        int i,len = length,count = 0;
        string newFrame;
        LoggerUser& logerUser = LoggerUser::GetInstance();
        
        if(buf == NULL){
                logerUser.Error("buf == NULL %d\n",__LINE__);
        }
//        LoggerUser& logerUser = LoggerUser::GetInstance();

//        cout << "OnData" <<"len:" << length <<endl;
build_frame:
        for(i=0;i<len;i++){
                if(buf[i + count] == '\0'){
                        count = i;
                        goto recv_process;
                } else {
                        m_rdBuffer.push_back(buf[i + count]);
                }
        }

        if(i == len)
                return;

recv_process:

        newFrame.clear();
        
        newFrame.assign(m_rdBuffer.begin(),m_rdBuffer.end());

//        cout << "len:" << newFrame.length() <<endl;
    if(count >0)
    {
            OnFrame(newFrame);
    }
        m_rdBuffer.clear();

        if(len > count + 2){
               
                count += 1;
                len = len - count - 1;
               
                goto build_frame;
        }

        return;
}



void SessionImp::SetConnection(Connection * conn)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        
        if(conn == NULL){
                logerUser.Fatal("%s:SessionImp::%s:%d  error param",__FILE__,__FUNCTION__,__LINE__);
                return;
        }
        
        m_connection = conn;
}

void SessionImp::SendMessage(string &str)
{
        int ret;
        LoggerUser& logerUser = LoggerUser::GetInstance();

        if(m_connection != NULL){
                ret = m_connection->Send(str.data(),str.length());

                if(ret < 0){
                        logerUser.Fatal("%s:SessionImp::%s:%d",__FILE__,__FUNCTION__,__LINE__);
                }

        }
        
}



TsSessionImp::TsSessionImp(ITsSessionUser *sessionUser,TsSession *tssession)
{
        m_sessionUser = sessionUser;
        m_tssession = tssession;
        m_sessionType = SESSION_TS;
}

void TsSessionImp::SetSessionUser(ITsSessionUser *sessionUser)
{
        m_sessionUser = sessionUser;
}



void TsSessionImp::SendMessage(TsMessageBase &msg)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("%s:%s:%d \n",__FILE__,__FUNCTION__,__LINE__);
        string json;
        
        if(msg.Encode(json)){      
              json = json +'\0';
                printf(" TsSessionImp::SendMessage:%s\n",json.c_str());
                m_connection->Send(json.data(),json.length());
        } else {
                logerUser.Error("%s:%s:%d   TsMessageBase.Encode error!\n",__FILE__,__FUNCTION__,__LINE__);
        }
}

void TsSessionImp::Close()
{
        // close connect
        struct TsSessionInfo *tsSessionInfo;
        list<struct TsSessionInfo*>::iterator tlit;

        SessionManagerImp& smi =  SessionManagerImp::GetInstance();
        
        m_connection->Close();

        if (this->m_connection){
                delete this->m_connection;
                this->m_connection = NULL;
        }

        for (tlit = smi.m_tsSessionList.begin();tlit != smi.m_tsSessionList.end();tlit ++) {
                tsSessionInfo = *tlit;
                if(tsSessionInfo != NULL){
                        if(tsSessionInfo->session == this->m_tssession){
                                
                                smi.m_tsSessionList.erase(tlit);   

                                delete tsSessionInfo;
                                
                                break;
                        }
                }
        }

        delete this;
}


void TsSessionImp::OnData(const char *buf, int length, Connection *conn)
{
        ProcessFrame(buf,length);
}

        // called when user can write data to network.
void TsSessionImp::OnWrite(Connection *conn)
{

}
        // called when the connection is broken, if user call Connection::Close(), //&&&
        // will not get this callback.
void TsSessionImp::OnDisconnect(int reason, Connection *conn)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        

        logerUser.Debug("%s:%s:%d    conn: 0x%x \n",__FILE__,__FUNCTION__,__LINE__,conn);
        logerUser.Debug("%s:%s:%d    m_connection: 0x%x \n",__FILE__,__FUNCTION__,__LINE__,this->m_connection);



        SessionManagerImp& smi =  SessionManagerImp::GetInstance();

        if(this->m_tssession != NULL)
                smi.OnSessionClose(*this->m_tssession);
        
        Close();
}

bool TsSessionImp::OnFrame(string &frame)
{
        struct TsSessionInfo *tsSessionInfo;
        list<struct TsSessionInfo*>::iterator it;
        ITsSessionUser* tsSessionUser;

        LoggerUser& logerUser = LoggerUser::GetInstance();

        SessionManagerImp& smi =  SessionManagerImp::GetInstance();
        ITsSessionUser* itsu= smi.GetSessionUser();
        if(itsu == NULL){
                logerUser.Error("%s:%s:%d   smi.GetSessionUser() == NULL\n",__FILE__,__FUNCTION__,__LINE__);
                return 0;
        }
        
        TsMessageCodec tmc;
        TsMessageBase* pTsMsg = tmc.Decode(frame);
        if (pTsMsg == NULL) {
                itsu->OnSessionError(*this->m_tssession);
                logerUser.Error("message Decode error! frame:%s\n",frame.c_str());
               
                return 0;
        }


        //logerUser.Debug("[url=home.php?mod=space&uid=72445]@[/url] ts session:  type:%d",pTsMsg->GetTsMessageType());
        switch(pTsMsg->GetTsMessageType()){
                case TS_MESSAGE_SVR_REGISTER:
                        itsu->OnRegister(*((RegisterInfo*) pTsMsg),*this->m_tssession);
                        break;

                case TS_MESSAGE_ACCEPT_TASK:   //TS_MESSAGE_TRANSMIT
                        break;

                case TS_MESSAGE_TRANS_RESULT:
                        itsu->OnTaskResult(*((TaskResult*)pTsMsg),*this->m_tssession);
                        break;

                case TS_MESSAGE_LINK_RESPONSE:  // OnServerLeave is called when heartbeat is not received
                        for(it = smi.m_tsSessionList.begin();it != smi.m_tsSessionList.end();it ++) {
                                tsSessionInfo = *it;
                                if(tsSessionInfo != NULL){
                                        if(tsSessionInfo->session == this->m_tssession){
                                                tsSessionInfo->timeOut = 0;
                                                break;
                                        }
                                }
                        }

                        break;
                default:
                        break;

        
        }

                        if(NULL != pTsMsg){
                                delete pTsMsg;
                        }

        return 1;
}

        


/////////////////// /// app accept session /////////////////////


void AppServerSessionImp::SetEventListener(IAppEventListener *eventListener)
{
        m_eventListener = eventListener;
}


void AppServerSessionImp::SendMessage(AppMessageBase &msg)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("%s:%s:%d \n",__FILE__,__FUNCTION__,__LINE__);
        
        string json;

        if(msg.Encode(json)){
                json = json + '\0';
                m_connection->Send(json.data(),json.length());
        } else {
                logerUser.Fatal("message encode error! %s:%s:%d \n",__FILE__,__FUNCTION__,__LINE__);
        }
        
}

void AppServerSessionImp::Close()
{
        m_connection->Close();

        if (this->m_connection){
                delete this->m_connection;
                this->m_connection = NULL;
        }

        delete this;
}

void AppServerSessionImp::OnData(const char *buf, int length, Connection *conn)
{


        ProcessFrame(buf,length);


}

void AppServerSessionImp::OnWrite(Connection *conn)
{

}

void AppServerSessionImp::OnDisconnect(int reason, Connection *conn)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        
        struct TsSessionInfo *tsSessionInfo;
        list<struct TsSessionInfo*>::iterator tlit;
        
        cout << "app server OnDisconnect from " << conn->GetPeerAddress() << ":" << conn->GetPeerPort() << endl;

        SessionManagerImp& smi =  SessionManagerImp::GetInstance();
        smi.OnSessionClose(*this);

        Close();
}

bool AppServerSessionImp::OnFrame(string &frame)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("server session:%d",__LINE__);

        SessionManagerImp& smi =  SessionManagerImp::GetInstance();

        AppMessageCodec amc;

#ifdef __old_solution__
        AppMessageBase* pAppMsg = amc.Decode(frame);
        if (pAppMsg == NULL) {
                printf("onframe decode error\n");
                logerUser.Fatal("message Decode error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
                return 0;
        }
        
        IAppEventListener* iael = smi.GetAppEventListener();
        if(iael == NULL){
                logerUser.Error("GetAppEventListener error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
                return 0;
        }

        switch(pAppMsg->GetAppMessageType()){
                case APP_MESSAGE_VIDEO_TRANS_TASK:
                case APP_MESSAGE_PRINT_SCREEN_TASK:
                case APP_MESSAGE_DOC_TRANS_TASK:
                case APP_MESSAGE_DYNAMIC_PPT_TRANS_TASK:            
                        iael->OnNewTask(*(AppTaskMessage *)pAppMsg);
                        break;

                default:
                        break;

        }

        if(NULL != pAppMsg){
                delete pAppMsg;
        }
#endif
        return 1;
}





//////////////////////// app connect session ///////////////////

void AppClientSessionImp::SendMessage(AppMessageBase &msg)
{
        string json;

        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("%s:%s:%d \n",__FILE__,__FUNCTION__,__LINE__);

        if(msg.Encode(json)){
//                cout << json.data() << " app c ****$ length:" << json.length() << endl;
                json = json + '\0';
                m_connection->Send(json.data(),json.length());
        } else {
                logerUser.Error("message Encode error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
        }
}

void AppClientSessionImp::Close()
{
        if(m_connection != NULL)
                m_connection->Close();

        if (this->m_connection){
                delete this->m_connection;
                this->m_connection = NULL;
        }

        delete this;
}

void AppClientSessionImp::OnData(const char *buf, int length, Connection *conn)
{
        
        ProcessFrame(buf,length);
        
}

void AppClientSessionImp::OnWrite(Connection *conn)
{

}

void AppClientSessionImp::OnDisconnect(int reason, Connection *conn)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        
        cout << "app client OnDisconnect from " << conn->GetPeerAddress() << ":" << conn->GetPeerPort() << endl;
        
        logerUser.Debug(" connection:0x%x",conn);

        SessionManagerImp& smi =  SessionManagerImp::GetInstance();
        smi.OnSessionClose(*this);

        Close();
}

bool AppClientSessionImp::OnFrame(string &frame)
{
        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("client session:%d",__LINE__);
        string recv_frame;

        SessionManagerImp& smi =  SessionManagerImp::GetInstance();


        AppMessageCodec amc;

#ifdef __old_solution__
        AppMessageBase* pAppMsg = amc.Decode(frame);
        if (pAppMsg == NULL) {
                logerUser.Fatal("message Decode error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
                return 0;
        }
        
        switch(pAppMsg->GetAppMessageType()){

                case APP_MESSAGE_RESPONSE:
                        cout << "app client OnDisconnect from(OnFrame) "  << endl;
                        smi.OnSessionClose(*this);

                        Close();
                        break;
                default:
                        break;
        }

        if(NULL != pAppMsg){
                delete pAppMsg;
        }

        return 1;
#endif
}


/////////////////////////////// TsClientSessionImp /////////////////////////////////////////////////////

void TsClientSessionImp::SendMessage(TsMessageBase &msg)
{
        string json;

        LoggerUser& logerUser = LoggerUser::GetInstance();
        logerUser.Debug("%s:%s:%d \n",__FILE__,__FUNCTION__,__LINE__);

        if(msg.Encode(json)){
//                cout << json.data() << " app c ****$ length:" << json.length() << endl;
                json = json + '\0';
                m_connection->Send(json.data(),json.length());
        } else {
                logerUser.Error("message Encode error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
        }
}


void TsClientSessionImp::Close()
{

}


void TsClientSessionImp::OnData(const char *buf, int length, Connection *conn)
{

}

// called when user can write data to network.
void TsClientSessionImp::OnWrite(Connection *conn)
{

}

// called when the connection is broken, if user call Connection::Close(), //&&&
// will not get this callback.
void TsClientSessionImp::OnDisconnect(int reason, Connection *conn)
{

}

bool TsClientSessionImp::OnFrame(string &frame)
{

}




使用特权

评论回复
5
laoxu| | 2015-8-11 15:51 | 只看该作者
都不是好代码,一句注释也未有~~~~~  :dizzy:

使用特权

评论回复
6
keer_zu|  楼主 | 2015-8-11 17:35 | 只看该作者
laoxu 发表于 2015-8-11 15:51
都不是好代码,一句注释也未有~~~~~

:lol

使用特权

评论回复
7
qhdjxy| | 2015-8-11 19:24 | 只看该作者
太长了。。。

使用特权

评论回复
8
angus118| | 2015-8-11 20:18 | 只看该作者
太长不看

使用特权

评论回复
9
fangzimo| | 2015-8-12 08:33 | 只看该作者
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不想看了

使用特权

评论回复
10
ticomi| | 2015-8-12 08:37 | 只看该作者
贴代码时注意将代码贴规范,写的也要规范,看起来才容易!

使用特权

评论回复
11
keer_zu|  楼主 | 2015-8-12 09:51 | 只看该作者
laoxu 发表于 2015-8-11 15:51
都不是好代码,一句注释也未有~~~~~

先从代码风格看。

使用特权

评论回复
12
keer_zu|  楼主 | 2015-8-12 09:52 | 只看该作者
laoxu 发表于 2015-8-11 15:51
都不是好代码,一句注释也未有~~~~~

先从代 码 风 格 看。

使用特权

评论回复
13
keer_zu|  楼主 | 2015-8-12 09:52 | 只看该作者
fangzimo 发表于 2015-8-12 08:33
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不 ...

改了

使用特权

评论回复
14
keer_zu|  楼主 | 2015-8-12 09:52 | 只看该作者
fangzimo 发表于 2015-8-12 08:33
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不 ...

改了

使用特权

评论回复
15
keer_zu|  楼主 | 2015-8-12 09:52 | 只看该作者
fangzimo 发表于 2015-8-12 08:33
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不 ...

改过了。

使用特权

评论回复
16
keer_zu|  楼主 | 2015-8-12 09:53 | 只看该作者
ticomi 发表于 2015-8-12 08:37
贴代码时注意将代码贴规范,写的也要规范,看起来才容易!

改过了

使用特权

评论回复
17
ningling_21| | 2015-8-13 09:29 | 只看该作者

都是楼主的作品?

使用特权

评论回复
18
keer_zu|  楼主 | 2015-8-13 09:31 | 只看该作者
ningling_21 发表于 2015-8-13 09:29
都是楼主的作品?

三个人的。

使用特权

评论回复
19
keer_zu|  楼主 | 2015-8-13 17:29 | 只看该作者
yyy71cj 发表于 2015-8-13 16:30
我有个建议,最好是先把框架理出来看下……

有些人代码一开始就没有考虑什么框架,有些一看就知道什么框架。

使用特权

评论回复
20
keer_zu|  楼主 | 2015-8-14 09:32 | 只看该作者
yyy71cj 发表于 2015-8-14 07:23
抽出函数级的模块结构来也成,好歹也表现一个模块与数据流的关系来

可以吧定义类的头文件给出来,应该一目了然了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1350

主题

12427

帖子

53

粉丝