Subversion Repositories autosfx

Rev

Rev 1 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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