summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Buffer.cc22
-rw-r--r--lib/Confirm.cc2
-rw-r--r--lib/CopyJob.cc16
-rw-r--r--lib/Form.cc2
-rw-r--r--lib/Handle.cc2
-rw-r--r--lib/HttpServ.cc15
-rw-r--r--lib/Image.cc78
-rw-r--r--lib/Input.cc6
-rw-r--r--lib/Makefile.am2
-rw-r--r--lib/Menu.cc2
-rw-r--r--lib/Message.cc2
-rw-r--r--lib/Output.cc4
-rw-r--r--lib/Table.cc2
-rw-r--r--lib/TaskMan.cc5
14 files changed, 136 insertions, 24 deletions
diff --git a/lib/Buffer.cc b/lib/Buffer.cc
index 2c2c955..e8335d9 100644
--- a/lib/Buffer.cc
+++ b/lib/Buffer.cc
@@ -3,7 +3,7 @@
#include "General.h"
#include "config.h"
-Buffer::Buffer() : Handle(-1), buffer(0), realsiz(0), bufsiz(0), ptr(0) { }
+Buffer::Buffer() : Handle(-1), buffer(0), zero(0), realsiz(0), bufsiz(0), ptr(0) { }
Buffer::~Buffer() {
free(buffer);
@@ -75,3 +75,23 @@ Buffer Buffer::operator=(const Buffer & b) {
bool Buffer::CanWatch() {
return false;
}
+
+ssize_t Buffer::GetSize() {
+ return realsiz;
+}
+
+char Buffer::operator[](size_t p) const {
+ if (p >= realsiz) {
+ return 0;
+ } else {
+ return buffer[ptr + p];
+ }
+}
+
+char & Buffer::operator[](size_t p) {
+ if (p >= realsiz) {
+ return zero;
+ } else {
+ return buffer[ptr + p];
+ }
+}
diff --git a/lib/Confirm.cc b/lib/Confirm.cc
index 7d72ee0..1176db1 100644
--- a/lib/Confirm.cc
+++ b/lib/Confirm.cc
@@ -7,7 +7,7 @@
Confirm::Confirm(const String & t, const String & m, const String & U, Action * y, Action * n) :
Action(U), tit(t), msg(m), NYes(y), NNo(n) { }
-Task * Confirm::Do(Variables * v, Handle * h) {
+Task * Confirm::Do(Variables * v, Variables *, Handle * h) {
Handle * b = new Buffer;
Task * t = new CopyJob(b, h, -1, true);
SendHead(b);
diff --git a/lib/CopyJob.cc b/lib/CopyJob.cc
index 864706b..1e151c3 100644
--- a/lib/CopyJob.cc
+++ b/lib/CopyJob.cc
@@ -2,13 +2,21 @@
#include "General.h"
#include "config.h"
-CopyJob::CopyJob(Handle * as, Handle * ad, ssize_t asiz, bool ads) : s(as), d(ad), ds(ads), siz(asiz), cursiz(0), r(0) {
+CopyJob::CopyJob(Handle * as, Handle * ad, ssize_t asiz, bool ads, bool add) : s(as), d(ad), ds(ads), dd(add), siz(asiz), cursiz(0), r(0) {
s->SetNonBlock();
d->SetNonBlock();
WaitFor(s, W4_READING);
}
-CopyJob::~CopyJob() { }
+CopyJob::~CopyJob() {
+ if (ds) {
+ delete s;
+ }
+
+ if (dd) {
+ delete d;
+ }
+}
int CopyJob::Do() throw (GeneralException) {
int tr;
@@ -44,10 +52,6 @@ int CopyJob::Do() throw (GeneralException) {
Suspend(TASK_ON_HOLD);
}
- if (ds) {
- delete s;
- }
-
return TASK_DONE;
}
diff --git a/lib/Form.cc b/lib/Form.cc
index e26cf72..464dec3 100644
--- a/lib/Form.cc
+++ b/lib/Form.cc
@@ -12,7 +12,7 @@ String Form::GetTitle(void) {
return tit;
}
-Task * Form::Do(Variables * v, Handle * h) {
+Task * Form::Do(Variables * v, Variables *, Handle * h) {
Handle * b = new Buffer();
Task * t = new CopyJob(b, h, -1, true);
SendHead(b);
diff --git a/lib/Handle.cc b/lib/Handle.cc
index 0221e71..4585b61 100644
--- a/lib/Handle.cc
+++ b/lib/Handle.cc
@@ -174,7 +174,7 @@ String Handle::GetName(void) {
return _("Bare Handle - should not happend");
}
-off_t Handle::GetSize(void) {
+ssize_t Handle::GetSize(void) {
return -1;
}
diff --git a/lib/HttpServ.cc b/lib/HttpServ.cc
index c20862a..d2c3c02 100644
--- a/lib/HttpServ.cc
+++ b/lib/HttpServ.cc
@@ -33,7 +33,7 @@ class ProcessRequest : public Task {
Socket s;
String name, host;
- Variables * Vars;
+ Variables * Vars, * Heads;
bool bad, hasvars, post;
};
@@ -63,9 +63,12 @@ int ProcessRequest::Do() {
// cerr << "---- Got a request from handle " << s.GetHandle() << " \n";
post = ParseUri(file, domain, &b);
+
+ Heads = new Variables();
len = -1;
do {
+ int p;
b >> t;
// cerr << "Read Request (n): " << t << endl;
if ((t.strstr("Content-Length: ") == 0) || (t.strstr("Content-length: ") == 0)) {
@@ -75,6 +78,13 @@ int ProcessRequest::Do() {
if (t.strstr("Host: ") == 0) {
host = t.extract(6);
}
+
+ if ((p = t.strchr(':')) >= 0) {
+ String s = t.extract(0, p - 1);
+ s += '=';
+ s += t.extract(p + 2);
+ Heads->Add(s);
+ }
} while (t.strlen());
// cerr << "---- Processing it.\n";
@@ -144,7 +154,7 @@ int ProcessRequest::Do() {
// Le domaine 'bin' est réservé aux actions. On cherche donc l'action à effectuer.
if ((f = p->Look4URL(file))) {
SendHeads(&b, "text/html");
- a = f->Do(Vars, &s);
+ a = f->Do(Vars, Heads, &s);
} else {
ShowError(&b);
}
@@ -169,6 +179,7 @@ int ProcessRequest::Do() {
if (a) a->Stop();
delete Vars;
+ delete Heads;
// cerr << "---- Sending header buffer.\n";
c = new CopyJob(&b, &s, -1, false);
WaitFor(c);
diff --git a/lib/Image.cc b/lib/Image.cc
new file mode 100644
index 0000000..9b41b4e
--- /dev/null
+++ b/lib/Image.cc
@@ -0,0 +1,78 @@
+#include "Image.h"
+#include "config.h"
+
+Image::Image(unsigned int ax, unsigned int ay) : x(ax), y(ay), img((Color *) malloc(x * y * sizeof(Color))) {
+ Fill();
+}
+
+Image::~Image() {
+ free((void *)img);
+}
+
+bool Image::CanWrite() {
+ return false;
+}
+
+String Image::GetName() {
+ return String(_("Image ")) + x + "x" + y;
+}
+
+void Image::Fill(Color c) {
+ for (unsigned int i = 0; i < x * y; i++) {
+ img[i] = c;
+ }
+}
+
+Color Image::GetPixel(unsigned int px, unsigned int py) {
+ if ((px >= x) || (py >= y)) {
+ return Color(0, 0, 0, 0);
+ }
+
+ return img[x * py + px];
+}
+
+void Image::SetPixel(unsigned int px, unsigned int py, Color c) {
+ if ((px >= x) || (py >= y)) {
+ return;
+ }
+
+ img[x * py + px] = c;
+}
+
+bool Image::Prepare(unsigned int f) {
+ if (GetSize()) return false;
+
+ switch (f) {
+ case FORMAT_TGA_BASIC:
+ TGAHeader Header;
+ TGAFooter Footer;
+
+ Header.IDLength = 0;
+ Header.ColorMapType = 0;
+ Header.ImageType = 2;
+ Header.CM_FirstEntry = 0;
+ Header.CM_Length = 0;
+ Header.CM_EntrySize = 0;
+ Header.IS_XOrigin = 0;
+ Header.IS_YOrigin = 0;
+ Header.IS_Width = x;
+ Header.IS_Height = y;
+ Header.IS_Depth = 32;
+ Header.IS_Descriptor = 0x20;
+
+ Footer.ExtOffset = 0;
+ Footer.DevOffset = 0;
+ strcpy(Footer.Sig, "TRUEVISION-XFILE.");
+
+ write(&Header, sizeof(Header));
+ write(img, x * y * sizeof(Color));
+ write(&Footer, sizeof(Footer));
+
+ return true;
+
+ break;
+ default:
+ return false;
+ }
+}
+
diff --git a/lib/Input.cc b/lib/Input.cc
index be6981f..318821d 100644
--- a/lib/Input.cc
+++ b/lib/Input.cc
@@ -10,10 +10,10 @@
#include "config.h"
Input::Input(String no) throw (GeneralException) :
- Handle(no.strlen() ? open(no.to_charp(), O_RDONLY) : 0),
+ Handle(no.strlen() ? open(no.to_charp(), O_RDONLY) : dup(0)),
n(no) {
if (GetHandle() < 0) {
- throw IOGeneral(String(_("Error opening file")) + no + _(" for reading: ") + strerror(errno));
+ throw IOGeneral(String(_("Error opening file ")) + no + _(" for reading: ") + strerror(errno));
}
size = lseek(GetHandle(), 0, SEEK_END);
@@ -38,7 +38,7 @@ String Input::GetName() {
return n;
}
-off_t Input::GetSize() {
+ssize_t Input::GetSize() {
return size;
}
diff --git a/lib/Makefile.am b/lib/Makefile.am
index a88f7be..a2f0930 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -8,6 +8,6 @@ lib_LTLIBRARIES = libBaltisot.la
libBaltisot_la_SOURCES = Exceptions.cc Handle.cc Output.cc String.cc\
Socket.cc Input.cc HttpServ.cc Variables.cc Action.cc Menu.cc Message.cc\
Form.cc Confirm.cc Table.cc checkargs.c datecalc.c IRC.cc Task.cc Buffer.cc\
- CopyJob.cc ReadJob.cc Regex.cc TaskMan.cc InPipe.cc OutPipe.cc
+ CopyJob.cc ReadJob.cc Regex.cc TaskMan.cc InPipe.cc OutPipe.cc Image.cc
libBaltisot_la_LDFLAGS = -release $(Baltisot_VERSION_INFO)
diff --git a/lib/Menu.cc b/lib/Menu.cc
index f804cef..f730e5b 100644
--- a/lib/Menu.cc
+++ b/lib/Menu.cc
@@ -7,7 +7,7 @@
Menu::Menu(const String & t, const String & U, String * ts, Action ** as, int nb) :
Action(U), tit(t), lt(ts), la(as), nba(nb) { }
-Task * Menu::Do(Variables * v, Handle * h) {
+Task * Menu::Do(Variables * v, Variables *, Handle * h) {
int i, f = 0;
Handle * b = new Buffer();
Task * t = new CopyJob(b, h, -1, true);
diff --git a/lib/Message.cc b/lib/Message.cc
index acd7933..572b0a0 100644
--- a/lib/Message.cc
+++ b/lib/Message.cc
@@ -7,7 +7,7 @@
Message::Message(const String & t, const String & m, const String & U, Action * n) :
Action(U), tit(t), msg(m), Next(n) { }
-Task * Message::Do(Variables * v, Handle * h) {
+Task * Message::Do(Variables * v, Variables *, Handle * h) {
Handle * b = new Buffer();
Task * t = new CopyJob(b, h, -1, true);
diff --git a/lib/Output.cc b/lib/Output.cc
index c85d372..27f28d2 100644
--- a/lib/Output.cc
+++ b/lib/Output.cc
@@ -10,10 +10,10 @@
#include "config.h"
Output::Output(String no, int trunc = 1) throw (GeneralException) :
- Handle(no.strlen() ? open(no.to_charp(), O_WRONLY | O_CREAT | (trunc ? O_TRUNC : O_APPEND)) : 1),
+ Handle(no.strlen() ? open(no.to_charp(), O_WRONLY | O_CREAT | (trunc ? O_TRUNC : O_APPEND), 00666) : dup(1)),
n(no) {
if (GetHandle() < 0) {
- throw IOGeneral(String(_("Error opening file")) + no + _(" for writing: ") + strerror(errno));
+ throw IOGeneral(String(_("Error opening file ")) + no + _(" for writing: ") + strerror(errno));
}
}
diff --git a/lib/Table.cc b/lib/Table.cc
index 30f3127..f2b7bad 100644
--- a/lib/Table.cc
+++ b/lib/Table.cc
@@ -11,7 +11,7 @@ String Table::GetTitle(void) {
return tit;
}
-Task * Table::Do(Variables * v, Handle * h) {
+Task * Table::Do(Variables * v, Variables *, Handle * h) {
Handle * b = new Buffer();
Task * t = new CopyJob(b, h, -1, true);
diff --git a/lib/TaskMan.cc b/lib/TaskMan.cc
index 9053d0b..94e89b1 100644
--- a/lib/TaskMan.cc
+++ b/lib/TaskMan.cc
@@ -212,7 +212,7 @@ void TaskMan::MainLoop() throw (GeneralException) {
}
}
- r = poll(ufsd, nfds, (no_burst) && !(Zombies.size()) ? -1: 1);
+ r = poll(ufsd, nfds, (no_burst) && !(Zombies.size()) ? -1: 0);
#else
FD_ZERO(readfds);
FD_ZERO(writefds);
@@ -232,7 +232,7 @@ void TaskMan::MainLoop() throw (GeneralException) {
r = select(highest + 1, &readfds, &writefds, &exceptfds, NULL);
#endif
- if (r == -1) {
+ if (r < 0) {
if (errno == EINTR) {
// child
} else {
@@ -256,7 +256,6 @@ void TaskMan::MainLoop() throw (GeneralException) {
if (q->revents & POLLHUP) {
cerr << _("Handle ") << q->fd << _(" hung up.\n");
- // What should I do now?
}
fd = q->fd;