Subversion Repositories autosfx

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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.
  187.