k-observer/KObserverAndroid/jni/android_api.cpp

624 lines
14 KiB
C++
Raw Normal View History

2013-01-19 21:55:39 +00:00
#include "android_api.h"
#include "main_code.h"
#include <iostream>
#include "boost/asio.hpp"
#include "boost/bind.hpp"
#include "boost/shared_ptr.hpp"
#include "boost/shared_array.hpp"
#include "boost/array.hpp"
#include "boost/enable_shared_from_this.hpp"
#include "boost/thread.hpp"
#include <cstdlib>
#include <cstring>
#include <iostream>
#include "ClientSocket.h"
boost::asio::io_service IoService;
boost::thread IoServiceThread;
boost::shared_ptr<TClientSocket> ClientSocket;
boost::mutex connection_mutex;
std::vector<std::string> MessageHeaderArr;
std::vector<std::string> MessageTextArr;
std::vector<std::string> JavaStringHolder;
boost::shared_ptr<boost::asio::deadline_timer> HeartbeatTimer;
boost::shared_ptr<boost::asio::deadline_timer> MapHeartbeatTimer;
std::vector<TUserInfo> UserInfoMapArr;
std::vector<TUserInfo> UserInfoAlarmMapArr;
std::vector<TUserInfo>* CurrentUserInfoMapArr = &UserInfoMapArr;
float LastPosX = 0.f;
float LastPosY = 0.f;
int MapType = 0;
/*
void WriteToFile(std::string text)
{
std::string LogFilename = "/sdcard/hello.txt";
FILE* f = fopen(LogFilename.c_str(), "a");
if (f != NULL)
{
fputs(text.c_str(), f);
fflush(f);
fclose(f);
}
}*/
void IoServiceRun()
{
IoService.run();
ClientSocket = boost::shared_ptr<TClientSocket>();
IoService.reset();
//WriteToFile("lolwaauat\n");
}
void OnAutorizationSent()
{
//WriteToFile("OnAutorizationSent\n");
RestartHeartbeatTimer();
RestartMapHeartbeatTimer();
connection_mutex.unlock();
}
void OnRecieveMapUpdate(std::vector<TUserInfo> userInfoArr)
{
UserInfoMapArr = userInfoArr;
}
void OnRecieveAlarmMapUpdate(std::vector<TUserInfo> userInfoArr)
{
UserInfoAlarmMapArr = userInfoArr;
}
void OnClosed()
{
//WriteToFile("OnClosed\n");
}
JavaVM* JavaVirtualMachine;
template<typename T>
inline std::string tostr(T i)
{
std::ostringstream out;
out << i;
return std::string(out.str());
}
JNIEnv* jenv;
jclass clazzLUSCore;
struct OnReceiveMessage
{
void operator()(TUserInfo userInfo, std::string message)
{
JNIEnv* j_env;
JavaVirtualMachine->GetEnv((void**)&j_env, JNI_VERSION_1_4);
std::string header = tostr<int>(userInfo.Uik) + " " + message;
std::string status;
if (userInfo.Status == 0)
{
status = "Наблюдатель";
}
else
{
status = "Мобильная группа";
}
std::string text = userInfo.LastName
+ " " + userInfo.FirstName
+ " " + userInfo.MiddleName
+ " " + userInfo.PhoneNumber
+ " " + status
+ " УИК №" + tostr<int>(userInfo.Uik)
+ ": " + message;
{
boost::this_thread::disable_interruption di;
MessageHeaderArr.push_back(header);
MessageTextArr.push_back(text);
}
}
};
void 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 OnMapHeartbeat(const boost::system::error_code& e)
{
if (e)
{
return;
}
if (MapType == 0)
{
ClientSocket->SendMapQueryThreaded();
}
else
{
ClientSocket->SendAlarmMapQueryThreaded();
}
RestartMapHeartbeatTimer();
}
void 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(&OnHeartbeat, boost::asio::placeholders::error));
}
void 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(&OnMapHeartbeat, boost::asio::placeholders::error));
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_Open(JNIEnv * env, jobject obj, jstring addr, jstring port)
{
int JVMResult;
JVMResult = env->GetJavaVM(&JavaVirtualMachine);
jenv = env;
static bool x = false;
if (!x)
{
x = true;
std::string LogFilename = "/sdcard/hello.txt";
FILE* f = fopen(LogFilename.c_str(), "w");
if (f != NULL)
{
fclose(f);
}
}
const char *addr_c;
addr_c = env->GetStringUTFChars(addr, NULL);
if (addr_c == NULL)
{
return;
}
const char *port_c;
port_c = env->GetStringUTFChars(port, NULL);
if (port_c == NULL)
{
return;
}
//WriteToFile("Thread go xxx\n");
connection_mutex.lock();
ClientSocket = boost::shared_ptr<TClientSocket>(new TClientSocket(IoService));
ClientSocket->UserInfo.PosX = LastPosX;
ClientSocket->UserInfo.PosY = LastPosY;
ClientSocket->ReceiveAutorizationSentSignal.connect(boost::bind(&OnAutorizationSent));
ClientSocket->ReceiveForceCloseSignal.connect(boost::bind(&OnClosed));
ClientSocket->ReceiveMessageSignal.connect(OnReceiveMessage());
ClientSocket->ReceiveMapSignal.connect(boost::bind(&OnRecieveMapUpdate, _1));
ClientSocket->ReceiveAlarmMapSignal.connect(boost::bind(&OnRecieveAlarmMapUpdate, _1));
ClientSocket->Open(std::string(addr_c), std::string(port_c));
IoServiceThread = boost::thread(boost::bind(&IoServiceRun));
//WriteToFile("Thread go\n");
connection_mutex.lock();
connection_mutex.unlock();
//WriteToFile("Sleep over\n");
jclass cls = env->FindClass("fishrungames/kobserver/JniWrapper");
jmethodID mid = env->GetStaticMethodID(cls, "OnConnectSuccessful", "()V");
clazzLUSCore = (_jclass*)env->NewGlobalRef(cls);
env->DeleteLocalRef(cls);
if (mid == NULL)
{
return;
}
env->CallStaticVoidMethod(cls, mid);
env->ReleaseStringUTFChars(addr, addr_c);
env->ReleaseStringUTFChars(port, port_c);
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_Close(JNIEnv * env, jobject obj)
{
ClientSocket->CloseThreaded();
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_UpdateUserInfo(JNIEnv * env, jobject obj
, jstring lastName
, jstring firstName
, jstring middleName
, jstring contactNumber
, int mapState
, int uik
, int status
, float posX
, float posY)
{
TUserInfo userInfo;
const char *c_lastName;
c_lastName = env->GetStringUTFChars(lastName, NULL);
if (c_lastName == NULL)
{
return;
}
userInfo.LastName = std::string(c_lastName);
env->ReleaseStringUTFChars(lastName, c_lastName);
// ==== First Name
const char *c_firstName;
c_firstName = env->GetStringUTFChars(firstName, NULL);
if (c_firstName == NULL)
{
return;
}
userInfo.FirstName = std::string(c_firstName);
env->ReleaseStringUTFChars(firstName, c_firstName);
// ==== Middle Name
const char *c_middleName;
c_middleName = env->GetStringUTFChars(middleName, NULL);
if (c_middleName == NULL)
{
return;
}
userInfo.MiddleName = std::string(c_middleName);
env->ReleaseStringUTFChars(middleName, c_middleName);
// ==== Contact Number
const char *c_contactNumber;
c_contactNumber = env->GetStringUTFChars(contactNumber, NULL);
if (c_contactNumber == NULL)
{
return;
}
userInfo.PhoneNumber = std::string(c_contactNumber);
env->ReleaseStringUTFChars(contactNumber, c_contactNumber);
userInfo.MapState = mapState;
userInfo.Uik = uik;
userInfo.Status = status;
userInfo.PosX = posX;
userInfo.PosY = posY;
ClientSocket->UserInfo = userInfo;
ClientSocket->SendUserinfoUpdateThreaded();
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_SetAlarmCommon(JNIEnv * env, jobject obj)
{
ClientSocket->UserInfo.MapState = 2;
ClientSocket->SendUserinfoUpdateThreaded();
ClientSocket->SendMessageThreaded(std::string("ТРЕВОГА (АВТОМАТИЧЕСКОЕ СООБЩЕНИЕ)"));
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_SetAlarmExclusion(JNIEnv * env, jobject obj)
{
ClientSocket->UserInfo.MapState = 3;
ClientSocket->SendUserinfoUpdateThreaded();
ClientSocket->SendMessageThreaded(std::string("ТРЕВОГА: УДАЛЕНИЕ С УИК (АВТОМАТИЧЕСКОЕ СООБЩЕНИЕ)"));
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_SetAlarmInjection(JNIEnv * env, jobject obj)
{
ClientSocket->UserInfo.MapState = 4;
ClientSocket->SendUserinfoUpdateThreaded();
ClientSocket->SendMessageThreaded(std::string("ТРЕВОГА: ВБРОС (АВТОМАТИЧЕСКОЕ СООБЩЕНИЕ)"));
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_SetAlarmCarousel(JNIEnv * env, jobject obj)
{
ClientSocket->UserInfo.MapState = 5;
ClientSocket->SendUserinfoUpdateThreaded();
ClientSocket->SendMessageThreaded(std::string("ТРЕВОГА: КАРУСЕЛЬ (АВТОМАТИЧЕСКОЕ СООБЩЕНИЕ)"));
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_SetAlarmAssault(JNIEnv * env, jobject obj)
{
ClientSocket->UserInfo.MapState = 6;
ClientSocket->SendUserinfoUpdateThreaded();
ClientSocket->SendMessageThreaded(std::string("ТРЕВОГА: НАПАДЕНИЕ (АВТОМАТИЧЕСКОЕ СООБЩЕНИЕ)"));
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_SendMessage(JNIEnv * env, jobject obj, jstring msg)
{
const char *c_msg;
c_msg = env->GetStringUTFChars(msg, NULL);
if (c_msg == NULL)
{
return;
}
std::string str_msg(c_msg);
env->ReleaseStringUTFChars(msg, c_msg);
ClientSocket->SendMessageThreaded(str_msg);
}
JNIEXPORT jstring JNICALL Java_fishrungames_kobserver_JniWrapper_GetLastMessageHeader(JNIEnv * env, jobject obj)
{
jstring jstr;
if (MessageHeaderArr.size() > 0)
{
JavaStringHolder.push_back(MessageHeaderArr[0]);
jstr = env->NewStringUTF(JavaStringHolder[JavaStringHolder.size()-1].c_str());
MessageHeaderArr.clear();
}
else
{
jstr = env->NewStringUTF("");
}
return jstr;
}
JNIEXPORT jstring JNICALL Java_fishrungames_kobserver_JniWrapper_GetLastMessageText(JNIEnv * env, jobject obj)
{
jstring jstr;
if (MessageTextArr.size() > 0)
{
JavaStringHolder.push_back(MessageTextArr[0]);
jstr = env->NewStringUTF(JavaStringHolder[JavaStringHolder.size()-1].c_str());
MessageTextArr.clear();
}
else
{
jstr = env->NewStringUTF("");
}
return jstr;
}
JNIEXPORT int JNICALL Java_fishrungames_kobserver_JniWrapper_GetNumberOfUsers(JNIEnv * env, jobject obj)
{
return (*CurrentUserInfoMapArr).size();
}
JNIEXPORT int JNICALL Java_fishrungames_kobserver_JniWrapper_GetUserUik(JNIEnv * env, jobject obj, int i)
{
return (*CurrentUserInfoMapArr)[i].Uik;
}
JNIEXPORT float JNICALL Java_fishrungames_kobserver_JniWrapper_GetUserPosX(JNIEnv * env, jobject obj, int i)
{
return (*CurrentUserInfoMapArr)[i].PosX;
}
JNIEXPORT float JNICALL Java_fishrungames_kobserver_JniWrapper_GetUserPosY(JNIEnv * env, jobject obj, int i)
{
return (*CurrentUserInfoMapArr)[i].PosY;
}
JNIEXPORT int JNICALL Java_fishrungames_kobserver_JniWrapper_GetUserMapState(JNIEnv * env, jobject obj, int i)
{
return (*CurrentUserInfoMapArr)[i].MapState;
}
JNIEXPORT jstring JNICALL Java_fishrungames_kobserver_JniWrapper_GetUserDescription(JNIEnv * env, jobject obj, int i)
{
std::string State;
if ((*CurrentUserInfoMapArr)[i].MapState == 2)
{
State = "Тревога";
}
else if ((*CurrentUserInfoMapArr)[i].MapState == 3)
{
State = "Тревога - Удаление с УИК";
}
else if ((*CurrentUserInfoMapArr)[i].MapState == 4)
{
State = "Тревога - Вброс";
}
else if ((*CurrentUserInfoMapArr)[i].MapState == 5)
{
State = "Тревога - Карусель";
}
else if ((*CurrentUserInfoMapArr)[i].MapState == 6)
{
State = "Тревога - Нападение";
}
std::string status = "Наблюдатель";
if ((*CurrentUserInfoMapArr)[i].Status == 1)
{
status = "Мобильная группа";
}
std::string descr = "УИК №" + tostr((*CurrentUserInfoMapArr)[i].Uik) + "\\n"+
(*CurrentUserInfoMapArr)[i].LastName+ "\\n"+
(*CurrentUserInfoMapArr)[i].FirstName+ "\\n"+
(*CurrentUserInfoMapArr)[i].MiddleName+ "\\n"+
(*CurrentUserInfoMapArr)[i].PhoneNumber+ "\\n"+
status + "\\n" +
"Состояние: "+State;
jstring jstr;
jstr = env->NewStringUTF(descr.c_str());
return jstr;
}
JNIEXPORT float JNICALL Java_fishrungames_kobserver_JniWrapper_GetMapCenterPosX(JNIEnv * env, jobject obj)
{
return ClientSocket->BaseLon;
}
JNIEXPORT float JNICALL Java_fishrungames_kobserver_JniWrapper_GetMapCenterPosY(JNIEnv * env, jobject obj)
{
return ClientSocket->BaseLat;
}
JNIEXPORT int JNICALL Java_fishrungames_kobserver_JniWrapper_GetMapCenterZoom(JNIEnv * env, jobject obj)
{
return ClientSocket->BaseZoom;
}
JNIEXPORT int JNICALL Java_fishrungames_kobserver_JniWrapper_SetPosition(JNIEnv * env, jobject obj, float x, float y)
{
ClientSocket->UserInfo.PosX = x;
ClientSocket->UserInfo.PosY = y;
LastPosX = x;
LastPosY = y;
}
JNIEXPORT void JNICALL Java_fishrungames_kobserver_JniWrapper_ChangeMapType(JNIEnv * env, jobject obj, int mapType)
{
MapType = mapType;
if (MapType == 0)
{
CurrentUserInfoMapArr = &UserInfoMapArr;
}
else
{
CurrentUserInfoMapArr = &UserInfoAlarmMapArr;
}
}