mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-21 15:29:53 -05:00
made own avatar persistent. Next task will be to make friends avatars persistent too
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1088 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
12113df4b7
commit
3d2514238e
@ -73,6 +73,7 @@ const uint32_t CONFIG_TYPE_FT_CONTROL = 0x0009;
|
||||
* may move when switch to v0.5
|
||||
*/
|
||||
const uint32_t CONFIG_TYPE_RANK_LINK = 0x0011;
|
||||
const uint32_t CONFIG_TYPE_CHAT = 0x0012;
|
||||
|
||||
/* standard services */
|
||||
const uint32_t CONFIG_TYPE_QBLOG = 0x0101;
|
||||
|
@ -741,6 +741,7 @@ int RsServer::StartupRetroShare()
|
||||
mConfigMgr->addConfiguration("peers.cfg", mConnMgr);
|
||||
mConfigMgr->addConfiguration("general.cfg", mGeneralConfig);
|
||||
mConfigMgr->addConfiguration("msgs.cfg", msgSrv);
|
||||
mConfigMgr->addConfiguration("chat.cfg", chatSrv);
|
||||
mConfigMgr->addConfiguration("cache.cfg", mCacheStrapper);
|
||||
|
||||
mConfigMgr->addConfiguration("ranklink.cfg", mRanking);
|
||||
|
@ -23,6 +23,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pqi/pqibin.h"
|
||||
#include "pqi/pqiarchive.h"
|
||||
|
||||
#include "services/p3chatservice.h"
|
||||
|
||||
@ -37,7 +39,7 @@
|
||||
*/
|
||||
|
||||
p3ChatService::p3ChatService(p3ConnectMgr *cm)
|
||||
:p3Service(RS_SERVICE_TYPE_CHAT), mConnMgr(cm)
|
||||
:p3Service(RS_SERVICE_TYPE_CHAT), pqiConfig(CONFIG_TYPE_CHAT), mConnMgr(cm)
|
||||
{
|
||||
addSerialType(new RsChatSerialiser());
|
||||
|
||||
@ -263,6 +265,8 @@ std::list<RsChatItem *> p3ChatService::getChatQueue()
|
||||
|
||||
void p3ChatService::setOwnAvatarJpegData(const unsigned char *data,int size)
|
||||
{
|
||||
{
|
||||
RsStackMutex stack(mChatMtx); /********** STACK LOCKED MTX ******/
|
||||
std::cerr << "p3chatservice: Setting own avatar to new image." << std::endl ;
|
||||
|
||||
if(_own_avatar != NULL)
|
||||
@ -275,8 +279,12 @@ void p3ChatService::setOwnAvatarJpegData(const unsigned char *data,int size)
|
||||
it->second->_own_is_new = true ;
|
||||
}
|
||||
|
||||
IndicateConfigChanged();
|
||||
}
|
||||
|
||||
void p3ChatService::receiveAvatarJpegData(RsChatItem *ci)
|
||||
{
|
||||
RsStackMutex stack(mChatMtx); /********** STACK LOCKED MTX ******/
|
||||
std::cerr << "p3chatservice: received avatar jpeg data for peer " << ci->PeerId() << ". Storing it." << std::endl ;
|
||||
|
||||
bool new_peer = (_avatars.find(ci->PeerId()) == _avatars.end()) ;
|
||||
@ -289,6 +297,7 @@ void p3ChatService::receiveAvatarJpegData(RsChatItem *ci)
|
||||
void p3ChatService::getOwnAvatarJpegData(unsigned char *& data,int& size)
|
||||
{
|
||||
// should be a Mutex here.
|
||||
RsStackMutex stack(mChatMtx); /********** STACK LOCKED MTX ******/
|
||||
|
||||
std::cerr << "p3chatservice:: own avatar requested from above. " << std::endl ;
|
||||
// has avatar. Return it strait away.
|
||||
@ -304,6 +313,8 @@ void p3ChatService::getOwnAvatarJpegData(unsigned char *& data,int& size)
|
||||
void p3ChatService::getAvatarJpegData(const std::string& peer_id,unsigned char *& data,int& size)
|
||||
{
|
||||
// should be a Mutex here.
|
||||
RsStackMutex stack(mChatMtx); /********** STACK LOCKED MTX ******/
|
||||
|
||||
std::map<std::string,AvatarInfo *>::const_iterator it = _avatars.find(peer_id) ;
|
||||
|
||||
std::cerr << "p3chatservice:: avatar requested from above. " << std::endl ;
|
||||
@ -339,18 +350,27 @@ void p3ChatService::sendAvatarRequest(const std::string& peer_id)
|
||||
sendItem(ci);
|
||||
}
|
||||
|
||||
RsChatItem *p3ChatService::makeOwnAvatarItem()
|
||||
{
|
||||
RsStackMutex stack(mChatMtx); /********** STACK LOCKED MTX ******/
|
||||
RsChatItem *ci = new RsChatItem();
|
||||
|
||||
ci->chatFlags = RS_CHAT_FLAG_PRIVATE | RS_CHAT_FLAG_CONTAINS_AVATAR ;
|
||||
ci->sendTime = time(NULL);
|
||||
ci->message = _own_avatar->toStdWString() ;
|
||||
|
||||
return ci ;
|
||||
}
|
||||
|
||||
|
||||
void p3ChatService::sendAvatarJpegData(const std::string& peer_id)
|
||||
{
|
||||
std::cerr << "p3chatservice: sending requested for peer " << peer_id << ", data=" << (void*)_own_avatar << std::endl ;
|
||||
|
||||
if(_own_avatar != NULL)
|
||||
{
|
||||
RsChatItem *ci = new RsChatItem();
|
||||
|
||||
RsChatItem *ci = makeOwnAvatarItem();
|
||||
ci->PeerId(peer_id);
|
||||
ci->chatFlags = RS_CHAT_FLAG_PRIVATE | RS_CHAT_FLAG_CONTAINS_AVATAR ;
|
||||
ci->sendTime = time(NULL);
|
||||
ci->message = _own_avatar->toStdWString() ;
|
||||
|
||||
// take avatar, and embed it into a std::wstring.
|
||||
//
|
||||
@ -363,4 +383,87 @@ void p3ChatService::sendAvatarJpegData(const std::string& peer_id)
|
||||
std::cerr << "Doing nothing" << std::endl ;
|
||||
}
|
||||
|
||||
bool p3ChatService::loadConfiguration(std::string &loadHash)
|
||||
{
|
||||
std::list<std::string>::iterator it;
|
||||
std::string msgfile = Filename();
|
||||
|
||||
RsSerialiser *rss = new RsSerialiser();
|
||||
rss->addSerialType(new RsChatSerialiser());
|
||||
|
||||
BinFileInterface *in = new BinFileInterface(msgfile.c_str(), BIN_FLAGS_READABLE | BIN_FLAGS_HASH_DATA);
|
||||
pqiarchive *pa_in = new pqiarchive(rss, in, BIN_FLAGS_READABLE);
|
||||
RsItem *item;
|
||||
RsChatItem *mitem;
|
||||
|
||||
while((item = pa_in -> GetItem()))
|
||||
{
|
||||
if(NULL != (mitem = dynamic_cast<RsChatItem *>(item)))
|
||||
{
|
||||
RsStackMutex stack(mChatMtx); /********** STACK LOCKED MTX ******/
|
||||
|
||||
_own_avatar = new AvatarInfo(mitem->message) ;
|
||||
}
|
||||
|
||||
delete item;
|
||||
}
|
||||
|
||||
std::string hashin = in->gethash();
|
||||
delete pa_in;
|
||||
|
||||
if (hashin != loadHash)
|
||||
{
|
||||
/* big error message! */
|
||||
std::cerr << "p3ChatService::loadConfiguration() FAILED! avatar Tampered" << std::endl;
|
||||
std::string msgfileold = msgfile + ".failed";
|
||||
|
||||
rename(msgfile.c_str(), msgfileold.c_str());
|
||||
|
||||
std::cerr << "Moving Old file to: " << msgfileold << std::endl;
|
||||
std::cerr << "removing dodgey msgs" << std::endl;
|
||||
|
||||
_own_avatar = NULL ;
|
||||
|
||||
setHash("");
|
||||
return false;
|
||||
}
|
||||
|
||||
setHash(hashin);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool p3ChatService::saveConfiguration()
|
||||
{
|
||||
/* now we create a pqiarchive, and stream all the msgs into it */
|
||||
|
||||
std::string msgfile = Filename();
|
||||
std::string msgfiletmp = Filename()+".tmp";
|
||||
|
||||
RsSerialiser *rss = new RsSerialiser();
|
||||
rss->addSerialType(new RsChatSerialiser());
|
||||
|
||||
BinFileInterface *out = new BinFileInterface(msgfiletmp.c_str(), BIN_FLAGS_WRITEABLE | BIN_FLAGS_HASH_DATA);
|
||||
pqiarchive *pa_out = new pqiarchive(rss, out, BIN_FLAGS_WRITEABLE);
|
||||
|
||||
if(_own_avatar != NULL)
|
||||
{
|
||||
std::cerr << "Saving avatar config to file " << msgfile << std::endl ;
|
||||
RsChatItem *ci = makeOwnAvatarItem() ;
|
||||
ci->PeerId(mConnMgr->getOwnId());
|
||||
|
||||
if(!pa_out -> SendItem(ci))
|
||||
return false ;
|
||||
}
|
||||
|
||||
setHash(out->gethash());
|
||||
delete pa_out;
|
||||
|
||||
if(0 != rename(msgfiletmp.c_str(),msgfile.c_str()))
|
||||
return false ;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
||||
#include "services/p3service.h"
|
||||
#include "pqi/p3connmgr.h"
|
||||
|
||||
class p3ChatService: public p3Service
|
||||
class p3ChatService: public p3Service, public pqiConfig
|
||||
{
|
||||
public:
|
||||
p3ChatService(p3ConnectMgr *cm);
|
||||
@ -63,7 +63,13 @@ class p3ChatService: public p3Service
|
||||
|
||||
std::list<RsChatItem *> getChatQueue();
|
||||
|
||||
/*** Overloaded from pqiConfig ****/
|
||||
virtual bool loadConfiguration(std::string &loadHash);
|
||||
virtual bool saveConfiguration();
|
||||
|
||||
private:
|
||||
RsMutex mChatMtx;
|
||||
|
||||
class AvatarInfo ;
|
||||
|
||||
/// Send avatar info to peer in jpeg format.
|
||||
@ -75,6 +81,8 @@ class p3ChatService: public p3Service
|
||||
/// Sends a request for an avatar to the peer of given id
|
||||
void sendAvatarRequest(const std::string& peer_id) ;
|
||||
|
||||
RsChatItem *makeOwnAvatarItem() ;
|
||||
|
||||
p3ConnectMgr *mConnMgr;
|
||||
|
||||
AvatarInfo *_own_avatar ;
|
||||
|
Loading…
x
Reference in New Issue
Block a user