Componentes.Terceros.jvcl/official/3.32/run/JvDBLogonDialogOdac.pas

511 lines
19 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvDBLogonDialogOdac.pas, released on 2006-07-21.
The Initial Developer of the Original Code is Jens Fudickar
All Rights Reserved.
Contributor(s):
Jens Fudickar
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvDBLogonDialogOdac.pas 11201 2007-03-04 19:43:11Z jfudickar $
unit JvDBLogonDialogOdac;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Classes, Forms, Controls, DBAccess, Ora,
JvBaseDlg, JvAppStorage, JvBaseDBLogonDialog,
JvDynControlEngine, JvBaseDBPasswordDialog, JvDynControlEngineIntf;
type
TJvDBOdacLogonDialogOptions = class(TJvBaseDBOracleLogonDialogOptions)
private
FShowNetOption: Boolean;
FShowOracleHome: Boolean;
public
constructor Create; override;
published
property AllowPasswordChange default True;
property PasswordDialogOptions;
property ShowNetOption: Boolean read FShowNetOption write FShowNetOption default True;
property ShowOracleHome: Boolean read FShowOracleHome write FShowOracleHome default False;
end;
TJvDBOdacLogonDialog = class(TJvBaseDBOracleLogonDialog)
private
FOraSession: TOraSession;
INetOptionCheckBox: IJvDynControlCheckBox;
IOracleHomeEditData: IJvDynControlData;
NetOptionCheckBox: TWinControl;
OracleHomeEdit: TWinControl;
OracleHomePanel: TWinControl;
function GetOptions: TJvDBOdacLogonDialogOptions;
function GetOraSession: TOraSession;
function GetSession: TCustomDAConnection;
procedure SetOptions(const Value: TJvDBOdacLogonDialogOptions);
procedure SetSession(const Value: TCustomDAConnection); reintroduce;
protected
procedure CreateAdditionalConnectDialogControls(AOwner: TComponent;
AParentControl: TWinControl); override;
procedure CreateFormControls(AForm: TForm); override;
function CreatePasswordChangeDialog: TJvBaseDBPasswordDialog; override;
procedure FillDatabaseComboBoxDefaultValues(Items: TStrings); override;
{ Retrieve the class that holds the storage options and format settings. }
class function GetDBLogonDialogOptionsClass: TJvBaseDBLogonDialogOptionsClass; override;
procedure HandleExpiredPassword(const ErrorMessage: string);
procedure ResizeFormControls; override;
procedure TransferConnectionInfoFromDialog(ConnectionInfo: TJvBaseConnectionInfo); override;
procedure TransferConnectionInfoToDialog(ConnectionInfo: TJvBaseConnectionInfo); override;
procedure TransferSessionDataFromConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo); override;
procedure TransferSessionDataToConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo); override;
property OraSession: TOraSession read GetOraSession;
public
procedure ClearControlInterfaceObjects; override;
procedure ConnectSession; override;
function SessionIsConnected: Boolean; override;
published
property Options: TJvDBOdacLogonDialogOptions read GetOptions write SetOptions;
property Session: TCustomDAConnection read GetSession write SetSession;
end;
TJvDBOdacConnectDialog = class(TCustomConnectDialog)
private
FLogonDialogInternal: TJvDBOdacLogonDialog;
FOnFillDatabaseList: TJvLogonDialogFillListEvent;
function GetAfterTransferSessionDataToConnectionInfo:
TJvLogonDialogConnectionInfoEvent;
function GetAppStorage: TJvCustomAppStorage;
function GetAppStoragePath: string;
function GetBeforeTransferConnectionInfoToSessionData:
TJvLogonDialogConnectionInfoEvent;
function GetDynControlEngine: TJvDynControlEngine;
function GetOnDecryptPassword: TJvLogonDialogEncryptDecryptEvent;
function GetOnEncryptPassword: TJvLogonDialogEncryptDecryptEvent;
function GetOnFillShortcutList: TJvLogonDialogFillListEvent;
function GetOnSessionConnect: TJvLogonDialogBaseSessionEvent;
function GetOptions: TJvDBOdacLogonDialogOptions;
procedure SetAfterTransferSessionDataToConnectionInfo(const Value: TJvLogonDialogConnectionInfoEvent);
procedure SetBeforeTransferConnectionInfoToSessionData(const Value: TJvLogonDialogConnectionInfoEvent);
procedure SetDynControlEngine(const Value: TJvDynControlEngine);
procedure SetOnDecryptPassword(const Value: TJvLogonDialogEncryptDecryptEvent);
procedure SetOnEncryptPassword(const Value: TJvLogonDialogEncryptDecryptEvent);
procedure SetOnFillShortcutList(const Value: TJvLogonDialogFillListEvent);
procedure SetOnSessionConnect(const Value: TJvLogonDialogBaseSessionEvent);
procedure SetOptions(const Value: TJvDBOdacLogonDialogOptions);
protected
procedure SetAppStorage(Value: TJvCustomAppStorage);
procedure SetAppStoragePath(Value: string); virtual;
property LogonDialogInternal: TJvDBOdacLogonDialog read FLogonDialogInternal write FLogonDialogInternal;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Execute: Boolean; override;
published
procedure InternalFillDatabaseList(List: TStringList);
//1 This events gives you the possibility to modify the connection data after receiving the data from the current session
property AfterTransferSessionDataToConnectionInfo: TJvLogonDialogConnectionInfoEvent read
GetAfterTransferSessionDataToConnectionInfo write SetAfterTransferSessionDataToConnectionInfo;
property AppStorage: TJvCustomAppStorage read GetAppStorage write SetAppStorage;
property AppStoragePath: string read GetAppStoragePath write SetAppStoragePath;
//1 This Event gives you the possibility to modify the connection data before it is transfered to the current session
property BeforeTransferConnectionInfoToSessionData: TJvLogonDialogConnectionInfoEvent read
GetBeforeTransferConnectionInfoToSessionData write SetBeforeTransferConnectionInfoToSessionData;
property DynControlEngine: TJvDynControlEngine read GetDynControlEngine write
SetDynControlEngine;
property Options: TJvDBOdacLogonDialogOptions read GetOptions write SetOptions;
property OnDecryptPassword: TJvLogonDialogEncryptDecryptEvent read
GetOnDecryptPassword write SetOnDecryptPassword;
property OnEncryptPassword: TJvLogonDialogEncryptDecryptEvent read
GetOnEncryptPassword write SetOnEncryptPassword;
//1 Event for filling the database list
property OnFillDatabaseList: TJvLogonDialogFillListEvent read
FOnFillDatabaseList write FOnFillDatabaseList;
//1 Event for customizing the shortcut list
property OnFillShortcutList: TJvLogonDialogFillListEvent read GetOnFillShortcutList write SetOnFillShortcutList;
property OnSessionConnect: TJvLogonDialogBaseSessionEvent read
GetOnSessionConnect write SetOnSessionConnect;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvDBLogonDialogOdac.pas $';
Revision: '$Revision: 11201 $';
Date: '$Date: 2007-03-04 20:43:11 +0100 (dim., 04 mars 2007) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
SysUtils, StdCtrls, Dialogs,
OraClasses, OraError,
JvDSADialogs, JvDBPasswordDialogOdac, JvResources;
//=== { TJvDBOdacLogonDialogOptions } ========================================
constructor TJvDBOdacLogonDialogOptions.Create;
begin
inherited Create;
FShowNetOption := True;
AllowPasswordChange := True;
FShowOracleHome := False;
end;
//=== { TJvDBOdacConnectDialog } =============================================
constructor TJvDBOdacConnectDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FLogonDialogInternal := TJvDBOdacLogonDialog.Create(Self);
FLogonDialogInternal.OnFillDatabaseList := InternalFillDatabaseList;
end;
destructor TJvDBOdacConnectDialog.Destroy;
begin
FreeAndNil(FLogonDialogInternal);
inherited Destroy;
end;
function TJvDBOdacConnectDialog.Execute: Boolean;
begin
if Assigned(FLogonDialogInternal) then
begin
LogonDialogInternal.Session := Connection;
Result := LogonDialogInternal.Execute;
end
else
Result := False;
end;
function TJvDBOdacConnectDialog.GetAfterTransferSessionDataToConnectionInfo: TJvLogonDialogConnectionInfoEvent;
begin
Result := LogonDialogInternal.AfterTransferSessionDataToConnectionInfo;
end;
function TJvDBOdacConnectDialog.GetAppStorage: TJvCustomAppStorage;
begin
Result := LogonDialogInternal.AppStorage;
end;
function TJvDBOdacConnectDialog.GetAppStoragePath: string;
begin
Result := LogonDialogInternal.AppStoragePath;
end;
function TJvDBOdacConnectDialog.GetBeforeTransferConnectionInfoToSessionData: TJvLogonDialogConnectionInfoEvent;
begin
Result := LogonDialogInternal.BeforeTransferConnectionInfoToSessionData;
end;
function TJvDBOdacConnectDialog.GetDynControlEngine: TJvDynControlEngine;
begin
Result := LogonDialogInternal.DynControlEngine
end;
function TJvDBOdacConnectDialog.GetOnDecryptPassword: TJvLogonDialogEncryptDecryptEvent;
begin
Result := LogonDialogInternal.OnDecryptPassword;
end;
function TJvDBOdacConnectDialog.GetOnEncryptPassword: TJvLogonDialogEncryptDecryptEvent;
begin
Result := LogonDialogInternal.OnEncryptPassword;
end;
function TJvDBOdacConnectDialog.GetOnFillShortcutList: TJvLogonDialogFillListEvent;
begin
Result := LogonDialogInternal.OnFillShortcutList;
end;
function TJvDBOdacConnectDialog.GetOnSessionConnect:
TJvLogonDialogBaseSessionEvent;
begin
Result := LogonDialogInternal.OnSessionConnect;
end;
function TJvDBOdacConnectDialog.GetOptions: TJvDBOdacLogonDialogOptions;
begin
Result := LogonDialogInternal.Options
end;
procedure TJvDBOdacConnectDialog.InternalFillDatabaseList(List: TStringList);
begin
GetServerList(List);
if Assigned(OnFillDatabaseList) then
OnFillDatabaseList(List);
end;
procedure TJvDBOdacConnectDialog.SetAfterTransferSessionDataToConnectionInfo(
const Value: TJvLogonDialogConnectionInfoEvent);
begin
LogonDialogInternal.AfterTransferSessionDataToConnectionInfo := Value;
end;
procedure TJvDBOdacConnectDialog.SetAppStorage(Value: TJvCustomAppStorage);
begin
LogonDialogInternal.AppStorage := Value;
end;
procedure TJvDBOdacConnectDialog.SetAppStoragePath(Value: string);
begin
LogonDialogInternal.AppStoragePath := Value;
end;
procedure TJvDBOdacConnectDialog.SetBeforeTransferConnectionInfoToSessionData(
const Value: TJvLogonDialogConnectionInfoEvent);
begin
LogonDialogInternal.BeforeTransferConnectionInfoToSessionData := Value;
end;
procedure TJvDBOdacConnectDialog.SetDynControlEngine(const Value: TJvDynControlEngine);
begin
LogonDialogInternal.DynControlEngine := Value;
end;
procedure TJvDBOdacConnectDialog.SetOnDecryptPassword(const Value: TJvLogonDialogEncryptDecryptEvent);
begin
LogonDialogInternal.OnDecryptPassword := Value;
end;
procedure TJvDBOdacConnectDialog.SetOnEncryptPassword(const Value: TJvLogonDialogEncryptDecryptEvent);
begin
LogonDialogInternal.OnEncryptPassword := Value;
end;
procedure TJvDBOdacConnectDialog.SetOnFillShortcutList(const Value: TJvLogonDialogFillListEvent);
begin
LogonDialogInternal.OnFillShortcutList := Value;
end;
procedure TJvDBOdacConnectDialog.SetOnSessionConnect(const Value:
TJvLogonDialogBaseSessionEvent);
begin
LogonDialogInternal.OnSessionConnect:= Value;
end;
procedure TJvDBOdacConnectDialog.SetOptions(const Value: TJvDBOdacLogonDialogOptions);
begin
LogonDialogInternal.Options.Assign(Value);
end;
procedure TJvDBOdacLogonDialog.ClearControlInterfaceObjects;
begin
inherited ClearControlInterfaceObjects;
INetOptionCheckBox:= nil;
IOracleHomeEditData:= nil;
end;
procedure TJvDBOdacLogonDialog.ConnectSession;
begin
if Assigned(Session) then
try
Session.DisConnect;
Session.PerformConnect;
except
on E: EOraError do
begin
case E.ErrorCode of
1005, 1017:
ActivatePasswordControl;
12203, 12154:
ActivateDatabaseControl;
end;
if (E.ErrorCode = 28001) or (E.ErrorCode = 28002) or (E.ErrorCode = 28011) then
HandleExpiredPassword(E.Message)
else
JVDsaDialogs.MessageDlg(E.Message, mtError, [mbok], 0, dckScreen,
0, mbDefault, mbDefault, mbDefault, DynControlEngine);
end;
end;
end;
procedure TJvDBOdacLogonDialog.CreateAdditionalConnectDialogControls(AOwner: TComponent;
AParentControl: TWinControl);
var
LabelControl: TControl;
IDynControlLabel: IJvDynControlLabel;
begin
inherited CreateAdditionalConnectDialogControls (AOwner, AParentControl);
OracleHomePanel := DynControlEngine.CreatePanelControl(AOwner, AParentControl, 'OracleHomePanel', '', alTop);
OracleHomePanel.Align := alTop;
LabelControl := DynControlEngine.CreateLabelControl(AOwner, OracleHomePanel, 'OracleHomeLabel', RsOracleHome, nil);
LabelControl.Align := alTop;
OracleHomeEdit := DynControlEngine.CreateEditControl(AOwner, OracleHomePanel, 'OracleHomeEdit');
Supports(OracleHomeEdit, IJvDynControlData, IOracleHomeEditData);
OracleHomeEdit.Align := alTop;
if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then
IDynControlLabel.ControlSetFocusControl(OracleHomeEdit);
OracleHomePanel.Visible := Options.ShowOracleHome;
NetOptionCheckBox := DynControlEngine.CreateCheckboxControl(AOwner,AParentControl, 'NetOptionCheckBox',
RsUseNetOptionForDirectConnect);
NetOptionCheckBox.Align := alTop;
NetOptionCheckBox.Visible := Options.ShowNetOption;
Supports(NetOptionCheckBox, IJvDynControlCheckBox, INetOptionCheckBox);
NetOptionCheckBox.Hint := RsNetOptionCheckBoxHint;
end;
procedure TJvDBOdacLogonDialog.CreateFormControls(AForm: TForm);
begin
inherited CreateFormControls(AForm);
end;
function TJvDBOdacLogonDialog.CreatePasswordChangeDialog:
TJvBaseDBPasswordDialog;
begin
Result := TJvDBOdacPasswordDialog.Create(Self);
end;
procedure TJvDBOdacLogonDialog.FillDatabaseComboBoxDefaultValues(Items: TStrings);
begin
end;
class function TJvDBOdacLogonDialog.GetDBLogonDialogOptionsClass: TJvBaseDBLogonDialogOptionsClass;
begin
Result := TJvDBOdacLogonDialogOptions;
end;
function TJvDBOdacLogonDialog.GetOptions: TJvDBOdacLogonDialogOptions;
begin
Result := TJvDBOdacLogonDialogOptions(inherited Options);
end;
function TJvDBOdacLogonDialog.GetOraSession: TOraSession;
begin
Result := FOraSession;
end;
function TJvDBOdacLogonDialog.GetSession: TCustomDAConnection;
begin
Result := TCustomDAConnection(inherited Session);
end;
procedure TJvDBOdacLogonDialog.HandleExpiredPassword(const ErrorMessage: string);
begin
if JVDsaDialogs.MessageDlg(ErrorMessage + #13#10 + RsDoYouWantToChangePassword,
mtInformation, [mbYes, mbNo], 0, dckScreen,
0, mbDefault, mbDefault, mbDefault, DynControlEngine) = mrYes then
if ChangePassword then
if not SessionIsConnected then
Session.PerformConnect;
end;
procedure TJvDBOdacLogonDialog.ResizeFormControls;
begin
inherited ResizeFormControls;
OracleHomePanel.Height := CalculatePanelHeight(OracleHomeEdit);
end;
function TJvDBOdacLogonDialog.SessionIsConnected: Boolean;
begin
Result := Session.Connected;
end;
procedure TJvDBOdacLogonDialog.SetOptions(const Value: TJvDBOdacLogonDialogOptions);
begin
(inherited Options).Assign(Value);
end;
procedure TJvDBOdacLogonDialog.SetSession(const Value: TCustomDAConnection);
begin
inherited SetSession(Value);
if Value is TOraSession then
FOraSession := TOraSession(Value)
else
FORaSession := nil;
end;
procedure TJvDBOdacLogonDialog.TransferConnectionInfoFromDialog(ConnectionInfo: TJvBaseConnectionInfo);
begin
inherited TransferConnectionInfoFromDialog(ConnectionInfo);
end;
procedure TJvDBOdacLogonDialog.TransferConnectionInfoToDialog(ConnectionInfo: TJvBaseConnectionInfo);
begin
inherited TransferConnectionInfoToDialog(ConnectionInfo);
end;
procedure TJvDBOdacLogonDialog.TransferSessionDataFromConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo);
begin
if Assigned(Session) then
begin
Session.Server := ConnectionInfo.Database;
Session.Password := ConnectionInfo.Password;
Session.Username := ConnectionInfo.Username;
if Assigned(OraSession) and (ConnectionInfo is TJvBaseOracleConnectionInfo) then
begin
if TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs = 'SYSDBA' then
OraSession.ConnectMode := cmSYSDBA
else
if TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs = 'SYSOPER' then
OraSession.ConnectMode := cmSYSOper
else
OraSession.ConnectMode := cmNormal;
if Options.ShowNetOption and Assigned(INetOptionCheckBox) then
OraSession.Options.Net := INetOptionCheckBox.ControlState = cbChecked;
if Options.ShowNetOption and Assigned(IOracleHomeEditData) then
OraSession.HomeName := IOracleHomeEditData.ControlValue;
end;
end;
end;
procedure TJvDBOdacLogonDialog.TransferSessionDataToConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo);
begin
if Assigned(Session) then
begin
ConnectionInfo.Database := Session.Server;
ConnectionInfo.Password := Session.Password;
ConnectionInfo.Username := Session.Username;
if Assigned(OraSession) and (ConnectionInfo is TJvBaseOracleConnectionInfo) then
begin
case OraSession.ConnectMode of
cmSYSDBA:
TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs := 'SYSDBA';
cmSYSOPER:
TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs := 'SYSOPER';
else
TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs := 'NORMAL';
end;
if Options.ShowNetOption and Assigned (INetOptionCheckBox) then
if OraSession.Options.Net then
INetOptionCheckBox.ControlState := cbChecked
else
INetOptionCheckBox.ControlState := cbUnChecked;
if Options.ShowNetOption and Assigned (IOracleHomeEditData) then
IOracleHomeEditData.ControlValue := OraSession.HomeName;
end;
end;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.