Thread View: borland.public.cppbuilder.webservices.soap
7 messages
7 total messages
Started by Jair Karim Tinoco
Fri, 04 May 2007 01:52
Problem Deserializing Array Of Objects
Author: Jair Karim Tinoco
Date: Fri, 04 May 2007 01:52
Date: Fri, 04 May 2007 01:52
235 lines
8390 bytes
8390 bytes
Hi,
I have a web service that returns an array of objects, response XML is like
the next:
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.0.5.GA (build: CVSTag=Branch_4_0
date=200610162339)/Tomcat-5.5
Set-Cookie: JSESSIONID=BFB5459D61DC197FBBC4DF43CF9FA080; Path=/
Content-Type: text/xml;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 04 May 2007 00:11:12 GMT
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header/>
<env:Body>
<ns1:encuentraPaisesResponse xmlns:ns1='http://model.siiu.com/jaws'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<ns1:result>
<ns1:abrev xmlns:ns1='http://model.siiu.com/jaws'>MEX</ns1:abrev>
<ns1:idpais xmlns:ns1='http://model.siiu.com/jaws'>MX</ns1:idpais>
<ns1:nombre xmlns:ns1='http://model.siiu.com/jaws'>MEXICO</ns1:nombre>
</ns1:result>
<ns1:result>
<ns1:abrev xmlns:ns1='http://model.siiu.com/jaws'>USA</ns1:abrev>
<ns1:idpais xmlns:ns1='http://model.siiu.com/jaws'>US</ns1:idpais>
<ns1:nombre xmlns:ns1='http://model.siiu.com/jaws'>ESTADOS
UNIDOS</ns1:nombre>
</ns1:result>
</ns1:encuentraPaisesResponse>
</env:Body>
</env:Envelope>
SOAP runtime in Delphi works perfectly but in C++ doesn't, as you can see my
web service is DOCUMENT/LITERAL style, i'm using fixed SOAP Runtime from
Pascal Units provided from Bruneau Babet, i'mm working with BDS2006.
The generated files by wsdlimp.exe for C++ are:
PaisFacade.cpp
// ************************************************************************
//
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl
// >Import : http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl:0
// >Import : http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl:1
// (03/05/2007 08:36:07 p.m. - - $Rev: 5569 $)
// ************************************************************************
//
#include <vcl.h>
#pragma hdrstop
#if !defined(PaisFacadeH)
#include "PaisFacade.h"
#endif
namespace NS_PaisFacade {
_di_PaisFacade GetPaisFacade(bool useWSDL, AnsiString addr, THTTPRIO*
HTTPRIO)
{
static const char* defWSDL=
"http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl";
static const char* defURL =
"http://Contabilidad:8080/SiiuEJBModule/PaisFacade";
static const char* defSvc = "PaisFacadeService";
static const char* defPrt = "PaisFacadePort";
if (addr=="")
addr = useWSDL ? defWSDL : defURL;
THTTPRIO* rio = HTTPRIO ? HTTPRIO : new THTTPRIO(0);
if (useWSDL) {
rio->WSDLLocation = addr;
rio->Service = defSvc;
rio->Port = defPrt;
} else {
rio->URL = addr;
}
_di_PaisFacade service;
rio->QueryInterface(service);
if (!service && !HTTPRIO)
delete rio;
return service;
}
// ************************************************************************
//
// This routine registers the interfaces and types used by invoke the SOAP
// Service.
// ************************************************************************
//
static void RegTypes()
{
/* PaisFacade */
InvRegistry()->RegisterInterface(__interfaceTypeinfo(PaisFacade),
L"http://facade.siiu.com/jaws", L"");
InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(PaisFacade),
L"");
InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(PaisFacade),
ioDocument);
/* Pais */
RemClassRegistry()->RegisterXSClass(__classid(Pais),
L"http://model.siiu.com/jaws", L"Pais");
RemClassRegistry()->RegisterXSInfo(__arrayTypeinfo(Array_Of_Pais),
L"http://model.siiu.com/jaws", L"Array_Of_Pais");
}
#pragma startup RegTypes 32
}; // NS_PaisFacade
And PaisFacade.h
// ************************************************************************
//
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl
// >Import : http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl:0
// >Import : http://localhost:8080/SiiuEJBModule/PaisFacade?wsdl:1
// (03/05/2007 08:36:07 p.m. - - $Rev: 5569 $)
// ************************************************************************
//
#ifndef PaisFacadeH
#define PaisFacadeH
#include <System.hpp>
#include <InvokeRegistry.hpp>
#include <XSBuiltIns.hpp>
#include <SOAPHTTPClient.hpp>
#if !defined(SOAP_REMOTABLE_CLASS)
#define SOAP_REMOTABLE_CLASS __declspec(delphiclass)
#endif
#if !defined(AS_UNBOUNDED)
#define AS_UNBOUNDED false
#endif
#if !defined(AS_ATTRIBUTE)
#define AS_ATTRIBUTE false
#endif
namespace NS_PaisFacade {
// ************************************************************************
//
// The following types, referred to in the WSDL document are not being
represented
// in this file. They are either aliases[@] of other types represented or
were referred
// to but never[!] declared in the document. The types from the latter
category
// typically map to predefined/known XML or Borland types; however, they
could also
// indicate incorrect WSDL documents that failed to declare or import a
schema type.
// ************************************************************************
//
// !:string - "http://www.w3.org/2001/XMLSchema"
class SOAP_REMOTABLE_CLASS Pais;
// ************************************************************************
//
// XML : Pais, global, <complexType>
// Namespace : http://model.siiu.com/jaws
// ************************************************************************
//
class Pais : public TRemotable {
private:
WideString Fabrev;
WideString Fidpais;
WideString Fnombre;
public:
__published:
__property WideString abrev = { read=Fabrev, write=Fabrev };
__property WideString idpais = { read=Fidpais, write=Fidpais };
__property WideString nombre = { read=Fnombre, write=Fnombre };
};
typedef DynamicArray<Pais*> Array_Of_Pais; /*
"http://model.siiu.com/jaws"[Gblunbnd] */
// ************************************************************************
//
// Namespace : http://facade.siiu.com/jaws
// transport : http://schemas.xmlsoap.org/soap/http
// style : document
// binding : PaisFacadeBinding
// service : PaisFacadeService
// port : PaisFacadePort
// URL : http://Contabilidad:8080/SiiuEJBModule/PaisFacade
// ************************************************************************
//
__interface INTERFACE_UUID("{02E77375-C84D-5824-603C-964313FAE390}")
PaisFacade : public IInvokable
{
public:
virtual void actualizaPais(const Pais* Pais_1) = 0;
virtual void borraPais(const Pais* Pais_1) = 0;
virtual void creaPais(const Pais* Pais_1) = 0;
virtual Pais* encuentraPais(const WideString String_1) = 0;
virtual Array_Of_Pais encuentraPaises() = 0;
};
typedef DelphiInterface<PaisFacade> _di_PaisFacade;
_di_PaisFacade GetPaisFacade(bool useWSDL=false, AnsiString addr="",
THTTPRIO* HTTPRIO=0);
}; // NS_PaisFacade
#if !defined(NO_IMPLICIT_NAMESPACE_USE)
using namespace NS_PaisFacade;
#endif
#endif // PaisFacadeH
Works the same Delphi runtime for C++ application? or i need other SOAP
runtime for C++.
Somebody have any idea?
Thanks in advance!!
Jair Karim
Re: Problem Deserializing Array Of Objects
Author: Jean-Marie Babet
Date: Fri, 04 May 2007 21:12
Date: Fri, 04 May 2007 21:12
19 lines
1495 bytes
1495 bytes
Hello Jair, First of all my apologies: I saw your earlier post and had good intentions to follow up but then work did what it's doing so well lately:( What version of the importer are you using? I see it $Rev:5569. I don't know if the unbounded support had been ported to the C++ writer yet [the reader portion is shared between Delphi and C++]. The best approach would be: #1 Either I send you the latest importer - which definitely includes the same level of support as Delphi's #2 Or you send me the WSDL so I may investigate. Let me know! Cheers, Bruneau.
Re: Problem Deserializing Array Of Objects
Author: Jair Karim Tinoco
Date: Sat, 05 May 2007 00:46
Date: Sat, 05 May 2007 00:46
223 lines
8765 bytes
8765 bytes
Hi Bruneau,
Don't worry for the elapsed time of your response, almost people in this
world are busy.
WSDL for this test is the next:
<definitions name='PaisFacadeService'
targetNamespace='http://facade.siiu.com/jaws'
xmlns='http://schemas.xmlsoap.org/wsdl/'
xmlns:ns1='http://model.siiu.com/jaws'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:tns='http://facade.siiu.com/jaws'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<types>
<schema elementFormDefault='qualified'
targetNamespace='http://model.siiu.com/jaws'
xmlns='http://www.w3.org/2001/XMLSchema'
xmlns:ns1='http://facade.siiu.com/jaws'
xmlns:soap11-enc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:tns='http://model.siiu.com/jaws'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<import namespace='http://facade.siiu.com/jaws'/>
<complexType name='Pais'>
<sequence>
<element name='abrev' nillable='true' type='string'/>
<element name='idpais' nillable='true' type='string'/>
<element name='nombre' nillable='true' type='string'/>
</sequence>
</complexType>
</schema>
<schema elementFormDefault='qualified'
targetNamespace='http://facade.siiu.com/jaws'
xmlns='http://www.w3.org/2001/XMLSchema'
xmlns:ns2='http://model.siiu.com/jaws'
xmlns:soap11-enc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:tns='http://facade.siiu.com/jaws'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<import namespace='http://model.siiu.com/jaws'/>
<complexType name='actualizaPais'>
<sequence>
<element name='Pais_1' nillable='true' type='ns2:Pais'/>
</sequence>
</complexType>
<complexType name='actualizaPaisResponse'>
<sequence/>
</complexType>
<complexType name='borraPais'>
<sequence>
<element name='Pais_1' nillable='true' type='ns2:Pais'/>
</sequence>
</complexType>
<complexType name='borraPaisResponse'>
<sequence/>
</complexType>
<complexType name='creaPais'>
<sequence>
<element name='Pais_1' nillable='true' type='ns2:Pais'/>
</sequence>
</complexType>
<complexType name='creaPaisResponse'>
<sequence/>
</complexType>
<complexType name='encuentraPais'>
<sequence>
<element name='String_1' nillable='true' type='string'/>
</sequence>
</complexType>
<complexType name='encuentraPaisResponse'>
<sequence>
<element name='result' nillable='true' type='ns2:Pais'/>
</sequence>
</complexType>
<complexType name='encuentraPaises'>
<sequence/>
</complexType>
<complexType name='encuentraPaisesResponse'>
<sequence>
<element maxOccurs='unbounded' minOccurs='0' name='result'
nillable='true' type='ns2:Pais'/>
</sequence>
</complexType>
<element name='actualizaPais' type='tns:actualizaPais'/>
<element name='actualizaPaisResponse' type='tns:actualizaPaisResponse'/>
<element name='borraPais' type='tns:borraPais'/>
<element name='borraPaisResponse' type='tns:borraPaisResponse'/>
<element name='creaPais' type='tns:creaPais'/>
<element name='creaPaisResponse' type='tns:creaPaisResponse'/>
<element name='encuentraPais' type='tns:encuentraPais'/>
<element name='encuentraPaisResponse' type='tns:encuentraPaisResponse'/>
<element name='encuentraPaises' type='tns:encuentraPaises'/>
<element name='encuentraPaisesResponse'
type='tns:encuentraPaisesResponse'/>
</schema>
</types>
<message name='PaisFacade_borraPaisResponse'>
<part element='tns:borraPaisResponse' name='result'/>
</message>
<message name='PaisFacade_actualizaPaisResponse'>
<part element='tns:actualizaPaisResponse' name='result'/>
</message>
<message name='PaisFacade_actualizaPais'>
<part element='tns:actualizaPais' name='parameters'/>
</message>
<message name='PaisFacade_encuentraPaisesResponse'>
<part element='tns:encuentraPaisesResponse' name='result'/>
</message>
<message name='PaisFacade_encuentraPaises'>
<part element='tns:encuentraPaises' name='parameters'/>
</message>
<message name='PaisFacade_encuentraPais'>
<part element='tns:encuentraPais' name='parameters'/>
</message>
<message name='PaisFacade_creaPais'>
<part element='tns:creaPais' name='parameters'/>
</message>
<message name='PaisFacade_borraPais'>
<part element='tns:borraPais' name='parameters'/>
</message>
<message name='PaisFacade_encuentraPaisResponse'>
<part element='tns:encuentraPaisResponse' name='result'/>
</message>
<message name='PaisFacade_creaPaisResponse'>
<part element='tns:creaPaisResponse' name='result'/>
</message>
<portType name='PaisFacade'>
<operation name='actualizaPais'>
<input message='tns:PaisFacade_actualizaPais'/>
<output message='tns:PaisFacade_actualizaPaisResponse'/>
</operation>
<operation name='borraPais'>
<input message='tns:PaisFacade_borraPais'/>
<output message='tns:PaisFacade_borraPaisResponse'/>
</operation>
<operation name='creaPais'>
<input message='tns:PaisFacade_creaPais'/>
<output message='tns:PaisFacade_creaPaisResponse'/>
</operation>
<operation name='encuentraPais'>
<input message='tns:PaisFacade_encuentraPais'/>
<output message='tns:PaisFacade_encuentraPaisResponse'/>
</operation>
<operation name='encuentraPaises'>
<input message='tns:PaisFacade_encuentraPaises'/>
<output message='tns:PaisFacade_encuentraPaisesResponse'/>
</operation>
</portType>
<binding name='PaisFacadeBinding' type='tns:PaisFacade'>
<soap:binding style='document'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='actualizaPais'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
</operation>
<operation name='borraPais'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
</operation>
<operation name='creaPais'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
</operation>
<operation name='encuentraPais'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
</operation>
<operation name='encuentraPaises'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
</operation>
</binding>
<service name='PaisFacadeService'>
<port binding='tns:PaisFacadeBinding' name='PaisFacadePort'>
<soap:address
location='http://Contabilidad:8080/SiiuEJBModule/PaisFacade'/>
</port>
</service>
</definitions>
As you can see, style is DOCUMENT/LITERAL, parameter pass works fine and
array objects deserializing fails, however with RPC/LITERAL style an array
of objects deserializing works fine, but parameter pass to web services
fails.
I'm using wsdl importer rev $5569, some weeks ago you send me an fixed wsdl
importer rev $3108, the last importer was downloaded from codegear web site
in the next URL:
http://codecentral.codegear.com/Item/24535
Functional behavior is inverted when i use one style or another. The web
service is an EJB 3.0 exposed through JBossWS with JSR-181 specification,
JSR-181 doesn't support RPC/ENCODED so i can't use this style.
If a newer SOAP runtime and wsdl importer exists please send it to me.
Thanks in advance!!
Jair Karim
Re: Problem Deserializing Array Of Objects
Author: Jean-Marie Babet
Date: Fri, 11 May 2007 00:32
Date: Fri, 11 May 2007 00:32
208 lines
6848 bytes
6848 bytes
Hello,
Squeezing a few minutes to catch up on the newsgroup.
I imported the WSDL posted with the latest importer and it generated the
following (pasted below). I'm not sure if this matches what you have. If
not, I can email you what I have. Please let me know.
Cheers,
Bruneau.
[[[[[HEADER]]]]]
// ************************************************************************
//
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : test.wsdl
// >Import : test.wsdl:0
// >Import : test.wsdl:1
// (5/10/2007 5:26:18 PM - - $Rev: 6632 $)
// ************************************************************************
//
#ifndef testH
#define testH
#include <System.hpp>
#include <InvokeRegistry.hpp>
#include <XSBuiltIns.hpp>
#include <SOAPHTTPClient.hpp>
#if !defined(SOAP_REMOTABLE_CLASS)
#define SOAP_REMOTABLE_CLASS __declspec(delphiclass)
#endif
#if !defined(IS_OPTN)
#define IS_OPTN 0x0001
#endif
#if !defined(IS_UNBD)
#define IS_UNBD 0x0002
#endif
#if !defined(IS_NLBL)
#define IS_NLBL 0x0004
#endif
namespace NS_test {
// ************************************************************************
//
// The following types, referred to in the WSDL document are not being
represented
// in this file. They are either aliases[@] of other types represented or
were referred
// to but never[!] declared in the document. The types from the latter
category
// typically map to predefined/known XML or Borland types; however, they
could also
// indicate incorrect WSDL documents that failed to declare or import a
schema type.
// ************************************************************************
//
// !:string - "http://www.w3.org/2001/XMLSchema"
class SOAP_REMOTABLE_CLASS Pais;
// ************************************************************************
//
// XML : Pais, global, <complexType>
// Namespace : http://model.siiu.com/jaws
// ************************************************************************
//
class Pais : public TRemotable {
private:
WideString Fabrev;
WideString Fidpais;
WideString Fnombre;
__published:
__property WideString abrev = { index=(IS_NLBL), read=Fabrev,
write=Fabrev };
__property WideString idpais = { index=(IS_NLBL), read=Fidpais,
write=Fidpais };
__property WideString nombre = { index=(IS_NLBL), read=Fnombre,
write=Fnombre };
};
typedef DynamicArray<Pais*> Array_Of_Pais; /*
"http://model.siiu.com/jaws"[GblUbnd] */
// ************************************************************************
//
// Namespace : http://facade.siiu.com/jaws
// transport : http://schemas.xmlsoap.org/soap/http
// style : document
// binding : PaisFacadeBinding
// service : PaisFacadeService
// port : PaisFacadePort
// URL : http://Contabilidad:8080/SiiuEJBModule/PaisFacade
// ************************************************************************
//
__interface INTERFACE_UUID("{02E77375-C84D-5824-603C-964313FAE390}")
PaisFacade : public IInvokable
{
public:
virtual void actualizaPais(const Pais* Pais_1) = 0;
virtual void borraPais(const Pais* Pais_1) = 0;
virtual void creaPais(const Pais* Pais_1) = 0;
virtual Pais* encuentraPais(const WideString String_1) = 0;
virtual Array_Of_Pais encuentraPaises() = 0;
};
typedef DelphiInterface<PaisFacade> _di_PaisFacade;
_di_PaisFacade GetPaisFacade(bool useWSDL=false, AnsiString addr="",
THTTPRIO* HTTPRIO=0);
}; // NS_test
#if !defined(NO_IMPLICIT_NAMESPACE_USE)
using namespace NS_test;
#endif
#endif // testH
[[[[[SOURCE]]]]]
// ************************************************************************
//
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : test.wsdl
// >Import : test.wsdl:0
// >Import : test.wsdl:1
// (5/10/2007 5:26:18 PM - - $Rev: 6632 $)
// ************************************************************************
//
#include <vcl.h>
#pragma hdrstop
#if !defined(testH)
#include "test.h"
#endif
namespace NS_test {
_di_PaisFacade GetPaisFacade(bool useWSDL, AnsiString addr, THTTPRIO*
HTTPRIO)
{
static const char* defWSDL= "test.wsdl";
static const char* defURL =
"http://Contabilidad:8080/SiiuEJBModule/PaisFacade";
static const char* defSvc = "PaisFacadeService";
static const char* defPrt = "PaisFacadePort";
if (addr=="")
addr = useWSDL ? defWSDL : defURL;
THTTPRIO* rio = HTTPRIO ? HTTPRIO : new THTTPRIO(0);
if (useWSDL) {
rio->WSDLLocation = addr;
rio->Service = defSvc;
rio->Port = defPrt;
} else {
rio->URL = addr;
}
_di_PaisFacade service;
rio->QueryInterface(service);
if (!service && !HTTPRIO)
delete rio;
return service;
}
// ************************************************************************
//
// This routine registers the interfaces and types exposed by the
WebService.
// ************************************************************************
//
static void RegTypes()
{
/* PaisFacade */
InvRegistry()->RegisterInterface(__interfaceTypeinfo(PaisFacade),
L"http://facade.siiu.com/jaws", L"");
InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(PaisFacade),
L"");
InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(PaisFacade),
ioDocument);
/* Pais */
RemClassRegistry()->RegisterXSClass(__classid(Pais),
L"http://model.siiu.com/jaws", L"Pais");
/* Array_Of_Pais */
RemClassRegistry()->RegisterXSInfo(__arrayTypeinfo(Array_Of_Pais),
L"http://model.siiu.com/jaws", L"Array_Of_Pais");
}
#pragma startup RegTypes 32
}; // NS_test
Re: Problem Deserializing Array Of Objects
Author: Jair Karim Tinoco
Date: Fri, 11 May 2007 15:40
Date: Fri, 11 May 2007 15:40
16 lines
1780 bytes
1780 bytes
Hi, generated code you sent me matchs with my generated code, so WSDL Importer is not the cause, i did tests with Delphi BDS 2006 and everything works fine when last SOAP runtime is used, when original SOAP runtime from factory is used the behavior is the same that in C++ Builder BDS 2006, array of objects deserializaing doesn't work. So, i think we don't use correctly the fixed SOAP runtime in C++ because at compile time still requires original from factory LIB files (soaprtl.lib). How can i substitute the original SOAP runtime with the fixed SOAP runtime for use in C++ BS 2006? Thanks in advance!! Jair Karim
Re: Problem Deserializing Array Of Objects
Author: Jean-Marie Babet
Date: Fri, 11 May 2007 18:27
Date: Fri, 11 May 2007 18:27
21 lines
1788 bytes
1788 bytes
Hello Jair, It's a little harder to use the new runtime with C++. With Delphi all you have to do is ensure that the runtime is on the search path before the standard Units we ship. With C++ one has two options: 1. Add the updated .pas runtime directly to the project. (The IDE will compile then, generating new .obj files, and link with the latter). 2. Rebuild the soaprtl.lib library. Option #2 can be a little complicated as earlier versions of DCC32 did not automatically generate the .lib file: you had to build the .obj/.hpp files and then run TLIB on the .obj files to create the library. What version of C++ will you be using to build the C++ app? I'll try to put something together that creates the library. Cheers, Bruneau.
Re: Problem Deserializing Array Of Objects
Author: Jair Karim Tinoco
Date: Mon, 28 May 2007 23:39
Date: Mon, 28 May 2007 23:39
6 lines
1429 bytes
1429 bytes
Hello Bruneau, I'm using C++ Borland Developer Studio 2006 Enterprise Edition Update 2. Thanks!! Jair Karim
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads