1// ExtendedServerInfo.cpp
2
3#include "ExtendedServerInfo.h"
4#include "ServerInfo.h"
5
6// constructor
7ExtendedShareInfo::ExtendedShareInfo()
8	:
9	BReferenceable(),
10	fShareName()
11{
12}
13
14// SetTo
15status_t
16ExtendedShareInfo::SetTo(const ShareInfo* shareInfo)
17{
18	if (!shareInfo)
19		return B_BAD_VALUE;
20	if (!fShareName.SetTo(shareInfo->GetShareName()))
21		return B_NO_MEMORY;
22	return B_OK;
23}
24
25// GetShareName
26const char*
27ExtendedShareInfo::GetShareName() const
28{
29	return fShareName.GetString();
30}
31
32
33// #pragma mark -
34
35// constructor
36ExtendedServerInfo::ExtendedServerInfo(const NetAddress& address)
37	:
38	BReferenceable(),
39	fAddress(address),
40	fState(0)
41{
42}
43
44// destructor
45ExtendedServerInfo::~ExtendedServerInfo()
46{
47	int32 count = CountShares();
48	for (int32 i = 0; i < count; i++)
49		ShareInfoAt(i)->ReleaseReference();
50}
51
52// GetAddress
53const NetAddress&
54ExtendedServerInfo::GetAddress() const
55{
56	return fAddress;
57}
58
59// GetServerName
60const char*
61ExtendedServerInfo::GetServerName() const
62{
63	return fServerName.GetString();
64}
65
66// GetConnectionMethod
67const char*
68ExtendedServerInfo::GetConnectionMethod() const
69{
70	return fConnectionMethod.GetString();
71}
72
73// CountShares
74int32
75ExtendedServerInfo::CountShares() const
76{
77	return fShareInfos.Count();
78}
79
80// ShareInfoAt
81ExtendedShareInfo*
82ExtendedServerInfo::ShareInfoAt(int32 index) const
83{
84	if (index < 0 || index >= fShareInfos.Count())
85		return NULL;
86	return fShareInfos.ElementAt(index);
87}
88
89// GetShareInfo
90ExtendedShareInfo*
91ExtendedServerInfo::GetShareInfo(const char* name)
92{
93	for (int32 i = 0; ExtendedShareInfo* shareInfo = ShareInfoAt(i); i++) {
94		if (strcmp(shareInfo->GetShareName(), name) == 0)
95			return shareInfo;
96	}
97
98	return NULL;
99}
100
101// SetTo
102status_t
103ExtendedServerInfo::SetTo(ServerInfo* serverInfo)
104{
105	if (!serverInfo)
106		return B_BAD_VALUE;
107	// set name and connection method
108	const char* name = serverInfo->GetServerName();
109	HashString addressString;
110	if (!name || strlen(name) == 0) {
111		status_t error = fAddress.GetString(&addressString, false);
112		if (error != B_OK)
113			return error;
114		name = addressString.GetString();
115	}
116	if (!fServerName.SetTo(name)
117		|| !fConnectionMethod.SetTo(serverInfo->GetConnectionMethod())) {
118		return B_NO_MEMORY;
119	}
120	// add the shares
121	int32 shareCount = serverInfo->CountShares();
122	for (int32 i = 0; i < shareCount; i++) {
123		const ShareInfo& shareInfo = serverInfo->ShareInfoAt(i);
124		status_t error = _AddShare(&shareInfo);
125		if (error != B_OK)
126			return error;
127	}
128	return B_OK;
129}
130
131// SetState
132void
133ExtendedServerInfo::SetState(uint32 state)
134{
135	fState = state;
136}
137
138// GetState
139uint32
140ExtendedServerInfo::GetState() const
141{
142	return fState;
143}
144
145// _AddShare
146status_t
147ExtendedServerInfo::_AddShare(const ShareInfo* info)
148{
149	ExtendedShareInfo* extendedInfo = new(std::nothrow) ExtendedShareInfo;
150	if (!extendedInfo)
151		return B_NO_MEMORY;
152	status_t error = extendedInfo->SetTo(info);
153	if (error != B_OK) {
154		delete extendedInfo;
155		return error;
156	}
157	error = fShareInfos.PushBack(extendedInfo);
158	if (error != B_OK) {
159		delete extendedInfo;
160		return error;
161	}
162	return B_OK;
163}
164
165