Just noticed that PPPoEAddon stuff was not added to the repository.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6967 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Waldemar Kornewald
2004-03-14 13:28:58 +00:00
parent d078d982ae
commit a387bccab2
2 changed files with 458 additions and 0 deletions
@@ -0,0 +1,362 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2003-2004 Waldemar Kornewald, [email protected]
//-----------------------------------------------------------------------
// PPPoEAddon saves the loaded settings.
// PPPoEView saves the current settings.
//-----------------------------------------------------------------------
#include "PPPoEAddon.h"
#include "MessageDriverSettingsUtils.h"
#include <Box.h>
#include <Button.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <Messenger.h>
#include <PopUpMenu.h>
#include <StringView.h>
#include <Window.h>
#include <PPPDefs.h>
#include <PPPoE.h>
// from PPPoE addon
#define MSG_SHOW_SERVICE_WINDOW 'SHSW'
#define MSG_CHANGE_SERVICE 'SELD'
#define MSG_RESET_SERVICE 'SELA'
static const char kFriendlyName[] = "DSL, Cable, etc.";
static const char kTechnicalName[] = "PPPoE";
static const char kKernelModuleName[] = "pppoe";
PPPoEAddon::PPPoEAddon(BMessage *addons)
: DialUpAddon(addons),
fSettings(NULL),
fProfile(NULL),
fPPPoEView(NULL)
{
fHeight = 20 // interface name control
+ 25 // service button
+ 5; // space between controls
}
PPPoEAddon::~PPPoEAddon()
{
}
const char*
PPPoEAddon::FriendlyName() const
{
return kFriendlyName;
}
const char*
PPPoEAddon::TechnicalName() const
{
return kTechnicalName;
}
const char*
PPPoEAddon::KernelModuleName() const
{
return kKernelModuleName;
}
bool
PPPoEAddon::LoadSettings(BMessage *settings, BMessage *profile, bool isNew)
{
fIsNew = isNew;
fInterfaceName = fACName = fServiceName = "";
fSettings = settings;
fProfile = profile;
if(!settings || !profile || isNew) {
if(fPPPoEView)
fPPPoEView->Reload();
return true;
}
BMessage device;
int32 deviceIndex = 0;
if(!FindMessageParameter(PPP_DEVICE_KEY, *fSettings, device, &deviceIndex))
return false;
// error: no device
BString name;
if(device.FindString("Values", &name) != B_OK || name != kKernelModuleName)
return false;
// error: no device
BMessage parameter;
int32 index = 0;
if(!FindMessageParameter(PPPoE_INTERFACE_KEY, device, parameter, &index)
|| parameter.FindString("Values", &fInterfaceName) != B_OK)
return false;
// error: no interface
else {
parameter.AddBool("Valid", true);
device.ReplaceMessage("Parameters", index, &parameter);
}
index = 0;
if(!FindMessageParameter(PPPoE_AC_NAME_KEY, device, parameter, &index)
|| parameter.FindString("Values", &fACName) != B_OK)
fACName = "";
else {
parameter.AddBool("Valid", true);
device.ReplaceMessage("Parameters", index, &parameter);
}
index = 0;
if(!FindMessageParameter(PPPoE_SERVICE_NAME_KEY, device, parameter, &index)
|| parameter.FindString("Values", &fServiceName) != B_OK)
fServiceName = "";
else {
parameter.AddBool("Valid", true);
device.ReplaceMessage("Parameters", index, &parameter);
}
device.AddBool("Valid", true);
fSettings->ReplaceMessage("Parameters", deviceIndex, &device);
return true;
}
void
PPPoEAddon::IsModified(bool& settings, bool& profile) const
{
if(!fSettings) {
settings = profile = false;
return;
}
settings = profile = false;
settings = (fInterfaceName != fPPPoEView->InterfaceName()
|| fACName != fPPPoEView->ACName()
|| fServiceName != fPPPoEView->ServiceName());
}
bool
PPPoEAddon::SaveSettings(BMessage *settings, BMessage *profile, bool saveTemporary)
{
if(!fSettings || !settings || !fPPPoEView->InterfaceName()
|| strlen(fPPPoEView->InterfaceName()) == 0)
return false;
// TODO: tell user that an interface is needed (if we fail because of this)
BMessage device, interface;
device.AddString("Name", PPP_DEVICE_KEY);
device.AddString("Values", kKernelModuleName);
interface.AddString("Name", PPPoE_INTERFACE_KEY);
interface.AddString("Values", fPPPoEView->InterfaceName());
device.AddMessage("Parameters", &interface);
if(fPPPoEView->ACName() && strlen(fPPPoEView->ACName()) > 0) {
// save access concentrator, too
BMessage ac;
ac.AddString("Name", PPPoE_AC_NAME_KEY);
ac.AddString("Values", fPPPoEView->ACName());
device.AddMessage("Parameters", &ac);
}
if(fPPPoEView->ServiceName() && strlen(fPPPoEView->ServiceName()) > 0) {
// save service name, too
BMessage service;
service.AddString("Name", PPPoE_SERVICE_NAME_KEY);
service.AddString("Values", fPPPoEView->ServiceName());
device.AddMessage("Parameters", &service);
}
settings->AddMessage("Parameters", &device);
return true;
}
bool
PPPoEAddon::GetPreferredSize(float *width, float *height) const
{
float viewWidth;
if(Addons()->FindFloat("DeviceViewWidth", &viewWidth) != B_OK)
viewWidth = 270;
// default value
if(width)
*width = viewWidth;
if(height)
*height = fHeight;
return true;
}
BView*
PPPoEAddon::CreateView(BPoint leftTop)
{
if(!fPPPoEView) {
float width;
if(!Addons()->FindFloat("DeviceViewWidth", &width))
width = 270;
// default value
BRect rect(0, 0, width, fHeight);
fPPPoEView = new PPPoEView(this, rect);
}
fPPPoEView->MoveTo(leftTop);
fPPPoEView->Reload();
return fPPPoEView;
}
PPPoEView::PPPoEView(PPPoEAddon *addon, BRect frame)
: BView(frame, "PPPoEView", B_FOLLOW_NONE, 0),
fAddon(addon)
{
BRect rect = Bounds();
rect.InsetBy(5, 0);
rect.bottom = 20;
fInterfaceName = new BTextControl(rect, "interface", "Interface Name: ", NULL,
NULL);
fInterfaceName->SetDivider(StringWidth(fInterfaceName->Label()) + 5);
// TODO: add "Query" pop-up menu to allow quickly choosing interface from list
rect.top = rect.bottom + 5;
rect.bottom = rect.top + 45;
fServiceButton = new BButton(rect, "ServiceButton", "Service",
new BMessage(MSG_SHOW_SERVICE_WINDOW));
fServiceButton->ResizeToPreferred();
// create service window
float boxHeight = 20 // space at top
+ 2 * 20 // size of controls
+ 2 * 5; // space between controls and bottom
float windowHeight = boxHeight
+ 35 // buttons
+ 2 * 5; // space between controls and bottom
rect.Set(350, 250, 650, 250 + windowHeight);
fServiceWindow = new BWindow(rect, "Service", B_MODAL_WINDOW,
B_NOT_RESIZABLE | B_NOT_CLOSABLE);
rect = fServiceWindow->Bounds();
BView *serviceView = new BView(rect, "serviceView", B_FOLLOW_NONE, 0);
serviceView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
rect.InsetBy(5, 5);
rect.bottom = rect.top + boxHeight;
BBox *serviceBox = new BBox(rect, "Service");
serviceBox->SetLabel("Service");
rect = serviceBox->Bounds();
rect.InsetBy(10, 0);
rect.top = 20;
rect.bottom = rect.top + 20;
fACName = new BTextControl(rect, "ac", "AC: ", NULL, NULL);
rect.top = rect.bottom + 5;
rect.bottom = rect.top + 20;
fServiceName = new BTextControl(rect, "service", "Service: ", NULL, NULL);
// set divider of text controls
float acNameWidth = StringWidth(fACName->Label()) + 5;
float serviceNameWidth = StringWidth(fServiceName->Label()) + 5;
if(acNameWidth > serviceNameWidth)
serviceNameWidth = acNameWidth;
else
acNameWidth = serviceNameWidth;
fACName->SetDivider(acNameWidth);
fServiceName->SetDivider(serviceNameWidth);
// add buttons to service window
rect = serviceBox->Frame();
rect.top = rect.bottom + 10;
rect.bottom = rect.top + 25;
float buttonWidth = (rect.Width() - 10) / 2;
rect.right = rect.left + buttonWidth;
fCancelButton = new BButton(rect, "CancelButton", "Cancel",
new BMessage(MSG_RESET_SERVICE));
rect.left = rect.right + 10;
rect.right = rect.left + buttonWidth;
fOKButton = new BButton(rect, "OKButton", "OK", new BMessage(MSG_CHANGE_SERVICE));
serviceBox->AddChild(fACName);
serviceBox->AddChild(fServiceName);
serviceView->AddChild(serviceBox);
serviceView->AddChild(fCancelButton);
serviceView->AddChild(fOKButton);
fServiceWindow->AddChild(serviceView);
fServiceWindow->SetDefaultButton(fOKButton);
fServiceWindow->Run();
AddChild(fInterfaceName);
AddChild(fServiceButton);
}
PPPoEView::~PPPoEView()
{
}
void
PPPoEView::Reload()
{
fInterfaceName->SetText(Addon()->InterfaceName());
fServiceWindow->Lock();
fACName->SetText(Addon()->ACName());
fPreviousACName = Addon()->ACName();
fServiceName->SetText(Addon()->ServiceName());
fPreviousServiceName = Addon()->ServiceName();
fServiceWindow->Unlock();
}
void
PPPoEView::AttachedToWindow()
{
SetViewColor(Parent()->ViewColor());
fInterfaceName->SetTarget(this);
fServiceButton->SetTarget(this);
fACName->SetTarget(this);
fServiceName->SetTarget(this);
fCancelButton->SetTarget(this);
fOKButton->SetTarget(this);
}
void
PPPoEView::MessageReceived(BMessage *message)
{
switch(message->what) {
case MSG_SHOW_SERVICE_WINDOW:
fServiceWindow->Show();
break;
case MSG_CHANGE_SERVICE:
fServiceWindow->Hide();
fServiceWindow->Lock();
fPreviousACName = fACName->Text();
fPreviousServiceName = fServiceName->Text();
fServiceWindow->Unlock();
break;
case MSG_RESET_SERVICE:
fServiceWindow->Hide();
fServiceWindow->Lock();
fACName->SetText(fPreviousACName.String());
fServiceName->SetText(fPreviousServiceName.String());
fServiceWindow->Unlock();
break;
default:
BView::MessageReceived(message);
}
}
@@ -0,0 +1,96 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2003-2004 Waldemar Kornewald, [email protected]
//-----------------------------------------------------------------------
// PPPoEAddon saves the loaded settings.
// PPPoEView saves the current settings.
//-----------------------------------------------------------------------
#ifndef _PPPoE_ADDON__H
#define _PPPoE_ADDON__H
#include <DialUpAddon.h>
#include <CheckBox.h>
#include <Message.h>
#include <String.h>
#include <TextControl.h>
class PPPoEView;
class PPPoEAddon : public DialUpAddon {
public:
PPPoEAddon(BMessage *addons);
virtual ~PPPoEAddon();
bool IsNew() const
{ return fIsNew; }
const char *InterfaceName() const
{ return fInterfaceName.String(); }
const char *ACName() const
{ return fACName.String(); }
const char *ServiceName() const
{ return fServiceName.String(); }
BMessage *Settings() const
{ return fSettings; }
BMessage *Profile() const
{ return fProfile; }
virtual const char *FriendlyName() const;
virtual const char *TechnicalName() const;
virtual const char *KernelModuleName() const;
virtual bool LoadSettings(BMessage *settings, BMessage *profile, bool isNew);
virtual void IsModified(bool& settings, bool& profile) const;
virtual bool SaveSettings(BMessage *settings, BMessage *profile,
bool saveTemporary);
virtual bool GetPreferredSize(float *width, float *height) const;
virtual BView *CreateView(BPoint leftTop);
private:
bool fIsNew;
BString fInterfaceName, fACName, fServiceName;
BMessage *fSettings, *fProfile;
// saves last settings state
PPPoEView *fPPPoEView;
float fHeight;
// height of PPPoEView
};
class PPPoEView : public BView {
public:
PPPoEView(PPPoEAddon *addon, BRect frame);
virtual ~PPPoEView();
PPPoEAddon *Addon() const
{ return fAddon; }
void Reload();
const char *InterfaceName() const
{ return fInterfaceName->Text(); }
const char *ACName() const
{ return fACName->Text(); }
const char *ServiceName() const
{ return fServiceName->Text(); }
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage *message);
private:
PPPoEAddon *fAddon;
BButton *fServiceButton, *fCancelButton, *fOKButton;
BTextControl *fInterfaceName, *fACName, *fServiceName;
BWindow *fServiceWindow;
BString fPreviousACName, fPreviousServiceName;
};
#endif