#include #include #include #include #include #include #include MonitorThread::MonitorThread() : mIsRunning(false), mTimeout(DefaultTimeout) { mCallback.setCallback(this,&MonitorThread::threadCallback); insertHandler(&mCallback); } MonitorThread::~MonitorThread() { stop(); removeHandler(&mCallback); } void MonitorThread::startMonitor(const String &host,int port,DWORD timeout) { message("MonitorThread::startMonitor"); ThreadMessage threadMessage(ThreadMessage::TM_USER,MsgMonitorStart); mHost=host; mPort=port; mTimeout=timeout; getHostAddress(); postMessage(threadMessage); } void MonitorThread::stopMonitor(void) { message("MonitorThread::startMonitor"); ThreadMessage threadMessage(ThreadMessage::TM_USER,MsgMonitorStop); postMessage(threadMessage); mMonitorEvent.waitEvent(); } DWORD MonitorThread::threadCallback(ThreadMessage &threadMessage) { switch(threadMessage.message()) { case ThreadMessage::TM_CREATE : break; case ThreadMessage::TM_DESTROY : break; case ThreadMessage::TM_USER : switch(MonitorThMsg(threadMessage.userDataOne())) { case MsgMonitorStart : handleMonitorStart(); break; case MsgMonitorStop : handleMonitorStop(); break; } break; } return 0; } void MonitorThread::handleMonitorStart() { DWORD elapsedTime; message("[MonitorThread::handleMonitorStart]ENTER"); mIsRunning=true; message(String("[MonitorThread::handleMonitorStart]InitDelay=")+String().fromInt(InitDelay)+String(" (ms).")); ::Sleep(InitDelay); while(mIsRunning) { elapsedTime=::GetTickCount(); getImage(); elapsedTime=::GetTickCount()-elapsedTime; message("[MonitorThread::handleMonitorStart]GetImage Took "+String().fromInt(elapsedTime)+String(" (ms).")); ::Sleep(mTimeout); } message("]MonitorThread::handleMonitorStart]LEAVE"); } void MonitorThread::handleMonitorStop() { message("[MonitorThread::handleMonitorStop]ENTER"); message("[MonitorThread::handleMonitorStop]LEAVE"); mIsRunning=false; } void MonitorThread::getHostAddress() { Block internetAddresses; HostEnt hostEnt; hostEnt.hostByName(mHost); internetAddresses=hostEnt.addresses(); if(!internetAddresses.size())return; for(int index=0;index")+internetAddresses[0].toString()); } mInternetAddress=internetAddresses[0]; } void MonitorThread::getImage() { INETSocketAddress internetSocketAddress; Socket socket; SocketHeader socketHeader; Array content; message("[MonitorThread::getImage]starting client"); internetSocketAddress.family(PF_INET); internetSocketAddress.port(mPort); internetSocketAddress.internetAddress(mInternetAddress); if(!socket.create()) { message("[MonitorThread::getImage]create socket failed..."); return; } if(!socket.connect(internetSocketAddress)) { message(String("[MonitorThread::getImage]connect to '")+internetSocketAddress.toString()+String("' failed...")); return; } message("[MonitorThread::getImage]reading socket header..."); socketHeader.unmarshall(socket); message("[MonitorThread::getImage]header length",socketHeader.getSizeHeader()); message("[MonitorThread::getImage]version",socketHeader.getVersion()); message("[MonitorThread::getImage]content length",socketHeader.getContentLength()); message("[MonitorThread::getImage]content type",(int)socketHeader.getContentType()); content.size(socketHeader.getContentLength()); message("[MonitorThread::getImage]reading content..."); socket.receive((char*)&content[0],content.size()); saveImage(content); message("[MonitorThread::getImage]done..."); socket.destroy(); } bool MonitorThread::saveImage(Array &imageData) { SystemTime systemTime; String strPathImageFile; FileHandle openFile; if(!imageData.size())return message("[MonitorThread::saveImage] No Data"),false; strPathImageFile.reserve(1024); ::sprintf(strPathImageFile,"%04d%02d%02d%02d%02d%02d%02d.jpg", systemTime.year(),systemTime.month(),systemTime.day(), systemTime.hour(),systemTime.minute(),systemTime.second(), systemTime.milliseconds()); if(!openFile.open(strPathImageFile,FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite)) { message(String("[MonitorThread::saveImage]Open '")+strPathImageFile+String("' for write Failed.")); return false; } openFile.write(&imageData[0],imageData.size()); openFile.close(); return true; }