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 |