1 /* 2 * Copyright 2003-2004 Waldemar Kornewald. All rights reserved. 3 * Copyright 2017 Haiku, Inc. All rights reserved. 4 * Distributed under the terms of the MIT License. 5 */ 6 7 //----------------------------------------------------------------------- 8 // ConnectionOptionsAddon saves the loaded settings. 9 // ConnectionOptionsView saves the current settings. 10 //----------------------------------------------------------------------- 11 12 #include "ConnectionOptionsAddon.h" 13 14 #include "MessageDriverSettingsUtils.h" 15 16 #include <LayoutBuilder.h> 17 18 #include <PPPDefs.h> 19 #include <settings_tools.h> 20 21 22 // message constants 23 static const uint32 kMsgUpdateControls = 'UCTL'; 24 25 // labels 26 static const char *kLabelConnectionOptions = "Options"; 27 static const char *kLabelDialOnDemand = "Connect Automatically When Needed"; 28 static const char *kLabelAskBeforeDialing = "Ask Before Dialing"; 29 static const char *kLabelAutoRedial = "Redial Automatically"; 30 31 32 ConnectionOptionsAddon::ConnectionOptionsAddon(BMessage *addons) 33 : DialUpAddon(addons), 34 fSettings(NULL), 35 fProfile(NULL), 36 fConnectionOptionsView(NULL) 37 { 38 } 39 40 41 ConnectionOptionsAddon::~ConnectionOptionsAddon() 42 { 43 } 44 45 46 bool 47 ConnectionOptionsAddon::LoadSettings(BMessage *settings, BMessage *profile, bool isNew) 48 { 49 fIsNew = isNew; 50 fDoesDialOnDemand = fAskBeforeDialing = fDoesAutoRedial = false; 51 fSettings = settings; 52 fProfile = profile; 53 54 if(fConnectionOptionsView) 55 fConnectionOptionsView->Reload(); 56 // reset all views (empty settings) 57 58 if(!settings || !profile || isNew) 59 return true; 60 61 BMessage parameter; 62 int32 index = 0; 63 const char *value; 64 /* FIXME! 65 if(FindMessageParameter(PPP_DIAL_ON_DEMAND_KEY, *fSettings, ¶meter, &index) 66 && parameter.FindString(MDSU_VALUES, &value) == B_OK) { 67 if(get_boolean_value(value, false)) 68 fDoesDialOnDemand = true; 69 70 parameter.AddBool(MDSU_VALID, true); 71 fSettings->ReplaceMessage(MDSU_PARAMETERS, index, ¶meter); 72 } 73 74 index = 0; 75 if(FindMessageParameter(PPP_ASK_BEFORE_DIALING_KEY, *fSettings, ¶meter, &index) 76 && parameter.FindString(MDSU_VALUES, &value) == B_OK) { 77 if(get_boolean_value(value, false)) 78 fAskBeforeDialing = true; 79 80 parameter.AddBool(MDSU_VALID, true); 81 fSettings->ReplaceMessage(MDSU_PARAMETERS, index, ¶meter); 82 } 83 84 index = 0; 85 if(FindMessageParameter(PPP_AUTO_REDIAL_KEY, *fSettings, ¶meter, &index) 86 && parameter.FindString(MDSU_VALUES, &value) == B_OK) { 87 if(get_boolean_value(value, false)) 88 fDoesAutoRedial = true; 89 90 parameter.AddBool(MDSU_VALID, true); 91 fSettings->ReplaceMessage(MDSU_PARAMETERS, index, ¶meter); 92 } 93 */ 94 95 if(fConnectionOptionsView) 96 fConnectionOptionsView->Reload(); 97 // reload new settings 98 99 return true; 100 } 101 102 103 void 104 ConnectionOptionsAddon::IsModified(bool *settings, bool *profile) const 105 { 106 *settings = *profile = false; 107 108 if(!fSettings || !fConnectionOptionsView) 109 return; 110 111 *settings = DoesDialOnDemand() != fConnectionOptionsView->DoesDialOnDemand() 112 || AskBeforeDialing() != fConnectionOptionsView->AskBeforeDialing() 113 || DoesAutoRedial() != fConnectionOptionsView->DoesAutoRedial(); 114 } 115 116 117 bool 118 ConnectionOptionsAddon::SaveSettings(BMessage *settings, BMessage *profile, bool saveTemporary) 119 { 120 if(!fSettings || !settings) 121 return false; 122 123 BMessage parameter; 124 if(fConnectionOptionsView->DoesDialOnDemand()) { 125 parameter.MakeEmpty(); 126 // parameter.AddString(MDSU_NAME, PPP_DIAL_ON_DEMAND_KEY); // FIXME 127 parameter.AddString(MDSU_VALUES, "enabled"); 128 settings->AddMessage(MDSU_PARAMETERS, ¶meter); 129 130 if(fConnectionOptionsView->AskBeforeDialing()) { 131 parameter.MakeEmpty(); 132 // parameter.AddString(MDSU_NAME, PPP_ASK_BEFORE_DIALING_KEY); // FIXME 133 parameter.AddString(MDSU_VALUES, "enabled"); 134 settings->AddMessage(MDSU_PARAMETERS, ¶meter); 135 } 136 } 137 138 if(fConnectionOptionsView->DoesAutoRedial()) { 139 parameter.MakeEmpty(); 140 // parameter.AddString(MDSU_NAME, PPP_AUTO_REDIAL_KEY); // FIXME 141 parameter.AddString(MDSU_VALUES, "enabled"); 142 settings->AddMessage(MDSU_PARAMETERS, ¶meter); 143 } 144 145 return true; 146 } 147 148 149 bool 150 ConnectionOptionsAddon::GetPreferredSize(float *width, float *height) const 151 { 152 BRect rect; 153 if(Addons()->FindRect(DUN_TAB_VIEW_RECT, &rect) != B_OK) 154 rect.Set(0, 0, 200, 300); 155 // set default values 156 157 if(width) 158 *width = rect.Width(); 159 if(height) 160 *height = rect.Height(); 161 162 return true; 163 } 164 165 166 BView* 167 ConnectionOptionsAddon::CreateView() 168 { 169 if(!fConnectionOptionsView) { 170 fConnectionOptionsView = new ConnectionOptionsView(this); 171 fConnectionOptionsView->Reload(); 172 } 173 174 return fConnectionOptionsView; 175 } 176 177 178 ConnectionOptionsView::ConnectionOptionsView(ConnectionOptionsAddon *addon) 179 : BView(kLabelConnectionOptions, 0), 180 fAddon(addon) 181 { 182 fDialOnDemand = new BCheckBox("DialOnDemand", kLabelDialOnDemand, 183 new BMessage(kMsgUpdateControls)); 184 fAskBeforeDialing = new BCheckBox("AskBeforeDialing", kLabelAskBeforeDialing, 185 NULL); 186 fAutoRedial = new BCheckBox("AutoRedial", kLabelAutoRedial, NULL); 187 188 BLayoutBuilder::Group<>(this, B_VERTICAL, B_USE_HALF_ITEM_SPACING) 189 .SetInsets(B_USE_HALF_ITEM_INSETS) 190 .Add(fDialOnDemand) 191 .Add(fAskBeforeDialing) 192 .Add(fAutoRedial) 193 .AddGlue() 194 .End(); 195 } 196 197 198 void 199 ConnectionOptionsView::Reload() 200 { 201 fDialOnDemand->SetValue(Addon()->DoesDialOnDemand() || Addon()->IsNew()); 202 // this is enabled by default 203 fAskBeforeDialing->SetValue(Addon()->AskBeforeDialing()); 204 fAutoRedial->SetValue(Addon()->DoesAutoRedial()); 205 206 if(!Addon()->Settings()) 207 return; 208 209 UpdateControls(); 210 } 211 212 213 void 214 ConnectionOptionsView::AttachedToWindow() 215 { 216 SetViewColor(Parent()->ViewColor()); 217 fDialOnDemand->SetTarget(this); 218 } 219 220 221 void 222 ConnectionOptionsView::MessageReceived(BMessage *message) 223 { 224 switch(message->what) { 225 case kMsgUpdateControls: 226 UpdateControls(); 227 break; 228 229 default: 230 BView::MessageReceived(message); 231 } 232 } 233 234 235 void 236 ConnectionOptionsView::UpdateControls() 237 { 238 fAskBeforeDialing->SetEnabled(fDialOnDemand->Value()); 239 fAskBeforeDialing->SetValue(fDialOnDemand->Value()); 240 } 241