// ServerConnectionProvider.cpp #include "ServerConnectionProvider.h" #include #include "ExtendedServerInfo.h" #include "ServerConnection.h" // constructor ServerConnectionProvider::ServerConnectionProvider(VolumeManager* volumeManager, ExtendedServerInfo* serverInfo, vnode_id connectionBrokenTarget) : BReferenceable(), fLock("server connection provider"), fVolumeManager(volumeManager), fServerInfo(serverInfo), fServerConnection(NULL), fConnectionBrokenTarget(connectionBrokenTarget) { if (fServerInfo) fServerInfo->AcquireReference(); } // destructor ServerConnectionProvider::~ServerConnectionProvider() { AutoLocker _(fLock); if (fServerConnection) { fServerConnection->Close(); fServerConnection->ReleaseReference(); } if (fServerInfo) fServerInfo->ReleaseReference(); } // Init status_t ServerConnectionProvider::Init() { return B_OK; } // GetServerConnection status_t ServerConnectionProvider::GetServerConnection( ServerConnection** serverConnection) { AutoLocker _(fLock); // if there is no server connection yet, create one if (!fServerConnection) { fServerConnection = new(std::nothrow) ServerConnection(fVolumeManager, fServerInfo); if (!fServerConnection) return B_NO_MEMORY; status_t error = fServerConnection->Init(fConnectionBrokenTarget); if (error != B_OK) return error; } if (!fServerConnection->IsConnected()) return B_ERROR; fServerConnection->AcquireReference(); *serverConnection = fServerConnection; return B_OK; } // GetExistingServerConnection ServerConnection* ServerConnectionProvider::GetExistingServerConnection() { AutoLocker _(fLock); // if there is no server connection yet, create one if (!fServerConnection || !fServerConnection->IsConnected()) return NULL; fServerConnection->AcquireReference(); return fServerConnection; } // CloseServerConnection void ServerConnectionProvider::CloseServerConnection() { AutoLocker _(fLock); if (fServerConnection) fServerConnection->Close(); }