#include #include #include #include #include SocketServer::SocketServer(const String &host,int port,int deviceIndex,bool retain,bool debug,bool showSrcDlg,int timeout) : mWDMCap(deviceIndex), mDebug(debug) { if(showSrcDlg)mWDMCap.dialogVideoSource(); if(retain)mMonitorThread.startMonitor(host,port,timeout); } SocketServer::~SocketServer() { mMonitorThread.stopMonitor(); } void SocketServer::acceptHandler(SmartPointer &socketControl) { if(mDebug)sendDebugFrame(*socketControl); else sendFrame(*socketControl); } void SocketServer::message(const String &string) { ::printf("%s\n",string.str()); } void SocketServer::sendFrame(Socket &socketControl) { DiskInfo diskInfo; SystemTime systemTime; String strPathCaptureFile; SocketHeader socketHeader; Array charBytes; FileHandle openFile; DWORD elapsedTime; socketHeader.setVersion(1); socketHeader.setContentType(SocketHeader::ImageJPG); socketHeader.setContentLength(0); strPathCaptureFile.reserve(1024); ::sprintf(strPathCaptureFile,"%04d%02d%02d%02d%02d%02d%02d.jpg", systemTime.year(),systemTime.month(),systemTime.day(), systemTime.hour(),systemTime.minute(),systemTime.second(), systemTime.milliseconds()); elapsedTime=::GetTickCount(); mWDMCap.setCaptureFileName(strPathCaptureFile); mWDMCap.grabFrameNoStop(); elapsedTime=::GetTickCount()-elapsedTime; message(String("[SocketServer::sendFrame] Grab frame took ")+String().fromInt(elapsedTime)+String(" (ms)")); if(!openFile.open(strPathCaptureFile,FileHandle::Read,FileHandle::ShareRead)) { socketHeader.marshall(socketControl); } else { charBytes.size(openFile.size()); socketHeader.setContentLength(charBytes.size()); elapsedTime=::GetTickCount(); openFile.read((BYTE*)&charBytes[0],charBytes.size()); elapsedTime=::GetTickCount()-elapsedTime; message(String("[SocketServer::sendFrame] Read ")+String().fromInt(charBytes.size())+String(" bytes took ")+String().fromInt(elapsedTime)+String(" (ms)")); elapsedTime=::GetTickCount(); socketHeader.marshall(socketControl); socketControl.send((char*)&charBytes[0],charBytes.size()); elapsedTime=::GetTickCount()-elapsedTime; message(String("[SocketServer::sendFrame] Send ")+String().fromInt(charBytes.size())+String(" bytes took ")+String().fromInt(elapsedTime)+String(" (ms)")); openFile.close(); diskInfo.unlink(strPathCaptureFile); } message(String("[SocketServer::sendFrame]Sent ")+String().fromInt(charBytes.size())+String(" bytes")); return; } void SocketServer::sendDebugFrame(Socket &socketControl) { DiskInfo diskInfo; Array charBytes; FileHandle openFile; SocketHeader socketHeader; String strPathFileName; strPathFileName="./image.jpg"; socketHeader.setVersion(1); socketHeader.setContentType(SocketHeader::ImageJPG); socketHeader.setContentLength(0); if(!openFile.open(strPathFileName,FileHandle::Read,FileHandle::ShareRead)) { message("[SocketServer::sendDebugFrame] 'image.jpg' was not found, sending empty content"); socketHeader.marshall(socketControl); } else { charBytes.size(openFile.size()); socketHeader.setContentLength(charBytes.size()); openFile.read((BYTE*)&charBytes[0],charBytes.size()); socketHeader.marshall(socketControl); socketControl.send((char*)&charBytes[0],charBytes.size()); message(String("[SocketServer::sendDebugFrame] Send ")+String().fromInt(charBytes.size())); openFile.close(); } }