From 1109badbf7ade0bd6647654302a6ef5e1bb8fee2 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Wed, 6 Nov 2013 15:29:23 +0000 Subject: Actman 30 merged with Awk's git-svn-id: http://svn.miranda-ng.org/main/trunk@6806 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Actman30/actman.dpr | 250 ---------- plugins/Actman30/actman30.dpr | 255 ++++++++++ plugins/Actman30/ask.res | Bin 0 -> 456 bytes plugins/Actman30/dlgshare.res | Bin 0 -> 22652 bytes plugins/Actman30/editwrapper.res | Bin 0 -> 492 bytes plugins/Actman30/hooks.res | Bin 0 -> 688 bytes plugins/Actman30/i_cnst_call.inc | 23 + plugins/Actman30/i_opt_dlg.inc | 2 +- plugins/Actman30/i_sparam_const.inc | 10 + plugins/Actman30/iac_call.pas | 948 ++++++++++++++++++++++++++++++++++++ plugins/Actman30/iac_call.rc | 38 ++ plugins/Actman30/iac_call.res | Bin 0 -> 3492 bytes plugins/Actman30/iac_chain.res | Bin 0 -> 3124 bytes plugins/Actman30/iac_contact.rc | 2 +- plugins/Actman30/iac_contact.res | Bin 0 -> 3120 bytes plugins/Actman30/iac_database.res | Bin 0 -> 3684 bytes plugins/Actman30/iac_global.pas | 77 ++- plugins/Actman30/iac_inout.res | Bin 0 -> 3432 bytes plugins/Actman30/iac_jump.pas | 2 +- plugins/Actman30/iac_jump.res | Bin 0 -> 3448 bytes plugins/Actman30/iac_messagebox.res | Bin 0 -> 3760 bytes plugins/Actman30/iac_program.pas | 8 +- plugins/Actman30/iac_program.res | Bin 0 -> 3652 bytes plugins/Actman30/iac_service.res | Bin 0 -> 3500 bytes plugins/Actman30/iac_settings.res | Bin 0 -> 3568 bytes plugins/Actman30/iac_storage.res | Bin 0 -> 2976 bytes plugins/Actman30/iac_text.res | Bin 0 -> 2912 bytes plugins/Actman30/ico/call.ico | Bin 0 -> 2550 bytes plugins/Actman30/mApiCard.res | Bin 0 -> 1052 bytes plugins/Actman30/make.bat | 40 +- plugins/Actman30/options.res | Bin 0 -> 1140 bytes plugins/Actman30/services.ini | 21 +- plugins/Actman30/sparam.pas | 708 +++++++++++++++++++++++++++ plugins/Actman30/sparam.rc | 27 + plugins/Actman30/sparam.res | Bin 0 -> 624 bytes plugins/Actman30/structopts.res | Bin 0 -> 12408 bytes plugins/Actman30/tasks.res | Bin 0 -> 1288 bytes plugins/Actman30/tmp/FreeImage.ppu | Bin 0 -> 199403 bytes plugins/Actman30/tmp/PsAPI.ppu | Bin 0 -> 23713 bytes plugins/Actman30/tmp/ask.res | Bin 0 -> 456 bytes plugins/Actman30/tmp/commctrl.ppu | Bin 0 -> 503113 bytes plugins/Actman30/tmp/common.ppu | Bin 0 -> 55446 bytes plugins/Actman30/tmp/dbsettings.ppu | Bin 0 -> 26337 bytes plugins/Actman30/tmp/global.ppu | Bin 0 -> 2051 bytes plugins/Actman30/tmp/io.ppu | Bin 0 -> 7789 bytes plugins/Actman30/tmp/mApiCard.res | Bin 0 -> 1052 bytes plugins/Actman30/tmp/mApiCardM.ppu | Bin 0 -> 9968 bytes plugins/Actman30/tmp/m_api.ppu | Bin 0 -> 607276 bytes plugins/Actman30/tmp/memini.ppu | Bin 0 -> 10884 bytes plugins/Actman30/tmp/mirutils.ppu | Bin 0 -> 20647 bytes plugins/Actman30/tmp/question.ppu | Bin 0 -> 3314 bytes plugins/Actman30/tmp/syswin.ppu | Bin 0 -> 12797 bytes plugins/Actman30/tmp/wrapper.ppu | Bin 0 -> 15405 bytes plugins/Actman30/ua.res | Bin 0 -> 3944 bytes 54 files changed, 2133 insertions(+), 278 deletions(-) delete mode 100644 plugins/Actman30/actman.dpr create mode 100644 plugins/Actman30/actman30.dpr create mode 100644 plugins/Actman30/ask.res create mode 100644 plugins/Actman30/dlgshare.res create mode 100644 plugins/Actman30/editwrapper.res create mode 100644 plugins/Actman30/hooks.res create mode 100644 plugins/Actman30/i_cnst_call.inc create mode 100644 plugins/Actman30/i_sparam_const.inc create mode 100644 plugins/Actman30/iac_call.pas create mode 100644 plugins/Actman30/iac_call.rc create mode 100644 plugins/Actman30/iac_call.res create mode 100644 plugins/Actman30/iac_chain.res create mode 100644 plugins/Actman30/iac_contact.res create mode 100644 plugins/Actman30/iac_database.res create mode 100644 plugins/Actman30/iac_inout.res create mode 100644 plugins/Actman30/iac_jump.res create mode 100644 plugins/Actman30/iac_messagebox.res create mode 100644 plugins/Actman30/iac_program.res create mode 100644 plugins/Actman30/iac_service.res create mode 100644 plugins/Actman30/iac_settings.res create mode 100644 plugins/Actman30/iac_storage.res create mode 100644 plugins/Actman30/iac_text.res create mode 100644 plugins/Actman30/ico/call.ico create mode 100644 plugins/Actman30/mApiCard.res create mode 100644 plugins/Actman30/options.res create mode 100644 plugins/Actman30/sparam.pas create mode 100644 plugins/Actman30/sparam.rc create mode 100644 plugins/Actman30/sparam.res create mode 100644 plugins/Actman30/structopts.res create mode 100644 plugins/Actman30/tasks.res create mode 100644 plugins/Actman30/tmp/FreeImage.ppu create mode 100644 plugins/Actman30/tmp/PsAPI.ppu create mode 100644 plugins/Actman30/tmp/ask.res create mode 100644 plugins/Actman30/tmp/commctrl.ppu create mode 100644 plugins/Actman30/tmp/common.ppu create mode 100644 plugins/Actman30/tmp/dbsettings.ppu create mode 100644 plugins/Actman30/tmp/global.ppu create mode 100644 plugins/Actman30/tmp/io.ppu create mode 100644 plugins/Actman30/tmp/mApiCard.res create mode 100644 plugins/Actman30/tmp/mApiCardM.ppu create mode 100644 plugins/Actman30/tmp/m_api.ppu create mode 100644 plugins/Actman30/tmp/memini.ppu create mode 100644 plugins/Actman30/tmp/mirutils.ppu create mode 100644 plugins/Actman30/tmp/question.ppu create mode 100644 plugins/Actman30/tmp/syswin.ppu create mode 100644 plugins/Actman30/tmp/wrapper.ppu create mode 100644 plugins/Actman30/ua.res (limited to 'plugins/Actman30') diff --git a/plugins/Actman30/actman.dpr b/plugins/Actman30/actman.dpr deleted file mode 100644 index 4515e35c1e..0000000000 --- a/plugins/Actman30/actman.dpr +++ /dev/null @@ -1,250 +0,0 @@ -{$include compilers.inc} -{$IFDEF COMPILER_16_UP} - {$WEAKLINKRTTI ON} - {.$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} -{$ENDIF} -{$IMAGEBASE $13200000} -library actman; -{%File 'm_actman.inc'} -{%File 'i_const.inc'} -{%File 'i_opt_dlg2.inc'} -{%File 'i_opt_dlg.inc'} -{%File 'i_options.inc'} -{%File 'i_services.inc'} -{%File 'i_vars.inc'} -{%File 'i_inoutxm.inc'} -{%File 'tasks\i_opt_dlg.inc'} -{%File 'tasks\i_options.inc'} -{%File 'tasks\i_task.inc'} -{%File 'hooks\i_options.inc'} -{%File 'hooks\i_hook.inc'} -{%File 'hooks\i_opt_dlg.inc'} -{%File 'ua\i_opt_dlg.inc'} -{%File 'ua\i_inoutxm.inc'} -{%File 'ua\i_options.inc'} -{%File 'ua\i_ua.inc'} -{%File 'ua\i_uaplaces.inc'} -{%File 'ua\i_uconst.inc'} - -uses -// fastmm4, - m_api, - Windows, - messages, - commctrl, - common, - wrapper, - io, - dbsettings, - mirutils, - syswin, - question, - mApiCardM, - global, - lowlevelc, - dlgshare, - iac_global, - iac_settings, - iac_storage, - iac_dbrw, - iac_messagebox, - iac_text, - iac_jump, - iac_inout, - iac_service, - iac_program, - iac_chain, - iac_contact, - inoutxml, - sedit, - strans, - ua in 'ua\ua.pas', - hooks in 'hooks\hooks.pas', - scheduler in 'tasks\scheduler.pas'; - -{$r options.res} - -const - PluginName = 'Action Manager'; -var - hevaction,hHookChanged,hevinout:THANDLE; - -{$include m_actman.inc} - - -function MirandaPluginInfoEx(mirandaVersion:DWORD):PPLUGININFOEX; cdecl; -begin - result:=@PluginInfo; - PluginInfo.cbSize :=SizeOf(TPLUGININFOEX); - PluginInfo.shortName :='Action manager'; - PluginInfo.version :=$00030001; - PluginInfo.description:='Plugin for manage hotkeys to open contact window, insert text, '+ - 'run program and call services'; - PluginInfo.author :='Awkward'; - PluginInfo.authorEmail:='panda75@bk.ru; awk1975@ya.ru'; - PluginInfo.copyright :='(c) 2007-2013 Awkward'; - PluginInfo.homepage :='http://code.google.com/p/delphi-miranda-plugins/'; - PluginInfo.flags :=UNICODE_AWARE; - PluginInfo.uuid :=MIID_ACTMAN; -end; - -{$include i_const.inc} - -{$include i_options.inc} -{$include i_services.inc} -{$include i_opt_dlg.inc} -{.$include i_inoutxm.inc} - -function PreShutdown(wParam:WPARAM;lParam:LPARAM):int;cdecl; -var - ptr:pActionLink; -begin - result:=0; - - ptr:=ActionLink; - while ptr<>nil do - begin - if @ptr^.DeInit<>nil then - ptr^.DeInit; - ptr:=ptr^.Next; - end; - - MacroList.Clear; - MacroList.Free; - - DestroyHookableEvent(hHookChanged); - DestroyHookableEvent(hevinout); - DestroyHookableEvent(hevaction); - -end; - -procedure RegisterActTypes; -var - p:pActModule; - sid:TSKINICONDESC; - buf:array [0..63] of AnsiChar; - pc:pAnsiChar; -// ii:tIconItem; -begin - FillChar(sid,SizeOf(sid),0); - sid.cbSize:=SizeOf(sid); - sid.cx:=16; - sid.cy:=16; - sid.szSection.a:='Actions'; - sid.pszName :=@buf; - pc:=StrCopyE(buf,IcoLibPrefix); - p:=ModuleLink; -{ - ii.size :=0; - ii.hIcolib:=0; - ii.szName :=@buf; -} - while p<>nil do - begin - if p^.Hash=0 then - p^.Hash:=Hash(p^.Name,StrLen(p^.Name)); - //!! must add icon registration in icolib -{ - StrCopy(pc,p^.Name); - ii.szDescr :=p^.Name; - ii.DefIconID:=; - Icon_Register(hInstance,'Actions',@ii,1); -} - sid.hDefaultIcon :=LoadImageA(hInstance,p^.Icon,IMAGE_ICON,16,16,0); - sid.szDescription.a:=p^.Name; - StrCopy(pc,p^.Name); - Skin_AddIcon(@sid); - DestroyIcon(sid.hDefaultIcon); - - p:=p^.Next; - end; -end; - -// This function implements autostart action execution after all others plugins loading -function DoAutostart(wParam:WPARAM;lParam:LPARAM):int;cdecl; -var - i:integer; - Macro:pMacroRecord; - section:array [0..127] of AnsiChar; - p,p1:pAnsiChar; -begin - Result:=0; - CallService(MS_ACT_RUNBYNAME,TWPARAM(AutoStartName),0); - - p1:=StrCopyE(section,opt_group); - for i:=0 to MacroList.Count-1 do - begin - Macro:=MacroList[i]; - if (Macro^.flags and ACF_FIRSTRUN)<>0 then - begin - CallService(MS_ACT_RUNBYID,TWPARAM(Macro^.id),0); - Macro^.flags:=Macro^.flags and not ACF_FIRSTRUN; - p:=StrEnd(IntToStr(p1,i)); - p^:='/'; inc(p); - StrCopy(p,opt_flags); DBWriteDWord(0,DBBranch,section,Macro^.flags); - end; - end; -end; - -function OnModulesLoaded(wParam:WPARAM;lParam:LPARAM):int;cdecl; -var - ptr:pActionLink; -begin - Result:=0; - - RegisterActTypes; - - LoadMacros; - RegisterIcons; - - HookEvent(ME_OPT_INITIALISE ,@OnOptInitialise); - HookEvent(ME_SYSTEM_SHUTDOWN{ME_SYSTEM_OKTOEXIT},@PreShutdown); - NotifyEventHooks(hHookChanged,twparam(ACTM_LOADED),0); - - IsMultiThread:=true; - // Load additional modules - ptr:=ActionLink; - while ptr<>nil do - begin - if @ptr^.Init<>nil then - ptr^.Init; - ptr:=ptr^.Next; - end; - - // cheat - HookEvent(ME_SYSTEM_MODULESLOADED,@DoAutostart); -// DoAutostart(0,0); -end; - -function Load:int; cdecl; -begin - Result:=0; - Langpack_Register; - - hHookChanged:=CreateHookableEvent(ME_ACT_CHANGED); - hevinout :=CreateHookableEvent(ME_ACT_INOUT); - hevaction :=CreateHookableEvent(ME_ACT_ACTION); - - CreateServiceFunction(MS_ACT_FREELIST ,@ActFreeList); - CreateServiceFunction(MS_ACT_GETLIST ,@ActGetList); - CreateServiceFunction(MS_ACT_RUNBYID ,@ActRun); - CreateServiceFunction(MS_ACT_RUNBYNAME,@ActRunGroup); - CreateServiceFunction(MS_ACT_RUNPARAMS,@ActRunParam); -//!! CreateServiceFunction(MS_ACT_INOUT ,@ActInOut); - CreateServiceFunction(MS_ACT_SELECT ,@ActSelect); - - HookEvent(ME_SYSTEM_MODULESLOADED,@OnModulesLoaded); -end; - -function Unload: int; cdecl; -begin - Result:=0; -end; - -exports - Load, Unload, - MirandaPluginInfoEx; - -begin - DisableThreadLibraryCalls(hInstance); -end. diff --git a/plugins/Actman30/actman30.dpr b/plugins/Actman30/actman30.dpr new file mode 100644 index 0000000000..149ffeb744 --- /dev/null +++ b/plugins/Actman30/actman30.dpr @@ -0,0 +1,255 @@ +{$include compilers.inc} +{$IFDEF COMPILER_16_UP} + {$WEAKLINKRTTI ON} + {.$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} +{$ENDIF} +{$IMAGEBASE $13200000} +library actman; +{%File 'm_actman.inc'} +{%File 'i_const.inc'} +{%File 'i_opt_dlg2.inc'} +{%File 'i_opt_dlg.inc'} +{%File 'i_options.inc'} +{%File 'i_services.inc'} +{%File 'i_vars.inc'} +{%File 'i_inoutxm.inc'} +{%File 'tasks\i_opt_dlg.inc'} +{%File 'tasks\i_options.inc'} +{%File 'tasks\i_task.inc'} +{%File 'hooks\i_options.inc'} +{%File 'hooks\i_hook.inc'} +{%File 'hooks\i_opt_dlg.inc'} +{%File 'ua\i_opt_dlg.inc'} +{%File 'ua\i_inoutxm.inc'} +{%File 'ua\i_options.inc'} +{%File 'ua\i_ua.inc'} +{%File 'ua\i_uaplaces.inc'} +{%File 'ua\i_uconst.inc'} + +uses +// fastmm4, + m_api, + Windows, + messages, + commctrl, + common, + wrapper, + io, + dbsettings, + mirutils, + syswin, + base64, + question, + mApiCardM, + global, + lowlevelc, + dlgshare, + iac_global, + iac_settings, + iac_storage, + iac_dbrw, + iac_messagebox, + iac_text, + iac_jump, + iac_inout, + iac_service, + iac_program, + iac_chain, + iac_contact, + iac_call, + inoutxml, + sedit, + strans, + ua in 'ua\ua.pas', + hooks in 'hooks\hooks.pas', + scheduler in 'tasks\scheduler.pas'; + +{$r options.res} + +const + PluginName = 'Action Manager'; +var + hevaction,hHookChanged,hevinout:THANDLE; + +{$include m_actman.inc} + + +function MirandaPluginInfoEx(mirandaVersion:DWORD):PPLUGININFOEX; cdecl; +begin + result:=@PluginInfo; + PluginInfo.cbSize :=SizeOf(TPLUGININFOEX); + PluginInfo.shortName :='Action manager'; + PluginInfo.version :=$00030001; + PluginInfo.description:='Plugin for manage hotkeys to open contact window, insert text, '+ + 'run program and call services'; + PluginInfo.author :='Awkward'; + PluginInfo.authorEmail:='panda75@bk.ru; awk1975@ya.ru'; + PluginInfo.copyright :='(c) 2007-2013 Awkward'; + PluginInfo.homepage :='http://code.google.com/p/delphi-miranda-plugins/'; + PluginInfo.flags :=UNICODE_AWARE; + PluginInfo.uuid :=MIID_ACTMAN; +end; + +{$include i_const.inc} + +{$include i_options.inc} +{$include i_services.inc} +{$include i_opt_dlg.inc} +{.$include i_inoutxm.inc} + +function PreShutdown(wParam:WPARAM;lParam:LPARAM):int;cdecl; +var + ptr:pActionLink; +begin + result:=0; + + ptr:=ActionLink; + while ptr<>nil do + begin + if @ptr^.DeInit<>nil then + ptr^.DeInit; + ptr:=ptr^.Next; + end; + + MacroList.Clear; + MacroList.Free; + + DestroyHookableEvent(hHookChanged); + DestroyHookableEvent(hevinout); + DestroyHookableEvent(hevaction); + +end; + +procedure RegisterActTypes; +var + p:pActModule; + sid:TSKINICONDESC; + buf:array [0..63] of AnsiChar; + pc:pAnsiChar; +// ii:tIconItem; +begin + FillChar(sid,SizeOf(sid),0); + sid.cbSize:=SizeOf(sid); + sid.cx:=16; + sid.cy:=16; + sid.szSection.a:='Actions'; + sid.pszName :=@buf; + pc:=StrCopyE(buf,IcoLibPrefix); + p:=ModuleLink; +{ + ii.size :=0; + ii.hIcolib:=0; + ii.szName :=@buf; +} + while p<>nil do + begin + if p^.Hash=0 then + p^.Hash:=Hash(p^.Name,StrLen(p^.Name)); + //!! must add icon registration in icolib +{ + StrCopy(pc,p^.Name); + ii.szDescr :=p^.Name; + ii.DefIconID:=; + Icon_Register(hInstance,'Actions',@ii,1); +} + sid.hDefaultIcon :=LoadImageA(hInstance,p^.Icon,IMAGE_ICON,16,16,0); + sid.szDescription.a:=p^.Name; + StrCopy(pc,p^.Name); + Skin_AddIcon(@sid); + DestroyIcon(sid.hDefaultIcon); + + p:=p^.Next; + end; +end; + +// This function implements autostart action execution after all others plugins loading +function DoAutostart(wParam:WPARAM;lParam:LPARAM):int;cdecl; +var + i:integer; + Macro:pMacroRecord; + section:array [0..127] of AnsiChar; + p,p1:pAnsiChar; +begin + Result:=0; + CallService(MS_ACT_RUNBYNAME,TWPARAM(AutoStartName),0); + + p1:=StrCopyE(section,opt_group); + for i:=0 to MacroList.Count-1 do + begin + Macro:=MacroList[i]; + if (Macro^.flags and ACF_FIRSTRUN)<>0 then + begin + CallService(MS_ACT_RUNBYID,TWPARAM(Macro^.id),0); + Macro^.flags:=Macro^.flags and not ACF_FIRSTRUN; + p:=StrEnd(IntToStr(p1,i)); + p^:='/'; inc(p); + StrCopy(p,opt_flags); DBWriteDWord(0,DBBranch,section,Macro^.flags); + end; + end; +end; + +function OnModulesLoaded(wParam:WPARAM;lParam:LPARAM):int;cdecl; +var + ptr:pActionLink; +begin + Result:=0; + + RegisterActTypes; + + LoadMacros; + RegisterIcons; + + HookEvent(ME_OPT_INITIALISE ,@OnOptInitialise); + HookEvent(ME_SYSTEM_SHUTDOWN{ME_SYSTEM_OKTOEXIT},@PreShutdown); + NotifyEventHooks(hHookChanged,twparam(ACTM_LOADED),0); + + //----- DBEDITOR support ----- +// CallService(MS_DBEDIT_REGISTERSINGLEMODULE,twparam(PluginShort),0); + + IsMultiThread:=true; + // Load additional modules + ptr:=ActionLink; + while ptr<>nil do + begin + if @ptr^.Init<>nil then + ptr^.Init; + ptr:=ptr^.Next; + end; + + // cheat + HookEvent(ME_SYSTEM_MODULESLOADED,@DoAutostart); +// DoAutostart(0,0); +end; + +function Load:int; cdecl; +begin + Result:=0; + Langpack_Register; + + hHookChanged:=CreateHookableEvent(ME_ACT_CHANGED); + hevinout :=CreateHookableEvent(ME_ACT_INOUT); + hevaction :=CreateHookableEvent(ME_ACT_ACTION); + + CreateServiceFunction(MS_ACT_FREELIST ,@ActFreeList); + CreateServiceFunction(MS_ACT_GETLIST ,@ActGetList); + CreateServiceFunction(MS_ACT_RUNBYID ,@ActRun); + CreateServiceFunction(MS_ACT_RUNBYNAME,@ActRunGroup); + CreateServiceFunction(MS_ACT_RUNPARAMS,@ActRunParam); +//!! CreateServiceFunction(MS_ACT_INOUT ,@ActInOut); + CreateServiceFunction(MS_ACT_SELECT ,@ActSelect); + + HookEvent(ME_SYSTEM_MODULESLOADED,@OnModulesLoaded); +end; + +function Unload: int; cdecl; +begin + Result:=0; +end; + +exports + Load, Unload, + MirandaPluginInfoEx; + +begin + DisableThreadLibraryCalls(hInstance); +end. diff --git a/plugins/Actman30/ask.res b/plugins/Actman30/ask.res new file mode 100644 index 0000000000..15a00e0218 Binary files /dev/null and b/plugins/Actman30/ask.res differ diff --git a/plugins/Actman30/dlgshare.res b/plugins/Actman30/dlgshare.res new file mode 100644 index 0000000000..13c4bf49cd Binary files /dev/null and b/plugins/Actman30/dlgshare.res differ diff --git a/plugins/Actman30/editwrapper.res b/plugins/Actman30/editwrapper.res new file mode 100644 index 0000000000..a0019a92ae Binary files /dev/null and b/plugins/Actman30/editwrapper.res differ diff --git a/plugins/Actman30/hooks.res b/plugins/Actman30/hooks.res new file mode 100644 index 0000000000..1cf202f414 Binary files /dev/null and b/plugins/Actman30/hooks.res differ diff --git a/plugins/Actman30/i_cnst_call.inc b/plugins/Actman30/i_cnst_call.inc new file mode 100644 index 0000000000..8b8118ed28 --- /dev/null +++ b/plugins/Actman30/i_cnst_call.inc @@ -0,0 +1,23 @@ +{resource constants} +const + IDC_LIST_FUNC = 2101; + IDC_LIST_DLL = 2102; + IDC_CDECL = 2103; + IDC_STDCALL = 2104; + IDC_ARGCOUNT = 2105; + IDC_ARGSTAT = 2106; + + IDC_ARGNUM = 2110; + IDC_FLAG_PAR = 2111; + IDC_EDIT_PAR = 2112; + IDC_STRUCT = 2113; + + IDC_DLL = 2115; + IDC_DLL_CACHE = 2116; +{ + IDC_DLL_IMM = 2116; + IDC_DLL_MACRO = 2117; + IDC_DLL_END = 2118; +} + IDC_CLOSE_ARG = 2119; + IDC_CLOSE_RES = 2120; diff --git a/plugins/Actman30/i_opt_dlg.inc b/plugins/Actman30/i_opt_dlg.inc index e7a9e206ef..62a0a6c66f 100644 --- a/plugins/Actman30/i_opt_dlg.inc +++ b/plugins/Actman30/i_opt_dlg.inc @@ -17,7 +17,7 @@ var i:integer; begin result:=0; - NoDescription:=TranslateW('No description'); + NoDescription:=TranslateW('No Description'); StrCopyW(xmlfilename,'c:\export.xml'); diff --git a/plugins/Actman30/i_sparam_const.inc b/plugins/Actman30/i_sparam_const.inc new file mode 100644 index 0000000000..5571dd96e0 --- /dev/null +++ b/plugins/Actman30/i_sparam_const.inc @@ -0,0 +1,10 @@ +const + IDC_FLAG_PAR = 2150; + IDC_EDIT_PAR = 2151; + IDC_STRUCT = 2152; + IDC_STAT_PAR = 2153; + + IDC_RES_TYPE = 2160; + IDC_RES_FREEMEM = 2161; + IDC_RES_GROUP = 2162; + IDC_RES_STAT = 2163; diff --git a/plugins/Actman30/iac_call.pas b/plugins/Actman30/iac_call.pas new file mode 100644 index 0000000000..9b0c8dbe3a --- /dev/null +++ b/plugins/Actman30/iac_call.pas @@ -0,0 +1,948 @@ +unit iac_call; + +interface + +implementation + +uses + windows, messages, commctrl, + sparam, + common, wrapper, memini, + iac_global, global, + m_api, dbsettings, mirutils; + +{$include i_cnst_call.inc} +{$resource iac_call.res} + +const + MaxArgCount = 8; + MaxArgNameLen = 32; + +const + API_FUNCTION_FILE:pAnsiChar = 'plugins\services.ini'; + namespace = 'Function'; + +const + opt_dllname = 'dllname'; + opt_funcname = 'funcname'; + opt_argcount = 'argcount'; + opt_argf = 'argtype'; + opt_argn = 'argname'; + opt_argv = 'argvalue'; + +type + tCallAction = class(tBaseAction) + private + dllname:pAnsiChar; + funcname:pAnsiChar; + + argcount:integer; + argf:array [0..MaxArgCount-1] of dword; + argv:array [0..MaxArgCount-1] of uint_ptr; + argn:array [0..MaxArgCount-1,0..MaxArgNameLen-1] of AnsiChar; + 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; + +var + storage:pointer; + +const + ACF_CDECL = $00000001; + ACF_CACHE_NOW = $00000002; + ACF_CACHE_MACRO = $00000004; + +// param flags, same as for service +const + ACF_RSTRING = $00010000; // Service result is string + ACF_RUNICODE = $00020000; // Service result is Widestring + ACF_RSTRUCT = $00040000; // Service result in structure + ACF_RFREEMEM = $00080000; // Need to free memory + + ACF_SCRIPT_PARAM = $00001000; + // dummy + ACF_STRING = 0; + +type + sp0 = function:int_ptr; stdcall; + sp1 = function(arg1:int_ptr):int_ptr; stdcall; + sp2 = function(arg1,arg2:uint_ptr):int_ptr; stdcall; + sp3 = function(arg1,arg2,arg3:uint_ptr):int_ptr; stdcall; + sp4 = function(arg1,arg2,arg3,arg4:uint_ptr):int_ptr; stdcall; + sp5 = function(arg1,arg2,arg3,arg4,arg5:uint_ptr):int_ptr; stdcall; + sp6 = function(arg1,arg2,arg3,arg4,arg5,arg6:uint_ptr):int_ptr; stdcall; + sp7 = function(arg1,arg2,arg3,arg4,arg5,arg6,arg7:uint_ptr):int_ptr; stdcall; + sp8 = function(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8:uint_ptr):int_ptr; stdcall; + + cp0 = function:int_ptr; cdecl; + cp1 = function(arg1:uint_ptr):int_ptr; cdecl; + cp2 = function(arg1,arg2:uint_ptr):int_ptr; cdecl; + cp3 = function(arg1,arg2,arg3:uint_ptr):int_ptr; cdecl; + cp4 = function(arg1,arg2,arg3,arg4:uint_ptr):int_ptr; cdecl; + cp5 = function(arg1,arg2,arg3,arg4,arg5:uint_ptr):int_ptr; cdecl; + cp6 = function(arg1,arg2,arg3,arg4,arg5,arg6:uint_ptr):int_ptr; cdecl; + cp7 = function(arg1,arg2,arg3,arg4,arg5,arg6,arg7:uint_ptr):int_ptr; cdecl; + cp8 = function(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8:uint_ptr):int_ptr; cdecl; + +//----- Support functions ----- + +//----- Object realization ----- + +constructor tCallAction.Create(uid:dword); +begin + inherited Create(uid); + + argcount:=0; + dllname :=nil; + funcname:=nil; +end; + +destructor tCallAction.Destroy; +begin + mFreeMem(dllname); + mFreeMem(funcname); + + inherited Destroy; +end; +{ +function tCallAction.Clone:tBaseAction; +begin + result:=.Create(0); + Duplicate(result); + +end; +} +function tCallAction.DoAction(var WorkData:tWorkData):LRESULT; +var + hDLL:THANDLE; + pp:pointer; + res:LRESULT; + largv:array [0..MaxArgCount-1] of uint_ptr; + i:integer; +begin + result:=0; + if (dllname =nil) or (dllname^ =#0) or + (funcname=nil) or (funcname^=#0) then + begin + // clear last result? + exit; + end; + + hDLL:=LoadLibraryA(dllname); +// hDLL:=GetDllHandle(dllname); + if hDLL<>0 then + begin + pp:=GetProcAddress(hDLL,funcname); + if pp<>nil then + begin + // prepare arguments? + for i:=0 to argcount-1 do + begin + largv[i]:=argv[i]; + PreProcess(argf[i],LPARAM(largv[i]),WorkData); + end; + // call function + case argcount of + 0: begin + if (flags and ACF_CDECL)<>0 then + res:=cp0(pp) + else + res:=sp0(pp); + end; + 1: begin + if (flags and ACF_CDECL)<>0 then + res:=cp1(pp)(largv[0]) + else + res:=sp1(pp)(largv[0]); + end; + 2: begin + if (flags and ACF_CDECL)<>0 then + res:=cp2(pp)(largv[0],largv[1]) + else + res:=sp2(pp)(largv[0],largv[1]); + end; + 3: begin + if (flags and ACF_CDECL)<>0 then + res:=cp3(pp)(largv[0],largv[1],largv[2]) + else + res:=sp3(pp)(largv[0],largv[1],largv[2]); + end; + 4: begin + if (flags and ACF_CDECL)<>0 then + res:=cp4(pp)(largv[0],largv[1],largv[2],largv[3]) + else + res:=sp4(pp)(largv[0],largv[1],largv[2],largv[3]); + end; + 5: begin + if (flags and ACF_CDECL)<>0 then + res:=cp5(pp)(largv[0],largv[1],largv[2],largv[3],largv[4]) + else + res:=sp5(pp)(largv[0],largv[1],largv[2],largv[3],largv[4]); + end; + 6: begin + if (flags and ACF_CDECL)<>0 then + res:=cp6(pp)(largv[0],largv[1],largv[2],largv[3],largv[4],largv[5]) + else + res:=sp6(pp)(largv[0],largv[1],largv[2],largv[3],largv[4],largv[5]); + end; + 7: begin + if (flags and ACF_CDECL)<>0 then + res:=cp7(pp)(largv[0],largv[1],largv[2],largv[3],largv[4],largv[5],largv[6]) + else + res:=sp7(pp)(largv[0],largv[1],largv[2],largv[3],largv[4],largv[5],largv[6]); + end; + 8: begin + if (flags and ACF_CDECL)<>0 then + res:=cp8(pp)(largv[0],largv[1],largv[2],largv[3],largv[4],largv[5],largv[6],largv[7]) + else + res:=sp8(pp)(largv[0],largv[1],largv[2],largv[3],largv[4],largv[5],largv[6],largv[7]); + end; + end; + + ClearResult(WorkData); + // result type processing + if (flags and ACF_RSTRING)<>0 then + begin + if (flags and ACF_RUNICODE)=0 then + AnsiToWide(pAnsiChar(res),pWideChar(WorkData.LastResult),MirandaCP) + else + StrDupW(pWideChar(WorkData.LastResult),pWideChar(res)); + WorkData.ResultType:=rtWide; + + if (flags and ACF_RFREEMEM)<>0 then + mFreeMem(pAnsiChar(res)); //?? Miranda MM?? + end + else if (flags and ACF_RSTRUCT)=0 then + begin + WorkData.ResultType:=rtInt +{!!!! + end + else if (flags and ACF_RSTRUCT)<>0 then + begin + PostProcess(flags ,lwparam,WorkData); + PostProcess(flags2,llparam,WorkData); +} + end; + + end; +// FreeDllHandle(hDLL); + FreeLibrary(hDLL); + end; + +end; + +procedure LoadParam(section:PAnsiChar;flags:dword; var param:pointer); +begin + if (flags and (ACF_CURRENT or ACF_RESULT or ACF_PARAM))=0 then + begin + if (flags and ACF_STRUCT)<>0 then + param:=DBReadUTF8(0,DBBranch,section,nil) + else + param:=DBReadUnicode(0,DBBranch,section,nil); + end; +end; + +procedure tCallAction.Load(node:pointer;fmt:integer); +var + section: array [0..127] of AnsiChar; + pc,p,pd,ppd:pAnsiChar; + i:integer; +begin + inherited Load(node,fmt); + case fmt of + 0: begin + pc:=StrCopyE(section,pAnsiChar(node)); + StrCopy(pc,opt_dllname ); dllname :=DBReadString(0,DBBranch,section); + StrCopy(pc,opt_funcname); funcname:=DBReadString(0,DBBranch,section); + StrCopy(pc,opt_argcount); argcount:=DBReadByte (0,DBBranch,section); + if argcount>0 then + begin + pd:=nil; + for i:=0 to argcount-1 do + begin + IntToStr(StrCopyE(pc,opt_argf),i); argf[i]:=DBReadDWord (0,DBBranch,section); + IntToStr(StrCopyE(pc,opt_argn),i); p :=DBReadString(0,DBBranch,section); + if (p=nil) or (p^=#0) then + begin + if pd=nil then + pd:=Translate('Argument'); + ppd:=StrCopyE(argn[i],pd); ppd^:=' '; inc(ppd); + IntToStr(ppd,i+1); + end + else + StrCopy(argn[i],p); + mFreeMem(p); + IntToStr(StrCopyE(pc,opt_argv),i); LoadParam(section,argf[i],pointer(argv[i])); + end; + end; + end; +{ + 1: begin + end; +} + end; +end; + +procedure SaveParam(section:PAnsiChar;flags:dword; param:pointer); +begin + if (flags and (ACF_CURRENT or ACF_RESULT or ACF_PARAM))=0 then + begin + if pointer(param)<>nil then + begin + if (flags and ACF_STRUCT)<>0 then + DBWriteUTF8(0,DBBranch,section,param) + else + DBWriteUnicode(0,DBBranch,section,param); + end; + end; +end; + +procedure tCallAction.Save(node:pointer;fmt:integer); +var + section: array [0..127] of AnsiChar; + pc:pAnsiChar; + i:integer; +begin + inherited Save(node,fmt); + case fmt of + 0: begin + pc:=StrCopyE(section,pAnsiChar(node)); + StrCopy(pc,opt_dllname ); DBWriteString(0,DBBranch,section,dllname); + StrCopy(pc,opt_funcname); DBWriteString(0,DBBranch,section,funcname); + StrCopy(pc,opt_argcount); DBWriteByte (0,DBBranch,section,argcount); + if argcount>0 then + begin + for i:=0 to argcount-1 do + begin + IntToStr(StrCopyE(pc,opt_argf),i); DBWriteDWord (0,DBBranch,section,argf[i]); + IntToStr(StrCopyE(pc,opt_argn),i); DBWriteString(0,DBBranch,section,argn[i]); + IntToStr(StrCopyE(pc,opt_argv),i); SaveParam(section,argf[i],pointer(argv[i])); + end; + end; + end; +{ + 1: begin + end; +} + end; +end; + +//----- Dialog realization ----- + +{ + IDC_ARGNUM userdata = current item (argument number) + IDC_ARGCOUNT userdata = arguments buffer + Dialog userdata = parameter control +} + +type + peditvalues = ^teditvalues; + teditvalues = record + argf:array [0..MaxArgCount-1] of dword; + argv:array [0..MaxArgCount-1] of uint_ptr; + argn:array [0..MaxArgCount-1,0..MaxArgNameLen-1] of AnsiChar; + end; + +function GetArgumentWindow(Dialog:HWND):HWND; +begin + result:=GetWindowLongPtrW(GetDlgItem(Dialog,IDC_CLOSE_ARG),GWLP_USERDATA); +end; + +function GetResultWindow(Dialog:HWND):HWND; +begin + result:=GetWindowLongPtrW(GetDlgItem(Dialog,IDC_CLOSE_RES),GWLP_USERDATA); +end; + +function GetEditValues(Dialog:HWND):pointer; +begin + result:=pointer(GetWindowLongPtrW(GetDlgItem(Dialog,IDC_ARGCOUNT),GWLP_USERDATA)); +end; + +function ChangeArgNumber(Dialog:HWND;cnt:integer=-1):integer; +var + wnd,wnd1:HWND; + tr:bool; + pe:peditvalues; + i:integer; +begin + if cnt<0 then + cnt:=GetDlgItemInt(Dialog,IDC_ARGCOUNT,tr,false) +// cnt:=CB_GetData(GetDlgItem(Dialog,IDC_ARGCOUNT)) + else + SendMessage(GetDlgItem(Dialog,IDC_ARGCOUNT),CB_SETCURSEL,cnt,0); + + wnd :=GetArgumentWindow(Dialog); + wnd1:=GetDlgItem(Dialog,IDC_ARGNUM); + SendMessage(wnd1,CB_RESETCONTENT,0,0); + if cnt=0 then + begin + ShowWindow(wnd ,SW_HIDE); + ShowWindow(wnd1,SW_HIDE); + end + else + begin + if IsDlgButtonChecked(Dialog,IDC_CLOSE_ARG)<>BST_UNCHECKED then + begin + ShowWindow(wnd ,SW_SHOW); + ShowWindow(wnd1,SW_SHOW); + end; + pe:=GetEditValues(Dialog); + + for i:=0 to cnt-1 do + begin + InsertString(wnd1,i,@pe^.argn[i]); + end; + SendMessage(wnd1,CB_SETCURSEL,0,0); + end; + result:=cnt; +end; + +procedure FillTemplates(fwnd:HWND); +var + p,pp,pz:pAnsiChar; + lptr:pointer; + i:integer; +begin + SendMessage(fwnd,CB_RESETCONTENT,0,0); + + p:=GetSectionList(storage,namespace); + pp:=p; + i:=0; + while p^<>#0 do + begin + lptr:=SearchSection(storage,p,namespace); + pz:=StrScan(p,'$'); + if pz=nil then + pz:=p-1; + // add function if not found + if SendMessageA(fwnd,CB_FINDSTRINGEXACT,-1,LParam(pz+1))=CB_ERR then + CB_AddStrData(fwnd,pz+1,int_ptr(lptr){not so required}, i); + + while p^<>#0 do inc(p); inc(p); + inc(i); + end; + FreeSectionList(pp); + if i>0 then + begin + SendMessage(fwnd,CB_SETCURSEL,0,0); + end; +end; + +procedure SearchDllByFName(flist,dlist:HWND;idx:Integer=-1); +var + pc,p,pp,pz:pAnsiChar; + lptr:pointer; + buf:array [0..31] of AnsiChar; + buf1:array [0..63] of AnsiChar; + i:integer; +begin + if idx<0 then + pc:=GetDlgText(flist,true) + else + begin + pc:=@buf1; + SendMessageA(flist,CB_GETLBTEXT,idx,LParam(@buf1)); + end; + + SendMessage(dlist,CB_RESETCONTENT,0,0); + + p:=GetSectionList(storage,namespace); + pp:=p; + i:=0; + while p^<>#0 do + begin + lptr:=SearchSection(storage,p,namespace); + pz:=StrScan(p,'$'); + if (pz<>nil) and (StrCmp(pz+1,pc)=0) then + begin + // add dll name + StrCopy(buf,p,pz-p); + CB_AddStrData(dlist,buf,int_ptr(lptr), i); + inc(i); + end; + + while p^<>#0 do inc(p); inc(p); + end; + FreeSectionList(pp); + if idx<0 then + mFreeMem(pc); + + if i>0 then + SendMessage(dlist,CB_SETCURSEL,0,0); +end; + +procedure FillByTemplate(Dialog:HWND); +var + buf:array [0..15] of AnsiChar; + fwnd,dwnd:HWND; + sect:pointer; + pe:peditvalues; + pc,pd,ppd:pAnsiChar; + sel,cnt,i:integer; +begin + fwnd:=GetDlgItem(Dialog,IDC_LIST_FUNC); + dwnd:=GetDlgItem(Dialog,IDC_LIST_DLL); + // right now, without manual typing, by selecting only + sect:=nil; + sel:=SendMessage(dwnd,CB_GETCURSEL,0,0); + if sel=CB_ERR then + begin + sel:=SendMessage(fwnd,CB_GETCURSEL,0,0); + if sel<>CB_ERR then + sect:=pointer(CB_GetData(fwnd,sel)); + end + else + sect:=pointer(CB_GetData(dwnd,sel)); + if sect=nil then + exit; + +// ClearFields if templated found + if StrCmp(GetParamSectionStr(sect,'calltype',nil),'cdecl')=0 then + begin + CheckDlgButton(Dialog,IDC_CDECL,BST_CHECKED); + CheckDlgButton(Dialog,IDC_STDCALL,BST_UNCHECKED); + end + else + begin + CheckDlgButton(Dialog,IDC_CDECL,BST_UNCHECKED); + CheckDlgButton(Dialog,IDC_STDCALL,BST_CHECKED); + end; + + cnt:=GetParamSectionInt(sect,'argcount'); + pe:=GetEditValues(Dialog); + pd:=nil; + for i:=0 to cnt-1 do + begin + IntToStr(StrCopyE(buf,opt_argn),i+1); pc:=GetParamSectionStr(sect,buf); + if (pc=nil) or (pc^=#0) then + begin + if pd=nil then + pd:=Translate('Argument'); + ppd:=StrCopyE(pe^.argn[i],pd); ppd^:=' '; inc(ppd); + IntToStr(ppd,i+1); + end + else + StrCopy(pe^.argn[i],pc); + + IntToStr(StrCopyE(buf,opt_argv),i+1); + + mFreeMem(pe^.argv[i]); + StrDup(pAnsiChar(pe^.argv[i]),GetParamSectionStr(sect,buf,'')); + pe^.argf[i]:=ACF_TEMPLATE; + end; + ChangeArgNumber(Dialog,cnt); + FillParam(GetArgumentWindow(Dialog),pointer(pe^.argv[0])); + +end; + +function FillDllName(Dialog:HWND;idc:integer):boolean; +var + pw:array [0..1023] of WideChar; + ppw:pWideChar; +begin +// mGetMem(pw,1024*SizeOf(WideChar)); + ppw:=GetDlgText(Dialog,idc); + result:=ShowDlgW(pw,ppw); + if result then + begin + SetDlgItemTextW(Dialog,idc,pw); + end; + mFreeMem(ppw); +// mFreeMem(pw); +end; + +procedure ShowHideBlock(Dialog:HWND;showarg:boolean); +var + wnd,wnd1:HWND; + rc:TRECT; + pt:TPOINT; + tr:bool; + arg,res:integer; +begin + wnd1:=GetArgumentWindow(Dialog); + if showarg then + begin + arg:=SW_SHOW; + res:=SW_HIDE; + wnd:=wnd1; + end + else + begin + arg:=SW_HIDE; + res:=SW_SHOW; + wnd:=GetDlgItem(Dialog,IDC_CLOSE_ARG); + end; + + GetWindowRect(wnd,rc); + pt.x:=rc.left; + pt.y:=rc.bottom; + ScreenToClient(Dialog,pt); + SetWindowPos(GetDlgItem(Dialog,IDC_CLOSE_RES), + HWND_TOP,1,pt.y+2,0,0,SWP_NOZORDER or SWP_NOSIZE); + + ShowWindow(GetResultWindow(Dialog),res); + + + ShowWindow(GetDlgItem(Dialog,IDC_ARGSTAT ),arg); + ShowWindow(GetDlgItem(Dialog,IDC_ARGCOUNT),arg); + + if GetDlgItemInt(Dialog,IDC_ARGCOUNT,tr,false)=0 then +// if CB_GetData(GetDlgItem(Dialog,IDC_ARGCOUNT))=0 then + arg:=SW_HIDE; + + ShowWindow(GetDlgItem(Dialog,IDC_ARGNUM),arg); + ShowWindow(wnd1,arg); +end; + +procedure MakeDLLCacheList(wnd:HWND); +begin + SendMessage(wnd,CB_RESETCONTENT,0,0); + InsertString(wnd,0,'Keep to end'); + InsertString(wnd,1,'Close immediately'); + InsertString(wnd,2,'Close for macro'); + SendMessage(wnd,CB_SETCURSEL,0,0); +end; + +procedure ClearFields(Dialog:HWND); +begin + CheckDlgButton(Dialog,IDC_CDECL ,BST_UNCHECKED); + CheckDlgButton(Dialog,IDC_STDCALL,BST_UNCHECKED); +{!! + CheckDlgButton(Dialog,IDC_DLL_IMM ,BST_UNCHECKED); + CheckDlgButton(Dialog,IDC_DLL_MACRO,BST_UNCHECKED); + CheckDlgButton(Dialog,IDC_DLL_END ,BST_UNCHECKED); +} + ClearParamFields (GetArgumentWindow(Dialog)); + ClearResultFields(GetResultWindow (Dialog)); + + ShowHideBlock(Dialog,true); +end; + +function DlgProc(Dialog:HWnd;hMessage:UINT;wParam:WPARAM;lParam:LPARAM):lresult; stdcall; +var + wnd,wnd1:HWND; + buf:array [0..63] of AnsiChar; + pc:pAnsiChar; + pe:peditvalues; + rc:TRECT; + pt:TPOINT; + tr:bool; + i:integer; +begin + result:=0; + + case hMessage of + WM_DESTROY: begin + pe:=GetEditValues(Dialog); + for i:=0 to MaxArgCount-1 do + begin + //?? depends of copying from edit to action + ClearParam(pe.argf[i],pe.argv[i]); + end; + mFreeMem(pe); + + CloseStorage(storage); + end; + + WM_INITDIALOG: begin + //insert additional dialogs + CheckDlgButton(Dialog,IDC_CLOSE_ARG,BST_CHECKED); + wnd1:=GetDlgItem(Dialog,IDC_CLOSE_ARG); + EnableWindow(wnd1,false); + wnd:=GetDlgItem(Dialog,IDC_ARGNUM); // count offset from + GetWindowRect(wnd,rc); + pt.x:=rc.left; + pt.y:=rc.bottom; + ScreenToClient(Dialog,pt); + SetWindowLongPtrW(wnd1,GWLP_USERDATA,CreateParamBlock(Dialog,0,pt.y+2,168)); + + CheckDlgButton(Dialog,IDC_CLOSE_RES,BST_UNCHECKED); + wnd:=GetDlgItem(Dialog,IDC_CLOSE_RES); // count offset from initial pos + GetWindowRect(wnd,rc); + EnableWindow(wnd,true); + pt.x:=rc.left; + pt.y:=rc.bottom; + ScreenToClient(Dialog,pt); + wnd1:=CreateResultBlock(Dialog,0,pt.y+2,168); + SetWindowLongPtrW(wnd,GWLP_USERDATA,wnd1); + ShowWindow(wnd1,SW_HIDE); + + mGetMem(pe,SizeOf(teditvalues)); + FillChar(pe^,SizeOf(teditvalues),0); + SetWindowLongPtrW(GetDlgItem(Dialog,IDC_ARGCOUNT),GWLP_USERDATA,uint_ptr(pe)); + + // function argument amount list + wnd1:=GetDlgItem(Dialog,IDC_ARGCOUNT); + SendMessage(wnd1,CB_RESETCONTENT,0,0); + for i:=0 to MaxArgCount do + begin + InsertString(wnd1,i,IntToStr(buf,i)); + end; + SendMessage(wnd1,CB_SETCURSEL,0,0); + + // function templates + storage:=OpenStorage(API_FUNCTION_FILE); + if storage<>nil then + begin + wnd :=GetDlgItem(Dialog,IDC_LIST_FUNC); + FillTemplates(wnd) + end; + + MakeDLLCacheList(GetDlgItem(Dialog,IDC_DLL_CACHE)); + + TranslateDialogDefault(Dialog); + end; + + WM_ACT_SETVALUE: begin + ClearFields(Dialog); + + with tCallAction(lParam) do + begin + + // set function + SetDlgItemTextA(Dialog,IDC_LIST_FUNC,funcname); + // sset dll name (semi-auto) + SetDlgItemTextA(Dialog,IDC_LIST_DLL ,dllname); + // set call type (auto) + if (flags and ACF_CDECL)<>0 then + CheckDlgButton(Dialog,IDC_CDECL ,BST_CHECKED) + else + CheckDlgButton(Dialog,IDC_STDCALL,BST_CHECKED); +{!! + // set dll cache option + if (flags and ACF_CACHE_NOW)<>0 then + CheckDlgButton(Dialog,IDC_DLL_IMM,BST_CHECKED) + else if (flags and ACF_CACHE_MACRO)<>0 then + CheckDlgButton(Dialog,IDC_DLL_MACRO,BST_CHECKED) + else + CheckDlgButton(Dialog,IDC_DLL_END,BST_CHECKED); +} + if (flags and ACF_CACHE_NOW)<>0 then + i:=1 + else if (flags and ACF_CACHE_MACRO)<>0 then + i:=2 + else + i:=0; + SendMessage(GetDlgItem(Dialog,IDC_DLL_CACHE),CB_SETCURSEL,i,0); + + // set argument amount + // (auto) + ChangeArgNumber(Dialog,argcount); + if argcount>0 then + begin + // copy action values to edit values + pe:=GetEditValues(Dialog); + // need to clear ALL params before? or keep as is? + // depends of enabled or disabled arg amount combo + for i:=0 to argcount-1 do + begin + StrCopy(pe^.argn[i],argn[i]); + pe^.argf[i]:=DuplicateParam(argf[i],argv[i],pe^.argv[i]); + end; + + wnd1:=GetDlgItem(Dialog,IDC_ARGNUM); + SendMessage(wnd1,CB_RESETCONTENT,0,0); + + for i:=0 to argcount-1 do + begin + InsertString(wnd1,i,@pe^.argn[i]); + end; + SendMessage(wnd1,CB_SETCURSEL,0,0); + + SetParamValue (GetArgumentWindow(Dialog),argf[0],pointer(argv[0])); + SetResultValue(GetResultWindow (Dialog),flags); + end; + + end; + end; + + WM_ACT_RESET: begin + ClearFields(Dialog); + SetDlgItemTextW(Dialog,IDC_LIST_FUNC,nil); + SetDlgItemTextW(Dialog,IDC_LIST_DLL ,nil); + SendMessage(GetDlgItem(Dialog,IDC_LIST_DLL),CB_RESETCONTENT,0,0); + CheckDlgButton(Dialog,IDC_STDCALL,BST_CHECKED); +//!! CheckDlgButton(Dialog,IDC_DLL_END,BST_CHECKED); + SendMessage(GetDlgItem(Dialog,IDC_DLL_CACHE),CB_SETCURSEL,0,0); + + ChangeArgNumber(Dialog,0); + + pe:=GetEditValues(Dialog); + + pc:=StrCopyE(buf,Translate('Argument')); pc^:=' '; inc(pc); + for i:=0 to MaxArgCount-1 do + begin + IntToStr(pc,i+1); + StrCopy(pe^.argn[i],buf); + ClearParam(pe.argf[i],pe.argv[i]); + end; + + end; + + WM_ACT_SAVE: begin + with tCallAction(lParam) do + begin + argcount:=GetDlgItemInt(Dialog,IDC_ARGCOUNT,tr,false); + if argcount>0 then + begin + pe:=GetEditValues(Dialog); + // save current argument + i:=GetWindowLongPtrW(GetDlgItem(Dialog,IDC_ARGNUM),GWLP_USERDATA); // current saved +// i:=CB_GetData(GetDlgItem(Dialog,IDC_ARGNUM)); // current from data + GetParamValue(GetArgumentWindow(Dialog),pe^.argf[i],pointer(pe^.argv[i])); + + // copy edit values to action values + for i:=0 to argcount-1 do + begin + StrCopy(argn[i],pe^.argn[i]); + argf[i]:=DuplicateParam(pe^.argf[i],pe^.argv[i],argv[i]); + end; + end; + + flags:=flags or GetResultValue(GetResultWindow(Dialog)); + if IsDlgButtonChecked(Dialog,IDC_CDECL)<>BST_UNCHECKED then + flags:=flags or ACF_CDECL; +{!! + if IsDlgButtonChecked(Dialog,IDC_DLL_IMM)<>BST_UNCHECKED then + flags:=flags or ACF_CACHE_NOW + else if IsDlgButtonChecked(Dialog,IDC_DLL_MACRO)<>BST_UNCHECKED then + flags:=flags or ACF_CACHE_MACRO; +} + case SendMessage(GetDlgItem(Dialog,IDC_DLL_CACHE),CB_GETCURSEL,0,0) of + 1: flags:=flags or ACF_CACHE_NOW; + 2: flags:=flags or ACF_CACHE_MACRO; + end; + + funcname:=GetDlgText(Dialog,IDC_LIST_FUNC,true); + dllname :=GetDlgText(Dialog,IDC_LIST_DLL ,true); + + end; + end; + + WM_COMMAND: begin + case wParam shr 16 of + + BN_CLICKED: begin + case loword(wParam) of + IDC_DLL: begin + if not FillDllName(Dialog,IDC_LIST_DLL) then + exit; + end; + + IDC_CLOSE_RES: begin + // close buttons + EnableWindow(LParam,false); + EnableWindow(GetDlgItem(Dialog,IDC_CLOSE_ARG),true); + CheckDlgButton(Dialog,IDC_CLOSE_ARG,BST_UNCHECKED); + + ShowHideBlock(Dialog,false); + end; + + IDC_CLOSE_ARG: begin + // close buttons + EnableWindow(LParam,false); + EnableWindow(GetDlgItem(Dialog,IDC_CLOSE_RES),true); + CheckDlgButton(Dialog,IDC_CLOSE_RES,BST_UNCHECKED); + + ShowHideBlock(Dialog,true); + end; + end; + SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0); + end; + + CBN_EDITCHANGE, + EN_CHANGE: begin + SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0); + + if loword(wParam)=IDC_LIST_FUNC then + begin + wnd :=GetDlgItem(Dialog,IDC_LIST_FUNC); + wnd1:=GetDlgItem(Dialog,IDC_LIST_DLL); + SearchDllByFName(wnd,wnd1); + end; + end; + + CBN_SELCHANGE: begin + case loword(wParam) of + IDC_LIST_FUNC: begin + // search in templates + SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0); + + wnd :=GetDlgItem(Dialog,IDC_LIST_FUNC); + wnd1:=GetDlgItem(Dialog,IDC_LIST_DLL); + // search this name as part in all ini templates, + // fill IDC_LIST_DLL combobox + SearchDllByFName(wnd,wnd1,SendMessage(wnd,CB_GETCURSEL,0,0)); + FillByTemplate(Dialog); + end; + + IDC_LIST_DLL: begin + SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0); + FillByTemplate(Dialog); + end; + + IDC_ARGNUM: begin + pe:=GetEditValues(Dialog); + + wnd:=GetArgumentWindow(Dialog); + // 1 - save old argument value (save as for dialogs?) + i:=GetWindowLongPtrW(lParam,GWLP_USERDATA); + GetParamValue(wnd,pe^.argf[i],pointer(pe^.argv[i])); + // 2 - set new argument value + i:=CB_GetData(lParam); + SetParamValue(wnd,pe^.argf[i],pointer(pe^.argv[i])); + + SetWindowLongPtrW(lParam,GWLP_USERDATA,i); + end; + + IDC_ARGCOUNT: begin + ChangeArgNumber(Dialog); + SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0); + end; + end; + end; + end; + end; + + WM_HELP: begin + result:=1; + end; + + end; +end; + +//----- Export/interface functions ----- + +var + vc:tActModule; + +function CreateAction:tBaseAction; +begin + result:=tCallAction.Create(vc.Hash); +end; + +function CreateDialog(parent:HWND):HWND; +begin + result:=CreateDialogW(hInstance,'IDD_ACTCALL',parent,@DlgProc); +end; + +procedure Init; +begin + vc.Next :=ModuleLink; + + vc.Name :='Function call'; + vc.Dialog :=@CreateDialog; + vc.Create :=@CreateAction; + vc.Icon :='IDI_CALL'; + + ModuleLink :=@vc; +end; + +begin + Init; +end. diff --git a/plugins/Actman30/iac_call.rc b/plugins/Actman30/iac_call.rc new file mode 100644 index 0000000000..f32f7bc303 --- /dev/null +++ b/plugins/Actman30/iac_call.rc @@ -0,0 +1,38 @@ +#include "i_cnst_call.inc" + +LANGUAGE 0,0 + +IDD_ACTCALL DIALOGEX 0, 0, 168, 200, 0 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0 +{ + RTEXT "Function name", -1, 1, 0, 166, 12, SS_CENTERIMAGE + COMBOBOX IDC_LIST_FUNC , 1, 12, 166, 128, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL + RTEXT "DLL name" , -1, 1, 26, 166, 12, SS_CENTERIMAGE + COMBOBOX IDC_LIST_DLL , 1, 38, 148, 48, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL + PUSHBUTTON "...", IDC_DLL , 151, 38, 16, 12 + + GROUPBOX "Call type" , -1, 1, 52, 166, 22, WS_GROUP + AUTORADIOBUTTON "cdecl" , IDC_CDECL , 4, 61, 52, 11 + AUTORADIOBUTTON "stdcall" , IDC_STDCALL , 57, 61, 52, 11 + + AUTOCHECKBOX "Arguments", IDC_CLOSE_ARG, 1, 78, 166, 11, BS_PUSHLIKE + AUTOCHECKBOX "Result" , IDC_CLOSE_RES, 1, 91, 166, 11, BS_PUSHLIKE + + RTEXT "Number of arguments", IDC_ARGSTAT, 1, 90, 132, 12, SS_CENTERIMAGE + COMBOBOX IDC_ARGCOUNT , 137, 89, 30, 76, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL + // argument list fills by amount of it? + COMBOBOX IDC_ARGNUM , 1, 104, 166, 76, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL + + RTEXT "DLL Handle Cache", -1, 1, 173, 166, 12, SS_CENTERIMAGE + COMBOBOX IDC_DLL_CACHE , 1, 185, 166, 76, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL +/* + GROUPBOX "DLL Handle Cache" , -1, 1, 156, 166, 44, WS_GROUP + AUTORADIOBUTTON "Close immediately", IDC_DLL_IMM , 4, 165, 162, 11 + AUTORADIOBUTTON "Close for macro" , IDC_DLL_MACRO, 4, 176, 162, 11 + AUTORADIOBUTTON "Keep to end" , IDC_DLL_END , 4, 187, 162, 11 +*/ +} + +IDI_CALL ICON "ico\call.ico" diff --git a/plugins/Actman30/iac_call.res b/plugins/Actman30/iac_call.res new file mode 100644 index 0000000000..bda9bc40b1 Binary files /dev/null and b/plugins/Actman30/iac_call.res differ diff --git a/plugins/Actman30/iac_chain.res b/plugins/Actman30/iac_chain.res new file mode 100644 index 0000000000..a9ba4f5515 Binary files /dev/null and b/plugins/Actman30/iac_chain.res differ diff --git a/plugins/Actman30/iac_contact.rc b/plugins/Actman30/iac_contact.rc index 65a7d2843e..b3923502b3 100644 --- a/plugins/Actman30/iac_contact.rc +++ b/plugins/Actman30/iac_contact.rc @@ -7,7 +7,7 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 0, 0 { - RTEXT "Choose contact", -1 , 0, 2, 160, 10 + RTEXT "Choose Contact", -1 , 0, 2, 160, 10 CONTROL "Refresh",IDC_CNT_REFRESH,"MButtonClass",WS_TABSTOP,1,12,16,16,$18000000 COMBOBOX IDC_CONTACTLIST, 19, 14, 148, 128, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL AUTOCHECKBOX "Keep handle only", IDC_CNT_KEEP , 1, 31, 160, 11 diff --git a/plugins/Actman30/iac_contact.res b/plugins/Actman30/iac_contact.res new file mode 100644 index 0000000000..2b8b4ba352 Binary files /dev/null and b/plugins/Actman30/iac_contact.res differ diff --git a/plugins/Actman30/iac_database.res b/plugins/Actman30/iac_database.res new file mode 100644 index 0000000000..b74dee1d7b Binary files /dev/null and b/plugins/Actman30/iac_database.res differ diff --git a/plugins/Actman30/iac_global.pas b/plugins/Actman30/iac_global.pas index ef069d8e34..11bfbba275 100644 --- a/plugins/Actman30/iac_global.pas +++ b/plugins/Actman30/iac_global.pas @@ -12,7 +12,7 @@ var const IcoLibPrefix = 'action_type_'; const - NoDescription:PWideChar='No description'; + NoDescription:PWideChar='No Description'; const protostr = ''; const @@ -94,7 +94,7 @@ function ImportContactINI(node:pointer):THANDLE; implementation -uses Common, global, dbsettings, mirutils; +uses Common, global, dbsettings, base64, mirutils; //----- tBaseAction code ----- const @@ -308,7 +308,6 @@ var dbv:TDBVARIANT; tmp:pWideChar; is_chat:boolean; - bufLen:int; begin with xmlparser do begin @@ -337,8 +336,7 @@ begin DBVT_UTF8 : WideToUTF8(tmp,dbv.szVal.A); DBVT_WCHAR : dbv.szVal.W:=tmp; DBVT_BLOB : begin - dbv.pbVal := mir_base64_decode(FastWideToAnsi(tmp,pAnsiChar(dbv.pbVal)),bufLen); - dbv.cpbVal := bufLen; + Base64Decode(FastWideToAnsi(tmp,pAnsiChar(dbv.pbVal)),dbv.pbVal); end; end; end; @@ -427,4 +425,73 @@ begin end; end; } + +//----- DLL Handle Cache ----- +type + tDLLCacheElement = record + DLLName :PAnsiChar; + DLLHandle:THANDLE; + count :word; // count for end-of-macro flag + flags :byte; // handle free mode + end; + tDLLCache = array of tDLLCacheElement; + +const + actDLLCache: tDLLCache = nil; + +function GetDllHandle(dllname:pAnsiChar;mode:dword=0):THANDLE; +var + i:integer; +begin + result:=LoadLibraryA(dllname); +exit; + i:=0; + while i<=HIGH(actDLLCache) do + begin + if StrCmp(actDLLCache[i].DllName,dllname)=0 then + begin + result:=actDLLCache[i].DllHandle; + // check mode + exit; + end; + inc(i); + end; + result:=LoadLibraryA(dllname); + // check mode + SetLength(actDLLCache,i); + StrDup(actDLLCache[i].DllName,dllname); + actDLLCache[i].DllHandle:=result; +// actDLLCache.flags:=; +end; + +procedure CloseDllHandle(handle:THANDLE); +var + i:integer; +begin + FreeLibrary(handle); +exit; + i:=0; + while i<=HIGH(actDLLCache) do + begin + if actDLLCache[i].DllHandle=handle then + begin + // check mode + FreeLibrary(actDLLCache[i].DllHandle); + exit; + end; + inc(i); + end; + FreeLibrary(handle); +end; + +procedure FreeDllHandleCache; +var + i:integer; +begin + i:=0; + while i<=HIGH(actDLLCache) do + begin + end; +end; + end. diff --git a/plugins/Actman30/iac_inout.res b/plugins/Actman30/iac_inout.res new file mode 100644 index 0000000000..f912dc3066 Binary files /dev/null and b/plugins/Actman30/iac_inout.res differ diff --git a/plugins/Actman30/iac_jump.pas b/plugins/Actman30/iac_jump.pas index 9a54d7181b..7d3d405f2a 100644 --- a/plugins/Actman30/iac_jump.pas +++ b/plugins/Actman30/iac_jump.pas @@ -373,7 +373,7 @@ begin SendMessage(wnd,CB_RESETCONTENT,0,0); InsertString(wnd,cardinal(aeGT),'> greater'); - InsertString(wnd,cardinal(aeLT),'> lesser'); + InsertString(wnd,cardinal(aeLT),'< lesser'); InsertString(wnd,cardinal(aeEQ),'= equ'); InsertString(wnd,cardinal(aeXR),'^ xor'); InsertString(wnd,cardinal(aeND),'& and'); diff --git a/plugins/Actman30/iac_jump.res b/plugins/Actman30/iac_jump.res new file mode 100644 index 0000000000..387b85dfdd Binary files /dev/null and b/plugins/Actman30/iac_jump.res differ diff --git a/plugins/Actman30/iac_messagebox.res b/plugins/Actman30/iac_messagebox.res new file mode 100644 index 0000000000..27a3297a61 Binary files /dev/null and b/plugins/Actman30/iac_messagebox.res differ diff --git a/plugins/Actman30/iac_program.pas b/plugins/Actman30/iac_program.pas index 56e494b3d2..83cc60a5f9 100644 --- a/plugins/Actman30/iac_program.pas +++ b/plugins/Actman30/iac_program.pas @@ -320,13 +320,14 @@ begin CheckDlgButton(Dialog,IDC_FLAG_PARALLEL,BST_UNCHECKED); end; -procedure FillFileName(Dialog:HWND;idc:integer); +function FillFileName(Dialog:HWND;idc:integer):boolean; var pw,ppw:pWideChar; begin mGetMem(pw,1024*SizeOf(WideChar)); ppw:=GetDlgText(Dialog,idc); - if ShowDlgW(pw,ppw) then + result:=ShowDlgW(pw,ppw); + if result then begin SetDlgItemTextW(Dialog,idc,pw); SetEditFlags(Dialog,idc,EF_SCRIPT,0); @@ -437,7 +438,8 @@ begin BN_CLICKED: begin case loword(wParam) of IDC_PROGRAM: begin - FillFileName(Dialog,IDC_EDIT_PRGPATH); + if not FillFileName(Dialog,IDC_EDIT_PRGPATH) then + exit; end; end; SendMessage(GetParent(GetParent(Dialog)),PSM_CHANGED,0,0); diff --git a/plugins/Actman30/iac_program.res b/plugins/Actman30/iac_program.res new file mode 100644 index 0000000000..a7754455b4 Binary files /dev/null and b/plugins/Actman30/iac_program.res differ diff --git a/plugins/Actman30/iac_service.res b/plugins/Actman30/iac_service.res new file mode 100644 index 0000000000..35c7e96161 Binary files /dev/null and b/plugins/Actman30/iac_service.res differ diff --git a/plugins/Actman30/iac_settings.res b/plugins/Actman30/iac_settings.res new file mode 100644 index 0000000000..ee1b268205 Binary files /dev/null and b/plugins/Actman30/iac_settings.res differ diff --git a/plugins/Actman30/iac_storage.res b/plugins/Actman30/iac_storage.res new file mode 100644 index 0000000000..b87ec5fec2 Binary files /dev/null and b/plugins/Actman30/iac_storage.res differ diff --git a/plugins/Actman30/iac_text.res b/plugins/Actman30/iac_text.res new file mode 100644 index 0000000000..19c1025c8c Binary files /dev/null and b/plugins/Actman30/iac_text.res differ diff --git a/plugins/Actman30/ico/call.ico b/plugins/Actman30/ico/call.ico new file mode 100644 index 0000000000..ddddb59074 Binary files /dev/null and b/plugins/Actman30/ico/call.ico differ diff --git a/plugins/Actman30/mApiCard.res b/plugins/Actman30/mApiCard.res new file mode 100644 index 0000000000..7d6ed320b9 Binary files /dev/null and b/plugins/Actman30/mApiCard.res differ diff --git a/plugins/Actman30/make.bat b/plugins/Actman30/make.bat index 6e10afe21f..0512c815b6 100644 --- a/plugins/Actman30/make.bat +++ b/plugins/Actman30/make.bat @@ -1,18 +1,30 @@ @echo off -set myopts=-dMiranda -set dprname=actman.dpr - -for /R %%I in (*.rc) do brcc32.exe %myopts% %%I -fo%%~npI.res >nul - +set p1=%1 +set p2=%2 +if "%p1%" == "" (echo "please specify target platform by adding 'fpc' or 'fpc64 parameter to command line!'"&&pause&&goto :EOF) +if "%p2%" == "" (echo "please specify target output directory by adding 10 for bin10 or 11 for bin11 to command line!'"&&pause&&goto :EOF) if /i '%1' == 'fpc' ( - ..\FPC\bin\fpc.exe %myopts% %dprname% %2 %3 %4 %5 %6 %7 %8 %9 + set OUTDIR="..\..\bin%2\Release\Plugins" + set FPCBIN=fpc.exe ) else if /i '%1' == 'fpc64' ( - ..\FPC\bin64\ppcrossx64.exe %myopts% %dprname% %2 %3 %4 %5 %6 %7 %8 %9 -) else if /i '%1' == 'xe2' ( - ..\XE2\BIN\dcc32.exe %myopts% %dprname% %2 %3 %4 %5 %6 %7 %8 %9 -) else if /i '%1' == 'xe64' ( - ..\XE2\BIN\dcc64.exe %myopts% %dprname% %2 %3 %4 %5 %6 %7 %8 %9 -) else ( - ..\delphi\dcc32 %myopts% %dprname% %1 %2 %3 %4 %5 %6 %7 %8 %9 + set OUTDIR="..\..\bin%2\Release64\Plugins" + set FPCBIN=ppcrossx64.exe ) -del /Q /S *.res >nul +set PROJECT=Actman30 + +if not exist %OUTDIR% mkdir %OUTDIR% +md tmp + +rem brcc32.exe %myopts% options.rc -fooptions.res +rem brcc32.exe %myopts% hooks\hooks.rc -fohooks\hooks.res +rem brcc32.exe %myopts% tasks\tasks.rc -fotasks\tasks.res +rem brcc32.exe %myopts% ua\ua.rc -foua\ua.res + +%FPCBIN% @..\Utils.pas\fpc.cfg %PROJECT%.dpr %3 %4 %5 %6 %7 %8 %9 +if errorlevel 1 exit /b 1 + +move .\tmp\%PROJECT%.dll %OUTDIR% +move .\tmp\%PROJECT%.map . +del /Q tmp\* +rd tmp +exit /b 0 diff --git a/plugins/Actman30/options.res b/plugins/Actman30/options.res new file mode 100644 index 0000000000..3ca52285ec Binary files /dev/null and b/plugins/Actman30/options.res differ diff --git a/plugins/Actman30/services.ini b/plugins/Actman30/services.ini index 1366cf950d..3e3f51ca28 100644 --- a/plugins/Actman30/services.ini +++ b/plugins/Actman30/services.ini @@ -450,21 +450,21 @@ descr=Display XStatus detail [Event:Actions/Changed] alias=ME_ACT_CHANGED plugin=ActMan -descr='action group list was changed: some was added or deleted' +descr='Action group list was changed: some was added or deleted' wparam=ACTM_NEW|ACTM_DELETE|ACTM_RELOAD|ACTM_RENAME|ACTM_SORT|ACTM_LOADED lparam=0 [Event:CList/PreBuildContactMenu] alias=ME_CLIST_PREBUILDCONTACTMENU plugin=contact list -descr='the context menu for a contact is about to be built' +descr='The context menu for a contact is about to be built' wparam=hContact lparam=0 [Event:CList/DoubleClicked] alias=ME_CLIST_DOUBLECLICKED plugin=contact list -descr='double click on the CList' +descr='Double click on the CList' wparam=hContact lparam=0 @@ -521,3 +521,18 @@ value=40079 value=40080 [Const:ID_STATUS_IDLE] value=40081 + +[Function:user32.dll$MessageBoxA] +;dll= +calltype=stdcall +argcount=4 +argvalue1=0 +argvalue2=Ansi message +argvalue3=Ansi caption +argvalue4=0 +argname1=hWnd +argname2=lpText +argname3=lpCaption +argname4=uType +return=int 0 +descr=Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. diff --git a/plugins/Actman30/sparam.pas b/plugins/Actman30/sparam.pas new file mode 100644 index 0000000000..e29d375ae4 --- /dev/null +++ b/plugins/Actman30/sparam.pas @@ -0,0 +1,708 @@ +unit sparam; + +interface + +uses windows,iac_global; + +const + ACF_PARNUM = $00000001; // Param is number + ACF_UNICODE = $00000002; // Param is Unicode string + ACF_CURRENT = $00000004; // Param is ignored, used current user handle + // from current message window + ACF_RESULT = $00000008; // Param is previous action result + ACF_PARAM = $00000010; // Param is Call parameter + ACF_STRUCT = $00000020; + ACF_PARTYPE = ACF_PARNUM or ACF_UNICODE or + ACF_CURRENT or ACF_RESULT or + ACF_PARAM or ACF_STRUCT; + ACF_TEMPLATE = $00000800; + ACF_SCRIPT_PARAM = $00001000; + // dummy + ACF_STRING = 0; + + ACF_RSTRING = $00010000; // Service result is string + ACF_RUNICODE = $00020000; // Service result is Widestring + ACF_RSTRUCT = $00040000; // Service result in structure + ACF_RFREEMEM = $00080000; // Need to free memory + +function CreateParamBlock(parent:HWND;x,y,width:integer):THANDLE; +procedure ClearParamFields(Dialog:HWND); +function FillParam (Dialog:HWND;txt:pAnsiChar):integer; +function SetParamValue (Dialog:HWND; flags:dword; value:pointer):boolean; +function GetParamValue (Dialog:HWND;var flags:dword;var value:pointer):boolean; + +procedure ClearParam (flags:dword; var param); +function DuplicateParam(flags:dword; var sparam,dparam):dword; + +procedure PreProcess(flags:dword;var l_param:LPARAM;const WorkData:tWorkData); + +function CreateResultBlock(parent:HWND;x,y,width:integer):THANDLE; +procedure ClearResultFields(Dialog:HWND); +function SetResultValue(Dialog:HWND;flags:dword):integer; +function GetResultValue(Dialog:HWND):dword; + +implementation + +uses + messages, + common, editwrapper, wrapper, syswin, + m_api, sedit, strans, mirutils; + +{$include i_sparam_const.inc} +{$resource sparam.res} + +const + ptNumber = 0; + ptString = 1; + ptUnicode = 2; + ptCurrent = 3; + ptResult = 4; + ptParam = 5; + ptStruct = 6; + +const + sresInt = 0; + sresString = 1; + sresWide = 2; + sresStruct = 3; + +//----- Processing functions ----- + +procedure PreProcess(flags:dword;var l_param:LPARAM;const WorkData:tWorkData); +var + tmp1:pWideChar; +begin + with WorkData do + begin + if (flags and ACF_STRUCT)<>0 then + begin + l_param:=uint_ptr(MakeStructure(pAnsiChar(l_param),Parameter,LastResult,ResultType)) + end + else if (flags and ACF_PARAM)<>0 then + begin + l_param:=Parameter; + end + else if (flags and ACF_RESULT)<>0 then + begin + l_param:=LastResult; + end + else if (flags and ACF_CURRENT)<>0 then + begin + l_param:=WndToContact(WaitFocusedWndChild(GetForegroundwindow){GetFocus}); + end + else + begin + if (flags and ACF_SCRIPT_PARAM)<>0 then + l_param:=uint_ptr(ParseVarString(pWideChar(l_param),Parameter)); + + tmp1:=pWideChar(l_param); + if (flags and ACF_PARNUM)=0 then + begin + if (flags and ACF_UNICODE)=0 then + WideToAnsi(tmp1,pAnsiChar(l_param),MirandaCP) + else + StrDupW(pWideChar(l_param),tmp1); + end + else + l_param:=NumToInt(tmp1); + + if (flags and ACF_SCRIPT_PARAM)<>0 then + mFreeMem(tmp1); + end; + end; +end; + +procedure PostProcess(flags:dword;var l_param:LPARAM; var WorkData:tWorkData); +var + code:integer; + len:integer; + pc:pAnsiChar; +begin + if (flags and ACF_STRUCT)<>0 then + begin + with WorkData do + begin + LastResult:=GetStructureResult(l_param,@code,@len); + case code of +{ + SST_LAST: begin + result:=LastResult; + end; +} + SST_PARAM: begin //?? + LastResult:=Parameter; + ResultType:=rtInt; + end; + SST_BYTE,SST_WORD,SST_DWORD, + SST_QWORD,SST_NATIVE: begin + ResultType:=rtInt; + end; + SST_BARR: begin + StrDup(pAnsiChar(pc),pAnsiChar(LastResult),len); + AnsiToWide(pAnsiChar(pc),PWideChar(LastResult),MirandaCP); + mFreeMem(pAnsiChar(pc)); + ResultType:=rtWide; + end; + SST_WARR: begin + StrDupW(pWideChar(LastResult),pWideChar(LastResult),len); + ResultType:=rtWide; + end; + SST_BPTR: begin + AnsiToWide(pAnsiChar(LastResult),pWideChar(LastResult),MirandaCP); + ResultType:=rtWide; + end; + SST_WPTR: begin + StrDupW(pWideChar(LastResult),pWideChar(LastResult)); + ResultType:=rtWide; + end; + end; + FreeStructure(l_param); + l_param:=0; + end + end; +end; + +//----- Dialog functions ----- + +procedure MakeParamTypeList(wnd:HWND); +begin + SendMessage(wnd,CB_RESETCONTENT,0,0); + InsertString(wnd,ptNumber ,'number value'); + InsertString(wnd,ptString ,'ANSI string'); + InsertString(wnd,ptUnicode,'Unicode string'); + InsertString(wnd,ptCurrent,'current contact'); + InsertString(wnd,ptResult ,'last result'); + InsertString(wnd,ptParam ,'parameter'); + InsertString(wnd,ptStruct ,'structure'); + SendMessage(wnd,CB_SETCURSEL,0,0); +end; + +function IsParamNumber(txt:pAnsiChar):boolean; +begin + if (txt[0] in ['0'..'9']) or ((txt[0]='-') and (txt[1] in ['0'..'9'])) or + ((txt[0]='$') and (txt[1] in sHexNum)) or + ((txt[0]='0') and (txt[1]='x') and (txt[2] in sHexNum)) then + result:=true + else + result:=false; +end; + +// Set parameter type by parameter template +function FixParam(buf:PAnsiChar):integer; +begin + if StrCmp(buf,'hContact' )=0 then result:=ptCurrent + else if StrCmp(buf,'parameter' )=0 then result:=ptParam + else if StrCmp(buf,'result' )=0 then result:=ptResult + else if StrCmp(buf,'structure' )=0 then result:=ptStruct + else if StrCmp(buf,'Unicode text')=0 then result:=ptUnicode + else result:=ptString; +end; + +// get line from template +function GetParamLine(src:pAnsiChar;dst:pWideChar;var ltype:integer):pAnsiChar; +var + pp,pc:pAnsiChar; + savechar:AnsiChar; + j:integer; +begin + pc:=StrScan(src,'|'); + + if pc<>nil then + begin + savechar:=pc^; + pc^:=#0; + end; + + if IsParamNumber(src) then + begin + j:=0; + pp:=src; + repeat + dst[j]:=WideChar(pp^); + inc(j); inc(pp); + until (pp^=#0) or (pp^=' '); + dst[j]:=WideChar(pp^); // anyway, #0 or " " needs + if pp^<>#0 then + begin + dst[j+1]:='-'; dst[j+2]:=' '; inc(j,3); + FastAnsitoWideBuf(pp+1,dst+j); + StrCopyW(dst+j,TranslateW(dst+j)); + end; + ltype:=ptNumber; + end + else + begin + ltype:=FixParam(src); + StrCopyW(dst,TranslateW(FastAnsitoWideBuf(src,dst))); + end; + + if pc<>nil then + begin + pc^:=savechar; + inc(pc); + end; + + result:=pc; +end; + +// Set parameter value by parameter template +function FillParam(Dialog:HWND;txt:pAnsiChar):integer; +var + bufw:array [0..2047] of WideChar; + wnd:HWND; + p,pc:PAnsiChar; + ltype:integer; +begin + wnd:=GetDlgItem(Dialog,IDC_EDIT_PAR); + SendMessage(wnd,CB_RESETCONTENT,0,0); + if (txt<>nil) and (txt^<>#0) then + begin + result:=-1; + p:=txt; + repeat + pc:=GetParamLine(p,bufw,ltype); + if result<0 then + result:=ltype; + SendMessageW(wnd,CB_ADDSTRING,0,lparam(@bufw)); + + if result=ptStruct then + break + else + p:=pc; + until pc=nil; + end + else + result:=ptNumber; + SendMessage(wnd,CB_SETCURSEL,0,0); +end; + +procedure ClearParamFields(Dialog:HWND); +var + wnd:HWND; +begin + ShowWindow(GetDlgItem(Dialog,IDC_STRUCT),SW_HIDE); + wnd:=GetDlgItem(Dialog,IDC_EDIT_PAR); + ShowEditField (wnd,SW_SHOW); + EnableEditField(wnd,true); + SendMessage (wnd,CB_RESETCONTENT,0,0); + SetEditFlags (wnd,EF_ALL,0); + CB_SelectData(Dialog,IDC_FLAG_PAR,ptNumber); +end; + +function ParamDlgResizer(Dialog:HWND;lParam:LPARAM;urc:PUTILRESIZECONTROL):int; cdecl; +begin + case urc^.wId of + IDC_FLAG_PAR: result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; //RD_ANCHORX_RIGHT + IDC_EDIT_PAR: result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; + IDC_STRUCT: result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; + IDC_STAT_PAR: result:=RD_ANCHORX_LEFT or RD_ANCHORY_TOP; +// IDC_CLOSE: result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; + else + result:=0; + end; +end; + +function DlgParamProc(Dialog:HWnd;hMessage:uint;wParam:WPARAM;lParam:LPARAM):lresult; stdcall; +var + wnd,wnd1:HWND; + i:integer; + pcw:pWideChar; + pc:pAnsiChar; + urd:TUTILRESIZEDIALOG; +begin + result:=0; + + case hMessage of + WM_DESTROY: begin + pc:=pAnsiChar(GetWindowLongPtrW(GetDlgItem(Dialog,IDC_STRUCT),GWLP_USERDATA)); + mFreeMem(pc); + end; + + WM_INITDIALOG: begin + MakeEditField(Dialog,IDC_EDIT_PAR); + + MakeParamTypeList(GetDlgItem(Dialog,IDC_FLAG_PAR)); + end; + + WM_SIZE: begin + FillChar(urd,SizeOf(TUTILRESIZEDIALOG),0); + urd.cbSize :=SizeOf(urd); + urd.hwndDlg :=Dialog; + urd.hInstance :=hInstance; + urd.lpTemplate:=MAKEINTRESOURCEA('IDD_SPARAM'); + urd.lParam :=0; + urd.pfnResizer:=@ParamDlgResizer; + CallService(MS_UTILS_RESIZEDIALOG,0,tlparam(@urd)); + end; + + WM_SHOWWINDOW: begin + // hide window by ShowWindow function + if (lParam=0) and (wParam=0) then + begin + pc:=pAnsiChar(SetWindowLongPtrW(GetDlgItem(Dialog,IDC_STRUCT),GWLP_USERDATA,0)); + mFreeMem(pc); + end; + end; + + WM_COMMAND: begin + case wParam shr 16 of + CBN_EDITCHANGE, + EN_CHANGE: begin + SendMessage(GetParent(Dialog),WM_COMMAND,CBN_EDITCHANGE shl 16,Dialog); + end; + + CBN_SELCHANGE: begin + SendMessage(GetParent(Dialog),WM_COMMAND,CBN_EDITCHANGE shl 16,Dialog); + case loword(wParam) of + IDC_FLAG_PAR: begin + wnd :=GetDlgItem(Dialog,IDC_EDIT_PAR); + wnd1:=GetDlgItem(Dialog,IDC_STRUCT); + + i:=CB_GetData(GetDlgItem(Dialog,loword(wParam))); + + if i=ptStruct then + begin + ShowEditField(wnd ,SW_HIDE); + ShowWindow (wnd1,SW_SHOW); + end + else + begin + ShowEditField(wnd ,SW_SHOW); + ShowWindow (wnd1,SW_HIDE); + + if i in [ptCurrent,ptResult,ptParam] then + EnableEditField(wnd,false) + else + begin + if i=ptNumber then + begin + pcw:='0'; + SendMessageW(wnd,WM_SETTEXT,0,TLParam(pcw)); + end; + EnableEditField(wnd,true); + end; + end; + end; + end; + end; + end; + end; + end; +end; + +//----- Common interface functions ----- + +function CreateParamBlock(parent:HWND;x,y,width:integer):THANDLE; +var + rc,rc1:TRECT; +begin + SetRect(rc,x,y,x+width,y+0{dlgheight}); + MapDialogRect(parent,rc); + + result:=CreateDialogW(hInstance,'IDD_SPARAM',parent,@DlgParamProc); + GetClientRect(result,rc1); + SetWindowPos(result,0, + x,y{rc.left,rc.top},rc.right-rc.left,rc1.bottom-rc1.top, + SWP_NOZORDER); +end; + +// if separate +function DestroyBlock(block:pointer):integer; +begin + result:=0; +end; + +function SetParamValue(Dialog:HWND;flags:dword;value:pointer):boolean; +var + wnd,wnd1:HWND; + pc:pAnsiChar; + vtype:integer; +begin + result:=true; +//?? Check for "Apply" activation + + wnd:=GetDlgItem(Dialog,IDC_EDIT_PAR); + if (flags and ACF_TEMPLATE)<>0 then + begin + vtype:=FillParam(Dialog,value); + end + else if (flags and ACF_PARAM)<>0 then + begin + SendMessageW(wnd,WM_SETTEXT,0,LPARAM(TranslateW('Parameter'))); + EnableWindow(wnd,false); + vtype:=ptParam; + end + else if (flags and ACF_RESULT)<>0 then + begin + SendMessageW(wnd,WM_SETTEXT,0,LPARAM(TranslateW('Last result'))); + EnableWindow(wnd,false); + vtype:=ptResult; + end + else if (flags and ACF_CURRENT)<>0 then + begin + SendMessageW(wnd,WM_SETTEXT,0,LPARAM(TranslateW('Current user'))); + EnableWindow(wnd,false); + vtype:=ptCurrent; + end + else if (flags and ACF_STRUCT)<>0 then + begin + vtype:=ptStruct; + + ShowEditField(wnd,SW_HIDE); + wnd1:=GetDlgItem(Dialog,IDC_STRUCT); + ShowWindow(wnd1,SW_SHOW); + // delete old value + pc:=pAnsiChar(GetWindowLongPtrW(wnd1,GWLP_USERDATA)); + mFreeMem(pc); + // set newly allocated + SetWindowLongPtrW(wnd1,GWLP_USERDATA,long_ptr(StrDup(pc,pAnsiChar(value)))); +//!!!!!!!! + end + else if (flags and ACF_PARNUM)<>0 then + begin + vtype:=ptNumber; + SendMessageW(wnd,WM_SETTEXT,0,LPARAM(value)); + end + else if (flags and ACF_UNICODE)<>0 then + begin + vtype:=ptUnicode; + SendMessageW(wnd,WM_SETTEXT,0,LPARAM(value)); + end + else + begin + vtype:=ptString; + SendMessageW(wnd,WM_SETTEXT,0,LPARAM(value)); + end; + SetEditFlags(wnd,EF_SCRIPT,ord((flags and ACF_SCRIPT_PARAM)<>0)); + + CB_SelectData(GetDlgItem(Dialog,IDC_FLAG_PAR),vtype); +end; + +function GetParamValue(Dialog:HWND;var flags:dword;var value:pointer):boolean; +var + wnd:HWND; +begin + result:=true; + flags:=0; + value:=nil; + wnd:=GetDlgItem(Dialog,IDC_EDIT_PAR); + case CB_GetData(GetDlgItem(Dialog,IDC_FLAG_PAR)) of + ptParam: begin + flags:=flags or ACF_PARAM + end; + ptResult: begin + flags:=flags or ACF_RESULT + end; + ptCurrent: begin + flags:=flags or ACF_CURRENT + end; + ptNumber: begin + flags:=flags or ACF_PARNUM; + value:=GetDlgText(wnd); + end; + ptStruct: begin + flags:=flags or ACF_STRUCT; + StrDup(pAnsiChar(value), + pAnsiChar(GetWindowLongPtrW(GetDlgItem(Dialog,IDC_STRUCT),GWLP_USERDATA))); + end; + ptUnicode: begin + flags:=flags or ACF_UNICODE; + value:=GetDlgText(wnd); + end; + ptString: value:=GetDlgText(wnd); + end; + if (GetEditFlags(wnd) and EF_SCRIPT)<>0 then + flags:=flags or ACF_SCRIPT_PARAM; +end; + +procedure ClearParam(flags:dword; var param); +begin + if (flags and (ACF_CURRENT or ACF_RESULT or ACF_PARAM))=0 then + mFreeMem(pointer(param)); +end; + +function DuplicateParam(flags:dword; var sparam,dparam):dword; +var + tmpdst:array [0..2047] of WideChar; + ltype:integer; +begin + mFreeMem(dparam); + + if (flags and ACF_TEMPLATE)<>0 then + begin + flags:=flags and not (ACF_TEMPLATE or ACF_PARTYPE); + GetParamLine(pAnsiChar(sparam),tmpdst,ltype); + case ltype of + ptNumber: begin + flags:=flags or ACF_PARNUM; + StrDupW(pWideChar(dparam),pWideChar(@tmpdst)); + end; + ptString: begin + flags:=flags or ACF_STRING; + StrDupW(pWideChar(dparam),pWideChar(@tmpdst)); + end; + ptUnicode: begin + flags:=flags or ACF_UNICODE; + StrDupW(pWideChar(dparam),pWideChar(@tmpdst)); + end; + ptStruct: begin + flags:=flags or ACF_STRUCT; + StrDup(pAnsiChar(dparam),pAnsiChar(sparam)+10); //10=StrLen('structure|') + end; + ptCurrent: flags:=flags or ACF_CURRENT; + ptResult : flags:=flags or ACF_RESULT; + ptParam : flags:=flags or ACF_PARAM; + end; + end + else if (flags and (ACF_CURRENT or ACF_RESULT or ACF_PARAM))=0 then + begin + if (flags and ACF_PARNUM)<>0 then + StrDupW(pWideChar(dparam),pWideChar(sparam)) + else if (flags and ACF_STRUCT)<>0 then + StrDup(pAnsiChar(dparam),pAnsiChar(sparam)) + else if (flags and ACF_UNICODE)<>0 then + StrDupW(pWideChar(dparam),pWideChar(sparam)) + else + StrDupW(pWideChar(dparam),pWideChar(sparam)); + end; + result:=flags; +end; + +//----- result block ----- + +procedure MakeResultTypeList(wnd:HWND); +begin + SendMessage(wnd,CB_RESETCONTENT,0,0); + InsertString(wnd,sresInt ,'Integer'); + InsertString(wnd,sresString,'String'); + InsertString(wnd,sresWide ,'Wide String'); + InsertString(wnd,sresStruct,'Structure'); + SendMessage(wnd,CB_SETCURSEL,0,0); +end; + +function ResultDlgResizer(Dialog:HWND;lParam:LPARAM;urc:PUTILRESIZECONTROL):int; cdecl; +begin + case urc^.wId of + IDC_RES_TYPE : result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; //RD_ANCHORX_RIGHT + IDC_RES_FREEMEM: result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; + IDC_RES_STAT : result:=RD_ANCHORX_LEFT or RD_ANCHORY_TOP; + IDC_RES_GROUP : result:=RD_ANCHORX_WIDTH or RD_ANCHORY_TOP; + else + result:=0; + end; +end; + +procedure ClearResultFields(Dialog:HWND); +begin + CheckDlgButton(Dialog,IDC_RES_FREEMEM,BST_UNCHECKED); + ShowWindow(GetDlgItem(Dialog,IDC_RES_FREEMEM),SW_HIDE); + CB_SelectData(Dialog,IDC_RES_TYPE,sresInt); +end; + +function DlgResultProc(Dialog:HWnd;hMessage:uint;wParam:WPARAM;lParam:LPARAM):lresult; stdcall; +var + urd:TUTILRESIZEDIALOG; + i:integer; +begin + result:=0; + + case hMessage of + WM_INITDIALOG: begin + MakeResultTypeList(GetDlgItem(Dialog,IDC_RES_TYPE)); + end; + + WM_SIZE: begin + FillChar(urd,SizeOf(TUTILRESIZEDIALOG),0); + urd.cbSize :=SizeOf(urd); + urd.hwndDlg :=Dialog; + urd.hInstance :=hInstance; + urd.lpTemplate:=MAKEINTRESOURCEA('IDD_SRESULT'); + urd.lParam :=0; + urd.pfnResizer:=@ResultDlgResizer; + CallService(MS_UTILS_RESIZEDIALOG,0,tlparam(@urd)); + end; + + WM_COMMAND: begin + case wParam shr 16 of + CBN_SELCHANGE: begin + case loword(wParam) of + IDC_RES_TYPE: begin + case CB_GetData(lParam) of + sresInt,sresStruct: begin + i:=SW_HIDE; + end; + sresString,sresWide: begin + i:=SW_SHOW; + end; + end; + ShowWindow(GetDlgItem(Dialog,IDC_RES_FREEMEM),i); + end; + end; + end; + end; + end; + end; +end; + +function CreateResultBlock(parent:HWND;x,y,width:integer):THANDLE; +var + rc,rc1:TRECT; +begin + SetRect(rc,x,y,x+width,y+0{dlgheight}); + MapDialogRect(parent,rc); + + result:=CreateDialogW(hInstance,'IDD_SRESULT',parent,@DlgResultProc); + GetClientRect(result,rc1); + SetWindowPos(result,0, + x,y{rc.left,rc.top},rc.right-rc.left,rc1.bottom-rc1.top, + SWP_NOZORDER); +end; + +function SetResultValue(Dialog:HWND;flags:dword):integer; +var + btn:integer; +begin + // RESULT + if (flags and ACF_RSTRUCT)<>0 then + result:=sresStruct + else if (flags and ACF_RSTRING)<>0 then + begin + if (flags and ACF_RFREEMEM)<>0 then + btn:=BST_CHECKED + else + btn:=BST_UNCHECKED; + CheckDlgButton(Dialog,IDC_RES_FREEMEM,btn); + + if (flags and ACF_RUNICODE)<>0 then + result:=sresWide + else + result:=sresString; + end + else + begin + result:=sresInt; + end; + CB_SelectData(Dialog,IDC_RES_TYPE,result); +end; + +function GetResultValue(Dialog:HWND):dword; +begin + case CB_GetData(GetDlgItem(Dialog,IDC_RES_TYPE)) of + sresString: begin + result:=ACF_RSTRING; + if IsDlgButtonChecked(Dialog,IDC_RES_FREEMEM)=BST_CHECKED then + result:=result or ACF_RFREEMEM; + end; + sresWide: begin + result:=ACF_RSTRING or ACF_RUNICODE; + if IsDlgButtonChecked(Dialog,IDC_RES_FREEMEM)=BST_CHECKED then + result:=result or ACF_RFREEMEM; + end; + sresStruct: result:=ACF_RSTRUCT; + else + result:=0; + end; + +end; + +end. diff --git a/plugins/Actman30/sparam.rc b/plugins/Actman30/sparam.rc new file mode 100644 index 0000000000..a36fc5b680 --- /dev/null +++ b/plugins/Actman30/sparam.rc @@ -0,0 +1,27 @@ +#include "i_sparam_const.inc" + +LANGUAGE 0,0 + +IDD_SPARAM DIALOGEX 0, 0, 168, 31, 0 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0 +{ +// PUSHBUTTON "open/close" , IDC_CLOSE , 1, 116, 166, 14 + RTEXT "wParam type", IDC_STAT_PAR, 1, 1, 63, 14, SS_CENTERIMAGE + COMBOBOX IDC_FLAG_PAR, 66, 1, 102, 56, CBS_DROPDOWNLIST | WS_VSCROLL +// RTEXT "wParam" , -1, 1, 116, 160, 8 + COMBOBOX IDC_EDIT_PAR, 1, 16, 166, 76, CBS_DROPDOWN | WS_VSCROLL | CBS_AUTOHSCROLL + PUSHBUTTON "Structure" , IDC_STRUCT , 1, 16, 166, 14 +} + +IDD_SRESULT DIALOGEX 0, 0, 168, 53, 0 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0 +{ + GROUPBOX "Result" , IDC_RES_GROUP , 1, 0, 166, 50, WS_GROUP + RTEXT "Result type" , IDC_RES_STAT , 4, 9, 159, 11 + COMBOBOX IDC_RES_TYPE , 4, 20, 159, 76, CBS_DROPDOWN | WS_VSCROLL | CBS_AUTOHSCROLL + AUTOCHECKBOX "Free memory" , IDC_RES_FREEMEM, 4, 36, 159, 11 +} diff --git a/plugins/Actman30/sparam.res b/plugins/Actman30/sparam.res new file mode 100644 index 0000000000..0491ec8f83 Binary files /dev/null and b/plugins/Actman30/sparam.res differ diff --git a/plugins/Actman30/structopts.res b/plugins/Actman30/structopts.res new file mode 100644 index 0000000000..f651b686f2 Binary files /dev/null and b/plugins/Actman30/structopts.res differ diff --git a/plugins/Actman30/tasks.res b/plugins/Actman30/tasks.res new file mode 100644 index 0000000000..bc72f06406 Binary files /dev/null and b/plugins/Actman30/tasks.res differ diff --git a/plugins/Actman30/tmp/FreeImage.ppu b/plugins/Actman30/tmp/FreeImage.ppu new file mode 100644 index 0000000000..f25e2c85ec Binary files /dev/null and b/plugins/Actman30/tmp/FreeImage.ppu differ diff --git a/plugins/Actman30/tmp/PsAPI.ppu b/plugins/Actman30/tmp/PsAPI.ppu new file mode 100644 index 0000000000..ef67c967e3 Binary files /dev/null and b/plugins/Actman30/tmp/PsAPI.ppu differ diff --git a/plugins/Actman30/tmp/ask.res b/plugins/Actman30/tmp/ask.res new file mode 100644 index 0000000000..15a00e0218 Binary files /dev/null and b/plugins/Actman30/tmp/ask.res differ diff --git a/plugins/Actman30/tmp/commctrl.ppu b/plugins/Actman30/tmp/commctrl.ppu new file mode 100644 index 0000000000..4456f8e7b5 Binary files /dev/null and b/plugins/Actman30/tmp/commctrl.ppu differ diff --git a/plugins/Actman30/tmp/common.ppu b/plugins/Actman30/tmp/common.ppu new file mode 100644 index 0000000000..43cef92527 Binary files /dev/null and b/plugins/Actman30/tmp/common.ppu differ diff --git a/plugins/Actman30/tmp/dbsettings.ppu b/plugins/Actman30/tmp/dbsettings.ppu new file mode 100644 index 0000000000..7ce66f7110 Binary files /dev/null and b/plugins/Actman30/tmp/dbsettings.ppu differ diff --git a/plugins/Actman30/tmp/global.ppu b/plugins/Actman30/tmp/global.ppu new file mode 100644 index 0000000000..46e10fc2cc Binary files /dev/null and b/plugins/Actman30/tmp/global.ppu differ diff --git a/plugins/Actman30/tmp/io.ppu b/plugins/Actman30/tmp/io.ppu new file mode 100644 index 0000000000..73b9a58bd5 Binary files /dev/null and b/plugins/Actman30/tmp/io.ppu differ diff --git a/plugins/Actman30/tmp/mApiCard.res b/plugins/Actman30/tmp/mApiCard.res new file mode 100644 index 0000000000..7d6ed320b9 Binary files /dev/null and b/plugins/Actman30/tmp/mApiCard.res differ diff --git a/plugins/Actman30/tmp/mApiCardM.ppu b/plugins/Actman30/tmp/mApiCardM.ppu new file mode 100644 index 0000000000..8db033ec05 Binary files /dev/null and b/plugins/Actman30/tmp/mApiCardM.ppu differ diff --git a/plugins/Actman30/tmp/m_api.ppu b/plugins/Actman30/tmp/m_api.ppu new file mode 100644 index 0000000000..94ef17fde8 Binary files /dev/null and b/plugins/Actman30/tmp/m_api.ppu differ diff --git a/plugins/Actman30/tmp/memini.ppu b/plugins/Actman30/tmp/memini.ppu new file mode 100644 index 0000000000..34fa7338bb Binary files /dev/null and b/plugins/Actman30/tmp/memini.ppu differ diff --git a/plugins/Actman30/tmp/mirutils.ppu b/plugins/Actman30/tmp/mirutils.ppu new file mode 100644 index 0000000000..1627956ef1 Binary files /dev/null and b/plugins/Actman30/tmp/mirutils.ppu differ diff --git a/plugins/Actman30/tmp/question.ppu b/plugins/Actman30/tmp/question.ppu new file mode 100644 index 0000000000..a00b7fa2c2 Binary files /dev/null and b/plugins/Actman30/tmp/question.ppu differ diff --git a/plugins/Actman30/tmp/syswin.ppu b/plugins/Actman30/tmp/syswin.ppu new file mode 100644 index 0000000000..bd3a2a4040 Binary files /dev/null and b/plugins/Actman30/tmp/syswin.ppu differ diff --git a/plugins/Actman30/tmp/wrapper.ppu b/plugins/Actman30/tmp/wrapper.ppu new file mode 100644 index 0000000000..2fe9202853 Binary files /dev/null and b/plugins/Actman30/tmp/wrapper.ppu differ diff --git a/plugins/Actman30/ua.res b/plugins/Actman30/ua.res new file mode 100644 index 0000000000..8316b81f51 Binary files /dev/null and b/plugins/Actman30/ua.res differ -- cgit v1.2.3