k-observer/K-observer_client_qt/observerclientmodel.cpp
2013-01-19 21:55:39 +00:00

391 lines
11 KiB
C++
Raw Permalink Blame History

#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);
}