xref: /haiku/src/apps/debugger/user_interface/gui/connection_config/ConnectionConfigHandlerRoster.cpp (revision eede6646dd548b5fe56d9305f1d6fb2b650e26c3)
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 
ConnectionConfigHandlerRoster()17 ConnectionConfigHandlerRoster::ConnectionConfigHandlerRoster()
18 	:
19 	fLock("config handler roster lock"),
20 	fConfigHandlers(10, true)
21 {
22 }
23 
24 
~ConnectionConfigHandlerRoster()25 ConnectionConfigHandlerRoster::~ConnectionConfigHandlerRoster()
26 {
27 }
28 
29 
30 /*static*/ ConnectionConfigHandlerRoster*
Default()31 ConnectionConfigHandlerRoster::Default()
32 {
33 	return sDefaultInstance;
34 }
35 
36 
37 /*static*/ status_t
CreateDefault()38 ConnectionConfigHandlerRoster::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
DeleteDefault()61 ConnectionConfigHandlerRoster::DeleteDefault()
62 {
63 	ConnectionConfigHandlerRoster* roster = sDefaultInstance;
64 	sDefaultInstance = NULL;
65 	delete roster;
66 }
67 
68 
69 status_t
Init()70 ConnectionConfigHandlerRoster::Init()
71 {
72 	return _RegisterHandlers();
73 }
74 
75 
76 bool
HasHandlerFor(TargetHostInterfaceInfo * info) const77 ConnectionConfigHandlerRoster::HasHandlerFor(TargetHostInterfaceInfo* info)
78 	const
79 {
80 	ConnectionConfigHandler* handler = NULL;
81 	return _GetHandler(info->Name(), handler);
82 }
83 
84 
85 status_t
CreateConfigView(TargetHostInterfaceInfo * info,ConnectionConfigView::Listener * listener,ConnectionConfigView * & _view) const86 ConnectionConfigHandlerRoster::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 
99 bool
_GetHandler(const BString & name,ConnectionConfigHandler * & _handler) const100 ConnectionConfigHandlerRoster::_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 
116 status_t
_RegisterHandlers()117 ConnectionConfigHandlerRoster::_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