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

[复制链接]
3301|28
 楼主| keer_zu 发表于 2015-8-11 09:28 | 显示全部楼层 |阅读模式
如题,内容看后续三帖子。编号 1, 2, 3
 楼主| keer_zu 发表于 2015-8-11 09:29 | 显示全部楼层
本帖最后由 keer_zu 于 2015-8-12 09:49 编辑

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

  1. #include <iostream>
  2. #include <stdio.h>
  3.         
  4. #include <pthread.h>
  5. #include <sys/time.h>
  6. #include <error.h>
  7. #include <stdlib.h>
  8. #include <memory.h>
  9. #include <fstream>
  10. //#include <log4cxx/logger.h>
  11. //#include <log4cxx/logstring.h>
  12. //#include <log4cxx/propertyconfigurator.h>
  13. #include "log4cxx_wrapper.h"
  14. #include "interface_api.h"
  15. #include "disp_task.h"
  16. #include "queue_manager.h"


  17. //using namespace log4cxx;
  18. //extern LoggerPtr g_Dslogger;

  19. extern DsManage g_cDsManage;

  20. BOOL32 DsGetTimeInfo( TaskTimeInfo* ptTimeInfo )
  21. {
  22.     if( NULL == ptTimeInfo )
  23.     {
  24.         return FALSE;
  25.     }

  26.     struct tm tmTemp;
  27.     struct timeval ttTemp;
  28.     if( 0 != gettimeofday( &ttTemp , NULL ) )
  29.     {
  30.         return FALSE;
  31.     }
  32.     tmTemp = *localtime( &ttTemp.tv_sec );
  33.     ptTimeInfo->m_wYear = tmTemp.tm_year+1900;
  34.     ptTimeInfo->m_wMonth = tmTemp.tm_mon+1;
  35.     ptTimeInfo->m_wDay = tmTemp.tm_mday;
  36.     ptTimeInfo->m_wHour = tmTemp.tm_hour;
  37.     ptTimeInfo->m_wMinute = tmTemp.tm_min;
  38.     ptTimeInfo->m_wSecond = tmTemp.tm_sec;
  39.     return TRUE;

  40. }


  41. void DsManage::OnRegister(RegisterInfo ®Info, TsSession &session)
  42. {
  43.     string json;
  44.     TsMessageCodec tmpTsMessageCodec;
  45.     RegisterResponse* pResponse = new RegisterResponse;
  46.     u32 dwTsIndex=0;
  47.     u32 dwTsFreeIndex = 0;
  48.     bool bFind = FALSE;
  49.     bool bResult = TRUE;
  50.     TsType tsType = regInfo.GetTsType();
  51.     LoggerWrapper dsLog= LoggerWrapper::GetInstance();
  52.     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__);   

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

  59.             if(TS_UNREGISTERED == g_cDsManage.PPTTs[dwTsIndex].GetState())
  60.             {
  61.                 if(FALSE == bFind)
  62.                 {
  63.                     bFind = TRUE;
  64.                     dwTsFreeIndex = dwTsIndex;
  65.                 }

  66.             }
  67.             else if((TS_FREE == g_cDsManage.PPTTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.PPTTs[dwTsIndex].GetState()))
  68.             {
  69.                 if((g_cDsManage.PPTTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.PPTTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
  70.                 {
  71.                     bResult = FALSE;
  72.                     break;
  73.                 }
  74.             }
  75.         }

  76.         if(bFind && bResult)
  77.         {
  78.             PPTTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
  79.             PPTTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
  80.             PPTTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
  81.             PPTTs[dwTsFreeIndex].SetTsSession( &session);
  82.             PPTTs[dwTsFreeIndex].SetState(TS_FREE);

  83.         }

  84.     }
  85.     else if(TS_DOCUMENT_WINDOWS == tsType)
  86.     {
  87.         for(dwTsIndex=1;dwTsIndex<MAX_DOC_WINDOWS_TRANS_SERVER_NUM;dwTsIndex++)
  88.         {

  89.             if(TS_UNREGISTERED == g_cDsManage.DocWindowsTs[dwTsIndex].GetState())
  90.             {
  91.                 if(FALSE == bFind)
  92.                 {
  93.                     bFind = TRUE;
  94.                     dwTsFreeIndex = dwTsIndex;
  95.                 }

  96.             }
  97.             else if((TS_FREE == g_cDsManage.DocWindowsTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.DocWindowsTs[dwTsIndex].GetState()))
  98.             {
  99.                 if((g_cDsManage.DocWindowsTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.DocWindowsTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
  100.                 {
  101.                     bResult = FALSE;
  102.                     break;
  103.                 }
  104.             }
  105.         }

  106.         if(bFind && bResult)
  107.         {
  108.             DocWindowsTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
  109.             DocWindowsTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
  110.             DocWindowsTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
  111.             DocWindowsTs[dwTsFreeIndex].SetTsSession( &session);
  112.             DocWindowsTs[dwTsFreeIndex].SetState(TS_FREE);
  113.         }

  114.     }   
  115.     else if(TS_DOCUMENT == tsType)
  116.     {
  117.         for(dwTsIndex=1;dwTsIndex<MAX_DOC_TRANS_SERVER_NUM;dwTsIndex++)
  118.         {
  119.             
  120.             if(TS_UNREGISTERED == g_cDsManage.DocTs[dwTsIndex].GetState())
  121.             {
  122.                 if(FALSE == bFind)
  123.                 {
  124.                     bFind = TRUE;
  125.                     dwTsFreeIndex = dwTsIndex;
  126.                 }
  127.                
  128.             }
  129.             else if((TS_FREE == g_cDsManage.DocTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.DocTs[dwTsIndex].GetState()))
  130.             {
  131.                 if((g_cDsManage.DocTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.DocTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
  132.                 {
  133.                     bResult = FALSE;
  134.                     break;
  135.                 }
  136.             }
  137.         }

  138.         if(bFind && bResult)
  139.         {
  140.             DocTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
  141.             DocTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
  142.             DocTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
  143.             DocTs[dwTsFreeIndex].SetTsSession( &session);
  144.             DocTs[dwTsFreeIndex].SetState(TS_FREE);
  145.         }
  146.         
  147.     }
  148.     else if(TS_VIDEO == tsType)
  149.     {
  150.         for(dwTsIndex=1;dwTsIndex<MAX_VIDEO_TRANS_SERVER_NUM;dwTsIndex++)
  151.         {
  152.             
  153.             if(TS_UNREGISTERED == g_cDsManage.VideoTs[dwTsIndex].GetState())
  154.             {
  155.                 if(FALSE == bFind)
  156.                 {
  157.                     bFind = TRUE;
  158.                     dwTsFreeIndex = dwTsIndex;
  159.                 }
  160.                
  161.             }
  162.             else if((TS_FREE == g_cDsManage.VideoTs[dwTsIndex].GetState()) ||(TS_RUNNING== g_cDsManage.VideoTs[dwTsIndex].GetState()))
  163.             {
  164.                 if((g_cDsManage.VideoTs[dwTsIndex].GetIpAddr() == regInfo.GetTsIp()) && (g_cDsManage.VideoTs[dwTsIndex].GetTsId() == regInfo.GetTsId()))
  165.                 {
  166.                     bResult = FALSE;
  167.                     break;
  168.                 }
  169.             }
  170.         }

  171.         if(bFind && bResult)
  172.         {
  173.             VideoTs[dwTsFreeIndex].SetIpAddr(regInfo.GetTsIp());
  174.             VideoTs[dwTsFreeIndex].SetTsId( regInfo.GetTsId());
  175.             VideoTs[dwTsFreeIndex].SetTsType( regInfo.GetTsType());
  176.             VideoTs[dwTsFreeIndex].SetTsSession( &session);
  177.             VideoTs[dwTsFreeIndex].SetState(TS_FREE);

  178.         }
  179.         
  180.     }
  181.     else
  182.     {
  183.         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__);        
  184. //        LOG4CXX_ERROR(g_Dslogger, "error message from transfer server. Register invalid ts server type: ");
  185. //        LOG4CXX_ERROR(g_Dslogger, tsType);   
  186.         return;
  187.     }
  188.    
  189.     //发送响应消息给转换服务器
  190.     if(bFind && bResult)
  191.     {
  192.         pResponse->SetResult(TRUE);
  193.         pResponse->SetErrorCode(RET_OK);
  194.         pResponse->SetErrorDetail("");
  195.     }
  196.     else if(FALSE == bResult)
  197.     {
  198.         pResponse->SetResult(FALSE);
  199.         pResponse->SetErrorCode(RET_E_REPEATED_TS_ID);
  200.         pResponse->SetErrorDetail("Same ts id   can not be registered repeated!");
  201.     }
  202.     else if(FALSE == bFind)
  203.     {
  204.         pResponse->SetResult(FALSE);
  205.         pResponse->SetErrorCode(RET_E_TS_USED_UP);
  206.         pResponse->SetErrorDetail("No enough ts resource can be registered!");
  207.     }

  208.     session.SendMessage(*pResponse);
  209.     if((FALSE == bResult) || (FALSE == bFind))
  210.     {
  211.         session.Close();
  212.         return;
  213.     }

  214.     //如果注册成功检查任务等待队列是否有转换任务在等待,没有则直接返回
  215.     //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  216.     if(TS_DYNAMIC_PPT == tsType)
  217.     {
  218.         if (( !m_TransDynamicPptWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
  219.         {
  220.             AppTaskMessage*  pTaskMessage = m_TransDynamicPptWaitQueue.top( );
  221. //                printf("4444  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  222.       //          printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());  
  223.             m_TransDynamicPptWaitQueue.pop( );   
  224.             TaskTimeInfo tTaskTimeInfo ;
  225.             if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  226.             {
  227.                 return;
  228.             }
  229.             pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  230.             m_TransDynamicPptRunQueue.push_back(pTaskMessage);
  231.      
  232.             PPTTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
  233.             PPTTs[dwTsFreeIndex].SetState(TS_RUNNING);
  234.             pTaskMessage->SetTsNum(dwTsFreeIndex);
  235.             
  236.             TransitionRequest* pTransitionRequest = new TransitionRequest;
  237.             pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  238.             pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  239.             pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  240.             pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  241.             pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  242.         
  243.             PPTTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransitionRequest);
  244. //                printf("55555  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  245.     //            printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         
  246.             if(NULL !=  pTransitionRequest)
  247.             {
  248.                 delete pTransitionRequest;
  249.                 pTransitionRequest = NULL;
  250.             }
  251. //               printf("666  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  252.    //             printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         

  253.         }

  254.     }
  255.     else if(TS_DOCUMENT_WINDOWS == tsType)
  256.     {
  257.         if (( !m_TransDocWindowsWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
  258.         {
  259.             AppTaskMessage*  pTaskMessage = m_TransDocWindowsWaitQueue.top( );
  260. //                printf("4444  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  261.       //          printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());  
  262.             m_TransDocWindowsWaitQueue.pop( );
  263.             TaskTimeInfo tTaskTimeInfo ;
  264.             if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  265.             {
  266.                 return;
  267.             }
  268.             pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);

  269.             m_TransDocWindowsRunQueue.push_back(pTaskMessage);
  270.      
  271.             DocWindowsTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
  272.             DocWindowsTs[dwTsFreeIndex].SetState(TS_RUNNING);
  273.             pTaskMessage->SetTsNum(dwTsFreeIndex);
  274.             
  275.             TransitionRequest* pTransitionRequest = new TransitionRequest;
  276.             pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  277.             pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  278.             pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  279.             pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  280.             pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  281.         
  282.             DocWindowsTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransitionRequest);
  283. //                printf("55555  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  284.     //            printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         
  285.             if(NULL !=  pTransitionRequest)
  286.             {
  287.                 delete pTransitionRequest;
  288.                 pTransitionRequest = NULL;
  289.             }
  290. //               printf("666  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  291.    //             printf("m_TransDocWaitQueue.size:%d\n",m_TransDynamicPptWaitQueue.size());         

  292.         }

  293.     }   
  294.     else if(TS_DOCUMENT == tsType)
  295.     {
  296.         if (( !m_TransDocWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
  297.         {
  298.             AppTaskMessage*  pTaskMessage = m_TransDocWaitQueue.top( );
  299. //                printf("4444  target:%s,prefix:%s,type:%d\n",pTaskMessage->GetTargetFullPathFileName().c_str(),pTaskMessage->GetFilePrefix().c_str(),pTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  300.     //            printf("m_TransDocWaitQueue.size:%d\n",m_TransDocWaitQueue.size());  
  301.             m_TransDocWaitQueue.pop( );      
  302.             TaskTimeInfo tTaskTimeInfo ;
  303.             if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  304.             {
  305.                 return;
  306.             }
  307.             pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);

  308.             m_TransDocRunQueue.push_back(pTaskMessage);
  309.      
  310.             DocTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
  311.             DocTs[dwTsFreeIndex].SetState(TS_RUNNING);
  312.             pTaskMessage->SetTsNum(dwTsFreeIndex);
  313.             
  314.             TransitionRequest* pTransitionRequest = new TransitionRequest;
  315.             pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  316.             pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  317.             pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  318.             pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  319.             pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);

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

  330.         }
  331.     }
  332.     else  //(TS_VIDEO == tsType)
  333.     {
  334.         if (( !m_VideoWaitQueue.empty() ) && (TRUE == bResult)&& (TRUE == bFind))
  335.         {            
  336.             AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
  337.             m_VideoWaitQueue.pop( );
  338.             TaskTimeInfo tTaskTimeInfo ;
  339.             if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  340.             {
  341.                 return;
  342.             }
  343.             pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);

  344.             m_VideoRunQueue.push_back(pTaskMessage);
  345.      
  346.             VideoTs[dwTsFreeIndex].SetMessageInTs(pTaskMessage);
  347.             VideoTs[dwTsFreeIndex].SetState(TS_RUNNING);
  348.             pTaskMessage->SetTsNum(dwTsFreeIndex);

  349.             if(APP_MESSAGE_VIDEO_TRANS_TASK == pTaskMessage->GetAppMessageType())
  350.             {   
  351.                 TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
  352.                 pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  353.                 pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  354.                 pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());

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

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

  361.                 char cWidth[100];
  362.                 char cHeight[100];
  363.                 string strWidth,strHeight,strResolution;
  364.                 sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
  365.                 sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
  366.                 strWidth = cWidth;
  367.                 strHeight = cHeight;
  368.                 strResolution = strWidth +"*"+strHeight;
  369.                 pTransVideoRequest->SetResolution(strResolution);
  370.                
  371.                 VideoTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pTransVideoRequest);
  372.                 if(NULL !=  pTransVideoRequest)
  373.                 {
  374.                     delete pTransVideoRequest;
  375.                     pTransVideoRequest = NULL;
  376.                 }
  377.             }
  378.             else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == pTaskMessage->GetAppMessageType())
  379.             {
  380.                 CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
  381.                 pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  382.                 pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  383.                 pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  384.                 pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());

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

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


  391.                 char cInterval[100];
  392.                 sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
  393.                 pCapVideoRequest->SetInterval(cInterval);
  394.                
  395.                 VideoTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pCapVideoRequest);
  396.                 if(NULL !=  pCapVideoRequest)
  397.                 {
  398.                     delete pCapVideoRequest;
  399.                     pCapVideoRequest = NULL;
  400.                 }
  401.             }
  402.             else if(APP_MESSAGE_VIDEO_INFO_TASK == pTaskMessage->GetAppMessageType())
  403.             {
  404.                 GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
  405.                 pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
  406.                 pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  407.                
  408.                 VideoTs[dwTsFreeIndex].GetTsSession()->SendMessage(*pVideoInfoRequest);
  409.                 if(NULL !=  pVideoInfoRequest)
  410.                 {
  411.                     delete pVideoInfoRequest;
  412.                     pVideoInfoRequest = NULL;
  413.                 }
  414.             }
  415.             else //error
  416.             {
  417.                 dsLog.Log(TRUE,LOGGER_DEBUG,"error task in the wait queue  appMessage type::%d , [%s][%s][%d]\n",pTaskMessage->GetAppMessageType(),__FILE__,__PRETTY_FUNCTION__,__LINE__);        

  418.             }

  419.         }
  420.     }
  421.    
  422. }

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

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

  433.     //对视频服务器消息的部分单独处理
  434.     if(TS_MESSAGE_VIDEO_TRANS_RESULT == tsTaskResultType)
  435.     {
  436.         pResponse->SetMessageId(taskResult.GetMessageId());
  437.         pResponse->SetServerType("Transfer");
  438.     }
  439.     else if(TS_MESSAGE_VIDEO_CAPTURE_RESULT == tsTaskResultType)
  440.     {
  441.         pResponse->SetMessageId(taskResult.GetMessageId());
  442.         pResponse->SetServerType("CapVideo");

  443.     }
  444.     else if(TS_MESSAGE_VIDEO_INFO_RESULT == tsTaskResultType)
  445.     {
  446.         pResponse->SetMessageId(taskResult.GetMessageId());
  447.         pResponse->SetServerType("Message");
  448.     }
  449.     //回复收到转换服务器消息resultresponse   
  450.     session.SendMessage(*pResponse);
  451.     if(NULL != pResponse)
  452.     {
  453.         delete pResponse;
  454.         pResponse = NULL;
  455.     }

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

  464.         //根据转换结果执行相应处理
  465.         
  466.         //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
  467.         TaskMessageList::iterator iterIdCheck;
  468.         for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
  469.         {
  470.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  471.             if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
  472.             {
  473.                 u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
  474.                 u32 dwWindowsRepeatedTimes = pTaskMessage->GetMessagePara().unTransDoc.m_dwWindowsRepeatTimes;
  475. //                if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
  476.                 if( TRUE == taskResult.GetResult())
  477.                 {
  478.                     string strAppTargetIp;
  479.                     u32 dwAppTargetPort;
  480.                     if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  481.                     {
  482.                         pResult->SetAppTargetIp(strAppTargetIp);
  483.                         pResult->SetAppTargetPort(dwAppTargetPort);
  484.                         bFind = TRUE;
  485.                         
  486.                     }
  487.                     else
  488.                     {
  489.                     //error
  490.                     }

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

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

  517.                             DocTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  518.                             if(NULL != pTransitionRequest)
  519.                             {
  520.                                 delete pTransitionRequest;
  521.                                 pTransitionRequest = NULL;
  522.                             }
  523.                            
  524.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  525.                             bFindSecond = TRUE;
  526.                             break;
  527.                         }
  528.                     }
  529.                     //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
  530.                     if(FALSE == bFindSecond)
  531.                     {
  532.                         pTaskMessage->SetPriority(9);
  533.                         m_TransDocWaitQueue.push(pTaskMessage);
  534.                         DocTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
  535.                         DocTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
  536.                         TaskMessageList::iterator iterIdCheck;
  537.                         for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
  538.                         {
  539.                             if(*iterIdCheck ==pTaskMessage)
  540.                             {
  541.                                 m_TransDocRunQueue.erase(iterIdCheck);
  542.                                 break;
  543.                             }
  544.                         }
  545.                     }

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

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

  568.                             DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  569.                             if(NULL != pTransitionRequest)
  570.                             {
  571.                                 delete pTransitionRequest;
  572.                                 pTransitionRequest = NULL;
  573.                             }

  574.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  575.                             bFindWindows = TRUE;
  576.                             //将该任务添加到windows版本文档转换运行队列中
  577.                             TaskTimeInfo tTaskTimeInfo ;
  578.                             if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  579.                             {
  580.                                 return;
  581.                             }
  582.                             pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  583.                            
  584.                             m_TransDocWindowsRunQueue.push_back(pTaskMessage);
  585.                             break;
  586.                         }
  587.                     }
  588.                     //如果没有windows 转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列
  589.                     if(FALSE == bFindWindows)
  590.                     {
  591.                         pTaskMessage->SetPriority(9);
  592.                         m_TransDocWindowsWaitQueue.push(pTaskMessage);
  593.                     }

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

  597.                 }
  598.                 break;
  599.             }
  600.         }
  601.         
  602.         if(bFind)
  603.         {
  604.             (SessionManager::GetInstance()).SendAppMessage(*pResult);
  605.         }

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

  608.         for(u32 dwTsNo =1; dwTsNo <MAX_DOC_TRANS_SERVER_NUM; dwTsNo++)
  609.         {
  610.             if(&session ==DocTs[dwTsNo].GetTsSession())
  611.             {
  612.     //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
  613.                 if( !m_TransDocWaitQueue.empty() )
  614.                 {
  615.                     AppTaskMessage*  pTaskMessage = m_TransDocWaitQueue.top( );
  616.                     m_TransDocWaitQueue.pop( );   
  617.                     TaskTimeInfo tTaskTimeInfo ;
  618.                     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  619.                     {
  620.                         return;
  621.                     }
  622.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  623.                     
  624.                     m_TransDocRunQueue.push_back(pTaskMessage);
  625.             
  626.                     DocTs[dwTsNo].SetMessageInTs(pTaskMessage);
  627.                     DocTs[dwTsNo].SetState(TS_RUNNING);
  628.                     pTaskMessage->SetTsNum(dwTsNo);
  629.                     TransitionRequest* pTransitionRequest = new TransitionRequest;
  630.                     pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  631.                     pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  632.                     pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  633.                     pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  634.                     pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);


  635.                     DocTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  636.                     if(NULL !=  pTransitionRequest)
  637.                     {
  638.                         delete pTransitionRequest;
  639.                         pTransitionRequest = NULL;
  640.                     }
  641.                 }
  642.                 else
  643.                 {
  644.                     DocTs[dwTsNo].SetState(TS_FREE);
  645.                     DocTs[dwTsNo].SetMessageInTs(NULL);                                    
  646.                 }
  647.                
  648.                 break;
  649.             }
  650.         
  651.         }         
  652.         
  653.         if(NULL != pResult)
  654.         {
  655.             delete pResult;
  656.             pResult = NULL;
  657.         }
  658.         
  659.     }
  660.     else  if(TS_MESSAGE_DOC_WINDOWS_TRANS_RESULT == tsTaskResultType)   
  661.     {
  662.         
  663.         //后面跟应用定了协议之后需要创建新的动态PPT的类        
  664.        AppDocTransResultMessage*  pResult = new AppDocTransResultMessage;
  665.         //连接和发送转换结果给应用客户端
  666.         pResult->SetMessageId(taskResult.GetMessageId());
  667.         pResult->SetResult(taskResult.GetResult());
  668.         pResult->SetErrorCode(taskResult.GetErrorCode());   
  669.         pResult->SetPages((taskResult).GetPages());

  670.         //根据转换结果执行相应处理
  671. //          printf("m_TransDocWindowsRunQueue.size():%d\n",m_TransDocWindowsRunQueue.size());
  672.           //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
  673.         TaskMessageList::iterator iterIdCheck;
  674.         for (iterIdCheck=m_TransDocWindowsRunQueue.begin(); iterIdCheck!=m_TransDocWindowsRunQueue.end(); iterIdCheck++)
  675.         {
  676.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  677.             if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
  678.             {
  679.                 u32 dwWindowsRepeatedTimes = pTaskMessage->GetMessagePara().unTransDoc.m_dwWindowsRepeatTimes;
  680.                 if(((MAX_DOC_WINDOWS_TRANS_REPEATED_TIMES == dwWindowsRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
  681.                 {
  682.                     string strAppTargetIp;
  683.                     u32 dwAppTargetPort;
  684.                     if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  685.                     {
  686.                         pResult->SetAppTargetIp(strAppTargetIp);
  687.                         pResult->SetAppTargetPort(dwAppTargetPort);
  688.                         bFind = TRUE;
  689.                           
  690.                     }
  691.                     else
  692.                     {
  693.                     //error
  694.                     }


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

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

  721.                             DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  722.                             if(NULL != pTransitionRequest)
  723.                             {
  724.                                 delete pTransitionRequest;
  725.                                 pTransitionRequest = NULL;
  726.                              }
  727.                               
  728.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  729.                             bFindSecond = TRUE;
  730.                             break;
  731.                          }
  732.                      }
  733.                      //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
  734.                      if(FALSE == bFindSecond)
  735.                      {
  736.                          pTaskMessage->SetPriority(9);
  737.                          m_TransDocWindowsWaitQueue.push(pTaskMessage);
  738.                          DocWindowsTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
  739.                          DocWindowsTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        

  740.                          m_TransDocWindowsRunQueue.erase(iterIdCheck);                  
  741.                      }
  742.                      
  743.                      dwWindowsRepeatedTimes++;
  744. //                     pTaskMessage->SetRepeatedTimes( dwWindowsRepeatedTimes);
  745.                      UnionMessageParam unMessagePara;
  746.                      unMessagePara = pTaskMessage->GetMessagePara();
  747.                      unMessagePara.unTransDoc.m_dwWindowsRepeatTimes = dwWindowsRepeatedTimes;
  748.                      pTaskMessage->SetMessagePara(unMessagePara);

  749.                  }
  750.         
  751.                  break;
  752.              }
  753.          }


  754.          if(bFind)
  755.          {
  756.              (SessionManager::GetInstance()).SendAppMessage(*pResult);
  757.          }
  758.         
  759.          //检查任务等待队列是否有转换任务在等待,没有则直接返回
  760.          //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  761.         
  762.          for(u32 dwTsNo =1; dwTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwTsNo++)
  763.          {
  764.              if(&session ==DocWindowsTs[dwTsNo].GetTsSession())
  765.              {
  766.    //              printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
  767.                  if( !m_TransDocWindowsWaitQueue.empty() )
  768.                  {
  769.                      AppTaskMessage*  pTaskMessage = m_TransDocWindowsWaitQueue.top( );
  770.                      m_TransDocWindowsWaitQueue.pop( );      
  771.                      
  772.                      TaskTimeInfo tTaskTimeInfo ;
  773.                      if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  774.                      {
  775.                          return;
  776.                      }
  777.                      pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  778.                      m_TransDocWindowsRunQueue.push_back(pTaskMessage);
  779.                
  780.                      DocWindowsTs[dwTsNo].SetMessageInTs(pTaskMessage);
  781.                      DocWindowsTs[dwTsNo].SetState(TS_RUNNING);
  782.                      pTaskMessage->SetTsNum(dwTsNo);
  783.                      TransitionRequest* pTransitionRequest = new TransitionRequest;
  784.                      pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  785.                      pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  786.                      pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  787.                      pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  788.                      pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  789.                   
  790.                      DocWindowsTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  791.                      if(NULL !=  pTransitionRequest)
  792.                      {
  793.                          delete pTransitionRequest;
  794.                          pTransitionRequest = NULL;
  795.                      }
  796.                  }
  797.                  else
  798.                  {
  799.                      DocWindowsTs[dwTsNo].SetState(TS_FREE);
  800.                      DocWindowsTs[dwTsNo].SetMessageInTs(NULL);
  801.                  }
  802.                   
  803.                  break;
  804.              }
  805.          
  806.          }         
  807.         
  808.         if(NULL != pResult)
  809.         {
  810.             delete pResult;
  811.             pResult = NULL;
  812.         }

  813.     }   
  814.     else  if(TS_MESSAGE_DYNAMIC_PPT_RESULT == tsTaskResultType)
  815.     {

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

  823.         //根据转换结果执行相应处理
  824.          
  825.           //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
  826.         TaskMessageList::iterator iterIdCheck;
  827.         for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
  828.         {
  829.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  830.             if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
  831.             {
  832.                 u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
  833.                 if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
  834.                 {
  835.                     string strAppTargetIp;
  836.                     u32 dwAppTargetPort;
  837.                     if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  838.                     {
  839.                         pResult->SetAppTargetIp(strAppTargetIp);
  840.                         pResult->SetAppTargetPort(dwAppTargetPort);
  841.                         bFind = TRUE;
  842.                           
  843.                     }
  844.                     else
  845.                     {
  846.                     //error
  847.                     }


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

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

  874.                             PPTTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  875.                             if(NULL != pTransitionRequest)
  876.                             {
  877.                                 delete pTransitionRequest;
  878.                                 pTransitionRequest = NULL;
  879.                              }
  880.                               
  881.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  882.                             bFindSecond = TRUE;
  883.                             break;
  884.                          }
  885.                      }
  886.                      //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
  887.                      if(FALSE == bFindSecond)
  888.                      {
  889.                          pTaskMessage->SetPriority(9);
  890.                          m_TransDynamicPptWaitQueue.push(pTaskMessage);
  891.                          PPTTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
  892.                          PPTTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
  893.                         
  894.                          TaskMessageList::iterator iterIdCheck;
  895.                          for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
  896.                          {
  897.                              if(*iterIdCheck ==pTaskMessage)
  898.                              {
  899.                                  m_TransDynamicPptRunQueue.erase(iterIdCheck);
  900.                                  break;
  901.                              }
  902.                          }                    
  903.                      }
  904.                      
  905.                      dwRepeatedTimes++;
  906.                      pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
  907.                  }
  908.         
  909.                  break;
  910.              }
  911.          }
  912.          
  913.          if(bFind)
  914.          {
  915.              (SessionManager::GetInstance()).SendAppMessage(*pResult);
  916.          }
  917.         
  918.          //检查任务等待队列是否有转换任务在等待,没有则直接返回
  919.          //如果有,则将该任务分配给该服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  920.         
  921.          for(u32 dwTsNo =1; dwTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwTsNo++)
  922.          {
  923.              if(&session ==PPTTs[dwTsNo].GetTsSession())
  924.              {
  925.    //              printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
  926.                  if( !m_TransDynamicPptWaitQueue.empty() )
  927.                  {
  928.                      AppTaskMessage*  pTaskMessage = m_TransDynamicPptWaitQueue.top( );
  929.                      m_TransDynamicPptWaitQueue.pop( );   
  930.                      
  931.                      TaskTimeInfo tTaskTimeInfo ;
  932.                      if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  933.                      {
  934.                          return;
  935.                      }
  936.                      pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  937.                      m_TransDynamicPptRunQueue.push_back(pTaskMessage);
  938.                
  939.                      PPTTs[dwTsNo].SetMessageInTs(pTaskMessage);
  940.                      PPTTs[dwTsNo].SetState(TS_RUNNING);
  941.                      pTaskMessage->SetTsNum(dwTsNo);
  942.                      TransitionRequest* pTransitionRequest = new TransitionRequest;
  943.                      pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  944.                      pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  945.                      pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  946.                      pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  947.                      pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  948.                   
  949.                      PPTTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  950.                      if(NULL !=  pTransitionRequest)
  951.                      {
  952.                          delete pTransitionRequest;
  953.                          pTransitionRequest = NULL;
  954.                      }
  955.                  }
  956.                  else
  957.                  {
  958.                      PPTTs[dwTsNo].SetState(TS_FREE);
  959.                      PPTTs[dwTsNo].SetMessageInTs(NULL);
  960.                  }
  961.                   
  962.                  break;
  963.              }
  964.          
  965.          }         
  966.         
  967.         if(NULL != pResult)
  968.         {
  969.             delete pResult;
  970.             pResult = NULL;
  971.         }

  972.     }
  973.     else  if(TS_MESSAGE_VIDEO_TRANS_RESULT == tsTaskResultType)
  974.     {
  975.         AppVideoTransResultMessage* pResult;
  976.         pResult = new AppVideoTransResultMessage;
  977.         //连接和发送转换结果给应用客户端
  978.         pResult->SetMessageId(taskResult.GetMessageId());
  979.         pResult->SetResult((taskResult).GetResult());
  980.         pResult->SetErrorCode((taskResult).GetErrorCode());
  981.         if(FALSE != (taskResult).GetResult())
  982.         {
  983.             pResult->SetTargetFullPathFileName( taskResult.GetTargetFolder());
  984.         }
  985.         else
  986.         {
  987.             pResult->SetTargetFullPathFileName("");
  988.         }
  989.         //根据转换结果执行相应处理

  990.         //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
  991.         TaskMessageList::iterator iterIdCheck;
  992.         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  993.         {
  994.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  995.             if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
  996.             {
  997.                 u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
  998.                 if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
  999.                 {
  1000.                     string strAppTargetIp;
  1001.                     u32 dwAppTargetPort;
  1002.                     if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  1003.                     {
  1004.                         pResult->SetAppTargetIp(strAppTargetIp);
  1005.                         pResult->SetAppTargetPort(dwAppTargetPort);
  1006.                         bFind = TRUE;
  1007.                         
  1008.                     }
  1009.                     else
  1010.                     {
  1011.                     //error
  1012.                     }

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


  1033.                             TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
  1034.                             pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  1035.                             pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  1036.                             pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());

  1037.                             char cFormat[100];
  1038.                             sprintf(cFormat, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwFormat);
  1039.                             pTransVideoRequest->SetFormat(cFormat);
  1040.                            
  1041.                             char cBitRate[100];
  1042.                             sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
  1043.                             pTransVideoRequest->SetBitRate(cBitRate);
  1044.                            
  1045.                             char cWidth[100];
  1046.                             char cHeight[100];
  1047.                             string strWidth,strHeight,strResolution;
  1048.                             sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
  1049.                             sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
  1050.                             strWidth = cWidth;
  1051.                             strHeight = cHeight;
  1052.                             strResolution = strWidth +"*"+strHeight;
  1053.                             pTransVideoRequest->SetResolution(strResolution);
  1054.                            
  1055.                             VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
  1056.                             if(NULL !=  pTransVideoRequest)
  1057.                             {
  1058.                                 delete pTransVideoRequest;
  1059.                                 pTransVideoRequest = NULL;
  1060.                             }

  1061.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  1062.                             bFindSecond = TRUE;
  1063.                             break;
  1064.                         }
  1065.                     }
  1066.                     //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
  1067.                     if(FALSE == bFindSecond)
  1068.                     {
  1069.                         pTaskMessage->SetPriority(9);
  1070.                         m_VideoWaitQueue.push(pTaskMessage);
  1071.                         VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
  1072.                         VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
  1073.                         TaskMessageList::iterator iterIdCheck;
  1074.                         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  1075.                         {
  1076.                             if(*iterIdCheck ==pTaskMessage)
  1077.                             {
  1078.                                 m_VideoRunQueue.erase(iterIdCheck);
  1079.                                 break;
  1080.                             }
  1081.                         }
  1082.                     }

  1083.                     dwRepeatedTimes++;
  1084.                     pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
  1085.                 }

  1086.                 break;
  1087.             }
  1088.         }
  1089.         
  1090.         if(bFind)
  1091.         {
  1092.             (SessionManager::GetInstance()).SendAppMessage(*pResult);
  1093.         }

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

  1096.         for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
  1097.         {
  1098.             if(&session ==VideoTs[dwTsNo].GetTsSession())
  1099.             {
  1100.     //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
  1101.                 if( !m_VideoWaitQueue.empty() )
  1102.                 {
  1103.                     AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
  1104.                     m_VideoWaitQueue.pop( );  
  1105.                     
  1106.                     TaskTimeInfo tTaskTimeInfo ;
  1107.                     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  1108.                     {
  1109.                         return;
  1110.                     }
  1111.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  1112.                     m_VideoRunQueue.push_back(pTaskMessage);
  1113.             
  1114.                     VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
  1115.                     VideoTs[dwTsNo].SetState(TS_RUNNING);
  1116.                     pTaskMessage->SetTsNum(dwTsNo);

  1117.                     TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
  1118.                     pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  1119.                     pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  1120.                     pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());

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

  1124.                     char cBitRate[100];
  1125.                     sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
  1126.                     pTransVideoRequest->SetBitRate(cBitRate);
  1127.                     
  1128.                     char cWidth[100];
  1129.                     char cHeight[100];
  1130.                     string strWidth,strHeight,strResolution;
  1131.                     sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
  1132.                     sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
  1133.                     strWidth = cWidth;
  1134.                     strHeight = cHeight;
  1135.                     strResolution = strWidth +"*"+strHeight;
  1136.                     pTransVideoRequest->SetResolution(strResolution);
  1137.                     
  1138.                     VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
  1139.                     if(NULL !=  pTransVideoRequest)
  1140.                     {
  1141.                         delete pTransVideoRequest;
  1142.                         pTransVideoRequest = NULL;
  1143.                     }
  1144.    
  1145.                 }
  1146.                 else
  1147.                 {
  1148.                     VideoTs[dwTsNo].SetState(TS_FREE);
  1149.                     VideoTs[dwTsNo].SetMessageInTs(NULL);                                    
  1150.                 }
  1151.                
  1152.                 break;
  1153.             }
  1154.         
  1155.         }         
  1156.         
  1157.         if(NULL != pResult)
  1158.         {
  1159.             delete pResult;
  1160.             pResult = NULL;
  1161.         }
  1162.         
  1163.     }
  1164.     else  if(TS_MESSAGE_VIDEO_CAPTURE_RESULT == tsTaskResultType)
  1165.     {
  1166.         AppVideoCaptureResultMessage* pResult;
  1167.         pResult = new AppVideoCaptureResultMessage;
  1168.         //连接和发送转换结果给应用客户端
  1169.         pResult->SetMessageId(taskResult.GetMessageId());
  1170.         pResult->SetResult(taskResult.GetResult());
  1171.         pResult->SetErrorCode(taskResult.GetErrorCode());
  1172.         pResult->SetCount(taskResult.GetCount());

  1173.         //根据转换结果执行相应处理
  1174.         
  1175.         //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
  1176.         TaskMessageList::iterator iterIdCheck;
  1177.         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  1178.         {
  1179.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  1180.             if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
  1181.             {
  1182.                 u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
  1183.                 if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
  1184.                 {
  1185.                     string strAppTargetIp;
  1186.                     u32 dwAppTargetPort;
  1187.                     if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  1188.                     {
  1189.                         pResult->SetAppTargetIp(strAppTargetIp);
  1190.                         pResult->SetAppTargetPort(dwAppTargetPort);
  1191.                         bFind = TRUE;
  1192.                         
  1193.                     }
  1194.                     else
  1195.                     {
  1196.                     //error
  1197.                     }

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

  1218.                             CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
  1219.                             pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  1220.                             pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  1221.                             pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  1222.                             pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  1223.                            
  1224.                             char cStart[100];
  1225.                             sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
  1226.                             pCapVideoRequest->SetStart(cStart);
  1227.                            
  1228.                             char cCount[100];
  1229.                             sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
  1230.                             pCapVideoRequest->SetCount(cCount);
  1231.                            
  1232.                            
  1233.                             char cInterval[100];
  1234.                             sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
  1235.                             pCapVideoRequest->SetInterval(cInterval);
  1236.                            
  1237.                             VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
  1238.                             if(NULL !=  pCapVideoRequest)
  1239.                             {
  1240.                                 delete pCapVideoRequest;
  1241.                                 pCapVideoRequest = NULL;
  1242.                             }


  1243.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  1244.                             bFindSecond = TRUE;
  1245.                             break;
  1246.                         }
  1247.                     }
  1248.                     //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
  1249.                     if(FALSE == bFindSecond)
  1250.                     {
  1251.                         pTaskMessage->SetPriority(9);
  1252.                         m_VideoWaitQueue.push(pTaskMessage);
  1253.                         VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
  1254.                         VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
  1255.                         TaskMessageList::iterator iterIdCheck;
  1256.                         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  1257.                         {
  1258.                             if(*iterIdCheck ==pTaskMessage)
  1259.                             {
  1260.                                 m_VideoRunQueue.erase(iterIdCheck);
  1261.                                 break;
  1262.                             }
  1263.                         }
  1264.                     }

  1265.                     dwRepeatedTimes++;
  1266.                     pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
  1267.                 }

  1268.                 break;
  1269.             }
  1270.         }
  1271.         
  1272.         if(bFind)
  1273.         {
  1274.             (SessionManager::GetInstance()).SendAppMessage(*pResult);
  1275.         }

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

  1278.         for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
  1279.         {
  1280.             if(&session ==VideoTs[dwTsNo].GetTsSession())
  1281.             {
  1282.     //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
  1283.                 if( !m_VideoWaitQueue.empty() )
  1284.                 {
  1285.                     AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
  1286.                     m_VideoWaitQueue.pop( );   
  1287.                     
  1288.                     TaskTimeInfo tTaskTimeInfo ;
  1289.                     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  1290.                     {
  1291.                         return;
  1292.                     }
  1293.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  1294.                     m_VideoRunQueue.push_back(pTaskMessage);
  1295.             
  1296.                     VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
  1297.                     VideoTs[dwTsNo].SetState(TS_RUNNING);
  1298.                     pTaskMessage->SetTsNum(dwTsNo);

  1299.                     CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
  1300.                     pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  1301.                     pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  1302.                     pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  1303.                     pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  1304.                     
  1305.                     char cStart[100];
  1306.                     sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
  1307.                     pCapVideoRequest->SetStart(cStart);
  1308.                     
  1309.                     char cCount[100];
  1310.                     sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
  1311.                     pCapVideoRequest->SetCount(cCount);
  1312.                     
  1313.                     
  1314.                     char cInterval[100];
  1315.                     sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
  1316.                     pCapVideoRequest->SetInterval(cInterval);
  1317.                     
  1318.                     VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
  1319.                     if(NULL !=  pCapVideoRequest)
  1320.                     {
  1321.                         delete pCapVideoRequest;
  1322.                         pCapVideoRequest = NULL;
  1323.                     }

  1324.    
  1325.                 }
  1326.                 else
  1327.                 {
  1328.                     VideoTs[dwTsNo].SetState(TS_FREE);
  1329.                     VideoTs[dwTsNo].SetMessageInTs(NULL);                                    
  1330.                 }
  1331.                
  1332.                 break;
  1333.             }
  1334.         
  1335.         }         
  1336.         
  1337.         if(NULL != pResult)
  1338.         {
  1339.             delete pResult;
  1340.             pResult = NULL;
  1341.         }
  1342.         
  1343.     }
  1344.     else  if(TS_MESSAGE_VIDEO_INFO_RESULT == tsTaskResultType)
  1345.     {
  1346.         AppVideoInfoResultMessage* pResult;
  1347.         pResult = new AppVideoInfoResultMessage;
  1348.         //连接和发送转换结果给应用客户端
  1349.         pResult->SetMessageId(taskResult.GetMessageId());

  1350.         pResult->SetDuration(atoll(taskResult.GetDuration().c_str()));
  1351.         pResult->SetResolution(taskResult.GetResolution());
  1352.         pResult->SetAudioCode(taskResult.GetAudioCode());
  1353.         pResult->SetVideoCode(taskResult.GetVideoCode());
  1354.         pResult->SetAudioTrack(taskResult.GetAudioTrack());
  1355.         pResult->SetVideoType(taskResult.GetVideoType());
  1356.         pResult->SetFrameRate(atoi(taskResult.GetFrameRate().c_str()));
  1357.         pResult->SetBitRate(atoi(taskResult.GetBitRate().c_str()));
  1358.         pResult->SetResult((taskResult).GetResult());
  1359.         pResult->SetErrorCode((taskResult).GetErrorCode());


  1360.         //根据转换结果执行相应处理
  1361.         
  1362.         //查找运行队列中任务保留该任务ID的IP,端口信息,发送消息给应用端
  1363.         TaskMessageList::iterator iterIdCheck;
  1364.         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  1365.         {
  1366.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  1367.             if(pTaskMessage->GetMessageId() == taskResult.GetMessageId())
  1368.             {
  1369.                 u32 dwRepeatedTimes = pTaskMessage->GetRepeatedTimes();
  1370.                 if(((3 == dwRepeatedTimes)&&(FALSE == taskResult.GetResult())) || (TRUE == taskResult.GetResult()))
  1371.                 {
  1372.                     string strAppTargetIp;
  1373.                     u32 dwAppTargetPort;
  1374.                     if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  1375.                     {
  1376.                         pResult->SetAppTargetIp(strAppTargetIp);
  1377.                         pResult->SetAppTargetPort(dwAppTargetPort);
  1378.                         bFind = TRUE;
  1379.                         
  1380.                     }
  1381.                     else
  1382.                     {
  1383.                     //error
  1384.                     }

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

  1405.                             GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
  1406.                             pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
  1407.                             pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  1408.                            
  1409.                             VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
  1410.                             if(NULL !=  pVideoInfoRequest)
  1411.                             {
  1412.                                 delete pVideoInfoRequest;
  1413.                                 pVideoInfoRequest = NULL;
  1414.                             }

  1415.                             pTaskMessage->SetTsNum(dwFreeTsNo);
  1416.                             bFindSecond = TRUE;
  1417.                             break;
  1418.                         }
  1419.                     }
  1420.                     //如果没有转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列,并从运行队列删除
  1421.                     if(FALSE == bFindSecond)
  1422.                     {
  1423.                         pTaskMessage->SetPriority(9);
  1424.                         m_VideoWaitQueue.push(pTaskMessage);
  1425.                         VideoTs[pTaskMessage->GetTsNum()].SetState(TS_FREE);
  1426.                         VideoTs[pTaskMessage->GetTsNum()].SetMessageInTs(NULL);                        
  1427.                         TaskMessageList::iterator iterIdCheck;
  1428.                         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  1429.                         {
  1430.                             if(*iterIdCheck ==pTaskMessage)
  1431.                             {
  1432.                                 m_VideoRunQueue.erase(iterIdCheck);
  1433.                                 break;
  1434.                             }
  1435.                         }
  1436.                     }

  1437.                     dwRepeatedTimes++;
  1438.                     pTaskMessage->SetRepeatedTimes( dwRepeatedTimes);
  1439.                 }

  1440.                 break;
  1441.             }
  1442.         }
  1443.         
  1444.         if(bFind)
  1445.         {
  1446.             (SessionManager::GetInstance()).SendAppMessage(*pResult);
  1447.         }

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

  1450.         for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
  1451.         {
  1452.             if(&session ==VideoTs[dwTsNo].GetTsSession())
  1453.             {
  1454.     //            printf("find ts,dwTsNo:%d,m_TransDocWaitQueue.size:%d,m_TransDocWaitQueue.empty():%d\n",dwTsNo,m_TransDocWaitQueue.size(),m_TransDocWaitQueue.empty());
  1455.                 if( !m_VideoWaitQueue.empty() )
  1456.                 {
  1457.                     AppTaskMessage*  pTaskMessage = m_VideoWaitQueue.top( );
  1458.                     m_VideoWaitQueue.pop( );   
  1459.                     
  1460.                     TaskTimeInfo tTaskTimeInfo ;
  1461.                     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  1462.                     {
  1463.                         return;
  1464.                     }
  1465.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  1466.                     m_VideoRunQueue.push_back(pTaskMessage);
  1467.             
  1468.                     VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
  1469.                     VideoTs[dwTsNo].SetState(TS_RUNNING);
  1470.                     pTaskMessage->SetTsNum(dwTsNo);

  1471.                     GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
  1472.                     pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
  1473.                     pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());

  1474.                     VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
  1475.                     if(NULL !=  pVideoInfoRequest)
  1476.                     {
  1477.                         delete pVideoInfoRequest;
  1478.                         pVideoInfoRequest = NULL;
  1479.                     }

  1480.    
  1481.                 }
  1482.                 else
  1483.                 {
  1484.                     VideoTs[dwTsNo].SetState(TS_FREE);
  1485.                     VideoTs[dwTsNo].SetMessageInTs(NULL);                                    
  1486.                 }
  1487.                
  1488.                 break;
  1489.             }
  1490.         
  1491.         }         
  1492.         
  1493.         if(NULL != pResult)
  1494.         {
  1495.             delete pResult;
  1496.             pResult = NULL;
  1497.         }
  1498.         
  1499.     }
  1500.     else  //if(TS_MESSAGE_PRINT_SCREEN_PROGRESS_RESULT == tsTaskResultType)
  1501.     {
  1502.         
  1503.     }


  1504. }

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

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

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

  1562.                     m_TransDocWaitQueue.push((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs()));
  1563.                     TaskMessageList::iterator iterIdCheck;
  1564.                     for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
  1565.                     {
  1566. //                        printf("OnServerLeave 6666 dwTsNo:%d,++++++++++++++++\n",dwTsNo);
  1567.                         if(*iterIdCheck ==((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs())))
  1568.                         {
  1569. //                            printf("OnServerLeave 7777 dwTsNo:%d:%d++++++++++++++++\n",dwTsNo);
  1570.                             m_TransDocRunQueue.erase(iterIdCheck);
  1571.                             break;
  1572.                         }
  1573.                     }

  1574.                     ((AppTaskMessage*)(DocTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                          
  1575.                 }
  1576.                
  1577. //                break;
  1578.             }

  1579.             DocTs[dwTsNo].SetState(TS_UNREGISTERED);
  1580.             DocTs[dwTsNo].SetMessageInTs(NULL);
  1581.             break;
  1582.         }
  1583.     }           

  1584.     if( TRUE == bFindServer)
  1585.     {
  1586.         return ;
  1587.     }

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

  1608.                     if((TS_FREE== DocWindowsTs[dwFreeTsNo].GetState())&&(dwFreeTsNo != dwTsNo))  
  1609.                     {
  1610.                         DocWindowsTs[dwFreeTsNo].SetMessageInTs(DocWindowsTs[dwTsNo].GetMessageInTs());
  1611.                         DocWindowsTs[dwFreeTsNo].SetState(TS_RUNNING);
  1612.                         DocWindowsTs[dwTsNo].SetState(TS_UNREGISTERED);
  1613.                         DocWindowsTs[dwTsNo].SetMessageInTs(NULL);
  1614.                         ((AppTaskMessage*)(DocWindowsTs[dwFreeTsNo].GetMessageInTs()))->SetTsNum(dwFreeTsNo);

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

  1621.                         DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  1622.                         if(NULL != pTransitionRequest)
  1623.                         {
  1624.                             delete pTransitionRequest;
  1625.                             pTransitionRequest = NULL;
  1626.                         }
  1627.                         bFind = TRUE;
  1628.                         break;
  1629.                     }
  1630.                 }

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

  1636.                     m_TransDocWindowsWaitQueue.push((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs()));
  1637.                     TaskMessageList::iterator iterIdCheck;
  1638.                     for (iterIdCheck=m_TransDocWindowsRunQueue.begin(); iterIdCheck!=m_TransDocWindowsRunQueue.end(); iterIdCheck++)
  1639.                     {
  1640. //                        printf("OnServerLeave dddd++++++++++++++++\n");
  1641.                         if(*iterIdCheck ==((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs())))
  1642.                         {
  1643. //                           printf("OnServerLeave eeeee++++++++++++++++\n");
  1644.                             m_TransDocWindowsRunQueue.erase(iterIdCheck);
  1645.                             break;
  1646.                         }
  1647.                     }   

  1648.                     ((AppTaskMessage*)(DocWindowsTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                    
  1649.                 }
  1650.                
  1651. //                break;
  1652.             }

  1653.             DocWindowsTs[dwTsNo].SetState(TS_UNREGISTERED);
  1654.             DocWindowsTs[dwTsNo].SetMessageInTs(NULL);
  1655.             break;
  1656.         }
  1657.     }      

  1658.     if( TRUE == bFindServer)
  1659.     {
  1660.         return ;
  1661.     }

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

  1682.                     if((TS_FREE== PPTTs[dwFreeTsNo].GetState())&&(dwFreeTsNo != dwTsNo))  
  1683.                     {
  1684.                         PPTTs[dwFreeTsNo].SetMessageInTs(PPTTs[dwTsNo].GetMessageInTs());
  1685.                         PPTTs[dwFreeTsNo].SetState(TS_RUNNING);
  1686.                         PPTTs[dwTsNo].SetState(TS_UNREGISTERED);
  1687.                         PPTTs[dwTsNo].SetMessageInTs(NULL);
  1688.                         ((AppTaskMessage*)(PPTTs[dwFreeTsNo].GetMessageInTs()))->SetTsNum(dwFreeTsNo);

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

  1695.                         PPTTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  1696.                         if(NULL != pTransitionRequest)
  1697.                         {
  1698.                             delete pTransitionRequest;
  1699.                             pTransitionRequest = NULL;
  1700.                         }
  1701.                         bFind = TRUE;
  1702.                         break;
  1703.                     }
  1704.                 }

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

  1710.                     m_TransDynamicPptWaitQueue.push((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs()));
  1711.                     TaskMessageList::iterator iterIdCheck;
  1712.                     for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
  1713.                     {
  1714. //                        printf("OnServerLeave dddd++++++++++++++++\n");
  1715.                         if(*iterIdCheck ==((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs())))
  1716.                         {
  1717. //                           printf("OnServerLeave eeeee++++++++++++++++\n");
  1718.                             m_TransDynamicPptRunQueue.erase(iterIdCheck);
  1719.                             break;
  1720.                         }
  1721.                     }   

  1722.                     ((AppTaskMessage*)(PPTTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                    
  1723.                 }
  1724.                
  1725. //                break;
  1726.             }

  1727.             PPTTs[dwTsNo].SetState(TS_UNREGISTERED);
  1728.             PPTTs[dwTsNo].SetMessageInTs(NULL);
  1729.             break;
  1730.         }
  1731.     }      

  1732.     if( TRUE == bFindServer)
  1733.     {
  1734.         return ;
  1735.     }

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

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

  1765.                         VideoTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  1766.                         if(NULL != pTransitionRequest)
  1767.                         {
  1768.                             delete pTransitionRequest;
  1769.                             pTransitionRequest = NULL;
  1770.                         }
  1771. #endif
  1772.                         AppTaskMessage* pAppTaskMessage = ((AppTaskMessage*)(VideoTs[dwFreeTsNo].GetMessageInTs()));
  1773.                         if(APP_MESSAGE_VIDEO_TRANS_TASK == pAppTaskMessage->GetAppMessageType())
  1774.                         {
  1775.                             TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
  1776.                             pTransVideoRequest->SetMessageId(pAppTaskMessage->GetMessageId());
  1777.                             pTransVideoRequest->SetSrcFile(pAppTaskMessage->GetFullPathFileName());
  1778.                             pTransVideoRequest->SetTargetFolder(pAppTaskMessage->GetTargetFullPathFileName());
  1779.                            
  1780.                         
  1781.                             char cFormat[100];
  1782.                             sprintf(cFormat, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwFormat);
  1783.                             pTransVideoRequest->SetFormat(cFormat);
  1784.                         
  1785.                             char cBitRate[100];
  1786.                             sprintf(cBitRate, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
  1787.                             pTransVideoRequest->SetBitRate(cBitRate);
  1788.                         
  1789.                             char cWidth[100];
  1790.                             char cHeight[100];
  1791.                             string strWidth,strHeight,strResolution;
  1792.                             sprintf(cWidth, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
  1793.                             sprintf(cHeight, "%d", pAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
  1794.                             strWidth = cWidth;
  1795.                             strHeight = cHeight;
  1796.                             strResolution = strWidth +"*"+strHeight;
  1797.                             pTransVideoRequest->SetResolution(strResolution);
  1798.                         
  1799.                             VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
  1800.                             if(NULL != pTransVideoRequest)
  1801.                             {
  1802.                                 delete pTransVideoRequest;
  1803.                                 pTransVideoRequest = NULL;
  1804.                             }
  1805.                             break;
  1806.                         }
  1807.                         else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == pAppTaskMessage->GetAppMessageType())
  1808.                         {
  1809.                             CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
  1810.                             pCapVideoRequest->SetMessageId(pAppTaskMessage->GetMessageId());
  1811.                             pCapVideoRequest->SetSrcFile(pAppTaskMessage->GetFullPathFileName());
  1812.                             pCapVideoRequest->SetTargetFolder(pAppTaskMessage->GetTargetFullPathFileName());
  1813.                             pCapVideoRequest->SetPrefix(pAppTaskMessage->GetFilePrefix());
  1814.                         
  1815.                             char cStart[100];
  1816.                             sprintf(cStart, "%d", pAppTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
  1817.                             pCapVideoRequest->SetStart(cStart);
  1818.                         
  1819.                             char cCount[100];
  1820.                             sprintf(cCount, "%d", pAppTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
  1821.                             pCapVideoRequest->SetCount(cCount);
  1822.                         
  1823.                         
  1824.                             char cInterval[100];
  1825.                             sprintf(cInterval, "%d", pAppTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
  1826.                             pCapVideoRequest->SetInterval(cInterval);
  1827.                            
  1828.                             VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
  1829.                             if(NULL !=  pCapVideoRequest)
  1830.                             {
  1831.                                 delete pCapVideoRequest;
  1832.                                 pCapVideoRequest = NULL;
  1833.                             }
  1834.                         }
  1835.                         else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
  1836.                         {
  1837.                             GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
  1838.                             pVideoInfoRequest->SetMessageId(pAppTaskMessage->GetMessageId());
  1839.                             pVideoInfoRequest->SetSrcFile(pAppTaskMessage->GetFullPathFileName());
  1840.                            
  1841.                             VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
  1842.                             if(NULL !=  pVideoInfoRequest)
  1843.                             {
  1844.                                 delete pVideoInfoRequest;
  1845.                                 pVideoInfoRequest = NULL;
  1846.                             }
  1847.                         }

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

  1859.                     m_VideoWaitQueue.push((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs()));
  1860.                     TaskMessageList::iterator iterIdCheck;
  1861.                     for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  1862.                     {
  1863. //                        printf("OnServerLeave 6666 dwTsNo:%d,++++++++++++++++\n",dwTsNo);
  1864.                         if(*iterIdCheck ==((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs())))
  1865.                         {
  1866.                             m_VideoRunQueue.erase(iterIdCheck);
  1867.                             break;
  1868.                         }
  1869.                     }

  1870.                     ((AppTaskMessage*)(VideoTs[dwTsNo].GetMessageInTs()))->SetTsNum(0);                          
  1871.                 }
  1872.                
  1873. //                break;
  1874.             }

  1875.             VideoTs[dwTsNo].SetState(TS_UNREGISTERED);
  1876.             VideoTs[dwTsNo].SetMessageInTs(NULL);
  1877.             break;
  1878.         }
  1879.     }        
  1880. }

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

  1885. //    printf("OnSessionError enter++++++++++++++++\n");
  1886.     OnServerLeave(session);
  1887.     //关闭本session
  1888.    session.Close();
  1889. }

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


  1901. //   printf("OnNewTask,count:%d\n",count);
  1902.     AppMessageType tAppMessageType = taskInfo.GetAppMessageType();
  1903.     if(APP_MESSAGE_DOC_TRANS_TASK == tAppMessageType)
  1904.     {
  1905.         TaskMessageList::const_iterator iterIdCheck;
  1906.         for (iterIdCheck=m_TransDocRunQueue.begin(); iterIdCheck!=m_TransDocRunQueue.end(); iterIdCheck++)
  1907.         {
  1908.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  1909.             if(pTaskMessage->GetMessageId() == strMessageId)
  1910.             {
  1911.                 bFind = TRUE;
  1912.                 break;
  1913.             }
  1914.         }

  1915.         if(FALSE == bFind)
  1916.         {
  1917.             AppTaskMessage* pTaskMessage;
  1918.             TaskMessagePriorityQueue tmpQueue;
  1919.             while ( !m_TransDocWaitQueue.empty() )
  1920.             {
  1921.                 pTaskMessage = m_TransDocWaitQueue.top( );
  1922.                 m_TransDocWaitQueue.pop( );
  1923.                 if(pTaskMessage->GetMessageId() == strMessageId)
  1924.                 {
  1925.                     bFind = TRUE;
  1926.                 }

  1927.                 tmpQueue.push( pTaskMessage );
  1928.             }
  1929.             while ( !tmpQueue.empty() )
  1930.             {
  1931.                 pTaskMessage = tmpQueue.top( );
  1932.                 tmpQueue.pop( );
  1933.                 m_TransDocWaitQueue.push(pTaskMessage );
  1934.             }
  1935.             
  1936.         }

  1937.         //检查是否在windows文档转换列表中
  1938.         for (iterIdCheck=m_TransDocWindowsRunQueue.begin(); iterIdCheck!=m_TransDocWindowsRunQueue.end(); iterIdCheck++)
  1939.         {
  1940.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  1941.             if(pTaskMessage->GetMessageId() == strMessageId)
  1942.             {
  1943.                 bFind = TRUE;
  1944.                 break;
  1945.             }
  1946.         }

  1947.         if(FALSE == bFind)
  1948.         {
  1949.             AppTaskMessage* pTaskMessage;
  1950.             TaskMessagePriorityQueue tmpQueue;
  1951.             while ( !m_TransDocWindowsWaitQueue.empty() )
  1952.             {
  1953.                 pTaskMessage = m_TransDocWindowsWaitQueue.top( );
  1954.                 m_TransDocWindowsWaitQueue.pop( );
  1955.                 if(pTaskMessage->GetMessageId() == strMessageId)
  1956.                 {
  1957.                     bFind = TRUE;
  1958.                 }

  1959.                 tmpQueue.push( pTaskMessage );
  1960.             }
  1961.             while ( !tmpQueue.empty() )
  1962.             {
  1963.                 pTaskMessage = tmpQueue.top( );
  1964.                 tmpQueue.pop( );
  1965.                 m_TransDocWindowsWaitQueue.push(pTaskMessage );
  1966.             }
  1967.             
  1968.         }        

  1969.         if(TRUE == bFind)
  1970.         {
  1971.             //发送错误信息给应用客户端
  1972.             AppDocTransResultMessage* pResult = new AppDocTransResultMessage;
  1973.             pResult->SetMessageId(taskInfo.GetMessageId());
  1974.             pResult->SetResult(FALSE);
  1975.             pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
  1976.             pResult->SetAppTargetIp(taskInfo.GetIpAddr());
  1977.             pResult->SetAppTargetPort(taskInfo.GetPort());
  1978.   
  1979.             (SessionManager::GetInstance()).SendAppMessage(*pResult);
  1980.             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__);   
  1981. //            LOG4CXX_ERROR(g_Dslogger, "error message from application client. Repeated Message ID: ");
  1982. //            LOG4CXX_ERROR(g_Dslogger, taskInfo.GetMessageId());
  1983.             if(NULL != pResult )
  1984.             {
  1985.               delete pResult;
  1986.                           pResult = NULL;

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

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

  2021. //                printf("222  target:%s,prefix:%s\n",pTransitionRequest->GetTargetFolder().c_str(),pTransitionRequest->GetPrefix().c_str());
  2022.                 DocTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  2023.                 if(NULL != pTransitionRequest)
  2024.                 {
  2025.                     delete pTransitionRequest;
  2026.                     pTransitionRequest = NULL;
  2027.                 }
  2028.                 break;
  2029.             }
  2030.         }
  2031.         
  2032.         //如果没有空闲的转换服务器,将该任务加入等待列表
  2033.         if(FALSE == bFree)
  2034.         {   
  2035.             m_TransDocWaitQueue.push(pNewAppTaskMessage);
  2036. //            AppTaskMessage* p=m_TransDocWaitQueue.top();
  2037. //            printf("333  target:%s,prefix:%s,type:%d\n",p->GetTargetFullPathFileName().c_str(),p->GetFilePrefix().c_str(),p->GetMessagePara().unTransDoc.enumTansType);        
  2038.             printf("m_TransDocWaitQueue.size:%d\n",m_TransDocWaitQueue.size());
  2039.         }
  2040.     }
  2041.     else if((APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)||(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)||(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType))
  2042.     {
  2043.         TaskMessageList::const_iterator iterIdCheck;
  2044.         for (iterIdCheck=m_VideoRunQueue.begin(); iterIdCheck!=m_VideoRunQueue.end(); iterIdCheck++)
  2045.         {
  2046.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  2047.             if(pTaskMessage->GetMessageId() == strMessageId)
  2048.             {
  2049.                 bFind = TRUE;
  2050.                 break;
  2051.             }
  2052.         }

  2053.         if(FALSE == bFind)
  2054.         {
  2055.             AppTaskMessage* pTaskMessage;
  2056.             TaskMessagePriorityQueue tmpQueue;
  2057.             while ( !m_VideoWaitQueue.empty() )
  2058.             {
  2059.                 pTaskMessage = m_VideoWaitQueue.top( );
  2060.                 m_VideoWaitQueue.pop( );
  2061.                 if(pTaskMessage->GetMessageId() == strMessageId)
  2062.                 {
  2063.                     bFind = TRUE;
  2064.                 }

  2065.                 tmpQueue.push( pTaskMessage );
  2066.             }
  2067.             while ( !tmpQueue.empty() )
  2068.             {
  2069.                 pTaskMessage = tmpQueue.top( );
  2070.                 tmpQueue.pop( );
  2071.                 m_VideoWaitQueue.push(pTaskMessage );
  2072.             }
  2073.             
  2074.         }

  2075.         if(TRUE == bFind)
  2076.         {
  2077.             //发送错误信息给应用客户端
  2078.             if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
  2079.             {
  2080.                 AppVideoTransResultMessage* pResult = new AppVideoTransResultMessage;
  2081.                 pResult->SetMessageId(taskInfo.GetMessageId());
  2082.                 pResult->SetResult(FALSE);
  2083.                 pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
  2084.                 pResult->SetAppTargetIp(taskInfo.GetIpAddr());
  2085.                 pResult->SetAppTargetPort(taskInfo.GetPort());
  2086.       
  2087.                 (SessionManager::GetInstance()).SendAppMessage(*pResult);

  2088.                                 if(NULL != pResult)
  2089.                                 {
  2090.                                    delete pResult;
  2091.                                    pResult = NULL;


  2092.                                 }

  2093.   
  2094.                                
  2095.             }
  2096.             else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
  2097.             {
  2098.                 AppVideoCaptureResultMessage* pResult = new AppVideoCaptureResultMessage;
  2099.                 pResult->SetMessageId(taskInfo.GetMessageId());
  2100.                 pResult->SetResult(FALSE);
  2101.                 pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
  2102.                 pResult->SetAppTargetIp(taskInfo.GetIpAddr());
  2103.                 pResult->SetAppTargetPort(taskInfo.GetPort());
  2104.       
  2105.                 (SessionManager::GetInstance()).SendAppMessage(*pResult);

  2106.                                 if(NULL != pResult)
  2107.                                 {
  2108.                                    delete pResult;
  2109.                                    pResult = NULL;
  2110.                                 }
  2111.             }
  2112.             else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
  2113.             {
  2114.                 AppVideoInfoResultMessage* pResult = new AppVideoInfoResultMessage;
  2115.                 pResult->SetMessageId(taskInfo.GetMessageId());
  2116.                 pResult->SetResult(FALSE);
  2117.                 pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
  2118.                 pResult->SetAppTargetIp(taskInfo.GetIpAddr());
  2119.                 pResult->SetAppTargetPort(taskInfo.GetPort());
  2120.       
  2121.                 (SessionManager::GetInstance()).SendAppMessage(*pResult);

  2122.                                 if(NULL != pResult)
  2123.                                 {
  2124.                                    delete pResult;
  2125.                                    pResult = NULL;
  2126.                                 }
  2127.             }
  2128.             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__);   
  2129.             return;
  2130.         }
  2131.         
  2132.         //分发服务器创建一个消息任务的拷贝,避免下层上报的消息在函数返回后被销毁
  2133. //        printf("000  target:%s,prefix:%s,type:%d\n",taskInfo.GetTargetFullPathFileName().c_str(),taskInfo.GetFilePrefix().c_str(),taskInfo.GetMessagePara().unTransDoc.enumTansType);        
  2134.         AppTaskMessage* pNewAppTaskMessage;
  2135.         MessageNew(&pNewAppTaskMessage);
  2136.         memcpy(pNewAppTaskMessage,&taskInfo,sizeof(AppTaskMessage));
  2137. //                printf("111  target:%s,prefix:%s,type:%d\n",pNewAppTaskMessage->GetTargetFullPathFileName().c_str(),pNewAppTaskMessage->GetFilePrefix().c_str(),pNewAppTaskMessage->GetMessagePara().unTransDoc.enumTansType);        
  2138.         //再检查是否有空闲的转换服务器?
  2139.         for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
  2140.         {
  2141.             //如果有空闲的转换服务器,将该任务提交到转换服务器,发送消息给转换服务器,并将它加入运行列表
  2142.             if(TS_FREE == VideoTs[dwTsNo].GetState())
  2143.             {      
  2144.                 TaskTimeInfo tTaskTimeInfo ;
  2145.                 if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  2146.                 {
  2147.                     return;
  2148.                 }
  2149.                 pNewAppTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);            
  2150.                 m_VideoRunQueue.push_back(pNewAppTaskMessage);
  2151.                 bFree = TRUE;
  2152.                 VideoTs[dwTsNo].SetMessageInTs(pNewAppTaskMessage);
  2153.                 VideoTs[dwTsNo].SetState(TS_RUNNING);
  2154.                 pNewAppTaskMessage->SetTsNum(dwTsNo);

  2155.                 if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
  2156.                 {
  2157.                     TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
  2158.                     pTransVideoRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
  2159.                     pTransVideoRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
  2160.                     pTransVideoRequest->SetTargetFolder(pNewAppTaskMessage->GetTargetFullPathFileName());
  2161.                     

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

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

  2168.                     char cWidth[100];
  2169.                     char cHeight[100];
  2170.                     string strWidth,strHeight,strResolution;
  2171.                     sprintf(cWidth, "%d", pNewAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
  2172.                     sprintf(cHeight, "%d", pNewAppTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
  2173.                     strWidth = cWidth;
  2174.                     strHeight = cHeight;
  2175.                     strResolution = strWidth +"*"+strHeight;
  2176.                     pTransVideoRequest->SetResolution(strResolution);

  2177.                     VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
  2178.                     if(NULL != pTransVideoRequest)
  2179.                     {
  2180.                         delete pTransVideoRequest;
  2181.                         pTransVideoRequest = NULL;
  2182.                     }
  2183.                     break;
  2184.                 }
  2185.                 else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
  2186.                 {
  2187.                     CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
  2188.                     pCapVideoRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
  2189.                     pCapVideoRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
  2190.                     pCapVideoRequest->SetTargetFolder(pNewAppTaskMessage->GetTargetFullPathFileName());
  2191.                     pCapVideoRequest->SetPrefix(pNewAppTaskMessage->GetFilePrefix());

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

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


  2198.                     char cInterval[100];
  2199.                     sprintf(cInterval, "%d", pNewAppTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
  2200.                     pCapVideoRequest->SetInterval(cInterval);
  2201.                     
  2202.                     VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
  2203.                     if(NULL !=  pCapVideoRequest)
  2204.                     {
  2205.                         delete pCapVideoRequest;
  2206.                         pCapVideoRequest = NULL;
  2207.                     }
  2208.                     break;
  2209.                 }
  2210.                 else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
  2211.                 {
  2212.                     GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
  2213.                     pVideoInfoRequest->SetMessageId(pNewAppTaskMessage->GetMessageId());
  2214.                     pVideoInfoRequest->SetSrcFile(pNewAppTaskMessage->GetFullPathFileName());
  2215.                     
  2216.                     VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
  2217.                     if(NULL !=  pVideoInfoRequest)
  2218.                     {
  2219.                         delete pVideoInfoRequest;
  2220.                         pVideoInfoRequest = NULL;
  2221.                     }
  2222.                     break;
  2223.                 }
  2224.             }
  2225.         }
  2226.         
  2227.         //如果没有空闲的转换服务器,将该任务加入等待列表
  2228.         if(FALSE == bFree)
  2229.         {   
  2230.             m_VideoWaitQueue.push(pNewAppTaskMessage);
  2231. //            AppTaskMessage* p=m_TransDocWaitQueue.top();
  2232. //            printf("333  target:%s,prefix:%s,type:%d\n",p->GetTargetFullPathFileName().c_str(),p->GetFilePrefix().c_str(),p->GetMessagePara().unTransDoc.enumTansType);        
  2233.             printf("m_VideoWaitQueue.size:%d\n",m_VideoWaitQueue.size());
  2234.         }
  2235.     }   
  2236.     else if(APP_MESSAGE_DYNAMIC_PPT_TRANS_TASK == tAppMessageType)
  2237.     {
  2238.         TaskMessageList::const_iterator iterIdCheck;
  2239.         for (iterIdCheck=m_TransDynamicPptRunQueue.begin(); iterIdCheck!=m_TransDynamicPptRunQueue.end(); iterIdCheck++)
  2240.         {
  2241.             AppTaskMessage* pTaskMessage = *iterIdCheck;
  2242.             if(pTaskMessage->GetMessageId() == strMessageId)
  2243.             {
  2244.                 bFind = TRUE;
  2245.                 break;
  2246.             }
  2247.         }

  2248.         if(FALSE == bFind)
  2249.         {
  2250.             AppTaskMessage* pTaskMessage;
  2251.             TaskMessagePriorityQueue tmpQueue;
  2252.             while ( !m_TransDynamicPptWaitQueue.empty() )
  2253.             {
  2254.                 pTaskMessage = m_TransDynamicPptWaitQueue.top( );
  2255.                 m_TransDynamicPptWaitQueue.pop( );
  2256.                 if(pTaskMessage->GetMessageId() == strMessageId)
  2257.                 {
  2258.                     bFind = TRUE;
  2259.                 }

  2260.                 tmpQueue.push( pTaskMessage );
  2261.             }
  2262.             while ( !tmpQueue.empty() )
  2263.             {
  2264.                 pTaskMessage = tmpQueue.top( );
  2265.                 tmpQueue.pop( );
  2266.                 m_TransDynamicPptWaitQueue.push(pTaskMessage );
  2267.             }
  2268.             
  2269.         }

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

  2275.             pResult->SetMessageId(taskInfo.GetMessageId());
  2276.             pResult->SetResult(FALSE);
  2277.             pResult->SetErrorCode(RET_E_REPEATED_TS_TRANS_TASK);
  2278.             pResult->SetAppTargetIp(taskInfo.GetIpAddr());
  2279.             pResult->SetAppTargetPort(taskInfo.GetPort());
  2280.   
  2281.             (SessionManager::GetInstance()).SendAppMessage(*pResult);
  2282.             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__);               
  2283. //            LOG4CXX_ERROR(g_Dslogger, "error message from application client. Repeated Message ID: ");
  2284. //            LOG4CXX_ERROR(g_Dslogger, taskInfo.GetMessageId());

  2285.             
  2286.                                 if(NULL != pResult)
  2287.                                 {
  2288.                                    delete pResult;
  2289.                                    pResult = NULL;
  2290.                                 }
  2291.              return;
  2292.         }

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

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

  2324. //               printf("ccc  target:%s,prefix:%s\n",pTransitionRequest->GetTargetFolder().c_str(),pTransitionRequest->GetPrefix().c_str());
  2325.                 PPTTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  2326.                 if(NULL != pTransitionRequest)
  2327.                 {
  2328.                     delete pTransitionRequest;
  2329.                     pTransitionRequest = NULL;
  2330.                 }
  2331.                 break;
  2332.             }
  2333.         }

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


  2347. }

  2348. s32 DsManage::OnTimer()
  2349. {
  2350.     //初始化是否存在四种队列超时任务
  2351.     bool bFindPPT = FALSE;
  2352.     bool bFindVideo = FALSE;
  2353.     bool bFindDoc = FALSE;
  2354.     bool bFindDocWindows = FALSE;
  2355.     TaskTimeInfo tTaskTimeInfo;
  2356.     if(FALSE == DsGetTimeInfo(&tTaskTimeInfo))
  2357.     {
  2358.         return -1;
  2359.     }   

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

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

  2370.             if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
  2371.             {
  2372.                 AppVideoTransResultMessage* pResult = new AppVideoTransResultMessage;
  2373.                 //报告失败
  2374.                
  2375.                 //连接和发送转换结果给应用客户端
  2376.                 strMessageId = pTaskMessage->GetMessageId();
  2377.                 pResult->SetMessageId(strMessageId);
  2378.                 pResult->SetResult(FALSE);
  2379.                 pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);
  2380.                 pResult->SetTargetFullPathFileName("");
  2381.                 //根据转换结果执行相应处理
  2382.                 string strAppTargetIp;
  2383.                 u32 dwAppTargetPort;
  2384.                 if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  2385.                 {
  2386.                     pResult->SetAppTargetIp(strAppTargetIp);
  2387.                     pResult->SetAppTargetPort(dwAppTargetPort);
  2388.                 }
  2389.                 else
  2390.                 {
  2391.                 //error
  2392.                 }

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

  2405.                 break;                 
  2406.             }
  2407.             else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
  2408.             {
  2409.                 AppVideoCaptureResultMessage* pResult = new AppVideoCaptureResultMessage;
  2410.                 //报告失败
  2411.                
  2412.                 //连接和发送转换结果给应用客户端
  2413.                 strMessageId = pTaskMessage->GetMessageId();
  2414.                 pResult->SetMessageId(strMessageId);
  2415.                 pResult->SetResult(FALSE);
  2416.                 pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);
  2417.                 pResult->SetCount(0);
  2418.                 //根据转换结果执行相应处理
  2419.                 string strAppTargetIp;
  2420.                 u32 dwAppTargetPort;
  2421.                 if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  2422.                 {
  2423.                     pResult->SetAppTargetIp(strAppTargetIp);
  2424.                     pResult->SetAppTargetPort(dwAppTargetPort);
  2425.                 }
  2426.                 else
  2427.                 {
  2428.                 //error
  2429.                 }

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

  2442.                 break;                 

  2443.             }
  2444.             else if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
  2445.             {
  2446.                 AppVideoInfoResultMessage* pResult = new AppVideoInfoResultMessage;
  2447.                 //报告失败
  2448.                
  2449.                 //连接和发送转换结果给应用客户端
  2450.                 strMessageId = pTaskMessage->GetMessageId();
  2451.                 pResult->SetMessageId(strMessageId);
  2452.                 pResult->SetResult(FALSE);
  2453.                 pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);
  2454.                 pResult->SetDuration(0);
  2455.                 pResult->SetResolution("");
  2456.                 pResult->SetAudioCode("");
  2457.                 pResult->SetVideoCode("");
  2458.                 pResult->SetAudioTrack("");
  2459.                 pResult->SetVideoType("");
  2460.                 pResult->SetFrameRate(0);
  2461.                 pResult->SetBitRate(0);
  2462.                 //根据转换结果执行相应处理
  2463.                 string strAppTargetIp;
  2464.                 u32 dwAppTargetPort;
  2465.                 if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  2466.                 {
  2467.                     pResult->SetAppTargetIp(strAppTargetIp);
  2468.                     pResult->SetAppTargetPort(dwAppTargetPort);
  2469.                 }
  2470.                 else
  2471.                 {
  2472.                 //error
  2473.                 }

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

  2486.                 break;                 
  2487.                
  2488.             }
  2489.             else
  2490.             {
  2491.                 //错误日志
  2492.             }

  2493.         }
  2494.     }

  2495.     if(TRUE == bFindVideo)
  2496.     {
  2497.         //检查任务等待队列是否有转换任务在等待,没有则直接返回
  2498.         //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  2499.         if( !g_cDsManage.m_VideoWaitQueue.empty() )
  2500.         {
  2501.             for(u32 dwTsNo =1; dwTsNo <MAX_VIDEO_TRANS_SERVER_NUM; dwTsNo++)
  2502.             {
  2503.                 if(TS_FREE == g_cDsManage.VideoTs[dwTsNo].GetState())
  2504.                 {
  2505.                     AppTaskMessage*  pTaskMessage = g_cDsManage.m_VideoWaitQueue.top( );
  2506.                     AppMessageType tAppMessageType = pTaskMessage->GetAppMessageType();                                       
  2507.                     g_cDsManage.m_VideoWaitQueue.pop( );         
  2508.                     //设置时间
  2509.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  2510.                     g_cDsManage.m_VideoRunQueue.push_back(pTaskMessage);
  2511.                                             
  2512.                     g_cDsManage.VideoTs[dwTsNo].SetMessageInTs(pTaskMessage);
  2513.                     g_cDsManage.VideoTs[dwTsNo].SetState(TS_RUNNING);
  2514.                     pTaskMessage->SetTsNum(dwTsNo);
  2515.                     
  2516.                     if(APP_MESSAGE_VIDEO_TRANS_TASK == tAppMessageType)
  2517.                     {
  2518.                         TransVideoRequest* pTransVideoRequest = new TransVideoRequest;
  2519.                         pTransVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  2520.                         pTransVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  2521.                         pTransVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  2522.                         
  2523.                     
  2524.                         char cFormat[100];
  2525.                         sprintf(cFormat, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwFormat);
  2526.                         pTransVideoRequest->SetFormat(cFormat);
  2527.                     
  2528.                         char cBitRate[100];
  2529.                         sprintf(cBitRate, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwBitrate);
  2530.                         pTransVideoRequest->SetBitRate(cBitRate);
  2531.                     
  2532.                         char cWidth[100];
  2533.                         char cHeight[100];
  2534.                         string strWidth,strHeight,strResolution;
  2535.                         sprintf(cWidth, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionWidth);
  2536.                         sprintf(cHeight, "%d", pTaskMessage->GetMessagePara().unTransVideo.dwResolutionHeight);
  2537.                         strWidth = cWidth;
  2538.                         strHeight = cHeight;
  2539.                         strResolution = strWidth +"*"+strHeight;
  2540.                         pTransVideoRequest->SetResolution(strResolution);
  2541.                     
  2542.                         g_cDsManage.VideoTs[dwTsNo].GetTsSession()->SendMessage(*pTransVideoRequest);
  2543.                         if(NULL != pTransVideoRequest)
  2544.                         {
  2545.                             delete pTransVideoRequest;
  2546.                             pTransVideoRequest = NULL;
  2547.                         }
  2548.                     
  2549.                     }
  2550.                     else if(APP_MESSAGE_VIDEO_CAPTURE_TASK == tAppMessageType)
  2551.                     {
  2552.                         CapVideoRequest* pCapVideoRequest = new CapVideoRequest;
  2553.                         pCapVideoRequest->SetMessageId(pTaskMessage->GetMessageId());
  2554.                         pCapVideoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  2555.                         pCapVideoRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  2556.                         pCapVideoRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  2557.                     
  2558.                         char cStart[100];
  2559.                         sprintf(cStart, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwStartTIme);
  2560.                         pCapVideoRequest->SetStart(cStart);
  2561.                     
  2562.                         char cCount[100];
  2563.                         sprintf(cCount, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwPhotoCount);
  2564.                         pCapVideoRequest->SetCount(cCount);
  2565.                     
  2566.                     
  2567.                         char cInterval[100];
  2568.                         sprintf(cInterval, "%d", pTaskMessage->GetMessagePara().unCapVideo.dwSustainedTime);
  2569.                         pCapVideoRequest->SetInterval(cInterval);
  2570.                         
  2571.                         g_cDsManage.VideoTs[dwTsNo].GetTsSession()->SendMessage(*pCapVideoRequest);
  2572.                         if(NULL !=  pCapVideoRequest)
  2573.                         {
  2574.                             delete pCapVideoRequest;
  2575.                             pCapVideoRequest = NULL;
  2576.                         }
  2577.                     
  2578.                     }
  2579.                     else //if(APP_MESSAGE_VIDEO_INFO_TASK == tAppMessageType)
  2580.                     {
  2581.                         GetVideoInfoRequest* pVideoInfoRequest = new GetVideoInfoRequest;
  2582.                         pVideoInfoRequest->SetMessageId(pTaskMessage->GetMessageId());
  2583.                         pVideoInfoRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  2584.                         
  2585.                         g_cDsManage.VideoTs[dwTsNo].GetTsSession()->SendMessage(*pVideoInfoRequest);
  2586.                         if(NULL !=  pVideoInfoRequest)
  2587.                         {
  2588.                             delete pVideoInfoRequest;
  2589.                             pVideoInfoRequest = NULL;
  2590.                         }
  2591.                     
  2592.                     }

  2593.                     break;
  2594.                 }
  2595.    
  2596.              }
  2597.         
  2598.          }        

  2599.     }

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

  2605.         if(MAX_DYNAMIC_PPT_TASK_TIMEOUT_MINUTES <= (((tTaskTimeInfo.m_wHour)*60+tTaskTimeInfo.m_wMinute)-((pTaskMessage->GetTaskTimeInfo()->m_wHour)*60+pTaskMessage->GetTaskTimeInfo()->m_wMinute)))
  2606.         {
  2607.             bFindPPT = TRUE;
  2608.             //报告失败
  2609.             AppDynamicPptTransResultMessage*  pResult = new AppDynamicPptTransResultMessage;
  2610.             //连接和发送转换结果给应用客户端
  2611.             strMessageId = pTaskMessage->GetMessageId();
  2612.             pResult->SetMessageId(strMessageId);
  2613.             pResult->SetResult(FALSE);
  2614.             pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);   
  2615.             pResult->SetPages(0);
  2616.    
  2617.             //根据转换结果执行相应处理
  2618.             string strAppTargetIp;
  2619.             u32 dwAppTargetPort;
  2620.             if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  2621.             {
  2622.                 pResult->SetAppTargetIp(strAppTargetIp);
  2623.                 pResult->SetAppTargetPort(dwAppTargetPort);
  2624.             }
  2625.             else
  2626.             {
  2627.             //error
  2628.             }

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

  2641.             break;

  2642.         }
  2643.         
  2644.     }

  2645.     if(TRUE == bFindPPT)
  2646.     {
  2647.         //检查任务等待队列是否有转换任务在等待,没有则直接返回
  2648.         //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  2649.         if( !g_cDsManage.m_TransDynamicPptWaitQueue.empty() )
  2650.         {
  2651.             for(u32 dwTsNo =1; dwTsNo <MAX_DANAMIC_PPT_TRANS_SERVER_NUM; dwTsNo++)
  2652.             {
  2653.                 if(TS_FREE == g_cDsManage.PPTTs[dwTsNo].GetState())
  2654.                 {
  2655.                     AppTaskMessage*  pTaskMessage = g_cDsManage.m_TransDynamicPptWaitQueue.top( );
  2656.                     g_cDsManage.m_TransDynamicPptWaitQueue.pop( );         
  2657.                     //设置时间
  2658.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  2659.                     g_cDsManage.m_TransDynamicPptRunQueue.push_back(pTaskMessage);
  2660.                                             
  2661.                     g_cDsManage.PPTTs[dwTsNo].SetMessageInTs(pTaskMessage);
  2662.                     g_cDsManage.PPTTs[dwTsNo].SetState(TS_RUNNING);
  2663.                     pTaskMessage->SetTsNum(dwTsNo);
  2664.                     TransitionRequest* pTransitionRequest = new TransitionRequest;
  2665.                     pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  2666.                     pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  2667.                     pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  2668.                     pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  2669.                     pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  2670.         
  2671.                     g_cDsManage.PPTTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  2672.                     if(NULL !=  pTransitionRequest)
  2673.                     {
  2674.                         delete pTransitionRequest;
  2675.                         pTransitionRequest = NULL;
  2676.                     }
  2677.                     break;
  2678.                 }
  2679.    
  2680.              }
  2681.         
  2682.          }        

  2683.     }

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

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

  2710.                     g_cDsManage.DocWindowsTs[dwFreeTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  2711.                     if(NULL != pTransitionRequest)
  2712.                     {
  2713.                         delete pTransitionRequest;
  2714.                         pTransitionRequest = NULL;
  2715.                     }

  2716.                     pTaskMessage->SetTsNum(dwFreeTsNo);
  2717.                     bFindWindows = TRUE;
  2718.                     //将该任务添加到windows版本文档转换运行队列中
  2719.                     TaskTimeInfo tNewTaskTimeInfo ;
  2720.                     if(FALSE == DsGetTimeInfo(&tNewTaskTimeInfo))
  2721.                     {
  2722.                         return -1;
  2723.                     }
  2724.                     pTaskMessage->SetTaskTimeInfo(tNewTaskTimeInfo);
  2725.                     
  2726.                     g_cDsManage.m_TransDocWindowsRunQueue.push_back(pTaskMessage);
  2727.                     break;
  2728.                 }
  2729.             }
  2730.             //如果没有windows 转换服务器空闲,则提升该任务优先级到最高,将该任务加入等待队列
  2731.             if(FALSE == bFindWindows)
  2732.             {
  2733.                 pTaskMessage->SetPriority(9);
  2734.                 g_cDsManage.m_TransDocWindowsWaitQueue.push(pTaskMessage);
  2735.             }

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

  2745.     if(TRUE == bFindDoc)
  2746.     {
  2747.         //检查任务等待队列是否有转换任务在等待,没有则直接返回
  2748.         //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  2749.         if( !g_cDsManage.m_TransDocWaitQueue.empty() )
  2750.         {
  2751.             for(u32 dwTsNo =1; dwTsNo <MAX_DOC_TRANS_SERVER_NUM; dwTsNo++)
  2752.             {
  2753.                 if(TS_FREE == g_cDsManage.DocTs[dwTsNo].GetState())
  2754.                 {
  2755.                     AppTaskMessage*  pTaskMessage = g_cDsManage.m_TransDocWaitQueue.top( );
  2756.                     g_cDsManage.m_TransDocWaitQueue.pop( );         
  2757.                     //设置时间
  2758.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  2759.                     g_cDsManage.m_TransDocRunQueue.push_back(pTaskMessage);
  2760.                                             
  2761.                     g_cDsManage.DocTs[dwTsNo].SetMessageInTs(pTaskMessage);
  2762.                     g_cDsManage.DocTs[dwTsNo].SetState(TS_RUNNING);
  2763.                     pTaskMessage->SetTsNum(dwTsNo);
  2764.                     TransitionRequest* pTransitionRequest = new TransitionRequest;
  2765.                     pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  2766.                     pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  2767.                     pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  2768.                     pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  2769.                     pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  2770.         
  2771.                     g_cDsManage.DocTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  2772.                     if(NULL !=  pTransitionRequest)
  2773.                     {
  2774.                         delete pTransitionRequest;
  2775.                         pTransitionRequest = NULL;
  2776.                     }
  2777.                     break;
  2778.                 }
  2779.    
  2780.              }
  2781.         
  2782.          }        

  2783.     }


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

  2789.         if(MAX_DOC_TASK_TIMEOUT_MINUTES <= (((tTaskTimeInfo.m_wHour)*60+tTaskTimeInfo.m_wMinute)-((pTaskMessage->GetTaskTimeInfo()->m_wHour)*60+pTaskMessage->GetTaskTimeInfo()->m_wMinute)))
  2790.         {
  2791.             bFindDocWindows = TRUE;
  2792.             //报告失败
  2793.             AppDocTransResultMessage*  pResult = new AppDocTransResultMessage;
  2794.             //连接和发送转换结果给应用客户端
  2795.             strMessageId = pTaskMessage->GetMessageId();
  2796.             pResult->SetMessageId(strMessageId);
  2797.             pResult->SetResult(FALSE);
  2798.             pResult->SetErrorCode(RET_E_EXCUTE_TASK_TIMEOUT);   
  2799.             pResult->SetPages(0);
  2800.    
  2801.             //根据转换结果执行相应处理
  2802.             string strAppTargetIp;
  2803.             u32 dwAppTargetPort;
  2804.             if(pTaskMessage->GetAppTargetInfo(strAppTargetIp,dwAppTargetPort))
  2805.             {
  2806.                 pResult->SetAppTargetIp(strAppTargetIp);
  2807.                 pResult->SetAppTargetPort(dwAppTargetPort);
  2808.             }
  2809.             else
  2810.             {
  2811.             //error
  2812.             }

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

  2825.             break;

  2826.         }
  2827.         
  2828.     }

  2829.     if(TRUE == bFindDocWindows)
  2830.     {
  2831.         //检查任务等待队列是否有转换任务在等待,没有则直接返回
  2832.         //如果有,为其分配一个可用的空闲服务器,并发送转换命令给转换服务器,同时将该任务添加到运行队列
  2833.         if( !g_cDsManage.m_TransDocWindowsWaitQueue.empty() )
  2834.         {
  2835.             for(u32 dwTsNo =1; dwTsNo <MAX_DOC_WINDOWS_TRANS_SERVER_NUM; dwTsNo++)
  2836.             {
  2837.                 if(TS_FREE == g_cDsManage.DocWindowsTs[dwTsNo].GetState())
  2838.                 {
  2839.                     AppTaskMessage*  pTaskMessage = g_cDsManage.m_TransDocWindowsWaitQueue.top( );
  2840.                     g_cDsManage.m_TransDocWindowsWaitQueue.pop( );         
  2841.                     //设置时间
  2842.                     pTaskMessage->SetTaskTimeInfo(tTaskTimeInfo);
  2843.                     g_cDsManage.m_TransDocWindowsRunQueue.push_back(pTaskMessage);
  2844.                                             
  2845.                     g_cDsManage.DocWindowsTs[dwTsNo].SetMessageInTs(pTaskMessage);
  2846.                     g_cDsManage.DocWindowsTs[dwTsNo].SetState(TS_RUNNING);
  2847.                     pTaskMessage->SetTsNum(dwTsNo);
  2848.                     TransitionRequest* pTransitionRequest = new TransitionRequest;
  2849.                     pTransitionRequest->SetMessageId(pTaskMessage->GetMessageId());
  2850.                     pTransitionRequest->SetSrcFile(pTaskMessage->GetFullPathFileName());
  2851.                     pTransitionRequest->SetTargetFolder(pTaskMessage->GetTargetFullPathFileName());
  2852.                     pTransitionRequest->SetPrefix(pTaskMessage->GetFilePrefix());
  2853.                     pTransitionRequest->SetTransType(pTaskMessage->GetMessagePara().unTransDoc.enumTansType);
  2854.         
  2855.                     g_cDsManage.DocWindowsTs[dwTsNo].GetTsSession()->SendMessage(*pTransitionRequest);
  2856.                     if(NULL !=  pTransitionRequest)
  2857.                     {
  2858.                         delete pTransitionRequest;
  2859.                         pTransitionRequest = NULL;
  2860.                     }
  2861.                     break;
  2862.                 }

  2863.              }
  2864.         
  2865.          }        

  2866.     }

  2867. }



 楼主| keer_zu 发表于 2015-8-11 09:30 | 显示全部楼层
本帖最后由 keer_zu 于 2015-8-12 09:45 编辑

2 ------


  1. #include <cassert>

  2. #ifdef _WIN32
  3. #include <WS2tcpip.h>
  4. #else
  5. #include <arpa/inet.h>
  6. //#include <sys/types.h>
  7. //#include <sys/socket.h>
  8. //#include <netinet/in.h>
  9. #endif
  10. #include <errno.h>
  11. #include <memory.h>
  12. #ifndef __NO_LOGGER__

  13. #include "interfaceapiimp.h"
  14. #endif


  15. #include "connbaseimp.h"
  16. #include "eventlooperimp.h"
  17. using namespace cdy;

  18. Connector::Connector(const std::string &host, short port, IConnectorAcceptorSink *sink)
  19.         : m_imp(new ConnectorImp(host, port, sink, this))
  20. {
  21. }
  22.         
  23. Connector::~Connector()
  24. {
  25.         m_imp->Cancel();
  26.         delete m_imp;
  27.         m_imp = NULL;
  28. }

  29. //@param timeout means the connect timeout value in millesecond.
  30. int Connector::Connect(long timeout)
  31. {
  32.         if (m_imp)
  33.                 return m_imp->Connect(timeout);
  34.         return -1;
  35. }
  36.         
  37. void Connector::Cancel()
  38. {
  39.         if (m_imp)
  40.                 m_imp->Cancel();
  41. }

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

  46. Acceptor::~Acceptor()
  47. {
  48.         delete m_imp;
  49.         m_imp = NULL;
  50. }

  51. int Acceptor::StartListen()
  52. {
  53.         if (m_imp)
  54.                 return m_imp->StartListen();
  55.         return -1;
  56. }
  57.         
  58. void Acceptor::Stop()
  59. {
  60.         if (m_imp)
  61.                 m_imp->Stop();
  62. }

  63. Connection::~Connection()
  64. {
  65. }

  66. bool StrToAddress(const string &str, short port, struct sockaddr_in *addr)
  67. {
  68.         if (!addr)
  69.                 return false;
  70.                
  71.     addr->sin_family = AF_INET;  
  72.     addr->sin_port = htons(port);  
  73. #ifdef WIN32  
  74.     addr->sin_addr.S_un.S_addr = inet_addr(str.c_str());  
  75. #else  
  76.     addr->sin_addr.s_addr = inet_addr(str.data());  
  77. #endif  
  78.     memset(addr->sin_zero, 0x00, 8);
  79.         return true;
  80. }

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

  84.         if (addr->ss_family == AF_INET){
  85.                 struct sockaddr_in *s = (struct sockaddr_in *)addr;
  86.                 port = ntohs(s->sin_port);
  87.                 inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr));
  88.         } else { // AF_INET6
  89.                 struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
  90.                 port = ntohs(s->sin6_port);
  91.                 inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof(ipstr));
  92.         }

  93.         str.assign(ipstr);
  94.         return 0;
  95. }

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

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

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

  106. static void on_connect(evutil_socket_t sock, short events, void * args)
  107. {
  108.         ConnectorImp *connector = (ConnectorImp*)args;
  109.         string addr;
  110.         short port = 0;
  111.         int err = 0;
  112.         if (events & EV_TIMEOUT)
  113.                 err = -1;
  114.         else
  115.                 err = GetPeerAddress(sock, addr, port);

  116.         if (connector){
  117.                 connector->OnConnectResult(sock, err, addr, port);
  118.         }
  119. }

  120. static void on_accept(evutil_socket_t sock, short events, void * args)
  121. {
  122.         AcceptorImp *acceptor = (AcceptorImp*)args;
  123.         string saddr;
  124.         short port = 0;
  125.         sockaddr_storage addr;
  126. #ifdef WIN32  
  127.         int addrLen = sizeof(addr);
  128. #else
  129.         socklen_t addrLen = sizeof(addr);
  130. #endif
  131.         
  132.         int err = 0;
  133.         if (events & EV_TIMEOUT)
  134.                 err = -1;
  135.         if (acceptor){
  136.                 evutil_socket_t newSock = accept(sock, (sockaddr*)&addr, &addrLen);
  137.                 err = GetPeerAddress(newSock, saddr, port);
  138.                 acceptor->OnConnectResult(newSock, err, saddr, port);
  139.         }
  140. }

  141. static void on_read(evutil_socket_t sock, short events, void * args)
  142. {
  143.         LoggerUser& logerUser = LoggerUser::GetInstance();
  144.         ConnectionImp *conn = (ConnectionImp*)args;
  145.         logerUser.Debug("%s  conn:0x%x\n",__FUNCTION__,conn);
  146.         if (events & EV_READ){
  147.                 if (conn){
  148.                         conn->OnRead(sock);
  149.                 }
  150.         }
  151. }

  152. static void on_write(evutil_socket_t sock, short events, void * args)
  153. {
  154.         ConnectionImp *conn = (ConnectionImp*)args;
  155.         if (events & EV_WRITE){
  156.                 if (conn){
  157.                         conn->OnWrite(sock);
  158.                 }
  159.         }
  160. }

  161. AcceptorImp::AcceptorImp(const std::string &addr, short port, IConnectorAcceptorSink *sink, Acceptor *wrapper)
  162.         : m_addr(addr)
  163.         , m_port(port)
  164.         , m_sink(sink)
  165.         , m_fd(-1)
  166.         , m_evBase(NULL)
  167.         , m_connectEvent(NULL)
  168.         , m_wrapper(wrapper)
  169. {
  170. }

  171. int AcceptorImp::StartListen()
  172. {
  173.         struct sockaddr_in addr;
  174.         
  175.         if (!StrToAddress(m_addr, m_port, &addr))
  176.                 return -1;
  177.         
  178.         m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  179.         if (evutil_make_socket_nonblocking(m_fd) != 0)
  180.                 return -1;
  181.         
  182.         if (evutil_make_listen_socket_reuseable(m_fd) != 0)
  183.                 return -1;

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

  194. void AcceptorImp::Stop()
  195. {
  196.     evutil_closesocket(m_fd);
  197.     m_fd = -1;
  198.     if (m_connectEvent)
  199.     {
  200.         event_del(m_connectEvent);
  201.     }
  202.     m_connectEvent = NULL;
  203.    
  204. }

  205. void AcceptorImp::OnConnectResult(evutil_socket_t sock, int error, string &peerAddr, short peerPort)
  206. {
  207.         if (!m_sink)
  208.                 return;
  209.         
  210.         ConnectionImp *conn = NULL;
  211.         if (!error){
  212.                 conn = new ConnectionImp(sock, m_evBase);
  213.                 conn->SetPeerAddress(peerAddr);
  214.                 conn->SetPeerPort(peerPort);
  215.         }
  216.         m_sink->OnConnection(conn, this->m_wrapper);
  217. }

  218. ConnectorImp::ConnectorImp(const string &host, short port, IConnectorAcceptorSink *sink, Connector *wrapper)
  219.         : m_peerAddr(host)
  220.         , m_peerPort(port)
  221.         , m_sink(sink)
  222.         , m_fd(-1)
  223.         , m_evBase(NULL)
  224.         , m_connectEvent(NULL)
  225.         , m_wrapper(wrapper)
  226. {
  227.         EventLooperImp &el = (EventLooperImp&)EventLooper::GetInstance();
  228.         m_evBase = el.CurrentEvBase();
  229. }

  230. ConnectorImp::~ConnectorImp()
  231. {
  232.         Cancel();

  233.         if (m_fd != -1){
  234.                 evutil_closesocket(m_fd);
  235.                 m_fd = -1;
  236.         }

  237.         event_del(m_connectEvent);
  238.         event_free(m_connectEvent);
  239.         m_connectEvent = NULL;
  240. }

  241. int ConnectorImp::Connect(long timeout)
  242. {
  243.         struct timeval tv = {timeout/1000, (timeout%1000)*1000};
  244.         struct sockaddr_in peerAddr;
  245.         if (!StrToAddress(m_peerAddr, m_peerPort, &peerAddr))
  246.                 return -1;
  247.         
  248.         m_connecting = true;
  249.         m_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  250.         evutil_make_socket_nonblocking(m_fd);
  251.         
  252.         m_connectEvent = event_new(m_evBase, m_fd, EV_WRITE, on_connect, (void*)this);
  253.         event_add(m_connectEvent, &tv);
  254.         connect(m_fd, (struct sockaddr*)&peerAddr, sizeof(peerAddr));
  255.         return 0;
  256. }

  257. void ConnectorImp::Cancel()
  258. {
  259.         if (!m_connecting)
  260.                 return;

  261.         m_sink = NULL;
  262.         evutil_closesocket(m_fd);
  263.         m_fd = -1;
  264.         
  265.         event_del(m_connectEvent);
  266.         event_free(m_connectEvent);
  267.         m_connectEvent = NULL;
  268. }

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

  272.         if (!m_sink)
  273.                 return;
  274.         
  275.         ConnectionImp *conn = NULL;
  276.         if (!error){
  277.                 conn = new ConnectionImp(sock, m_evBase);
  278.                 conn->SetPeerAddress(peerAddr);
  279.                 conn->SetPeerPort(peerPort);
  280.                 m_fd = -1; //to avoid close it later.
  281.         }
  282.         m_sink->OnConnection(conn, this->m_wrapper);
  283. }

  284. ConnectionImp::ConnectionImp(evutil_socket_t fd, struct event_base *evBase)
  285.         : m_sink(NULL)
  286.         , m_peerPort(0)
  287.         , m_fd(fd)
  288.         , m_evBase(evBase)
  289.         , m_closing(false)
  290. {
  291.         m_readEvent = event_new(m_evBase, m_fd, EV_READ | EV_PERSIST, on_read, (void*)this);
  292.         m_writeEvent = event_new(m_evBase, m_fd, EV_WRITE, on_write, (void*)this);

  293.         event_add(m_readEvent, NULL);
  294.         //event_add(m_writeEvent, NULL);
  295.         m_writeBuffer = evbuffer_new();
  296. }

  297. ConnectionImp::~ConnectionImp()
  298. {
  299.         Close();
  300. }

  301. int ConnectionImp::Send(const char *data, int len)
  302. {
  303.         if (m_closing)
  304.                 return -1;
  305.                
  306.         size_t left = evbuffer_get_length(m_writeBuffer);
  307.         if (evbuffer_add(m_writeBuffer, data, len) != 0)
  308.                 return -1;
  309.         
  310.         int rt = 0;
  311.         if (left != 0){
  312.                 rt = event_add(m_writeEvent, NULL);
  313.         } else {
  314.                 rt = evbuffer_write(m_writeBuffer, m_fd);
  315.         }
  316.         return rt;
  317. }

  318. const std::string& ConnectionImp::GetPeerAddress()
  319. {
  320.         return m_peerAddr;
  321. }

  322. short ConnectionImp::GetPeerPort()
  323. {
  324.         return m_peerPort;
  325. }

  326. void ConnectionImp::OnRead(evutil_socket_t sock)
  327. {
  328.         LoggerUser& logerUser = LoggerUser::GetInstance();
  329.         logerUser.Debug("OnRead");
  330.         assert (sock == m_fd);
  331.         int sz = recv(sock, m_readBuffer, MAX_READ_LEN, 0);
  332.         int err;
  333.         if(sz <= 0){
  334. #ifdef WIN32
  335.                 err = WSAGetLastError();
  336. #else
  337.                 err = errno;
  338. #endif
  339.                 if (err == EWOULDBLOCK || err == EAGAIN)
  340.                         return;
  341.                
  342.                 IConnectionSink *sink = m_sink;
  343.                 Close();
  344.                 if (sink){
  345.                         sink->OnDisconnect(err, this);
  346.                 }
  347.         } else {
  348.                 if (m_sink){
  349.                         m_sink->OnData(m_readBuffer, sz, this);
  350.                 }
  351.         }
  352. }

  353. void ConnectionImp::OnWrite(evutil_socket_t sock)
  354. {
  355.         assert (sock == m_fd);
  356.         size_t left = evbuffer_get_length(m_writeBuffer);
  357.         
  358.         if (left != 0){
  359.                 int sz = evbuffer_write(m_writeBuffer, m_fd);
  360.                
  361.                 if (sz < 0){
  362.                         int err;
  363. #ifdef WIN32
  364.                         err = WSAGetLastError();
  365. #else
  366.                         err = errno;
  367. #endif
  368.                         if (err != EWOULDBLOCK && err != EAGAIN){
  369.                                 IConnectionSink *sink = m_sink;
  370.                                 Close();
  371.                                 if (sink){
  372.                                         sink->OnDisconnect(err, this);
  373.                                 }
  374.                         }
  375.                 } else if ((size_t)sz < left){
  376.                         event_add(m_writeEvent, NULL);
  377.                 }
  378.         }
  379. }
  380.         
  381. void ConnectionImp::Close()
  382. {
  383.         if (m_closing)
  384.                 return;
  385.                
  386.         m_closing = true;
  387.         m_sink = NULL;
  388.         evutil_closesocket(m_fd);
  389.         
  390.         m_fd = -1;
  391.         event_del(m_readEvent);
  392.         event_free(m_readEvent);
  393.         m_readEvent = NULL;
  394.         event_del(m_writeEvent);
  395.         event_free(m_writeEvent);
  396.         m_writeEvent = NULL;
  397.         evbuffer_free(m_writeBuffer);
  398.         m_writeBuffer = NULL;
  399. }


  400. void ConnectionImp::SetPeerAddress(const string addr)
  401. {
  402.         m_peerAddr.assign(addr);
  403. }

  404. void ConnectionImp::SetPeerPort(short port)
  405. {
  406.         m_peerPort = port;
  407. }


 楼主| keer_zu 发表于 2015-8-11 09:31 | 显示全部楼层
本帖最后由 keer_zu 于 2015-8-12 09:51 编辑

3 ---------

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

  3. #include <log4cxx/logger.h>
  4. #include <log4cxx/logstring.h>
  5. #include <log4cxx/propertyconfigurator.h>

  6. using namespace log4cxx;
  7. extern LoggerPtr g_logger;

  8. using namespace std;


  9. void SessionImp::ProcessFrame(const char *buf, int length)
  10. {
  11.         int i,len = length,count = 0;
  12.         string newFrame;
  13.         LoggerUser& logerUser = LoggerUser::GetInstance();
  14.         
  15.         if(buf == NULL){
  16.                 logerUser.Error("buf == NULL %d\n",__LINE__);
  17.         }
  18. //        LoggerUser& logerUser = LoggerUser::GetInstance();

  19. //        cout << "OnData" <<"len:" << length <<endl;
  20. build_frame:
  21.         for(i=0;i<len;i++){
  22.                 if(buf[i + count] == '\0'){
  23.                         count = i;
  24.                         goto recv_process;
  25.                 } else {
  26.                         m_rdBuffer.push_back(buf[i + count]);
  27.                 }
  28.         }

  29.         if(i == len)
  30.                 return;

  31. recv_process:

  32.         newFrame.clear();
  33.         
  34.         newFrame.assign(m_rdBuffer.begin(),m_rdBuffer.end());

  35. //        cout << "len:" << newFrame.length() <<endl;
  36.     if(count >0)
  37.     {
  38.             OnFrame(newFrame);
  39.     }
  40.         m_rdBuffer.clear();

  41.         if(len > count + 2){
  42.                
  43.                 count += 1;
  44.                 len = len - count - 1;
  45.                
  46.                 goto build_frame;
  47.         }

  48.         return;
  49. }



  50. void SessionImp::SetConnection(Connection * conn)
  51. {
  52.         LoggerUser& logerUser = LoggerUser::GetInstance();
  53.         
  54.         if(conn == NULL){
  55.                 logerUser.Fatal("%s:SessionImp::%s:%d  error param",__FILE__,__FUNCTION__,__LINE__);
  56.                 return;
  57.         }
  58.         
  59.         m_connection = conn;
  60. }

  61. void SessionImp::SendMessage(string &str)
  62. {
  63.         int ret;
  64.         LoggerUser& logerUser = LoggerUser::GetInstance();

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

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

  70.         }
  71.         
  72. }



  73. TsSessionImp::TsSessionImp(ITsSessionUser *sessionUser,TsSession *tssession)
  74. {
  75.         m_sessionUser = sessionUser;
  76.         m_tssession = tssession;
  77.         m_sessionType = SESSION_TS;
  78. }

  79. void TsSessionImp::SetSessionUser(ITsSessionUser *sessionUser)
  80. {
  81.         m_sessionUser = sessionUser;
  82. }



  83. void TsSessionImp::SendMessage(TsMessageBase &msg)
  84. {
  85.         LoggerUser& logerUser = LoggerUser::GetInstance();
  86.         logerUser.Debug("%s:%s:%d \n",__FILE__,__FUNCTION__,__LINE__);
  87.         string json;
  88.         
  89.         if(msg.Encode(json)){      
  90.               json = json +'\0';
  91.                 printf(" TsSessionImp::SendMessage:%s\n",json.c_str());
  92.                 m_connection->Send(json.data(),json.length());
  93.         } else {
  94.                 logerUser.Error("%s:%s:%d   TsMessageBase.Encode error!\n",__FILE__,__FUNCTION__,__LINE__);
  95.         }
  96. }

  97. void TsSessionImp::Close()
  98. {
  99.         // close connect
  100.         struct TsSessionInfo *tsSessionInfo;
  101.         list<struct TsSessionInfo*>::iterator tlit;

  102.         SessionManagerImp& smi =  SessionManagerImp::GetInstance();
  103.         
  104.         m_connection->Close();

  105.         if (this->m_connection){
  106.                 delete this->m_connection;
  107.                 this->m_connection = NULL;
  108.         }

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

  115.                                 delete tsSessionInfo;
  116.                                 
  117.                                 break;
  118.                         }
  119.                 }
  120.         }

  121.         delete this;
  122. }


  123. void TsSessionImp::OnData(const char *buf, int length, Connection *conn)
  124. {
  125.         ProcessFrame(buf,length);
  126. }

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

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

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



  139.         SessionManagerImp& smi =  SessionManagerImp::GetInstance();

  140.         if(this->m_tssession != NULL)
  141.                 smi.OnSessionClose(*this->m_tssession);
  142.         
  143.         Close();
  144. }

  145. bool TsSessionImp::OnFrame(string &frame)
  146. {
  147.         struct TsSessionInfo *tsSessionInfo;
  148.         list<struct TsSessionInfo*>::iterator it;
  149.         ITsSessionUser* tsSessionUser;

  150.         LoggerUser& logerUser = LoggerUser::GetInstance();

  151.         SessionManagerImp& smi =  SessionManagerImp::GetInstance();
  152.         ITsSessionUser* itsu= smi.GetSessionUser();
  153.         if(itsu == NULL){
  154.                 logerUser.Error("%s:%s:%d   smi.GetSessionUser() == NULL\n",__FILE__,__FUNCTION__,__LINE__);
  155.                 return 0;
  156.         }
  157.         
  158.         TsMessageCodec tmc;
  159.         TsMessageBase* pTsMsg = tmc.Decode(frame);
  160.         if (pTsMsg == NULL) {
  161.                 itsu->OnSessionError(*this->m_tssession);
  162.                 logerUser.Error("message Decode error! frame:%s\n",frame.c_str());
  163.                
  164.                 return 0;
  165.         }


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

  171.                 case TS_MESSAGE_ACCEPT_TASK:   //TS_MESSAGE_TRANSMIT
  172.                         break;

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

  176.                 case TS_MESSAGE_LINK_RESPONSE:  // OnServerLeave is called when heartbeat is not received
  177.                         for(it = smi.m_tsSessionList.begin();it != smi.m_tsSessionList.end();it ++) {
  178.                                 tsSessionInfo = *it;
  179.                                 if(tsSessionInfo != NULL){
  180.                                         if(tsSessionInfo->session == this->m_tssession){
  181.                                                 tsSessionInfo->timeOut = 0;
  182.                                                 break;
  183.                                         }
  184.                                 }
  185.                         }

  186.                         break;
  187.                 default:
  188.                         break;

  189.         
  190.         }

  191.                         if(NULL != pTsMsg){
  192.                                 delete pTsMsg;
  193.                         }

  194.         return 1;
  195. }

  196.         


  197. /////////////////// /// app accept session /////////////////////


  198. void AppServerSessionImp::SetEventListener(IAppEventListener *eventListener)
  199. {
  200.         m_eventListener = eventListener;
  201. }


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

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

  216. void AppServerSessionImp::Close()
  217. {
  218.         m_connection->Close();

  219.         if (this->m_connection){
  220.                 delete this->m_connection;
  221.                 this->m_connection = NULL;
  222.         }

  223.         delete this;
  224. }

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


  227.         ProcessFrame(buf,length);


  228. }

  229. void AppServerSessionImp::OnWrite(Connection *conn)
  230. {

  231. }

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

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

  242.         Close();
  243. }

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

  248.         SessionManagerImp& smi =  SessionManagerImp::GetInstance();

  249.         AppMessageCodec amc;

  250. #ifdef __old_solution__
  251.         AppMessageBase* pAppMsg = amc.Decode(frame);
  252.         if (pAppMsg == NULL) {
  253.                 printf("onframe decode error\n");
  254.                 logerUser.Fatal("message Decode error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
  255.                 return 0;
  256.         }
  257.         
  258.         IAppEventListener* iael = smi.GetAppEventListener();
  259.         if(iael == NULL){
  260.                 logerUser.Error("GetAppEventListener error! %s : %s : %d",__FILE__,__FUNCTION__,__LINE__);
  261.                 return 0;
  262.         }

  263.         switch(pAppMsg->GetAppMessageType()){
  264.                 case APP_MESSAGE_VIDEO_TRANS_TASK:
  265.                 case APP_MESSAGE_PRINT_SCREEN_TASK:
  266.                 case APP_MESSAGE_DOC_TRANS_TASK:
  267.                 case APP_MESSAGE_DYNAMIC_PPT_TRANS_TASK:            
  268.                         iael->OnNewTask(*(AppTaskMessage *)pAppMsg);
  269.                         break;

  270.                 default:
  271.                         break;

  272.         }

  273.         if(NULL != pAppMsg){
  274.                 delete pAppMsg;
  275.         }
  276. #endif
  277.         return 1;
  278. }





  279. //////////////////////// app connect session ///////////////////

  280. void AppClientSessionImp::SendMessage(AppMessageBase &msg)
  281. {
  282.         string json;

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

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

  293. void AppClientSessionImp::Close()
  294. {
  295.         if(m_connection != NULL)
  296.                 m_connection->Close();

  297.         if (this->m_connection){
  298.                 delete this->m_connection;
  299.                 this->m_connection = NULL;
  300.         }

  301.         delete this;
  302. }

  303. void AppClientSessionImp::OnData(const char *buf, int length, Connection *conn)
  304. {
  305.         
  306.         ProcessFrame(buf,length);
  307.         
  308. }

  309. void AppClientSessionImp::OnWrite(Connection *conn)
  310. {

  311. }

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

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

  321.         Close();
  322. }

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

  328.         SessionManagerImp& smi =  SessionManagerImp::GetInstance();


  329.         AppMessageCodec amc;

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

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

  341.                         Close();
  342.                         break;
  343.                 default:
  344.                         break;
  345.         }

  346.         if(NULL != pAppMsg){
  347.                 delete pAppMsg;
  348.         }

  349.         return 1;
  350. #endif
  351. }


  352. /////////////////////////////// TsClientSessionImp /////////////////////////////////////////////////////

  353. void TsClientSessionImp::SendMessage(TsMessageBase &msg)
  354. {
  355.         string json;

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

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


  366. void TsClientSessionImp::Close()
  367. {

  368. }


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

  371. }

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

  375. }

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

  380. }

  381. bool TsClientSessionImp::OnFrame(string &frame)
  382. {

  383. }




laoxu 发表于 2015-8-11 15:51 | 显示全部楼层
都不是好代码,一句注释也未有~~~~~  :dizzy:
 楼主| keer_zu 发表于 2015-8-11 17:35 | 显示全部楼层
laoxu 发表于 2015-8-11 15:51
都不是好代码,一句注释也未有~~~~~

:lol
qhdjxy 发表于 2015-8-11 19:24 | 显示全部楼层
太长了。。。
angus118 发表于 2015-8-11 20:18 | 显示全部楼层
太长不看
fangzimo 发表于 2015-8-12 08:33 | 显示全部楼层
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不想看了
ticomi 发表于 2015-8-12 08:37 | 显示全部楼层
贴代码时注意将代码贴规范,写的也要规范,看起来才容易!
 楼主| keer_zu 发表于 2015-8-12 09:51 | 显示全部楼层
laoxu 发表于 2015-8-11 15:51
都不是好代码,一句注释也未有~~~~~

先从代码风格看。
 楼主| keer_zu 发表于 2015-8-12 09:52 | 显示全部楼层
laoxu 发表于 2015-8-11 15:51
都不是好代码,一句注释也未有~~~~~

先从代 码 风 格 看。
 楼主| keer_zu 发表于 2015-8-12 09:52 | 显示全部楼层
fangzimo 发表于 2015-8-12 08:33
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不 ...

改了
 楼主| keer_zu 发表于 2015-8-12 09:52 | 显示全部楼层
fangzimo 发表于 2015-8-12 08:33
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不 ...

改了
 楼主| keer_zu 发表于 2015-8-12 09:52 | 显示全部楼层
fangzimo 发表于 2015-8-12 08:33
21ic应该有一个编辑代码的文本框,借鉴一下其他论坛上代码的发布方式,可以收起来,这样就不会感觉太长,不 ...

改过了。
 楼主| keer_zu 发表于 2015-8-12 09:53 | 显示全部楼层
ticomi 发表于 2015-8-12 08:37
贴代码时注意将代码贴规范,写的也要规范,看起来才容易!

改过了
ningling_21 发表于 2015-8-13 09:29 | 显示全部楼层

都是楼主的作品?
 楼主| keer_zu 发表于 2015-8-13 09:31 | 显示全部楼层
ningling_21 发表于 2015-8-13 09:29
都是楼主的作品?

三个人的。
 楼主| keer_zu 发表于 2015-8-13 17:29 | 显示全部楼层
yyy71cj 发表于 2015-8-13 16:30
我有个建议,最好是先把框架理出来看下……

有些人代码一开始就没有考虑什么框架,有些一看就知道什么框架。
 楼主| keer_zu 发表于 2015-8-14 09:32 | 显示全部楼层
yyy71cj 发表于 2015-8-14 07:23
抽出函数级的模块结构来也成,好歹也表现一个模块与数据流的关系来

可以吧定义类的头文件给出来,应该一目了然了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1488

主题

12949

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部