- added adjustable KML update interval - prepared for .kmz git-svn-id: http://moon:8086/svn/software/trunk/projects/FsTrack@125 b431acfa-c32f-4a4a-93f1-934dc6c82436
120 lines
2.1 KiB
C++
120 lines
2.1 KiB
C++
#include "HttpServer.hpp"
|
|
|
|
|
|
HttpServer::HttpServer(int port, const char *pDocDir)
|
|
: Thread("Http")
|
|
, m_port(port)
|
|
, m_docDir(pDocDir)
|
|
{
|
|
startThread();
|
|
}
|
|
|
|
|
|
HttpServer::~HttpServer(void)
|
|
{
|
|
stopThread(10000);
|
|
}
|
|
|
|
void HttpServer::addListener(IHttpListener *pListener)
|
|
{
|
|
m_listeners.add(pListener);
|
|
}
|
|
|
|
const char* HttpServer::getDocName(char *buffer, int buflen)
|
|
{
|
|
static char docBuffer[1024];
|
|
char *pDocname;
|
|
|
|
strcpy(docBuffer, m_docDir);
|
|
pDocname = &docBuffer[strlen(docBuffer)];
|
|
*pDocname = '\\';
|
|
pDocname++;
|
|
|
|
int i, off;
|
|
|
|
if (!stricmp(buffer, "GET"))
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
off = 0;
|
|
while(buffer[3+off] == 0x20)
|
|
off++;
|
|
|
|
while(buffer[3+off] == '/')
|
|
off++;
|
|
|
|
i = 0;
|
|
while(buffer[3+off+i] != 0x20)
|
|
{
|
|
pDocname[i] = buffer[3+off+i];
|
|
i++;
|
|
}
|
|
pDocname[i] = 0;
|
|
|
|
if (i==0)
|
|
return nullptr;
|
|
|
|
return docBuffer;
|
|
}
|
|
|
|
void HttpServer::run()
|
|
{
|
|
char buffer[1024];
|
|
char docname[1024];
|
|
|
|
ScopedPointer<StreamingSocket> listenSock = new StreamingSocket();
|
|
listenSock->createListener(m_port);
|
|
|
|
while(!threadShouldExit())
|
|
{
|
|
const char *pDoc = nullptr;
|
|
if (listenSock->waitUntilReady(true, 100) > 0)
|
|
{
|
|
|
|
ScopedPointer<StreamingSocket> pSock = listenSock->waitForNextConnection();
|
|
|
|
int numRead = pSock->read(buffer, sizeof(buffer), false);
|
|
if (numRead > 0)
|
|
{
|
|
pDoc = getDocName(buffer, numRead);
|
|
if (!pDoc)
|
|
{
|
|
pDoc = docname;
|
|
sprintf(docname, "%s\\FsTrack\\welcome.htm", m_docDir);
|
|
}
|
|
else
|
|
{
|
|
m_listeners.call(&IHttpListener::onUpdate, pDoc);
|
|
}
|
|
}
|
|
|
|
ScopedPointer<juce::File> file = new juce::File(pDoc);
|
|
if (!file)
|
|
continue;
|
|
|
|
ScopedPointer<juce::FileInputStream> pFileStream = file->createInputStream();
|
|
if (!pFileStream)
|
|
continue;
|
|
|
|
int64 remain = pFileStream->getTotalLength();
|
|
int64 toRead;
|
|
|
|
while(remain)
|
|
{
|
|
toRead = remain;
|
|
if (toRead > sizeof(buffer))
|
|
{
|
|
toRead = sizeof(buffer);
|
|
}
|
|
pFileStream->read(buffer, toRead);
|
|
pSock->write(buffer, toRead);
|
|
remain -= toRead;
|
|
}
|
|
pFileStream = nullptr;
|
|
pSock = nullptr;
|
|
file = nullptr;
|
|
}
|
|
}
|
|
}
|