|
|
|
|
Saving TAdModem ConfigurationsThe TAdModem component provides a large list of modems and many options for configuring and selecting modems. However, loading and saving the modem configuration is not completely obvious. The SelectModem method in the TApdModem class is used to select the modem that is used. By default, this will prompt the user for the manufacturer and model of their modem. This method can also be used to load the modem configuration without prompting the user. If the modem manufacturer and name as well as the name of the XML file containing the modem details are specified in the SelectedDevice property before SelectModem is called, SelectModem will load the modem details without prompting the user. The GetDevConfig and SetDevConfig provide access to the modem configuration (parity, stop bits, and related values). This information should also be saved with the modem configuration. The following code shows a simple means of saving the modem selection and configuration to an INI file. The saving code is pretty straightforward. It reads the information in the SelectedDevice property and the result of the GetDevConfig method and writes that information to the INIFile. In Delphi procedure SaveModemConfiguration (FileName : string; Modem : TAdModem); var INIFile : TINIFile; ModemConfig : TApdModemConfig; begin INIFile := TINIFile.Create (FileName); try { Save the current modem } INIFile.WriteString ('Modem', 'File', Modem.SelectedDevice.ModemFile); INIFile.WriteString ('Modem', 'Manufacturer', Modem.SelectedDevice.Manufacturer); INIFile.WriteString ('Modem', 'Name', Modem.SelectedDevice.Name); { Get the modem configuration } ModemConfig := Modem.GetDevConfig; { Save the modem configuration } INIFile.WriteString ('Settings', 'ComPort', ModemConfig.AttachedTo); INIFile.WriteInteger ('Settings', 'DataBits', ModemConfig.DataBits); case ModemConfig.Parity of pEven : INIFile.WriteString ('Settings', 'Parity', 'Even'); pOdd : INIFile.WriteString ('Settings', 'Parity', 'Odd'); pMark : INIFile.WriteString ('Settings', 'Parity', 'Mark'); pSpace : INIFile.WriteString ('Settings', 'Parity', 'Space'); pNone : INIFile.WriteString ('Settings', 'Parity', 'None'); end; INIFile.WriteInteger ('Settings', 'StopBits', ModemConfig.StopBits); case ModemConfig.SpeakerVolume of svLow : INIFile.WriteString ('Settings', 'SpeakerVolume', 'Low'); svHigh : INIFile.WriteString ('Settings', 'SpeakerVolume', 'High'); svMed : INIFile.WriteString ('Settings', 'SpeakerVolume', 'Med'); end; case ModemConfig.SpeakerMode of smOff : INIFile.WriteString ('Settings', 'SpeakerMode', 'Off'); smOn : INIFile.WriteString ('Settings', 'SpeakerMode', 'On'); smDial : INIFile.WriteString ('Settings', 'SpeakerMode', 'Dial'); end; case ModemConfig.FlowControl of TApdModemFlowControl (fcOff) : INIFile.WriteString ('Settings', 'FlowControl', 'Off'); fcSoft : INIFile.WriteString ('Settings', 'FlowControl', 'Soft'); fcHard : INIFile.WriteString ('Settings', 'FlowControl', 'Hard'); end; if ecOn in ModemConfig.ErrorControl then INIFile.WriteBool('Settings', 'ErrorControlOn', True); if ecOff in ModemConfig.ErrorControl then INIFile.WriteBool('Settings', 'ErrorControlOff', False); if ecForced in ModemConfig.ErrorControl then INIFile.WriteBool('Settings', 'ErrorControlForced', False); if ecCellular in ModemConfig.ErrorControl then INIFile.WriteBool('Settings', 'ErrorControlCellular', False); INIFile.WriteBool ('Settings', 'Compression', ModemConfig.Compression); case ModemConfig.Modulation of smBell : INIFile.WriteString ('Settings', 'Modulation', 'Bell'); smCCITT_V23 : INIFile.WriteString ('Settings', 'Modulation', 'CCITT_V23'); smCCITT : INIFile.WriteString ('Settings', 'Modulation', 'CCITT'); end; INIFile.WriteBool ('Settings', 'ToneDial', ModemConfig.ToneDial); INIFile.WriteBool ('Settings', 'BlindDial', ModemConfig.BlindDial); INIFile.WriteInteger ('Settings', 'CallSetupFailTimeout', ModemConfig.CallSetupFailTimeout); INIFile.WriteInteger ('Settings', 'InactivityTimeout', ModemConfig.InactivityTimeout); INIFile.WriteString ('Settings', 'ExtraSettings', ModemConfig.ExtraSettings); finally INIFile.Free; end; end; For C++ Builder void __fastcall SaveModemConfiguration (AnsiString FileName, TAdModem *Modem) { TIniFile *INIFile; TApdModemConfig ModemConfig; // Save the current modem INIFile = new TIniFile (FileName); INIFile->WriteString ("Modem", "File", Modem->SelectedDevice->ModemFile); INIFile->WriteString ("Modem", "Manufacturer", Modem->SelectedDevice->Manufacturer); INIFile->WriteString ("Modem", "Name", Modem->SelectedDevice->Name); // Get the current modem configuration ModemConfig = Modem->GetDevConfig(); // Save the configuration INIFile->WriteString ("Settings", "ComPort", ModemConfig.AttachedTo); INIFile->WriteInteger ("Settings", "DataBits", ModemConfig.DataBits); switch (ModemConfig.Parity) { case pEven : INIFile->WriteString ("Settings", "Parity", "Even"); break; case pOdd : INIFile->WriteString ("Settings", "Parity", "Odd"); break; case pMark : INIFile->WriteString ("Settings", "Parity", "Mark"); break; case pSpace : INIFile->WriteString ("Settings", "Parity", "Space"); break; case pNone : INIFile->WriteString ("Settings", "Parity", "None"); break; } INIFile->WriteInteger ("Settings", "StopBits", ModemConfig.StopBits); switch (ModemConfig.SpeakerVolume) { case svLow : INIFile->WriteString ("Settings", "SpeakerVolume", "Low"); break; case svHigh : INIFile->WriteString ("Settings", "SpeakerVolume", "High"); break; case svMed : INIFile->WriteString ("Settings", "SpeakerVolume", "Med"); break; } switch (ModemConfig.SpeakerMode) { case smOff : INIFile->WriteString ("Settings", "SpeakerMode", "Off"); break; case smOn : INIFile->WriteString ("Settings", "SpeakerMode", "On"); break; case smDial : INIFile->WriteString ("Settings", "SpeakerMode", "Dial"); break; } switch (ModemConfig.FlowControl) { case Admdm::fcOff : INIFile->WriteString ("Settings", "FlowControl", "Off"); break; case fcSoft : INIFile->WriteString ("Settings", "FlowControl", "Soft"); break; case fcHard : INIFile->WriteString ("Settings", "FlowControl", "Hard"); break; } if (ModemConfig.ErrorControl.Contains (ecOn)) INIFile->WriteBool("Settings", "ErrorControlOn", True); if (ModemConfig.ErrorControl.Contains (ecOff)) INIFile->WriteBool("Settings", "ErrorControlOff", False); if (ModemConfig.ErrorControl.Contains (ecForced)) INIFile->WriteBool("Settings", "ErrorControlForced", False); if (ModemConfig.ErrorControl.Contains (ecCellular)) INIFile->WriteBool("Settings", "ErrorControlCellular", False); INIFile->WriteBool ("Settings", "Compression", ModemConfig.Compression); switch (ModemConfig.Modulation) { case smBell : INIFile->WriteString ("Settings", "Modulation", "Bell"); break; case smCCITT_V23 : INIFile->WriteString ("Settings", "Modulation", "CCITT_V23"); break; case smCCITT : INIFile->WriteString ("Settings", "Modulation", "CCITT"); break; } INIFile->WriteBool ("Settings", "ToneDial", ModemConfig.ToneDial); INIFile->WriteBool ("Settings", "BlindDial", ModemConfig.BlindDial); INIFile->WriteInteger ("Settings", "CallSetupFailTimeout", ModemConfig.CallSetupFailTimeout); INIFile->WriteInteger ("Settings", "InactivityTimeout", ModemConfig.InactivityTimeout); INIFile->WriteString ("Settings", "ExtraSettings", ModemConfig.ExtraSettings); delete INIFile; } The following code shows how to load the information saved by SaveModemConfiguration. This is a bit more involved. There are several little things that have to be tweaked to get the modem information loaded correctly. First, the code needs to make sure that the modemcap database is set consistently in the LibModem object in the TApdModem component. The following line handles this: Modem.LibModem.LibModemPath := Modem.ModemCapFolder; Then a dummy modem configuration is set by using the.DefaultDeviceConfig method of the TAdModem component. The modem line settings (parity, error correction and the like) are loaded and a call to SetDevConfig is used to configure those settings in the AdModem component. The modem manufacturer, name and modem file is loaded from the INIFile and placed in the SelectedDevice property. This is enough information to specify the modem; a call to SelectDevice loads the modem information. The code for Delphi looks like this. procedure LoadModemConfiguration (FileName : string; Modem : TAdModem); var INIFile : TINIFile; ModemConfig : TApdModemConfig; WorkStr : string; begin { Make sure that the libmodem component can find the modem files } Modem.LibModem.LibModemPath := Modem.ModemCapFolder; { Load existing modem configuration } INIFile := TINIFile.Create (FileName); try Modem.SelectedDevice.ModemFile := INIFile.ReadString ('Modem', 'File', ''); Modem.SelectedDevice.Manufacturer := INIFile.ReadString ('Modem', 'Manufacturer', ''); Modem.SelectedDevice.Name := INIFile.ReadString ('Modem', 'Name', ''); { Set a default configuration} ModemConfig := Modem.DefaultDeviceConfig; { Load the modem configuration } ModemConfig.Manufacturer := Modem.SelectedDevice.Manufacturer; ModemConfig.ModemName := Modem.SelectedDevice.Name; ModemConfig.AttachedTo := INIFile.ReadString ('Settings', 'ComPort', 'unknown'); ModemConfig.DataBits := INIFile.ReadInteger ('Settings', 'DataBits', 8); WorkStr := INIFile.ReadString ('Settings', 'Parity', 'None'); if WorkStr = 'Even' then ModemConfig.Parity := pEven else if WorkStr = 'Odd' then ModemConfig.Parity := pOdd else if WorkStr = 'Mark' then ModemConfig.Parity := pMark else if WorkStr = 'Space' then ModemConfig.Parity := pSpace else ModemConfig.Parity := pNone; ModemConfig.StopBits := INIFile.ReadInteger ('Settings', 'StopBits', 1); WorkStr := INIFile.ReadString ('Settings', 'SpeakerVolume', 'Med'); if WorkStr = 'Low' then ModemConfig.SpeakerVolume := svLow else if WorkStr = 'High' then ModemConfig.SpeakerVolume := svHigh else ModemConfig.SpeakerVolume := svMed; WorkStr := INIFile.ReadString ('Settings', 'SpeakerMode', 'Dial'); if WorkStr = 'Off' then ModemConfig.SpeakerMode := smOff else if WorkStr = 'On' then ModemConfig.SpeakerMode := smOn else ModemConfig.SpeakerMode := smDial; WorkStr := INIFile.ReadString ('Settings', 'FlowControl', 'Hard'); if WorkStr = 'Off' then ModemConfig.FlowControl := TApdModemFlowControl (fcOff) else if WorkStr = 'Soft' then ModemConfig.FlowControl := fcSoft else ModemConfig.FlowControl := fcHard; if INIFile.ReadBool('Settings', 'ErrorControlOn', True) then ModemConfig.ErrorControl := [ecOn] else ModemConfig.ErrorControl := []; if INIFile.ReadBool('Settings', 'ErrorControlOff', False) then ModemConfig.ErrorControl := ModemConfig.ErrorControl + [ecOff]; if INIFile.ReadBool('Settings', 'ErrorControlForced', False) then ModemConfig.ErrorControl := ModemConfig.ErrorControl + [ecForced]; if INIFile.ReadBool('Settings', 'ErrorControlCellular', False) then ModemConfig.ErrorControl := ModemConfig.ErrorControl + [ecCellular]; ModemConfig.Compression := INIFile.ReadBool ('Settings', 'Compression', True); WorkStr := INIFile.ReadString ('Settings', 'Modulation', 'CCITT'); if WorkStr = 'Bell' then ModemConfig.Modulation := smBell else if WorkStr = 'CCITT_V23' then ModemConfig.Modulation := smCCITT_V23 else ModemConfig.Modulation := smCCITT; ModemConfig.ToneDial := INIFile.ReadBool ('Settings', 'ToneDial', True); ModemConfig.BlindDial := INIFile.ReadBool ('Settings', 'BlindDial', False); ModemConfig.CallSetupFailTimeout := INIFile.ReadInteger ('Settings', 'CallSetupFailTimeout', 60); ModemConfig.InactivityTimeout := INIFile.ReadInteger ('Settings', 'InactivityTimeout', 0); ModemConfig.ExtraSettings := INIFile.ReadString ('Settings', 'ExtraSettings', ''); { Store the configuration } Modem.SetDevConfig (ModemConfig); finally INIFile.Free; end; { Select the modem } { The first time through, this will prompt for the modem. If the configuration is then saved, the user will not be prompted. } Modem.SelectDevice; end; For C++ Builder: void __fastcall LoadModemConfiguration (AnsiString FileName, TAdModem *Modem) { TIniFile *INIFile; TApdModemConfig ModemConfig; AnsiString WorkStr; // Make sure that the libmodem component can find the modem files } Modem->LibModem->LibModemPath = Modem->ModemCapFolder; // Load existing modem configuration } INIFile = new TIniFile (FileName); Modem->SelectedDevice->ModemFile = INIFile->ReadString ("Modem", "File", ""); Modem->SelectedDevice->Manufacturer = INIFile->ReadString ("Modem", "Manufacturer", ""); Modem->SelectedDevice->Name = INIFile->ReadString ("Modem", "Name", ""); // Get a default configuration ModemConfig = Modem->DefaultDeviceConfig (); // Load the configuration ModemConfig.Manufacturer = Modem->SelectedDevice->Manufacturer; ModemConfig.ModemName = Modem->SelectedDevice->Name; ModemConfig.AttachedTo = INIFile->ReadString ("Settings", "ComPort", "unknown"); ModemConfig.DataBits = INIFile->ReadInteger ("Settings", "DataBits", 8); WorkStr = INIFile->ReadString ("Settings", "Parity", "None"); if (WorkStr == "Even") ModemConfig.Parity = pEven; else if (WorkStr == "Odd") ModemConfig.Parity = pOdd; else if (WorkStr == "Mark") ModemConfig.Parity = pMark; else if (WorkStr == "Space") ModemConfig.Parity = pSpace; else ModemConfig.Parity = pNone; ModemConfig.StopBits = INIFile->ReadInteger ("Settings", "StopBits", 1); WorkStr = INIFile->ReadString ("Settings", "SpeakerVolume", "Med"); if (WorkStr == "Low") ModemConfig.SpeakerVolume = svLow; else if (WorkStr == "High") ModemConfig.SpeakerVolume = svHigh; else ModemConfig.SpeakerVolume = svMed; WorkStr = INIFile->ReadString ("Settings", "SpeakerMode", "Dial"); if (WorkStr == "Off") ModemConfig.SpeakerMode = smOff; else if (WorkStr == "On") ModemConfig.SpeakerMode = smOn; else ModemConfig.SpeakerMode = smDial; WorkStr = INIFile->ReadString ("Settings", "FlowControl", "Hard"); if (WorkStr == "Off") ModemConfig.FlowControl = Admdm::fcOff; else if (WorkStr == "Soft") ModemConfig.FlowControl = fcSoft; else ModemConfig.FlowControl = fcHard; ModemConfig.ErrorControl.Clear(); if (INIFile->ReadBool("Settings", "ErrorControlOn", True)) ModemConfig.ErrorControl << ecOn; if (INIFile->ReadBool("Settings", "ErrorControlOff", False)) ModemConfig.ErrorControl << ecOff; if (INIFile->ReadBool("Settings", "ErrorControlForced", False)) ModemConfig.ErrorControl << ecForced; if (INIFile->ReadBool("Settings", "ErrorControlCellular", False)) ModemConfig.ErrorControl << ecCellular; ModemConfig.Compression = INIFile->ReadBool ("Settings", "Compression", True); WorkStr = INIFile->ReadString ("Settings", "Modulation", "CCITT"); if (WorkStr == "Bell") ModemConfig.Modulation = smBell; else if (WorkStr == "CCITT_V23") ModemConfig.Modulation = smCCITT_V23; else ModemConfig.Modulation = smCCITT; ModemConfig.ToneDial = INIFile->ReadBool ("Settings", "ToneDial", True); ModemConfig.BlindDial = INIFile->ReadBool ("Settings", "BlindDial", False); ModemConfig.CallSetupFailTimeout = INIFile->ReadInteger ("Settings", "CallSetupFailTimeout", 60); ModemConfig.InactivityTimeout = INIFile->ReadInteger ("Settings", "InactivityTimeout", 0); ModemConfig.ExtraSettings = INIFile->ReadString ("Settings", "ExtraSettings", ""); // Set the device configuration. If a configuration has not been loaded // before, this will prompt the user. Modem->SetDevConfig (ModemConfig); delete INIFile;
// Select the modem Modem->SelectDevice(); } LoadModemConfiguration can be called at any time. The first time that it is called, the user will be prompted for their modem configuration. Once this configuration has been saved by SaveModemConfiguration, the user will no longer be prompted. |
This site is not affiliated, endorsed, or otherwise associated with the
entity formerly known as
TurboPower Software. The owners and maintainers of Aprozilla.com were merely
meager employees of the aforementioned organization, providing this site out of
the pure goodness of their collective hearts.
|