#ifndef NET_FS_SERVER_H
#define NET_FS_SERVER_H
#include <Application.h>
#include <List.h>
#include "ClientConnection.h"
#include "ConnectionListenerFactory.h"
#include "Locker.h"
class BPath;
class Connection;
class ConnectionListener;
class SecurityContext;
class ServerInfo;
class NetFSServer : public BApplication, private ClientConnectionListener {
public:
NetFSServer(bool useBroadcasting);
~NetFSServer();
status_t Init();
virtual thread_id Run();
virtual void MessageReceived(BMessage* message);
VolumeManager* GetVolumeManager() const;
SecurityContext* GetSecurityContext() const;
private:
class ConnectionInitializer;
friend class ConnectionInitializer;
class ServerInfoSender;
status_t _AddClientConnection(
ClientConnection* connection);
virtual void ClientConnectionClosed(
ClientConnection* connection,
bool broken);
status_t _LoadSecurityContext(
SecurityContext** securityContext);
status_t _InitSettings();
status_t _LoadSettings();
status_t _SaveSettings();
status_t _GetSettingsDirPath(BPath* path,
bool create = false);
status_t _GetSettingsFilePath(BPath* path,
bool createDir = false);
status_t _InitServerInfoConnectionListener();
void _ExitServerInfoConnectionListener();
static int32 _ConnectionListenerEntry(void* data);
int32 _ConnectionListener();
static int32 _ConnectionDeleterEntry(void* data);
int32 _ConnectionDeleter();
static int32 _BroadcasterEntry(void* data);
int32 _Broadcaster();
static int32 _ServerInfoConnectionListenerEntry(void* data);
int32 _ServerInfoConnectionListener();
status_t _GetServerInfo(ServerInfo& serverInfo);
void _ServerInfoUpdated();
void _SendReply(BMessage* message, BMessage* reply,
status_t error = B_OK);
void _SendReply(BMessage* message,
status_t error = B_OK);
private:
SecurityContext* fSecurityContext;
ConnectionListenerFactory fConnectionListenerFactory;
ConnectionListener* fConnectionListener;
Locker fLock;
BList fClientConnections;
VolumeManager* fVolumeManager;
BList fClosedConnections;
sem_id fClosedConnectionsSemaphore;
thread_id fConnectionListenerThread;
thread_id fConnectionDeleter;
thread_id fBroadcaster;
int32 fBroadcastingSocket;
sem_id fBroadcasterSemaphore;
thread_id fServerInfoConnectionListener;
int32 fServerInfoConnectionListenerSocket;
int32 fServerInfoUpdated;
bool fUseBroadcasting;
volatile bool fTerminating;
};
#endif