rpm  5.4.4
ruby/rpmhdr-rb.c
Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #include "rpm-rb.h"
00008 #include "rpmds-rb.h"
00009 #include "rpmfi-rb.h"
00010 #include "rpmhdr-rb.h"
00011 
00012 #ifdef  NOTYET
00013 #include <argv.h>
00014 #include <mire.h>
00015 #endif
00016 
00017 #define _RPMDS_INTERNAL
00018 #include <rpmtag.h>
00019 #include <rpmtypes.h>
00020 #include <rpmds.h>
00021 #include <rpmfi.h>
00022 #include <rpmio.h>
00023 
00024 #include <rpmcli.h>     /* XXX rpmHeaderFormats */
00025 
00026 #include "../debug.h"
00027 
00028 VALUE rpmhdrClass;
00029 
00030 /*@unchecked@*/
00031 static int _debug = 0;
00032 
00033 /* --- helpers */
00034 static void *
00035 rpmhdr_ptr(VALUE s)
00036 {
00037     void *ptr;
00038     Data_Get_Struct(s, void, ptr);
00039     return ptr;
00040 }
00041 
00042 static VALUE
00043 rpmhdrLoadTag(Header h, const char * name)
00044 {
00045     HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
00046     VALUE v = Qfalse;
00047     int i;
00048 
00049 if (_debug)
00050 fprintf(stderr, "==> %s(%p,%s)\n", __FUNCTION__, h, name);
00051 
00052     he->tag = tagValue(name);
00053     if (headerGet(h, he, 0)) {
00054 if (_debug < 0)
00055 fprintf(stderr, "\t%s(%u) %u %p[%u]\n", name, (unsigned)he->tag, (unsigned)he->t, he->p.ptr, (unsigned)he->c);
00056         switch (he->t) {
00057         default:
00058             goto exit;
00059             /*@notreached@*/ break;
00060         case RPM_BIN_TYPE:      /* XXX return as array of octets for now. */
00061         case RPM_UINT8_TYPE:
00062             v = rb_ary_new();
00063             for (i = 0; i < (int)he->c; i++)
00064                 rb_ary_push(v, INT2FIX(he->p.ui8p[i]));
00065             break;
00066         case RPM_UINT16_TYPE:
00067             v = rb_ary_new();
00068             for (i = 0; i < (int)he->c; i++)
00069                 rb_ary_push(v, INT2FIX(he->p.ui16p[i]));
00070             break;
00071         case RPM_UINT32_TYPE:
00072             v = rb_ary_new();
00073             for (i = 0; i < (int)he->c; i++)
00074                 rb_ary_push(v, INT2FIX(he->p.ui32p[i]));
00075             break;
00076         case RPM_UINT64_TYPE:
00077             v = rb_ary_new();
00078             for (i = 0; i < (int)he->c; i++)
00079                 rb_ary_push(v, INT2FIX(he->p.ui64p[i]));
00080             break;
00081         case RPM_STRING_ARRAY_TYPE:
00082             v = rb_ary_new();
00083             for (i = 0; i < (int)he->c; i++)
00084                 rb_ary_push(v, rb_str_new2(he->p.argv[i]));
00085             break;
00086         case RPM_I18NSTRING_TYPE:       /* XXX FIXME: is this ever seen? */
00087         case RPM_STRING_TYPE:
00088             v = rb_str_new2(he->p.str);
00089             break;
00090         }
00091     }
00092 
00093 exit:
00094     he->p.ptr = _free(he->p.ptr);
00095     return v;
00096 }
00097 /* --- Object methods */
00098 static VALUE
00099 rpmhdr_sprintf(VALUE s, VALUE v)
00100 {
00101     Header h = rpmhdr_ptr(s);
00102     const char *qfmt = StringValueCStr(v);
00103     const char *q;
00104     const char *errstr = NULL;
00105 
00106 if (_debug)
00107 fprintf(stderr, "==> %s(0x%lx, 0x%lx) h %p\n", __FUNCTION__, s, v, h);
00108 
00109     if ((q = headerSprintf(h, qfmt, NULL, rpmHeaderFormats, &errstr)) == NULL)
00110         q = errstr;
00111 
00112     return rb_str_new2(q);
00113 }
00114 
00115 static VALUE
00116 rpmhdr_getorigin(VALUE s)
00117 {
00118     Header h = rpmhdr_ptr(s);
00119 
00120 if (_debug)
00121 fprintf(stderr, "==> %s(0x%lx) h %p\n", __FUNCTION__, s, h);
00122 
00123     return rb_str_new2(headerGetOrigin(h));
00124 }
00125 
00126 static VALUE
00127 rpmhdr_setorigin(VALUE s, VALUE v)
00128 {
00129     Header h = rpmhdr_ptr(s);
00130 
00131 if (_debug)
00132 fprintf(stderr, "==> %s(0x%lx, 0x%lx) h %p\n", __FUNCTION__, s, v, h);
00133 
00134     (void) headerSetOrigin(h, StringValueCStr(v));
00135     return rb_str_new2(headerGetOrigin(h));
00136 }
00137 
00138 static VALUE
00139 rpmhdr_ds(int argc, VALUE *argv, VALUE s)
00140 {
00141     VALUE v_tag;
00142     Header h = rpmhdr_ptr(s);
00143     rpmTag tag = RPMTAG_PROVIDENAME;
00144     int flags = 0;
00145 
00146     rb_scan_args(argc, argv, "01", &v_tag);
00147 
00148     if (!NIL_P(v_tag))
00149         tag = FIX2INT(v_tag);
00150 
00151 if (_debug)
00152 fprintf(stderr, "==> %s(0x%lx) h %p\n", __FUNCTION__, s, h);
00153 
00154     return rpmrb_NewDs( rpmdsNew(h, tag, flags) );
00155 }
00156 
00157 static VALUE
00158 rpmhdr_fi(int argc, VALUE *argv, VALUE s)
00159 {
00160     VALUE v_tag;
00161     Header h = rpmhdr_ptr(s);
00162     rpmTag tag = RPMTAG_BASENAMES;
00163     int flags = 0;
00164 
00165     rb_scan_args(argc, argv, "01", &v_tag);
00166 
00167     if (!NIL_P(v_tag))
00168         tag = FIX2INT(v_tag);
00169 
00170 if (_debug)
00171 fprintf(stderr, "==> %s(0x%lx) h %p\n", __FUNCTION__, s, h);
00172 
00173     return rpmrb_NewFi( rpmfiNew(NULL, h, tag, flags) );
00174 }
00175 
00176 static void
00177 initMethods(VALUE klass)
00178 {
00179     rb_define_method(klass, "sprintf",   rpmhdr_sprintf, 1);
00180     rb_define_method(klass, "getorigin", rpmhdr_getorigin, 0);
00181     rb_define_method(klass, "setorigin", rpmhdr_setorigin, 1);
00182     rb_define_method(klass, "ds",        rpmhdr_ds, -1);
00183     rb_define_method(klass, "fi",        rpmhdr_fi, -1);
00184 }
00185 
00186 /* --- Object properties */
00187 static VALUE
00188 rpmhdr_debug_get(VALUE s)
00189 {
00190 if (_debug)
00191 fprintf(stderr, "==> %s(0x%lx)\n", __FUNCTION__, s);
00192     return INT2FIX(_debug);
00193 }
00194 
00195 static VALUE
00196 rpmhdr_debug_set(VALUE s, VALUE v)
00197 {
00198 if (_debug)
00199 fprintf(stderr, "==> %s(0x%lx, 0x%lx)\n", __FUNCTION__, s, v);
00200     return INT2FIX(_debug = FIX2INT(v));
00201 }
00202 
00203 static VALUE
00204 rpmhdr__get(VALUE s, VALUE v)
00205 {
00206     Header h = rpmhdr_ptr(s);
00207     char * vstr = StringValueCStr(v);
00208     
00209 if (_debug)
00210 fprintf(stderr, "==> %s(0x%lx) %s\n", __FUNCTION__, s, vstr);
00211 
00212     return rpmhdrLoadTag(h, vstr);
00213 }
00214 
00215 static void
00216 initProperties(VALUE klass)
00217 {
00218     rb_define_method(klass, "debug", rpmhdr_debug_get, 0);
00219     rb_define_method(klass, "debug=", rpmhdr_debug_set, 1);
00220     rb_define_method(klass, "[]", rpmhdr__get, 1);
00221 }
00222 
00223 /* --- Object ctors/dtors */
00224 static void
00225 rpmhdr_free(Header h)
00226 {
00227 if (_debug)
00228 fprintf(stderr, "==> %s(%p)\n", __FUNCTION__, h);
00229 
00230     h = headerFree(h);
00231 }
00232 
00233 static VALUE
00234 rpmhdr_new(int argc, VALUE *argv, VALUE s)
00235 {
00236     Header h;
00237 
00238     rb_scan_args(argc, argv, "00");
00239 
00240     h = headerNew();
00241 
00242 if (_debug)
00243 fprintf(stderr, "==> %s(%p[%d], 0x%lx) mi %p\n", __FUNCTION__, argv, argc, s, h);
00244     return Data_Wrap_Struct(s, 0, rpmhdr_free, h);
00245 }
00246 
00247 /* --- Class initialization */
00248 void
00249 Init_rpmhdr(void)
00250 {
00251     rpmhdrClass = rb_define_class("Hdr", rb_cObject);
00252 if (_debug)
00253 fprintf(stderr, "==> %s() rpmhdrClass 0x%lx\n", __FUNCTION__, rpmhdrClass);
00254 #ifdef  NOTYET
00255     rb_include_module(rpmhdrClass, rb_mEnumerable);
00256 #endif
00257     rb_define_singleton_method(rpmhdrClass, "new", rpmhdr_new, -1);
00258     initProperties(rpmhdrClass);
00259     initMethods(rpmhdrClass);
00260 }
00261 
00262 VALUE
00263 rpmrb_NewHdr(void *_h)
00264 {
00265     return Data_Wrap_Struct(rpmhdrClass, 0, rpmhdr_free, _h);
00266 }