summaryrefslogtreecommitdiff
path: root/plugins/Actman/inoutini.pas
blob: 38dab2be45ee319f7f52b96492b0e88f91d39d83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
unit inoutini;

interface

uses windows, lowlevelc;

{
type
  pINIioStruct = ^tINIioStruct;
  tINIioStruct = record
    storage,
    section,
    namespace:pAnsiChar;
  end;
}
function Import(list:tMacroList;fname:PWideChar;aflags:dword):integer;

implementation

uses
  io, common, m_api, question,
  iac_global, global, memini;

const
  ioAction = 'Action';
  ioClass  = 'class';
  ioName   = 'name';
  ioVolatile = 'volatile';
const
  imp_yes    = 1;
  imp_yesall = 2;
  imp_no     = 3;
  imp_noall  = 4;
  imp_append = 5;

function ImportAction(section:pointer):tBaseAction;
var
  pa:pActModule;
begin
  if section<>nil then
  begin
    pa:=GetLinkByName(GetParamSectionStr(section,ioClass,nil));
    if pa<>nil then
    begin
      result:=pa.Create;
      result.Load(section,2);
    end
    else
      result:=tBaseAction(1);
  end
  else
    result:=nil;
end;

function Import(list:tMacroList;fname:PWideChar;aflags:dword):integer;
var
  i:integer;
  impact:integer;
  buf:array [0..511] of WideChar;
  oldid:dword;
  arr:array [0..63] of tBaseAction;
  act:tBaseAction;
  p:pMacroRecord;
  storage:pointer;
  pc,pc1,ppc,ppc1:pAnsiChar;
  pcw:pWideChar;
begin
  result:=0;

  for i:=0 to list.Count-1 do
    with list[i]^ do
      if (flags and (ACF_IMPORT or ACF_ASSIGNED))=
                    (ACF_IMPORT or ACF_ASSIGNED) then
        flags:=flags and not (ACF_IMPORT or ACF_OVERLOAD);

  if (fname=nil) or (fname^=#0) then
    exit;
  storage:=OpenStorage(fname);
  if storage=nil then
    exit;

  impact:=imp_yes;

  pc:=GetSectionList(storage,''); // list with "empty" namespaces
  ppc:=pc;
  while pc^<>#0 do
  begin
    UTF8ToWide(pc,pcw);

    p:=list.GetMacro(pcw);
    oldid:=$FFFFFFFF;
    if p<>nil then
    begin
      if (impact<>imp_yesall) and (impact<>imp_noall) then
      begin
        StrCopyW(buf,TranslateW('Action "$" exists, do you want to rewrite it?'));
        impact:=ShowQuestion(StrReplaceW(buf,'$',pcw));
      end;
      if (impact=imp_yesall) or (impact=imp_yes) then
      begin
        oldid:=p^.id;
        FreeMacro(p);
      end;
    end;
    // if new or overwriting then read macro details/actions
    if (p=nil) or (impact=imp_yesall) or (impact=imp_yes) or (impact=imp_append) then
    begin
      with List[list.NewMacro()]^ do
      begin
        if (p<>nil) and (oldid<>$FFFFFFFF) then // set old id to keep UseAction setting
        begin
          flags:=flags or ACF_IMPORT or ACF_OVERLOAD;
          id:=oldid;
        end
        else
          flags:=flags or ACF_IMPORT;

        if GetParamInt(storage,pc,ioVolatile)=1 then flags:=flags or ACF_VOLATILE;
        StrCopyW(descr,pcw,MacroNameLen-1);

        // reading actions
        ActionCount:=0;      // amount of loaded
        pc1:=GetSectionList(storage,pc);
        ppc1:=pc1;
        while pc1^<>#0 do
        begin
          act:=ImportAction(SearchSection(storage,pc1,pc));
          if act=nil then
            break;
          if uint_ptr(act)<>1 then
          begin
            arr[ActionCount]:=act;
            inc(ActionCount);
          end;
        end;
        FreeSectionList(ppc1);
        // moving actions to their place
        if Actioncount>0 then
        begin
          GetMem(ActionList,SizeOf(tBaseAction)*ActionCount);
          move(arr,ActionList^,SizeOf(tBaseAction)*ActionCount);
        end;
        inc(result);
      end;
    end;

  end;
  FreeSectionList(ppc);

  CloseStorage(storage);
end;

end.