libc-eventmachine 0.12.5.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +195 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +138 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +15 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
- data/docs/PURE_RUBY +77 -0
- data/docs/README +74 -0
- data/docs/RELEASE_NOTES +96 -0
- data/docs/SMTP +9 -0
- data/docs/SPAWNED_PROCESSES +93 -0
- data/docs/TODO +10 -0
- data/ext/binder.cpp +126 -0
- data/ext/binder.h +48 -0
- data/ext/cmain.cpp +582 -0
- data/ext/cplusplus.cpp +177 -0
- data/ext/ed.cpp +1522 -0
- data/ext/ed.h +380 -0
- data/ext/em.cpp +1947 -0
- data/ext/em.h +186 -0
- data/ext/emwin.cpp +300 -0
- data/ext/emwin.h +94 -0
- data/ext/epoll.cpp +26 -0
- data/ext/epoll.h +25 -0
- data/ext/eventmachine.h +98 -0
- data/ext/eventmachine_cpp.h +96 -0
- data/ext/extconf.rb +129 -0
- data/ext/fastfilereader/extconf.rb +77 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +82 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +351 -0
- data/ext/project.h +119 -0
- data/ext/rubymain.cpp +858 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +423 -0
- data/ext/ssl.h +90 -0
- data/java/src/com/rubyeventmachine/Application.java +196 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/deferrable.rb +208 -0
- data/lib/em/eventable.rb +39 -0
- data/lib/em/future.rb +62 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/processes.rb +68 -0
- data/lib/em/spawnable.rb +88 -0
- data/lib/em/streamer.rb +112 -0
- data/lib/eventmachine.rb +1920 -0
- data/lib/eventmachine_version.rb +31 -0
- data/lib/evma/callback.rb +32 -0
- data/lib/evma/container.rb +75 -0
- data/lib/evma/factory.rb +77 -0
- data/lib/evma/protocol.rb +87 -0
- data/lib/evma/reactor.rb +48 -0
- data/lib/evma.rb +32 -0
- data/lib/jeventmachine.rb +140 -0
- data/lib/pr_eventmachine.rb +1017 -0
- data/lib/protocols/buftok.rb +127 -0
- data/lib/protocols/header_and_content.rb +129 -0
- data/lib/protocols/httpcli2.rb +803 -0
- data/lib/protocols/httpclient.rb +270 -0
- data/lib/protocols/line_and_text.rb +126 -0
- data/lib/protocols/linetext2.rb +161 -0
- data/lib/protocols/memcache.rb +293 -0
- data/lib/protocols/postgres.rb +261 -0
- data/lib/protocols/saslauth.rb +179 -0
- data/lib/protocols/smtpclient.rb +308 -0
- data/lib/protocols/smtpserver.rb +556 -0
- data/lib/protocols/stomp.rb +153 -0
- data/lib/protocols/tcptest.rb +57 -0
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +78 -0
- data/tasks/tests.rake +193 -0
- data/tests/test_attach.rb +83 -0
- data/tests/test_basic.rb +231 -0
- data/tests/test_bind.rb +73 -0
- data/tests/test_connection_count.rb +35 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +163 -0
- data/tests/test_error_handler.rb +32 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_eventables.rb +77 -0
- data/tests/test_exc.rb +58 -0
- data/tests/test_futures.rb +214 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +215 -0
- data/tests/test_httpclient2.rb +155 -0
- data/tests/test_kb.rb +61 -0
- data/tests/test_ltp.rb +188 -0
- data/tests/test_ltp2.rb +320 -0
- data/tests/test_next_tick.rb +109 -0
- data/tests/test_processes.rb +56 -0
- data/tests/test_pure.rb +129 -0
- data/tests/test_running.rb +47 -0
- data/tests/test_sasl.rb +74 -0
- data/tests/test_send_file.rb +243 -0
- data/tests/test_servers.rb +80 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +93 -0
- data/tests/test_spawn.rb +329 -0
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_timers.rb +148 -0
- data/tests/test_ud.rb +43 -0
- data/tests/testem.rb +31 -0
- metadata +230 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id: rubymain.cpp 4529 2007-07-04 11:32:22Z francis $
|
|
4
|
+
|
|
5
|
+
File: rubymain.cpp
|
|
6
|
+
Date: 02Jul07
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: garbagecat10
|
|
10
|
+
|
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
|
15
|
+
|
|
16
|
+
See the file COPYING for complete licensing information.
|
|
17
|
+
|
|
18
|
+
*****************************************************************************/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
#include <iostream>
|
|
23
|
+
#include <stdexcept>
|
|
24
|
+
using namespace std;
|
|
25
|
+
|
|
26
|
+
#include <ruby.h>
|
|
27
|
+
#include "mapper.h"
|
|
28
|
+
|
|
29
|
+
static VALUE EmModule;
|
|
30
|
+
static VALUE FastFileReader;
|
|
31
|
+
static VALUE Mapper;
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
/*********
|
|
36
|
+
mapper_dt
|
|
37
|
+
*********/
|
|
38
|
+
|
|
39
|
+
static void mapper_dt (void *ptr)
|
|
40
|
+
{
|
|
41
|
+
if (ptr)
|
|
42
|
+
delete (Mapper_t*) ptr;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**********
|
|
46
|
+
mapper_new
|
|
47
|
+
**********/
|
|
48
|
+
|
|
49
|
+
static VALUE mapper_new (VALUE self, VALUE filename)
|
|
50
|
+
{
|
|
51
|
+
Mapper_t *m = new Mapper_t (StringValuePtr (filename));
|
|
52
|
+
if (!m)
|
|
53
|
+
rb_raise (rb_eException, "No Mapper Object");
|
|
54
|
+
VALUE v = Data_Wrap_Struct (Mapper, 0, mapper_dt, (void*)m);
|
|
55
|
+
return v;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
/****************
|
|
60
|
+
mapper_get_chunk
|
|
61
|
+
****************/
|
|
62
|
+
|
|
63
|
+
static VALUE mapper_get_chunk (VALUE self, VALUE start, VALUE length)
|
|
64
|
+
{
|
|
65
|
+
Mapper_t *m = NULL;
|
|
66
|
+
Data_Get_Struct (self, Mapper_t, m);
|
|
67
|
+
if (!m)
|
|
68
|
+
rb_raise (rb_eException, "No Mapper Object");
|
|
69
|
+
|
|
70
|
+
// TODO, what if some moron sends us a negative start value?
|
|
71
|
+
unsigned _start = NUM2INT (start);
|
|
72
|
+
unsigned _length = NUM2INT (length);
|
|
73
|
+
if ((_start + _length) > m->GetFileSize())
|
|
74
|
+
rb_raise (rb_eException, "Mapper Range Error");
|
|
75
|
+
|
|
76
|
+
const char *chunk = m->GetChunk (_start);
|
|
77
|
+
if (!chunk)
|
|
78
|
+
rb_raise (rb_eException, "No Mapper Chunk");
|
|
79
|
+
return rb_str_new (chunk, _length);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/************
|
|
83
|
+
mapper_close
|
|
84
|
+
************/
|
|
85
|
+
|
|
86
|
+
static VALUE mapper_close (VALUE self)
|
|
87
|
+
{
|
|
88
|
+
Mapper_t *m = NULL;
|
|
89
|
+
Data_Get_Struct (self, Mapper_t, m);
|
|
90
|
+
if (!m)
|
|
91
|
+
rb_raise (rb_eException, "No Mapper Object");
|
|
92
|
+
m->Close();
|
|
93
|
+
return Qnil;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/***********
|
|
97
|
+
mapper_size
|
|
98
|
+
***********/
|
|
99
|
+
|
|
100
|
+
static VALUE mapper_size (VALUE self)
|
|
101
|
+
{
|
|
102
|
+
Mapper_t *m = NULL;
|
|
103
|
+
Data_Get_Struct (self, Mapper_t, m);
|
|
104
|
+
if (!m)
|
|
105
|
+
rb_raise (rb_eException, "No Mapper Object");
|
|
106
|
+
return INT2NUM (m->GetFileSize());
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
/**********************
|
|
111
|
+
Init_fastfilereaderext
|
|
112
|
+
**********************/
|
|
113
|
+
|
|
114
|
+
extern "C" void Init_fastfilereaderext()
|
|
115
|
+
{
|
|
116
|
+
EmModule = rb_define_module ("EventMachine");
|
|
117
|
+
FastFileReader = rb_define_class_under (EmModule, "FastFileReader", rb_cObject);
|
|
118
|
+
Mapper = rb_define_class_under (FastFileReader, "Mapper", rb_cObject);
|
|
119
|
+
|
|
120
|
+
rb_define_module_function (Mapper, "new", (VALUE(*)(...))mapper_new, 1);
|
|
121
|
+
rb_define_method (Mapper, "size", (VALUE(*)(...))mapper_size, 0);
|
|
122
|
+
rb_define_method (Mapper, "close", (VALUE(*)(...))mapper_close, 0);
|
|
123
|
+
rb_define_method (Mapper, "get_chunk", (VALUE(*)(...))mapper_get_chunk, 2);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
data/ext/files.cpp
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: files.cpp
|
|
6
|
+
Date: 26Aug06
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: blackhedd
|
|
10
|
+
|
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
|
15
|
+
|
|
16
|
+
See the file COPYING for complete licensing information.
|
|
17
|
+
|
|
18
|
+
*****************************************************************************/
|
|
19
|
+
|
|
20
|
+
#include "project.h"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
/******************************************
|
|
24
|
+
FileStreamDescriptor::FileStreamDescriptor
|
|
25
|
+
******************************************/
|
|
26
|
+
|
|
27
|
+
FileStreamDescriptor::FileStreamDescriptor (int fd, EventMachine_t *em):
|
|
28
|
+
EventableDescriptor (fd, em),
|
|
29
|
+
OutboundDataSize (0)
|
|
30
|
+
{
|
|
31
|
+
cerr << "#####";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
/*******************************************
|
|
36
|
+
FileStreamDescriptor::~FileStreamDescriptor
|
|
37
|
+
*******************************************/
|
|
38
|
+
|
|
39
|
+
FileStreamDescriptor::~FileStreamDescriptor()
|
|
40
|
+
{
|
|
41
|
+
// Run down any stranded outbound data.
|
|
42
|
+
for (size_t i=0; i < OutboundPages.size(); i++)
|
|
43
|
+
OutboundPages[i].Free();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
/**************************
|
|
48
|
+
FileStreamDescriptor::Read
|
|
49
|
+
**************************/
|
|
50
|
+
|
|
51
|
+
void FileStreamDescriptor::Read()
|
|
52
|
+
{
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/***************************
|
|
56
|
+
FileStreamDescriptor::Write
|
|
57
|
+
***************************/
|
|
58
|
+
|
|
59
|
+
void FileStreamDescriptor::Write()
|
|
60
|
+
{
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
/*******************************
|
|
65
|
+
FileStreamDescriptor::Heartbeat
|
|
66
|
+
*******************************/
|
|
67
|
+
|
|
68
|
+
void FileStreamDescriptor::Heartbeat()
|
|
69
|
+
{
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
/***********************************
|
|
74
|
+
FileStreamDescriptor::SelectForRead
|
|
75
|
+
***********************************/
|
|
76
|
+
|
|
77
|
+
bool FileStreamDescriptor::SelectForRead()
|
|
78
|
+
{
|
|
79
|
+
cerr << "R?";
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
/************************************
|
|
85
|
+
FileStreamDescriptor::SelectForWrite
|
|
86
|
+
************************************/
|
|
87
|
+
|
|
88
|
+
bool FileStreamDescriptor::SelectForWrite()
|
|
89
|
+
{
|
|
90
|
+
cerr << "W?";
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
data/ext/files.h
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: files.h
|
|
6
|
+
Date: 26Aug06
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: blackhedd
|
|
10
|
+
|
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
|
15
|
+
|
|
16
|
+
See the file COPYING for complete licensing information.
|
|
17
|
+
|
|
18
|
+
*****************************************************************************/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#ifndef __FileStreamDescriptor__H_
|
|
22
|
+
#define __FileStreamDescriptor__H_
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
/**************************
|
|
27
|
+
class FileStreamDescriptor
|
|
28
|
+
**************************/
|
|
29
|
+
|
|
30
|
+
class FileStreamDescriptor: public EventableDescriptor
|
|
31
|
+
{
|
|
32
|
+
public:
|
|
33
|
+
FileStreamDescriptor (int, EventMachine_t*);
|
|
34
|
+
virtual ~FileStreamDescriptor();
|
|
35
|
+
|
|
36
|
+
virtual void Read();
|
|
37
|
+
virtual void Write();
|
|
38
|
+
virtual void Heartbeat();
|
|
39
|
+
|
|
40
|
+
virtual bool SelectForRead();
|
|
41
|
+
virtual bool SelectForWrite();
|
|
42
|
+
|
|
43
|
+
// Do we have any data to write? This is used by ShouldDelete.
|
|
44
|
+
virtual int GetOutboundDataSize() {return OutboundDataSize;}
|
|
45
|
+
|
|
46
|
+
protected:
|
|
47
|
+
struct OutboundPage {
|
|
48
|
+
OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {}
|
|
49
|
+
void Free() {if (Buffer) free ((char*)Buffer); }
|
|
50
|
+
const char *Buffer;
|
|
51
|
+
int Length;
|
|
52
|
+
int Offset;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
protected:
|
|
56
|
+
deque<OutboundPage> OutboundPages;
|
|
57
|
+
int OutboundDataSize;
|
|
58
|
+
|
|
59
|
+
private:
|
|
60
|
+
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
#endif // __FileStreamDescriptor__H_
|
|
65
|
+
|
data/ext/kb.cpp
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: kb.cpp
|
|
6
|
+
Date: 24Aug07
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: blackhedd
|
|
10
|
+
|
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
|
15
|
+
|
|
16
|
+
See the file COPYING for complete licensing information.
|
|
17
|
+
|
|
18
|
+
*****************************************************************************/
|
|
19
|
+
|
|
20
|
+
#include "project.h"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
/**************************************
|
|
24
|
+
KeyboardDescriptor::KeyboardDescriptor
|
|
25
|
+
**************************************/
|
|
26
|
+
|
|
27
|
+
KeyboardDescriptor::KeyboardDescriptor (EventMachine_t *parent_em):
|
|
28
|
+
EventableDescriptor (0, parent_em),
|
|
29
|
+
bReadAttemptedAfterClose (false),
|
|
30
|
+
LastIo (gCurrentLoopTime),
|
|
31
|
+
InactivityTimeout (0)
|
|
32
|
+
{
|
|
33
|
+
#ifdef HAVE_EPOLL
|
|
34
|
+
EpollEvent.events = EPOLLIN;
|
|
35
|
+
#endif
|
|
36
|
+
#ifdef HAVE_KQUEUE
|
|
37
|
+
MyEventMachine->ArmKqueueReader (this);
|
|
38
|
+
#endif
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/***************************************
|
|
43
|
+
KeyboardDescriptor::~KeyboardDescriptor
|
|
44
|
+
***************************************/
|
|
45
|
+
|
|
46
|
+
KeyboardDescriptor::~KeyboardDescriptor()
|
|
47
|
+
{
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
/*************************
|
|
52
|
+
KeyboardDescriptor::Write
|
|
53
|
+
*************************/
|
|
54
|
+
|
|
55
|
+
void KeyboardDescriptor::Write()
|
|
56
|
+
{
|
|
57
|
+
// Why are we here?
|
|
58
|
+
throw std::runtime_error ("bad code path in keyboard handler");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
/*****************************
|
|
63
|
+
KeyboardDescriptor::Heartbeat
|
|
64
|
+
*****************************/
|
|
65
|
+
|
|
66
|
+
void KeyboardDescriptor::Heartbeat()
|
|
67
|
+
{
|
|
68
|
+
// no-op
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
/************************
|
|
73
|
+
KeyboardDescriptor::Read
|
|
74
|
+
************************/
|
|
75
|
+
|
|
76
|
+
void KeyboardDescriptor::Read()
|
|
77
|
+
{
|
|
78
|
+
char c;
|
|
79
|
+
read (GetSocket(), &c, 1);
|
|
80
|
+
if (EventCallback)
|
|
81
|
+
(*EventCallback)(GetBinding().c_str(), EM_CONNECTION_READ, &c, 1);
|
|
82
|
+
}
|
data/ext/page.cpp
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: page.cpp
|
|
6
|
+
Date: 30Apr06
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: blackhedd
|
|
10
|
+
|
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
|
15
|
+
|
|
16
|
+
See the file COPYING for complete licensing information.
|
|
17
|
+
|
|
18
|
+
*****************************************************************************/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#include "project.h"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
/******************
|
|
25
|
+
PageList::PageList
|
|
26
|
+
******************/
|
|
27
|
+
|
|
28
|
+
PageList::PageList()
|
|
29
|
+
{
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/*******************
|
|
34
|
+
PageList::~PageList
|
|
35
|
+
*******************/
|
|
36
|
+
|
|
37
|
+
PageList::~PageList()
|
|
38
|
+
{
|
|
39
|
+
while (HasPages())
|
|
40
|
+
PopFront();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
/***************
|
|
45
|
+
PageList::Front
|
|
46
|
+
***************/
|
|
47
|
+
|
|
48
|
+
void PageList::Front (const char **page, int *length)
|
|
49
|
+
{
|
|
50
|
+
assert (page && length);
|
|
51
|
+
|
|
52
|
+
if (HasPages()) {
|
|
53
|
+
Page p = Pages.front();
|
|
54
|
+
*page = p.Buffer;
|
|
55
|
+
*length = p.Size;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
*page = NULL;
|
|
59
|
+
*length = 0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
/******************
|
|
65
|
+
PageList::PopFront
|
|
66
|
+
******************/
|
|
67
|
+
|
|
68
|
+
void PageList::PopFront()
|
|
69
|
+
{
|
|
70
|
+
if (HasPages()) {
|
|
71
|
+
Page p = Pages.front();
|
|
72
|
+
Pages.pop_front();
|
|
73
|
+
if (p.Buffer)
|
|
74
|
+
free ((void*)p.Buffer);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
/******************
|
|
80
|
+
PageList::HasPages
|
|
81
|
+
******************/
|
|
82
|
+
|
|
83
|
+
bool PageList::HasPages()
|
|
84
|
+
{
|
|
85
|
+
return (Pages.size() > 0) ? true : false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/**************
|
|
90
|
+
PageList::Push
|
|
91
|
+
**************/
|
|
92
|
+
|
|
93
|
+
void PageList::Push (const char *buf, int size)
|
|
94
|
+
{
|
|
95
|
+
if (buf && (size > 0)) {
|
|
96
|
+
char *copy = (char*) malloc (size);
|
|
97
|
+
if (!copy)
|
|
98
|
+
throw runtime_error ("no memory in pagelist");
|
|
99
|
+
memcpy (copy, buf, size);
|
|
100
|
+
Pages.push_back (Page (copy, size));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
data/ext/page.h
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: page.h
|
|
6
|
+
Date: 30Apr06
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: blackhedd
|
|
10
|
+
|
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
|
15
|
+
|
|
16
|
+
See the file COPYING for complete licensing information.
|
|
17
|
+
|
|
18
|
+
*****************************************************************************/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#ifndef __PageManager__H_
|
|
22
|
+
#define __PageManager__H_
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/**************
|
|
26
|
+
class PageList
|
|
27
|
+
**************/
|
|
28
|
+
|
|
29
|
+
class PageList
|
|
30
|
+
{
|
|
31
|
+
struct Page {
|
|
32
|
+
Page (const char *b, size_t s): Buffer(b), Size(s) {}
|
|
33
|
+
const char *Buffer;
|
|
34
|
+
size_t Size;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
public:
|
|
38
|
+
PageList();
|
|
39
|
+
virtual ~PageList();
|
|
40
|
+
|
|
41
|
+
void Push (const char*, int);
|
|
42
|
+
bool HasPages();
|
|
43
|
+
void Front (const char**, int*);
|
|
44
|
+
void PopFront();
|
|
45
|
+
|
|
46
|
+
private:
|
|
47
|
+
deque<Page> Pages;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
#endif // __PageManager__H_
|