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)
 |