Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 848 git-svn-id: svn://10.65.10.50/trunk@14993 c028cbd2-c16b-5b4b-a496-9718f37d4682
276 lines
6.5 KiB
C++
Executable File
276 lines
6.5 KiB
C++
Executable File
#include "baseserv.h"
|
|
#include <wx/filename.h>
|
|
#include <wx/tokenzr.h>
|
|
#include <wx/sstream.h>
|
|
#include <wx/zstream.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// TFileToIndex: incapsula le info sui file da indicizzare
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
class TFileToIndex
|
|
{
|
|
protected:
|
|
wxFileName _filename;
|
|
wxStringTokenizer _contents;
|
|
|
|
bool _dirty;
|
|
|
|
static void ReadPDF(wxFileInputStream& file, wxString& output);
|
|
static void ReadTXT(wxFileInputStream& file, wxString& output);
|
|
|
|
public:
|
|
TFileToIndex();
|
|
TFileToIndex(const wxString& strFileName);
|
|
|
|
const bool IsOk() const;
|
|
const bool Dirty() const;
|
|
|
|
void SetFileName(const wxString& strFileName);
|
|
|
|
wxStringTokenizer& GetText();
|
|
};
|
|
|
|
TFileToIndex::TFileToIndex(): _dirty(true)
|
|
{
|
|
}
|
|
|
|
TFileToIndex::TFileToIndex(const wxString& strFileName): _filename(strFileName), _dirty(true)
|
|
{
|
|
}
|
|
|
|
void TFileToIndex::SetFileName(const wxString& strFileName)
|
|
{
|
|
_dirty = true;
|
|
_filename = strFileName;
|
|
}
|
|
|
|
const bool TFileToIndex::IsOk() const
|
|
{
|
|
return _filename.IsOk();
|
|
}
|
|
|
|
const bool TFileToIndex::Dirty() const
|
|
{
|
|
return _dirty;
|
|
}
|
|
|
|
void TFileToIndex::ReadTXT(wxFileInputStream& file, wxString& output)
|
|
{
|
|
file.Read(wxStringBuffer(output,file.GetSize()),file.GetSize());
|
|
}
|
|
|
|
void TFileToIndex::ReadPDF(wxFileInputStream& file, wxString& output)
|
|
{
|
|
wxString buffer;
|
|
file.Read(wxStringBuffer(buffer,file.GetSize()),file.GetSize());
|
|
|
|
bool morestreams = true;
|
|
|
|
while (morestreams)
|
|
{
|
|
size_t streamstart = buffer.Index("stream");
|
|
size_t streamend = buffer.Index("endstream");
|
|
if (streamstart>0 && streamend>streamstart)
|
|
{
|
|
streamstart += 6;
|
|
wxZlibInputStream inflated(wxStringInputStream(buffer.Mid(streamstart,streamend-streamstart)), wxZLIB_AUTO);
|
|
inflated.Read(wxStringOutputStream(&output));
|
|
output << " ";
|
|
|
|
buffer = buffer.Mid(streamend+7);
|
|
}
|
|
else
|
|
{
|
|
morestreams = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
wxStringTokenizer& TFileToIndex::GetText()
|
|
{
|
|
if (Dirty())
|
|
{
|
|
_contents = wxStringTokenizer(" ", " ");
|
|
|
|
if (IsOk())
|
|
{
|
|
wxFileInputStream stream(_filename.GetFullPath());
|
|
|
|
if (stream.CanRead())
|
|
{
|
|
wxString strContents(" ");
|
|
if (!_filename.GetExt().CmpNoCase("pdf"))
|
|
{
|
|
ReadPDF(stream, strContents);
|
|
}
|
|
if (!_filename.GetExt().CmpNoCase("txt") || !_filename.GetExt().CmpNoCase("ini") || !_filename.GetExt().CmpNoCase("log"))
|
|
{
|
|
ReadTXT(stream, strContents);
|
|
}
|
|
_contents = wxStringTokenizer(strContents, " \t\r\n.,:;(){}[]\"=", wxTOKEN_STRTOK);
|
|
}
|
|
}
|
|
}
|
|
|
|
return _contents;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// TIndexingServer
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
class TIndexingServer : public TBaseServerApp
|
|
{
|
|
protected:
|
|
virtual const wxChar* GetAppName() const;
|
|
virtual void ProcessCommand(wxString cmd, wxSocketBase& outs);
|
|
void ProcessHttpGet(wxString cmd, wxSocketBase& outs);
|
|
void ProcessHttpPost(wxString cmd, wxSocketBase& outs);
|
|
|
|
protected:
|
|
bool IsMagicName(wxString& strFilename) const;
|
|
void GenerateFileFromGet(wxString& strFilename);
|
|
void GenerateFileFromPost(wxString& strFilename, THashTable& thArgs);
|
|
};
|
|
|
|
const wxChar* TIndexingServer::GetAppName() const
|
|
{
|
|
return "Indexing";
|
|
}
|
|
|
|
bool TIndexingServer::IsMagicName(wxString& strFilename) const
|
|
{
|
|
wxString strName;
|
|
wxSplitPath(strFilename, NULL, &strName, NULL);
|
|
strName.MakeLower();
|
|
const int q = strName.Find('?');
|
|
if (q > 0)
|
|
strName.Truncate(q);
|
|
|
|
if (strName == "index")
|
|
{
|
|
strFilename = strName;
|
|
return true;
|
|
}
|
|
|
|
if (strName == "results")
|
|
{
|
|
strFilename = strName;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void TIndexingServer::GenerateFileFromGet(wxString& strFilename)
|
|
{
|
|
wxString strName, strArgs;
|
|
wxSplitPath(strFilename, NULL, &strName, NULL);
|
|
strName.MakeLower();
|
|
const int q = strFilename.Find('?');
|
|
if (q > 0)
|
|
strArgs = strFilename.Mid(q+1);
|
|
|
|
if (strName == "index")
|
|
{
|
|
TXmlItem html;
|
|
TXmlItem& body = CreatePageBody(html).AddChild("center").AddChild("form");
|
|
body.SetAttr("action", "results.htm");
|
|
body.SetAttr("method", "POST");
|
|
|
|
body.AddChild("h1") << "Welcome to the indexing test server";
|
|
body.AddChild("br");
|
|
|
|
TXmlItem& table = body.AddChild("table");
|
|
TXmlItem& textfield = table.AddChild("tr").AddChild("td").AddChild("input");
|
|
TXmlItem& button = table.AddChild("tr").AddChild("td").AddChild("input");
|
|
button.SetAttr("value", "Search");
|
|
button.SetAttr("type", "submit");
|
|
textfield.SetAttr("type", "text");
|
|
textfield.SetAttr("name", "filetodisplay");
|
|
|
|
strFilename = GetTempFilename();
|
|
html.Save(strFilename);
|
|
}
|
|
}
|
|
|
|
void TIndexingServer::GenerateFileFromPost(wxString& strFilename, THashTable& htArgs)
|
|
{
|
|
wxString strName, strArgs;
|
|
wxSplitPath(strFilename, NULL, &strName, NULL);
|
|
strName.MakeLower();
|
|
const int q = strFilename.Find('?');
|
|
if (q > 0)
|
|
strArgs = strFilename.Mid(q+1);
|
|
|
|
if (strName == "results")
|
|
{
|
|
TFileToIndex file(htArgs.Get("filetodisplay"));
|
|
wxStringTokenizer& text = file.GetText();
|
|
|
|
TXmlItem html;
|
|
TXmlItem& body = CreatePageBody(html).AddChild("center");
|
|
|
|
body.AddChild("h1") << "Text contained in file";
|
|
body.AddChild("br");
|
|
|
|
TXmlItem& results = body.AddChild("div");
|
|
|
|
while (text.HasMoreTokens())
|
|
{
|
|
results << text.GetNextToken() << ", ";
|
|
}
|
|
|
|
strFilename = GetTempFilename();
|
|
html.Save(strFilename);
|
|
}
|
|
}
|
|
|
|
void TIndexingServer::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;
|
|
|
|
if (IsMagicName(strFilename))
|
|
GenerateFileFromGet(strFilename);
|
|
SendFile(strFilename, outs);
|
|
}
|
|
|
|
void TIndexingServer::ProcessHttpPost(wxString cmd, wxSocketBase& outs)
|
|
{
|
|
const int stop = cmd.Find(" HTTP");
|
|
wxString str = cmd.Mid(5, stop-5).Trim();
|
|
|
|
wxString args;
|
|
|
|
const int pos = cmd.Find("\r\n\r\n");
|
|
if (pos > 0)
|
|
args = cmd.Mid(pos+4);
|
|
|
|
THashTable hashArgs(17);
|
|
ParseArguments(args, hashArgs);
|
|
|
|
if (str == "/")
|
|
str += "results.htm";
|
|
wxString strFilename = GetDocumentRoot() + str;
|
|
|
|
if (IsMagicName(strFilename))
|
|
GenerateFileFromPost(strFilename, hashArgs);
|
|
SendFile(strFilename, outs);
|
|
}
|
|
|
|
void TIndexingServer::ProcessCommand(wxString cmd, wxSocketBase& outs)
|
|
{
|
|
if (cmd.StartsWith("GET "))
|
|
ProcessHttpGet(cmd, outs); else
|
|
if (cmd.StartsWith("POST "))
|
|
ProcessHttpPost(cmd, outs);
|
|
}
|
|
|
|
IMPLEMENT_APP(TIndexingServer)
|