104 lines
3.4 KiB
C++
104 lines
3.4 KiB
C++
#include <common/OpenFile.hpp>
|
|
#include <common/systime.hpp>
|
|
#include <common/diskinfo.hpp>
|
|
#include <CapServer/SocketServer.hpp>
|
|
#include <CapServer/SocketHeader.hpp>
|
|
|
|
SocketServer::SocketServer(int deviceIndex,bool retain,bool debug,bool showSrcDlg)
|
|
: mWDMCap(deviceIndex), mRetainImage(retain), mDebug(debug)
|
|
{
|
|
if(showSrcDlg)mWDMCap.dialogVideoSource();
|
|
}
|
|
|
|
SocketServer::~SocketServer()
|
|
{
|
|
}
|
|
|
|
void SocketServer::acceptHandler(SmartPointer<Socket> &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<BYTE> 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();
|
|
if(!mRetainImage)diskInfo.unlink(strPathCaptureFile);
|
|
}
|
|
message(String("[SocketServer::sendFrame]Sent ")+String().fromInt(charBytes.size())+String(" bytes"));
|
|
return;
|
|
}
|
|
|
|
void SocketServer::sendDebugFrame(Socket &socketControl)
|
|
{
|
|
DiskInfo diskInfo;
|
|
Array<BYTE> 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();
|
|
}
|
|
}
|