RetroShare/libresapi/src/api/ServiceControlHandler.cpp

89 lines
2.4 KiB
C++

#include "ServiceControlHandler.h"
#include "retroshare/rsservicecontrol.h"
#include "Operators.h"
namespace resource_api
{
// maybe move to another place later
// need more generic operators for list, vector, map
template<class T>
void setToStream(StreamBase& stream, std::set<T>& set)
{
if(stream.serialise())
{
for(typename std::set<T>::iterator sit = set.begin(); sit != set.end(); sit++)
{
T item = *sit;
stream << makeValueReference(item);
}
}
else
{
while(stream.hasMore())
{
T item;
stream << makeValueReference(item);
set.insert(item);
}
}
}
void servicePermissionToStream(StreamBase& stream, RsServicePermissions& perm)
{
stream << makeKeyValueReference("service_id", perm.mServiceId)
<< makeKeyValueReference("service_name", perm.mServiceName)
<< makeKeyValueReference("default_allowed", perm.mDefaultAllowed)
;
setToStream(stream.getStreamToMember("peers_allowed"), perm.mPeersAllowed);
setToStream(stream.getStreamToMember("peers_denied"), perm.mPeersDenied);
}
ServiceControlHandler::ServiceControlHandler(RsServiceControl* control):
mRsServiceControl(control)
{
addResourceHandler("*", this, &ServiceControlHandler::handleWildcard);
}
void ServiceControlHandler::handleWildcard(Request &req, Response &resp)
{
bool ok = false;
if(!req.mPath.empty())
{
}
else
{
// no more path element
if(req.isGet())
{
// list all peers
ok = true;
RsPeerServiceInfo psi;
ok &= mRsServiceControl->getOwnServices(psi);
for(std::map<uint32_t, RsServiceInfo>::iterator mit = psi.mServiceList.begin(); mit != psi.mServiceList.end(); mit++)
{
RsServicePermissions perms;
ok &= mRsServiceControl->getServicePermissions(mit->first, perms);
if(ok)
{
servicePermissionToStream(resp.mDataStream.getStreamToMember(), perms);
}
}
}
else if(req.isPut())
{
}
}
if(ok)
{
resp.setOk();
}
else
{
resp.setFail();
}
}
} // namespace resource_api