329 lines
9.2 KiB
C++
329 lines
9.2 KiB
C++
#include "observerclientmodel.h"
|
||
#include "mainwindow.h"
|
||
#include "ui_mainwindow.h"
|
||
#include <QWebFrame>
|
||
|
||
QString
|
||
ws2qs(const std::wstring& str)
|
||
{
|
||
return (QString((const QChar*)str.c_str(), str.length()));
|
||
}
|
||
|
||
// Convert a QString to a wstring
|
||
std::wstring
|
||
qs2ws(const QString& str)
|
||
{
|
||
return (std::wstring((wchar_t*)str.unicode(), str.length()));
|
||
}
|
||
|
||
|
||
TObserverClientModel::TObserverClientModel(QObject *parent)
|
||
: QObject(parent)
|
||
, MapType(0)
|
||
{
|
||
}
|
||
|
||
|
||
void TObserverClientModel::Start(std::string address, std::string port)
|
||
{
|
||
ClientSocket = boost::shared_ptr<TClientSocket>(new TClientSocket(IoService));
|
||
|
||
ClientSocket->Open(address, port);
|
||
|
||
RestartHeartbeatTimer();
|
||
RestartMapHeartbeatTimer();
|
||
|
||
IoServiceThread = boost::thread(boost::bind(&boost::asio::io_service::run, &IoService));
|
||
|
||
ClientSocket->ReceiveMapSignal.connect(boost::bind(&TObserverClientModel::OnReceiveMapUpdate, this, _1));
|
||
|
||
ClientSocket->ReceiveAlarmMapSignal.connect(boost::bind(&TObserverClientModel::OnReceiveAlarmMapUpdate, this, _1));
|
||
|
||
|
||
ClientSocket->ReceiveCloseSignal.connect(boost::bind(&TObserverClientModel::OnSocketClosed, this));
|
||
|
||
ClientSocket->ReceiveMessageSignal.connect(boost::bind(&TObserverClientModel::OnReceiveChatMessage, this, _1, _2));
|
||
|
||
|
||
|
||
Timer.TimerSignal.connect(boost::bind(&TObserverClientModel::OnUpdateMapTimer, this));
|
||
|
||
Timer.start(1000);
|
||
}
|
||
|
||
void TObserverClientModel::RestartHeartbeatTimer()
|
||
{
|
||
HeartbeatTimer = boost::shared_ptr<boost::asio::deadline_timer>(new boost::asio::deadline_timer(IoService, boost::posix_time::seconds(3)));
|
||
|
||
HeartbeatTimer->async_wait(boost::bind(&TObserverClientModel::OnHeartbeat, this, boost::asio::placeholders::error));
|
||
|
||
}
|
||
|
||
void TObserverClientModel::RestartMapHeartbeatTimer()
|
||
{
|
||
MapHeartbeatTimer = boost::shared_ptr<boost::asio::deadline_timer>(new boost::asio::deadline_timer(IoService, boost::posix_time::seconds(3)));
|
||
|
||
MapHeartbeatTimer->async_wait(boost::bind(&TObserverClientModel::OnMapHeartbeat, this, boost::asio::placeholders::error));
|
||
|
||
}
|
||
|
||
|
||
void TObserverClientModel::Finish()
|
||
{
|
||
Timer.stop();
|
||
HeartbeatTimer->cancel();
|
||
MapHeartbeatTimer->cancel();
|
||
//HeartbeatTimer = boost::shared_ptr<boost::asio::deadline_timer>();
|
||
//MapHeartbeatTimer = boost::shared_ptr<boost::asio::deadline_timer>();
|
||
|
||
ClientSocket->CloseImmediate();
|
||
|
||
|
||
|
||
}
|
||
|
||
void TObserverClientModel::OnSocketClosed()
|
||
{
|
||
ClientSocket = boost::shared_ptr<TClientSocket>();
|
||
}
|
||
|
||
void TObserverClientModel::OnUpdateMapTimer()
|
||
{
|
||
UpdatingMapMutex.lock();
|
||
|
||
MainWindowPtr->GetUi()->webView->page()->mainFrame()->evaluateJavaScript("Clear();");
|
||
|
||
|
||
if (MapType == 0)
|
||
{
|
||
|
||
|
||
for (std::vector<TUserInfo>::iterator i = UserInfoArr.begin(); i != UserInfoArr.end(); ++i)
|
||
{
|
||
QString posX = QString::number( i->PosX );
|
||
QString posY = QString::number( i->PosY );
|
||
QString mapState = QString::number(i->MapState);
|
||
|
||
if (i->PosX != 0.f && i->PosY != 0.f)
|
||
{
|
||
MainWindowPtr->GetUi()->webView->page()->mainFrame()->evaluateJavaScript("AddMarker("+posX+", "+posY+", "+ mapState + ");");
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (std::vector<TUserInfo>::iterator i = AlarmUserInfoArr.begin(); i != AlarmUserInfoArr.end(); ++i)
|
||
{
|
||
QString posX = QString::number( i->PosX );
|
||
QString posY = QString::number( i->PosY );
|
||
QString mapState = QString::number(i->MapState);
|
||
|
||
|
||
|
||
std::wstring Uik = L"<EFBFBD><EFBFBD><EFBFBD> <20>";
|
||
std::wstring StateHeader = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ";
|
||
|
||
QString text = ws2qs(Uik);
|
||
text = text + QString::number(i->Uik)+"\\n";
|
||
text = text +QString::fromUtf8(i->LastName.c_str());
|
||
text = text +"\\n" + QString::fromUtf8(i->FirstName.c_str());
|
||
text = text + "\\n"+QString::fromUtf8(i->MiddleName.c_str());
|
||
text = text + "\\n"+QString::fromUtf8(i->PhoneNumber.c_str());
|
||
text = text + "\\n";
|
||
text = text +ws2qs(StateHeader);
|
||
|
||
std::wstring State;
|
||
|
||
if (i->MapState == 2)
|
||
{
|
||
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
}
|
||
else if (i->MapState == 2)
|
||
{
|
||
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>";
|
||
}
|
||
else if (i->MapState == 3)
|
||
{
|
||
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
}
|
||
else if (i->MapState == 4)
|
||
{
|
||
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
}
|
||
else if (i->MapState == 5)
|
||
{
|
||
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
}
|
||
|
||
text += ws2qs(State);
|
||
|
||
if (i->PosX != 0.f && i->PosY != 0.f)
|
||
{
|
||
MainWindowPtr->GetUi()->webView->page()->mainFrame()->evaluateJavaScript("AddMarkerWithPopup("+posX+", "+posY+", "+ mapState + ", \"" +text+ "\");");
|
||
|
||
//MainWindowPtr->GetUi()->webView->page()->mainFrame()->evaluateJavaScript("AddMarker("+posX+", "+posY+", "+ mapState + ");");
|
||
}
|
||
}
|
||
}
|
||
|
||
Timer.start(1000);
|
||
|
||
UpdatingMapMutex.unlock();
|
||
}
|
||
|
||
|
||
void TObserverClientModel::OnConnectButtonPressed()
|
||
{
|
||
std::string address(MainWindowPtr->GetUi()->AddressField->text().toAscii());
|
||
std::string port(MainWindowPtr->GetUi()->PortField->text().toAscii());
|
||
|
||
Start(address, port);
|
||
}
|
||
|
||
void TObserverClientModel::OnUpdateInfoButtonPressed()
|
||
{
|
||
|
||
std::string lastName(MainWindowPtr->GetUi()->LastNameField->text().toUtf8());
|
||
std::string firstName(MainWindowPtr->GetUi()->FirstNameField->text().toUtf8());
|
||
std::string middleName(MainWindowPtr->GetUi()->MiddleNameField->text().toUtf8());
|
||
|
||
std::string phoneNumber(MainWindowPtr->GetUi()->PhoneNumberField->text().toUtf8());
|
||
|
||
int uik = MainWindowPtr->GetUi()->UikSpinBox->value();
|
||
|
||
int status = MainWindowPtr->GetUi()->StatusComboBox->currentIndex();
|
||
|
||
float posX = MainWindowPtr->GetUi()->PosXSpinBox->value();
|
||
float posY = MainWindowPtr->GetUi()->PosYSpinBox->value();
|
||
|
||
int mapState = MainWindowPtr->GetUi()->MapStateComboBox->currentIndex();
|
||
if (status == 1)
|
||
{
|
||
mapState = 0;
|
||
}
|
||
|
||
ClientSocket->UserInfo.LastName = lastName;
|
||
ClientSocket->UserInfo.FirstName = firstName;
|
||
ClientSocket->UserInfo.MiddleName = middleName;
|
||
ClientSocket->UserInfo.PhoneNumber = phoneNumber;
|
||
ClientSocket->UserInfo.Uik = uik;
|
||
ClientSocket->UserInfo.Status = status;
|
||
ClientSocket->UserInfo.MapState = mapState;
|
||
|
||
ClientSocket->UserInfo.PosX = posX;
|
||
ClientSocket->UserInfo.PosY = posY;
|
||
|
||
ClientSocket->SendUserinfoUpdateThreaded();
|
||
|
||
}
|
||
|
||
|
||
void TObserverClientModel::OnHeartbeat(const boost::system::error_code& e)
|
||
{
|
||
if (e)
|
||
{
|
||
return;
|
||
}
|
||
|
||
float posX = MainWindowPtr->GetUi()->PosXSpinBox->value();
|
||
float posY = MainWindowPtr->GetUi()->PosYSpinBox->value();
|
||
|
||
int uik = MainWindowPtr->GetUi()->UikSpinBox->value();
|
||
int status = MainWindowPtr->GetUi()->StatusComboBox->currentIndex();
|
||
int mapState = MainWindowPtr->GetUi()->MapStateComboBox->currentIndex() + 1;
|
||
if (status == 1)
|
||
{
|
||
mapState = 0;
|
||
}
|
||
|
||
ClientSocket->UserInfo.Uik = uik;
|
||
ClientSocket->UserInfo.MapState = mapState;
|
||
|
||
ClientSocket->UserInfo.PosX = posX;
|
||
ClientSocket->UserInfo.PosY = posY;
|
||
|
||
ClientSocket->SendHeartbeatThreaded();
|
||
|
||
RestartHeartbeatTimer();
|
||
}
|
||
|
||
void TObserverClientModel::OnMapHeartbeat(const boost::system::error_code& e)
|
||
{
|
||
if (e)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (MapType == 0)
|
||
{
|
||
ClientSocket->SendMapQueryThreaded();
|
||
}
|
||
else
|
||
{
|
||
ClientSocket->SendAlarmMapQueryThreaded();
|
||
}
|
||
|
||
RestartMapHeartbeatTimer();
|
||
}
|
||
|
||
void TObserverClientModel::OnReceiveMapUpdate(std::vector<TUserInfo> userInfoArr)
|
||
{
|
||
|
||
UpdatingMapMutex.lock();
|
||
|
||
UserInfoArr = userInfoArr;
|
||
|
||
UpdatingMapMutex.unlock();
|
||
|
||
}
|
||
|
||
void TObserverClientModel::OnReceiveAlarmMapUpdate(std::vector<TUserInfo> userInfoArr)
|
||
{
|
||
UpdatingMapMutex.lock();
|
||
|
||
AlarmUserInfoArr = userInfoArr;
|
||
|
||
UpdatingMapMutex.unlock();
|
||
}
|
||
|
||
|
||
void TObserverClientModel::OnChangeMapTypeButtonPressed()
|
||
{
|
||
MapType = MainWindowPtr->GetUi()->MapTypeComboBox->currentIndex();
|
||
|
||
if (MapType == 0)
|
||
{
|
||
ClientSocket->SendMapQueryThreaded();
|
||
}
|
||
else
|
||
{
|
||
ClientSocket->SendAlarmMapQueryThreaded();
|
||
}
|
||
}
|
||
|
||
void TObserverClientModel::OnChatSendClick()
|
||
{
|
||
QString msg = MainWindowPtr->GetUi()->ChatTextLine->text();
|
||
|
||
ClientSocket->SendMessageThreaded(std::string(msg.toUtf8()));
|
||
}
|
||
|
||
void TObserverClientModel::OnReceiveChatMessage(TUserInfo userInfo, std::string msg)
|
||
{
|
||
QString qmsg;
|
||
|
||
qmsg += QString::fromUtf8(userInfo.LastName.c_str()) + " ";
|
||
qmsg += QString::fromUtf8(userInfo.FirstName.c_str()) + " ";
|
||
qmsg += QString::fromUtf8(userInfo.MiddleName.c_str()) + " ";
|
||
qmsg += QString::fromUtf8(userInfo.PhoneNumber.c_str()) + " ";
|
||
qmsg += QString(ws2qs(L"<EFBFBD><EFBFBD><EFBFBD> <20>")) + QString::number(userInfo.Uik) + ": ";
|
||
|
||
|
||
qmsg += QString::fromUtf8(msg.c_str()) + "\n";
|
||
|
||
|
||
MainWindowPtr->GetUi()->ChatList->insertPlainText(qmsg);
|
||
|
||
|
||
}
|