Added the Protocols tab. Could not test it because currently there is no IPCP addon.

Replaced direct identifier specification for BMessage with #define'd values, so typos cannot arise.
Moved some functions into InterfaceUtils so they are available for all add-ons (this will later become part of a static library for the DialUpAddon API).


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7065 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Waldemar Kornewald 2004-03-25 11:59:34 +00:00
parent a1a4146fcc
commit 3dbb75a676
16 changed files with 836 additions and 180 deletions

View File

@ -7,10 +7,10 @@ All add-ons must add a "Valid" boolean value to every recognized parameter. The
Add-on registration:
--------------------------------------------------------------------------------------
Tabs:
"Tab" : pointer to DialUpAddon object
DUN_TAB_ADDON_TYPE : pointer to DialUpAddon object
Authenticators:
"Authenticator" : BMessage with the following entries:
DUN_AUTHENTICATOR_ADDON_TYPE : BMessage with the following entries:
{
"KernelModule" : string
"TechnicalName" : string
@ -19,18 +19,20 @@ Authenticators:
}
Devices:
"Device" : pointer to DialUpAddon object
DUN_DEVICE_ADDON_TYPE : pointer to DialUpAddon object
Protocols:
"Protocol" : pointer to DialUpAddon object
Note: CreateView() should NOT return a view, but open a preferences window (B_MODAL_WINDOW)!
DUN_PROTOCOL_ADDON_TYPE : pointer to DialUpAddon object
Addons that must be deleted:
"DeleteMe" : pointer to DialUpAddon object - this will be deleted on exit (you should register all your
addons here, too)
DUN_DELETE_ON_QUIT : pointer to DialUpAddon object - this will be deleted when the preflet quits
(you should register all your addons here, too)
--------------------------------------------------------------------------------------
Additional data in the BMessage object for add-ons:
--------------------------------------------------------------------------------------
"Messenger" : BMessenger - This messenger can be used to send messages to the preflet
"TabViewRect" : BRect - This rect should be used for tabs
DUN_MESSENGER : BMessenger - This messenger can be used to send messages to the preflet
DUN_TAB_VIEW_RECT : BRect - This rect should be used for tabs
DUN_DEVICE_VIEW_WIDTH : float - Maximum width a device add-on's view may have

View File

@ -18,7 +18,20 @@
#include <Point.h>
#define DUN_MAXIMUM_PRIORITY 50
#define DUN_MAXIMUM_PRIORITY 50
// add-on types
#define DUN_TAB_ADDON_TYPE "Tab"
#define DUN_AUTHENTICATOR_ADDON_TYPE "Authenticator"
#define DUN_DEVICE_ADDON_TYPE "Device"
#define DUN_PROTOCOL_ADDON_TYPE "Protocol"
// other information contained in the add-ons BMessage object
#define DUN_DELETE_ON_QUIT "DeleteMe"
// the DialUpAddon objects in this list will be deleted when the preflet quits
#define DUN_MESSENGER "Messenger"
#define DUN_TAB_VIEW_RECT "TabViewRect"
#define DUN_DEVICE_VIEW_WIDTH "DeviceViewWidth"
class DialUpAddon {

View File

@ -8,11 +8,13 @@
#include "DialUpView.h"
#include "DialUpAddon.h"
#include "InterfaceUtils.h"
#include "MessageDriverSettingsUtils.h"
// built-in add-ons
#include "GeneralAddon.h"
#include "PPPoEAddon.h"
#include "ProtocolsAddon.h"
#include <PPPInterface.h>
@ -90,7 +92,7 @@ DialUpView::DialUpView(BRect frame)
// add messenger to us so add-ons can contact us
BMessenger messenger(this);
fAddons.AddMessenger("Messenger", messenger);
fAddons.AddMessenger(DUN_MESSENGER, messenger);
// create pop-up with all interfaces and "New..."/"Delete current" items
fInterfaceMenu = new BPopUpMenu(LABEL_CREATE_NEW);
@ -107,7 +109,7 @@ DialUpView::DialUpView(BRect frame)
fTabView = new BTabView(rect, "TabView");
BRect tabViewRect = fTabView->Bounds();
tabViewRect.bottom -= fTabView->TabHeight();
fAddons.AddRect("TabViewRect", tabViewRect);
fAddons.AddRect(DUN_TAB_VIEW_RECT, tabViewRect);
rect.top = rect.bottom + 15;
rect.bottom = rect.top + 15;
@ -145,7 +147,7 @@ DialUpView::~DialUpView()
// free known add-on types (these should free their known add-on types, etc.)
DialUpAddon *addon;
for(int32 index = 0;
fAddons.FindPointer("DeleteMe", index,
fAddons.FindPointer(DUN_DELETE_ON_QUIT, index,
reinterpret_cast<void**>(&addon)) == B_OK;
index++)
delete addon;
@ -232,7 +234,7 @@ DialUpView::LoadSettings(bool isNew)
}
DialUpAddon *addon;
for(int32 index = 0; fAddons.FindPointer("Tab", index,
for(int32 index = 0; fAddons.FindPointer(DUN_TAB_ADDON_TYPE, index,
reinterpret_cast<void**>(&addon)) == B_OK; index++) {
if(!addon)
continue;
@ -255,7 +257,7 @@ DialUpView::IsModified(bool& settings, bool& profile)
// for current addon
DialUpAddon *addon;
for(int32 index = 0; fAddons.FindPointer("Tab", index,
for(int32 index = 0; fAddons.FindPointer(DUN_TAB_ADDON_TYPE, index,
reinterpret_cast<void**>(&addon)) == B_OK; index++) {
if(!addon)
continue;
@ -278,7 +280,7 @@ DialUpView::SaveSettings(BMessage& settings, BMessage& profile, bool saveModifie
DialUpAddon *addon;
TemplateList<DialUpAddon*> addons;
for(int32 index = 0;
fAddons.FindPointer("Tab", index,
fAddons.FindPointer(DUN_TAB_ADDON_TYPE, index,
reinterpret_cast<void**>(&addon)) == B_OK;
index++) {
if(!addon)
@ -440,14 +442,14 @@ DialUpView::HandleReportMessage(BMessage *message)
void
DialUpView::CreateTabs()
{
// create tabs for all registered and valid "Tab" add-ons
// create tabs for all registered and valid tab add-ons
DialUpAddon *addon;
BView *target;
float width, height;
TemplateList<DialUpAddon*> addons;
for(int32 index = 0;
fAddons.FindPointer("Tab", index,
fAddons.FindPointer(DUN_TAB_ADDON_TYPE, index,
reinterpret_cast<void**>(&addon)) == B_OK;
index++) {
if(!addon || addon->Position() < 0)
@ -598,19 +600,23 @@ DialUpView::LoadAddons()
// Load integrated add-ons:
// "General" tab
GeneralAddon *generalAddon = new GeneralAddon(&fAddons);
fAddons.AddPointer("Tab", generalAddon);
fAddons.AddPointer("DeleteMe", generalAddon);
fAddons.AddPointer(DUN_TAB_ADDON_TYPE, generalAddon);
fAddons.AddPointer(DUN_DELETE_ON_QUIT, generalAddon);
// "PPPoE" device
PPPoEAddon *pppoeAddon = new PPPoEAddon(&fAddons);
fAddons.AddPointer("Device", pppoeAddon);
fAddons.AddPointer("DeleteMe", pppoeAddon);
fAddons.AddPointer(DUN_DEVICE_ADDON_TYPE, pppoeAddon);
fAddons.AddPointer(DUN_DELETE_ON_QUIT, pppoeAddon);
// "Protocols" tab
ProtocolsAddon *protocolsAddon = new ProtocolsAddon(&fAddons);
fAddons.AddPointer(DUN_TAB_ADDON_TYPE, protocolsAddon);
fAddons.AddPointer(DUN_DELETE_ON_QUIT, protocolsAddon);
// "PAP" authenticator
BMessage addon;
addon.AddString("KernelModuleName", "pap");
addon.AddString("FriendlyName", "Plain-text Authentication");
addon.AddString("TechnicalName", "PAP");
fAddons.AddMessage("Authenticator", &addon);
// addon.MakeEmpty();
fAddons.AddMessage(DUN_AUTHENTICATOR_ADDON_TYPE, &addon);
// addon.MakeEmpty(); // for next authenticator
// TODO:
// load all add-ons from the add-ons folder
@ -687,18 +693,3 @@ DialUpView::CountInterfaces() const
{
return fInterfaceMenu->CountItems() - 3;
}
int32
DialUpView::FindNextMenuInsertionIndex(BMenu *menu, const BString& name,
int32 index = 0)
{
BMenuItem *item;
for(; index < menu->CountItems(); index++) {
item = menu->ItemAt(index);
if(item && name.ICompare(item->Label()) <= 0)
return index;
}
return index;
}

View File

@ -45,8 +45,6 @@ class DialUpView : public BView {
void AddInterface(const char *name, bool isNew = false);
void SelectInterface(int32 index, bool isNew = false);
int32 CountInterfaces() const;
int32 FindNextMenuInsertionIndex(BMenu *menu, const BString& name,
int32 index = 0);
private:
PPPInterfaceListener fListener;

View File

@ -10,13 +10,13 @@
#include "GeneralAddon.h"
#include "InterfaceUtils.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>
@ -27,6 +27,10 @@
#define MSG_SELECT_AUTHENTICATOR 'SELA'
#define GENERAL_TAB_AUTHENTICATION "Authentication"
#define GENERAL_TAB_AUTHENTICATORS "Authenticators"
GeneralAddon::GeneralAddon(BMessage *addons)
: DialUpAddon(addons),
fHasPassword(false),
@ -47,7 +51,7 @@ DialUpAddon*
GeneralAddon::FindDevice(const BString& moduleName) const
{
DialUpAddon *addon;
for(int32 index = 0; Addons()->FindPointer("Device", index,
for(int32 index = 0; Addons()->FindPointer(DUN_DEVICE_ADDON_TYPE, index,
reinterpret_cast<void**>(&addon)) == B_OK; index++)
if(addon && moduleName == addon->KernelModuleName())
return addon;
@ -74,10 +78,10 @@ GeneralAddon::LoadSettings(BMessage *settings, BMessage *profile, bool isNew)
if(!settings || !profile || isNew)
return true;
if(!LoadDeviceSettings(settings, profile))
if(!LoadDeviceSettings())
return false;
if(!LoadAuthenticationSettings(settings, profile))
if(!LoadAuthenticationSettings())
return false;
if(fGeneralView)
@ -89,53 +93,53 @@ GeneralAddon::LoadSettings(BMessage *settings, BMessage *profile, bool isNew)
bool
GeneralAddon::LoadDeviceSettings(BMessage *settings, BMessage *profile)
GeneralAddon::LoadDeviceSettings()
{
int32 index = 0;
BMessage device;
if(!FindMessageParameter(PPP_DEVICE_KEY, *settings, device, &index))
if(!FindMessageParameter(PPP_DEVICE_KEY, *fSettings, device, &index))
return false;
// TODO: tell user that device specification is missing
if(device.FindString("Values", &fDeviceName) != B_OK)
if(device.FindString(MDSU_VALUES, &fDeviceName) != B_OK)
return false;
// TODO: tell user that device specification is missing
device.AddBool("Valid", true);
settings->ReplaceMessage("Parameters", index, &device);
device.AddBool(MDSU_VALID, true);
fSettings->ReplaceMessage(MDSU_PARAMETERS, index, &device);
fDeviceAddon = FindDevice(fDeviceName);
if(!fDeviceAddon)
return false;
return fDeviceAddon->LoadSettings(settings, profile, false);
return fDeviceAddon->LoadSettings(fSettings, fProfile, false);
}
bool
GeneralAddon::LoadAuthenticationSettings(BMessage *settings, BMessage *profile)
GeneralAddon::LoadAuthenticationSettings()
{
// we only handle the profile (although settings could contain different data)
int32 itemIndex = 0;
BMessage authentication, item;
if(!FindMessageParameter(PPP_AUTHENTICATOR_KEY, *profile, item, &itemIndex))
if(!FindMessageParameter(PPP_AUTHENTICATOR_KEY, *fProfile, item, &itemIndex))
return true;
// find authenticators (though we load all authenticators, we only use one)
BString name;
for(int32 index = 0; item.FindString("Values", index, &name) == B_OK; index++) {
for(int32 index = 0; item.FindString(MDSU_VALUES, index, &name) == B_OK; index++) {
BMessage authenticator;
if(!GetAuthenticator(name, &authenticator))
return false;
// fatal error: we do not know how to handle this authenticator
MarkAuthenticatorAsValid(name);
authentication.AddString("Authenticators", name);
authentication.AddString(GENERAL_TAB_AUTHENTICATORS, name);
++fAuthenticatorsCount;
}
fSettings->AddMessage("Authentication", &authentication);
fSettings->AddMessage(GENERAL_TAB_AUTHENTICATION, &authentication);
bool hasUsername = false;
// a username must be present
@ -144,25 +148,25 @@ GeneralAddon::LoadAuthenticationSettings(BMessage *settings, BMessage *profile)
BMessage parameter;
int32 parameterIndex = 0;
if(FindMessageParameter("User", item, parameter, &parameterIndex)
&& parameter.FindString("Values", &fUsername) == B_OK) {
&& parameter.FindString(MDSU_VALUES, &fUsername) == B_OK) {
hasUsername = true;
parameter.AddBool("Valid", true);
item.ReplaceMessage("Parameters", parameterIndex, &parameter);
parameter.AddBool(MDSU_VALID, true);
item.ReplaceMessage(MDSU_PARAMETERS, parameterIndex, &parameter);
}
parameterIndex = 0;
if(FindMessageParameter("Password", item, parameter, &parameterIndex)
&& parameter.FindString("Values", &fPassword) == B_OK) {
&& parameter.FindString(MDSU_VALUES, &fPassword) == B_OK) {
fHasPassword = true;
parameter.AddBool("Valid", true);
item.ReplaceMessage("Parameters", parameterIndex, &parameter);
parameter.AddBool(MDSU_VALID, true);
item.ReplaceMessage(MDSU_PARAMETERS, parameterIndex, &parameter);
}
// tell DUN whether everything is valid
if(hasUsername)
item.AddBool("Valid", true);
item.AddBool(MDSU_VALID, true);
profile->ReplaceMessage("Parameters", itemIndex, &item);
fProfile->ReplaceMessage(MDSU_PARAMETERS, itemIndex, &item);
return true;
}
@ -213,14 +217,14 @@ GeneralAddon::IsAuthenticationModified(bool& settings, bool& profile) const
settings = fGeneralView->AuthenticatorName();
else {
BMessage authentication;
if(fSettings->FindMessage("Authentication", &authentication) != B_OK) {
if(fSettings->FindMessage(GENERAL_TAB_AUTHENTICATION, &authentication) != B_OK) {
settings = profile = false;
return;
// error!
}
BString authenticator;
if(authentication.FindString("Authenticators", &authenticator) != B_OK) {
if(authentication.FindString(GENERAL_TAB_AUTHENTICATORS, &authenticator) != B_OK) {
settings = profile = false;
return;
// error!
@ -248,24 +252,24 @@ GeneralAddon::SaveSettings(BMessage *settings, BMessage *profile, bool saveTempo
if(fGeneralView->AuthenticatorName()) {
BMessage authenticator;
authenticator.AddString("Name", PPP_AUTHENTICATOR_KEY);
authenticator.AddString("Values", fGeneralView->AuthenticatorName());
settings->AddMessage("Parameters", &authenticator);
authenticator.AddString(MDSU_NAME, PPP_AUTHENTICATOR_KEY);
authenticator.AddString(MDSU_VALUES, fGeneralView->AuthenticatorName());
settings->AddMessage(MDSU_PARAMETERS, &authenticator);
BMessage username;
username.AddString("Name", "User");
username.AddString("Values", fGeneralView->Username());
authenticator.AddMessage("Parameters", &username);
username.AddString(MDSU_NAME, "User");
username.AddString(MDSU_VALUES, fGeneralView->Username());
authenticator.AddMessage(MDSU_PARAMETERS, &username);
if(saveTemporary || fGeneralView->DoesSavePassword()) {
// save password, too
BMessage password;
password.AddString("Name", "Password");
password.AddString("Values", fGeneralView->Password());
authenticator.AddMessage("Parameters", &password);
password.AddString(MDSU_NAME, "Password");
password.AddString(MDSU_VALUES, fGeneralView->Password());
authenticator.AddMessage(MDSU_PARAMETERS, &password);
}
profile->AddMessage("Parameters", &authenticator);
profile->AddMessage(MDSU_PARAMETERS, &authenticator);
}
return true;
@ -276,7 +280,7 @@ bool
GeneralAddon::GetPreferredSize(float *width, float *height) const
{
BRect rect;
if(Addons()->FindRect("TabViewRect", &rect) != B_OK)
if(Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect) != B_OK)
rect.Set(0, 0, 200, 300);
// set default values
@ -294,7 +298,7 @@ GeneralAddon::CreateView(BPoint leftTop)
{
if(!fGeneralView) {
BRect rect;
Addons()->FindRect("TabViewRect", &rect);
Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect);
fGeneralView = new GeneralView(this, rect);
}
@ -311,8 +315,8 @@ GeneralAddon::GetAuthenticator(const BString& moduleName, BMessage *entry) const
return false;
BString name;
for(int32 index = 0; Addons()->FindMessage("Authenticator", index, entry) == B_OK;
index++) {
for(int32 index = 0; Addons()->FindMessage(DUN_AUTHENTICATOR_ADDON_TYPE, index,
entry) == B_OK; index++) {
entry->FindString("KernelModuleName", &name);
if(name == moduleName)
return true;
@ -333,8 +337,8 @@ GeneralAddon::MarkAuthenticatorAsValid(const BString& moduleName)
&index); index++) {
authenticator.FindString("KernelModuleName", &name);
if(name == moduleName) {
authenticator.AddBool("Valid", true);
fSettings->ReplaceMessage("Parameters", index, &authenticator);
authenticator.AddBool(MDSU_VALID, true);
fSettings->ReplaceMessage(MDSU_PARAMETERS, index, &authenticator);
return true;
}
}
@ -344,14 +348,15 @@ GeneralAddon::MarkAuthenticatorAsValid(const BString& moduleName)
GeneralView::GeneralView(GeneralAddon *addon, BRect frame)
: BView(frame, "GeneralView", B_FOLLOW_NONE, 0),
: BView(frame, "General", B_FOLLOW_NONE, 0),
fAddon(addon)
{
BRect rect = Bounds();
rect.InsetBy(5, 5);
rect.bottom = 100;
fDeviceBox = new BBox(rect, "Device");
Addon()->Addons()->AddFloat("DeviceViewWidth", fDeviceBox->Bounds().Width() - 10);
Addon()->Addons()->AddFloat(DUN_DEVICE_VIEW_WIDTH,
fDeviceBox->Bounds().Width() - 10);
rect.top = rect.bottom + 10;
rect.bottom = rect.top
+ 25 // space for topmost control
@ -436,8 +441,9 @@ GeneralView::Reload()
if(Addon()->CountAuthenticators() > 0) {
BString kernelModule, authenticator;
BMessage authentication;
if(Addon()->Settings()->FindMessage("Authentication", &authentication) == B_OK)
authentication.FindString("Authenticators", &authenticator);
if(Addon()->Settings()->FindMessage(GENERAL_TAB_AUTHENTICATION,
&authentication) == B_OK)
authentication.FindString(GENERAL_TAB_AUTHENTICATORS, &authenticator);
BMenu *menu = fAuthenticatorField->Menu();
for(int32 index = 0; index < menu->CountItems(); index++) {
item = menu->ItemAt(index);
@ -575,7 +581,8 @@ GeneralView::ReloadDeviceView()
void
GeneralView::AddDevices()
{
AddAddonsToMenu(fDeviceField->Menu(), "Device", MSG_SELECT_DEVICE);
AddAddonsToMenu(Addon()->Addons(), fDeviceField->Menu(), DUN_DEVICE_ADDON_TYPE,
MSG_SELECT_DEVICE);
}
@ -589,8 +596,8 @@ GeneralView::AddAuthenticators()
BMessage addon;
for(int32 index = 0;
Addon()->Addons()->FindMessage("Authenticator", index, &addon) == B_OK;
index++) {
Addon()->Addons()->FindMessage(DUN_AUTHENTICATOR_ADDON_TYPE, index,
&addon) == B_OK; index++) {
BMessage *message = new BMessage(MSG_SELECT_AUTHENTICATOR);
message->AddString("KernelModuleName", addon.FindString("KernelModuleName"));
@ -616,48 +623,3 @@ GeneralView::AddAuthenticators()
insertAt);
}
}
void
GeneralView::AddAddonsToMenu(BMenu *menu, const char *type, uint32 what)
{
DialUpAddon *addon;
for(int32 index = 0; Addon()->Addons()->FindPointer(type, index,
reinterpret_cast<void**>(&addon)) == B_OK; index++) {
if(!addon || (!addon->FriendlyName() && !addon->TechnicalName()))
continue;
BMessage *message = new BMessage(what);
message->AddPointer("Addon", addon);
BString name;
if(addon->TechnicalName()) {
name << addon->TechnicalName();
if(addon->FriendlyName())
name << " (";
}
if(addon->FriendlyName()) {
name << addon->FriendlyName();
if(addon->TechnicalName())
name << ")";
}
int32 insertAt = FindNextMenuInsertionIndex(menu, name);
menu->AddItem(new BMenuItem(name.String(), message), insertAt);
}
}
int32
GeneralView::FindNextMenuInsertionIndex(BMenu *menu, const BString& name,
int32 index = 0)
{
BMenuItem *item;
for(; index < menu->CountItems(); index++) {
item = menu->ItemAt(index);
if(item && name.ICompare(item->Label()) <= 0)
return index;
}
return index;
}

View File

@ -14,7 +14,6 @@
#include <DialUpAddon.h>
#include <CheckBox.h>
#include <Message.h>
#include <String.h>
#include <TextControl.h>
@ -53,8 +52,8 @@ class GeneralAddon : public DialUpAddon {
virtual int32 Position() const
{ return 0; }
virtual bool LoadSettings(BMessage *settings, BMessage *profile, bool isNew);
bool LoadDeviceSettings(BMessage *settings, BMessage *profile);
bool LoadAuthenticationSettings(BMessage *settings, BMessage *profile);
bool LoadDeviceSettings();
bool LoadAuthenticationSettings();
virtual bool HasTemporaryProfile() const;
virtual void IsModified(bool& settings, bool& profile) const;
@ -109,9 +108,6 @@ class GeneralView : public BView {
void AddDevices();
void AddAuthenticators();
void AddAddonsToMenu(BMenu *menu, const char *type, uint32 what);
int32 FindNextMenuInsertionIndex(BMenu *menu, const BString& name,
int32 index = 0);
private:
GeneralAddon *fAddon;

View File

@ -0,0 +1,74 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
//-----------------------------------------------------------------------
#include "InterfaceUtils.h"
#include "DialUpAddon.h"
#include <ListView.h>
#include <Menu.h>
#include <MenuItem.h>
#include <String.h>
#include <StringItem.h>
int32
FindNextMenuInsertionIndex(BMenu *menu, const BString& name, int32 index = 0)
{
BMenuItem *item;
for(; index < menu->CountItems(); index++) {
item = menu->ItemAt(index);
if(item && name.ICompare(item->Label()) <= 0)
return index;
}
return index;
}
int32
FindNextListInsertionIndex(BListView *list, const BString& name)
{
int32 index = 0;
BStringItem *item;
for(; index < list->CountItems(); index++) {
item = static_cast<BStringItem*>(list->ItemAt(index));
if(item && name.ICompare(item->Text()) <= 0)
return index;
}
return index;
}
void
AddAddonsToMenu(const BMessage *source, BMenu *menu, const char *type, uint32 what)
{
DialUpAddon *addon;
for(int32 index = 0; source->FindPointer(type, index,
reinterpret_cast<void**>(&addon)) == B_OK; index++) {
if(!addon || (!addon->FriendlyName() && !addon->TechnicalName()))
continue;
BMessage *message = new BMessage(what);
message->AddPointer("Addon", addon);
BString name;
if(addon->TechnicalName()) {
name << addon->TechnicalName();
if(addon->FriendlyName())
name << " (";
}
if(addon->FriendlyName()) {
name << addon->FriendlyName();
if(addon->TechnicalName())
name << ")";
}
int32 insertAt = FindNextMenuInsertionIndex(menu, name);
menu->AddItem(new BMenuItem(name.String(), message), insertAt);
}
}

View File

@ -0,0 +1,26 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
//-----------------------------------------------------------------------
#ifndef _INTERFACE_UTILS__H
#define _INTERFACE_UTILS__H
#include <SupportDefs.h>
class DialUpAddon;
class BListView;
class BMenu;
class BString;
extern int32 FindNextMenuInsertionIndex(BMenu *menu, const BString& name,
int32 index = 0);
extern int32 FindNextListInsertionIndex(BListView *list, const BString& name);
extern void AddAddonsToMenu(const BMessage *source, BMenu *menu, const char *type,
uint32 what);
#endif

View File

@ -12,11 +12,13 @@ SimpleTest DialUpPreflet :
DialUpView.cpp
# utils
InterfaceUtils.cpp
MessageDriverSettingsUtils.cpp
# built-in add-ons
GeneralAddon.cpp
PPPoEAddon.cpp
ProtocolsAddon.cpp
;
LinkSharedOSLibs DialUpPreflet : libppp.a be ;

View File

@ -1,3 +1,10 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
//-----------------------------------------------------------------------
#include "MessageDriverSettingsUtils.h"
#include <driver_settings.h>
@ -15,8 +22,8 @@ FindMessageParameter(const char *name, BMessage& message, BMessage& save,
// XXX: this should be removed when we can replace BMessage with something better
BString string;
int32 index = startIndex ? *startIndex : 0;
for(; message.FindMessage("Parameters", index, &save) == B_OK; index++) {
if(save.FindString("Name", &string) == B_OK && string.ICompare(name) == 0) {
for(; message.FindMessage(MDSU_PARAMETERS, index, &save) == B_OK; index++) {
if(save.FindString(MDSU_NAME, &string) == B_OK && string.ICompare(name) == 0) {
if(startIndex)
*startIndex = index;
return true;
@ -35,18 +42,18 @@ AddParameter(const driver_parameter *parameter, BMessage& message)
return false;
if(parameter->name)
message.AddString("Name", parameter->name);
message.AddString(MDSU_NAME, parameter->name);
else
return false;
for(int32 index = 0; index < parameter->value_count; index++)
if(parameter->values[index])
message.AddString("Values", parameter->values[index]);
message.AddString(MDSU_VALUES, parameter->values[index]);
for(int32 index = 0; index < parameter->parameter_count; index++) {
BMessage parameterMessage;
AddParameter(&parameter->parameters[index], parameterMessage);
message.AddMessage("Parameters", &parameterMessage);
message.AddMessage(MDSU_PARAMETERS, &parameterMessage);
}
return true;
@ -71,7 +78,7 @@ ReadMessageDriverSettings(const char *name, BMessage& message)
for(int32 index = 0; index < settings->parameter_count; index++) {
BMessage parameter;
AddParameter(&settings->parameters[index], parameter);
message.AddMessage("Parameters", &parameter);
message.AddMessage(MDSU_PARAMETERS, &parameter);
}
unload_driver_settings(handle);
@ -96,7 +103,7 @@ bool
WriteParameter(BFile& file, const BMessage& parameter, int32 level)
{
const char *name;
if(parameter.FindString("Name", &name) != B_OK || !name)
if(parameter.FindString(MDSU_NAME, &name) != B_OK || !name)
return false;
BString line, word(name);
@ -110,7 +117,7 @@ WriteParameter(BFile& file, const BMessage& parameter, int32 level)
line << '\"';
line << ' ';
for(int32 index = 0; parameter.FindString("Values", index, &name) == B_OK; index++)
for(int32 index = 0; parameter.FindString(MDSU_VALUES, index, &name) == B_OK; index++)
if(name) {
word = name;
EscapeWord(word);
@ -125,7 +132,7 @@ WriteParameter(BFile& file, const BMessage& parameter, int32 level)
type_code type;
int32 parameterCount;
parameter.GetInfo("Parameters", &type, &parameterCount);
parameter.GetInfo(MDSU_PARAMETERS, &type, &parameterCount);
if(parameterCount > 0)
line << '{';
@ -135,7 +142,7 @@ WriteParameter(BFile& file, const BMessage& parameter, int32 level)
if(parameterCount > 0) {
BMessage subParameter;
for(int32 index = 0; parameter.FindMessage("Parameters", index,
for(int32 index = 0; parameter.FindMessage(MDSU_PARAMETERS, index,
&subParameter) == B_OK; index++)
WriteParameter(file, subParameter, level + 1);
@ -158,7 +165,7 @@ WriteMessageDriverSettings(BFile& file, const BMessage& message)
file.Seek(0, SEEK_SET);
BMessage parameter;
for(int32 index = 0; message.FindMessage("Parameters", index, &parameter) == B_OK;
for(int32 index = 0; message.FindMessage(MDSU_PARAMETERS, index, &parameter) == B_OK;
index++) {
if(index > 0)
file.Write("\n", 1);

View File

@ -1,3 +1,10 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
//-----------------------------------------------------------------------
#ifndef _MESSAGE_DRIVER_SETTINGS_UTILS__H
#define _MESSAGE_DRIVER_SETTINGS_UTILS__H
@ -6,6 +13,11 @@
class BMessage;
class BFile;
#define MDSU_NAME "Name"
#define MDSU_VALUES "Values"
#define MDSU_PARAMETERS "Parameters"
#define MDSU_VALID "Valid"
extern bool FindMessageParameter(const char *name, BMessage& message,
BMessage& save, int32 *startIndex = NULL);

View File

@ -49,6 +49,8 @@ PPPoEAddon::PPPoEAddon(BMessage *addons)
PPPoEAddon::~PPPoEAddon()
{
delete fPPPoEView;
// this may have been set to NULL from the view's destructor!
}
@ -93,41 +95,41 @@ PPPoEAddon::LoadSettings(BMessage *settings, BMessage *profile, bool isNew)
// error: no device
BString name;
if(device.FindString("Values", &name) != B_OK || name != kKernelModuleName)
if(device.FindString(MDSU_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)
|| parameter.FindString(MDSU_VALUES, &fInterfaceName) != B_OK)
return false;
// error: no interface
else {
parameter.AddBool("Valid", true);
device.ReplaceMessage("Parameters", index, &parameter);
parameter.AddBool(MDSU_VALID, true);
device.ReplaceMessage(MDSU_PARAMETERS, index, &parameter);
}
index = 0;
if(!FindMessageParameter(PPPoE_AC_NAME_KEY, device, parameter, &index)
|| parameter.FindString("Values", &fACName) != B_OK)
|| parameter.FindString(MDSU_VALUES, &fACName) != B_OK)
fACName = "";
else {
parameter.AddBool("Valid", true);
device.ReplaceMessage("Parameters", index, &parameter);
parameter.AddBool(MDSU_VALID, true);
device.ReplaceMessage(MDSU_PARAMETERS, index, &parameter);
}
index = 0;
if(!FindMessageParameter(PPPoE_SERVICE_NAME_KEY, device, parameter, &index)
|| parameter.FindString("Values", &fServiceName) != B_OK)
|| parameter.FindString(MDSU_VALUES, &fServiceName) != B_OK)
fServiceName = "";
else {
parameter.AddBool("Valid", true);
device.ReplaceMessage("Parameters", index, &parameter);
parameter.AddBool(MDSU_VALID, true);
device.ReplaceMessage(MDSU_PARAMETERS, index, &parameter);
}
device.AddBool("Valid", true);
fSettings->ReplaceMessage("Parameters", deviceIndex, &device);
device.AddBool(MDSU_VALID, true);
fSettings->ReplaceMessage(MDSU_PARAMETERS, deviceIndex, &device);
return true;
}
@ -157,30 +159,30 @@ PPPoEAddon::SaveSettings(BMessage *settings, BMessage *profile, bool saveTempora
// 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);
device.AddString(MDSU_NAME, PPP_DEVICE_KEY);
device.AddString(MDSU_VALUES, kKernelModuleName);
interface.AddString("Name", PPPoE_INTERFACE_KEY);
interface.AddString("Values", fPPPoEView->InterfaceName());
device.AddMessage("Parameters", &interface);
interface.AddString(MDSU_NAME, PPPoE_INTERFACE_KEY);
interface.AddString(MDSU_VALUES, fPPPoEView->InterfaceName());
device.AddMessage(MDSU_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);
ac.AddString(MDSU_NAME, PPPoE_AC_NAME_KEY);
ac.AddString(MDSU_VALUES, fPPPoEView->ACName());
device.AddMessage(MDSU_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);
service.AddString(MDSU_NAME, PPPoE_SERVICE_NAME_KEY);
service.AddString(MDSU_VALUES, fPPPoEView->ServiceName());
device.AddMessage(MDSU_PARAMETERS, &service);
}
settings->AddMessage("Parameters", &device);
settings->AddMessage(MDSU_PARAMETERS, &device);
return true;
}
@ -190,7 +192,7 @@ bool
PPPoEAddon::GetPreferredSize(float *width, float *height) const
{
float viewWidth;
if(Addons()->FindFloat("DeviceViewWidth", &viewWidth) != B_OK)
if(Addons()->FindFloat(DUN_DEVICE_VIEW_WIDTH, &viewWidth) != B_OK)
viewWidth = 270;
// default value
@ -208,7 +210,7 @@ PPPoEAddon::CreateView(BPoint leftTop)
{
if(!fPPPoEView) {
float width;
if(!Addons()->FindFloat("DeviceViewWidth", &width))
if(!Addons()->FindFloat(DUN_DEVICE_VIEW_WIDTH, &width))
width = 270;
// default value
@ -303,6 +305,7 @@ PPPoEView::PPPoEView(PPPoEAddon *addon, BRect frame)
PPPoEView::~PPPoEView()
{
Addon()->UnregisterView();
}

View File

@ -13,8 +13,6 @@
#include <DialUpAddon.h>
#include <CheckBox.h>
#include <Message.h>
#include <String.h>
#include <TextControl.h>
@ -53,6 +51,9 @@ class PPPoEAddon : public DialUpAddon {
bool saveTemporary);
virtual bool GetPreferredSize(float *width, float *height) const;
virtual BView *CreateView(BPoint leftTop);
void UnregisterView()
{ fPPPoEView = NULL; }
private:
bool fIsNew;

View File

@ -0,0 +1,468 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2003-2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
//-----------------------------------------------------------------------
// ProtocolsAddon saves the loaded settings.
// ProtocolsView saves the current settings.
//-----------------------------------------------------------------------
#include "ProtocolsAddon.h"
#include "InterfaceUtils.h"
#include "MessageDriverSettingsUtils.h"
#include <Button.h>
#include <ListView.h>
#include <MenuItem.h>
#include <Message.h>
#include <PopUpMenu.h>
#include <ScrollView.h>
#include <StringItem.h>
#include <PPPDefs.h>
#define MSG_ADD_PROTOCOL 'ADDP'
#define MSG_REMOVE_PROTOCOL 'REMP'
#define MSG_SHOW_PREFERENCES 'SHOW'
#define MSG_UPDATE_BUTTONS 'UBTN'
#define PROTOCOLS_TAB_PROTOCOLS "Protocols"
ProtocolsAddon::ProtocolsAddon(BMessage *addons)
: DialUpAddon(addons),
fProtocolsCount(0),
fSettings(NULL),
fProfile(NULL),
fProtocolsView(NULL)
{
}
ProtocolsAddon::~ProtocolsAddon()
{
}
bool
ProtocolsAddon::LoadSettings(BMessage *settings, BMessage *profile, bool isNew)
{
fIsNew = isNew;
fProtocolsCount = 0;
fSettings = settings;
fProfile = profile;
if(fProtocolsView)
fProtocolsView->Reload();
// reset all views (empty settings)
if(!settings || !profile || isNew)
return true;
// ask protocols to load their settings
BMessage parameter;
for(int32 index = 0; FindMessageParameter(PPP_PROTOCOL_KEY, *fProfile, parameter,
&index); index++)
if(!LoadProtocolSettings(parameter))
return false;
// error: some protocol did not accept its settings
if(fProtocolsView)
fProtocolsView->Reload();
// reload new settings
return true;
}
bool
ProtocolsAddon::LoadProtocolSettings(const BMessage& parameter)
{
// TODO: Maybe we should only load the first add-on because we cannot know
// whether the settings are acceptable for all listed protocols.
// In addition to this, maybe the protocol itself chose this format because
// it consists of two modules.
// get protocols and ask them to load their settings
BString name;
for(int32 index = 0; parameter.FindString(MDSU_VALUES, index, &name) == B_OK;
index++) {
DialUpAddon *protocol;
if(!GetProtocol(name, &protocol))
return false;
// fatal error: we do not know how to handle this protocol
if(!protocol->LoadSettings(fSettings, fProfile, false))
return false;
// error: protocol did not accept its settings
fSettings->AddPointer(PROTOCOLS_TAB_PROTOCOLS, protocol);
++fProtocolsCount;
}
return true;
}
bool
ProtocolsAddon::HasTemporaryProfile() const
{
if(!fProtocolsView)
return false;
DialUpAddon *protocol;
for(int32 index = 0; index < fProtocolsView->CountProtocols(); index++) {
protocol = fProtocolsView->ProtocolAt(index);
if(protocol && protocol->HasTemporaryProfile())
return true;
}
return false;
}
void
ProtocolsAddon::IsModified(bool& settings, bool& profile) const
{
settings = profile = false;
if(!fSettings || !fProtocolsView)
return;
if(CountProtocols() != fProtocolsView->CountProtocols()) {
settings = profile = true;
return;
}
DialUpAddon *protocol;
bool protocolSettingsChanged, protocolProfileChanged;
// for current protocol
for(int32 index = 0; fSettings->FindPointer(PROTOCOLS_TAB_PROTOCOLS, index,
reinterpret_cast<void**>(&protocol)) == B_OK; index++) {
if(!protocol->KernelModuleName() // this is actually an error
|| !fProtocolsView->HasProtocol(protocol->KernelModuleName())) {
settings = profile = true;
return;
}
protocol->IsModified(protocolSettingsChanged, protocolProfileChanged);
if(protocolSettingsChanged)
settings = true;
if(protocolProfileChanged)
profile = true;
}
}
bool
ProtocolsAddon::SaveSettings(BMessage *settings, BMessage *profile, bool saveTemporary)
{
if(!fSettings || !settings)
return false;
DialUpAddon *protocol;
for(int32 index = 0; index < fProtocolsView->CountProtocols(); index++) {
protocol = fProtocolsView->ProtocolAt(index);
if(!protocol->SaveSettings(settings, profile, saveTemporary))
return false;
}
return true;
}
bool
ProtocolsAddon::GetPreferredSize(float *width, float *height) const
{
BRect rect;
if(Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect) != B_OK)
rect.Set(0, 0, 200, 300);
// set default values
if(width)
*width = rect.Width();
if(height)
*height = rect.Height();
return true;
}
BView*
ProtocolsAddon::CreateView(BPoint leftTop)
{
if(!fProtocolsView) {
BRect rect;
Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect);
fProtocolsView = new ProtocolsView(this, rect);
}
fProtocolsView->MoveTo(leftTop);
fProtocolsView->Reload();
return fProtocolsView;
}
bool
ProtocolsAddon::GetProtocol(const BString& moduleName, DialUpAddon **protocol) const
{
if(!protocol)
return false;
for(int32 index = 0; Addons()->FindPointer(DUN_PROTOCOL_ADDON_TYPE, index,
reinterpret_cast<void**>(protocol)) == B_OK; index++)
if((*protocol)->KernelModuleName()
&& moduleName == (*protocol)->KernelModuleName())
return true;
return false;
}
// we need a simple BListItem that can hold a pointer to the DialUpAddon it represents
class AddonItem : public BStringItem {
public:
AddonItem(const char *label, DialUpAddon *addon) : BStringItem(label),
fAddon(addon) {}
DialUpAddon *Addon() const
{ return fAddon; }
private:
DialUpAddon *fAddon;
};
ProtocolsView::ProtocolsView(ProtocolsAddon *addon, BRect frame)
: BView(frame, "Protocols", B_FOLLOW_NONE, 0),
fAddon(addon)
{
BRect rect = Bounds();
rect.InsetBy(10, 10);
rect.bottom = 200;
BRect listViewRect(rect);
listViewRect.right -= B_V_SCROLL_BAR_WIDTH;
fListView = new BListView(listViewRect, "Protocols");
fListView->SetInvocationMessage(new BMessage(MSG_SHOW_PREFERENCES));
fListView->SetSelectionMessage(new BMessage(MSG_UPDATE_BUTTONS));
rect.top = rect.bottom + 10;
rect.bottom = rect.top + 25;
float buttonWidth = (rect.Width() - 20) / 3;
rect.right = rect.left + buttonWidth;
fAddButton = new BButton(rect, "AddButton", "Add Protocol",
new BMessage(MSG_ADD_PROTOCOL));
rect.left = rect.right + 10;
rect.right = rect.left + buttonWidth;
fRemoveButton = new BButton(rect, "RemoveButton", "Remove",
new BMessage(MSG_REMOVE_PROTOCOL));
rect.left = rect.right + 10;
rect.right = rect.left + buttonWidth;
fPreferencesButton = new BButton(rect, "PreferencesButton", "Preferences",
new BMessage(MSG_SHOW_PREFERENCES));
AddChild(new BScrollView("ScrollView", fListView, B_FOLLOW_NONE, 0, false, true));
AddChild(fAddButton);
AddChild(fRemoveButton);
AddChild(fPreferencesButton);
fProtocolsMenu = new BPopUpMenu("UnregisteredProtocols", false, false);
AddAddonsToMenu(Addon()->Addons(), fProtocolsMenu, DUN_PROTOCOL_ADDON_TYPE, 0);
}
ProtocolsView::~ProtocolsView()
{
delete fProtocolsMenu;
AddonItem *item;
while(fListView->CountItems() > 0) {
item = dynamic_cast<AddonItem*>(fListView->RemoveItem((int32) 0));
delete item;
}
}
void
ProtocolsView::Reload()
{
// move all protocols back to the menu
while(CountProtocols() > 0)
UnregisterProtocol(0);
if(!Addon()->Settings())
return;
// move all registered protocols to the list
DialUpAddon *protocol;
for(int32 index = 0; Addon()->Settings()->FindPointer(PROTOCOLS_TAB_PROTOCOLS,
index, reinterpret_cast<void**>(&protocol)) == B_OK; index++)
RegisterProtocol(protocol);
fListView->Select(0);
UpdateButtons();
}
void
ProtocolsView::AttachedToWindow()
{
SetViewColor(Parent()->ViewColor());
fListView->SetTarget(this);
fAddButton->SetTarget(this);
fRemoveButton->SetTarget(this);
fPreferencesButton->SetTarget(this);
}
void
ProtocolsView::MessageReceived(BMessage *message)
{
switch(message->what) {
case MSG_ADD_PROTOCOL: {
BMenuItem *selected = fProtocolsMenu->Go(fAddButton->ConvertToScreen(
fAddButton->Bounds().RightTop()));
RegisterProtocol(fProtocolsMenu->IndexOf(selected));
UpdateButtons();
} break;
case MSG_REMOVE_PROTOCOL: {
AddonItem *selected = dynamic_cast<AddonItem*>(
fListView->RemoveItem(fListView->CurrentSelection()));
UnregisterProtocol(fListView->IndexOf(selected));
UpdateButtons();
} break;
case MSG_SHOW_PREFERENCES: {
AddonItem *selected = dynamic_cast<AddonItem*>(
fListView->ItemAt(fListView->CurrentSelection()));
if(selected) {
DialUpAddon *addon = selected->Addon();
addon->CreateView(ConvertToScreen(Bounds().LeftTop()));
// show the preferences window
}
} break;
case MSG_UPDATE_BUTTONS:
UpdateButtons();
break;
default:
BView::MessageReceived(message);
}
}
DialUpAddon*
ProtocolsView::ProtocolAt(int32 index) const
{
AddonItem *item = dynamic_cast<AddonItem*>(fListView->ItemAt(index));
if(item)
return item->Addon();
return NULL;
}
bool
ProtocolsView::HasProtocol(const BString& moduleName) const
{
AddonItem *item;
for(int32 index = 0; index < CountProtocols(); index++) {
item = dynamic_cast<AddonItem*>(fListView->ItemAt(index));
if(item && moduleName == item->Addon()->KernelModuleName())
return true;
}
return false;
}
void
ProtocolsView::RegisterProtocol(const DialUpAddon *protocol)
{
if(!protocol)
return;
DialUpAddon *addon;
BMenuItem *item;
for(int32 index = 0; index < fProtocolsMenu->CountItems(); index++) {
item = fProtocolsMenu->ItemAt(index);
if(item && item->Message()->FindPointer("Addon",
reinterpret_cast<void**>(addon)) == B_OK && addon == protocol) {
RegisterProtocol(index);
return;
}
}
}
void
ProtocolsView::RegisterProtocol(int32 index)
{
DialUpAddon *addon;
BMenuItem *remove = fProtocolsMenu->ItemAt(index);
if(!remove || remove->Message()->FindPointer("Addon",
reinterpret_cast<void**>(addon)) != B_OK)
return;
const char *label = remove->Label();
AddonItem *item = new AddonItem(label, addon);
index = FindNextListInsertionIndex(fListView, label);
fListView->AddItem(item, index);
fProtocolsMenu->RemoveItem(remove);
delete remove;
}
void
ProtocolsView::UnregisterProtocol(int32 index)
{
AddonItem *remove = dynamic_cast<AddonItem*>(fListView->ItemAt(index));
if(!remove)
return;
const char *label = remove->Text();
BMessage *message = new BMessage(MSG_ADD_PROTOCOL);
// the 'what' field is merely set to get around the compiler warning
message->AddPointer("Addon", remove->Addon());
BMenuItem *item = new BMenuItem(label, message);
index = FindNextMenuInsertionIndex(fProtocolsMenu, label);
fProtocolsMenu->AddItem(item, index);
delete remove;
}
void
ProtocolsView::UpdateButtons()
{
if(fProtocolsMenu->CountItems() == 0)
fAddButton->SetEnabled(false);
else
fAddButton->SetEnabled(true);
if(CountProtocols() == 0)
fRemoveButton->SetEnabled(false);
else
fRemoveButton->SetEnabled(true);
AddonItem *item = dynamic_cast<AddonItem*>(fListView->ItemAt(
fListView->CurrentSelection()));
float width, height;
if(!item || !item->Addon()->GetPreferredSize(&width, &height))
fPreferencesButton->SetEnabled(false);
else
fPreferencesButton->SetEnabled(true);
}

View File

@ -0,0 +1,100 @@
//-----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//
// Copyright (c) 2003-2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
//-----------------------------------------------------------------------
// ProtocolsAddon saves the loaded settings.
// ProtocolsView saves the current settings.
//-----------------------------------------------------------------------
#ifndef _PROTOCOLS_ADDON__H
#define _PROTOCOLS_ADDON__H
#include <DialUpAddon.h>
#include <ListView.h>
#include <String.h>
class ProtocolsView;
class ProtocolsAddon : public DialUpAddon {
public:
ProtocolsAddon(BMessage *addons);
virtual ~ProtocolsAddon();
bool IsNew() const
{ return fIsNew; }
int32 CountProtocols() const
{ return fProtocolsCount; }
BMessage *Settings() const
{ return fSettings; }
BMessage *Profile() const
{ return fProfile; }
virtual int32 Position() const
{ return 10; }
virtual bool LoadSettings(BMessage *settings, BMessage *profile, bool isNew);
bool LoadProtocolSettings(const BMessage& parameter);
virtual bool HasTemporaryProfile() const;
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 GetProtocol(const BString& moduleName, DialUpAddon **protocol) const;
private:
bool fIsNew;
int32 fProtocolsCount;
BMessage *fSettings, *fProfile;
// saves last settings state
ProtocolsView *fProtocolsView;
};
class ProtocolsView : public BView {
public:
ProtocolsView(ProtocolsAddon *addon, BRect frame);
virtual ~ProtocolsView();
ProtocolsAddon *Addon() const
{ return fAddon; }
void Reload();
bool HasTemporaryProfile() const;
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage *message);
int32 CountProtocols() const
{ return fListView->CountItems(); }
DialUpAddon *ProtocolAt(int32 index) const;
bool HasProtocol(const BString& moduleName) const;
private:
void RegisterProtocol(const DialUpAddon *protocol);
void RegisterProtocol(int32 index);
// moves the protocol from the pop-up menu to the list view
void UnregisterProtocol(int32 index);
// moves the protocol from the list view to the pop-up menu
void UpdateButtons();
// enables/disables buttons depending on the current state
private:
ProtocolsAddon *fAddon;
BButton *fAddButton, *fRemoveButton, *fPreferencesButton;
BListView *fListView;
BPopUpMenu *fProtocolsMenu;
};
#endif

View File

@ -1,12 +1,13 @@
Short-term TODOs:
- see if we can reuse some code from the original DUN preflet
- add "Protocols" tab
- add "Extras" tab for changing dial-behaviour (auto-redial, dial-on-demand, etc.)
- add "Revert Changes" button
- load add-ons
- write IP (IPCP) protocol add-on
- move DEVNOTES into a doxygen file and document the rest of the API
- use dynamic window positioning based on screen size instead of static coordinates
- really delete interface description files when removing an interface
- open dialog asking for interface name when creating a new interface
Long-term TODOs:
- allow selecting multiple authenticators
- (maybe) allow selecting multiple authenticators (in expert-mode)