added choice for default auto-download directory per channel.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6376 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2013-05-23 21:47:50 +00:00
parent 2986e81f7e
commit c2fa746991
7 changed files with 280 additions and 11 deletions

View file

@ -85,7 +85,23 @@ void RsChannelReadStatus::clear()
return;
}
std::ostream& RsChannelDestDirConfigItem::print(std::ostream &out, uint16_t indent = 0)
{
printRsItemBase(out, "RsChannelDestDirConfigItem", indent);
uint16_t int_Indent = indent + 2;
RsDistribChildConfig::print(out, int_Indent);
for(uint32_t i=0;i<dest_dirs.size();++i)
{
printIndent(out, int_Indent); out << "channel id : " << dest_dirs[i].first ;
out << ". Dir = " << dest_dirs[i].second << std::endl;
}
printRsItemEnd(out, "RsChannelDestDirConfigItem", indent);
return out;
}
std::ostream& RsChannelReadStatus::print(std::ostream &out, uint16_t indent = 0)
{
@ -257,6 +273,25 @@ RsChannelMsg *RsChannelSerialiser::deserialiseMsg(void *data, uint32_t *pktsize)
}
uint32_t RsChannelSerialiser::sizeDestDirConfig(RsChannelDestDirConfigItem *item)
{
uint32_t s = 8; /* header */
/* RsDistribChildConfig stuff */
s += 4; /* save_type */
/* RsChannelReadStatus stuff */
s += 4; /* size */
for(uint32_t i=0;i<item->dest_dirs.size();++i)
{
s += GetTlvStringSize(item->dest_dirs[i].first) ;
s += GetTlvStringSize(item->dest_dirs[i].second) ;
}
return s;
}
uint32_t RsChannelSerialiser::sizeReadStatus(RsChannelReadStatus *item)
{
uint32_t s = 8; /* header */
@ -279,6 +314,54 @@ uint32_t RsChannelSerialiser::sizeReadStatus(RsChannelReadStatus *item)
return s;
}
/* serialise the data to the buffer */
bool RsChannelSerialiser::serialiseDestDirConfig(RsChannelDestDirConfigItem *item, void *data, uint32_t *pktsize)
{
uint32_t tlvsize = sizeDestDirConfig(item);
uint32_t offset = 0;
if (*pktsize < tlvsize)
return false; /* not enough space */
*pktsize = tlvsize;
bool ok = true;
ok &= setRsItemHeader(data, tlvsize, item->PacketId(), tlvsize);
#ifdef RSSERIAL_DEBUG
std::cerr << "RsChannelSerialiser::serialiseDestDirConfig() Header: " << ok << std::endl;
std::cerr << "RsChannelSerialiser::serialiseDestDirConfig() Size: " << tlvsize << std::endl;
#endif
/* skip the header */
offset += 8;
/* RsDistribMsg first */
ok &= setRawUInt32(data, tlvsize, &offset, item->save_type);
#ifdef RSSERIAL_DEBUG
std::cerr << "RsChannelSerialiser::serialiseDestDirConfig() save_type: " << ok << std::endl;
#endif
ok &= setRawUInt32(data, tlvsize, &offset, item->dest_dirs.size()); /* value */
for(uint32_t i=0;i<item->dest_dirs.size();++i)
{
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_GROUPID, item->dest_dirs[i].first) ;
ok &= SetTlvString(data, tlvsize, &offset, TLV_TYPE_STR_PATH, item->dest_dirs[i].second) ;
}
#ifdef RSSERIAL_DEBUG
std::cerr << "RsChannelSerialiser::serialiseDestDirConfig() msgReadStatus: " << ok << std::endl;
#endif
if (offset != tlvsize)
{
ok = false;
std::cerr << "RsChannelSerialiser::serialiseDestDirConfig() Size Error! " << std::endl;
}
return ok;
}
/* serialise the data to the buffer */
bool RsChannelSerialiser::serialiseReadStatus(RsChannelReadStatus *item, void *data, uint32_t *pktsize)
{
@ -337,7 +420,63 @@ bool RsChannelSerialiser::serialiseReadStatus(RsChannelReadStatus *item, voi
return ok;
}
RsChannelDestDirConfigItem *RsChannelSerialiser::deserialiseDestDirConfig(void *data, uint32_t *pktsize)
{
/* get the type and size */
uint32_t rstype = getRsItemId(data);
uint32_t rssize = getRsItemSize(data);
uint32_t offset = 0;
if ((RS_PKT_VERSION_SERVICE != getRsItemVersion(rstype)) || (RS_SERVICE_TYPE_CHANNEL != getRsItemService(rstype)) || (RS_PKT_SUBTYPE_CHANNEL_DEST_DIR != getRsItemSubType(rstype)))
return NULL; /* wrong type */
if (*pktsize < rssize) /* check size */
return NULL; /* not enough data */
/* set the packet length */
*pktsize = rssize;
bool ok = true;
/* ready to load */
RsChannelDestDirConfigItem *item = new RsChannelDestDirConfigItem();
item->clear();
/* skip the header */
offset += 8;
/* RsDistribMsg first */
ok &= getRawUInt32(data, rssize, &offset, &(item->save_type));
uint32_t size ;
ok &= getRawUInt32(data, rssize, &offset, &size) ;
for(uint32_t i=0;i<size;++i)
{
std::string chid, path ;
ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_GROUPID, chid) ;
ok &= GetTlvString(data, rssize, &offset, TLV_TYPE_STR_PATH , path) ;
item->dest_dirs.push_back(std::pair<std::string,std::string>(chid,path)) ;
}
if(offset != rssize)
{
ok = false;
std::cerr << "RsChannelSerialiser::deserialiseDestDirConfig() Size Error! " << std::endl;
}
if (!ok)
{
delete item;
return NULL;
}
return item;
}
RsChannelReadStatus *RsChannelSerialiser::deserialiseReadStatus(void *data, uint32_t *pktsize)
{
@ -413,6 +552,7 @@ uint32_t RsChannelSerialiser::size(RsItem *item)
{
RsChannelMsg* dcm;
RsChannelReadStatus* drs;
RsChannelDestDirConfigItem* dd;
if( NULL != ( dcm = dynamic_cast<RsChannelMsg*>(item)))
{
@ -422,6 +562,10 @@ uint32_t RsChannelSerialiser::size(RsItem *item)
{
return sizeReadStatus(drs);
}
else if(NULL != (dd = dynamic_cast<RsChannelDestDirConfigItem* >(item)))
{
return sizeDestDirConfig(dd);
}
return false;
}
@ -430,6 +574,7 @@ bool RsChannelSerialiser::serialise(RsItem *item, void *data, uint32_t *pkts
{
RsChannelMsg* dcm;
RsChannelReadStatus* drs;
RsChannelDestDirConfigItem* dd;
if( NULL != ( dcm = dynamic_cast<RsChannelMsg*>(item)))
{
@ -439,12 +584,19 @@ bool RsChannelSerialiser::serialise(RsItem *item, void *data, uint32_t *pkts
{
return serialiseReadStatus(drs, data, pktsize);
}
else if(NULL != (dd = dynamic_cast<RsChannelDestDirConfigItem* >(item)))
{
return serialiseDestDirConfig(dd, data, pktsize);
}
return false;
}
RsItem *RsChannelSerialiser::deserialise(void *data, uint32_t *pktsize)
{
if(data == NULL)
return NULL ;
/* get the type and size */
uint32_t rstype = getRsItemId(data);
@ -460,6 +612,8 @@ RsItem *RsChannelSerialiser::deserialise(void *data, uint32_t *pktsize)
return deserialiseMsg(data, pktsize);
case RS_PKT_SUBTYPE_CHANNEL_READ_STATUS:
return deserialiseReadStatus(data, pktsize);
case RS_PKT_SUBTYPE_CHANNEL_DEST_DIR:
return deserialiseDestDirConfig(data, pktsize);
default:
return NULL;
}

View file

@ -37,6 +37,7 @@
const uint8_t RS_PKT_SUBTYPE_CHANNEL_MSG = 0x01;
const uint8_t RS_PKT_SUBTYPE_CHANNEL_READ_STATUS = 0x02;
const uint8_t RS_PKT_SUBTYPE_CHANNEL_DEST_DIR = 0x03;
/**************************************************************************/
@ -85,8 +86,25 @@ public:
/// a map which contains the read for messages within a forum
std::map<std::string, uint32_t> msgReadStatus;
std::string destination_directory ;
};
/*!
* This is used to store the destination directories of each channel
*/
class RsChannelDestDirConfigItem : public RsDistribChildConfig
{
public:
RsChannelDestDirConfigItem()
: RsDistribChildConfig(RS_SERVICE_TYPE_CHANNEL, RS_PKT_SUBTYPE_CHANNEL_DEST_DIR)
{ return; }
virtual ~RsChannelDestDirConfigItem() {}
virtual void clear() { dest_dirs.clear() ; }
virtual std::ostream& print(std::ostream &out, uint16_t indent);
std::vector<std::pair<std::string, std::string> > dest_dirs;
};
class RsChannelSerialiser: public RsSerialType
{
public:
@ -111,6 +129,9 @@ virtual uint32_t sizeReadStatus(RsChannelReadStatus* );
virtual bool serialiseReadStatus(RsChannelReadStatus* item, void* data, uint32_t *size);
virtual RsChannelReadStatus *deserialiseReadStatus(void* data, uint32_t *size);
virtual uint32_t sizeDestDirConfig(RsChannelDestDirConfigItem* );
virtual bool serialiseDestDirConfig(RsChannelDestDirConfigItem* item, void* data, uint32_t *size);
virtual RsChannelDestDirConfigItem *deserialiseDestDirConfig(void* data, uint32_t *size);
};
/**************************************************************************/