391 lines
11 KiB
C++
391 lines
11 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)
|
|||
|
, Connected(false)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TObserverClientModel::Start(std::string address, std::string port)
|
|||
|
{
|
|||
|
if (!Connected)
|
|||
|
{
|
|||
|
ClientSocket = boost::shared_ptr<TClientSocket>(new TClientSocket(IoService));
|
|||
|
|
|||
|
ClientSocket->ReceiveMapSignal.connect(boost::bind(&TObserverClientModel::OnReceiveMapUpdate, this, _1));
|
|||
|
|
|||
|
ClientSocket->ReceiveAlarmMapSignal.connect(boost::bind(&TObserverClientModel::OnReceiveAlarmMapUpdate, this, _1));
|
|||
|
|
|||
|
ClientSocket->ReceiveForceCloseSignal.connect(boost::bind(&TObserverClientModel::OnSocketClosed, this));
|
|||
|
|
|||
|
ClientSocket->ReceiveMessageSignal.connect(boost::bind(&TObserverClientModel::OnReceiveChatMessage, this, _1, _2));
|
|||
|
|
|||
|
ClientSocket->ReceiveAutorizationSentSignal.connect(boost::bind(&TObserverClientModel::OnAutorizationSent, this));
|
|||
|
|
|||
|
ClientSocket->Open(address, port);
|
|||
|
|
|||
|
IoServiceThread = boost::thread(boost::bind(&TObserverClientModel::DoRunIoService, this));
|
|||
|
|
|||
|
Timer.TimerSignal.connect(boost::bind(&TObserverClientModel::OnUpdateMapTimer, this));
|
|||
|
|
|||
|
Timer.start(1000);
|
|||
|
|
|||
|
Connected = true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void TObserverClientModel::OnAutorizationSent()
|
|||
|
{
|
|||
|
|
|||
|
RestartHeartbeatTimer();
|
|||
|
RestartMapHeartbeatTimer();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
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()
|
|||
|
{
|
|||
|
if (Connected)
|
|||
|
{
|
|||
|
Connected = false;
|
|||
|
|
|||
|
Timer.stop();
|
|||
|
HeartbeatTimer->cancel();
|
|||
|
MapHeartbeatTimer->cancel();
|
|||
|
|
|||
|
ClientSocket->CloseImmediate();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void TObserverClientModel::OnSocketClosed()
|
|||
|
{
|
|||
|
//ClientSocket->BlockCloseOnError = true;
|
|||
|
//ClientSocket->CloseImmediate();
|
|||
|
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
|
|||
|
{
|
|||
|
MainWindowPtr->GetUi()->PlayerListWidget->clear();
|
|||
|
|
|||
|
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 lastName = QString::fromUtf8(i->LastName.c_str());
|
|||
|
QString firstName = QString::fromUtf8(i->FirstName.c_str());
|
|||
|
QString middleName = QString::fromUtf8(i->MiddleName.c_str());
|
|||
|
|
|||
|
QString text = ws2qs(Uik);
|
|||
|
text = text + QString::number(i->Uik)+"\\n";
|
|||
|
text = text + lastName;
|
|||
|
text = text +"\\n" + firstName;
|
|||
|
text = text + "\\n"+middleName;
|
|||
|
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 == 3)
|
|||
|
{
|
|||
|
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>";
|
|||
|
}
|
|||
|
else if (i->MapState == 4)
|
|||
|
{
|
|||
|
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
}
|
|||
|
else if (i->MapState == 5)
|
|||
|
{
|
|||
|
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
}
|
|||
|
else if (i->MapState == 6)
|
|||
|
{
|
|||
|
State = L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><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()->PlayerListWidget->addItem(QString("LastName: "+lastName + " FirstName: " + firstName+" MiddleName: "+middleName));
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Timer.start(1000);
|
|||
|
|
|||
|
UpdatingMapMutex.unlock();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TObserverClientModel::DoRunIoService()
|
|||
|
{
|
|||
|
IoService.run();
|
|||
|
|
|||
|
ReceiveCloseSignal();
|
|||
|
ReceiveCloseSignal.disconnect_all_slots();
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TObserverClientModel::OnSendAlarmClick()
|
|||
|
{
|
|||
|
ClientSocket->UserInfo.MapState = 2;
|
|||
|
|
|||
|
QString msg = ws2qs(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!");
|
|||
|
|
|||
|
ClientSocket->SendMessageThreaded(std::string(msg.toUtf8()));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TObserverClientModel::OnKickPlayerClick()
|
|||
|
{
|
|||
|
QString lastName = MainWindowPtr->GetUi()->LastNameKickEdit->text();
|
|||
|
QString firstName = MainWindowPtr->GetUi()->FirstNameKickEdit->text();
|
|||
|
QString middleName = MainWindowPtr->GetUi()->MiddleNameKickEdit->text();
|
|||
|
|
|||
|
ClientSocket->SendKickPlayerThreaded(std::string(lastName.toUtf8()), std::string(firstName.toUtf8()), std::string(middleName.toUtf8()));
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void TObserverClientModel::OnSelectPlayerClick()
|
|||
|
{
|
|||
|
int i = MainWindowPtr->GetUi()->PlayerListWidget->currentRow();
|
|||
|
|
|||
|
QString lastName = QString::fromUtf8(AlarmUserInfoArr[i].LastName.c_str());
|
|||
|
QString firstName = QString::fromUtf8(AlarmUserInfoArr[i].FirstName.c_str());
|
|||
|
QString middleName = QString::fromUtf8(AlarmUserInfoArr[i].MiddleName.c_str());
|
|||
|
|
|||
|
MainWindowPtr->GetUi()->LastNameKickEdit->setText(lastName);
|
|||
|
MainWindowPtr->GetUi()->FirstNameKickEdit->setText(firstName);
|
|||
|
MainWindowPtr->GetUi()->MiddleNameKickEdit->setText(middleName);
|
|||
|
}
|