1/*
2 * Copyright 2016-2017, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
4 */
5#include "NetworkConnectionConfigView.h"
6
7#include <stdio.h>
8#include <stdlib.h>
9
10#include <LayoutBuilder.h>
11#include <MenuField.h>
12#include <TextControl.h>
13
14#include "Settings.h"
15#include "SettingsDescription.h"
16#include "TargetHostInterfaceInfo.h"
17
18
19enum {
20	MSG_NET_CONFIG_INPUT_CHANGED = 'ncic'
21};
22
23
24static const char* kHostSetting = "hostname";
25static const char* kPortSetting = "port";
26
27
28NetworkConnectionConfigView::NetworkConnectionConfigView()
29	:
30	ConnectionConfigView("NetworkConnectionConfig"),
31	fProtocolField(NULL),
32	fHostInput(NULL),
33	fPortInput(NULL),
34	fSettings(NULL),
35	fHostSetting(NULL),
36	fPortSetting(NULL)
37{
38}
39
40
41NetworkConnectionConfigView::~NetworkConnectionConfigView()
42{
43	if (fSettings != NULL)
44		fSettings->ReleaseReference();
45}
46
47
48void
49NetworkConnectionConfigView::AttachedToWindow()
50{
51	ConnectionConfigView::AttachedToWindow();
52
53	fHostInput->SetTarget(this);
54	fPortInput->SetTarget(this);
55}
56
57
58void
59NetworkConnectionConfigView::MessageReceived(BMessage* message)
60{
61	switch (message->what) {
62		case MSG_NET_CONFIG_INPUT_CHANGED:
63		{
64			fSettings->SetValue(fHostSetting, fHostInput->Text());
65			uint16 port = (uint16)strtoul(fPortInput->Text(), NULL, 10);
66			fSettings->SetValue(fPortSetting, port);
67			NotifyConfigurationChanged(fSettings);
68			break;
69		}
70		default:
71		{
72			ConnectionConfigView::MessageReceived(message);
73			break;
74		}
75	}
76}
77
78
79status_t
80NetworkConnectionConfigView::InitSpecific()
81{
82	SettingsDescription* description
83		= InterfaceInfo()->GetSettingsDescription();
84
85	for (int32 i = 0; i < description->CountSettings(); i++) {
86		Setting* setting = description->SettingAt(i);
87		if (strcmp(setting->ID(), kPortSetting) == 0)
88			fPortSetting = setting;
89		else if (strcmp(setting->ID(), kHostSetting) == 0)
90			fHostSetting = setting;
91	}
92
93	if (fPortSetting == NULL || fHostSetting == NULL)
94		return B_BAD_VALUE;
95
96	fSettings = new Settings(description);
97	fPortInput = new BTextControl("port_input", "Port:", "",
98					new BMessage(MSG_NET_CONFIG_INPUT_CHANGED));
99
100	BLayoutItem* textLayoutItem;
101	BLayoutBuilder::Group<>(this, B_HORIZONTAL)
102		.Add((fHostInput = new BTextControl("host_input", "Host:", "",
103				new BMessage(MSG_NET_CONFIG_INPUT_CHANGED))))
104		.Add(fPortInput->CreateLabelLayoutItem())
105		.Add((textLayoutItem = fPortInput->CreateTextViewLayoutItem()))
106	.End();
107
108	// since port numbers are limited to 5 digits, there's no need for
109	// the port input to expand farther than that. Instead, let the
110	// host field take the extra space.
111	textLayoutItem->SetExplicitMaxSize(BSize(
112			be_plain_font->StringWidth("999999"), B_SIZE_UNSET));
113
114
115	BString buffer;
116	buffer.SetToFormat("%" B_PRIu16, fPortSetting->DefaultValue().ToUInt16());
117	fPortInput->SetText(buffer);
118
119	fHostInput->SetModificationMessage(
120		new BMessage(MSG_NET_CONFIG_INPUT_CHANGED));
121	fPortInput->SetModificationMessage(
122		new BMessage(MSG_NET_CONFIG_INPUT_CHANGED));
123
124	return B_OK;
125}
126
127
128