auto download option:

ability to enable and disable channels auto dl added
added gui update to channel feed
msg download not enabled yet

cache opt:
added more enable cache opt #defines to disable cache opt code





git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4132 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
chrisparker126 2011-04-07 22:09:16 +00:00
parent d42d7cfc3e
commit 814c5d1619
5 changed files with 162 additions and 28 deletions

View File

@ -37,6 +37,8 @@
#define CHANNEL_MSG_STATUS_MASK 0x000f #define CHANNEL_MSG_STATUS_MASK 0x000f
#define CHANNEL_MSG_STATUS_READ 0x0001 #define CHANNEL_MSG_STATUS_READ 0x0001
#define CHANNEL_MSG_STATUS_UNREAD_BY_USER 0x0002 #define CHANNEL_MSG_STATUS_UNREAD_BY_USER 0x0002
#define CHANNEL_MSG_STATUS_DOWLOADED 0x0004
//! Stores information for a give channel id //! Stores information for a give channel id
/*! /*!
@ -45,13 +47,15 @@
class ChannelInfo class ChannelInfo
{ {
public: public:
ChannelInfo() : pngChanImage(NULL), pngImageLen(0) {} ChannelInfo() : autoDownload(false), pngChanImage(NULL), pngImageLen(0)
{}
std::string channelId; std::string channelId;
std::wstring channelName; std::wstring channelName;
std::wstring channelDesc; std::wstring channelDesc;
uint32_t channelFlags; uint32_t channelFlags;
uint32_t pop; /// popularity uint32_t pop; /// popularity
bool autoDownload;
unsigned char* pngChanImage; unsigned char* pngChanImage;
uint32_t pngImageLen; uint32_t pngImageLen;
@ -205,8 +209,9 @@ virtual bool ChannelMessageSend(ChannelMsgInfo &info) = 0;
/*! /*!
* @param cId the channel id * @param cId the channel id
* @param subscribe set to true if you want to subscribe and to false to unsubscribe * @param subscribe set to true if you want to subscribe and to false to unsubscribe
* @param set true to allow autodownload of new content and false otherwise, ignored when second param is false
*/ */
virtual bool channelSubscribe(std::string cId, bool subscribe) = 0; virtual bool channelSubscribe(std::string cId, bool subscribe, bool autoDl) = 0;
/*! /*!
* This hashes a file which is not already shared by client or his peers, * This hashes a file which is not already shared by client or his peers,
@ -252,11 +257,20 @@ virtual bool channelEditInfo(std::string chId, ChannelInfo &ci) = 0;
virtual void getPubKeysAvailableGrpIds(std::list<std::string>& chanIds) = 0; virtual void getPubKeysAvailableGrpIds(std::list<std::string>& chanIds) = 0;
/*! /*!
* * set the channel so that it does not auto download any more
* * @param chId the channel id to set for
* * @param set to true to enable auto dl and false to disable
*/ */
//virtual void setPrivateChannelDir(const std::string&) = 0; virtual bool channelSetAutoDl(const std::string& chId, bool autoDl) = 0;
/*!
* get what autoDl is set to for the given channel id
* @param chId id of channel to get autoDl status for
* @param autoDl
* @return false if channel cannot be found
*/
virtual bool channelGetAutoDl(const std::string& chId, bool& autoDl) = 0;
}; };

View File

@ -541,20 +541,84 @@ bool p3Channels::locked_checkDistribMsg(RsDistribMsg *msg)
bool p3Channels::channelSubscribe(std::string cId, bool subscribe) bool p3Channels::channelSubscribe(std::string cId, bool subscribe, bool autoDl)
{ {
#ifdef CHANNEL_DEBUG #ifdef CHANNEL_DEBUG
std::cerr << "p3Channels::channelSubscribe() " << cId << std::endl; std::cerr << "p3Channels::channelSubscribe() " << cId << std::endl;
#endif #endif
{
RsStackMutex stack(distribMtx);
if(subscribe)
mChannelStatus[cId] |= autoDl ?
(RS_CHAN_STATUS_AUTO_DL & RS_CHAN_STATUS_MASK) : ~RS_CHAN_STATUS_MASK;
}
bool ok = subscribeToGroup(cId, subscribe); bool ok = subscribeToGroup(cId, subscribe);
if(ok)
mChannelStatus[cId] = RS_CHAN_STATUS_AUTO_DL;
// if subscribing set channel status bit field on whether
// or not to auto download
{
RsStackMutex stack(distribMtx);
if(!ok || !subscribe){
mChannelStatus.erase(cId);
removeChannelReadStatusEntry(cId);
}
else{
addChannelReadStatusEntry(cId);
}
IndicateConfigChanged();
}
return ok; return ok;
} }
void p3Channels::addChannelReadStatusEntry(const std::string& cId)
{
std::list<RsChannelReadStatus*>::iterator lit = mReadStatus.begin();
RsChannelReadStatus* rds = NULL;
// check to ensure an entry does not exist
for(; lit != mReadStatus.end(); lit++){
if((*lit)->channelId == cId)
{
break;
}
}
if(lit == mReadStatus.end()){
rds = new RsChannelReadStatus();
rds->channelId = cId;
mReadStatus.push_back(rds);
saveList.push_back(rds);
}
return;
}
//TODO: delete unsubscribed channels from entry
void p3Channels::removeChannelReadStatusEntry(const std::string& cId)
{
std::list<RsChannelReadStatus*>::iterator lit = mReadStatus.begin();
statMap::iterator mit;
// check to ensure an entry does not exist
for(; lit != mReadStatus.end(); lit++){
if((*lit)->channelId == cId)
{
if((mit = (*lit)->msgReadStatus.find(cId)) !=
(*lit)->msgReadStatus.end()){
(*lit)->msgReadStatus.erase(mit);
break;
}
}
}
}
bool p3Channels::channelShareKeys(std::string chId, std::list<std::string>& peers){ bool p3Channels::channelShareKeys(std::string chId, std::list<std::string>& peers){
#ifdef CHANNEL_DEBUG #ifdef CHANNEL_DEBUG
@ -601,17 +665,37 @@ void p3Channels::getPubKeysAvailableGrpIds(std::list<std::string>& grpIds)
} }
void p3Channels::channelSetAutoDl(const std::string& chId, bool autoDl) bool p3Channels::channelSetAutoDl(const std::string& chId, bool autoDl)
{ {
RsStackMutex stack(distribMtx); RsStackMutex stack(distribMtx);
if(autoDl) statMap::iterator it = mChannelStatus.find(chId);
mChannelStatus[chId] |= RS_CHAN_STATUS_AUTO_DL; bool changed = false;
else
mChannelStatus[chId] = ~RS_CHAN_STATUS_AUTO_DL;
return; if(it != mChannelStatus.end()){
if(autoDl)
it->second |= RS_CHAN_STATUS_AUTO_DL;
else
it->second &= ~(RS_CHAN_STATUS_AUTO_DL & RS_CHAN_STATUS_MASK);
changed = true;
}
else
{
#ifdef CHANNEL_DEBUG
std::cerr << "p3Channels::channelSetAutoDl(): " << "Channel does not exist"
<< std::endl;
#endif
return false;
}
// save configuration
if(changed)
IndicateConfigChanged();
return true;
} }
@ -623,7 +707,7 @@ bool p3Channels::channelGetAutoDl(const std::string& chId, bool& autoDl)
if(it != mChannelStatus.end()) if(it != mChannelStatus.end())
{ {
autoDl = mChannelStatus[chId] & RS_CHAN_STATUS_AUTO_DL; autoDl = it->second & RS_CHAN_STATUS_AUTO_DL;
return true; return true;
} }
@ -766,9 +850,12 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std
localpath, flags, srcIds); localpath, flags, srcIds);
} }
if(cit != mMsgReadStatus.end()){
mit1->second |= (CHANNEL_MSG_STATUS_MASK & if(mit1 != cit->second.end())
CHANNEL_MSG_STATUS_DOWLOADED); mit1->second |= (CHANNEL_MSG_STATUS_MASK &
CHANNEL_MSG_STATUS_DOWLOADED);
}
return true; return true;
} }
@ -890,7 +977,9 @@ bool p3Channels::childLoadList(std::list<RsItem* >& configSaves)
{ {
std::cerr << "p3Channels::childLoadList(): Configs items loaded were incorrect!" std::cerr << "p3Channels::childLoadList(): Configs items loaded were incorrect!"
<< std::endl; << std::endl;
return false;
if(*it != NULL)
delete *it;
} }
} }
@ -908,7 +997,8 @@ void p3Channels::processChanReadStatus(RsChannelReadStatus* drs)
if(sit != drs->msgReadStatus.end()){ if(sit != drs->msgReadStatus.end()){
mChannelStatus[chId] = sit->second; mChannelStatus[chId] = sit->second;
drs->msgReadStatus.erase(sit); mChanReadStatus.insert(std::make_pair<std::string, RsChannelReadStatus*>
(chId, drs));
} }
// first pull out the channel id status // first pull out the channel id status
@ -920,8 +1010,30 @@ void p3Channels::processChanReadStatus(RsChannelReadStatus* drs)
} }
std::list<RsItem *> p3Channels::childSaveList() std::list<RsItem *> p3Channels::childSaveList()
{ {
std::list<RsChannelReadStatus* >::iterator lit = mReadStatus.begin();
statMap::iterator sit, mit;
// update or add current channel id status
for(; lit != mReadStatus.end(); lit++)
{
if((sit = mChannelStatus.find((*lit)->channelId)) != mChannelStatus.end())
{
mit = (*lit)->msgReadStatus.find((*lit)->channelId);
if(mit != (*lit)->msgReadStatus.end())
{
mit->second = sit->second;
}
else
{
(*lit)->msgReadStatus[(*lit)->channelId] = sit->second;
}
}
}
return saveList; return saveList;
} }

View File

@ -33,7 +33,8 @@
#include "serialiser/rstlvtypes.h" #include "serialiser/rstlvtypes.h"
#include "serialiser/rschannelitems.h" #include "serialiser/rschannelitems.h"
#define RS_CHAN_STATUS_AUTO_DL 0x0004 #define RS_CHAN_STATUS_MASK 0x000f
#define RS_CHAN_STATUS_AUTO_DL 0x0002
typedef std::map<std::string, uint32_t> statMap; typedef std::map<std::string, uint32_t> statMap;
typedef std::map<std::string, statMap> chanStatMap; typedef std::map<std::string, statMap> chanStatMap;
@ -75,15 +76,14 @@ virtual bool setMessageStatus(const std::string& cId, const std::string& mId, co
virtual bool getMessageStatus(const std::string& cId, const std::string& mId, uint32_t& status); virtual bool getMessageStatus(const std::string& cId, const std::string& mId, uint32_t& status);
virtual bool getMessageCount(const std::string cId, unsigned int &newCount, unsigned int &unreadCount); virtual bool getMessageCount(const std::string cId, unsigned int &newCount, unsigned int &unreadCount);
virtual bool channelSubscribe(std::string cId, bool subscribe, bool autoDl);
virtual bool channelSubscribe(std::string cId, bool subscribe);
virtual bool channelExtraFileHash(std::string path, std::string chId, FileInfo& fInfo); virtual bool channelExtraFileHash(std::string path, std::string chId, FileInfo& fInfo);
virtual bool channelExtraFileRemove(std::string hash, std::string chId); virtual bool channelExtraFileRemove(std::string hash, std::string chId);
virtual bool channelRestoreKeys(std::string chId); virtual bool channelRestoreKeys(std::string chId);
virtual bool channelShareKeys(std::string chId, std::list<std::string>& peers); virtual bool channelShareKeys(std::string chId, std::list<std::string>& peers);
virtual bool channelEditInfo(std::string chId, ChannelInfo &ci); virtual bool channelEditInfo(std::string chId, ChannelInfo &ci);
virtual void getPubKeysAvailableGrpIds(std::list<std::string>& grpIds); virtual void getPubKeysAvailableGrpIds(std::list<std::string>& grpIds);
virtual void channelSetAutoDl(const std::string& chId, bool autoDl); virtual bool channelSetAutoDl(const std::string& chId, bool autoDl);
virtual bool channelGetAutoDl(const std::string& chId, bool& autoDl); virtual bool channelGetAutoDl(const std::string& chId, bool& autoDl);
/***************************************************************************************/ /***************************************************************************************/
@ -112,12 +112,15 @@ virtual std::list<RsItem *> childSaveList();
private: private:
void processChanReadStatus(RsChannelReadStatus* drs); void processChanReadStatus(RsChannelReadStatus* drs);
void addChannelReadStatusEntry(const std::string& cId);
void removeChannelReadStatusEntry(const std::string& cId);
RsFiles *mRsFiles; RsFiles *mRsFiles;
std::string mChannelsDir; std::string mChannelsDir;
std::list<RsItem *> saveList; std::list<RsItem *> saveList;
std::list<RsChannelReadStatus *> mReadStatus; std::list<RsChannelReadStatus *> mReadStatus;
std::map<std::string, RsChannelReadStatus* > mChanReadStatus;
chanStatMap mMsgReadStatus; chanStatMap mMsgReadStatus;
statMap mChannelStatus; statMap mChannelStatus;
}; };

View File

@ -61,7 +61,7 @@
//#define DISTRIB_DEBUG 1 //#define DISTRIB_DEBUG 1
//#define DISTRIB_THREAD_DEBUG 1 //#define DISTRIB_THREAD_DEBUG 1
//#define DISTRIB_DUMMYMSG_DEBUG 1 //#define DISTRIB_DUMMYMSG_DEBUG 1
//#define DISTRIB_HISTORY_DEBUG
RSA *extractPublicKey(RsTlvSecurityKey &key); RSA *extractPublicKey(RsTlvSecurityKey &key);
RSA *extractPrivateKey(RsTlvSecurityKey &key); RSA *extractPrivateKey(RsTlvSecurityKey &key);
@ -209,11 +209,13 @@ int p3GroupDistrib::tick()
#endif #endif
} }
#ifdef ENABLE_CACHE_OPT
if(updateCacheDoc){ if(updateCacheDoc){
std::cerr << "count: " << mCount << std::endl; std::cerr << "count: " << mCount << std::endl;
updateCacheDocument(); updateCacheDocument();
} }
#endif
return 0; return 0;
} }
@ -1068,6 +1070,7 @@ void p3GroupDistrib::loadFileMsgs(const std::string &filename, uint16_t cacheSub
time_t now = time(NULL); time_t now = time(NULL);
bool cache = false; bool cache = false;
#ifdef ENABLE_CACHE_OPT
// if cache id exists in cache table exit // if cache id exists in cache table exit
{ {
RsStackMutex stack(distribMtx); RsStackMutex stack(distribMtx);
@ -1080,6 +1083,7 @@ void p3GroupDistrib::loadFileMsgs(const std::string &filename, uint16_t cacheSub
cache = true; cache = true;
} }
} }
#endif
// link grp to cache id (only one cache id, so doesn't matter if one grp comes out twice // link grp to cache id (only one cache id, so doesn't matter if one grp comes out twice
// with same cache id) // with same cache id)
@ -2617,8 +2621,9 @@ bool p3GroupDistrib::saveList(bool &cleanup, std::list<RsItem *>& saveData)
delete childSer; delete childSer;
// now save hostory doc // now save hostory doc
#ifdef ENABLE_CACHE_OPT
locked_saveHistoryCacheFile(); locked_saveHistoryCacheFile();
#endif
return true; return true;
} }

View File

@ -508,7 +508,7 @@ class p3GroupDistrib: public CacheSource, public CacheStore, public p3Config, pu
std::string publishMsg(RsDistribMsg *msg, bool personalSign); std::string publishMsg(RsDistribMsg *msg, bool personalSign);
/*! /*!
* * note: call back to locked_eventDuplicateMSg is made on execution
* @param grpId id of group to subscribe to * @param grpId id of group to subscribe to
* @param subscribe true to subscribe and vice versa * @param subscribe true to subscribe and vice versa
* @return * @return