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.
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
+