wiretap 0.1
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/LICENSE +32 -0
- data/README +93 -0
- data/ext/Makefile +146 -0
- data/ext/audio_format.cpp +224 -0
- data/ext/bmp.cpp +65 -0
- data/ext/extconf.rb +85 -0
- data/ext/format.cpp +347 -0
- data/ext/image.h +27 -0
- data/ext/image_format.cpp +194 -0
- data/ext/node.cpp +401 -0
- data/ext/nodechildren.cpp +67 -0
- data/ext/nodeframes.cpp +233 -0
- data/ext/nodemetadata.cpp +90 -0
- data/ext/ppm.cpp +132 -0
- data/ext/server.cpp +202 -0
- data/ext/serverlist.cpp +183 -0
- data/ext/sgi.cpp +69 -0
- data/ext/testserver/Makefile +5 -0
- data/ext/testserver/cfg/wiretap_path_translation_db.xml +44 -0
- data/ext/testserver/cfg/wiretapd.cfg +74 -0
- data/ext/testserver/cfg/wiretapd.res +60 -0
- data/ext/testserver/db.sql +50 -0
- data/ext/testserver/server.cpp +206 -0
- data/ext/testserver/testserver.rb +146 -0
- data/ext/thread_worker.cpp +85 -0
- data/ext/wiretap.cpp +68 -0
- data/ext/wiretap.h +115 -0
- data/lib/wiretap.rb +280 -0
- data/test/audio.rb +27 -0
- data/test/convert.rb +35 -0
- data/test/image.rb +101 -0
- data/test/read_frames.rb +142 -0
- data/test/wiretap-images/01.ppm +0 -0
- data/test/wiretap-images/32bit.stoneimage +621 -0
- data/test/wiretap-images/36bit.stoneimage +1036 -0
- data/test/wiretap-images/48bit.stoneimage +800 -1
- data/test/wiretap-images/a.stoneimage +0 -0
- data/test/wiretap-images/a0.stoneimage +0 -0
- data/test/wiretap-images/a1.stoneimage +0 -0
- data/test/wiretap-images/a2.stoneimage +0 -0
- data/test/wiretap-images/a3.stoneimage +0 -0
- data/test/wiretap-images/a4.stoneimage +0 -0
- data/test/wiretap-images/b1.stonesound +0 -0
- data/test/wiretap-images/importable-seq/00000001.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000002.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000003.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000004.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000005.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000006.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000007.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000008.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000009.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000010.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000011.ppm +0 -0
- data/test/wiretap-images/importable-seq/00000012.ppm +0 -0
- data/test/wiretap-images/monsters_001.tif +0 -0
- data/test/wiretap-images/monsters_002.tif +0 -0
- data/test/wiretap-images/monsters_003.tif +0 -0
- data/test/wiretap-images/output.mov +0 -0
- data/test/wiretap-images/output.wav +0 -0
- data/test/write_frames.rb +82 -0
- metadata +138 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
#include "wiretap.h"
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
/*
|
6
|
+
* Get count of node metadata entries
|
7
|
+
*/
|
8
|
+
static VALUE wiretap_node_metadata_count(VALUE self) {
|
9
|
+
WireTapNodeHandle* node;
|
10
|
+
int num;
|
11
|
+
Data_Get_Struct(self, WireTapNodeHandle, node);
|
12
|
+
NODERUN_E(node, node->getNumAvailableMetaDataStreams(num));
|
13
|
+
return INT2FIX(num);
|
14
|
+
}
|
15
|
+
|
16
|
+
/*
|
17
|
+
* Get metadata by index
|
18
|
+
*/
|
19
|
+
static VALUE wiretap_node_metadata_get_at(int argc, VALUE *argv, VALUE self) {
|
20
|
+
WireTapNodeHandle* node;
|
21
|
+
VALUE stream_name, filter, depth;
|
22
|
+
|
23
|
+
rb_scan_args(argc, argv, "12", &stream_name, &filter, &depth);
|
24
|
+
Check_Type(stream_name, T_STRING);
|
25
|
+
if(filter != Qnil) {
|
26
|
+
Check_Type(filter, T_STRING);
|
27
|
+
}
|
28
|
+
if(depth != Qnil) {
|
29
|
+
Check_Type(depth, T_FIXNUM);
|
30
|
+
}
|
31
|
+
|
32
|
+
Data_Get_Struct(self, WireTapNodeHandle, node);
|
33
|
+
|
34
|
+
WireTapStr data;
|
35
|
+
NODERUN_E(node, node->getMetaData(CSTR(stream_name), filter == Qnil ? "all" : CSAFESTR(filter), depth == Qnil ? 0 : FIX2INT(depth), data));
|
36
|
+
|
37
|
+
return wiretap_to_str(data);
|
38
|
+
}
|
39
|
+
|
40
|
+
/*
|
41
|
+
* Set metadata at index
|
42
|
+
*/
|
43
|
+
static VALUE wiretap_node_metadata_set_at(VALUE self, VALUE index, VALUE value) {
|
44
|
+
WireTapNodeHandle* node;
|
45
|
+
Data_Get_Struct(self, WireTapNodeHandle, node);
|
46
|
+
Check_Type(index, T_STRING);
|
47
|
+
Check_Type(value, T_STRING);
|
48
|
+
|
49
|
+
NODERUN_E(node, node->setMetaData(CSTR(index), WireTapStr(CSTR(value))));
|
50
|
+
return self;
|
51
|
+
}
|
52
|
+
|
53
|
+
/*
|
54
|
+
* eval block on each metadata entry
|
55
|
+
*/
|
56
|
+
static VALUE wiretap_node_metadata_each(VALUE self) {
|
57
|
+
WireTapNodeHandle* node;
|
58
|
+
int i, num;
|
59
|
+
Data_Get_Struct(self, WireTapNodeHandle, node);
|
60
|
+
NODERUN_E(node, node->getNumAvailableMetaDataStreams(num));
|
61
|
+
|
62
|
+
for(i = 0; i < num; i++) {
|
63
|
+
WireTapStr stream;
|
64
|
+
NODERUN_E(node, node->getAvailableMetaDataStream(i, stream));
|
65
|
+
|
66
|
+
WireTapStr data;
|
67
|
+
NODERUN_E(node, node->getMetaData(stream.c_str(), "all", -1, data));
|
68
|
+
rb_yield(rb_ary_new3(2, wiretap_to_str(stream), wiretap_to_str(data)));
|
69
|
+
}
|
70
|
+
return self;
|
71
|
+
}
|
72
|
+
|
73
|
+
/*
|
74
|
+
* Access to metadata directly.
|
75
|
+
*/
|
76
|
+
static VALUE wiretap_node_metadata_body(VALUE self) {
|
77
|
+
WireTapNodeHandle* node;
|
78
|
+
Data_Get_Struct(self, WireTapNodeHandle, node);
|
79
|
+
return Qnil;
|
80
|
+
}
|
81
|
+
|
82
|
+
void Init_metadata() {
|
83
|
+
|
84
|
+
cNodeMetaData = rb_define_class_under(mWiretap, "NodeMetaData", rb_cObject);
|
85
|
+
rb_define_method(cNodeMetaData, "count", VALUEFUNC(wiretap_node_metadata_count), 0);
|
86
|
+
rb_define_method(cNodeMetaData, "[]", VALUEFUNC(wiretap_node_metadata_get_at), -1);
|
87
|
+
rb_define_method(cNodeMetaData, "[]=", VALUEFUNC(wiretap_node_metadata_set_at), 2);
|
88
|
+
rb_define_method(cNodeMetaData, "each", VALUEFUNC(wiretap_node_metadata_each), 0);
|
89
|
+
}
|
90
|
+
|
data/ext/ppm.cpp
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
#include "wiretap.h"
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
static int extract_int(FILE* f) {
|
6
|
+
char buffer[256];
|
7
|
+
int pos = 0;
|
8
|
+
char c;
|
9
|
+
while(!feof(f)) {
|
10
|
+
c = fgetc(f);
|
11
|
+
if(!isalnum(c)) {
|
12
|
+
break;
|
13
|
+
}
|
14
|
+
buffer[pos++] = c;
|
15
|
+
}
|
16
|
+
buffer[pos] = '\0';
|
17
|
+
return atoi(buffer);
|
18
|
+
}
|
19
|
+
|
20
|
+
bool ppm_read_format(FILE* f, WireTapClipFormat* format) {
|
21
|
+
extract_int(f);
|
22
|
+
|
23
|
+
int width = extract_int(f);
|
24
|
+
if(format) {
|
25
|
+
format->setWidth(width);
|
26
|
+
}
|
27
|
+
|
28
|
+
int height = extract_int(f);
|
29
|
+
if(format) {
|
30
|
+
format->setHeight(height);
|
31
|
+
}
|
32
|
+
|
33
|
+
int maxval = extract_int(f);
|
34
|
+
if(maxval > 255) {
|
35
|
+
THROW("Decoding 16bit PPM files is not supported");
|
36
|
+
}
|
37
|
+
|
38
|
+
if(format) {
|
39
|
+
format->setBitsPerPixel(24);
|
40
|
+
format->setNumChannels(3);
|
41
|
+
format->setFrameBufferSize((format->bitsPerPixel()/8)*width*height);
|
42
|
+
format->setFrameRate(25);
|
43
|
+
WireTapClipFormat::ScanFormat scan_format = format->strToScanFormat("progressive");
|
44
|
+
format->setScanFormat(scan_format);
|
45
|
+
format->setFormatTag("rgb");
|
46
|
+
format->setMetaDataTag("IFFFS_XML");
|
47
|
+
format->setMetaData("<IFFFS_XML Version=\"1.0\"><ClipData></ClipData></IFFFS_XML>");
|
48
|
+
}
|
49
|
+
|
50
|
+
return true;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
bool ppm_read_image(FILE* f, unsigned char* frame, int width, int height, int bpp) {
|
55
|
+
size_t row_size = width*3;
|
56
|
+
|
57
|
+
for(int i = 0; i < height; i++) {
|
58
|
+
size_t read_bytes = fread(frame + (height - 1 - i)*row_size, 1, row_size, f);
|
59
|
+
if(read_bytes != row_size) {
|
60
|
+
rb_warn("Read %d bytes, expected %d. Step: %d", read_bytes, row_size, i);
|
61
|
+
return false;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
return true;
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
/*
|
70
|
+
* Extract Wiretap clip format from PPM file. The format will inherit the bit depths of the image and allocate
|
71
|
+
* the framebuffer size into which the imported image will fit
|
72
|
+
*
|
73
|
+
* @clipformat = Wiretap::PPM.format("test/wiretap-images/01.ppm")
|
74
|
+
*/
|
75
|
+
static VALUE wiretap_get_ppm_format(VALUE self, VALUE input) {
|
76
|
+
|
77
|
+
FILE* infile = fopen(CSTR(input), "r");
|
78
|
+
if(!infile) {
|
79
|
+
THROW("Couldn't open file %s for reading", CSTR(input));
|
80
|
+
}
|
81
|
+
WireTapClipFormat format;
|
82
|
+
if(!ppm_read_format(infile, &format)) {
|
83
|
+
fclose(infile);
|
84
|
+
return Qfalse;
|
85
|
+
}
|
86
|
+
fclose(infile);
|
87
|
+
VALUE clip_format = rb_funcall(cClipFormat, rb_intern("new"), 0);
|
88
|
+
DATA_PTR(clip_format) = new WireTapClipFormat(format);
|
89
|
+
return clip_format;
|
90
|
+
}
|
91
|
+
|
92
|
+
/*
|
93
|
+
* Convert a PPM file to an SGI file
|
94
|
+
*
|
95
|
+
* Wiretap::PPM.to_sgi("test/wiretap-images/01.ppm", "/tmp/a.sgi")
|
96
|
+
*/
|
97
|
+
static VALUE wiretap_convert_ppm_to_sgi(VALUE self, VALUE input, VALUE output) {
|
98
|
+
Check_Type(input, T_STRING);
|
99
|
+
Check_Type(output, T_STRING);
|
100
|
+
FILE* infile = fopen(CSTR(input), "r");
|
101
|
+
if(!infile) {
|
102
|
+
THROW("Couldn't open file %s for read", CSTR(input));
|
103
|
+
}
|
104
|
+
WireTapClipFormat format;
|
105
|
+
if(!ppm_read_format(infile, &format)) {
|
106
|
+
fclose(infile);
|
107
|
+
rb_warn("Couldn't read PPM format from file %s", CSTR(input));
|
108
|
+
return Qfalse;
|
109
|
+
}
|
110
|
+
|
111
|
+
unsigned char frame[format.frameBufferSize()];
|
112
|
+
if(!ppm_read_image(infile, frame, format.width(), format.height(), format.bitsPerPixel())) {
|
113
|
+
fclose(infile);
|
114
|
+
rb_warn("Couldn't read PPM image data from file %s", CSTR(input));
|
115
|
+
return Qfalse;
|
116
|
+
}
|
117
|
+
fclose(infile);
|
118
|
+
|
119
|
+
if(!wiretap_write_image_frame(format.width(), format.height(), format.bitsPerPixel(), frame, CSTR(output))) {
|
120
|
+
rb_warn("Couldn't dump image to file %s", CSTR(output));
|
121
|
+
return Qfalse;
|
122
|
+
}
|
123
|
+
return Qtrue;
|
124
|
+
}
|
125
|
+
|
126
|
+
|
127
|
+
void Init_ppm() {
|
128
|
+
mPPM = rb_define_module_under(mWiretap, "PPM");
|
129
|
+
|
130
|
+
rb_define_singleton_method(mPPM, "to_sgi", VALUEFUNC(wiretap_convert_ppm_to_sgi), 2);
|
131
|
+
rb_define_singleton_method(mPPM, "format", VALUEFUNC(wiretap_get_ppm_format), 1);
|
132
|
+
}
|
data/ext/server.cpp
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
#include "wiretap.h"
|
2
|
+
|
3
|
+
#define Safe_Get_Server(obj, server) do { \
|
4
|
+
Data_Get_Struct(obj, WireTapServerHandle, server); \
|
5
|
+
if(!server) { \
|
6
|
+
rb_warn("Connection to server is already closed on %s: %d", __FILE__, __LINE__); \
|
7
|
+
return Qnil; \
|
8
|
+
} \
|
9
|
+
} while(0)
|
10
|
+
|
11
|
+
static void wiretap_server_free(WireTapServerHandle* server) {
|
12
|
+
if(server) {
|
13
|
+
if(server->ping()) {
|
14
|
+
server->stop();
|
15
|
+
}
|
16
|
+
delete server;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
/*
|
21
|
+
* If destruction of server interface is required, call close on it to be sure,
|
22
|
+
* that server has been closed right now.
|
23
|
+
*
|
24
|
+
*/
|
25
|
+
static VALUE wiretap_server_close(VALUE self) {
|
26
|
+
rb_funcall(self, rb_intern("stop!"), 0);
|
27
|
+
|
28
|
+
WireTapServerHandle* server;
|
29
|
+
Safe_Get_Server(self, server);
|
30
|
+
delete server;
|
31
|
+
DATA_PTR(self) = 0;
|
32
|
+
return Qtrue;
|
33
|
+
}
|
34
|
+
|
35
|
+
static VALUE wiretap_server_allocate(VALUE klass) {
|
36
|
+
return Data_Wrap_Struct(klass, 0, wiretap_server_free, 0);
|
37
|
+
}
|
38
|
+
|
39
|
+
/*
|
40
|
+
* Use Server.new(hostname) to connect to specified server.
|
41
|
+
* This method opens server by it's hostname. Not by id.
|
42
|
+
*/
|
43
|
+
static VALUE wiretap_server_connect(VALUE self, VALUE hostname) {
|
44
|
+
Check_Type(hostname, T_STRING);
|
45
|
+
Check_Type(self, T_DATA);
|
46
|
+
|
47
|
+
DATA_PTR(self) = new WireTapServerHandle(CSTR(hostname));
|
48
|
+
return self;
|
49
|
+
}
|
50
|
+
|
51
|
+
/*
|
52
|
+
* Get hostname of server, to which connection is established.
|
53
|
+
*/
|
54
|
+
static VALUE wiretap_server_hostname(VALUE self) {
|
55
|
+
WireTapServerHandle* server;
|
56
|
+
Safe_Get_Server(self, server);
|
57
|
+
return rb_str_new2(server->getHostName());
|
58
|
+
}
|
59
|
+
|
60
|
+
|
61
|
+
/*
|
62
|
+
* Get root node of server
|
63
|
+
*/
|
64
|
+
static VALUE wiretap_server_root(VALUE self) {
|
65
|
+
WireTapServerHandle* server;
|
66
|
+
Safe_Get_Server(self, server);
|
67
|
+
|
68
|
+
WireTapNodeHandle root_node;
|
69
|
+
SERVERRUN_E(server, server->getRootNode(root_node));
|
70
|
+
|
71
|
+
return wiretap_node_create_with(root_node, self, Qnil);
|
72
|
+
}
|
73
|
+
|
74
|
+
/*
|
75
|
+
* Open node by id
|
76
|
+
*/
|
77
|
+
static VALUE wiretap_server_open_node(VALUE self, VALUE id) {
|
78
|
+
Check_Type(id, T_STRING);
|
79
|
+
|
80
|
+
WireTapServerHandle* server;
|
81
|
+
Safe_Get_Server(self, server);
|
82
|
+
|
83
|
+
WireTapNodeHandle node(*server, CSTR(id));
|
84
|
+
return wiretap_node_create_with(node, self, Qnil);
|
85
|
+
}
|
86
|
+
|
87
|
+
|
88
|
+
/*
|
89
|
+
* Get vendor of server
|
90
|
+
*/
|
91
|
+
static VALUE wiretap_server_vendor(VALUE self) {
|
92
|
+
WireTapStr str;
|
93
|
+
WireTapServerHandle* server;
|
94
|
+
Safe_Get_Server(self, server);
|
95
|
+
RUN_E(server->getVendor(str), server);
|
96
|
+
return wiretap_to_str(str);
|
97
|
+
}
|
98
|
+
|
99
|
+
/*
|
100
|
+
* Get product name, installed on server
|
101
|
+
*/
|
102
|
+
static VALUE wiretap_server_product(VALUE self) {
|
103
|
+
WireTapStr str;
|
104
|
+
WireTapServerHandle* server;
|
105
|
+
Safe_Get_Server(self, server);
|
106
|
+
RUN_E(server->getProduct(str), server);
|
107
|
+
return wiretap_to_str(str);
|
108
|
+
}
|
109
|
+
|
110
|
+
/*
|
111
|
+
* Get version of server
|
112
|
+
*/
|
113
|
+
static VALUE wiretap_server_version(VALUE self) {
|
114
|
+
int major, minor;
|
115
|
+
char buf[256];
|
116
|
+
WireTapServerHandle* server;
|
117
|
+
Safe_Get_Server(self, server);
|
118
|
+
RUN_E(server->getVersion(major, minor), server);
|
119
|
+
snprintf(buf, sizeof(buf), "%d.%d", major, minor);
|
120
|
+
return rb_str_new2(buf);
|
121
|
+
}
|
122
|
+
|
123
|
+
/*
|
124
|
+
* Get ID of server storage
|
125
|
+
*/
|
126
|
+
static VALUE wiretap_server_storage(VALUE self) {
|
127
|
+
WireTapStr str;
|
128
|
+
WireTapServerHandle* server;
|
129
|
+
Safe_Get_Server(self, server);
|
130
|
+
RUN_E(server->getStorageId(str), server);
|
131
|
+
return wiretap_to_str(str);
|
132
|
+
}
|
133
|
+
|
134
|
+
/*
|
135
|
+
* Get version of server protocol. major.minor
|
136
|
+
*/
|
137
|
+
static VALUE wiretap_server_protocol(VALUE self) {
|
138
|
+
int major, minor;
|
139
|
+
char buf[256];
|
140
|
+
WireTapServerHandle* server;
|
141
|
+
Safe_Get_Server(self, server);
|
142
|
+
RUN_E(server->getProtocolVersion(major, minor), server);
|
143
|
+
snprintf(buf, sizeof(buf), "%d.%d", major, minor);
|
144
|
+
return rb_str_new2(buf);
|
145
|
+
}
|
146
|
+
|
147
|
+
/*
|
148
|
+
* Check, whether connection to server is still alive
|
149
|
+
*/
|
150
|
+
static VALUE wiretap_server_is_alive(VALUE self) {
|
151
|
+
WireTapServerHandle* server;
|
152
|
+
Data_Get_Struct(self, WireTapServerHandle, server);
|
153
|
+
if(!server) {
|
154
|
+
return Qfalse;
|
155
|
+
}
|
156
|
+
return server->ping() ? Qtrue : Qfalse;
|
157
|
+
}
|
158
|
+
|
159
|
+
|
160
|
+
/*
|
161
|
+
* Theoretically, it is possible to stop continious operation on server
|
162
|
+
* from other thread. Practically, it is impossible unless ruby gets threads
|
163
|
+
*/
|
164
|
+
static VALUE wiretap_server_stop(VALUE self) {
|
165
|
+
WireTapServerHandle* server;
|
166
|
+
Safe_Get_Server(self, server);
|
167
|
+
if(server->ping()) {
|
168
|
+
server->stop();
|
169
|
+
}
|
170
|
+
return self;
|
171
|
+
}
|
172
|
+
|
173
|
+
/*
|
174
|
+
* Get message, explaining last error, occured on server
|
175
|
+
*/
|
176
|
+
static VALUE wiretap_server_last_error(VALUE self) {
|
177
|
+
WireTapServerHandle* server;
|
178
|
+
Safe_Get_Server(self, server);
|
179
|
+
return rb_str_new2(server->lastError());
|
180
|
+
}
|
181
|
+
|
182
|
+
#define READER(name) rb_define_method(cServer, #name, VALUEFUNC(wiretap_server_ ## name), 0);
|
183
|
+
|
184
|
+
void Init_server() {
|
185
|
+
cServer = rb_define_class_under(mWiretap, "Server", rb_cObject);
|
186
|
+
rb_define_alloc_func(cServer, wiretap_server_allocate);
|
187
|
+
rb_define_method(cServer, "initialize", VALUEFUNC(wiretap_server_connect), 1);
|
188
|
+
rb_define_method(cServer, "hostname", VALUEFUNC(wiretap_server_hostname), 0);;
|
189
|
+
rb_define_method(cServer, "root", VALUEFUNC(wiretap_server_root), 0);;
|
190
|
+
rb_define_method(cServer, "vendor", VALUEFUNC(wiretap_server_vendor), 0);;
|
191
|
+
rb_define_method(cServer, "product", VALUEFUNC(wiretap_server_product), 0);;
|
192
|
+
rb_define_method(cServer, "version", VALUEFUNC(wiretap_server_version), 0);;
|
193
|
+
rb_define_method(cServer, "storage", VALUEFUNC(wiretap_server_storage), 0);;
|
194
|
+
rb_define_method(cServer, "protocol", VALUEFUNC(wiretap_server_protocol), 0);;
|
195
|
+
rb_define_method(cServer, "last_error", VALUEFUNC(wiretap_server_last_error), 0);;
|
196
|
+
rb_define_method(cServer, "alive?", VALUEFUNC(wiretap_server_is_alive), 0);
|
197
|
+
rb_define_method(cServer, "stop!", VALUEFUNC(wiretap_server_stop), 0);
|
198
|
+
rb_define_method(cServer, "open", VALUEFUNC(wiretap_server_open_node), 1);
|
199
|
+
rb_define_method(cServer, "close!", VALUEFUNC(wiretap_server_close), 0);
|
200
|
+
}
|
201
|
+
|
202
|
+
#undef READER
|
data/ext/serverlist.cpp
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
#include "wiretap.h"
|
2
|
+
|
3
|
+
static void wiretap_server_info_free(WireTapServerList::ServerInfo* server_info) {
|
4
|
+
delete server_info;
|
5
|
+
}
|
6
|
+
|
7
|
+
|
8
|
+
static VALUE wiretap_server_info_create(WireTapServerList::ServerInfo & info) {
|
9
|
+
WireTapServerList::ServerInfo *server_info = new WireTapServerList::ServerInfo(info);
|
10
|
+
return Data_Wrap_Struct(cServerInfo, 0, wiretap_server_info_free, server_info);
|
11
|
+
}
|
12
|
+
|
13
|
+
/*
|
14
|
+
* Extract hostname from server information
|
15
|
+
*/
|
16
|
+
static VALUE wiretap_server_info_hostname(VALUE self) {
|
17
|
+
WireTapServerList::ServerInfo* server_info;
|
18
|
+
Data_Get_Struct(self, WireTapServerList::ServerInfo, server_info);
|
19
|
+
return rb_str_new2(server_info->getHostname());
|
20
|
+
}
|
21
|
+
|
22
|
+
/*
|
23
|
+
* Extract version of server from server information
|
24
|
+
*/
|
25
|
+
static VALUE wiretap_server_info_version(VALUE self) {
|
26
|
+
WireTapServerList::ServerInfo* server_info;
|
27
|
+
Data_Get_Struct(self, WireTapServerList::ServerInfo, server_info);
|
28
|
+
int major = server_info->getVersionMajor();
|
29
|
+
int minor = server_info->getVersionMinor();
|
30
|
+
char buf[256];
|
31
|
+
snprintf(buf, sizeof(buf), "%d.%d", major, minor);
|
32
|
+
return rb_str_new2(buf);
|
33
|
+
}
|
34
|
+
|
35
|
+
/*
|
36
|
+
* Extract product name from server information
|
37
|
+
*/
|
38
|
+
static VALUE wiretap_server_info_product(VALUE self) {
|
39
|
+
WireTapServerList::ServerInfo* server_info;
|
40
|
+
Data_Get_Struct(self, WireTapServerList::ServerInfo, server_info);
|
41
|
+
return rb_str_new2(server_info->getProduct());
|
42
|
+
}
|
43
|
+
|
44
|
+
/*
|
45
|
+
* Extract vendor name from server information
|
46
|
+
*/
|
47
|
+
static VALUE wiretap_server_info_vendor(VALUE self) {
|
48
|
+
WireTapServerList::ServerInfo* server_info;
|
49
|
+
Data_Get_Struct(self, WireTapServerList::ServerInfo, server_info);
|
50
|
+
return rb_str_new2(server_info->getVendor());
|
51
|
+
}
|
52
|
+
|
53
|
+
/*
|
54
|
+
* Extract product version from server information
|
55
|
+
*/
|
56
|
+
static VALUE wiretap_server_info_product_version(VALUE self) {
|
57
|
+
WireTapServerList::ServerInfo* server_info;
|
58
|
+
Data_Get_Struct(self, WireTapServerList::ServerInfo, server_info);
|
59
|
+
int major = server_info->getProductVersionMajor();
|
60
|
+
int minor = server_info->getProductVersionMinor();
|
61
|
+
char buf[256];
|
62
|
+
snprintf(buf, sizeof(buf), "%d.%d", major, minor);
|
63
|
+
return rb_str_new2(buf);
|
64
|
+
}
|
65
|
+
|
66
|
+
/*
|
67
|
+
* Extract storage ID from server information
|
68
|
+
*/
|
69
|
+
static VALUE wiretap_server_info_storage(VALUE self) {
|
70
|
+
WireTapServerList::ServerInfo* server_info;
|
71
|
+
Data_Get_Struct(self, WireTapServerList::ServerInfo, server_info);
|
72
|
+
const char* storage_id = server_info->getStorageId();
|
73
|
+
if(!storage_id) {
|
74
|
+
rb_raise(eError, "Problem in wiretap. File: %s: %d", __FILE__, __LINE__);
|
75
|
+
}
|
76
|
+
return rb_str_new2(storage_id);
|
77
|
+
}
|
78
|
+
|
79
|
+
/*
|
80
|
+
* Connect to server, described in this information.
|
81
|
+
*/
|
82
|
+
static VALUE wiretap_server_info_server(VALUE self) {
|
83
|
+
VALUE hostname = rb_funcall(self, rb_intern("hostname"), 0);
|
84
|
+
return rb_funcall(cServer, rb_intern("new"), 1, hostname);
|
85
|
+
}
|
86
|
+
|
87
|
+
static void wiretap_server_list_free(WireTapServerList* server_list) {
|
88
|
+
delete server_list;
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
static VALUE wiretap_server_list_s_allocate(VALUE klass) {
|
93
|
+
WireTapServerList *server_list = new WireTapServerList();
|
94
|
+
return Data_Wrap_Struct(klass, 0, wiretap_server_list_free, server_list);
|
95
|
+
}
|
96
|
+
|
97
|
+
/*
|
98
|
+
* Server list doesn't require any params for initialization
|
99
|
+
*/
|
100
|
+
static VALUE wiretap_server_list_initialize(VALUE self) {
|
101
|
+
return self;
|
102
|
+
}
|
103
|
+
|
104
|
+
/*
|
105
|
+
* resolve server by it's storage ID
|
106
|
+
*/
|
107
|
+
static VALUE wiretap_server_list_resolve(VALUE self, VALUE storage) {
|
108
|
+
WireTapServerList* server_list;
|
109
|
+
Data_Get_Struct(self, WireTapServerList, server_list);
|
110
|
+
|
111
|
+
WireTapServerId host;
|
112
|
+
RUN_E(server_list->resolveStorageId(CSTR(storage), host), server_list);
|
113
|
+
return Qnil;
|
114
|
+
//return wiretap_to_str(host);
|
115
|
+
}
|
116
|
+
|
117
|
+
/*
|
118
|
+
* Number of available servers
|
119
|
+
*/
|
120
|
+
static VALUE wiretap_server_list_count(VALUE self) {
|
121
|
+
WireTapServerList* server_list;
|
122
|
+
Data_Get_Struct(self, WireTapServerList, server_list);
|
123
|
+
|
124
|
+
int num = 0;
|
125
|
+
//RUN_E(server_list->getNumNodes(num), server_list);
|
126
|
+
if(!server_list->getNumNodes(num)) {
|
127
|
+
rb_warn("Problem in wiretap: %s. File: %s: %d", server_list->lastError(), __FILE__, __LINE__);
|
128
|
+
}
|
129
|
+
return INT2FIX(num);
|
130
|
+
}
|
131
|
+
|
132
|
+
/*
|
133
|
+
* Get server by it's index
|
134
|
+
*/
|
135
|
+
static VALUE wiretap_server_list_get_at(VALUE self, VALUE index) {
|
136
|
+
WireTapServerList* server_list;
|
137
|
+
Data_Get_Struct(self, WireTapServerList, server_list);
|
138
|
+
|
139
|
+
WireTapServerList::ServerInfo node;
|
140
|
+
RUN_E(server_list->getNode(FIX2INT(index), node), server_list);
|
141
|
+
return wiretap_server_info_create(node);;
|
142
|
+
}
|
143
|
+
|
144
|
+
/*
|
145
|
+
* Eval block on each server
|
146
|
+
*/
|
147
|
+
static VALUE wiretap_server_list_each(VALUE self) {
|
148
|
+
WireTapServerList* server_list;
|
149
|
+
Data_Get_Struct(self, WireTapServerList, server_list);
|
150
|
+
|
151
|
+
int num;
|
152
|
+
|
153
|
+
RUN_E(server_list->getNumNodes(num), server_list);
|
154
|
+
|
155
|
+
for(int i = 0; i < num; i++) {
|
156
|
+
WireTapServerList::ServerInfo node;
|
157
|
+
RUN_E(server_list->getNode(i, node), server_list);
|
158
|
+
rb_yield(wiretap_server_info_create(node));
|
159
|
+
}
|
160
|
+
return self;
|
161
|
+
}
|
162
|
+
|
163
|
+
|
164
|
+
void Init_serverlist() {
|
165
|
+
cServerList = rb_define_class_under(mWiretap, "ServerList", rb_cObject);
|
166
|
+
rb_define_alloc_func(cServerList, wiretap_server_list_s_allocate);
|
167
|
+
rb_define_method(cServerList, "initialize", VALUEFUNC(wiretap_server_list_initialize), 0);
|
168
|
+
rb_define_method(cServerList, "resolve", VALUEFUNC(wiretap_server_list_resolve), 1);
|
169
|
+
rb_define_method(cServerList, "length", VALUEFUNC(wiretap_server_list_count), 0);
|
170
|
+
rb_define_method(cServerList, "count", VALUEFUNC(wiretap_server_list_count), 0);
|
171
|
+
rb_define_method(cServerList, "[]", VALUEFUNC(wiretap_server_list_get_at), 1);
|
172
|
+
rb_define_method(cServerList, "each", VALUEFUNC(wiretap_server_list_each), 0);
|
173
|
+
|
174
|
+
cServerInfo = rb_define_class_under(mWiretap, "ServerInfo", rb_cObject);
|
175
|
+
rb_define_method(cServerInfo, "hostname", VALUEFUNC(wiretap_server_info_hostname), 0);
|
176
|
+
rb_define_method(cServerInfo, "version", VALUEFUNC(wiretap_server_info_version), 0);
|
177
|
+
rb_define_method(cServerInfo, "product", VALUEFUNC(wiretap_server_info_product), 0);
|
178
|
+
rb_define_method(cServerInfo, "vendor", VALUEFUNC(wiretap_server_info_vendor), 0);
|
179
|
+
rb_define_method(cServerInfo, "product_version", VALUEFUNC(wiretap_server_info_product_version), 0);
|
180
|
+
rb_define_method(cServerInfo, "storage", VALUEFUNC(wiretap_server_info_storage), 0);
|
181
|
+
rb_define_method(cServerInfo, "server", VALUEFUNC(wiretap_server_info_server), 0);
|
182
|
+
}
|
183
|
+
|
data/ext/sgi.cpp
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
#include "wiretap.h"
|
2
|
+
|
3
|
+
|
4
|
+
static void write_channel(int width, int height, int number, unsigned char* frame, FILE* f) {
|
5
|
+
std::auto_ptr<unsigned char> buffer(new unsigned char[width*height]);
|
6
|
+
for(int i = 0; i < width*height; i++) {
|
7
|
+
buffer.get()[i] = frame[3*i + number];
|
8
|
+
}
|
9
|
+
fwrite(buffer.get(), width*height, 1, f);
|
10
|
+
}
|
11
|
+
|
12
|
+
static void write_int32_be_value(int value, bitstream_writer writer, void *data) {
|
13
|
+
writer(data, value >> 24& 0xFF);
|
14
|
+
writer(data, value >> 16& 0xFF);
|
15
|
+
writer(data, value >> 8 & 0xFF);
|
16
|
+
writer(data, value >> 0 & 0xFF);
|
17
|
+
}
|
18
|
+
static void write_int16_be_value(short value, bitstream_writer writer, void *data) {
|
19
|
+
writer(data, value >> 8 & 0xFF);
|
20
|
+
writer(data, value >> 0 & 0xFF);
|
21
|
+
}
|
22
|
+
|
23
|
+
static int wiretap_write_sgi_header(int width, int height, bitstream_writer writer, void *data) {
|
24
|
+
//const int header_size = 512;
|
25
|
+
const int header_padding = 404;
|
26
|
+
const int magic = 474;
|
27
|
+
|
28
|
+
write_int16_be_value(magic, writer, data); // Magic 474
|
29
|
+
writer(data, 0); // 0 for uncompressed
|
30
|
+
writer(data, 1); // 1 for 1 byte per channel. 24 bit picture
|
31
|
+
write_int16_be_value(3, writer, data); // 3 dimensions - one plain image with multiple channels
|
32
|
+
write_int16_be_value(width, writer, data);
|
33
|
+
write_int16_be_value(height, writer, data);
|
34
|
+
write_int16_be_value(3, writer, data); // 3 for RGB mode: 3 channels
|
35
|
+
write_int32_be_value(0, writer, data); // minimum pixel value
|
36
|
+
write_int32_be_value(0xFF, writer, data); // maximum pixel value
|
37
|
+
write_int32_be_value(0, writer, data); // dummy
|
38
|
+
|
39
|
+
char image_name[80] = "Ruby wiretap encoded";
|
40
|
+
for(size_t i = 0; i < sizeof(image_name); i++) {
|
41
|
+
writer(data, image_name[i]);
|
42
|
+
}
|
43
|
+
|
44
|
+
write_int32_be_value(0, writer, data); // colormap is in normal mode (0)
|
45
|
+
for(int i = 0; i < header_padding; i++) {
|
46
|
+
writer(data, 0);
|
47
|
+
}
|
48
|
+
return 0;
|
49
|
+
}
|
50
|
+
|
51
|
+
|
52
|
+
bool wiretap_write_frame_sgi(int width, int height, int bpp, unsigned char* frame, FILE* f) {
|
53
|
+
filestream stream;
|
54
|
+
memstream mem;
|
55
|
+
std::auto_ptr<unsigned char> buffer(new unsigned char[width*height*3]);
|
56
|
+
memset(&stream, 0, sizeof(stream));
|
57
|
+
memset(&mem, 0, sizeof(mem));
|
58
|
+
mem.ptr = buffer.get();
|
59
|
+
stream.f = f;
|
60
|
+
|
61
|
+
wiretap_write_sgi_header(width, height, write_to_file, (void *)&stream);
|
62
|
+
wiretap_write_image_data(width, height, bpp, frame, write_to_memory, (void *)&mem);
|
63
|
+
|
64
|
+
write_channel(width, height, 0, buffer.get(), f);
|
65
|
+
write_channel(width, height, 1, buffer.get(), f);
|
66
|
+
write_channel(width, height, 2, buffer.get(), f);
|
67
|
+
return 0;
|
68
|
+
}
|
69
|
+
|
@@ -0,0 +1,5 @@
|
|
1
|
+
|
2
|
+
all: server.bundle
|
3
|
+
|
4
|
+
server.bundle: server.cpp ../format.cpp
|
5
|
+
g++ ../format.cpp server.cpp -I../../../wiretap_api/api -L../../../wiretap_api/lib/dbg/MACOSX/fat/Darwin_8_3_0/GCC_4_0_1/ -lwiretapServerAPI -o server.bundle -I /opt/local/lib/ruby/1.8/i686-darwin8.8.3/ -lruby -g -dynamic -bundle -undefined suppress -flat_namespace
|