xref: /haiku/src/add-ons/network_settings/hostname/HostnameView.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2  * Copyright 2019 Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *      Adrien Destugues, pulkomandy@pulkomandy.tk
7  *		Rob Gill, <rrobgill@protonmail.com>
8  */
9 
10 
11 #include "HostnameView.h"
12 
13 #include <stdio.h>
14 #include <string.h>
15 
16 #include <Box.h>
17 #include <Button.h>
18 #include <Catalog.h>
19 #include <ControlLook.h>
20 #include <LayoutBuilder.h>
21 #include <SeparatorView.h>
22 #include <StringView.h>
23 
24 
25 static const int32 kMsgApply = 'aply';
26 
27 
28 #undef B_TRANSLATION_CONTEXT
29 #define B_TRANSLATION_CONTEXT "HostnameView"
30 
31 
32 HostnameView::HostnameView(BNetworkSettingsItem* item)
33 	:
34 	BView("hostname", 0),
35 	fItem(item)
36 {
37 	BStringView* titleView = new BStringView("title",
38 		B_TRANSLATE("Hostname settings"));
39 	titleView->SetFont(be_bold_font);
40 	titleView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
41 
42 	fHostname = new BTextControl(B_TRANSLATE("Hostname:"), "", NULL);
43 	fApplyButton = new BButton(B_TRANSLATE("Apply"), new BMessage(kMsgApply));
44 
45 	BLayoutBuilder::Group<>(this, B_VERTICAL)
46 		.Add(titleView)
47 		.Add(fHostname)
48 		.AddGlue()
49 		.AddGroup(B_HORIZONTAL)
50 			.AddGlue()
51 			.Add(fApplyButton);
52 
53 	_LoadHostname();
54 }
55 
56 
57 HostnameView::~HostnameView()
58 {
59 }
60 
61 status_t
62 HostnameView::Revert()
63 {
64 	return B_OK;
65 }
66 
67 bool
68 HostnameView::IsRevertable() const
69 {
70 	return false;
71 }
72 
73 
74 void
75 HostnameView::AttachedToWindow()
76 {
77 	fApplyButton->SetTarget(this);
78 }
79 
80 
81 void
82 HostnameView::MessageReceived(BMessage* message)
83 {
84 	switch (message->what) {
85 		case kMsgApply:
86 			if (_SaveHostname() == B_OK)
87 				fItem->NotifySettingsUpdated();
88 			break;
89 
90 		default:
91 			BView::MessageReceived(message);
92 			break;
93 	}
94 }
95 
96 
97 status_t
98 HostnameView::_LoadHostname()
99 {
100 	BString fHostnameString;
101 	char hostname[MAXHOSTNAMELEN];
102 
103 	if (gethostname(hostname, MAXHOSTNAMELEN) == 0) {
104 
105 		fHostnameString.SetTo(hostname, MAXHOSTNAMELEN);
106 		fHostname->SetText(fHostnameString);
107 
108 		return B_OK;
109 	}
110 
111 	return B_ERROR;
112 }
113 
114 
115 status_t
116 HostnameView::_SaveHostname()
117 {
118 	BString hostnamestring("");
119 
120 	size_t hostnamelen(strlen(fHostname->Text()));
121 
122 	if (hostnamelen == 0)
123 		return B_ERROR;
124 
125 	if (hostnamelen > MAXHOSTNAMELEN) {
126 		hostnamestring.Truncate(MAXHOSTNAMELEN);
127 		hostnamelen = MAXHOSTNAMELEN;
128 	}
129 
130 	hostnamestring << fHostname->Text();
131 
132 	if (sethostname(hostnamestring, hostnamelen) == 0)
133 		return B_OK;
134 
135 	return B_ERROR;
136 }
137