#include <string.h>
#include <Message.h>
#include <OS.h>
#include <Roster.h>
#include "NetFSServerRoster.h"
#include "NetFSServerRosterDefs.h"
NetFSServerRoster::NetFSServerRoster()
: fServerMessenger()
{
}
NetFSServerRoster::~NetFSServerRoster()
{
}
bool
NetFSServerRoster::IsServerRunning()
{
return (_InitMessenger() == B_OK);
}
status_t
NetFSServerRoster::LaunchServer()
{
status_t error = BRoster().Launch(kNetFSServerSignature);
if (error != B_OK)
return error;
return _InitMessenger();
}
status_t
NetFSServerRoster::TerminateServer(bool force, bigtime_t timeout)
{
team_id team = BRoster().TeamFor(kNetFSServerSignature);
if (team < 0)
return team;
sem_id deathSem = create_sem(0, "netfs server death");
set_sem_owner(deathSem, team);
status_t error = B_OK;
if (force) {
kill_team(team);
error = acquire_sem_etc(deathSem, 1, B_RELATIVE_TIMEOUT, timeout);
} else {
BMessenger messenger(NULL, team);
if (messenger.IsValid()) {
messenger.SendMessage(B_QUIT_REQUESTED);
error = acquire_sem_etc(deathSem, 1, B_RELATIVE_TIMEOUT, timeout);
} else
error = B_ERROR;
}
delete_sem(deathSem);
return (error == B_BAD_SEM_ID ? B_OK : B_ERROR);
}
status_t
NetFSServerRoster::SaveServerSettings()
{
BMessage request(NETFS_REQUEST_SAVE_SETTINGS);
return _SendRequest(&request);
}
status_t
NetFSServerRoster::AddUser(const char* user, const char* password)
{
if (!user || strlen(user) < 1)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_ADD_USER);
if (request.AddString("user", user) != B_OK
|| (password && request.AddString("password", password) != B_OK)) {
return B_ERROR;
}
return _SendRequest(&request);
}
status_t
NetFSServerRoster::RemoveUser(const char* user)
{
if (!user || strlen(user) < 1)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_REMOVE_USER);
if (request.AddString("user", user) != B_OK)
return B_ERROR;
return _SendRequest(&request);
}
status_t
NetFSServerRoster::GetUsers(BMessage* users)
{
if (!users)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_GET_USERS);
BMessage reply;
status_t error = _SendRequest(&request, &reply);
if (error != B_OK)
return error;
if (reply.FindMessage("users", users) != B_OK)
return B_ERROR;
return B_OK;
}
status_t
NetFSServerRoster::GetUserStatistics(const char* user, BMessage* statistics)
{
if (!user || strlen(user) < 1 || !statistics)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_GET_USER_STATISTICS);
if (request.AddString("user", user) != B_OK)
return B_ERROR;
BMessage reply;
status_t error = _SendRequest(&request, &reply);
if (error != B_OK)
return error;
if (reply.FindMessage("statistics", statistics) != B_OK)
return B_ERROR;
return B_OK;
}
status_t
NetFSServerRoster::AddShare(const char* share, const char* path)
{
if (!share || strlen(share) < 1 || !path || strlen(path) < 1)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_ADD_SHARE);
if (request.AddString("share", share) != B_OK
|| request.AddString("path", path) != B_OK) {
return B_ERROR;
}
return _SendRequest(&request);
}
status_t
NetFSServerRoster::RemoveShare(const char* share)
{
if (!share || strlen(share) < 1)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_REMOVE_SHARE);
if (request.AddString("share", share) != B_OK)
return B_ERROR;
return _SendRequest(&request);
}
status_t
NetFSServerRoster::GetShares(BMessage* shares)
{
if (!shares)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_GET_SHARES);
BMessage reply;
status_t error = _SendRequest(&request, &reply);
if (error != B_OK)
return error;
if (reply.FindMessage("shares", shares) != B_OK)
return B_ERROR;
return B_OK;
}
status_t
NetFSServerRoster::GetShareUsers(const char* share, BMessage* users)
{
if (!share || strlen(share) < 1 || !users)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_GET_SHARE_USERS);
if (request.AddString("share", share) != B_OK)
return B_ERROR;
BMessage reply;
status_t error = _SendRequest(&request, &reply);
if (error != B_OK)
return error;
if (reply.FindMessage("users", users) != B_OK)
return B_ERROR;
return B_OK;
}
status_t
NetFSServerRoster::GetShareStatistics(const char* share, BMessage* statistics)
{
if (!share || strlen(share) < 1 || !statistics)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_GET_SHARE_STATISTICS);
if (request.AddString("share", share) != B_OK)
return B_ERROR;
BMessage reply;
status_t error = _SendRequest(&request, &reply);
if (error != B_OK)
return error;
if (reply.FindMessage("statistics", statistics) != B_OK)
return B_ERROR;
return B_OK;
}
status_t
NetFSServerRoster::SetUserPermissions(const char* share, const char* user,
uint32 permissions)
{
if (!share || strlen(share) < 1 || !user || strlen(user) < 1)
return B_BAD_VALUE;
BMessage request(NETFS_REQUEST_SET_USER_PERMISSIONS);
if (request.AddString("share", share) != B_OK
|| request.AddString("user", user) != B_OK
|| request.AddInt32("permissions", (int32)permissions)) {
return B_ERROR;
}
return _SendRequest(&request);
}
status_t
NetFSServerRoster::GetUserPermissions(const char* share, const char* user,
uint32* permissions)
{
if (!share || strlen(share) < 1 || !user || strlen(user) < 1
|| !permissions) {
return B_BAD_VALUE;
}
BMessage request(NETFS_REQUEST_GET_USER_PERMISSIONS);
if (request.AddString("share", share) != B_OK
|| request.AddString("user", user) != B_OK) {
return B_ERROR;
}
BMessage reply;
status_t error = _SendRequest(&request, &reply);
if (error != B_OK)
return error;
if (reply.FindInt32("permissions", (int32*)permissions) != B_OK)
return B_ERROR;
return B_OK;
}
status_t
NetFSServerRoster::_InitMessenger()
{
if (fServerMessenger.IsValid())
return B_OK;
BMessenger appMessenger(kNetFSServerSignature);
if (!appMessenger.IsValid())
return B_NO_INIT;
BMessage request(NETFS_REQUEST_GET_MESSENGER);
BMessage reply;
if (appMessenger.SendMessage(&request, &reply) != B_OK)
return B_NO_INIT;
status_t error;
if (reply.FindInt32("error", &error) != B_OK)
return B_ERROR;
if (error != B_OK)
return error;
if (reply.FindMessenger("messenger", &fServerMessenger) != B_OK)
return B_NO_INIT;
return (fServerMessenger.IsValid() ? B_OK : B_NO_INIT);
}
status_t
NetFSServerRoster::_SendRequest(BMessage* request, BMessage* reply)
{
BMessage stackReply;
if (!reply)
reply = &stackReply;
status_t error = _InitMessenger();
if (error != B_OK)
return error;
error = fServerMessenger.SendMessage(request, reply);
if (error != B_OK)
return error;
status_t result;
if (reply->FindInt32("error", &result) != B_OK)
return B_ERROR;
return result;
}