summaryrefslogtreecommitdiff
path: root/plugins/Actman/iac_ini.pas
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2014-12-19 20:02:47 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2014-12-19 20:02:47 +0000
commitf2cce78db24a0f0a53b8ca41ff112968a5f2d86b (patch)
tree5dce24a102dc4117ab993e201811948927842e47 /plugins/Actman/iac_ini.pas
parenta1ff366b1634ed741bdc764489f9e715f90900f5 (diff)
Actman 2.0 is moved to deprecated, Actman 3.0 is a new default Actman (with database settings converter from older version)
git-svn-id: http://svn.miranda-ng.org/main/trunk@11533 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Actman/iac_ini.pas')
-rw-r--r--plugins/Actman/iac_ini.pas432
1 files changed, 432 insertions, 0 deletions
diff --git a/plugins/Actman/iac_ini.pas b/plugins/Actman/iac_ini.pas
new file mode 100644
index 0000000000..03c8d7a9d6
--- /dev/null
+++ b/plugins/Actman/iac_ini.pas
@@ -0,0 +1,432 @@
+unit iac_ini;
+
+interface
+
+implementation
+
+uses
+ windows,messages,commctrl,
+ iac_global,global,
+ common,m_api,wrapper, inouttext,
+ dbsettings,editwrapper,mirutils;
+
+{$include i_cnst_ini.inc}
+{$resource iac_ini.res}
+
+const
+ opt_file :PAnsiChar = 'inifile';
+ opt_section:PAnsiChar = 'section';
+ opt_param :PAnsiChar = 'param';
+ opt_value :PAnsiChar = 'value';
+
+const
+ ACF_INI_WRITE = $00000001;
+ ACF_INI_DELETE = $00000002;
+ ACF_INI_LR = $00000004;
+ ACF_INI_UTF = $00000008;
+ ACF_INI_FILE = $00000010;
+ ACF_INI_SECTION = $00000020;
+ ACF_INI_PARAM = $00000040;
+ ACF_INI_VALUE = $00000080;
+type
+ tINIAction = class(tBaseAction)
+ private
+ inifile :pWideChar;
+ section :pWideChar;
+ parameter:pWideChar;
+ value :pWideChar;
+ public
+ constructor Create(uid:dword);
+ destructor Destroy; override;
+// function Clone:tBaseAction; override;
+ function DoAction(var WorkData:tWorkData):LRESULT; override;
+ procedure Save(node:pointer;fmt:integer); override;
+ procedure Load(node:pointer;fmt:integer); override;
+ end;
+
+//----- Support functions -----
+
+//----- Object realization -----
+
+constructor tINIAction.Create(uid:dword);
+begin
+ inherited Create(uid);
+end;
+
+destructor tINIAction.Destroy;
+begin
+ mFreeMem(inifile);
+ mFreeMem(section);
+ mFreeMem(parameter);
+ mFreeMem(value);
+
+ inherited Destroy;
+end;
+{
+function tINIAction.Clone:tBaseAction;
+begin
+ result:=tServiceAction.Create(0);
+ Duplicate(result);
+
+end;
+}
+function tINIAction.DoAction(var WorkData:tWorkData):LRESULT;
+var
+ linifile,
+ lsection,
+ lparam,
+ lvalue:pWideChar;
+ ainifile,
+ asection,
+ aparam,
+ avalue:pAnsiChar;
+ buf:pAnsiChar;
+ cond:bool;
+begin
+ result:=0;
+ cond:=true;
+
+ if (flags and ACF_INI_FILE)<>0 then
+ linifile:=ParseVarString(inifile,WorkData.Parameter,pWideChar(WorkData.LastResult))
+ else
+ linifile:=inifile;
+ if (linifile=nil) or (linifile^=#0) then
+ cond:=false;
+
+ if cond then
+ begin
+ if (flags and ACF_INI_SECTION)<>0 then
+ lsection:=ParseVarString(section,WorkData.Parameter,pWideChar(WorkData.LastResult))
+ else
+ lsection:=section;
+ if (lsection=nil) or (lsection^=#0) then
+ cond:=false;
+ end
+ else
+ lsection:=nil;
+
+ if cond then
+ begin
+ if (flags and ACF_INI_PARAM)<>0 then
+ lparam:=ParseVarString(parameter,WorkData.Parameter,pWideChar(WorkData.LastResult))
+ else
+ lparam:=parameter;
+ end
+ else
+ lparam:=nil;
+
+ if cond then
+ begin
+ if (flags and ACF_INI_DELETE)<>0 then
+ begin
+ WritePrivateProfileStringW(lsection,lparam,nil,linifile);
+ end
+ else
+ begin
+ if (lparam<>nil) and (lparam^<>#0) then
+ begin
+ if (flags and ACF_INI_LR)<>0 then
+ lvalue:=pWideChar(WorkData.LastResult)
+ else if (flags and ACF_INI_VALUE)<>0 then
+ lvalue:=ParseVarString(value,WorkData.Parameter,pWideChar(WorkData.LastResult))
+ else
+ lvalue:=value;
+
+ WideToAnsi(linifile,ainifile);
+ WideToAnsi(lsection,asection);
+ WideToAnsi(lparam ,aparam);
+
+ if (flags and ACF_INI_WRITE)<>0 then
+ begin
+ if (flags and ACF_INI_UTF)=0 then
+ WideToAnsi(lvalue,avalue,MirandaCP)
+ else
+ WideToUTF8(lvalue,avalue);
+
+ WritePrivateProfileStringA(asection,aparam,avalue,ainifile);
+
+ mFreeMem(avalue);
+ end
+
+ else // single line only (Windows-way)
+ begin
+ mGetMem(buf,4096); buf^:=#0;
+ GetPrivateProfileStringA(asection,aparam,avalue,buf,4096,ainifile);
+ ClearResult(WorkData);
+
+ if GetTextFormat(pByte(buf),StrLen(buf))=CP_UTF8 then
+ UTF8ToWide(buf,pWideChar(WorkData.LastResult))
+ else
+ AnsiToWide(buf,pWideChar(WorkData.LastResult),MirandaCP);
+ WorkData.ResultType:=rtWide;
+ mFreeMem(buf);
+ end;
+
+ mFreeMem(ainifile);
+ mFreeMem(asection);
+ mFreeMem(aparam);
+
+ if ((flags and ACF_INI_VALUE)<>0) and
+ ((flags and ACF_INI_LR ) =0) then mFreeMem(lvalue);
+ end;
+ end;
+ end;
+
+ if (flags and ACF_INI_FILE )<>0 then mFreeMem(linifile);
+ if (flags and ACF_INI_SECTION)<>0 then mFreeMem(lsection);
+ if (flags and ACF_INI_PARAM )<>0 then mFreeMem(lparam);
+end;
+
+procedure tINIAction.Load(node:pointer;fmt:integer);
+var
+ lsection: array [0..127] of AnsiChar;
+ pc:pAnsiChar;
+begin
+ inherited Load(node,fmt);
+ case fmt of
+ 0: begin
+ pc:=StrCopyE(lsection,pAnsiChar(node));
+ StrCopy(pc,opt_file ); inifile :=DBReadUnicode(0,DBBranch,lsection,nil);
+ StrCopy(pc,opt_section); section :=DBReadUnicode(0,DBBranch,lsection,nil);
+ StrCopy(pc,opt_param ); parameter:=DBReadUnicode(0,DBBranch,lsection,nil);
+ StrCopy(pc,opt_value ); value :=DBReadUnicode(0,DBBranch,lsection,nil);
+ end;
+{
+ 1: begin
+ end;
+}
+ end;
+end;
+
+procedure tINIAction.Save(node:pointer;fmt:integer);
+var
+ lsection: array [0..127] of AnsiChar;
+ pc:pAnsiChar;
+begin
+ inherited Save(node,fmt);
+ case fmt of
+ 0: begin
+ pc:=StrCopyE(lsection,pAnsiChar(node));
+ StrCopy(pc,opt_file ); DBWriteUnicode(0,DBBranch,lsection,inifile);
+ StrCopy(pc,opt_section); DBWriteUnicode(0,DBBranch,lsection,section);
+ StrCopy(pc,opt_param ); DBWriteUnicode(0,DBBranch,lsection,parameter);
+ StrCopy(pc,opt_value ); DBWriteUnicode(0,DBBranch,lsection,value);
+ end;
+{
+ 1: begin
+ end;
+}
+ 13: begin
+ tTextExport(node).AddFlag('write' ,(flags and ACF_INI_WRITE )<>0);
+ tTextExport(node).AddFlag('delete' ,(flags and ACF_INI_DELETE)<>0);
+ tTextExport(node).AddFlag('lastresult',(flags and ACF_INI_LR )<>0);
+ tTextExport(node).AddFlag('utf' ,(flags and ACF_INI_UTF )<>0);
+ if flags and (ACF_INI_WRITE or ACF_INI_DELETE or ACF_INI_LR or ACF_INI_UTF)<>0 then
+ tTextExport(node).AddNewLine();
+ tTextExport(node).AddTextW('inifile' ,inifile ); tTextExport(node).AddNewLine();
+ tTextExport(node).AddTextW('section' ,section ); tTextExport(node).AddNewLine();
+ tTextExport(node).AddTextW('parameter',parameter); tTextExport(node).AddNewLine();
+ if flags and (ACF_INI_DELETE or ACF_INI_LR)=0 then
+ begin
+ tTextExport(node).AddTextW('value',value); tTextExport(node).AddNewLine();
+ end;
+ end;
+ end;
+end;
+
+//----- Dialog realization -----
+
+function FillFileName(Dialog:HWND;idc:integer):boolean;
+var
+ pw,ppw:pWideChar;
+begin
+ mGetMem(pw,1024*SizeOf(WideChar));
+ ppw:=GetDlgText(Dialog,idc);
+ result:=ShowDlgW(pw,ppw);
+ if result then
+ begin
+ SetDlgItemTextW(Dialog,idc,pw);
+ SetEditFlags(Dialog,idc,EF_SCRIPT,0);
+ end;
+ mFreeMem(ppw);
+ mFreeMem(pw);
+end;
+
+procedure ClearFields(Dialog:HWND);
+begin
+ CheckDlgButton(Dialog,IDC_INI_READ ,BST_UNCHECKED);
+ CheckDlgButton(Dialog,IDC_INI_WRITE ,BST_UNCHECKED);
+ CheckDlgButton(Dialog,IDC_INI_DELETE,BST_UNCHECKED);
+
+ CheckDlgButton(Dialog,IDC_INI_LR ,BST_UNCHECKED);
+ CheckDlgButton(Dialog,IDC_INI_UTF,BST_UNCHECKED);
+
+ EnableEditField(Dialog,IDC_INI_VALUE,true);
+end;
+
+function DlgProc(Dialog:HWND;hMessage:uint;wParam:WPARAM;lParam:LPARAM):LRESULT; stdcall;
+const
+ NoProcess:boolean=true;
+begin
+ result:=0;
+
+ case hMessage of
+ WM_INITDIALOG: begin
+ TranslateDialogDefault(Dialog);
+
+ MakeEditField(Dialog,IDC_INI_PATH);
+ MakeEditField(Dialog,IDC_INI_SECTION);
+ MakeEditField(Dialog,IDC_INI_PARAM);
+ MakeEditField(Dialog,IDC_INI_VALUE);
+ end;
+
+ WM_ACT_SETVALUE: begin
+ NoProcess:=true;
+ ClearFields(Dialog);
+ with tINIAction(lParam) do
+ begin
+ SetDlgItemTextW(Dialog,IDC_INI_PATH ,inifile);
+ SetDlgItemTextW(Dialog,IDC_INI_SECTION,section);
+ SetDlgItemTextW(Dialog,IDC_INI_PARAM ,parameter);
+ SetDlgItemTextW(Dialog,IDC_INI_VALUE ,value);
+
+ SetEditFlags(Dialog,IDC_INI_PATH ,EF_SCRIPT,ord((flags and ACF_INI_FILE )<>0));
+ SetEditFlags(Dialog,IDC_INI_SECTION,EF_SCRIPT,ord((flags and ACF_INI_SECTION)<>0));
+ SetEditFlags(Dialog,IDC_INI_PARAM ,EF_SCRIPT,ord((flags and ACF_INI_PARAM )<>0));
+
+ SetEditFlags(Dialog,IDC_INI_VALUE,EF_SCRIPT,ord((flags and ACF_INI_VALUE)<>0));
+ if ((flags and ACF_INI_DELETE)<>0) or
+ ((flags and ACF_INI_LR )<>0) then
+ EnableEditField(Dialog,IDC_INI_VALUE,false);
+
+ if (flags and ACF_INI_WRITE)<>0 then
+ CheckDlgButton(Dialog,IDC_INI_WRITE,BST_CHECKED)
+ else if (flags and ACF_INI_DELETE)<>0 then
+ CheckDlgButton(Dialog,IDC_INI_DELETE,BST_CHECKED)
+ else
+ CheckDlgButton(Dialog,IDC_INI_READ,BST_CHECKED);
+
+ EnableWindow(GetDlgItem(Dialog,IDC_INI_LR),(flags and ACF_INI_DELETE)=0);
+ if (flags and ACF_INI_LR)<>0 then
+ CheckDlgButton(Dialog,IDC_INI_LR,BST_CHECKED);
+
+ EnableWindow(GetDlgItem(Dialog,IDC_INI_UTF),(flags and ACF_INI_WRITE)<>0);
+ if (flags and ACF_INI_UTF)<>0 then
+ CheckDlgButton(Dialog,IDC_INI_UTF,BST_CHECKED);
+ end;
+ NoProcess:=false;
+ end;
+
+ WM_ACT_RESET: begin
+ NoProcess:=true;
+ ClearFields(Dialog);
+
+ SetDlgItemTextW(Dialog,IDC_INI_PATH ,nil);
+ SetDlgItemTextW(Dialog,IDC_INI_SECTION,nil);
+ SetDlgItemTextW(Dialog,IDC_INI_PARAM ,nil);
+ SetDlgItemTextW(Dialog,IDC_INI_VALUE ,nil);
+ SetEditFlags(Dialog,IDC_INI_PATH ,EF_ALL,0);
+ SetEditFlags(Dialog,IDC_INI_SECTION,EF_ALL,0);
+ SetEditFlags(Dialog,IDC_INI_PARAM ,EF_ALL,0);
+ SetEditFlags(Dialog,IDC_INI_VALUE ,EF_ALL,0);
+
+ EnableWindow(GetDlgItem(Dialog,IDC_INI_LR ),true);
+ EnableWindow(GetDlgItem(Dialog,IDC_INI_UTF),false);
+
+ CheckDlgButton(Dialog,IDC_INI_READ,BST_CHECKED);
+ NoProcess:=false;
+ end;
+
+ WM_ACT_SAVE: begin
+ with tINIAction(lParam) do
+ begin
+ if IsDlgButtonChecked(Dialog,IDC_INI_WRITE)<>BST_UNCHECKED then
+ flags:=flags or ACF_INI_WRITE
+ else if IsDlgButtonChecked(Dialog,IDC_INI_DELETE)<>BST_UNCHECKED then
+ flags:=flags or ACF_INI_DELETE;
+
+ if IsDlgButtonChecked(Dialog,IDC_INI_LR )<>BST_UNCHECKED then flags:=flags or ACF_INI_LR;
+ if IsDlgButtonChecked(Dialog,IDC_INI_UTF)<>BST_UNCHECKED then flags:=flags or ACF_INI_UTF;
+
+ inifile :=GetDlgText(Dialog,IDC_INI_PATH);
+ section :=GetDlgText(Dialog,IDC_INI_SECTION);
+ parameter:=GetDlgText(Dialog,IDC_INI_PARAM);
+ value :=GetDlgText(Dialog,IDC_INI_VALUE);
+ if (GetEditFlags(Dialog,IDC_INI_PATH ) and EF_SCRIPT)<>0 then flags:=flags or ACF_INI_FILE;
+ if (GetEditFlags(Dialog,IDC_INI_SECTION) and EF_SCRIPT)<>0 then flags:=flags or ACF_INI_SECTION;
+ if (GetEditFlags(Dialog,IDC_INI_PARAM ) and EF_SCRIPT)<>0 then flags:=flags or ACF_INI_PARAM;
+ if (GetEditFlags(Dialog,IDC_INI_VALUE ) and EF_SCRIPT)<>0 then flags:=flags or ACF_INI_VALUE;
+ end;
+ end;
+
+ WM_COMMAND: begin
+ case wParam shr 16 of
+ EN_CHANGE: if not NoProcess then
+ SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0);
+
+ BN_CLICKED: begin
+ case loword(wParam) of
+ IDC_INI_INIBTN: begin
+ if not FillFileName(Dialog,IDC_INI_PATH) then
+ exit;
+ end;
+
+ IDC_INI_READ,
+ IDC_INI_WRITE,
+ IDC_INI_DELETE: begin
+ EnableEditField(Dialog,IDC_INI_VALUE,loword(wParam)<>IDC_INI_DELETE);
+
+ EnableWindow(GetDlgItem(Dialog,IDC_INI_LR),
+ IsDlgButtonChecked(Dialog,IDC_INI_DELETE)=BST_UNCHECKED);
+ EnableWindow(GetDlgItem(Dialog,IDC_INI_UTF),
+ IsDlgButtonChecked(Dialog,IDC_INI_WRITE)<>BST_UNCHECKED);
+ end;
+
+ IDC_INI_LR: begin
+ EnableEditField(Dialog,IDC_INI_VALUE,IsDlgButtonChecked(Dialog,IDC_INI_LR)=BST_UNCHECKED);
+ end;
+ end;
+
+ if not NoProcess then
+ SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0);
+ end;
+ end;
+ end;
+
+ WM_HELP: begin
+ result:=1;
+ end;
+
+ end;
+end;
+
+//----- Export/interface functions -----
+
+var
+ vc:tActModule;
+
+function CreateAction:tBaseAction;
+begin
+ result:=tINIAction.Create(vc.Hash);
+end;
+
+function CreateDialog(parent:HWND):HWND;
+begin
+ result:=CreateDialogW(hInstance,'IDD_INI',parent,@DlgProc);
+end;
+
+procedure Init;
+begin
+ vc.Next :=ModuleLink;
+
+ vc.Name :='INI';
+ vc.Dialog :=@CreateDialog;
+ vc.Create :=@CreateAction;
+ vc.Icon :='IDI_INI';
+
+ ModuleLink :=@vc;
+end;
+
+begin
+ Init;
+end.