]> icculus.org git repositories - duncan/yast2-ruby-bindings.git/blob - src/ruby/Y2RubyTypeTerm.cc
- Lot of fixes and support for the UI!!!
[duncan/yast2-ruby-bindings.git] / src / ruby / Y2RubyTypeTerm.cc
1 /*---------------------------------------------------------------------\
2 |                                                                      |
3 |                      __   __    ____ _____ ____                      |
4 |                      \ \ / /_ _/ ___|_   _|___ \                     |
5 |                       \ V / _` \___ \ | |   __) |                    |
6 |                        | | (_| |___) || |  / __/                     |
7 |                        |_|\__,_|____/ |_| |_____|                    |
8 |                                                                      |
9 |                                                                      |
10 | ruby language support                              (C) Novell Inc.   |
11 \----------------------------------------------------------------------/
12
13 Author: Duncan Mac-Vicar <dmacvicar@suse.de>
14
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License
17 as published by the Free Software Foundation; either version
18 2 of the License, or (at your option) any later version.
19
20 */
21
22 #include "YRuby.h"
23 #include "Y2RubyTypeConv.h"
24 #include "Y2RubyTypeTerm.h"
25 #include <ycp/YCPTerm.h>
26
27 static VALUE ryast_cTerm;
28
29 struct ryast_Term_Wrapper
30 {
31   ryast_Term_Wrapper()
32     : term("init-me")
33   {
34
35   }
36   YCPTerm term;
37 };
38
39 //-----------------------------------------------------------------------------
40 // internal used only
41
42 static void
43 ryast_term_set_term( VALUE self, const YCPTerm & term )
44 {
45   ryast_Term_Wrapper *wrapper;
46   Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
47   wrapper->term = term;
48 }
49
50 VALUE
51 ryast_rterm_from_yterm( const YCPTerm &term )
52 {
53   VALUE rterm_obj = rb_funcall( ryast_cTerm, rb_intern("new"), 0);
54   ryast_term_set_term( rterm_obj, term );
55   return rterm_obj;
56 }
57
58 YCPTerm
59 ryast_yterm_from_rterm( VALUE term )
60 {
61   ryast_Term_Wrapper *wrapper;
62   Data_Get_Struct(term, ryast_Term_Wrapper, wrapper);
63   return wrapper->term;
64 }
65
66 static void
67 ryast_term_mark (ryast_Term_Wrapper *r)
68 {
69
70 }
71
72 static void
73 ryast_term_free (ryast_Term_Wrapper *r)
74 {
75   delete r;
76 }
77
78 static VALUE
79 ryast_term_initialize( int argc, VALUE *argv, VALUE self )
80 {
81     ryast_Term_Wrapper *wrapper;
82     Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
83     
84     // we should be using rb_scan_args here but I couldn't get it to work.
85
86     // we need at least the name to create a YCPTerm
87     Check_Type( argv[0], T_STRING);
88     wrapper->term = YCPTerm( RSTRING(argv[0])->ptr );
89     // add the remaining YCPTerm arguments
90     if (argc > 1)
91     {
92       int i=1;
93       for ( ; i<argc; ++i )
94       {
95         wrapper->term->add(rbvalue_2_ycpvalue(argv[i]));
96       }
97     }
98     return self;
99 }
100
101 static VALUE
102 ryast_term_add( int argc, VALUE *argv, VALUE self )
103 {
104     ryast_Term_Wrapper *wrapper;
105     Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
106     
107     // we should be using rb_scan_args here but I couldn't get it to work.
108
109     // add the remaining YCPTerm arguments
110     if (argc > 0)
111     {
112       int i=0;
113       for ( ; i<argc; ++i )
114       {
115         //std::cout << "Hi! term::add: " << TYPE(argv[i]) << std::endl;
116         YCPValue value = rbvalue_2_ycpvalue(argv[i]);
117         wrapper->term->add(value);
118       }
119     }
120     return self;
121 }
122
123 static VALUE
124 ryast_term_allocate(VALUE klass)
125 {
126   // create struct
127   ryast_Term_Wrapper *wrapper = new ryast_Term_Wrapper();
128   // wrap and return struct
129   return Data_Wrap_Struct (klass, ryast_term_mark, ryast_term_free, wrapper);
130 }
131
132
133 static VALUE
134 ryast_term_to_s(VALUE self)
135 {
136   ryast_Term_Wrapper *wrapper;
137   Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
138   return rb_str_new2(wrapper->term.toString().c_str());
139 }
140
141 static VALUE
142 ryast_term_name(VALUE self)
143 {
144   ryast_Term_Wrapper *wrapper;
145   Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
146   return rb_str_new2(wrapper->term.name().c_str());
147 }
148
149 // static VALUE
150 // ryast_term_set_name(VALUE self, VALUE name)
151 // {
152 //   Check_Type(name, T_STRING);
153 //   ryast_Term_Wrapper *wrapper;
154 //   Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
155 //   
156 //   wrapper->term->setName(RSTRING(name)->ptr);
157 //   return self;
158 // }
159
160 void
161 ryast_term_init( VALUE super )
162 {
163   //std::cout << "Hi! term" << std::endl;
164   ryast_cTerm = rb_define_class_under( super, "Term", rb_cObject );
165   rb_define_alloc_func( ryast_cTerm, ryast_term_allocate );
166   rb_define_method( ryast_cTerm, "initialize", RB_METHOD( ryast_term_initialize ), -1 );
167   rb_define_method( ryast_cTerm, "add", RB_METHOD( ryast_term_add ), -1 );
168   //rb_define_method( ryast_cTerm, "name=", RB_METHOD( ryast_term_set_name ), 1 );
169   rb_define_method( ryast_cTerm, "name", RB_METHOD( ryast_term_name ), 0 );
170   rb_define_method( ryast_cTerm, "to_s", RB_METHOD( ryast_term_to_s ), 0 );
171 }