1. GUI. wxWindows + gSoap (and possibly PHP, pocket pc, etc.)
2. Bussines Layer. wxWindows + gSoap + Apache
3. Database. Postgres or SQL Server
Other option, in my opinion, would be Java, but if we are generating so good client applications with wxWindows and gSoap, lets make the Web Services with gSoap and wxWindows. And make everything more robust using the great Apache Web Server. I have used this environment with .NET and working as client and as server, everything works fine. The only problem at this time are SOAP faults that .NET use as soap1.1 and aren't so friendly to manage as in gSoap (maybe I have to lear VB .NET.... some day)
At this time, I haven't tested on linux... but the theory says that I won't have problems. Something that have made my life easier is the wxString (de)serialization functions... so here is my contribution:
if you place this in a gsoap header file
Code: Select all
#include <wx/string.h>
extern class wxString;
extern typedef wxString xsd__string; // encode xsd__string value as the xsd:string schema type
Code: Select all
#include <wx/string.h>
#include "envH.h"
void soap_serialize_xsd__string(struct soap *soap, const wxString *a)
{
// soap_serialize_std__string(soap, a);
}
void soap_default_xsd__string(struct soap *soap, wxString *a)
{
a->clear();
// soap_default_std__string(soap, a);
}
int soap_out_xsd__string(struct soap * soap, const char *tag, int id, const wxString *s, const char *type)
{
if ((soap->mode & SOAP_C_NILSTRING) && s->empty())
return soap_element_null(soap, tag, id, type);
if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, s, SOAP_TYPE_xsd__string), type) || soap_string_out(soap, s->c_str(), 0) || soap_element_end_out(soap, tag))
return soap->error;
return SOAP_OK;
}
wxString * soap_in_xsd__string(struct soap *soap, const char *tag, wxString *s, const char *type)
{
if (soap_element_begin_in(soap, tag, 1, type))
return NULL;
if (!s)
s = soap_new_xsd__string(soap, -1);
if (soap->null)
if (s)
s->erase();
if (soap->body && !*soap->href)
{ char *t;
s = (wxString*)soap_class_id_enter(soap, soap->id, s, SOAP_TYPE_xsd__string, sizeof(wxString), soap->type, soap->arrayType);
if (s)
if ((t = soap_string_in(soap, 1, -1, -1)))
s->assign(t);
else
return NULL;
}
else
s = (wxString*)soap_id_forward(soap, soap->href, soap_class_id_enter(soap, soap->id, s, SOAP_TYPE_xsd__string, sizeof(wxString), soap->type, soap->arrayType), 0, SOAP_TYPE_xsd__string, 0, sizeof(wxString), 0, soap_copy_xsd__string);
if (soap->body && soap_element_end_in(soap, tag))
return NULL;
return s;
}