Files correlati : Ricompilazione Demo : [ ] Commento :corretti warning git-svn-id: svn://10.65.10.50/trunk@16571 c028cbd2-c16b-5b4b-a496-9718f37d4682
639 lines
14 KiB
C++
Executable File
639 lines
14 KiB
C++
Executable File
#include "baseserv.h"
|
|
#include "xml.h"
|
|
#include <wx/config.h>
|
|
#include <wx/filename.h>
|
|
#include <wx/tokenzr.h>
|
|
|
|
#ifdef WIN32
|
|
#include <wx/fileconf.h>
|
|
#endif
|
|
|
|
#define LF_TABGEN 3
|
|
#define LF_TABCOM 4
|
|
#define LF_TAB 5
|
|
|
|
//////////////////////////////////////////////////////////
|
|
// Date utilities
|
|
///////////////////////////////////////////////////////////
|
|
|
|
static const byte _days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
|
|
|
int last_day(int month, int year)
|
|
// parse_filastrok(
|
|
// "trenta giorni ha novembre
|
|
// con april, giugno e settembre
|
|
// son ventotto case uno
|
|
// per default ce n'ha trentuno");
|
|
{
|
|
int d = _days_in_month[month-1];
|
|
if (month == 2 && (year % 4) == 0)
|
|
d++;
|
|
return d;
|
|
}
|
|
|
|
bool isdate(const wxChar * s)
|
|
{
|
|
const int len = strlen(s);
|
|
if (len != 8 && len != 10)
|
|
return false;
|
|
|
|
int d = 0, m = 0, y = 0, i;
|
|
if (len == 8)
|
|
{
|
|
for (i = 0; i < 8; i++)
|
|
if (!isdigit(s[i])) break;
|
|
if (i == 8)
|
|
{
|
|
wxString str(s);
|
|
d = atoi(((const char *)str)+6); str[6] = '\0';
|
|
m = atoi(((const char *)str)+4); str[4] = '\0';
|
|
y = atoi(((const char *)str)+0);
|
|
}
|
|
}
|
|
else
|
|
if (len == 10)
|
|
{
|
|
if (s[2] == s[5] && !isdigit(s[2]))
|
|
{
|
|
d = atoi(s);
|
|
m = atoi(&s[3]);
|
|
y = atoi(&s[6]);
|
|
}
|
|
}
|
|
|
|
if (d < 1 || d > 31 ||
|
|
m < 1 || m > 12 ||
|
|
y < 0)
|
|
return false;
|
|
|
|
return d <= last_day(m,y);
|
|
}
|
|
|
|
long date2ansi(const wxChar * s)
|
|
{
|
|
long val = 0L;
|
|
|
|
const int len = (s && *s >= '0') ? strlen(s) : 0;
|
|
if (len != 8 && len != 10) // Chi si azzarda ad aggiungere len != 6 ?
|
|
return 0L;
|
|
|
|
if (len == 8)
|
|
{
|
|
int i;
|
|
for (i = 0; i < 8; i++)
|
|
if (!isdigit(s[i])) break;
|
|
if (i == 8)
|
|
val = atol(s);
|
|
}
|
|
else
|
|
{
|
|
if (s[2] == s[5] && !isdigit(s[2]))
|
|
{
|
|
const int d = atoi(s);
|
|
const int m = atoi(&s[3]);
|
|
const int y = atoi(&s[6]);
|
|
val = d + m + 100 + y * 10000;
|
|
}
|
|
}
|
|
return val;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TPostmanServer
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TPostmanServer : public TBaseServerApp
|
|
{
|
|
wxArrayString m_Editors;
|
|
wxArrayString m_FirmEditors;
|
|
int m_Logicnum;
|
|
int m_Firm;
|
|
int m_LastFirm;
|
|
wxArrayString m_TableName;
|
|
int m_Err;
|
|
wxString m_DataPath;
|
|
|
|
protected:
|
|
virtual void ProcessHttpGet(wxString cmd, wxSocketBase& outs);
|
|
bool IsMagicName(wxString& strFilename) const;
|
|
virtual const wxChar* GetAppName() const;
|
|
void AbsoluteNameName(wxString & name);
|
|
const wxString Table2Editor(const wxString & table);
|
|
bool LoadEditors(const wxChar * filename, wxArrayString & editors);
|
|
void SaveXml2IniParagraph(wxFileConfig & ini, TXmlItem& xmlItem);
|
|
void SaveTransaction(const TXmlItem& xmlMethod, wxString & filename);
|
|
void AdjustTransaction(wxString & filename);
|
|
const wxString EditorCommand();
|
|
void ExecuteTransaction(wxString & filename);
|
|
void LoadXmlParagraph(TXmlItem & xmlItem, wxString & paragraph, wxString & filename);
|
|
void LoadTransaction(wxString & filename, TXmlItem & xmlAnswer);
|
|
void Log(TXmlItem& xmlItem, wxString & filename);
|
|
virtual void SoapProcessMethod(const TXmlItem& xmlMethod, TXmlItem& xmlAnswer);
|
|
virtual int GetDefaultPort() const;
|
|
|
|
public:
|
|
virtual bool Initialization();
|
|
|
|
TPostmanServer() : m_Logicnum(0), m_Err(0), m_Firm(0), m_LastFirm(0) {}
|
|
};
|
|
|
|
void TPostmanServer::ProcessHttpGet(wxString cmd, wxSocketBase& outs)
|
|
{
|
|
const int stop = cmd.Find(" HTTP");
|
|
wxString str = cmd.Mid(4, stop-4).Trim();
|
|
|
|
if (str == "/")
|
|
str += "index.htm";
|
|
wxString strFilename = GetDocumentRoot() + str;
|
|
|
|
IsMagicName(strFilename);
|
|
SendFile(strFilename, outs);
|
|
}
|
|
|
|
bool TPostmanServer::IsMagicName(wxString& strFilename) const
|
|
{
|
|
wxFileName fnName(strFilename);
|
|
wxString strName(fnName.GetName().Lower());
|
|
|
|
if (strName == "index" || strName == "log")
|
|
{
|
|
strFilename = GetLogFileName();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
const wxString TPostmanServer::Table2Editor(const wxString & table)
|
|
{
|
|
wxString row;
|
|
wxString module;
|
|
wxString editor;
|
|
wxString name;
|
|
|
|
{
|
|
name << "../recdesc/d" << table << ".des";
|
|
name.Lower();
|
|
|
|
wxFileName f(name);
|
|
|
|
f.MakeAbsolute();
|
|
name = f.GetFullPath();
|
|
wxTextFile file(name);
|
|
|
|
if (file.Open())
|
|
{
|
|
for (row = file.GetFirstLine(); !file.Eof(); row = file.GetNextLine())
|
|
{
|
|
row.Trim(false);
|
|
if (row.StartsWith("Module"))
|
|
{
|
|
const int pos = row.Find("=");
|
|
|
|
if (pos >= 0)
|
|
module = row.Mid(pos + 1);
|
|
module.Trim();
|
|
module.Trim(false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (module.IsEmpty())
|
|
{
|
|
module = "ba";
|
|
name = "../??tb";
|
|
name << table << ".msk";
|
|
name.Lower();
|
|
|
|
wxFileName f(name);
|
|
|
|
f.MakeAbsolute();
|
|
name = f.GetFullPath();
|
|
wxString foundfile = ::wxFindFirstFile(name, wxFILE);
|
|
while (!foundfile.IsEmpty())
|
|
{
|
|
f = foundfile;
|
|
wxString str(f.GetName().Left(2));
|
|
if (str != "ba")
|
|
{
|
|
module = str;
|
|
break;
|
|
}
|
|
foundfile = ::wxFindNextFile();
|
|
}
|
|
}
|
|
|
|
wxFileName f("../install.ini");
|
|
|
|
f.MakeAbsolute();
|
|
name = f.GetFullPath();
|
|
wxTextFile file(name);
|
|
wxString wmodule;
|
|
|
|
if (file.Open())
|
|
{
|
|
for (row = file.GetFirstLine(); !file.Eof(); row = file.GetNextLine())
|
|
{
|
|
row.Trim(false);
|
|
if (row.StartsWith("["))
|
|
wmodule = row.Mid(1, 2);
|
|
else
|
|
if (row.StartsWith("Edit_"))
|
|
{
|
|
const int pos = row.Find("=");
|
|
|
|
if (pos >= 0)
|
|
{
|
|
const wxString table(row.Mid(5, pos - 4));
|
|
const int logicnum = atoi(table);
|
|
|
|
if ((logicnum <= LF_TAB && module == wmodule) || table == m_TableName[m_Logicnum])
|
|
{
|
|
editor = row.Mid(pos + 1);
|
|
editor.Trim(false);
|
|
editor << " ";
|
|
if (m_Logicnum == LF_TABGEN)
|
|
editor << '#';
|
|
else
|
|
if (m_Logicnum == LF_TABCOM)
|
|
editor << '%';
|
|
editor << m_TableName[m_Logicnum];
|
|
if (table == m_TableName[m_Logicnum])
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return editor;
|
|
}
|
|
|
|
bool TPostmanServer::LoadEditors(const wxChar * filename, wxArrayString & editors)
|
|
{
|
|
wxFileName f(filename);
|
|
|
|
f.MakeAbsolute();
|
|
wxString name(f.GetFullPath());
|
|
wxTextFile file(name);
|
|
wxString row;
|
|
wxString module;
|
|
|
|
if (file.Open())
|
|
{
|
|
for (row = file.GetFirstLine(); !file.Eof(); row = file.GetNextLine())
|
|
{
|
|
wxString editor;
|
|
|
|
row.Trim(false);
|
|
if (row.StartsWith("["))
|
|
module = row.Mid(1, 2);
|
|
else
|
|
if (row.StartsWith("Edit_"))
|
|
{
|
|
const int pos = row.Find("=");
|
|
|
|
if (pos < 0)
|
|
continue;
|
|
|
|
const int logicnum = atoi(row.Mid(5, pos - 4));
|
|
|
|
if (logicnum < 7 && module != "ba")
|
|
continue;
|
|
editor = row.Mid(pos + 1);
|
|
editor.Trim(false);
|
|
int nrows2add = logicnum - editors.GetCount() + 1;
|
|
|
|
if (nrows2add > 0)
|
|
editors.Add(wxEmptyString, nrows2add);
|
|
editors[logicnum] = editor;
|
|
}
|
|
}
|
|
}
|
|
return editors.GetCount() > 0;
|
|
}
|
|
|
|
int TPostmanServer::GetDefaultPort() const
|
|
{
|
|
return GetConfigInt("Port", 8080);
|
|
}
|
|
|
|
void TPostmanServer::SaveXml2IniParagraph(wxFileConfig& ini, TXmlItem& xmlItem)
|
|
{
|
|
int items = xmlItem.GetChildren();
|
|
|
|
for (int i = 0; i < items; i++)
|
|
{
|
|
TXmlItem * child = xmlItem.GetChild(i);
|
|
|
|
wxString key(child->GetAttr("Name"));
|
|
wxString val(child->GetEnclosedText());
|
|
|
|
if (key == "Firm")
|
|
m_Firm = atoi(val);
|
|
|
|
ini.Write(key, val);
|
|
}
|
|
}
|
|
|
|
void TPostmanServer::SaveTransaction(const TXmlItem& xmlMethod, wxString & filename)
|
|
{
|
|
wxString paragraph;
|
|
int items = xmlMethod.GetChildren();
|
|
|
|
if (wxFileName::FileExists(filename))
|
|
wxRemoveFile(filename);
|
|
for (int i = 0; i < items; i++)
|
|
{
|
|
TXmlItem * child = xmlMethod.GetChild(i);
|
|
const int logicnum = atoi(child->GetAttr("LogicNumber"));
|
|
|
|
paragraph = "/";
|
|
if (logicnum > 0)
|
|
{
|
|
if (m_Logicnum == 0)
|
|
m_Logicnum = logicnum;
|
|
paragraph << logicnum;
|
|
|
|
const int rownum = atoi(child->GetAttr("RowNumber"));
|
|
|
|
if (rownum > 0)
|
|
paragraph << ',' << rownum;
|
|
int nrows2add = logicnum - m_TableName.GetCount() + 1;
|
|
|
|
if (nrows2add > 0)
|
|
m_TableName.Add(wxEmptyString, nrows2add);
|
|
m_TableName[logicnum] = child->GetAttr("TableName");
|
|
}
|
|
else
|
|
paragraph << child->GetTag();
|
|
wxFileConfig ini("", "", filename, "", wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH);
|
|
ini.SetPath(paragraph);
|
|
SaveXml2IniParagraph(ini, *child);
|
|
}
|
|
}
|
|
|
|
void TPostmanServer::AdjustTransaction(wxString & filename)
|
|
{
|
|
wxTextFile file(filename);
|
|
bool changed = false;
|
|
|
|
if (file.Open())
|
|
{
|
|
for (wxString & row = file.GetFirstLine(); !file.Eof(); row = file.GetNextLine())
|
|
{
|
|
const int pos = row.Find("\\,");
|
|
if (pos > 0)
|
|
{
|
|
row.Remove(pos, 1);
|
|
changed = true;
|
|
size_t rowno = file.GetCurrentLine();
|
|
file.InsertLine(row, rowno);
|
|
file.RemoveLine(rowno + 1);
|
|
}
|
|
}
|
|
if (changed)
|
|
file.Write();
|
|
}
|
|
else
|
|
WriteLog("Can't create Transaction file");
|
|
}
|
|
|
|
const wxString TPostmanServer::EditorCommand()
|
|
{
|
|
const bool firmchanged = m_Firm != m_LastFirm;
|
|
|
|
m_LastFirm = m_Firm;
|
|
if (firmchanged)
|
|
{
|
|
m_FirmEditors.empty();
|
|
wxString name(m_DataPath);
|
|
wxChar l = name[name.Len() - 1];
|
|
|
|
if (l != '/' && l != '\\')
|
|
name << '/';
|
|
|
|
wxString str;
|
|
|
|
str << m_Firm;
|
|
while(str.Len() < 5)
|
|
str.insert(0, "0");
|
|
name << str << "a/ditta.ini";
|
|
LoadEditors(name.c_str(), m_FirmEditors);
|
|
}
|
|
wxString table(m_TableName[m_Logicnum]);
|
|
|
|
if (m_Logicnum <= LF_TAB && !table.IsEmpty())
|
|
{
|
|
wxString editor(Table2Editor(table));
|
|
|
|
if (!editor.IsEmpty())
|
|
return editor;
|
|
}
|
|
if (m_Logicnum < (int) m_FirmEditors.GetCount() && !m_FirmEditors[m_Logicnum].IsEmpty())
|
|
return m_FirmEditors[m_Logicnum].c_str();
|
|
if (m_Logicnum < (int) m_Editors.GetCount() && !m_Editors[m_Logicnum].IsEmpty())
|
|
return m_Editors[m_Logicnum].c_str();
|
|
return wxEmptyString;
|
|
}
|
|
|
|
void TPostmanServer::ExecuteTransaction(wxString & filename)
|
|
{
|
|
wxString editor(EditorCommand());
|
|
if (!editor.IsEmpty())
|
|
{
|
|
wxFileName cmdname(editor);
|
|
|
|
if (cmdname.IsRelative())
|
|
{
|
|
cmdname.MakeAbsolute();
|
|
cmdname.RemoveLastDir();
|
|
}
|
|
|
|
wxString command(cmdname.GetFullPath());
|
|
|
|
const wxString currdir(wxGetCwd());
|
|
|
|
wxSetWorkingDirectory(cmdname.GetPath());
|
|
command << " -i" <<filename << " -uADMIN";
|
|
m_Err = 0;
|
|
if (::wxExecute(command, wxEXEC_SYNC) < 0)
|
|
{
|
|
wxString str;
|
|
|
|
m_Err = 2;
|
|
str << "Errore nell'esecuzione di " << command << m_Err ;
|
|
WriteLog(str);
|
|
|
|
}
|
|
wxSetWorkingDirectory(currdir);
|
|
}
|
|
}
|
|
|
|
void TPostmanServer::LoadXmlParagraph(TXmlItem& xmlItem, wxString& paragraph, wxString & filename)
|
|
{
|
|
wxString path;
|
|
wxFileConfig ini("", "", filename, "", wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH);
|
|
|
|
path << "/" << paragraph;
|
|
ini.SetPath(path);
|
|
wxStringTokenizer tok(paragraph, ",");
|
|
wxString tag = tok.GetNextToken();
|
|
const size_t logicnum = atoi(tag);
|
|
const wxChar * attr = logicnum > 0 ? "Field" : "Attr";
|
|
int rownum = 0 ;
|
|
|
|
if (logicnum > 0 && tok.HasMoreTokens())
|
|
rownum = atoi(tok.GetNextToken());
|
|
if (logicnum > 0)
|
|
tag = "Record";
|
|
|
|
TXmlItem & child =xmlItem.AddChild(tag);
|
|
|
|
if (logicnum > 0)
|
|
{
|
|
child.SetAttr("LogicNumber", logicnum);
|
|
if (logicnum < m_TableName.GetCount())
|
|
child.SetAttr("TableName", m_TableName[logicnum]);
|
|
|
|
if (rownum > 0)
|
|
child.SetAttr("RowNumber", rownum);
|
|
}
|
|
|
|
wxString s;
|
|
wxString key;
|
|
long index = 0;
|
|
|
|
for (bool ok = ini.GetFirstEntry(key, index); ok; ok = ini.GetNextEntry (key, index))
|
|
{
|
|
wxString val(ini.Read(key));
|
|
|
|
if (val.StartsWith("\"") && val.EndsWith("\""))
|
|
{
|
|
val = val.Mid(1);
|
|
val[val.Len()] = '\0';
|
|
}
|
|
else
|
|
{
|
|
val.Trim();
|
|
val.Trim(false);
|
|
}
|
|
if (isdate(val))
|
|
child.AddSoapInt(attr, date2ansi(val)).SetAttr("Name", key);
|
|
else
|
|
{
|
|
if (val.IsNumber())
|
|
{
|
|
if (key == "Error" && m_Err != 0)
|
|
child.AddSoapInt(attr, m_Err).SetAttr("Name", key);
|
|
else
|
|
child.AddSoapInt(attr, atoi(val)).SetAttr("Name", key);
|
|
}
|
|
else
|
|
{
|
|
if (key == "Result" && m_Err != 0)
|
|
child.AddSoapString(attr, "ERROR").SetAttr("Name", key);
|
|
else
|
|
child.AddSoapString(attr, val).SetAttr("Name", key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TPostmanServer::LoadTransaction(wxString & filename, TXmlItem& xmlAnswer)
|
|
{
|
|
wxString paragraph;
|
|
long index = 0;
|
|
wxFileConfig ini("", "", filename, "", wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH);
|
|
|
|
for (bool ok = ini.GetFirstGroup(paragraph, index); ok; ok = ini.GetNextGroup(paragraph, index))
|
|
LoadXmlParagraph(xmlAnswer, paragraph, filename);
|
|
}
|
|
|
|
void TPostmanServer::Log(TXmlItem& WXUNUSED(xmlItem), wxString & filename)
|
|
{
|
|
wxFileConfig ini("", "", filename, "", wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH);
|
|
wxString str;
|
|
wxString key;
|
|
long index = 0;
|
|
|
|
ini.SetPath("/Transaction");
|
|
str << "Transaction : Command " << m_Editors[m_Logicnum];
|
|
WriteLog(str);
|
|
for (bool ok = ini.GetFirstEntry(key, index); ok; ok = ini.GetNextEntry (key, index))
|
|
{
|
|
wxString val(ini.Read(key));
|
|
|
|
str = " ",
|
|
str << key << " = " << val;
|
|
WriteLog(str);
|
|
}
|
|
}
|
|
|
|
void TPostmanServer::SoapProcessMethod(const TXmlItem& xmlMethod, TXmlItem& xmlAnswer)
|
|
{
|
|
const wxString& strMethod = xmlMethod.GetTag();
|
|
if (strMethod == "m:CampoTransaction")
|
|
{
|
|
m_Logicnum = 0;
|
|
wxFileName filename(GetTempFilename("ini"));
|
|
|
|
wxString name(filename.GetFullPath());
|
|
SaveTransaction(xmlMethod, name);
|
|
AdjustTransaction(name);
|
|
ExecuteTransaction(name);
|
|
LoadTransaction(name, xmlAnswer);
|
|
Log(xmlAnswer, name);
|
|
}
|
|
}
|
|
|
|
// Implementazione delle due funzioni pure virtuali
|
|
|
|
const wxChar* TPostmanServer::GetAppName() const
|
|
{
|
|
return "Postman";
|
|
}
|
|
|
|
bool TPostmanServer::Initialization()
|
|
{
|
|
wxFileName f("../campo.ini");
|
|
|
|
f.MakeAbsolute();
|
|
wxString name(f.GetFullPath());
|
|
wxTextFile file(name);
|
|
wxString row;
|
|
|
|
if (file.Open())
|
|
{
|
|
for (row = file.GetFirstLine(); !file.Eof(); row = file.GetNextLine())
|
|
{
|
|
if (row.StartsWith("Study"))
|
|
{
|
|
const int pos = row.Find('=');
|
|
if (pos >= 0)
|
|
{
|
|
m_DataPath = row.Mid(pos + 1);
|
|
m_DataPath.Trim(false);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (m_DataPath.IsEmpty())
|
|
{
|
|
WriteLog("No data path");
|
|
return false;
|
|
}
|
|
if (!LoadEditors("../install.ini", m_Editors))
|
|
{
|
|
WriteLog("No editors found");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
// Istanziare l'applicazione principale
|
|
|
|
IMPLEMENT_APP(TPostmanServer)
|