rpm  5.4.4
ruby/rpmds-rb.c
Go to the documentation of this file.
00001 
00006 #include "system.h"
00007 #include "rpm-rb.h"
00008 
00009 #include "rpmds-rb.h"
00010 
00011 #ifdef  NOTYET
00012 #include <argv.h>
00013 #include <mire.h>
00014 #endif
00015 
00016 #define _RPMDS_INTERNAL
00017 #include <rpmtag.h>
00018 #include <rpmtypes.h>
00019 #include <rpmtag.h>
00020 #include <rpmio.h>
00021 #include <rpmds.h>
00022 
00023 #include "../debug.h"
00024 
00025 
00026 VALUE rpmdsClass;
00027 
00028 
00029 /*@unchecked@*/
00030 static int _debug = 0;
00031 
00032 /* --- helpers */
00033 static void *
00034 rpmds_ptr(VALUE s)
00035 {
00036     void *ptr;
00037     Data_Get_Struct(s, void, ptr);
00038     return ptr;
00039 }
00040 
00041 /* --- Object methods */
00042 
00043 static void
00044 initMethods(VALUE klass)
00045 {
00046 }
00047 
00048 /* --- Object properties */
00049 static VALUE
00050 rpmds_debug_get(VALUE s)
00051 {
00052 if (_debug)
00053 fprintf(stderr, "==> %s(0x%lx)\n", __FUNCTION__, s);
00054     return INT2FIX(_debug);
00055 }
00056 
00057 static VALUE
00058 rpmds_debug_set(VALUE s, VALUE v)
00059 {
00060 if (_debug)
00061 fprintf(stderr, "==> %s(0x%lx, 0x%lx)\n", __FUNCTION__, s, v);
00062     return INT2FIX(_debug = FIX2INT(v));
00063 }
00064 
00065 static VALUE
00066 rpmds_Count_get(VALUE s)
00067 {
00068     rpmds ds = rpmds_ptr(s);
00069 if (_debug)
00070 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00071     return INT2FIX(rpmdsCount(ds));
00072 }
00073 
00074 /* XXX FIXME: what to call the method? */
00075 static VALUE
00076 rpmds_Type_get(VALUE s)
00077 {
00078     rpmds ds = rpmds_ptr(s);
00079 if (_debug)
00080 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00081     return rb_str_new2(rpmdsType(ds));
00082 }
00083 
00084 static VALUE
00085 rpmds_Ix_get(VALUE s)
00086 {
00087     rpmds ds = rpmds_ptr(s);
00088 if (_debug)
00089 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00090     return INT2FIX(rpmdsIx(ds));
00091 }
00092 
00093 static VALUE
00094 rpmds_Ix_set(VALUE s, VALUE v)
00095 {
00096     rpmds ds = rpmds_ptr(s);
00097     int ix = FIX2INT(v);
00098 if (_debug)
00099 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00100     if (ix != rpmdsIx(ds)) {
00101         (void) rpmdsSetIx(ds, ix-1);
00102         /* XXX flush and recreate N and DNEVR with a rpmdsNext() step */
00103         (void) rpmdsNext(ds);
00104     }
00105     return INT2FIX(rpmdsIx(ds));
00106 }
00107 
00108 static VALUE
00109 rpmds_BT_get(VALUE s)
00110 {
00111     rpmds ds = rpmds_ptr(s);
00112 if (_debug)
00113 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00114     return INT2FIX(rpmdsBT(ds));
00115 }
00116 
00117 static VALUE
00118 rpmds_BT_set(VALUE s, VALUE v)
00119 {
00120     rpmds ds = rpmds_ptr(s);
00121     int BT = FIX2INT(v);
00122 if (_debug)
00123 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00124     (void) rpmdsSetBT(ds, BT);
00125     return INT2FIX(rpmdsBT(ds));
00126 }
00127 
00128 static VALUE
00129 rpmds_Color_get(VALUE s)
00130 {
00131     rpmds ds = rpmds_ptr(s);
00132 if (_debug)
00133 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00134     return INT2FIX(rpmdsColor(ds));
00135 }
00136 
00137 static VALUE
00138 rpmds_Color_set(VALUE s, VALUE v)
00139 {
00140     rpmds ds = rpmds_ptr(s);
00141     int color = FIX2INT(v);
00142 if (_debug)
00143 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00144     (void) rpmdsSetColor(ds, color);
00145     return INT2FIX(rpmdsColor(ds));
00146 }
00147 
00148 static VALUE
00149 rpmds_NoPromote_get(VALUE s)
00150 {
00151     rpmds ds = rpmds_ptr(s);
00152 if (_debug)
00153 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00154     return INT2FIX(rpmdsNoPromote(ds));
00155 }
00156 
00157 static VALUE
00158 rpmds_NoPromote_set(VALUE s, VALUE v)
00159 {
00160     rpmds ds = rpmds_ptr(s);
00161     int nopromote = FIX2INT(v);
00162 if (_debug)
00163 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00164     (void) rpmdsSetNoPromote(ds, nopromote);
00165     return INT2FIX(rpmdsNoPromote(ds));
00166 }
00167 
00168 static VALUE
00169 rpmds_N_get(VALUE s)
00170 {
00171     rpmds ds = rpmds_ptr(s);
00172 if (_debug)
00173 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00174     return rb_str_new2(rpmdsN(ds));
00175 }
00176 
00177 static VALUE
00178 rpmds_EVR_get(VALUE s)
00179 {
00180     rpmds ds = rpmds_ptr(s);
00181 if (_debug)
00182 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00183     return rb_str_new2(rpmdsEVR(ds));
00184 }
00185 
00186 static VALUE
00187 rpmds_Flags_get(VALUE s)
00188 {
00189     rpmds ds = rpmds_ptr(s);
00190 if (_debug)
00191 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00192     return INT2FIX(rpmdsFlags(ds));
00193 }
00194 
00195 static VALUE
00196 rpmds_DNEVR_get(VALUE s)
00197 {
00198     rpmds ds = rpmds_ptr(s);
00199 if (_debug)
00200 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
00201     return rb_str_new2(rpmdsDNEVR(ds));
00202 }
00203 
00204 static void
00205 initProperties(VALUE klass)
00206 {
00207     rb_define_method(klass, "debug", rpmds_debug_get, 0);
00208     rb_define_method(klass, "debug=", rpmds_debug_set, 1);
00209     rb_define_method(klass, "length", rpmds_Count_get, 0);
00210     rb_define_method(klass, "ix", rpmds_Ix_get, 0);
00211     rb_define_method(klass, "ix=", rpmds_Ix_set, 1);
00212     rb_define_method(klass, "Type", rpmds_Type_get, 0);
00213     rb_define_method(klass, "buildtime", rpmds_BT_get, 0);
00214     rb_define_method(klass, "buildtime=", rpmds_BT_set, 1);
00215     rb_define_method(klass, "color", rpmds_Color_get, 0);
00216     rb_define_method(klass, "color=", rpmds_Color_set, 1);
00217     rb_define_method(klass, "nopromote", rpmds_NoPromote_get, 0);
00218     rb_define_method(klass, "nopromote=", rpmds_NoPromote_set, 1);
00219     rb_define_method(klass, "N", rpmds_N_get, 0);
00220     rb_define_method(klass, "EVR", rpmds_EVR_get, 0);
00221     rb_define_method(klass, "F", rpmds_Flags_get, 0);
00222     rb_define_method(klass, "DNEVR", rpmds_DNEVR_get, 0);
00223 }
00224 
00225 /* --- Object ctors/dtors */
00226 static void
00227 rpmds_free(rpmds ds)
00228 {
00229 if (_debug)
00230 fprintf(stderr, "==> %s(%p)\n", __FUNCTION__, ds);
00231     ds = rpmdsFree(ds);
00232 }
00233 
00234 static VALUE
00235 rpmds_new(int argc, VALUE *argv, VALUE s)
00236 {
00237     VALUE v_hdr, v_tag;
00238     rpmTag tag = RPMTAG_NAME;
00239     int flags = 0;
00240     rpmds ds;
00241 
00242     rb_scan_args(argc, argv, "02", &v_hdr, &v_tag);
00243 
00244     if (!NIL_P(v_tag))
00245         tag = FIX2INT(v_tag);
00246 
00247     if (!NIL_P(v_hdr)) {
00248         Header h = rpmds_ptr(v_hdr);
00249         ds = rpmdsNew(h, tag, flags);
00250     } else
00251         (void) rpmdsRpmlib(&ds, NULL);
00252 
00253 if (_debug)
00254 fprintf(stderr, "==> %s(%p[%d], 0x%lx) mi %p\n", __FUNCTION__, argv, argc, s, ds);
00255     return Data_Wrap_Struct(s, 0, rpmds_free, ds);
00256 }
00257 
00258 /* --- Class initialization */
00259 
00260 void
00261 Init_rpmds(void)
00262 {
00263     rpmdsClass = rb_define_class_under(rpmModule, "Ds", rb_cObject);
00264 if (_debug)
00265 fprintf(stderr, "==> %s() rpmdsClass 0x%lx\n", __FUNCTION__, rpmdsClass);
00266 #ifdef  NOTYET
00267     rb_include_module(rpmdsClass, rb_mEnumerable);
00268 #endif
00269     rb_define_singleton_method(rpmdsClass, "new", rpmds_new, -1);
00270     initProperties(rpmdsClass);
00271     initMethods(rpmdsClass);
00272 }
00273 
00274 VALUE
00275 rpmrb_NewDs(void *_ds)
00276 {
00277     return Data_Wrap_Struct(rpmdsClass, 0, rpmds_free, _ds);
00278 }
00279