wiretap 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/LICENSE +32 -0
  2. data/README +93 -0
  3. data/ext/Makefile +146 -0
  4. data/ext/audio_format.cpp +224 -0
  5. data/ext/bmp.cpp +65 -0
  6. data/ext/extconf.rb +85 -0
  7. data/ext/format.cpp +347 -0
  8. data/ext/image.h +27 -0
  9. data/ext/image_format.cpp +194 -0
  10. data/ext/node.cpp +401 -0
  11. data/ext/nodechildren.cpp +67 -0
  12. data/ext/nodeframes.cpp +233 -0
  13. data/ext/nodemetadata.cpp +90 -0
  14. data/ext/ppm.cpp +132 -0
  15. data/ext/server.cpp +202 -0
  16. data/ext/serverlist.cpp +183 -0
  17. data/ext/sgi.cpp +69 -0
  18. data/ext/testserver/Makefile +5 -0
  19. data/ext/testserver/cfg/wiretap_path_translation_db.xml +44 -0
  20. data/ext/testserver/cfg/wiretapd.cfg +74 -0
  21. data/ext/testserver/cfg/wiretapd.res +60 -0
  22. data/ext/testserver/db.sql +50 -0
  23. data/ext/testserver/server.cpp +206 -0
  24. data/ext/testserver/testserver.rb +146 -0
  25. data/ext/thread_worker.cpp +85 -0
  26. data/ext/wiretap.cpp +68 -0
  27. data/ext/wiretap.h +115 -0
  28. data/lib/wiretap.rb +280 -0
  29. data/test/audio.rb +27 -0
  30. data/test/convert.rb +35 -0
  31. data/test/image.rb +101 -0
  32. data/test/read_frames.rb +142 -0
  33. data/test/wiretap-images/01.ppm +0 -0
  34. data/test/wiretap-images/32bit.stoneimage +621 -0
  35. data/test/wiretap-images/36bit.stoneimage +1036 -0
  36. data/test/wiretap-images/48bit.stoneimage +800 -1
  37. data/test/wiretap-images/a.stoneimage +0 -0
  38. data/test/wiretap-images/a0.stoneimage +0 -0
  39. data/test/wiretap-images/a1.stoneimage +0 -0
  40. data/test/wiretap-images/a2.stoneimage +0 -0
  41. data/test/wiretap-images/a3.stoneimage +0 -0
  42. data/test/wiretap-images/a4.stoneimage +0 -0
  43. data/test/wiretap-images/b1.stonesound +0 -0
  44. data/test/wiretap-images/importable-seq/00000001.ppm +0 -0
  45. data/test/wiretap-images/importable-seq/00000002.ppm +0 -0
  46. data/test/wiretap-images/importable-seq/00000003.ppm +0 -0
  47. data/test/wiretap-images/importable-seq/00000004.ppm +0 -0
  48. data/test/wiretap-images/importable-seq/00000005.ppm +0 -0
  49. data/test/wiretap-images/importable-seq/00000006.ppm +0 -0
  50. data/test/wiretap-images/importable-seq/00000007.ppm +0 -0
  51. data/test/wiretap-images/importable-seq/00000008.ppm +0 -0
  52. data/test/wiretap-images/importable-seq/00000009.ppm +0 -0
  53. data/test/wiretap-images/importable-seq/00000010.ppm +0 -0
  54. data/test/wiretap-images/importable-seq/00000011.ppm +0 -0
  55. data/test/wiretap-images/importable-seq/00000012.ppm +0 -0
  56. data/test/wiretap-images/monsters_001.tif +0 -0
  57. data/test/wiretap-images/monsters_002.tif +0 -0
  58. data/test/wiretap-images/monsters_003.tif +0 -0
  59. data/test/wiretap-images/output.mov +0 -0
  60. data/test/wiretap-images/output.wav +0 -0
  61. data/test/write_frames.rb +82 -0
  62. metadata +138 -0
@@ -0,0 +1,44 @@
1
+ <!-- This database specifies how a path on a remote machine should be -->
2
+ <!-- accessed from another machine. The API function "translatePaths" -->
3
+ <!-- uses the rules specified in this file. Any instance of this file -->
4
+ <!-- be replaced with a symbolic link to another instance. -->
5
+
6
+ <translations>
7
+
8
+ <!-- Translations between two specified hosts: -->
9
+ <!-- ex. -->
10
+ <!-- <map src_host="server01" src_path="/CXFS/new_clips" -->
11
+ <!-- dst_host="client01" dst_path="/hosts/server/CXFS/clips" /> -->
12
+
13
+ <!-- Translations between a specified host and a group: -->
14
+ <!-- ex. -->
15
+ <!-- <map src_host="nt_server" src_path="D:\" -->
16
+ <!-- dst_host="LustreStations" dst_path="/hosts/server/CXFS/" /> -->
17
+
18
+ <!-- Translations between two groups: -->
19
+ <!-- ex. -->
20
+ <!-- <map src_host="BurnRenderFarm" src_path="/CXFS/" -->
21
+ <!-- dst_host="LustreStations" dst_path="/hosts/server/CXFS/" /> -->
22
+
23
+ <!-- Translation between two operating systems: -->
24
+ <!-- {'Irix', 'Linux', 'MacOSX', 'WindowsNT'}: -->
25
+ <!-- ex. -->
26
+ <!-- <map src_os="WindowsNT" src_path="C:\Documents and Settings\" -->
27
+ <!-- dst_os="Irix" dst_path="/users/" /> -->
28
+
29
+ <!-- Groups of hosts, can include the optional os attribute of group: -->
30
+ <!-- ex. -->
31
+ <!-- <group name="BurnRenderFarm" os="Linux"> -->
32
+ <!-- <host name="server01" /> -->
33
+ <!-- <host name="192.168.1.114" /> -->
34
+ <!-- <host name="192.168.1.118" /> -->
35
+ <!-- <host name="192.168.1.119" /> -->
36
+ <!-- </group> -->
37
+ <!-- -->
38
+ <!-- <group name="LustreStations"> -->
39
+ <!-- <host name="client01" /> -->
40
+ <!-- <host name="192.168.1.106" /> -->
41
+ <!-- <host name="192.168.1.110" /> -->
42
+ <!-- </group> -->
43
+
44
+ </translations>
@@ -0,0 +1,74 @@
1
+ #
2
+ # Default WireTap Server configuration file
3
+ #
4
+
5
+ [Server]
6
+
7
+ # IP addresses to publish in self discovery in addition to house network
8
+ # IP address which is automatically obtained via gethostname().
9
+ # Adresses are given in the order in which they should be tried.
10
+ #
11
+ #IP0=<ip address of network adapter: numerical or DNS entry>
12
+ #IP1=<...>
13
+ #<...>
14
+ IP0=127.0.0.1
15
+
16
+ # TCP port used for data/frame transfers. Default = 7550
17
+ #
18
+ #FramePort=<port number>
19
+
20
+ # TCP port used for node metadata access. Default = 7549
21
+ #
22
+ #NodePort=<port number>
23
+
24
+ # TCP multicast port used for advertising servers. Default = 7555
25
+ #
26
+ #MulticastPort=<port number>
27
+
28
+
29
+ [PathTranslation]
30
+
31
+ # Sets the full path to the path translation database file, The default is set
32
+ # to cfg/wiretap_path_translation_db.xml, adjacent to the exectuable.
33
+ #
34
+ #FilePath=<full path to XML translation file>
35
+
36
+
37
+ [Localization]
38
+
39
+ # Sets the path to the resource file containing all localized strings.
40
+ # You may specify a relative path, in which case we will search for it from
41
+ # within the same directory where we find the configuration file (i.e., this
42
+ # file).
43
+ # By default, there is no localization resource file.
44
+ #
45
+ #ResourceFilePath=<path to resource file>
46
+
47
+ # Sets the localization language of the WireTap server subsystem. This decides
48
+ # which strings should be loaded from the file above. The language must be one
49
+ # of ENG (default), CHS, JPN, DEU, FRA.
50
+ #
51
+ #Language=ENG
52
+
53
+
54
+ [Logger]
55
+
56
+ # Sets the logging level to one of 'user', 'error', 'warn', 'notice', 'debug'.
57
+ # Default is 'notice'.
58
+ #
59
+ Level=debug
60
+
61
+ # Sets the maximum size of a log file before it rotates.
62
+ #
63
+ #MaxLogFileSizeInMB=50
64
+
65
+ # Sets the maximum number of log files to keep. A log file is created each
66
+ # time the server is run.
67
+ #
68
+ #MaxNumLogFiles=50
69
+
70
+ # Sets absolute path to the directory where the log files will be stored.
71
+ # If not specified, a directory called "log" adjacent to the executable file
72
+ # will be used. The specified (or default) directory must already exist.
73
+ #
74
+ #LogDir=/tmp
@@ -0,0 +1,60 @@
1
+ #
2
+ # WireTap localization resource file. All WireTap server strings for all
3
+ # supported languages are located in this file. Each section is identified by
4
+ # the language code. The localization team will take this file and localize
5
+ # all string for each language.
6
+ #
7
+ [ENG]
8
+
9
+ WireTapServerAPI:Unimplemented=Not implemented
10
+ WireTapBaseServer:ServiceUnavailable=Service unavailable
11
+ WireTapFrameServer:Unimplemented=Not implemented
12
+ WireTapFrameServer:InvalidStreamId=Invalid stream identifier
13
+ WireTapNodeServer:InvalidScanFormat=Invalid scan format
14
+ WireTapNodeServer:InvalidNodeType=Invalid node type
15
+ WireTapNodeServer:ServiceUnavailable=Service unavailable
16
+ WireTapNodeServer:IllegalFramePath=Illegal character in frame path
17
+
18
+ [JPN]
19
+
20
+ WireTapServerAPI:Unimplemented=��������Ă��܂���
21
+ WireTapBaseServer:ServiceUnavailable=�T�[�r�X���g�p�ł��܂���
22
+ WireTapFrameServer:Unimplemented=��������Ă��܂���
23
+ WireTapFrameServer:InvalidStreamId=�����ȃX�g���[�����ʎq
24
+ WireTapNodeServer:InvalidScanFormat=�����ȃX�L���� �t�H�[�}�b�g
25
+ WireTapNodeServer:InvalidNodeType=�����ȃm�[�h �^�C�v
26
+ WireTapNodeServer:ServiceUnavailable=�T�[�r�X���g�p�ł��܂���
27
+ WireTapNodeServer:IllegalFramePath=�t���[�� �p�X�̕s������
28
+
29
+ [FRA]
30
+
31
+ WireTapServerAPI:Unimplemented=Not implemented
32
+ WireTapBaseServer:ServiceUnavailable=Service unavailable
33
+ WireTapFrameServer:Unimplemented=Not implemented
34
+ WireTapFrameServer:InvalidStreamId=Invalid stream identifier
35
+ WireTapNodeServer:InvalidScanFormat=Invalid scan format
36
+ WireTapNodeServer:InvalidNodeType=Invalid node type
37
+ WireTapNodeServer:ServiceUnavailable=Service unavailable
38
+ WireTapNodeServer:IllegalFramePath=Illegal character in frame path
39
+
40
+ [DEU]
41
+
42
+ WireTapServerAPI:Unimplemented=Nicht implementiert
43
+ WireTapBaseServer:ServiceUnavailable=Dienst nicht verf�gbar
44
+ WireTapFrameServer:Unimplemented=Nicht implementiert
45
+ WireTapFrameServer:InvalidStreamId=Ung�ltige Stream-ID
46
+ WireTapNodeServer:InvalidScanFormat=Ung�ltiges Scan-Format
47
+ WireTapNodeServer:InvalidNodeType=Ung�ltiger Knotentyp
48
+ WireTapNodeServer:ServiceUnavailable=Dienst nicht verf�gbar
49
+ WireTapNodeServer:IllegalFramePath=Unzul�ssiges Zeichen in Frame-Pfad
50
+
51
+ [CHS]
52
+
53
+ WireTapServerAPI:Unimplemented=δִ��
54
+ WireTapBaseServer:ServiceUnavailable=û�з���
55
+ WireTapFrameServer:Unimplemented=δִ��
56
+ WireTapFrameServer:InvalidStreamId=��Ч����������ʶ��
57
+ WireTapNodeServer:InvalidScanFormat=��Ч��ɨ���ʽ
58
+ WireTapNodeServer:InvalidNodeType=��Ч�Ľڵ�����
59
+ WireTapNodeServer:ServiceUnavailable=û�з���
60
+ WireTapNodeServer:IllegalFramePath=֡·�����зǷ��ַ�
@@ -0,0 +1,50 @@
1
+ -- MySQL dump 10.10
2
+ --
3
+ -- Host: localhost Database: wiretap_development
4
+ -- ------------------------------------------------------
5
+ -- Server version 5.0.27
6
+
7
+ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8
+ /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9
+ /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10
+ /*!40101 SET NAMES utf8 */;
11
+ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12
+ /*!40103 SET TIME_ZONE='+00:00' */;
13
+ /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14
+ /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15
+ /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16
+ /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17
+
18
+ --
19
+ -- Table structure for table `nodes`
20
+ --
21
+
22
+ DROP TABLE IF EXISTS `nodes`;
23
+ CREATE TABLE `nodes` (
24
+ `id` bigint(20) NOT NULL auto_increment,
25
+ `parent_id` bigint(20) default NULL,
26
+ `name` varchar(255) default NULL,
27
+ `kind` varchar(255) default NULL,
28
+ PRIMARY KEY (`id`)
29
+ ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
30
+
31
+ --
32
+ -- Dumping data for table `nodes`
33
+ --
34
+
35
+ LOCK TABLES `nodes` WRITE;
36
+ /*!40000 ALTER TABLE `nodes` DISABLE KEYS */;
37
+ INSERT INTO `nodes` VALUES (1,NULL,'/',''),(2,1,'stonefs','volume'),(3,2,'Julik','project'),(4,3,'Default','library'),(5,4,'toyota_10bit','clip');
38
+ /*!40000 ALTER TABLE `nodes` ENABLE KEYS */;
39
+ UNLOCK TABLES;
40
+ /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
41
+
42
+ /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
43
+ /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
44
+ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
45
+ /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
46
+ /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
47
+ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
48
+ /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
49
+
50
+ -- Dump completed on 2007-01-11 11:16:29
@@ -0,0 +1,206 @@
1
+ #include <WireTapServerAPI.h>
2
+ #include <string.h>
3
+ #include <exception>
4
+ #include <ruby.h>
5
+ #include <rubyio.h>
6
+
7
+ VALUE mWiretap, cTestServer, cAudioFormat, cClipFormat;
8
+ ID to_i;
9
+ extern void Init_format();
10
+ extern void wiretap_format_free(WireTapClipFormat* format);
11
+
12
+
13
+
14
+ class TestException : public std::exception
15
+ {
16
+ public:
17
+ TestException( const char *msg ) throw() : what_( msg ) {}
18
+ virtual ~TestException() throw() {}
19
+ virtual const char *what() const throw() { return what_; }
20
+
21
+ private:
22
+ const char *what_;
23
+ };
24
+
25
+ class TestServer : public WireTapServerAPI
26
+ {
27
+ protected:
28
+ VALUE _server;
29
+ public:
30
+ TestServer() : WireTapServerAPI( 0 ) {
31
+ _server = rb_funcall(cTestServer, rb_intern("new"), 0);
32
+ rb_gc_register_address(&_server);
33
+ }
34
+ virtual ~TestServer() {
35
+ rb_gc_unregister_address(&_server);
36
+ }
37
+
38
+ protected:
39
+ virtual void initialize( int argc, char **argv ) {
40
+ VALUE rargv[argc];
41
+ for(int i = 0; i < argc; i++) {
42
+ rargv[i] = rb_str_new2(argv[i]);
43
+ }
44
+ rb_funcall2(_server, rb_intern("init"), argc, rargv);
45
+ }
46
+
47
+ virtual void uninitialize() {
48
+ rb_funcall(_server, rb_intern("uninitialize"), 0);
49
+ }
50
+
51
+ virtual void getServerInfo( WireTapServerInfo &info ) {
52
+ info.setProduct( "Test IFFFS" );
53
+ info.setVendor( "Discreet" );
54
+ info.setProductVersionMajor( 1 );
55
+ info.setProductVersionMinor( 7 );
56
+ info.setProductVersionMaint( 0 );
57
+ info.setProductVersionStr( "1.7" );
58
+ info.setProductBuild( 123 );
59
+ info.setDatabase( "Test" );
60
+ }
61
+
62
+ virtual void getRootNode( WireTapStr &nodeId ) {
63
+ VALUE node_id = rb_funcall(_server, rb_intern("get_root_node"), 0);
64
+ Check_Type(node_id, T_STRING);
65
+ nodeId = RSTRING(node_id)->ptr;
66
+ }
67
+
68
+ virtual void createNode( const char *nodeId, const char *displayName, int type, WireTapStr &newChildNode ) {
69
+ if ( strcmp( nodeId, "/" ) != 0 ) {
70
+ throw( TestException( "Can only create child nodes of the root node" ) );
71
+ }
72
+ VALUE node = rb_funcall(_server, rb_intern("create_node"), 3, rb_str_new2(nodeId), rb_str_new2(displayName), INT2FIX(type));
73
+ Check_Type(node, T_STRING);
74
+ newChildNode = RSTRING(node)->ptr;
75
+ }
76
+
77
+ virtual void createClipNode( const char *parentNodeId, const char *displayName, int type, const WireTapClipFormat &format, WireTapStr &newChildNode ) {
78
+ VALUE clipformat = Data_Wrap_Struct(cClipFormat, 0, wiretap_format_free, new WireTapClipFormat(format));
79
+ VALUE node = rb_funcall(_server, rb_intern("create_clip_node"), 4, rb_str_new2(parentNodeId), rb_str_new2(displayName), INT2FIX(type), clipformat);
80
+ Check_Type(node, T_STRING);
81
+ newChildNode = RSTRING(node)->ptr;
82
+ }
83
+
84
+ virtual void destroyNode( const char *nodeId ) {
85
+ rb_funcall(_server, rb_intern("destroy_node"), 1, rb_str_new2(nodeId));
86
+ }
87
+
88
+ virtual void getChildren( const char *parentNodeId, WireTapStrList &childNodeIds, WireTapStrList &displayNames ) {
89
+ VALUE nodes = rb_funcall(_server, rb_intern("get_children"), 1, rb_str_new2(parentNodeId));
90
+ if(nodes == Qnil) {
91
+ return;
92
+ }
93
+ Check_Type(nodes, T_ARRAY);
94
+ for(int j = 0; j < RARRAY(nodes)->len; j++) {
95
+ VALUE description = RARRAY(nodes)->ptr[j];
96
+ Check_Type(description, T_ARRAY);
97
+
98
+ Check_Type(RARRAY(description)->ptr[0], T_STRING);
99
+ childNodeIds.push_back(RSTRING(RARRAY(description)->ptr[0])->ptr);
100
+
101
+ Check_Type(RARRAY(description)->ptr[1], T_STRING);
102
+ displayNames.push_back(RSTRING(RARRAY(description)->ptr[1])->ptr);
103
+ }
104
+ }
105
+
106
+ virtual void getNodeType( const char *nodeId, int &type ) {
107
+ type = NUM2INT(rb_funcall(_server, rb_intern("get_node_type"), 1, rb_str_new2(nodeId)));
108
+ }
109
+
110
+ virtual void getNodeTypeStr( const char *nodeId, WireTapStr &typeStr ) {
111
+ VALUE node_type = rb_funcall(_server, rb_intern("get_node_type_str"), 1, rb_str_new2(nodeId));
112
+ Check_Type(node_type, T_STRING);
113
+ typeStr = RSTRING(node_type)->ptr;
114
+ }
115
+
116
+ virtual bool isClipNode( const char *nodeId ) {
117
+ return RTEST(rb_funcall(_server, rb_intern("clip?"), 1, rb_str_new2(nodeId)));
118
+ }
119
+
120
+ virtual void strToNodeType( const char *str, int &type ) const {
121
+ type = NUM2INT(rb_funcall(_server, rb_intern("str_to_node_type"), 1, rb_str_new2(str)));
122
+ }
123
+
124
+ virtual void getDisplayName( const char *nodeId, WireTapStr &str ) {
125
+ VALUE name = rb_funcall(_server, rb_intern("get_display_name"), 1, rb_str_new2(nodeId));
126
+ Check_Type(name, T_STRING);
127
+ str = RSTRING(name)->ptr;
128
+ }
129
+
130
+ virtual void getFramePaths( const char *nodeId, WireTapStrList &paths ) {
131
+ VALUE frames = rb_funcall(_server, rb_intern("get_frame_paths"), 1, rb_str_new2(nodeId));
132
+ Check_Type(frames, T_ARRAY);
133
+ for(int j = 0; j < RARRAY(frames)->len; j++) {
134
+ Check_Type(RARRAY(frames)->ptr[j], T_STRING);
135
+ paths.push_back(RSTRING(RARRAY(frames)->ptr[j])->ptr);
136
+ }
137
+ }
138
+
139
+ virtual void setFramePaths( const char *nodeId, const WireTapStrList &paths, const WireTapClipFormat &format ) {
140
+ throw( TestException( "setFramePaths: unimplemented" ) );
141
+ }
142
+
143
+ virtual void getClipFormat( const char *nodeId, WireTapClipFormat &format ) {
144
+ VALUE r_format = rb_funcall(_server, rb_intern("get_clip_format"), 1, rb_str_new2(nodeId));
145
+ if(r_format == Qnil) {
146
+ return;
147
+ }
148
+ WireTapClipFormat* _format;
149
+ Data_Get_Struct(r_format, WireTapClipFormat, _format);
150
+ // Copy _format to _format
151
+ throw( TestException( "getClipFormat: unimplemented" ) );
152
+ }
153
+
154
+ virtual void getMetaData( const char *nodeId,
155
+ const char *streamName,
156
+ WireTapStr &metaData )
157
+ {
158
+ throw( TestException( "getMetaData: unimplemented" ) );
159
+ }
160
+
161
+ virtual void setMetaData( const char *nodeId,
162
+ const char *streamName, const char *metaData )
163
+ {
164
+ throw( TestException( "setMetaData: unimplemented" ) );
165
+ }
166
+
167
+ virtual void queryMetaDataSupport( const char *nodeId,
168
+ WireTapStrList &streamNames )
169
+ {
170
+ throw( TestException( "queryMetaDataSupport: unimplemented" ) );
171
+ }
172
+
173
+ virtual WireTapStr streamIdToFilePath( const char *streamId )
174
+ {
175
+ // Just return the stream ID passed in as the file path.
176
+ //
177
+ return WireTapStr( streamId );
178
+ }
179
+ };
180
+
181
+ #define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f)
182
+ int Argc;
183
+ char **Argv;
184
+ FILE* log_file;
185
+
186
+ void logger( WireTapServerAPI::Level lev, const char *msg, const char *module, int line ) {
187
+ //fprintf(log_file, "%d: %s in %s:%d", lev, msg, module, line);
188
+ printf("%d: %s in %s:%d", lev, msg, module, line);
189
+ }
190
+
191
+ VALUE server_run(VALUE self) {
192
+ TestServer server;
193
+ int argc = 1;
194
+ char *argv[1] = {"server"};
195
+ return server.mainLoop(argc, argv);
196
+ }
197
+
198
+ extern "C"
199
+
200
+ void Init_server() {
201
+ mWiretap = rb_const_get(rb_cObject, rb_intern("Wiretap"));
202
+ cTestServer = rb_const_get(mWiretap, rb_intern("TestServer"));
203
+ Init_format();
204
+ rb_define_singleton_method(mWiretap, "server_run", VALUEFUNC(server_run), 0);
205
+ to_i = rb_intern("to_i");
206
+ }
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'active_record'
5
+
6
+ ActiveRecord::Base.establish_connection(
7
+ :adapter => "mysql",
8
+ :socket => "/var/run/mysqld/mysqld.sock",
9
+ :database => "wiretap_development",
10
+ :username => "root",
11
+ :password => ""
12
+ )
13
+
14
+ class Node < ActiveRecord::Base
15
+ acts_as_tree
16
+
17
+ def self.root
18
+ Node.find(:first, :conditions => "parent_id is NULL")
19
+ end
20
+ end
21
+
22
+ module Wiretap
23
+ class TestServer
24
+
25
+ #initialize with array of argument.
26
+ def init(*args)
27
+ puts "Initing with #{args.inspect}"
28
+ end
29
+
30
+ # shutdown server
31
+ def uninitialize
32
+ puts "Unitializing"
33
+ end
34
+
35
+ # root node ID is usually "/"
36
+ def get_root_node
37
+ puts "Requested root node"
38
+ "/"
39
+ end
40
+
41
+ # create node, being child of node_id with name display_name of kind type
42
+ # returning id of new node
43
+ def create_node(node_id, display_name, type)
44
+ puts "Create node: #{node_id}:#{display_name}:#{type}"
45
+ ""
46
+ end
47
+
48
+ # create node, being child of node_id with name display_name of kind type
49
+ # returning id of new node
50
+ def create_clip_node(node_id, display_name, type, format)
51
+ puts "Creating clip node: #{node_id}:#{display_name}:#{type}:#{format}"
52
+ ""
53
+ end
54
+
55
+ # destroy node by it's ID
56
+ def destroy_node(node_id)
57
+ puts "Destroying #{node_id}"
58
+ end
59
+
60
+ # get_children returns list of pairs of name: [ [id, display_name], [id, display_name], ...]
61
+ def get_children(parent_node_id)
62
+ parent_node_id = to_internal_id(parent_node_id)
63
+ puts "Get children of: #{parent_node_id}"
64
+ Node.find(parent_node_id).children.map {|child| ["/"+child.name, child.name]}
65
+ end
66
+
67
+ # returns numeric type of requested node
68
+ def get_node_type(node_id)
69
+ puts "Get node type: #{node_id}"
70
+ self.class.translate_type_from_string(get_node_type_str(node_id))
71
+ end
72
+
73
+ # returns symbolic (string) type of requested node
74
+ def get_node_type_str(node_id)
75
+ node_id = to_internal_id(node_id)
76
+ puts "Get node type str: #{node_id}"
77
+ Node.find(node_id).kind
78
+ end
79
+
80
+ # predicate function, whether node is clip node
81
+ def clip?(node_id)
82
+ puts "Is clip: #{node_id}"
83
+ ["clip", "clip_audio", "clip_audiostream"].include? get_node_type(node_id)
84
+ end
85
+
86
+ # convert string type to node type
87
+ def str_to_node_type(str)
88
+ puts "String to node type: #{str}"
89
+ self.class.translate_type_from_string str
90
+ end
91
+
92
+ # get display name of node by it's physical ID
93
+ def get_display_name(node_id)
94
+ node_id = to_internal_id(node_id)
95
+ puts "Get display name: #{node_id}"
96
+ Node.find(node_id).name
97
+ end
98
+
99
+ # Loads some mysterious frame paths
100
+ def get_frame_paths(node_id)
101
+ puts "Get frame paths: #{node_id}"
102
+ []
103
+ end
104
+
105
+
106
+ def root
107
+ File.dirname(__FILE__) + "/../../test/wiretap_root/192.168.171.17"
108
+ end
109
+
110
+ def path(node_id)
111
+ root + "/" + node_id
112
+ end
113
+
114
+ def to_internal_id(node_id)
115
+ case node_id
116
+ when "/"
117
+ return 1
118
+ end
119
+ Node.find(:first, :conditions => ["name = ?", node_id]).id rescue node_id
120
+ end
121
+
122
+ @@node_types = [
123
+ "node",
124
+ "host",
125
+ "volume",
126
+ "project",
127
+ "library",
128
+ "reel",
129
+ "clip",
130
+ "clip_hires",
131
+ "clip_lowres",
132
+ "clip_slate",
133
+ "clip_audio",
134
+ "clip_audiostream",
135
+ "user",
136
+ "setup",
137
+ "user_preference"
138
+ ]
139
+ def self.translate_type_from_string(type)
140
+ @@node_types.index(type) || (puts "Fuck: #{type}"; 0)
141
+ end
142
+ end
143
+ end
144
+
145
+ require 'server'
146
+ Wiretap.server_run
@@ -0,0 +1,85 @@
1
+ #include <ruby.h>
2
+ #include <rubyio.h>
3
+ #include <sys/types.h>
4
+ #include <sys/wait.h>
5
+ #include <unistd.h>
6
+ #include <string.h>
7
+ #include <stdio.h>
8
+ #include <errno.h>
9
+
10
+
11
+ extern VALUE mWiretap;
12
+ #define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f)
13
+
14
+
15
+ VALUE mThreadWorker;
16
+ int children_count;
17
+
18
+ static void start_command(int number) {
19
+ VALUE command = rb_yield(INT2NUM(number));
20
+ Check_Type(command, T_STRING);
21
+
22
+ char command_fmt[] = "exec %s";
23
+ char command_line[RSTRING(command)->len + sizeof(command_fmt) + 20];
24
+ snprintf(command_line, sizeof(command_line), command_fmt, RSTRING(command)->ptr);
25
+
26
+ pid_t pid = fork();
27
+ switch(pid) {
28
+ case -1: {
29
+ rb_raise(rb_eStandardError, "Couldn't fork because of: %s", strerror(errno));
30
+ }
31
+ case 0: {
32
+ execl("/bin/sh", "sh", "-c", command_line, NULL);
33
+ }
34
+ default: {
35
+ children_count++;
36
+ break;
37
+ }
38
+ }
39
+ }
40
+
41
+ static int init_worker(int num_procs) {
42
+ int i;
43
+ for(i = 0; i < num_procs; i++) {
44
+ start_command(i);
45
+ }
46
+ return i;
47
+ }
48
+
49
+ /*
50
+ * ThreadWorker.run(children_count = 8, &block)
51
+ *
52
+ * Block receives number of iteration and returns command, required to launch
53
+ * at this iteration.
54
+ *
55
+ * This function is supposed to work for converting multiple files via
56
+ * convert utility.
57
+ */
58
+
59
+ static VALUE thread_worker_run(int argc, VALUE* argv, VALUE self) {
60
+ VALUE num_procs;
61
+ rb_scan_args(argc, argv, "01", &num_procs);
62
+ if(num_procs == Qnil) {
63
+ num_procs = INT2FIX(8);
64
+ }
65
+
66
+ int counter = init_worker(NUM2INT(num_procs));
67
+ while(1) {
68
+ break;
69
+ }
70
+
71
+ int status;
72
+ pid_t child_pid;
73
+ while((child_pid = wait(&status)) != -1) {
74
+ start_command(counter++);
75
+ }
76
+ return Qtrue;
77
+ }
78
+
79
+ void Init_thread_worker() {
80
+ mThreadWorker = rb_define_module_under(mWiretap, "ThreadWorker");
81
+
82
+ rb_define_singleton_method(mThreadWorker, "run", VALUEFUNC(thread_worker_run), -1);
83
+ }
84
+
85
+