1/* 2 * Copyright 2016, Rene Gollent, rene@gollent.com. 3 * Distributed under the terms of the MIT License. 4 */ 5#include "ConnectionConfigHandlerRoster.h" 6 7#include <AutoDeleter.h> 8 9#include "NetworkConnectionConfigHandler.h" 10#include "TargetHostInterfaceInfo.h" 11 12 13/*static*/ ConnectionConfigHandlerRoster* 14 ConnectionConfigHandlerRoster::sDefaultInstance = NULL; 15 16 17ConnectionConfigHandlerRoster::ConnectionConfigHandlerRoster() 18 : 19 fLock("config handler roster lock"), 20 fConfigHandlers(10, true) 21{ 22} 23 24 25ConnectionConfigHandlerRoster::~ConnectionConfigHandlerRoster() 26{ 27} 28 29 30/*static*/ ConnectionConfigHandlerRoster* 31ConnectionConfigHandlerRoster::Default() 32{ 33 return sDefaultInstance; 34} 35 36 37/*static*/ status_t 38ConnectionConfigHandlerRoster::CreateDefault() 39{ 40 if (sDefaultInstance != NULL) 41 return B_OK; 42 43 ConnectionConfigHandlerRoster* roster 44 = new(std::nothrow) ConnectionConfigHandlerRoster; 45 if (roster == NULL) 46 return B_NO_MEMORY; 47 48 ObjectDeleter<ConnectionConfigHandlerRoster> rosterDeleter(roster); 49 50 status_t error = roster->Init(); 51 if (error != B_OK) 52 return error; 53 54 sDefaultInstance = roster; 55 rosterDeleter.Detach(); 56 return B_OK; 57} 58 59 60/*static*/ void 61ConnectionConfigHandlerRoster::DeleteDefault() 62{ 63 ConnectionConfigHandlerRoster* roster = sDefaultInstance; 64 sDefaultInstance = NULL; 65 delete roster; 66} 67 68 69status_t 70ConnectionConfigHandlerRoster::Init() 71{ 72 return _RegisterHandlers(); 73} 74 75 76bool 77ConnectionConfigHandlerRoster::HasHandlerFor(TargetHostInterfaceInfo* info) 78 const 79{ 80 ConnectionConfigHandler* handler = NULL; 81 return _GetHandler(info->Name(), handler); 82} 83 84 85status_t 86ConnectionConfigHandlerRoster::CreateConfigView(TargetHostInterfaceInfo* info, 87 ConnectionConfigView::Listener* listener, 88 ConnectionConfigView*& _view) const 89{ 90 ConnectionConfigHandler* handler = NULL; 91 92 if (!_GetHandler(info->Name(), handler)) 93 return B_NOT_SUPPORTED; 94 95 return handler->CreateView(info, listener, _view); 96} 97 98 99bool 100ConnectionConfigHandlerRoster::_GetHandler(const BString& name, 101 ConnectionConfigHandler*& _handler) const 102{ 103 ConnectionConfigHandler* handler = NULL; 104 for (int32 i = 0; i < fConfigHandlers.CountItems(); i++) { 105 handler = fConfigHandlers.ItemAt(i); 106 if (handler->Name() == name) { 107 _handler = handler; 108 return true; 109 } 110 } 111 112 return false; 113} 114 115 116status_t 117ConnectionConfigHandlerRoster::_RegisterHandlers() 118{ 119 ConnectionConfigHandler* handler = NULL; 120 ObjectDeleter<ConnectionConfigHandler> handlerDeleter; 121 122 #undef REGISTER_HANDLER_INFO 123 #define REGISTER_HANDLER_INFO(type) \ 124 handler = new(std::nothrow) type##ConnectionConfigHandler; \ 125 if (handler == NULL) \ 126 return B_NO_MEMORY; \ 127 handlerDeleter.SetTo(handler); \ 128 if (!fConfigHandlers.AddItem(handler)) \ 129 return B_NO_MEMORY; \ 130 handlerDeleter.Detach(); \ 131 132 REGISTER_HANDLER_INFO(Network) 133 134 return B_OK; 135} 136