mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
Expose more login related JSON API
/rsLoginHelper/isLoggedIn to check if already logged in /rsAccounts/getCurrentAccountId to get the id of current selected account, beware that an account may be selected without actually logging in
This commit is contained in:
parent
a9b1a15b43
commit
a8ddec03fc
@ -53,8 +53,13 @@ public:
|
|||||||
static RsControl *instance();
|
static RsControl *instance();
|
||||||
static void earlyInitNotificationSystem() { instance(); }
|
static void earlyInitNotificationSystem() { instance(); }
|
||||||
|
|
||||||
/* Real Startup Fn */
|
/* Real Startup Fn */
|
||||||
virtual int StartupRetroShare() = 0;
|
virtual int StartupRetroShare() = 0;
|
||||||
|
|
||||||
|
/** Check if core is fully ready, true only after
|
||||||
|
* StartupRetroShare() finish and before rsGlobalShutDown() begin
|
||||||
|
*/
|
||||||
|
virtual bool isReady() = 0;
|
||||||
|
|
||||||
/****************************************/
|
/****************************************/
|
||||||
/* Config */
|
/* Config */
|
||||||
|
@ -51,6 +51,15 @@ struct RsLoginHelper;
|
|||||||
*/
|
*/
|
||||||
extern RsLoginHelper* rsLoginHelper;
|
extern RsLoginHelper* rsLoginHelper;
|
||||||
|
|
||||||
|
|
||||||
|
class RsAccounts;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pointer to global instance of RsAccounts needed to expose JSON API
|
||||||
|
* @jsonapi{development}
|
||||||
|
*/
|
||||||
|
extern RsAccounts* rsAccounts;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Initialisation Class (not publicly disclosed to RsIFace)
|
* Initialisation Class (not publicly disclosed to RsIFace)
|
||||||
*/
|
*/
|
||||||
@ -132,31 +141,36 @@ private:
|
|||||||
|
|
||||||
/* Seperate static Class for dealing with Accounts */
|
/* Seperate static Class for dealing with Accounts */
|
||||||
|
|
||||||
class RsAccountsDetail ;
|
class RsAccountsDetail;
|
||||||
|
|
||||||
class RsAccounts
|
class RsAccounts
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Should be called once before everything else.
|
/// Should be called once before everything else.
|
||||||
|
|
||||||
static bool init(const std::string &opt_base_dir, int& error_code);
|
static bool init(const std::string &opt_base_dir, int& error_code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ConfigDirectory (normally ~/.retroshare) you can call this method
|
* @brief ConfigDirectory (usually ~/.retroshare) you can call this method
|
||||||
* even before initialisation (you can't with some other methods)
|
* even before initialisation (you can't with some other methods)
|
||||||
*
|
* @see RsAccountsDetail::PathBaseDirectory()
|
||||||
* On linux: ~/.retroshare/
|
*/
|
||||||
*
|
|
||||||
* @see RsAccountsDetail::PathBaseDirectory()
|
|
||||||
*/
|
|
||||||
static std::string ConfigDirectory();
|
static std::string ConfigDirectory();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief DataDirectory
|
* @brief Get current account id. Beware that an account may be selected
|
||||||
* you can call this method even before initialisation (you can't with some other methods)
|
* without actually logging in.
|
||||||
* @param check if set to true and directory does not exist, return empty string
|
* @jsonapi{development}
|
||||||
* @return path where global platform independent files are stored, like bdboot.txt or webinterface files
|
* @param[out] id storage for current account id
|
||||||
*/
|
* @return false if account hasn't been selected yet, true otherwise
|
||||||
|
*/
|
||||||
|
bool getCurrentAccountId(RsPeerId &id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DataDirectory
|
||||||
|
* you can call this method even before initialisation (you can't with some other methods)
|
||||||
|
* @param check if set to true and directory does not exist, return empty string
|
||||||
|
* @return path where global platform independent files are stored, like bdboot.txt or webinterface files
|
||||||
|
*/
|
||||||
static std::string systemDataDirectory(bool check = true);
|
static std::string systemDataDirectory(bool check = true);
|
||||||
static std::string PGPDirectory();
|
static std::string PGPDirectory();
|
||||||
|
|
||||||
@ -207,7 +221,7 @@ public:
|
|||||||
static void unlockPreferredAccount() ;
|
static void unlockPreferredAccount() ;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static RsAccountsDetail *rsAccounts ;
|
static RsAccountsDetail* rsAccountsDetails;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -263,6 +277,14 @@ struct RsLoginHelper
|
|||||||
const std::string& password, bool makeHidden,
|
const std::string& password, bool makeHidden,
|
||||||
bool makeAutoTor, std::string& errorMessage );
|
bool makeAutoTor, std::string& errorMessage );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if RetroShare is already logged in, this usually return true
|
||||||
|
* after a successfull attemptLogin() and before closeSession()
|
||||||
|
* @jsonapi{development}
|
||||||
|
* @return true if already logged in, false otherwise
|
||||||
|
*/
|
||||||
|
bool isLoggedIn();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Close RetroShare session
|
* @brief Close RetroShare session
|
||||||
* @jsonapi{development}
|
* @jsonapi{development}
|
||||||
|
@ -83,6 +83,7 @@ void RsServer::startServiceThread(RsTickingThread *t, const std::string &threadN
|
|||||||
|
|
||||||
void RsServer::rsGlobalShutDown()
|
void RsServer::rsGlobalShutDown()
|
||||||
{
|
{
|
||||||
|
coreReady = false;
|
||||||
// TODO: cache should also clean up old files
|
// TODO: cache should also clean up old files
|
||||||
|
|
||||||
ConfigFinalSave(); // save configuration before exit
|
ConfigFinalSave(); // save configuration before exit
|
||||||
|
@ -79,8 +79,8 @@ const double RsServer::maxTimeDelta = 0.2;
|
|||||||
const double RsServer::kickLimit = 0.15;
|
const double RsServer::kickLimit = 0.15;
|
||||||
|
|
||||||
|
|
||||||
RsServer::RsServer()
|
RsServer::RsServer() :
|
||||||
: coreMutex("RsServer")
|
coreMutex("RsServer"), coreReady(false)
|
||||||
{
|
{
|
||||||
// This is needed asap.
|
// This is needed asap.
|
||||||
//
|
//
|
||||||
|
@ -82,6 +82,9 @@ class RsServer: public RsControl, public RsTickingThread
|
|||||||
/****************************************/
|
/****************************************/
|
||||||
/* p3face.cc: main loop / util fns / locking. */
|
/* p3face.cc: main loop / util fns / locking. */
|
||||||
|
|
||||||
|
/// @see RsControl::isReady()
|
||||||
|
virtual bool isReady() { return coreReady; }
|
||||||
|
|
||||||
RsServer() ;
|
RsServer() ;
|
||||||
virtual ~RsServer();
|
virtual ~RsServer();
|
||||||
|
|
||||||
@ -122,11 +125,11 @@ class RsServer: public RsControl, public RsTickingThread
|
|||||||
|
|
||||||
/************* Rs shut down function: in upnp 'port lease time' bug *****************/
|
/************* Rs shut down function: in upnp 'port lease time' bug *****************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is responsible for ensuring Retroshare exits in a legal state:
|
* This function is responsible for ensuring Retroshare exits in a legal state:
|
||||||
* i.e. releases all held resources and saves current configuration
|
* i.e. releases all held resources and saves current configuration
|
||||||
*/
|
*/
|
||||||
virtual void rsGlobalShutDown( );
|
virtual void rsGlobalShutDown();
|
||||||
|
|
||||||
/****************************************/
|
/****************************************/
|
||||||
|
|
||||||
@ -198,6 +201,11 @@ class RsServer: public RsControl, public RsTickingThread
|
|||||||
static const double minTimeDelta; // 25;
|
static const double minTimeDelta; // 25;
|
||||||
static const double maxTimeDelta;
|
static const double maxTimeDelta;
|
||||||
static const double kickLimit;
|
static const double kickLimit;
|
||||||
|
|
||||||
|
/** Keep track of the core being fully ready, true only after
|
||||||
|
* StartupRetroShare() finish and before rsGlobalShutDown() begin
|
||||||
|
*/
|
||||||
|
bool coreReady;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Helper function to convert windows paths
|
/* Helper function to convert windows paths
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
// Global singleton declaration of data.
|
// Global singleton declaration of data.
|
||||||
RsAccountsDetail *RsAccounts::rsAccounts;
|
RsAccountsDetail* RsAccounts::rsAccountsDetails = nullptr;
|
||||||
|
|
||||||
/* Uses private class - so must be hidden */
|
/* Uses private class - so must be hidden */
|
||||||
static bool checkAccount(const std::string &accountdir, AccountDetails &account,std::map<std::string,std::vector<std::string> >& unsupported_keys);
|
static bool checkAccount(const std::string &accountdir, AccountDetails &account,std::map<std::string,std::vector<std::string> >& unsupported_keys);
|
||||||
@ -1267,17 +1267,18 @@ bool RsInit::LoadPassword(const std::string& id, const std::string& inPwd)
|
|||||||
|
|
||||||
bool RsAccounts::init(const std::string& opt_base_dir,int& error_code)
|
bool RsAccounts::init(const std::string& opt_base_dir,int& error_code)
|
||||||
{
|
{
|
||||||
rsAccounts = new RsAccountsDetail ;
|
rsAccountsDetails = new RsAccountsDetail;
|
||||||
|
rsAccounts = new RsAccounts;
|
||||||
|
|
||||||
// first check config directories, and set bootstrap values.
|
// first check config directories, and set bootstrap values.
|
||||||
if(!rsAccounts->setupBaseDirectory(opt_base_dir))
|
if(!rsAccountsDetails->setupBaseDirectory(opt_base_dir))
|
||||||
{
|
{
|
||||||
error_code = RS_INIT_BASE_DIR_ERROR ;
|
error_code = RS_INIT_BASE_DIR_ERROR ;
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup PGP stuff.
|
// Setup PGP stuff.
|
||||||
std::string pgp_dir = rsAccounts->PathPGPDirectory();
|
std::string pgp_dir = rsAccountsDetails->PathPGPDirectory();
|
||||||
|
|
||||||
if(!RsDirUtil::checkCreateDirectory(pgp_dir))
|
if(!RsDirUtil::checkCreateDirectory(pgp_dir))
|
||||||
throw std::runtime_error("Cannot create pgp directory " + pgp_dir) ;
|
throw std::runtime_error("Cannot create pgp directory " + pgp_dir) ;
|
||||||
@ -1288,7 +1289,7 @@ bool RsAccounts::init(const std::string& opt_base_dir,int& error_code)
|
|||||||
pgp_dir + "/lock");
|
pgp_dir + "/lock");
|
||||||
|
|
||||||
// load Accounts.
|
// load Accounts.
|
||||||
if (!rsAccounts->loadAccounts())
|
if (!rsAccountsDetails->loadAccounts())
|
||||||
{
|
{
|
||||||
error_code = RS_INIT_NO_KEYRING ;
|
error_code = RS_INIT_NO_KEYRING ;
|
||||||
return false ;
|
return false ;
|
||||||
@ -1299,75 +1300,75 @@ bool RsAccounts::init(const std::string& opt_base_dir,int& error_code)
|
|||||||
// Directories.
|
// Directories.
|
||||||
std::string RsAccounts::ConfigDirectory() { return RsAccountsDetail::PathBaseDirectory(); }
|
std::string RsAccounts::ConfigDirectory() { return RsAccountsDetail::PathBaseDirectory(); }
|
||||||
std::string RsAccounts::systemDataDirectory(bool check) { return RsAccountsDetail::PathDataDirectory(check); }
|
std::string RsAccounts::systemDataDirectory(bool check) { return RsAccountsDetail::PathDataDirectory(check); }
|
||||||
std::string RsAccounts::PGPDirectory() { return rsAccounts->PathPGPDirectory(); }
|
std::string RsAccounts::PGPDirectory() { return rsAccountsDetails->PathPGPDirectory(); }
|
||||||
std::string RsAccounts::AccountDirectory() { return rsAccounts->getCurrentAccountPathAccountDirectory(); }
|
std::string RsAccounts::AccountDirectory() { return rsAccountsDetails->getCurrentAccountPathAccountDirectory(); }
|
||||||
std::string RsAccounts::AccountKeysDirectory() { return rsAccounts->getCurrentAccountPathAccountKeysDirectory(); }
|
std::string RsAccounts::AccountKeysDirectory() { return rsAccountsDetails->getCurrentAccountPathAccountKeysDirectory(); }
|
||||||
std::string RsAccounts::AccountPathCertFile() { return rsAccounts->getCurrentAccountPathCertFile(); }
|
std::string RsAccounts::AccountPathCertFile() { return rsAccountsDetails->getCurrentAccountPathCertFile(); }
|
||||||
std::string RsAccounts::AccountPathKeyFile() { return rsAccounts->getCurrentAccountPathKeyFile(); }
|
std::string RsAccounts::AccountPathKeyFile() { return rsAccountsDetails->getCurrentAccountPathKeyFile(); }
|
||||||
std::string RsAccounts::AccountLocationName() { return rsAccounts->getCurrentAccountLocationName(); }
|
std::string RsAccounts::AccountLocationName() { return rsAccountsDetails->getCurrentAccountLocationName(); }
|
||||||
|
|
||||||
bool RsAccounts::lockPreferredAccount() { return rsAccounts->lockPreferredAccount();} // are these methods any useful??
|
bool RsAccounts::lockPreferredAccount() { return rsAccountsDetails->lockPreferredAccount();} // are these methods any useful??
|
||||||
void RsAccounts::unlockPreferredAccount() { rsAccounts->unlockPreferredAccount(); }
|
void RsAccounts::unlockPreferredAccount() { rsAccountsDetails->unlockPreferredAccount(); }
|
||||||
|
|
||||||
bool RsAccounts::checkCreateAccountDirectory() { return rsAccounts->checkAccountDirectory(); }
|
bool RsAccounts::checkCreateAccountDirectory() { return rsAccountsDetails->checkAccountDirectory(); }
|
||||||
|
|
||||||
// PGP Accounts.
|
// PGP Accounts.
|
||||||
int RsAccounts::GetPGPLogins(std::list<RsPgpId> &pgpIds)
|
int RsAccounts::GetPGPLogins(std::list<RsPgpId> &pgpIds)
|
||||||
{
|
{
|
||||||
return rsAccounts->GetPGPLogins(pgpIds);
|
return rsAccountsDetails->GetPGPLogins(pgpIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
int RsAccounts::GetPGPLoginDetails(const RsPgpId& id, std::string &name, std::string &email)
|
int RsAccounts::GetPGPLoginDetails(const RsPgpId& id, std::string &name, std::string &email)
|
||||||
{
|
{
|
||||||
return rsAccounts->GetPGPLoginDetails(id, name, email);
|
return rsAccountsDetails->GetPGPLoginDetails(id, name, email);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::GeneratePGPCertificate(const std::string &name, const std::string& email, const std::string& passwd, RsPgpId &pgpId, const int keynumbits, std::string &errString)
|
bool RsAccounts::GeneratePGPCertificate(const std::string &name, const std::string& email, const std::string& passwd, RsPgpId &pgpId, const int keynumbits, std::string &errString)
|
||||||
{
|
{
|
||||||
return rsAccounts->GeneratePGPCertificate(name, email, passwd, pgpId, keynumbits, errString);
|
return rsAccountsDetails->GeneratePGPCertificate(name, email, passwd, pgpId, keynumbits, errString);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PGP Support Functions.
|
// PGP Support Functions.
|
||||||
bool RsAccounts::ExportIdentity(const std::string& fname,const RsPgpId& pgp_id)
|
bool RsAccounts::ExportIdentity(const std::string& fname,const RsPgpId& pgp_id)
|
||||||
{
|
{
|
||||||
return rsAccounts->exportIdentity(fname,pgp_id);
|
return rsAccountsDetails->exportIdentity(fname,pgp_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::ImportIdentity(const std::string& fname,RsPgpId& imported_pgp_id,std::string& import_error)
|
bool RsAccounts::ImportIdentity(const std::string& fname,RsPgpId& imported_pgp_id,std::string& import_error)
|
||||||
{
|
{
|
||||||
return rsAccounts->importIdentity(fname,imported_pgp_id,import_error);
|
return rsAccountsDetails->importIdentity(fname,imported_pgp_id,import_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::ImportIdentityFromString(const std::string& data,RsPgpId& imported_pgp_id,std::string& import_error)
|
bool RsAccounts::ImportIdentityFromString(const std::string& data,RsPgpId& imported_pgp_id,std::string& import_error)
|
||||||
{
|
{
|
||||||
return rsAccounts->importIdentityFromString(data,imported_pgp_id,import_error);
|
return rsAccountsDetails->importIdentityFromString(data,imported_pgp_id,import_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RsAccounts::GetUnsupportedKeys(std::map<std::string,std::vector<std::string> > &unsupported_keys)
|
void RsAccounts::GetUnsupportedKeys(std::map<std::string,std::vector<std::string> > &unsupported_keys)
|
||||||
{
|
{
|
||||||
return rsAccounts->getUnsupportedKeys(unsupported_keys);
|
return rsAccountsDetails->getUnsupportedKeys(unsupported_keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::CopyGnuPGKeyrings()
|
bool RsAccounts::CopyGnuPGKeyrings()
|
||||||
{
|
{
|
||||||
return rsAccounts->copyGnuPGKeyrings();
|
return rsAccountsDetails->copyGnuPGKeyrings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RsAccounts::storeSelectedAccount() { rsAccounts->storePreferredAccount() ;}
|
void RsAccounts::storeSelectedAccount() { rsAccountsDetails->storePreferredAccount() ;}
|
||||||
// Rs Accounts
|
// Rs Accounts
|
||||||
bool RsAccounts::SelectAccount(const RsPeerId &id)
|
bool RsAccounts::SelectAccount(const RsPeerId &id)
|
||||||
{
|
{
|
||||||
return rsAccounts->selectId(id);
|
return rsAccountsDetails->selectId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::GetPreferredAccountId(RsPeerId &id)
|
bool RsAccounts::GetPreferredAccountId(RsPeerId &id)
|
||||||
{
|
{
|
||||||
return rsAccounts->getCurrentAccountId(id);
|
return rsAccountsDetails->getCurrentAccountId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::getCurrentAccountOptions(bool& is_hidden,bool& is_tor_auto,bool& is_first_time)
|
bool RsAccounts::getCurrentAccountOptions(bool& is_hidden,bool& is_tor_auto,bool& is_first_time)
|
||||||
{
|
{
|
||||||
return rsAccounts->getCurrentAccountOptions(is_hidden,is_tor_auto,is_first_time);
|
return rsAccountsDetails->getCurrentAccountOptions(is_hidden,is_tor_auto,is_first_time);
|
||||||
}
|
}
|
||||||
bool RsAccounts::isHiddenNode()
|
bool RsAccounts::isHiddenNode()
|
||||||
{
|
{
|
||||||
@ -1400,14 +1401,14 @@ bool RsAccounts::isTorAuto()
|
|||||||
|
|
||||||
bool RsAccounts::GetAccountIds(std::list<RsPeerId> &ids)
|
bool RsAccounts::GetAccountIds(std::list<RsPeerId> &ids)
|
||||||
{
|
{
|
||||||
return rsAccounts->getAccountIds(ids);
|
return rsAccountsDetails->getAccountIds(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::GetAccountDetails(const RsPeerId &id,
|
bool RsAccounts::GetAccountDetails(const RsPeerId &id,
|
||||||
RsPgpId &pgpId, std::string &pgpName,
|
RsPgpId &pgpId, std::string &pgpName,
|
||||||
std::string &pgpEmail, std::string &location)
|
std::string &pgpEmail, std::string &location)
|
||||||
{
|
{
|
||||||
return rsAccounts->getCurrentAccountDetails(id, pgpId, pgpName, pgpEmail, location);
|
return rsAccountsDetails->getCurrentAccountDetails(id, pgpId, pgpName, pgpEmail, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RsAccounts::createNewAccount(
|
bool RsAccounts::createNewAccount(
|
||||||
@ -1415,7 +1416,7 @@ bool RsAccounts::createNewAccount(
|
|||||||
const std::string& country, bool ishiddenloc, bool isautotor,
|
const std::string& country, bool ishiddenloc, bool isautotor,
|
||||||
const std::string& passwd, RsPeerId &sslId, std::string &errString )
|
const std::string& passwd, RsPeerId &sslId, std::string &errString )
|
||||||
{
|
{
|
||||||
return rsAccounts->GenerateSSLCertificate(pgp_id, org, loc, country, ishiddenloc, isautotor, passwd, sslId, errString);
|
return rsAccountsDetails->GenerateSSLCertificate(pgp_id, org, loc, country, ishiddenloc, isautotor, passwd, sslId, errString);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
|
@ -101,7 +101,9 @@ RsDht *rsDht = NULL ;
|
|||||||
|
|
||||||
//std::map<std::string,std::vector<std::string> > RsInit::unsupported_keys ;
|
//std::map<std::string,std::vector<std::string> > RsInit::unsupported_keys ;
|
||||||
|
|
||||||
RsLoginHelper* rsLoginHelper;
|
RsLoginHelper* rsLoginHelper = nullptr;
|
||||||
|
|
||||||
|
RsAccounts* rsAccounts = nullptr;
|
||||||
|
|
||||||
class RsInitConfig
|
class RsInitConfig
|
||||||
{
|
{
|
||||||
@ -1931,6 +1933,7 @@ int RsServer::StartupRetroShare()
|
|||||||
std::cerr << "== RsInit:: Retroshare core started ==" << std::endl;
|
std::cerr << "== RsInit:: Retroshare core started ==" << std::endl;
|
||||||
std::cerr << "========================================================================" << std::endl;
|
std::cerr << "========================================================================" << std::endl;
|
||||||
|
|
||||||
|
coreReady = true;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2006,6 +2009,11 @@ bool RsLoginHelper::createLocation(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RsLoginHelper::isLoggedIn()
|
||||||
|
{
|
||||||
|
return RsControl::instance()->isReady();
|
||||||
|
}
|
||||||
|
|
||||||
void RsLoginHelper::closeSession()
|
void RsLoginHelper::closeSession()
|
||||||
{
|
{
|
||||||
RsControl::instance()->rsGlobalShutDown();
|
RsControl::instance()->rsGlobalShutDown();
|
||||||
@ -2020,3 +2028,8 @@ void RsLoginHelper::Location::serial_process(
|
|||||||
RS_SERIAL_PROCESS(mLocationName);
|
RS_SERIAL_PROCESS(mLocationName);
|
||||||
RS_SERIAL_PROCESS(mPpgName);
|
RS_SERIAL_PROCESS(mPpgName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RsAccounts::getCurrentAccountId(RsPeerId& id)
|
||||||
|
{
|
||||||
|
return rsAccountsDetails->getCurrentAccountId(id);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user