1// ServerConnectionProvider.cpp 2 3#include "ServerConnectionProvider.h" 4 5#include <AutoLocker.h> 6 7#include "ExtendedServerInfo.h" 8#include "ServerConnection.h" 9 10// constructor 11ServerConnectionProvider::ServerConnectionProvider(VolumeManager* volumeManager, 12 ExtendedServerInfo* serverInfo, 13 vnode_id connectionBrokenTarget) 14 : 15 BReferenceable(), 16 fLock("server connection provider"), 17 fVolumeManager(volumeManager), 18 fServerInfo(serverInfo), 19 fServerConnection(NULL), 20 fConnectionBrokenTarget(connectionBrokenTarget) 21{ 22 if (fServerInfo) 23 fServerInfo->AcquireReference(); 24} 25 26// destructor 27ServerConnectionProvider::~ServerConnectionProvider() 28{ 29 AutoLocker<Locker> _(fLock); 30 if (fServerConnection) { 31 fServerConnection->Close(); 32 fServerConnection->ReleaseReference(); 33 } 34 35 if (fServerInfo) 36 fServerInfo->ReleaseReference(); 37} 38 39// Init 40status_t 41ServerConnectionProvider::Init() 42{ 43 return B_OK; 44} 45 46// GetServerConnection 47status_t 48ServerConnectionProvider::GetServerConnection( 49 ServerConnection** serverConnection) 50{ 51 AutoLocker<Locker> _(fLock); 52 53 // if there is no server connection yet, create one 54 if (!fServerConnection) { 55 fServerConnection = new(std::nothrow) ServerConnection(fVolumeManager, 56 fServerInfo); 57 if (!fServerConnection) 58 return B_NO_MEMORY; 59 status_t error = fServerConnection->Init(fConnectionBrokenTarget); 60 if (error != B_OK) 61 return error; 62 } 63 64 if (!fServerConnection->IsConnected()) 65 return B_ERROR; 66 67 fServerConnection->AcquireReference(); 68 *serverConnection = fServerConnection; 69 return B_OK; 70} 71 72// GetExistingServerConnection 73ServerConnection* 74ServerConnectionProvider::GetExistingServerConnection() 75{ 76 AutoLocker<Locker> _(fLock); 77 78 // if there is no server connection yet, create one 79 if (!fServerConnection || !fServerConnection->IsConnected()) 80 return NULL; 81 82 fServerConnection->AcquireReference(); 83 return fServerConnection; 84} 85 86// CloseServerConnection 87void 88ServerConnectionProvider::CloseServerConnection() 89{ 90 AutoLocker<Locker> _(fLock); 91 if (fServerConnection) 92 fServerConnection->Close(); 93} 94 95