Subversion Repositories autosfx

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 daniel-mar 1
unit SFXBehavior;
2
 
3
interface
4
 
5
uses
6
  SysUtils;
7
 
8
type
9
  TConflictBehavior = (cbAvoid, cbOverwrite, cbNewer, cbAsk);
10
 
11
  TCommentPresentation = (cpNone, cpBeforeExtracting, cpAfterExtracting);
12
 
13
  TExtractionTarget = (etExtractHere, etDesktop, etAsk);
14
 
15
  TZIPBehavior = record
16
    ConflictBehavior: TConflictBehavior;
17
    CommentPresentation: TCommentPresentation;
18
    ExtractionTarget: TExtractionTarget;
19
  end;
20
 
21
function ReadBehavior(c: string): TZIPBehavior;
22
function StripBehavior(c: string): string;
23
function BehaviorStrings(bh: TZipBehavior): string;
24
function RelocateBehaviorStringsToEnd(c: string): string;
25
 
26
implementation
27
 
28
const
29
  C_SIGNATURE   = 'ViaThinkSoft AutoSFX Archive Configuration';
30
 
31
  C_ASFX_CB_OVR = 'AutoSFX Conflict Behavior: Overwrite all';
32
  C_ASFX_CB_NEW = 'AutoSFX Conflict Behavior: Overwrite older';
33
  C_ASFX_CB_ASK = 'AutoSFX Conflict Behavior: Ask';
34
  C_ASFX_CB_AVO = 'AutoSFX Conflict Behavior: Avoid';
35
 
36
  C_ASFX_CP_BEF = 'AutoSFX Comment Presentation: Before extracting';
37
  C_ASFX_CP_AFT = 'AutoSFX Comment Presentation: After extracting';
38
  C_ASFX_CP_NON = 'AutoSFX Comment Presentation: None';
39
 
40
  C_ASFX_ET_HER = 'AutoSFX Extraction Target: Extract here';
41
  C_ASFX_ET_DES = 'AutoSFX Extraction Target: Extract to Desktop';
42
  C_ASFX_ET_ASK = 'AutoSFX Extraction Target: Choose directory';
43
 
44
  EINRUECK      = '> '; // Optional
45
 
46
const
47
  CB_DEFAULT = cbAvoid;
48
  CP_DEFAULT = cpNone;
49
  ET_DEFAULT = etExtractHere;
50
 
51
function ReadBehavior(c: string): TZIPBehavior;
52
 
53
  function Vorkommen(s: string): boolean;
54
  begin
55
    s := AnsiLowerCase(s);
56
    result := AnsiPos(s, c) > 0;
57
  end;
58
 
59
begin
60
  result.ConflictBehavior := CB_DEFAULT;
61
  result.CommentPresentation := CP_DEFAULT;
62
  result.ExtractionTarget := ET_DEFAULT;
63
 
64
  c := AnsiLowerCase(c);
65
 
66
  if Vorkommen(C_ASFX_CB_OVR) then
67
  begin
68
    result.ConflictBehavior := cbOverwrite;
69
  end
70
  else if Vorkommen(C_ASFX_CB_NEW) then
71
  begin
72
    result.ConflictBehavior := cbNewer;
73
  end
74
  else if Vorkommen(C_ASFX_CB_ASK) then
75
  begin
76
    result.ConflictBehavior := cbAsk;
77
  end
78
  else if Vorkommen(C_ASFX_CB_AVO) then
79
  begin
80
    result.ConflictBehavior := cbAvoid;
81
  end;
82
 
83
  if Vorkommen(C_ASFX_CP_BEF) then
84
  begin
85
    result.CommentPresentation := cpBeforeExtracting;
86
  end
87
  else if Vorkommen(C_ASFX_CP_AFT) then
88
  begin
89
    result.CommentPresentation := cpAfterExtracting;
90
  end
91
  else if Vorkommen(C_ASFX_CP_NON) then
92
  begin
93
    result.CommentPresentation := cpNone;
94
  end;
95
 
96
  if Vorkommen(C_ASFX_ET_HER) then
97
  begin
98
    result.ExtractionTarget := etExtractHere;
99
  end
100
  else if Vorkommen(C_ASFX_ET_DES) then
101
  begin
102
    result.ExtractionTarget := etDesktop;
103
  end
104
  else if Vorkommen(C_ASFX_ET_ASK) then
105
  begin
106
    result.ExtractionTarget := etAsk;
107
  end;
108
end;
109
 
110
function StripBehavior(c: string): string;
111
 
112
  procedure StripIt(s: string);
113
  begin
114
    c := StringReplace(c, EINRUECK + s+#13#10, '', [rfReplaceAll, rfIgnoreCase]);
115
    c := StringReplace(c, EINRUECK + s+#13,    '', [rfReplaceAll, rfIgnoreCase]);
116
    c := StringReplace(c, EINRUECK + s+#10,    '', [rfReplaceAll, rfIgnoreCase]);
117
    c := StringReplace(c, EINRUECK + s,        '', [rfReplaceAll, rfIgnoreCase]);
118
 
119
    c := StringReplace(c, s+#13#10, '', [rfReplaceAll, rfIgnoreCase]);
120
    c := StringReplace(c, s+#13,    '', [rfReplaceAll, rfIgnoreCase]);
121
    c := StringReplace(c, s+#10,    '', [rfReplaceAll, rfIgnoreCase]);
122
    c := StringReplace(c, s,        '', [rfReplaceAll, rfIgnoreCase]);
123
  end;
124
 
125
begin
126
  StripIt(C_SIGNATURE);
127
 
128
  StripIt(C_ASFX_CB_AVO);
129
  StripIt(C_ASFX_CB_OVR);
130
  StripIt(C_ASFX_CB_NEW);
131
  StripIt(C_ASFX_CB_ASK);
132
 
133
  StripIt(C_ASFX_CP_NON);
134
  StripIt(C_ASFX_CP_BEF);
135
  StripIt(C_ASFX_CP_AFT);
136
 
137
  StripIt(C_ASFX_ET_HER);
138
  StripIt(C_ASFX_ET_DES);
139
  StripIt(C_ASFX_ET_ASK);
140
 
141
  result := c;
142
end;
143
 
144
function BehaviorStrings(bh: TZipBehavior): string;
145
begin
146
  result := C_SIGNATURE + #13#10 + EINRUECK;
147
 
148
  case bh.ConflictBehavior of
149
    cbAvoid:     result := result + C_ASFX_CB_AVO;
150
    cbOverwrite: result := result + C_ASFX_CB_OVR;
151
    cbNewer:     result := result + C_ASFX_CB_NEW;
152
    cbAsk:       result := result + C_ASFX_CB_ASK;
153
  end;
154
 
155
  result := result + #13#10 + EINRUECK;
156
 
157
  case bh.CommentPresentation of
158
    cpNone:             result := result + C_ASFX_CP_NON;
159
    cpBeforeExtracting: result := result + C_ASFX_CP_BEF;
160
    cpAfterExtracting:  result := result + C_ASFX_CP_AFT;
161
  end;
162
 
163
  result := result + #13#10 + EINRUECK;
164
 
165
  case bh.ExtractionTarget of
166
    etExtractHere: result := result + C_ASFX_ET_HER;
167
    etDesktop:     result := result + C_ASFX_ET_DES;
168
    etAsk:         result := result + C_ASFX_ET_ASK;
169
  end;
170
 
171
  result := result + #13#10;
172
end;
173
 
174
function RelocateBehaviorStringsToEnd(c: string): string;
175
var
176
  bh: TZIPBehavior;
177
begin
178
  bh := ReadBehavior(c);
179
  c := StripBehavior(c);
180
  c := TrimRight(c);
181
  c := c + #13#10 + #13#10;
182
  c := c + BehaviorStrings(bh);
183
  result := c;
184
end;
185
 
186
end.