mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-02 14:16:16 -04:00
Merge branch 'master' into merge_alpha_master
This commit is contained in:
commit
4455bfa92d
110 changed files with 2395 additions and 629 deletions
|
@ -17,6 +17,10 @@
|
|||
#include "ChannelsHandler.h"
|
||||
#include "StatsHandler.h"
|
||||
|
||||
#ifdef LIBRESAPI_QT
|
||||
#include "SettingsHandler.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
data types in json http://json.org/
|
||||
string (utf-8 unicode)
|
||||
|
@ -237,6 +241,9 @@ public:
|
|||
mApiPluginHandler(sts, ifaces),
|
||||
mChannelsHandler(ifaces.mGxsChannels),
|
||||
mStatsHandler()
|
||||
#ifdef LIBRESAPI_QT
|
||||
,mSettingsHandler(sts)
|
||||
#endif
|
||||
{
|
||||
// the dynamic cast is to not confuse the addResourceHandler template like this:
|
||||
// addResourceHandler(derived class, parent class)
|
||||
|
@ -262,7 +269,11 @@ public:
|
|||
&ChannelsHandler::handleRequest);
|
||||
router.addResourceHandler("stats", dynamic_cast<ResourceRouter*>(&mStatsHandler),
|
||||
&StatsHandler::handleRequest);
|
||||
}
|
||||
#ifdef LIBRESAPI_QT
|
||||
router.addResourceHandler("settings", dynamic_cast<ResourceRouter*>(&mSettingsHandler),
|
||||
&SettingsHandler::handleRequest);
|
||||
#endif
|
||||
}
|
||||
|
||||
PeersHandler mPeersHandler;
|
||||
IdentityHandler mIdentityHandler;
|
||||
|
@ -274,6 +285,10 @@ public:
|
|||
ApiPluginHandler mApiPluginHandler;
|
||||
ChannelsHandler mChannelsHandler;
|
||||
StatsHandler mStatsHandler;
|
||||
|
||||
#ifdef LIBRESAPI_QT
|
||||
SettingsHandler mSettingsHandler;
|
||||
#endif
|
||||
};
|
||||
|
||||
ApiServer::ApiServer():
|
||||
|
@ -362,6 +377,9 @@ std::string ApiServer::handleRequest(Request &request)
|
|||
if(data.isRawData())
|
||||
return data.getRawData();
|
||||
|
||||
if(!resp.mCallbackName.empty())
|
||||
outstream << resource_api::makeKeyValueReference("callback_name", resp.mCallbackName);
|
||||
|
||||
outstream << resource_api::makeKeyValue("debug_msg", debugString.str());
|
||||
outstream << resource_api::makeKeyValueReference("returncode", returncode);
|
||||
if(!resp.mStateToken.isNull())
|
||||
|
|
|
@ -252,6 +252,9 @@ public:
|
|||
|
||||
StateToken mStateToken;
|
||||
|
||||
//Just for GUI benefit
|
||||
std::string mCallbackName;
|
||||
|
||||
// the result
|
||||
StreamBase& mDataStream;
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <retroshare/rspeers.h>
|
||||
#include <retroshare/rsidentity.h>
|
||||
#include <retroshare/rshistory.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
|
@ -165,6 +166,7 @@ ChatHandler::ChatHandler(StateTokenServer *sts, RsNotify *notify, RsMsgs *msgs,
|
|||
addResourceHandler("lobbies", this, &ChatHandler::handleLobbies);
|
||||
addResourceHandler("subscribe_lobby", this, &ChatHandler::handleSubscribeLobby);
|
||||
addResourceHandler("unsubscribe_lobby", this, &ChatHandler::handleUnsubscribeLobby);
|
||||
addResourceHandler("autosubscribe_lobby", this, &ChatHandler::handleAutoSubsribeLobby);
|
||||
addResourceHandler("clear_lobby", this, &ChatHandler::handleClearLobby);
|
||||
addResourceHandler("lobby_participants", this, &ChatHandler::handleLobbyParticipants);
|
||||
addResourceHandler("messages", this, &ChatHandler::handleMessages);
|
||||
|
@ -908,6 +910,15 @@ void ChatHandler::handleUnsubscribeLobby(Request &req, Response &resp)
|
|||
resp.setOk();
|
||||
}
|
||||
|
||||
void ChatHandler::handleAutoSubsribeLobby(Request& req, Response& resp)
|
||||
{
|
||||
ChatLobbyId chatId = 0;
|
||||
bool autosubsribe;
|
||||
req.mStream << makeKeyValueReference("chatid", chatId) << makeKeyValueReference("autosubsribe", autosubsribe);
|
||||
mRsMsgs->setLobbyAutoSubscribe(chatId, autosubsribe);
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
void ChatHandler::handleClearLobby(Request &req, Response &resp)
|
||||
{
|
||||
ChatLobbyId id = 0;
|
||||
|
@ -949,13 +960,14 @@ void ChatHandler::handleMessages(Request &req, Response &resp)
|
|||
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||
ChatId id(req.mPath.top());
|
||||
ChatId id(req.mPath.top());
|
||||
|
||||
// make response a list
|
||||
resp.mDataStream.getStreamToMember();
|
||||
if(id.isNotSet())
|
||||
{
|
||||
resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id");
|
||||
return;
|
||||
resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id");
|
||||
return;
|
||||
}
|
||||
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(id);
|
||||
if(mit == mMsgs.end())
|
||||
|
@ -992,10 +1004,11 @@ void ChatHandler::handleSendMessage(Request &req, Response &resp)
|
|||
void ChatHandler::handleMarkChatAsRead(Request &req, Response &resp)
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||
ChatId id(req.mPath.top());
|
||||
ChatId id(req.mPath.top());
|
||||
|
||||
if(id.isNotSet())
|
||||
{
|
||||
resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id");
|
||||
resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id");
|
||||
return;
|
||||
}
|
||||
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(id);
|
||||
|
|
|
@ -120,6 +120,7 @@ private:
|
|||
void handleLobbies(Request& req, Response& resp);
|
||||
void handleSubscribeLobby(Request& req, Response& resp);
|
||||
void handleUnsubscribeLobby(Request& req, Response& resp);
|
||||
void handleAutoSubsribeLobby(Request& req, Response& resp);
|
||||
void handleClearLobby(Request& req, Response& resp);
|
||||
ResponseTask* handleLobbyParticipants(Request& req, Response& resp);
|
||||
void handleMessages(Request& req, Response& resp);
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
namespace resource_api
|
||||
{
|
||||
|
||||
FileSearchHandler::FileSearchHandler(StateTokenServer *sts, RsNotify *notify, RsTurtle *turtle, RsFiles *files):
|
||||
mStateTokenServer(sts), mNotify(notify), mTurtle(turtle), mFiles(files),
|
||||
FileSearchHandler::FileSearchHandler(StateTokenServer *sts, RsNotify *notify, RsTurtle *turtle, RsFiles */*files*/):
|
||||
mStateTokenServer(sts), mNotify(notify), mTurtle(turtle),// mFiles(files),
|
||||
mMtx("FileSearchHandler")
|
||||
{
|
||||
mNotify->registerNotifyClient(this);
|
||||
|
|
|
@ -24,7 +24,7 @@ private:
|
|||
StateTokenServer* mStateTokenServer;
|
||||
RsNotify* mNotify;
|
||||
RsTurtle* mTurtle;
|
||||
RsFiles* mFiles;
|
||||
//RsFiles* mFiles;
|
||||
|
||||
class Search{
|
||||
public:
|
||||
|
|
|
@ -103,9 +103,13 @@ IdentityHandler::IdentityHandler(StateTokenServer *sts, RsNotify *notify, RsIden
|
|||
{
|
||||
mNotify->registerNotifyClient(this);
|
||||
|
||||
addResourceHandler("*", this, &IdentityHandler::handleWildcard);
|
||||
addResourceHandler("own", this, &IdentityHandler::handleOwn);
|
||||
addResourceHandler("create_identity", this, &IdentityHandler::handleCreateIdentity);
|
||||
addResourceHandler("*", this, &IdentityHandler::handleWildcard);
|
||||
addResourceHandler("own", this, &IdentityHandler::handleOwn);
|
||||
|
||||
addResourceHandler("own_ids", this, &IdentityHandler::handleOwnIdsRequest);
|
||||
addResourceHandler("notown_ids", this, &IdentityHandler::handleNotOwnIdsRequest);
|
||||
|
||||
addResourceHandler("create_identity", this, &IdentityHandler::handleCreateIdentity);
|
||||
}
|
||||
|
||||
IdentityHandler::~IdentityHandler()
|
||||
|
@ -178,6 +182,112 @@ void IdentityHandler::handleWildcard(Request & /*req*/, Response &resp)
|
|||
else resp.setFail();
|
||||
}
|
||||
|
||||
|
||||
void IdentityHandler::handleNotOwnIdsRequest(Request & /*req*/, Response &resp)
|
||||
{
|
||||
bool ok = true;
|
||||
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
RsTokReqOptions opts;
|
||||
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA;
|
||||
uint32_t token;
|
||||
mRsIdentity->getTokenService()->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts);
|
||||
|
||||
time_t start = time(NULL);
|
||||
while((mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
|
||||
&&(mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
|
||||
&&((time(NULL) < (start+10)))
|
||||
)
|
||||
{
|
||||
#ifdef WINDOWS_SYS
|
||||
Sleep(500);
|
||||
#else
|
||||
usleep(500*1000);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(mRsIdentity->getTokenService()->requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
|
||||
{
|
||||
std::vector<RsGxsIdGroup> grps;
|
||||
ok &= mRsIdentity->getGroupData(token, grps);
|
||||
for(std::vector<RsGxsIdGroup>::iterator vit = grps.begin(); vit != grps.end(); vit++)
|
||||
{
|
||||
RsGxsIdGroup& grp = *vit;
|
||||
//electron: not very happy about this, i think the flags should stay hidden in rsidentities
|
||||
if(!(grp.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN) && grp.mIsAContact)
|
||||
{
|
||||
bool pgp_linked = (grp.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID_kept_for_compatibility ) ;
|
||||
resp.mDataStream.getStreamToMember()
|
||||
<< makeKeyValueReference("id", grp.mMeta.mGroupId) /// @deprecated using "id" as key can cause problems in some JS based languages like Qml @see gxs_id instead
|
||||
<< makeKeyValueReference("gxs_id", grp.mMeta.mGroupId)
|
||||
<< makeKeyValueReference("pgp_id",grp.mPgpId )
|
||||
<< makeKeyValueReference("name", grp.mMeta.mGroupName)
|
||||
<< makeKeyValueReference("pgp_linked", pgp_linked);
|
||||
}
|
||||
}
|
||||
}
|
||||
else ok = false;
|
||||
|
||||
if(ok) resp.setOk();
|
||||
else resp.setFail();
|
||||
}
|
||||
|
||||
void IdentityHandler::handleOwnIdsRequest(Request & /*req*/, Response &resp)
|
||||
{
|
||||
bool ok = true;
|
||||
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
RsTokReqOptions opts;
|
||||
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA;
|
||||
uint32_t token;
|
||||
mRsIdentity->getTokenService()->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts);
|
||||
|
||||
time_t start = time(NULL);
|
||||
while((mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
|
||||
&&(mRsIdentity->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
|
||||
&&((time(NULL) < (start+10)))
|
||||
)
|
||||
{
|
||||
#ifdef WINDOWS_SYS
|
||||
Sleep(500);
|
||||
#else
|
||||
usleep(500*1000);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(mRsIdentity->getTokenService()->requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
|
||||
{
|
||||
std::vector<RsGxsIdGroup> grps;
|
||||
ok &= mRsIdentity->getGroupData(token, grps);
|
||||
for(std::vector<RsGxsIdGroup>::iterator vit = grps.begin(); vit != grps.end(); vit++)
|
||||
{
|
||||
RsGxsIdGroup& grp = *vit;
|
||||
//electron: not very happy about this, i think the flags should stay hidden in rsidentities
|
||||
if(vit->mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN)
|
||||
{
|
||||
bool pgp_linked = (grp.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID_kept_for_compatibility ) ;
|
||||
resp.mDataStream.getStreamToMember()
|
||||
<< makeKeyValueReference("own_gxs_id", grp.mMeta.mGroupId)
|
||||
<< makeKeyValueReference("pgp_id",grp.mPgpId )
|
||||
<< makeKeyValueReference("name", grp.mMeta.mGroupName)
|
||||
<< makeKeyValueReference("pgp_linked", pgp_linked);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
ok = false;
|
||||
|
||||
if(ok) resp.setOk();
|
||||
else resp.setFail();
|
||||
}
|
||||
|
||||
ResponseTask* IdentityHandler::handleOwn(Request & /* req */, Response &resp)
|
||||
{
|
||||
StateToken state;
|
||||
|
|
|
@ -23,6 +23,9 @@ public:
|
|||
|
||||
private:
|
||||
void handleWildcard(Request& req, Response& resp);
|
||||
void handleNotOwnIdsRequest(Request& req, Response& resp);
|
||||
void handleOwnIdsRequest(Request& req, Response& resp);
|
||||
|
||||
ResponseTask *handleOwn(Request& req, Response& resp);
|
||||
ResponseTask *handleCreateIdentity(Request& req, Response& resp);
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <retroshare/rspeers.h>
|
||||
#include <retroshare/rsmsgs.h>
|
||||
#include <util/radix64.h>
|
||||
#include <retroshare/rsstatus.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
|
@ -12,6 +13,12 @@
|
|||
namespace resource_api
|
||||
{
|
||||
|
||||
#define PEER_STATE_ONLINE 1
|
||||
#define PEER_STATE_BUSY 2
|
||||
#define PEER_STATE_AWAY 3
|
||||
#define PEER_STATE_AVAILABLE 4
|
||||
#define PEER_STATE_INACTIVE 5
|
||||
#define PEER_STATE_OFFLINE 6
|
||||
// todo: groups, add friend, remove friend, permissions
|
||||
|
||||
void peerDetailsToStream(StreamBase& stream, RsPeerDetails& details)
|
||||
|
@ -21,7 +28,50 @@ void peerDetailsToStream(StreamBase& stream, RsPeerDetails& details)
|
|||
<< makeKeyValueReference("name", details.name)
|
||||
<< makeKeyValueReference("location", details.location)
|
||||
<< makeKeyValueReference("pgp_id", details.gpg_id)
|
||||
;
|
||||
<< makeKeyValueReference("pgp_id", details.gpg_id);
|
||||
|
||||
if(details.state & RS_PEER_STATE_CONNECTED)
|
||||
{
|
||||
std::list<StatusInfo> statusInfo;
|
||||
rsStatus->getStatusList(statusInfo);
|
||||
|
||||
std::string state_string;
|
||||
std::list<StatusInfo>::iterator it;
|
||||
for (it = statusInfo.begin(); it != statusInfo.end(); ++it)
|
||||
{
|
||||
if (it->id == details.id)
|
||||
{
|
||||
switch (it->status)
|
||||
{
|
||||
case RS_STATUS_INACTIVE:
|
||||
state_string = "inactive";
|
||||
break;
|
||||
|
||||
case RS_STATUS_ONLINE:
|
||||
state_string = "online";
|
||||
break;
|
||||
|
||||
case RS_STATUS_AWAY:
|
||||
state_string = "away";
|
||||
break;
|
||||
|
||||
case RS_STATUS_BUSY:
|
||||
state_string = "busy";
|
||||
break;
|
||||
default:
|
||||
state_string = "undefined";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
stream << makeKeyValueReference("state_string", state_string);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string state_string = "undefined";
|
||||
stream << makeKeyValueReference("state_string", state_string);
|
||||
}
|
||||
}
|
||||
|
||||
bool peerInfoToStream(StreamBase& stream, RsPeerDetails& details, RsPeers* peers, std::list<RsGroupInfo>& grpInfo, bool have_avatar)
|
||||
|
@ -29,7 +79,9 @@ bool peerInfoToStream(StreamBase& stream, RsPeerDetails& details, RsPeers* peers
|
|||
bool ok = true;
|
||||
peerDetailsToStream(stream, details);
|
||||
stream << makeKeyValue("is_online", peers->isOnline(details.id))
|
||||
<< makeKeyValue("chat_id", ChatId(details.id).toStdString());
|
||||
<< makeKeyValue("chat_id", ChatId(details.id).toStdString())
|
||||
<< makeKeyValue("custom_state_string", rsMsgs->getCustomStateString(details.id));
|
||||
|
||||
|
||||
std::string avatar_address = "/"+details.id.toStdString()+"/avatar_image";
|
||||
|
||||
|
@ -63,7 +115,13 @@ PeersHandler::PeersHandler(StateTokenServer* sts, RsNotify* notify, RsPeers *pee
|
|||
mNotify->registerNotifyClient(this);
|
||||
mStateTokenServer->registerTickClient(this);
|
||||
addResourceHandler("*", this, &PeersHandler::handleWildcard);
|
||||
addResourceHandler("examine_cert", this, &PeersHandler::handleExamineCert);
|
||||
addResourceHandler("get_state_string", this, &PeersHandler::handleGetStateString);
|
||||
addResourceHandler("set_state_string", this, &PeersHandler::handleSetStateString);
|
||||
addResourceHandler("get_custom_state_string", this, &PeersHandler::handleGetCustomStateString);
|
||||
addResourceHandler("set_custom_state_string", this, &PeersHandler::handleSetCustomStateString);
|
||||
addResourceHandler("get_pgp_options", this, &PeersHandler::handleGetPGPOptions);
|
||||
addResourceHandler("set_pgp_options", this, &PeersHandler::handleSetPGPOptions);
|
||||
addResourceHandler("examine_cert", this, &PeersHandler::handleExamineCert);
|
||||
}
|
||||
|
||||
PeersHandler::~PeersHandler()
|
||||
|
@ -100,6 +158,27 @@ void PeersHandler::tick()
|
|||
mStateTokenServer->discardToken(mStateToken);
|
||||
mStateToken = mStateTokenServer->getNewToken();
|
||||
}
|
||||
|
||||
StatusInfo statusInfo;
|
||||
rsStatus->getOwnStatus(statusInfo);
|
||||
if(statusInfo.status != status)
|
||||
{
|
||||
status = statusInfo.status;
|
||||
|
||||
RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/
|
||||
mStateTokenServer->discardToken(mStringStateToken);
|
||||
mStringStateToken = mStateTokenServer->getNewToken();
|
||||
}
|
||||
|
||||
std::string custom_state = rsMsgs->getCustomStateString();
|
||||
if(custom_state != custom_state_string)
|
||||
{
|
||||
custom_state_string = custom_state;
|
||||
|
||||
RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/
|
||||
mStateTokenServer->discardToken(mCustomStateToken);
|
||||
mCustomStateToken = mStateTokenServer->getNewToken();
|
||||
}
|
||||
}
|
||||
|
||||
void PeersHandler::notifyUnreadMsgCountChanged(const RsPeerId &peer, uint32_t count)
|
||||
|
@ -121,6 +200,73 @@ static bool have_avatar(RsMsgs* msgs, const RsPeerId& id)
|
|||
return size != 0;
|
||||
}
|
||||
|
||||
void PeersHandler::handleGetStateString(Request& /*req*/, Response& resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStringStateToken;
|
||||
}
|
||||
|
||||
std::string state_string;
|
||||
StatusInfo statusInfo;
|
||||
if (rsStatus->getOwnStatus(statusInfo))
|
||||
{
|
||||
if(statusInfo.status == RS_STATUS_ONLINE)
|
||||
state_string = "online";
|
||||
else if(statusInfo.status == RS_STATUS_BUSY)
|
||||
state_string = "busy";
|
||||
else if(statusInfo.status == RS_STATUS_AWAY)
|
||||
state_string = "away";
|
||||
else if(statusInfo.status == RS_STATUS_INACTIVE)
|
||||
state_string = "inactive";
|
||||
else
|
||||
state_string = "undefined";
|
||||
}
|
||||
else
|
||||
state_string = "undefined";
|
||||
|
||||
resp.mDataStream << makeKeyValueReference("state_string", state_string);
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
void PeersHandler::handleSetStateString(Request& req, Response& resp)
|
||||
{
|
||||
std::string state_string;
|
||||
req.mStream << makeKeyValueReference("state_string", state_string);
|
||||
|
||||
uint32_t status = RS_STATUS_OFFLINE;
|
||||
if(state_string == "online")
|
||||
status = RS_STATUS_ONLINE;
|
||||
else if(state_string == "busy")
|
||||
status = RS_STATUS_BUSY;
|
||||
else if(state_string == "away")
|
||||
status = RS_STATUS_AWAY;
|
||||
|
||||
rsStatus->sendStatus(RsPeerId(), status);
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
void PeersHandler::handleGetCustomStateString(Request& /*req*/, Response& resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mCustomStateToken;
|
||||
}
|
||||
|
||||
std::string custom_state_string = rsMsgs->getCustomStateString();
|
||||
resp.mDataStream << makeKeyValueReference("custom_state_string", custom_state_string);
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
void PeersHandler::handleSetCustomStateString(Request& req, Response& resp)
|
||||
{
|
||||
std::string custom_state_string;
|
||||
req.mStream << makeKeyValueReference("custom_state_string", custom_state_string);
|
||||
|
||||
rsMsgs->setCustomStateString(custom_state_string);
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
void PeersHandler::handleWildcard(Request &req, Response &resp)
|
||||
{
|
||||
bool ok = false;
|
||||
|
@ -176,6 +322,9 @@ void PeersHandler::handleWildcard(Request &req, Response &resp)
|
|||
RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/
|
||||
unread_msgs = mUnreadMsgsCounts;
|
||||
}
|
||||
std::list<StatusInfo> statusInfo;
|
||||
rsStatus->getStatusList(statusInfo);
|
||||
|
||||
// list all peers
|
||||
ok = true;
|
||||
std::list<RsPgpId> identities;
|
||||
|
@ -216,6 +365,11 @@ void PeersHandler::handleWildcard(Request &req, Response &resp)
|
|||
StreamBase& locationStream = itemStream.getStreamToMember("locations");
|
||||
// mark as list (in case list is empty)
|
||||
locationStream.getStreamToMember();
|
||||
|
||||
int bestPeerState = 0;
|
||||
unsigned int bestRSState = 0;
|
||||
std::string bestCustomStateString;
|
||||
|
||||
for(std::vector<RsPeerDetails>::iterator vit = detailsVec.begin(); vit != detailsVec.end(); ++vit)
|
||||
{
|
||||
if(vit->gpg_id == *lit)
|
||||
|
@ -226,8 +380,85 @@ void PeersHandler::handleWildcard(Request &req, Response &resp)
|
|||
unread = unread_msgs.find(vit->id)->second;
|
||||
stream << makeKeyValueReference("unread_msgs", unread);
|
||||
peerInfoToStream(stream,*vit, mRsPeers, grpInfo, have_avatar(mRsMsgs, vit->id));
|
||||
}
|
||||
|
||||
|
||||
/* Custom state string */
|
||||
std::string customStateString;
|
||||
if (vit->state & RS_PEER_STATE_CONNECTED)
|
||||
{
|
||||
customStateString = rsMsgs->getCustomStateString(vit->id);
|
||||
}
|
||||
|
||||
int peerState = 0;
|
||||
|
||||
if (vit->state & RS_PEER_STATE_CONNECTED)
|
||||
{
|
||||
// get the status info for this ssl id
|
||||
int rsState = 0;
|
||||
std::list<StatusInfo>::iterator it;
|
||||
for (it = statusInfo.begin(); it != statusInfo.end(); ++it)
|
||||
{
|
||||
if (it->id == vit->id)
|
||||
{
|
||||
rsState = it->status;
|
||||
switch (rsState)
|
||||
{
|
||||
case RS_STATUS_INACTIVE:
|
||||
peerState = PEER_STATE_INACTIVE;
|
||||
break;
|
||||
|
||||
case RS_STATUS_ONLINE:
|
||||
peerState = PEER_STATE_ONLINE;
|
||||
break;
|
||||
|
||||
case RS_STATUS_AWAY:
|
||||
peerState = PEER_STATE_AWAY;
|
||||
break;
|
||||
|
||||
case RS_STATUS_BUSY:
|
||||
peerState = PEER_STATE_BUSY;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find the best ssl contact for the gpg item */
|
||||
if (bestPeerState == 0 || peerState < bestPeerState)
|
||||
{
|
||||
bestPeerState = peerState;
|
||||
bestRSState = rsState;
|
||||
bestCustomStateString = customStateString;
|
||||
}
|
||||
else if (peerState == bestPeerState)
|
||||
{
|
||||
/* equal state */
|
||||
if (bestCustomStateString.empty() && !customStateString.empty())
|
||||
{
|
||||
bestPeerState = peerState;
|
||||
bestRSState = rsState;
|
||||
bestCustomStateString = customStateString;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
itemStream << makeKeyValue("custom_state_string", bestCustomStateString);
|
||||
|
||||
std::string state_string;
|
||||
|
||||
if(bestRSState == RS_STATUS_ONLINE)
|
||||
state_string = "online";
|
||||
else if(bestRSState == RS_STATUS_BUSY)
|
||||
state_string = "busy";
|
||||
else if(bestRSState == RS_STATUS_AWAY)
|
||||
state_string = "away";
|
||||
else if(bestRSState == RS_STATUS_INACTIVE)
|
||||
state_string = "inactive";
|
||||
else
|
||||
state_string = "undefined";
|
||||
|
||||
itemStream << makeKeyValue("state_string", state_string);
|
||||
}
|
||||
resp.mStateToken = getCurrentStateToken();
|
||||
}
|
||||
|
@ -300,6 +531,120 @@ void PeersHandler::handleExamineCert(Request &req, Response &resp)
|
|||
}
|
||||
}
|
||||
|
||||
void PeersHandler::handleGetPGPOptions(Request& req, Response& resp)
|
||||
{
|
||||
std::string pgp_id;
|
||||
req.mStream << makeKeyValueReference("pgp_id", pgp_id);
|
||||
|
||||
RsPgpId pgp(pgp_id);
|
||||
RsPeerDetails detail;
|
||||
|
||||
if(!mRsPeers->getGPGDetails(pgp, detail))
|
||||
{
|
||||
resp.setFail();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string pgp_key = mRsPeers->getPGPKey(detail.gpg_id, false);
|
||||
|
||||
resp.mDataStream << makeKeyValue("pgp_fingerprint", detail.fpr.toStdString());
|
||||
resp.mDataStream << makeKeyValueReference("pgp_key", pgp_key);
|
||||
|
||||
resp.mDataStream << makeKeyValue("direct_transfer", detail.service_perm_flags & RS_NODE_PERM_DIRECT_DL);
|
||||
resp.mDataStream << makeKeyValue("allow_push", detail.service_perm_flags & RS_NODE_PERM_ALLOW_PUSH);
|
||||
resp.mDataStream << makeKeyValue("require_WL", detail.service_perm_flags & RS_NODE_PERM_REQUIRE_WL);
|
||||
|
||||
resp.mDataStream << makeKeyValue("own_sign", detail.ownsign);
|
||||
resp.mDataStream << makeKeyValue("trustLvl", detail.trustLvl);
|
||||
|
||||
uint32_t max_upload_speed = 0;
|
||||
uint32_t max_download_speed = 0;
|
||||
|
||||
mRsPeers->getPeerMaximumRates(pgp, max_upload_speed, max_download_speed);
|
||||
|
||||
resp.mDataStream << makeKeyValueReference("maxUploadSpeed", max_upload_speed);
|
||||
resp.mDataStream << makeKeyValueReference("maxDownloadSpeed", max_download_speed);
|
||||
|
||||
StreamBase& signersStream = resp.mDataStream.getStreamToMember("gpg_signers");
|
||||
|
||||
// mark as list (in case list is empty)
|
||||
signersStream.getStreamToMember();
|
||||
|
||||
for(std::list<RsPgpId>::const_iterator it(detail.gpgSigners.begin()); it != detail.gpgSigners.end(); ++it)
|
||||
{
|
||||
RsPeerDetails detail;
|
||||
if(!mRsPeers->getGPGDetails(*it, detail))
|
||||
continue;
|
||||
|
||||
std::string pgp_id = (*it).toStdString();
|
||||
std::string name = detail.name;
|
||||
|
||||
signersStream.getStreamToMember()
|
||||
<< makeKeyValueReference("pgp_id", pgp_id)
|
||||
<< makeKeyValueReference("name", name);
|
||||
}
|
||||
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
void PeersHandler::handleSetPGPOptions(Request& req, Response& resp)
|
||||
{
|
||||
std::string pgp_id;
|
||||
req.mStream << makeKeyValueReference("pgp_id", pgp_id);
|
||||
|
||||
RsPgpId pgp(pgp_id);
|
||||
RsPeerDetails detail;
|
||||
|
||||
if(!mRsPeers->getGPGDetails(pgp, detail))
|
||||
{
|
||||
resp.setFail();
|
||||
return;
|
||||
}
|
||||
|
||||
int trustLvl;
|
||||
req.mStream << makeKeyValueReference("trustLvl", trustLvl);
|
||||
|
||||
if(trustLvl != (int)detail.trustLvl)
|
||||
mRsPeers->trustGPGCertificate(pgp, trustLvl);
|
||||
|
||||
int max_upload_speed;
|
||||
int max_download_speed;
|
||||
|
||||
req.mStream << makeKeyValueReference("max_upload_speed", max_upload_speed);
|
||||
req.mStream << makeKeyValueReference("max_download_speed", max_download_speed);
|
||||
|
||||
mRsPeers->setPeerMaximumRates(pgp, (uint32_t)max_upload_speed, (uint32_t)max_download_speed);
|
||||
|
||||
bool direct_transfer;
|
||||
bool allow_push;
|
||||
bool require_WL;
|
||||
|
||||
req.mStream << makeKeyValueReference("direct_transfer", direct_transfer);
|
||||
req.mStream << makeKeyValueReference("allow_push", allow_push);
|
||||
req.mStream << makeKeyValueReference("require_WL", require_WL);
|
||||
|
||||
ServicePermissionFlags flags(0);
|
||||
|
||||
if(direct_transfer)
|
||||
flags = flags | RS_NODE_PERM_DIRECT_DL;
|
||||
if(allow_push)
|
||||
flags = flags | RS_NODE_PERM_ALLOW_PUSH;
|
||||
if(require_WL)
|
||||
flags = flags | RS_NODE_PERM_REQUIRE_WL;
|
||||
|
||||
mRsPeers->setServicePermissionFlags(pgp, flags);
|
||||
|
||||
bool own_sign;
|
||||
req.mStream << makeKeyValueReference("own_sign", own_sign);
|
||||
|
||||
if(own_sign)
|
||||
mRsPeers->signGPGCertificate(pgp);
|
||||
|
||||
resp.mStateToken = getCurrentStateToken();
|
||||
|
||||
resp.setOk();
|
||||
}
|
||||
|
||||
StateToken PeersHandler::getCurrentStateToken()
|
||||
{
|
||||
RsStackMutex stack(mMtx); /********** STACK LOCKED MTX ******/
|
||||
|
|
|
@ -35,6 +35,15 @@ private:
|
|||
void handleWildcard(Request& req, Response& resp);
|
||||
void handleExamineCert(Request& req, Response& resp);
|
||||
|
||||
void handleGetStateString(Request& req, Response& resp);
|
||||
void handleSetStateString(Request& req, Response& resp);
|
||||
|
||||
void handleGetCustomStateString(Request& req, Response& resp);
|
||||
void handleSetCustomStateString(Request& req, Response& resp);
|
||||
|
||||
void handleGetPGPOptions(Request& req, Response& resp);
|
||||
void handleSetPGPOptions(Request& req, Response& resp);
|
||||
|
||||
// a helper which ensures proper mutex locking
|
||||
StateToken getCurrentStateToken();
|
||||
|
||||
|
@ -44,9 +53,14 @@ private:
|
|||
RsMsgs* mRsMsgs; // required for avatar data
|
||||
|
||||
std::list<RsPeerId> mOnlinePeers;
|
||||
uint32_t status;
|
||||
std::string custom_state_string;
|
||||
|
||||
RsMutex mMtx;
|
||||
StateToken mStateToken; // mutex protected
|
||||
StateToken mStringStateToken; // mutex protected
|
||||
StateToken mCustomStateToken; // mutex protected
|
||||
|
||||
std::map<RsPeerId, uint32_t> mUnreadMsgsCounts;
|
||||
};
|
||||
} // namespace resource_api
|
||||
|
|
|
@ -37,6 +37,13 @@ ResponseTask* ResourceRouter::handleRequest(Request& req, Response& resp)
|
|||
if(vit->first == req.mPath.top())
|
||||
{
|
||||
req.mPath.pop();
|
||||
|
||||
//Just for GUI benefit
|
||||
std::string callbackName;
|
||||
req.mStream << makeKeyValueReference("callback_name", callbackName);
|
||||
resp.mCallbackName = callbackName;
|
||||
//
|
||||
|
||||
return vit->second->handleRequest(req, resp);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <retroshare/rsinit.h>
|
||||
#include <retroshare/rsiface.h>
|
||||
#include <util/rsdir.h>
|
||||
|
||||
#include "api/ApiServer.h"
|
||||
#include "api/Operators.h"
|
||||
|
@ -23,7 +24,9 @@ RsControlModule::RsControlModule(int argc, char **argv, StateTokenServer* sts, A
|
|||
mDataMtx("RsControlModule::mDataMtx"),
|
||||
mRunState(WAITING_INIT),
|
||||
mAutoLoginNextTime(false),
|
||||
mWantPassword(false)
|
||||
mWantPassword(false),
|
||||
mPassword(""),
|
||||
mPrevIsBad(false)
|
||||
{
|
||||
mStateToken = sts->getNewToken();
|
||||
this->argc = argc;
|
||||
|
@ -55,13 +58,16 @@ bool RsControlModule::processShouldExit()
|
|||
return mProcessShouldExit;
|
||||
}
|
||||
|
||||
bool RsControlModule::askForPassword(const std::string &title, const std::string &key_details, bool /* prev_is_bad */, std::string &password, bool& cancelled)
|
||||
bool RsControlModule::askForPassword(const std::string &title, const std::string &key_details, bool prev_is_bad, std::string &password, bool& cancelled)
|
||||
{
|
||||
cancelled = false ;
|
||||
{
|
||||
RS_STACK_MUTEX(mDataMtx); // ********** LOCKED **********
|
||||
|
||||
mPrevIsBad = prev_is_bad;
|
||||
|
||||
if(mFixedPassword != "")
|
||||
{
|
||||
{
|
||||
password = mFixedPassword;
|
||||
return true;
|
||||
}
|
||||
|
@ -69,25 +75,31 @@ bool RsControlModule::askForPassword(const std::string &title, const std::string
|
|||
mWantPassword = true;
|
||||
mTitle = title;
|
||||
mKeyName = key_details;
|
||||
mPassword = "";
|
||||
|
||||
if(mPassword != "")
|
||||
{
|
||||
password = mPassword;
|
||||
mWantPassword = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
mStateTokenServer->replaceToken(mStateToken);
|
||||
}
|
||||
|
||||
bool wait = true;
|
||||
while(wait)
|
||||
int i = 0;
|
||||
while(i<100)
|
||||
{
|
||||
usleep(5*1000);
|
||||
|
||||
RS_STACK_MUTEX(mDataMtx); // ********** LOCKED **********
|
||||
wait = mWantPassword;
|
||||
if(!wait && mPassword != "")
|
||||
|
||||
if(mPassword != "")
|
||||
{
|
||||
password = mPassword;
|
||||
mPassword = "";
|
||||
password = mPassword;
|
||||
mWantPassword = false;
|
||||
mStateTokenServer->replaceToken(mStateToken);
|
||||
return true;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -124,6 +136,11 @@ void RsControlModule::run()
|
|||
bool login_ok = false;
|
||||
while(!login_ok)
|
||||
{
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
mPassword = "";
|
||||
}
|
||||
|
||||
// skip account selection if autologin is available
|
||||
if(initResult != RS_INIT_HAVE_ACCOUNT)
|
||||
setRunState(WAITING_ACCOUNT_SELECT);
|
||||
|
@ -174,8 +191,19 @@ void RsControlModule::run()
|
|||
std::cerr << "RsControlModule::run() LockAndLoadCertificates failed. Unexpected switch value: " << retVal << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
mLoadPeerId.clear();
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
mFixedPassword = mPassword;
|
||||
mPassword = "";
|
||||
}
|
||||
|
||||
setRunState(WAITING_STARTUP);
|
||||
|
||||
std::cerr << "RsControlModule: login ok, starting Retroshare worker threads..." << std::endl;
|
||||
|
@ -305,7 +333,8 @@ void RsControlModule::handlePassword(Request &req, Response &resp)
|
|||
|
||||
resp.mDataStream
|
||||
<< makeKeyValueReference("want_password", mWantPassword)
|
||||
<< makeKeyValueReference("key_name", mKeyName);
|
||||
<< makeKeyValueReference("key_name", mKeyName)
|
||||
<< makeKeyValueReference("prev_is_bad", mPrevIsBad);
|
||||
resp.mStateToken = mStateToken;
|
||||
resp.setOk();
|
||||
}
|
||||
|
@ -425,17 +454,17 @@ void RsControlModule::handleCreateLocation(Request &req, Response &resp)
|
|||
RsPeerId ssl_id;
|
||||
std::string err_string;
|
||||
// give the password to the password callback
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
mFixedPassword = pgp_password;
|
||||
}
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
mFixedPassword = pgp_password;
|
||||
}
|
||||
bool ssl_ok = RsAccounts::GenerateSSLCertificate(pgp_id, "", ssl_name, "", hidden_port!=0, ssl_password, ssl_id, err_string);
|
||||
|
||||
// clear fixed password to restore normal password operation
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
mFixedPassword = "";
|
||||
}
|
||||
// {
|
||||
// RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
// mFixedPassword = "";
|
||||
// }
|
||||
|
||||
if (ssl_ok)
|
||||
{
|
||||
|
@ -456,6 +485,20 @@ void RsControlModule::handleCreateLocation(Request &req, Response &resp)
|
|||
resp.setFail("could not create a new location. Error: "+err_string);
|
||||
}
|
||||
|
||||
bool RsControlModule::askForDeferredSelfSignature(const void *data, const uint32_t len, unsigned char *sign, unsigned int *signlen,int& signature_result, std::string reason /*=""*/)
|
||||
{
|
||||
if(rsPeers->gpgSignData(data,len,sign,signlen,reason))
|
||||
{
|
||||
signature_result = SELF_SIGNATURE_RESULT_SUCCESS;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
signature_result = SELF_SIGNATURE_RESULT_FAILED;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void RsControlModule::setRunState(RunState s, std::string errstr)
|
||||
{
|
||||
RsStackMutex stack(mDataMtx); // ********** LOCKED **********
|
||||
|
|
|
@ -31,8 +31,9 @@ public:
|
|||
// returns true if the process should terminate
|
||||
bool processShouldExit();
|
||||
|
||||
// from NotifyClient
|
||||
virtual bool askForPassword(const std::string &title, const std::string& key_details, bool prev_is_bad , std::string& password,bool& canceled);
|
||||
// from NotifyClient
|
||||
virtual bool askForPassword(const std::string &title, const std::string& key_details, bool prev_is_bad , std::string& password,bool& canceled) override;
|
||||
virtual bool askForDeferredSelfSignature(const void *data, const uint32_t len, unsigned char *sign, unsigned int *signlen,int& signature_result, std::string reason = "") override;
|
||||
|
||||
protected:
|
||||
// from RsThread
|
||||
|
@ -76,6 +77,7 @@ private:
|
|||
// to notify that a password callback is waiting
|
||||
// to answer the request, clear the flag and set the password
|
||||
bool mWantPassword;
|
||||
bool mPrevIsBad;
|
||||
std::string mTitle;
|
||||
std::string mKeyName;
|
||||
std::string mPassword;
|
||||
|
|
182
libresapi/src/api/SettingsHandler.cpp
Normal file
182
libresapi/src/api/SettingsHandler.cpp
Normal file
|
@ -0,0 +1,182 @@
|
|||
#include "SettingsHandler.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <retroshare/rsinit.h>
|
||||
|
||||
namespace resource_api
|
||||
{
|
||||
#define SETTINGS_FILE (QString::fromUtf8(RsAccounts::AccountDirectory().c_str()) + "/Sonet.conf")
|
||||
|
||||
SettingsHandler::SettingsHandler(StateTokenServer *sts, const QString settingsGroup) :
|
||||
QSettings(SETTINGS_FILE, QSettings::IniFormat),
|
||||
mStateTokenServer(sts),
|
||||
mMtx("SettingsHandler Mutex"),
|
||||
mStateToken(sts->getNewToken())
|
||||
{
|
||||
RsPeerId sPreferedId;
|
||||
m_bValid = RsAccounts::GetPreferredAccountId(sPreferedId);
|
||||
|
||||
if (!settingsGroup.isEmpty())
|
||||
beginGroup(settingsGroup);
|
||||
|
||||
addResourceHandler("*", this, &SettingsHandler::handleSettingsRequest);
|
||||
addResourceHandler("get_advanced_mode", this, &SettingsHandler::handleGetAdvancedMode);
|
||||
addResourceHandler("set_advanced_mode", this, &SettingsHandler::handleSetAdvancedMode);
|
||||
addResourceHandler("get_flickable_grid_mode", this, &SettingsHandler::handleGetFlickableGridMode);
|
||||
addResourceHandler("set_flickable_grid_mode", this, &SettingsHandler::handleSetFlickableGridMode);
|
||||
addResourceHandler("get_auto_login", this, &SettingsHandler::handleGetAutoLogin);
|
||||
addResourceHandler("set_auto_login", this, &SettingsHandler::handleSetAutoLogin);
|
||||
}
|
||||
|
||||
SettingsHandler::~SettingsHandler()
|
||||
{
|
||||
sync();
|
||||
}
|
||||
|
||||
void SettingsHandler::handleSettingsRequest(Request &/*req*/, Response &resp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SettingsHandler::handleGetAdvancedMode(Request &/*req*/, Response &resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
|
||||
bool advanced_mode = valueFromGroup("General", "Advanced", false).toBool();
|
||||
resp.mDataStream << makeKeyValueReference("advanced_mode", advanced_mode);
|
||||
resp.setOk();
|
||||
sync();
|
||||
}
|
||||
|
||||
void SettingsHandler::handleSetAdvancedMode(Request &req, Response &resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
|
||||
bool advanced_mode;
|
||||
req.mStream << makeKeyValueReference("advanced_mode", advanced_mode);
|
||||
setValueToGroup("General", "Advanced", advanced_mode);
|
||||
resp.setOk();
|
||||
sync();
|
||||
}
|
||||
|
||||
void SettingsHandler::handleGetFlickableGridMode(Request &/*req*/, Response &resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
|
||||
bool flickable_grid_mode = valueFromGroup("General", "FlickableGrid", false).toBool();
|
||||
resp.mDataStream << makeKeyValueReference("flickable_grid_mode", flickable_grid_mode);
|
||||
resp.setOk();
|
||||
sync();
|
||||
}
|
||||
|
||||
void SettingsHandler::handleSetFlickableGridMode(Request &req, Response &resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
|
||||
bool flickable_grid_mode;
|
||||
req.mStream << makeKeyValueReference("flickable_grid_mode", flickable_grid_mode);
|
||||
setValueToGroup("General", "FlickableGrid", flickable_grid_mode);
|
||||
|
||||
resp.setOk();
|
||||
sync();
|
||||
}
|
||||
|
||||
void SettingsHandler::handleGetAutoLogin(Request &/*req*/, Response &resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
|
||||
bool autoLogin = RsInit::getAutoLogin();;
|
||||
resp.mDataStream << makeKeyValueReference("auto_login", autoLogin);
|
||||
resp.setOk();
|
||||
sync();
|
||||
}
|
||||
|
||||
void SettingsHandler::handleSetAutoLogin(Request &req, Response &resp)
|
||||
{
|
||||
{
|
||||
RS_STACK_MUTEX(mMtx);
|
||||
resp.mStateToken = mStateToken;
|
||||
}
|
||||
|
||||
bool autoLogin;
|
||||
req.mStream << makeKeyValueReference("auto_login", autoLogin);
|
||||
RsInit::setAutoLogin(autoLogin);
|
||||
|
||||
resp.setOk();
|
||||
sync();
|
||||
}
|
||||
|
||||
QVariant SettingsHandler::value(const QString &key, const QVariant &defaultVal) const
|
||||
{
|
||||
if (m_bValid == false)
|
||||
{
|
||||
return defaultVal.isNull() ? defaultValue(key) : defaultVal;
|
||||
}
|
||||
return QSettings::value(key, defaultVal.isNull() ? defaultValue(key) : defaultVal);
|
||||
}
|
||||
|
||||
void SettingsHandler::setValue(const QString &key, const QVariant &val)
|
||||
{
|
||||
if (m_bValid == false)
|
||||
{
|
||||
std::cerr << "RSettings::setValue() Calling on invalid object, key = " << key.toStdString() << std::endl;
|
||||
return;
|
||||
}
|
||||
if (val == defaultValue(key))
|
||||
QSettings::remove(key);
|
||||
else if (val != value(key))
|
||||
QSettings::setValue(key, val);
|
||||
}
|
||||
|
||||
QVariant SettingsHandler::valueFromGroup(const QString &group, const QString &key, const QVariant &defaultVal)
|
||||
{
|
||||
beginGroup(group);
|
||||
QVariant val = value(key, defaultVal);
|
||||
endGroup();
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
void SettingsHandler::setValueToGroup(const QString &group, const QString &key, const QVariant &val)
|
||||
{
|
||||
beginGroup(group);
|
||||
setValue(key, val);
|
||||
endGroup();
|
||||
}
|
||||
|
||||
void SettingsHandler::setDefault(const QString &key, const QVariant &val)
|
||||
{
|
||||
_defaults.insert(key, val);
|
||||
}
|
||||
|
||||
QVariant SettingsHandler::defaultValue(const QString &key) const
|
||||
{
|
||||
if (_defaults.contains(key))
|
||||
return _defaults.value(key);
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
void SettingsHandler::reset()
|
||||
{
|
||||
/* Static method, so we have to create a QSettings object. */
|
||||
QSettings settings(SETTINGS_FILE, QSettings::IniFormat);
|
||||
settings.clear();
|
||||
}
|
||||
} // namespace resource_api
|
||||
|
59
libresapi/src/api/SettingsHandler.h
Normal file
59
libresapi/src/api/SettingsHandler.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
#ifndef SETTINGSHANDLER_H
|
||||
#define SETTINGSHANDLER_H
|
||||
|
||||
#include <QSettings>
|
||||
|
||||
#include <util/rsthreads.h>
|
||||
|
||||
#include "ResourceRouter.h"
|
||||
#include "StateTokenServer.h"
|
||||
|
||||
/* Reimplemented class RSettings*/
|
||||
namespace resource_api
|
||||
{
|
||||
class SettingsHandler : public ResourceRouter, public QSettings
|
||||
{
|
||||
public:
|
||||
SettingsHandler(StateTokenServer* sts, const QString group = QString());
|
||||
~SettingsHandler();
|
||||
|
||||
static void reset();
|
||||
|
||||
QVariant value(const QString &key,
|
||||
const QVariant &defaultVal = QVariant()) const;
|
||||
|
||||
void setValue(const QString &key, const QVariant &val);
|
||||
|
||||
QVariant valueFromGroup(const QString &group, const QString &key,
|
||||
const QVariant &defaultVal = QVariant());
|
||||
void setValueToGroup(const QString &group, const QString &key,
|
||||
const QVariant &val);
|
||||
|
||||
protected:
|
||||
void setDefault(const QString &key, const QVariant &val);
|
||||
QVariant defaultValue(const QString &key) const;
|
||||
|
||||
bool m_bValid;
|
||||
|
||||
private:
|
||||
void handleSettingsRequest(Request& req, Response& resp);
|
||||
|
||||
void handleGetAdvancedMode(Request& req, Response& resp);
|
||||
void handleSetAdvancedMode(Request& req, Response& resp);
|
||||
|
||||
void handleGetFlickableGridMode(Request& req, Response& resp);
|
||||
void handleSetFlickableGridMode(Request& req, Response& resp);
|
||||
|
||||
void handleGetAutoLogin(Request& req, Response& resp);
|
||||
void handleSetAutoLogin(Request& req, Response& resp);
|
||||
|
||||
QHash<QString, QVariant> _defaults;
|
||||
|
||||
StateTokenServer* mStateTokenServer;
|
||||
|
||||
RsMutex mMtx;
|
||||
StateToken mStateToken; // mutex protected
|
||||
};
|
||||
} // namespace resource_api
|
||||
|
||||
#endif // SETTINGSHANDLER_H
|
Loading…
Add table
Add a link
Reference in a new issue