diff --git a/wst/trunk/ide/lazarus/wst_indy.lpk b/wst/trunk/ide/lazarus/wst_indy.lpk
index bcd2c04ce..fe1d5caeb 100644
--- a/wst/trunk/ide/lazarus/wst_indy.lpk
+++ b/wst/trunk/ide/lazarus/wst_indy.lpk
@@ -9,7 +9,7 @@
-
+
@@ -17,7 +17,8 @@
-
+
diff --git a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg
index 40ce41371..cb9341f71 100644
--- a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg
+++ b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg
@@ -35,10 +35,10 @@
-N"obj"
-LE"c:\program files\borland\delphi7\Projects\Bpl"
-LN"c:\program files\borland\delphi7\Projects\Bpl"
--U"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src"
--O"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src"
--I"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src"
--R"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src"
+-U"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src"
+-O"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src"
+-I"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src"
+-R"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
diff --git a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof
index 1f4cae9e5..4536b7110 100644
--- a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof
+++ b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof
@@ -94,7 +94,7 @@ OutputDir=
UnitOutputDir=obj
PackageDLLOutputDir=
PackageDCPOutputDir=
-SearchPath=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+SearchPath=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src
Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;dclOfficeXP;Rave70VCL;Rave70CLX;Jcl;JclVcl;JvCoreD7R;JvSystemD7R;JvStdCtrlsD7R;JvAppFrmD7R;JvBandsD7R;JvDBD7R;JvDlgsD7R;JvBDED7R;JvCmpD7R;JvCryptD7R;JvCtrlsD7R;JvCustomD7R;JvDockingD7R;JvDotNetCtrlsD7R;JvEDID7R;JvGlobusD7R;JvHMID7R;JvInterpreterD7R;JvJansD7R;JvManagedThreadsD7R;JvMMD7R;JvNetD7R;JvPageCompsD7R;JvPluginD7R;JvPrintPreviewD7R;JvRuntimeDesignD7R;JvTimeFrameworkD7R;JvUIBD7R;JvValidatorsD7R;JvWizardD7R;JvXPCtrlsD7R;FIBDBMidas7;daADPhysADSD7;daADPhysODBCD7;daADPhysD7;daADComID7;daADPhysDBExpD7;daADPhysASAD7;daADPhysOraclD7;daADPhysMySQLD7;daADPhysDb2D7;daADPhysMSSQLD7;daADPhysMSAccD7;daADGUIxFormsD7;daADCompD7;CRControls70;dac70;dacvcl70;odacvcl70;odac70;oraprov70;dxGDIPlusD7;cxLibraryVCLD7;dxsbD7;dxComnD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxPageControlVCLD7;cxGridD7;cxSchedulerVCLD7;cxTreeListVCLD7;cxVerticalGridVCLD7;cxPivotGridD7;cxSpreadSheetVCLD7;dxDockingD7;dxNavBarD7;dxLayoutControlD7;dxLayoutControlcxEditAdaptersD7;cxWebD7;cxWebPascalScriptD7;cxWebSnapD7;cxWebTeeChartD7;dxMasterViewD7;dxmdsD7;dxdbtrD7;dxtrmdD7;dxorgcD7;dxdborD7;dxFlowChartD7;dxPSCoreD7;dxPSLnksD7;dxPScxCommonD7;dxPScxGrid6LnkD7;dxPScxPCProdD7;dxPScxPivotGridLnkD7;dxPScxScheduler2LnkD7;dxPScxSSLnkD7;dxPScxTLLnkD7;dxPScxVGridLnkD7;dxPSTeeChartD7;dxPSdxOCLnkD7;dxPSdxDBTVLnkD7;dxPSdxFCLnkD7;dxPSdxLCLnkD7;dxPSdxMVLnkD7;dxPSdxDBOCLnkD7;dxPScxExtCommonD7;dxPsPrVwAdvD7;dxBarExtItemsD7;dxBarD7;dxPSDBTeeChartD7;cxBarEditItemD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxRibbonD7;S403_r70;S403br70
Conditionals=
DebugSourceDirs=
@@ -141,21 +141,22 @@ Item0=DUnit
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
-Count=14
-Item0=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item1=$(DELPHI)\Lib\Debug;C:\PROGRA~1\Borland\Delphi7\MyTools\JVCL\3.20\jcl\lib\d7\debug;..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item2=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\ws_helper
-Item3=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\fcl-units\fcl-passrc\src
-Item4=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item5=..\;..\..\;..\..\..\;C:\Programmes\lazarus\wst\trunk\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item6=..\;..\..\;..\..\..\;..\..\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item7=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item8=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;C:\Programmes\lazarus\wst\trunk\ws_helper
-Item9=..\;..\..\;..\..\..\;..\..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item10=..\;..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item11=..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item12=C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
-Item13=..\
+Count=15
+Item0=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src
+Item1=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item2=$(DELPHI)\Lib\Debug;C:\PROGRA~1\Borland\Delphi7\MyTools\JVCL\3.20\jcl\lib\d7\debug;..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item3=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\ws_helper
+Item4=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\fcl-units\fcl-passrc\src
+Item5=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item6=..\;..\..\;..\..\..\;C:\Programmes\lazarus\wst\trunk\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item7=..\;..\..\;..\..\..\;..\..\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item8=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item9=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;C:\Programmes\lazarus\wst\trunk\ws_helper
+Item10=..\;..\..\;..\..\..\;..\..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item11=..\;..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item12=..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item13=C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src
+Item14=..\
[HistoryLists\hlUnitOutputDirectory]
Count=1
Item0=obj
diff --git a/wst/trunk/tests/test_suite/files/echo_service.wsdl b/wst/trunk/tests/test_suite/files/echo_service.wsdl
new file mode 100644
index 000000000..d479a8372
--- /dev/null
+++ b/wst/trunk/tests/test_suite/files/echo_service.wsdl
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wst/trunk/tests/test_suite/test_generators.pas b/wst/trunk/tests/test_suite/test_generators.pas
index 2d545f24d..8ece290fb 100644
--- a/wst/trunk/tests/test_suite/test_generators.pas
+++ b/wst/trunk/tests/test_suite/test_generators.pas
@@ -20,7 +20,7 @@ uses
{$ELSE}
TestFrameWork, xmldom, wst_delphi_xml,
{$ENDIF}
- pastree, pascal_parser_intf, xsd_generator;
+ pastree, pascal_parser_intf, xsd_generator, wsdl_generator;
type
@@ -56,6 +56,16 @@ type
function CreateGenerator(const ADoc : TXMLDocument) : IXsdGenerator;override;
end;
+ { TTest_WsdlGenerator }
+
+ TTest_WsdlGenerator = class(TTestCase)
+ protected
+ function CreateGenerator(const ADoc : TXMLDocument) : IGenerator;
+ function LoadXmlFromFilesList(const AFileName : string) : TXMLDocument;
+ published
+ procedure message_parts_type_hint();
+ end;
+
implementation
uses
@@ -517,7 +527,7 @@ begin
locDoc := CreateDoc();
g := CreateGenerator(locDoc);
g.Execute(tr,mdl.Name);
- WriteXMLFile(locDoc,'.\class_unicodestring_property.xsd');
+ //WriteXMLFile(locDoc,'.\class_unicodestring_property.xsd');
locExistDoc := LoadXmlFromFilesList('class_unicodestring_property.xsd');
Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.');
finally
@@ -899,7 +909,7 @@ begin
locDoc := CreateDoc();
g := CreateGenerator(locDoc);
g.Execute(tr,mdl.Name);
- WriteXMLFile(locDoc,'.\class_ansichar_property.xsd');
+ //WriteXMLFile(locDoc,'.\class_ansichar_property.xsd');
locExistDoc := LoadXmlFromFilesList('class_ansichar_property.xsd');
Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.');
finally
@@ -960,7 +970,7 @@ begin
locDoc := CreateDoc();
g := CreateGenerator(locDoc);
g.Execute(tr,mdl.Name);
- WriteXMLFile(locDoc,'.\class_widechar_property.xsd');
+ //WriteXMLFile(locDoc,'.\class_widechar_property.xsd');
locExistDoc := LoadXmlFromFilesList('class_widechar_property.xsd');
Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.');
finally
@@ -977,7 +987,82 @@ begin
Result := TXsdGenerator.Create(ADoc) as IXsdGenerator;
end;
+{ TTest_WsdlGenerator }
+
+function TTest_WsdlGenerator.CreateGenerator(const ADoc : TXMLDocument) : IGenerator;
+begin
+ Result := TWsdlGenerator.Create(ADoc) as IGenerator;
+end;
+
+function TTest_WsdlGenerator.LoadXmlFromFilesList(const AFileName : string) : TXMLDocument;
+begin
+ ReadXMLFile(Result,wstExpandLocalFileName(TestFilesPath + AFileName));
+end;
+
+procedure TTest_WsdlGenerator.message_parts_type_hint();
+var
+ tr : TwstPasTreeContainer;
+ mdl : TPasModule;
+ cltyp : TPasClassType;
+
+ procedure AddMethod_EchoWideString();
+ var
+ p : TPasFunction;
+ pt : TPasFunctionType;
+ prmDef : TPasArgument;
+ prmTypeDef : TPasType;
+ begin
+ p := TPasFunction(tr.CreateElement(TPasFunction,'EchoWideString',cltyp,visDefault,'',0));
+ pt := tr.CreateFunctionType('','result',p,False,'',0);
+ pt.ResultEl.ResultType := tr.FindElementNS('WideString',s_xs) as TPasType;
+ pt.ResultEl.ResultType.AddRef();
+ p.ProcType := pt;
+
+ cltyp.Members.Add(p);
+ prmTypeDef := tr.FindElementNS('WideString',s_xs) as TPasType;
+ prmDef := TPasArgument(tr.CreateElement(TPasArgument,'AValue',pt,visDefault,'',0));
+ pt.Args.Add(prmDef);
+ prmDef.ArgType := prmTypeDef;
+ prmTypeDef.AddRef();
+ prmDef.Access := argConst;
+ end;
+
+var
+ g : IGenerator;
+ locDoc, locExistDoc : TXMLDocument;
+begin
+ locDoc := nil;
+ locExistDoc := nil;
+ tr := TwstPasTreeContainer.Create();
+ try
+ CreateWstInterfaceSymbolTable(tr);
+ mdl := TPasModule(tr.CreateElement(TPasModule,'echo_service',tr.Package,visDefault,'',0));
+ tr.Package.Modules.Add(mdl);
+ tr.RegisterExternalAlias(mdl,'uri:echo-service');
+ mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0));
+ cltyp := TPasClassType(tr.CreateElement(TPasClassType,'IEchoService',mdl.InterfaceSection,visDefault,'',0));
+ cltyp.ObjKind := okInterface;
+ cltyp.InterfaceGUID := '{FCD0F68F-3023-46C6-AD09-1DDA4A2989EB}';
+ mdl.InterfaceSection.Declarations.Add(cltyp);
+ mdl.InterfaceSection.Types.Add(cltyp);
+ tr.AddBinding('IEchoServiceBinding',cltyp);
+ AddMethod_EchoWideString();
+
+ locDoc := CreateDoc();
+ g := CreateGenerator(locDoc);
+ g.Execute(tr,mdl.Name);
+ //WriteXMLFile(locDoc,wstExpandLocalFileName('echo_service.wsdl'));
+ locExistDoc := LoadXmlFromFilesList('echo_service.wsdl');
+ Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.');
+ finally
+ ReleaseDomNode(locExistDoc);
+ ReleaseDomNode(locDoc);
+ FreeAndNil(tr);
+ end;
+end;
+
initialization
- RegisterTest('XSD generator',TTest_XsdGenerator.Suite);
+ RegisterTest('XSD-WSDL generator',TTest_XsdGenerator.Suite);
+ RegisterTest('XSD-WSDL generator',TTest_WsdlGenerator.Suite);
end.
diff --git a/wst/trunk/tests/test_suite/test_parsers.pas b/wst/trunk/tests/test_suite/test_parsers.pas
index 522caa6e8..28ac899bf 100644
--- a/wst/trunk/tests/test_suite/test_parsers.pas
+++ b/wst/trunk/tests/test_suite/test_parsers.pas
@@ -175,6 +175,7 @@ type
procedure signature_return();
procedure xsd_not_declared_at_top_node();
procedure xsd_not_declared_at_top_node_2();
+ procedure message_parts_type_hint();
end;
implementation
@@ -2199,6 +2200,55 @@ begin
ParseDoc('xsd_not_declared_at_top_node_2').Free();
end;
+procedure TTest_WsdlParser.message_parts_type_hint();
+
+ function FindProc(const AName : string; AIntf : TPasClassType) : TPasProcedure;
+ var
+ k : Integer;
+ begin
+ Result := nil;
+ for k := 0 to (AIntf.Members.Count - 1) do begin
+ if TObject(AIntf.Members[k]).InheritsFrom(TPasProcedure) and ( TPasProcedure(AIntf.Members[k]).Name = AName ) then begin
+ Result := TPasProcedure(AIntf.Members[k]);
+ Break;
+ end;
+ end;
+ end;
+
+var
+ tr : TwstPasTreeContainer;
+ elt : TPasElement;
+ intf : TPasClassType;
+ mth : TPasProcedure;
+ mthType : TPasProcedureType;
+ res : TPasResultElement;
+ arg : TPasArgument;
+begin
+ tr := ParseDoc('echo_service');
+ try
+ elt := tr.FindElement('IEchoService');
+ CheckNotNull(elt,'IEchoService');
+ CheckIs(elt,TPasClassType);
+ intf := elt as TPasClassType;
+ CheckEquals(Ord(okInterface),Ord(intf.ObjKind));
+ mth := FindProc('EchoWideString',intf);
+ CheckNotNull(mth,'EchoWideString not found');
+ CheckEquals('EchoWideString',mth.Name);
+ mthType := mth.ProcType;
+ CheckIs(mthType,TPasFunctionType);
+ res := TPasFunctionType(mthType).ResultEl;
+ CheckNotNull(res, 'Result');
+ CheckEquals(LowerCase('WideString'), LowerCase(res.ResultType.Name),'Result');
+ CheckEquals(1, mthType.Args.Count, 'Parameter count');
+ arg := TPasArgument(mthType.Args[0]);
+ CheckNotNull(arg);
+ CheckEquals(LowerCase('AValue'), LowerCase(arg.Name));
+ CheckEquals(LowerCase('WideString'), LowerCase(arg.ArgType.Name),'Parameter');
+ finally
+ tr.Free();
+ end;
+end;
+
function TTest_WsdlParser.LoadComplexType_Class_default_values() : TwstPasTreeContainer;
begin
Result := ParseDoc(x_complexType_class_default);
diff --git a/wst/trunk/tests/test_suite/wst_test_suite.lpi b/wst/trunk/tests/test_suite/wst_test_suite.lpi
index 085a68454..f9a5c5db3 100644
--- a/wst/trunk/tests/test_suite/wst_test_suite.lpi
+++ b/wst/trunk/tests/test_suite/wst_test_suite.lpi
@@ -2,11 +2,13 @@
-
+
+
+
+
-
diff --git a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi
index e8ca2dc21..9235163b9 100644
--- a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi
+++ b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi
@@ -2,11 +2,13 @@
-
+
+
+
+
-
@@ -141,6 +143,9 @@
+
+
+
@@ -169,7 +174,7 @@
-
diff --git a/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi b/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi
index a40f5eb84..1acf69bcc 100644
--- a/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi
+++ b/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi
@@ -2,11 +2,13 @@
-
+
+
+
+
-
@@ -42,7 +44,6 @@
-
@@ -50,7 +51,6 @@
-
@@ -59,7 +59,6 @@
-
@@ -83,7 +82,6 @@
-
@@ -91,14 +89,12 @@
-
-
@@ -106,7 +102,6 @@
-
@@ -123,7 +118,6 @@
-
@@ -135,21 +129,18 @@
-
-
-
@@ -157,7 +148,6 @@
-
@@ -165,7 +155,6 @@
-
@@ -173,7 +162,6 @@
-
@@ -181,7 +169,6 @@
-
diff --git a/wst/trunk/ws_helper/ws_helper.lpi b/wst/trunk/ws_helper/ws_helper.lpi
index 86a77374e..81136105b 100644
--- a/wst/trunk/ws_helper/ws_helper.lpi
+++ b/wst/trunk/ws_helper/ws_helper.lpi
@@ -2,16 +2,16 @@
-
+
+
-
diff --git a/wst/trunk/ws_helper/wsdl_generator.pas b/wst/trunk/ws_helper/wsdl_generator.pas
index 05d53875b..d51c25e96 100644
--- a/wst/trunk/ws_helper/wsdl_generator.pas
+++ b/wst/trunk/ws_helper/wsdl_generator.pas
@@ -176,6 +176,7 @@ procedure TWsdlGenerator.GenerateServiceMessages(
tmpNode : TDOMElement;
ns_shortName, s : string;
typItm : TPasType;
+ typeHelper : IXsdSpecialTypeHelper;
begin
tmpNode := CreateElement(s_part,AMsgNode,Document);
tmpNode.SetAttribute(s_name,ASymTable.GetExternalName(APrm));
@@ -187,6 +188,10 @@ procedure TWsdlGenerator.GenerateServiceMessages(
ns_shortName := GetNameSpaceShortName(s,Document,nil);
s := Format('%s:%s',[ns_shortName,ASymTable.GetExternalName(typItm)]);
tmpNode.SetAttribute(s_type,s);
+ if typItm.InheritsFrom(TPasNativeSpecialSimpleType) then begin
+ if GetXsdTypeHandlerRegistry().FindHelper(typItm,typeHelper) then
+ typeHelper.HandleTypeUsage(tmpNode,ARootNode);
+ end;
end;
procedure GenerateResultParam(APrm : TPasResultElement; AMsgNode : TDOMElement);
@@ -194,6 +199,7 @@ procedure TWsdlGenerator.GenerateServiceMessages(
tmpNode : TDOMElement;
ns_shortName, s : string;
typItm : TPasType;
+ typeHelper : IXsdSpecialTypeHelper;
begin
tmpNode := CreateElement(s_part,AMsgNode,Document);
tmpNode.SetAttribute(s_name,ASymTable.GetExternalName(APrm));
@@ -205,6 +211,10 @@ procedure TWsdlGenerator.GenerateServiceMessages(
ns_shortName := GetNameSpaceShortName(s,Document,nil);
s := Format('%s:%s',[ns_shortName,ASymTable.GetExternalName(typItm)]);
tmpNode.SetAttribute(s_type,s);
+ if typItm.InheritsFrom(TPasNativeSpecialSimpleType) then begin
+ if GetXsdTypeHandlerRegistry().FindHelper(typItm,typeHelper) then
+ typeHelper.HandleTypeUsage(tmpNode,ARootNode);
+ end;
end;
var
diff --git a/wst/trunk/ws_helper/wsdl_parser.pas b/wst/trunk/ws_helper/wsdl_parser.pas
index 10078716b..ec4f4dd3b 100644
--- a/wst/trunk/ws_helper/wsdl_parser.pas
+++ b/wst/trunk/ws_helper/wsdl_parser.pas
@@ -75,7 +75,7 @@ type
const ASoapBindingStyle : string
) : TPasProcedure;
function GetParser(const ANamespace : string) : IXsdPaser;
- function ParseType(const AName : string) : TPasType;
+ function ParseType(const AName : string; const AHint : string = '') : TPasType;
procedure ParseTypes();
protected
function GetXsShortNames() : TStrings;
@@ -449,11 +449,17 @@ function TWsdlParser.ParseOperation(
if Assigned(Result) then
Result := CreateCursorOn(Result,CreateWsdlNameFilter(s_part));
end;
+
+ function ExtractTypeHint(AElement : TDOMNode) : string;
+ begin
+ if not wst_findCustomAttributeXsd(FXSShortNames,AElement,s_WST_typeHint,Result) then
+ Result := '';
+ end;
- function GetDataType(const AName, ATypeOrElement : string):TPasType;
+ function GetDataType(const AName, ATypeOrElement : string; const ATypeHint : string = ''):TPasType;
begin
try
- Result := ParseType(AName);
+ Result := ParseType(AName,ATypeHint);
except
on e : Exception do begin
DoOnMessage(mtError, e.Message + ' ' + AName + ' ' + ATypeOrElement);
@@ -490,7 +496,7 @@ function TWsdlParser.ParseOperation(
if ( crs <> nil ) then begin
crs.Reset();
while crs.MoveNext() do begin
- tmpNode := (crs.GetCurrent() as TDOMNodeRttiExposer).InnerObject;
+ tmpNode := TDOMNodeRttiExposer(crs.GetCurrent()).InnerObject;
if ( tmpNode.Attributes = nil ) or ( tmpNode.Attributes.Length < 1 ) then begin
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
end;
@@ -503,7 +509,7 @@ function TWsdlParser.ParseOperation(
if not tmpCrs.MoveNext() then begin
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
end;
- prmName := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeValue;
+ prmName := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeValue;
strBuffer := s_NODE_NAME + '=' + QuotedStr(s_element) + ' or ' + s_NODE_NAME + ' = ' + QuotedStr(s_type);
tmpCrs := CreateCursorOn(
CreateAttributesCursor(tmpNode,cetRttiNode),
@@ -513,8 +519,8 @@ function TWsdlParser.ParseOperation(
if not tmpCrs.MoveNext() then begin
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
end;
- prmTypeName := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeValue;
- prmTypeType := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeName;
+ prmTypeName := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeValue;
+ prmTypeType := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeName;
if IsStrEmpty(prmName) or IsStrEmpty(prmTypeName) or IsStrEmpty(prmTypeType) then begin
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
end;
@@ -534,7 +540,7 @@ function TWsdlParser.ParseOperation(
prmInternameName := '_' + prmInternameName;
end;
prmHasInternameName := not AnsiSameText(prmInternameName,prmName);
- prmTypeDef := GetDataType(prmTypeName,prmTypeType);
+ prmTypeDef := GetDataType(prmTypeName,prmTypeType,ExtractTypeHint(tmpNode));
prmDef := TPasArgument(SymbolTable.CreateElement(TPasArgument,prmInternameName,tmpMthdType,visDefault,'',0));
tmpMthdType.Args.Add(prmDef);
prmDef.ArgType := prmTypeDef;
@@ -610,7 +616,7 @@ function TWsdlParser.ParseOperation(
prmDef := nil;
crs.Reset();
while crs.MoveNext() do begin
- tmpNode := (crs.GetCurrent() as TDOMNodeRttiExposer).InnerObject;
+ tmpNode := TDOMNodeRttiExposer(crs.GetCurrent()).InnerObject;
if ( tmpNode.Attributes = nil ) or ( tmpNode.Attributes.Length < 1 ) then
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
strBuffer := s_NODE_NAME + '=' + QuotedStr(s_name);
@@ -627,8 +633,8 @@ function TWsdlParser.ParseOperation(
tmpCrs.Reset();
if not tmpCrs.MoveNext() then
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
- prmTypeName := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeValue;
- prmTypeType := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeName;
+ prmTypeName := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeValue;
+ prmTypeType := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeName;
if IsStrEmpty(prmName) or IsStrEmpty(prmTypeName) or IsStrEmpty(prmTypeType) then
raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]);
if SameText(s_document,ASoapBindingStyle) and
@@ -650,7 +656,7 @@ function TWsdlParser.ParseOperation(
if ( prmDef = nil ) then begin
prmDef := TPasArgument(SymbolTable.CreateElement(TPasArgument,prmInternameName,tmpMthdType,visDefault,'',0));
tmpMthdType.Args.Add(prmDef);
- prmDef.ArgType := GetDataType(prmTypeName,prmTypeType);
+ prmDef.ArgType := GetDataType(prmTypeName,prmTypeType,ExtractTypeHint(tmpNode));
prmDef.ArgType.AddRef();
prmDef.Access := argOut;
if prmHasInternameName then begin
@@ -662,7 +668,7 @@ function TWsdlParser.ParseOperation(
end else begin
prmInternameName := '_' + prmInternameName;
prmDef := TPasArgument(SymbolTable.CreateElement(TPasArgument,prmInternameName,tmpMthdType,visDefault,'',0));
- prmDef.ArgType := GetDataType(prmTypeName,prmTypeType);
+ prmDef.ArgType := GetDataType(prmTypeName,prmTypeType,ExtractTypeHint(tmpNode));
prmDef.ArgType.AddRef();
prmDef.Access := argOut;
tmpMthdType.Args.Add(prmDef);
@@ -1110,7 +1116,7 @@ begin
end;
end;
-function TWsdlParser.ParseType(const AName : string) : TPasType;
+function TWsdlParser.ParseType(const AName : string; const AHint : string) : TPasType;
var
localName, spaceShort, spaceLong : string;
locPrs : IXsdPaser;
@@ -1119,7 +1125,11 @@ begin
ExplodeQName(AName,localName,spaceShort);
if ( FXSShortNames.IndexOf(spaceShort) >= 0 ) then begin
xsdModule := SymbolTable.FindModule(s_xs);
- Result := SymbolTable.FindElementInModule(localName,xsdModule) as TPasType;
+ Result := nil;
+ if not IsStrEmpty(AHint) then
+ Result := SymbolTable.FindElementInModule(AHint,xsdModule,[elkName]) as TPasType;
+ if ( Result = nil ) then
+ Result := SymbolTable.FindElementInModule(localName,xsdModule) as TPasType;
if ( Result = nil ) then
raise EXsdTypeNotFoundException.CreateFmt('Type not found : "%s".',[AName]);
end else begin