unit RODLMain; interface uses Windows, Messages, SysUtils, {$IFDEF VER140}Variants, {$ENDIF}Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtCtrls, uRODL, ComCtrls; type TRODLMainForm = class(TForm) GenerateButton: TButton; LoadButton: TButton; ConvertButton: TButton; cbWriters: TComboBox; Memo: TMemo; OpenDialog: TOpenDialog; Label1: TLabel; StatusBar: TStatusBar; cbServices: TComboBox; lServices: TLabel; SaveButton: TButton; SaveDialog: TSaveDialog; Panel1: TPanel; TreeView: TTreeView; Splitter1: TSplitter; procedure GenerateButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ConvertButtonClick(Sender: TObject); procedure LoadButtonClick(Sender: TObject); procedure cbWritersChange(Sender: TObject); procedure SaveButtonClick(Sender: TObject); procedure FormDestroy(Sender: TObject); private fLibrary: TRODLLibrary; function CheckLibrary(AShowMessage: Boolean): Boolean; procedure FillLibrary; public end; var RODLMainForm: TRODLMainForm; implementation uses uRODLToXML, uRODLToPascalInvk, uRODLToPascalIntf, uRODLToPascalImpl, uRODLGenTools, uRODLToWSDL, uRODLToPascalAsync, uROClasses; {$R *.dfm} const Writers: array[0..5] of TRODLConverterClass = (TRODLToInvk, TRODLToIntf, TRODLToImpl, TRODLToXML, TRODLToWSDL, TRODLToPascalAsync); procedure TRODLMainForm.GenerateButtonClick(Sender: TObject); var struct: TRODLStruct; stelem: TRODLTypedEntity; arr: TRODLArray; svc: TRODLService; enum: TRODLEnum; eval: TRODLEnumValue; intf: TRODLServiceInterface; op: TRODLOperation; par: TRODLOperationParam; // ent: TRODLEntity; // emsg: string; begin Memo.Clear; if fLibrary <> nil then fLibrary.Free; fLibrary := TRODLLibrary.Create; fLibrary.Info.Name := 'TestLibrary'; fLibrary.Info.UID := NewGuid; fLibrary.Info.Attributes.Values['Test'] := 'a library attribute'; svc := TRODLService.Create; svc.Info.Name := 'Gadget'; svc.Default.Info.UID := NewGuid; svc.Default.Info.Documentation := 'Default interface for Gadget'; svc.Default.Info.Attributes.Values['TestName1'] := 'TestValue1'; svc.Default.Info.Attributes.Values['TestName2'] := 'TestValue2'; intf := svc.Default; op := intf.Add; op.Info.Name := 'Sum'; op.Info.UID := NewGuid; op.Info.Documentation := 'Sum message'; op.Info.Attributes.Values['TestAttr1'] := 'TestAttrValue2'; op.Info.Attributes.Values['TestAttr2'] := 'TestAttrValue2'; par := op.Add; par.Name := 'A'; par.DataType := 'integer'; par.Flag := fIn; par := op.Add; par.Name := 'B'; par.DataType := 'integer'; par.Flag := fIn; par.Attributes.Values['Test'] := 'a parameter attribute'; par.Attributes.Values['Test'] := 'a parameter attribute #2'; par := op.AddResult; // par.Name := 'result'; par.DataType := 'integer'; // par.Flag := fResult; op := intf.Add; op.Name := 'GetServerTime'; op.Attributes.Values['TestAttr1'] := 'TestAttrValue2'; op.Attributes.Values['TestAttr2'] := 'TestAttrValue2'; op.UID := NewGuid; op.Documentation := 'GetServerTime message'; par := op.AddResult; // par.Name := 'result'; par.DataType := 'datetime'; // par.Flag := fResult; fLibrary.Add(svc); svc := TRODLService.Create; svc.Name := 'Test2'; svc.Default.UID := NewGuid; svc.Default.Documentation := 'Default interface for Test2'; intf := svc.Default; op := intf.Add; op.Name := 'GetNumber'; op.UID := NewGuid; op.Documentation := 'GetNumber message'; par := op.AddResult; // par.Name := 'result'; par.DataType := 'integer'; // par.Flag := fResult; fLibrary.Add(svc); struct := TRODLStruct.Create; struct.Attributes.Values['TestAttr1'] := 'TestAttrValue2'; struct.Attributes.Values['TestAttr2'] := 'TestAttrValue2'; struct.Name := 'TAddress'; struct.UID := NewGuid; struct.Documentation := 'An address'; stelem := struct.Add; stelem.Name := 'Street1'; stelem.DataType := 'string'; stelem := struct.Add; stelem.Name := 'Street2'; stelem.DataType := 'string'; fLibrary.Add(struct); struct := TRODLStruct.Create; struct.Name := 'TPerson'; struct.UID := NewGuid; struct.Documentation := 'A person'; stelem := struct.Add; stelem.Name := 'FullName'; stelem.DataType := 'string'; stelem := struct.Add; stelem.Name := 'Age'; stelem.DataType := 'integer'; fLibrary.Add(struct); enum := TRODLEnum.Create; enum.Name := 'TColor'; enum.UID := NewGuid; enum.Documentation := 'This is TColor'; enum.Attributes.Values['TestAttr1'] := 'TestAttrValue2'; enum.Attributes.Values['TestAttr2'] := 'TestAttrValue2'; eval := enum.Add; eval.Name := 'clRed'; eval := enum.Add; eval.Name := 'clBlue'; fLibrary.Add(enum); enum := TRODLEnum.Create; enum.Name := 'TSex'; enum.UID := NewGuid; enum.Documentation := 'This is TSex'; eval := enum.Add; eval.Name := 'Male'; eval := enum.Add; eval.Name := 'Female'; fLibrary.Add(enum); arr := TRODLArray.Create; arr.Name := 'TIntegerArray'; arr.Documentation := 'Thisis an integer array'; arr.UID := NewGuid; arr.ElementType := 'integer'; arr.Attributes.Values['TestAttr1'] := 'TestAttrValue2'; arr.Attributes.Values['TestAttr2'] := 'TestAttrValue2'; fLibrary.Add(arr); {if not fLibrary.Validate(ent, emsg) then Caption := 'Libary is NOT valid: '+ent.Name+', '+emsg else Caption := 'Libary is valid'} FillLibrary; StatusBar.SimpleText := 'Test RODL generated.'; end; procedure TRODLMainForm.FormCreate(Sender: TObject); var i: integer; begin for i := 0 to High(Writers) do cbWriters.Items.Add(Writers[i].ClassName); cbWriters.ItemIndex := cbWriters.Items.Count - 1; cbWriters.OnChange(cbWriters); end; procedure TRODLMainForm.ConvertButtonClick(Sender: TObject); begin with Writers[cbWriters.ItemIndex].Create(fLibrary, cbServices.Text) do try Memo.Lines.Text := Buffer.Text finally Free; end; end; procedure TRODLMainForm.LoadButtonClick(Sender: TObject); var fs: TFileStream; begin if not OpenDialog.Execute then Exit; FreeAndNIL(fLibrary); Memo.Clear; FillLibrary; fs := TFileStream.Create(OpenDialog.FileName, fmOpenRead); with TXMLToRODL.Create do try fLibrary := Read(fs); finally Free; fs.Free; end; FillLibrary; StatusBar.SimpleText := ExtractFileName(OpenDialog.FileName) + ' loaded. Please specify the convertor and click ''Convert'''; // ConvertButton.Click; end; procedure TRODLMainForm.cbWritersChange(Sender: TObject); var i: integer; begin cbServices.Clear; if Writers[cbWriters.ItemIndex] = TRODLToImpl then begin if fLibrary <> nil then for i := 0 to fLibrary.ServiceCount - 1 do cbServices.Items.Add(fLibrary.Services[i].Name); if cbServices.Items.Count > 0 then cbServices.ItemIndex := 0; end else if Writers[cbWriters.ItemIndex] = TRODLToWSDL then begin cbServices.Items.Add(''); if fLibrary <> nil then for i := 0 to fLibrary.ServiceCount - 1 do cbServices.Items.Add(fLibrary.Services[i].Name); cbServices.ItemIndex := 0; end; lServices.Enabled := (Writers[cbWriters.ItemIndex] = TRODLToImpl) or (Writers[cbWriters.ItemIndex] = TRODLToWSDL); cbServices.Enabled := lServices.Enabled; if cbServices.Enabled then cbServices.Color := clWindow else cbServices.ParentColor := True; end; procedure TRODLMainForm.SaveButtonClick(Sender: TObject); var FFileName: string; begin if not CheckLibrary(True) then Exit; ConvertButton.Click; fFileName := Writers[cbWriters.ItemIndex].GetTargetFileName(fLibrary, cbServices.Text); if FFileName = '' then FFileName := ChangeFileExt(fLibrary.Name, '.xml'); SaveDialog.FileName := fFileName; SaveDialog.DefaultExt := ExtractFileExt(SaveDialog.FileName); if SaveDialog.Execute then Memo.Lines.SaveToFile(SaveDialog.FileName); end; function TRODLMainForm.CheckLibrary(AShowMessage: Boolean): Boolean; begin Result := fLibrary <> nil; if not result then ShowMessage('Please load or generate a RODL library'); end; procedure TRODLMainForm.FillLibrary; var FRootNode, tempNode: TTreeNode; i: integer; begin with TreeView do begin Items.Clear; if fLibrary = nil then Exit; FRootNode := Items.AddChild(nil, fLibrary.Name); tempNode := Items.AddChild(FRootNode, 'Structs'); for i := 0 to fLibrary.StructCount - 1 do Items.AddChild(tempNode, fLibrary.Structs[i].Name); tempNode := Items.AddChild(FRootNode, 'Arrays'); for i := 0 to fLibrary.ArrayCount - 1 do Items.AddChild(tempNode, fLibrary.Arrays[i].Name); tempNode := Items.AddChild(FRootNode, 'Enums'); for i := 0 to fLibrary.EnumCount - 1 do Items.AddChild(tempNode, fLibrary.Enums[i].Name); tempNode := Items.AddChild(FRootNode, 'Services'); for i := 0 to fLibrary.ServiceCount - 1 do begin Items.AddChild(tempNode, fLibrary.Services[i].Name); end; tempNode := Items.AddChild(FRootNode, 'Exceptions'); for i := 0 to fLibrary.ExceptionCount - 1 do Items.AddChild(tempNode, fLibrary.Exceptions[i].Name); tempNode := Items.AddChild(FRootNode, 'Use'); for i := 0 to fLibrary.UseCount - 1 do Items.AddChild(tempNode, fLibrary.Use[i].Name); tempNode := Items.AddChild(FRootNode, 'Groups'); for i := 0 to fLibrary.GroupCount - 1 do Items.AddChild(tempNode, fLibrary.Groups[i].Name); tempNode := Items.AddChild(FRootNode, 'Event Sinks'); for i := 0 to fLibrary.EventSinkCount - 1 do Items.AddChild(tempNode, fLibrary.EventSinks[i].Name); FRootNode.Expand(True); FRootNode.Selected := True; FRootNode.MakeVisible; end; end; procedure TRODLMainForm.FormDestroy(Sender: TObject); begin if fLibrary <> nil then fLibrary.Free; end; end.