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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
unit idedtstopas;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, IDEExternToolIntf, frmdtstopas;
Const
DefaultOptions = [coInterfaceAsClass,coExpandUnionTypeArgs,coaddOptionsToheader,coDynamicTuples,coUseNativeTypeAliases];
Type
TDTSToPascalMode = frmdtstopas.TDTSToPascalMode;
TConversionOptions = frmdtstopas.TConversionOptions;
{ TCreateUnitFromDTS }
TCreateUnitFromDTS = Class(TComponent)
private
FAliases: TStrings;
FConversionOptions: TConversionOptions;
FExtraUnits: String;
FLocalFileName: String;
FMode: TDTSToPascalMode;
FModuleName: String;
FSource: TStrings;
FTargetUnitName: String;
FUseWeb: Boolean;
procedure ExecuteLocal;
procedure ExecuteService;
procedure SetAliases(AValue: TStrings);
Public
Constructor Create(AOwner: TComponent); override;
Destructor Destroy; override;
Function ShowOptionsDialog : Boolean;
Procedure Execute;
Property Source : TStrings Read FSource;
Property TargetUnitName : String Read FTargetUnitName Write FTargetUnitName;
Property Aliases : TStrings Read FAliases Write SetAliases;
Property UseWeb : Boolean Read FUseWeb Write FUseWeb;
Property Mode : TDTSToPascalMode Read FMode Write FMode;
Property ExtraUnits : String Read FExtraUnits Write FExtraUnits;
Property ModuleName : String Read FModuleName Write FModuleName;
Property LocalFileName : String Read FLocalFileName Write FLocalFileName;
Property ConversionOptions : TConversionOptions Read FConversionOptions Write FConversionOptions;
end;
implementation
uses Typinfo, PJSDsgnOptions, controls, strpas2jsdesign, idemsgintf, httpprotocol, fphttpclient;
Const
SMessageDTS2Pas = 'DST2Pas';
{ TCreateUnitFromDTS }
procedure TCreateUnitFromDTS.SetAliases(AValue: TStrings);
begin
if FAliases=AValue then Exit;
FAliases.Assign(AValue);
end;
constructor TCreateUnitFromDTS.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FConversionOptions:=DefaultOptions;
FUseWeb:=True;
FAliases:=TStringList.Create;
FSource:=TStringList.Create;
end;
destructor TCreateUnitFromDTS.Destroy;
begin
FreeAndNil(FAliases);
FreeAndNil(FSource);
inherited Destroy;
end;
function TCreateUnitFromDTS.ShowOptionsDialog: Boolean;
Var
Frm : TDTSToPascalOptionsForm;
begin
Frm:=TDTSToPascalOptionsForm.Create(Self);
try
Frm.Aliases := Aliases;
frm.Mode := Mode;
frm.ExtraUnits := ExtraUnits;
frm.UseWeb := UseWeb;
frm.Module := ModuleName;
Frm.LocalFile := LocalFileName;
Frm.Options:=ConversionOptions;
Result:=Frm.ShowModal=mrOK;
if Result then
begin
Aliases:=Frm.Aliases;
Mode:=frm.Mode;
ExtraUnits:=frm.ExtraUnits;
UseWeb:=frm.UseWeb;
ModuleName:=frm.Module;
LocalFileName:=Frm.LocalFile;
ConversionOptions:=Frm.Options;
end;
finally
Frm.Free;
end;
end;
procedure TCreateUnitFromDTS.ExecuteLocal;
Function MaybeQuote(s : string) : string;
begin
if Pos(' ',S)=0 then
Result:=S
else
Result:=AnsiQuotedStr(S,'"');
end;
Var
ToolOpts : TIDEExternalToolOptions;
AliasFN,OutFN,Opts : string;
begin
AliasFN:='';
OutFN:='';
ToolOpts:=TIDEExternalToolOptions.Create;
try
ToolOpts.Parsers.Add(SubToolDefault);
OutFN:=GetTempFileName;
ToolOpts.Executable:=PJSOptions.DTS2Pas;
ToolOpts.ResolveMacros:=True;
Opts:='-i '+MaybeQuote(LocalFileName)+' -o '+MaybeQuote(outFN)+' -u '+TargetUnitName;
if UseWeb then
opts:=Opts+' -w';
if Aliases.Count>0 then
begin
AliasFN:=GetTempFileName;
Aliases.SaveToFile(AliasFN);
Opts:=Opts+' -a @'+aliasFN;
end;
If ExtraUnits<>'' then
Opts:=Opts+'-x '+StringReplace(ExtraUnits,' ','',[rfReplaceAll]);
ToolOpts.CmdLineParams:=Opts;
if not (RunExternalTool(ToolOpts) and FileExists(OutFN)) then
IDEMessagesWindow.AddCustomMessage(TMessageLineUrgency.mluError,rsDTSDidNotProduceOutput,'',0,0,SMessageDTS2Pas)
else
FSource.LoadFromFile(OutFN)
finally
if AliasFN<>'' then
DeleteFile(aliasFN);
if OutFN<>'' then
DeleteFile(OutFN);
ToolOpts.Free;
end;
end;
procedure TCreateUnitFromDTS.ExecuteService;
Var
URL : String;
CO : TConversionOption;
begin
URL:=IncludeHTTPPathDelimiter(PJSOptions.DTS2PasServiceURL)+'/convert';
URL:=URL+'?file='+HTTPEncode(ModuleName);
URL:=URL+'&unit='+HTTPEncode(TargetUnitName);
URL:=URL+'&prependLog=1';
for CO in TConversionOption do
if CO in ConversionOptions then
URL:=URL+'&'+GetEnumName(TypeInfo(TConversionOption),Ord(CO))+'=1';
if aliases.Count>0 then
URL:=URL+'&Aliases='+HTTPEncode(Aliases.CommaText);
if Not UseWeb then
URL:=URL+'&SkipWeb=1';
If ExtraUnits<>'' then
URL:=URL+'&ExtraUnits='+HTTPEncode(ExtraUnits);
TFPHTTPClient.SimpleGet(URL,FSource);
end;
procedure TCreateUnitFromDTS.Execute;
begin
if TargetUnitName='' then
TargetUnitName:='libtsmodule';
If Mode=dpmLocal then
ExecuteLocal
else
ExecuteService;
end;
end.
|