X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bindings%2Fsolv.i;h=3f88a8b4c556413234b571fd4f7e8f437d6c50a4;hb=05baf54bdf745b05c54355438ab9155a8e64c346;hp=1f9259bbec942cbfd090adb760a435f530a29bec;hpb=62741a85012555a654ef675beda65e0d92c6e4a2;p=platform%2Fupstream%2Flibsolv.git diff --git a/bindings/solv.i b/bindings/solv.i index 1f9259b..3f88a8b 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -10,6 +10,53 @@ %markfunc Pool "mark_Pool"; #endif +# +# binaryblob handling +# + +%{ +typedef struct { + const void *data; + size_t len; +} BinaryBlob; +%} + +%typemap(in,noblock=1,fragment="SWIG_AsCharPtrAndSize") (const unsigned char *str, size_t len) (int res, char *buf = 0, size_t size = 0, int alloc = 0) { + res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); + if (!SWIG_IsOK(res)) { +#if defined(SWIGPYTHON) + const void *pybuf = 0; + Py_ssize_t pysize = 0; + res = PyObject_AsReadBuffer($input, &pybuf, &pysize); + if (res < 0) { + %argument_fail(res, "BinaryBlob", $symname, $argnum); + } else { + buf = (void *)pybuf; + size = pysize; + } +#else + %argument_fail(res, "const char *", $symname, $argnum); +#endif + } + $1 = (unsigned char *)buf; + $2 = size; +} + +%typemap(freearg,noblock=1,match="in") (const unsigned char *str, int len) { + if (alloc$argnum == SWIG_NEWOBJ) %delete_array(buf$argnum); +} + +%typemap(out,noblock=1,fragment="SWIG_FromCharPtrAndSize") BinaryBlob { +#if defined(SWIGPYTHON) && defined(PYTHON3) + $result = $1.data ? Py_BuildValue("y#", $1.data, $1.len) : SWIG_Py_Void(); +#else + $result = SWIG_FromCharPtrAndSize($1.data, $1.len); +#if defined(SWIGPERL) + argvi++; +#endif +#endif +} + #if defined(SWIGPYTHON) %typemap(in) Queue { /* Check if is a list */ @@ -65,7 +112,6 @@ #endif - #if defined(SWIGPERL) %typemap(in) Queue { AV *av; @@ -190,15 +236,15 @@ # work around a swig bug %{ #undef SWIG_CALLXS -#ifdef PERL_OBJECT -# define SWIG_CALLXS(_name) TOPMARK=MARK-PL_stack_base;_name(cv,pPerl) -#else -# ifndef MULTIPLICITY -# define SWIG_CALLXS(_name) TOPMARK=MARK-PL_stack_base;_name(cv) -# else -# define SWIG_CALLXS(_name) TOPMARK=MARK-PL_stack_base;_name(PERL_GET_THX, cv) -# endif -#endif +#ifdef PERL_OBJECT +# define SWIG_CALLXS(_name) TOPMARK=MARK-PL_stack_base;_name(cv,pPerl) +#else +# ifndef MULTIPLICITY +# define SWIG_CALLXS(_name) TOPMARK=MARK-PL_stack_base;_name(cv) +# else +# define SWIG_CALLXS(_name) TOPMARK=MARK-PL_stack_base;_name(PERL_GET_THX, cv) +# endif +#endif %} @@ -314,7 +360,6 @@ typedef VALUE AppObjectPtr; #endif -%include "cdata.i" #ifdef SWIGPYTHON %include "file.i" #else @@ -360,7 +405,7 @@ SWIG_AsValDepId(VALUE obj, int *val) { SWIG_AsValDepId(void *obj, int *val) { #endif static swig_type_info* desc = 0; - void *vptr = 0; + void *vptr = 0; int ecode; if (!desc) desc = SWIG_TypeQuery("Dep *"); ecode = SWIG_AsVal_int(obj, val); @@ -376,7 +421,18 @@ SWIG_AsValDepId(void *obj, int *val) { } - +%typemap(out) disown_helper { +#ifdef SWIGRUBY + SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Pool, SWIG_POINTER_DISOWN | 0 ); +#endif +#ifdef SWIGPYTHON + SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Pool, SWIG_POINTER_DISOWN | 0 ); +#endif +#ifdef SWIGPERL + SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_Pool, SWIG_POINTER_DISOWN | 0 ); +#endif + $result = SWIG_From_int((int)(0)); +} %include "typemaps.i" @@ -406,6 +462,7 @@ typedef int bool; #include "pool.h" #include "poolarch.h" +#include "evr.h" #include "solver.h" #include "policy.h" #include "solverdebug.h" @@ -457,7 +514,6 @@ typedef int bool; #define SOLVER_SOLUTION_REPLACE_VENDORCHANGE -104 #define SOLVER_SOLUTION_REPLACE_NAMECHANGE -105 -typedef struct chksum Chksum; typedef void *AppObjectPtr; typedef Id DepId; @@ -554,6 +610,8 @@ typedef struct { typedef Dataiterator Datamatch; +typedef int disown_helper; + %} #ifdef SWIGRUBY @@ -659,6 +717,15 @@ typedef struct { typedef struct { } Chksum; +#ifdef ENABLE_PUBKEY +typedef struct { + Id const htype; + unsigned int const created; + unsigned int const expires; + const char * const keyid; +} Solvsig; +#endif + %rename(xfopen) solvfp_xfopen; %rename(xfopen_fd) solvfp_xfopen_fd; @@ -781,6 +848,7 @@ typedef struct { static const Id SOLVER_CLEANDEPS = SOLVER_CLEANDEPS; static const Id SOLVER_FORCEBEST = SOLVER_FORCEBEST; static const Id SOLVER_TARGETED = SOLVER_TARGETED; + static const Id SOLVER_NOTBYUSER = SOLVER_NOTBYUSER; static const Id SOLVER_SETEV = SOLVER_SETEV; static const Id SOLVER_SETEVR = SOLVER_SETEVR; static const Id SOLVER_SETARCH = SOLVER_SETARCH; @@ -915,7 +983,7 @@ typedef struct { %extend Chksum { Chksum(Id type) { - return (Chksum *)solv_chksum_create(type); + return solv_chksum_create(type); } Chksum(Id type, const char *hex) { unsigned char buf[64]; @@ -924,19 +992,19 @@ typedef struct { return 0; if (solv_hex2bin(&hex, buf, sizeof(buf)) != l || hex[0]) return 0; - return (Chksum *)solv_chksum_create_from_bin(type, buf); + return solv_chksum_create_from_bin(type, buf); } ~Chksum() { solv_chksum_free($self, 0); } Id const type; %{ - SWIGINTERN Id Chksum_type_get(Chksum *chksum) { - return solv_chksum_get_type(chksum); + SWIGINTERN Id Chksum_type_get(Chksum *chk) { + return solv_chksum_get_type(chk); } %} - void add(const char *str) { - solv_chksum_add($self, str, strlen((char *)str)); + void add(const unsigned char *str, size_t len) { + solv_chksum_add($self, str, (int)len); } void add_fp(FILE *fp) { char buf[4096]; @@ -970,11 +1038,14 @@ typedef struct { solv_chksum_add($self, &stb.st_size, sizeof(stb.st_size)); solv_chksum_add($self, &stb.st_mtime, sizeof(stb.st_mtime)); } - SWIGCDATA raw() { + BinaryBlob raw() { + BinaryBlob bl; int l; const unsigned char *b; b = solv_chksum_get($self, &l); - return cdata_void((void *)b, l); + bl.data = b; + bl.len = l; + return bl; } %newobject hex; char *hex() { @@ -987,6 +1058,9 @@ typedef struct { solv_bin2hex(b, l, ret); return ret; } + const char *typestr() { + return solv_chksum_type2str(solv_chksum_get_type($self)); + } bool __eq__(Chksum *chk) { int l; @@ -1042,8 +1116,6 @@ typedef struct { Pool *pool = pool_create(); return pool; } - ~Pool() { - } void set_debuglevel(int level) { pool_setdebuglevel($self, level); } @@ -1143,10 +1215,18 @@ typedef struct { } #endif - void free() { + ~Pool() { Pool_set_loadcallback($self, 0); pool_free($self); } + disown_helper free() { + Pool_set_loadcallback($self, 0); + pool_free($self); + return 0; + } + disown_helper disown() { + return 0; + } Id str2id(const char *str, bool create=1) { return pool_str2id($self, str, create); } @@ -1201,7 +1281,11 @@ typedef struct { } %newobject Dataiterator; - Dataiterator *Dataiterator(Id p, Id key, const char *match, int flags) { + Dataiterator *Dataiterator(Id key, const char *match = 0, int flags = 0) { + return new_Dataiterator($self, 0, 0, key, match, flags); + } + %newobject Dataiterator_solvid; + Dataiterator *Dataiterator_solvid(Id p, Id key, const char *match = 0, int flags = 0) { return new_Dataiterator($self, 0, p, key, match, flags); } const char *solvid2str(Id solvid) { @@ -1453,8 +1537,14 @@ rb_eval_string( } #endif %newobject add_pubkey; - XSolvable *add_pubkey(const char *key, int flags = 0) { - return new_XSolvable($self->pool, repo_add_pubkey($self, key, flags)); + XSolvable *add_pubkey(const char *keyfile, int flags = 0) { + return new_XSolvable($self->pool, repo_add_pubkey($self, keyfile, flags)); + } + bool add_keyring(FILE *fp, int flags = 0) { + return repo_add_keyring($self, fp, flags); + } + bool add_keydir(const char *keydir, const char *suffix, int flags = 0) { + return repo_add_keydir($self, keydir, suffix, flags); } #endif #ifdef ENABLE_RPMMD @@ -1531,8 +1621,12 @@ rb_eval_string( } %newobject Dataiterator; - Dataiterator *Dataiterator(Id p, Id key, const char *match, int flags) { - return new_Dataiterator($self->pool, $self, p, key, match, flags); + Dataiterator *Dataiterator(Id key, const char *match = 0, int flags = 0) { + return new_Dataiterator($self->pool, $self, 0, key, match, flags); + } + %newobject Dataiterator_meta; + Dataiterator *Dataiterator_meta(Id key, const char *match = 0, int flags = 0) { + return new_Dataiterator($self->pool, $self, SOLVID_META, key, match, flags); } Id const id; @@ -1615,6 +1709,13 @@ rb_eval_string( return sel; } +#ifdef ENABLE_PUBKEY + %newobject find_pubkey; + XSolvable *find_pubkey(const char *keyid) { + return new_XSolvable($self->pool, repo_find_pubkey($self, keyid)); + } +#endif + bool __eq__(Repo *repo) { return $self == repo; } @@ -1667,14 +1768,12 @@ rb_eval_string( solv_free($self); } #if defined(SWIGPYTHON) - %newobject __iter__; - Dataiterator *__iter__() { - Dataiterator *ndi; - ndi = solv_calloc(1, sizeof(*ndi)); - dataiterator_init_clone(ndi, $self); - return ndi; + %pythoncode { + def __iter__(self): return self } +#ifndef PYTHON3 %rename("next") __next__(); +#endif %exception __next__ { $action if (!result) { @@ -1683,11 +1782,9 @@ rb_eval_string( } } #endif - #ifdef SWIGPERL perliter(solv::Dataiterator) #endif - %newobject __next__; Datamatch *__next__() { Dataiterator *ndi; @@ -1796,7 +1893,7 @@ rb_eval_string( return r; } %newobject Dataiterator; - Dataiterator *Dataiterator(Id key, const char *match, int flags) { + Dataiterator *Dataiterator(Id key, const char *match = 0, int flags = 0) { Pool *pool = $self->repo->pool; Datapos oldpos = pool->pos; Dataiterator *di; @@ -1814,40 +1911,67 @@ rb_eval_string( } %newobject solvable; XSolvable * const solvable; + Id const key_id; + const char * const key_idstr; + Id const type_id; + const char * const type_idstr; + Id const id; + const char * const idstr; + const char * const str; + BinaryBlob const binary; + unsigned long long const num; + unsigned int const num2; %{ SWIGINTERN XSolvable *Datamatch_solvable_get(Dataiterator *di) { return new_XSolvable(di->pool, di->solvid); } - %} - Id key_id() { - return $self->key->name; + SWIGINTERN Id Datamatch_key_id_get(Dataiterator *di) { + return di->key->name; } - const char *key_idstr() { - return pool_id2str($self->pool, $self->key->name); + SWIGINTERN const char *Datamatch_key_idstr_get(Dataiterator *di) { + return pool_id2str(di->pool, di->key->name); } - Id type_id() { - return $self->key->type; + SWIGINTERN Id Datamatch_type_id_get(Dataiterator *di) { + return di->key->type; } - const char *type_idstr() { - return pool_id2str($self->pool, $self->key->type); + SWIGINTERN const char *Datamatch_type_idstr_get(Dataiterator *di) { + return pool_id2str(di->pool, di->key->type); } - Id id() { - return $self->kv.id; + SWIGINTERN Id Datamatch_id_get(Dataiterator *di) { + return di->kv.id; } - const char *idstr() { - return pool_id2str($self->pool, $self->kv.id); + SWIGINTERN const char *Datamatch_idstr_get(Dataiterator *di) { + if (di->data && (di->key->type == REPOKEY_TYPE_DIR || di->key->type == REPOKEY_TYPE_DIRSTRARRAY || di->key->type == REPOKEY_TYPE_DIRNUMNUMARRAY)) + return repodata_dir2str(di->data, di->kv.id, 0); + if (di->data && di->data->localpool) + return stringpool_id2str(&di->data->spool, di->kv.id); + return pool_id2str(di->pool, di->kv.id); } - const char *str() { - return $self->kv.str; + SWIGINTERN const char * const Datamatch_str_get(Dataiterator *di) { + return di->kv.str; + } + SWIGINTERN BinaryBlob Datamatch_binary_get(Dataiterator *di) { + BinaryBlob bl; + bl.data = 0; + bl.len = 0; + if (di->key->type == REPOKEY_TYPE_BINARY) + { + bl.data = di->kv.str; + bl.len = di->kv.num; + } + else if ((bl.len = solv_chksum_len(di->key->type)) != 0) + bl.data = di->kv.str; + return bl; } - unsigned long long num() { - if ($self->key->type == REPOKEY_TYPE_NUM) - return SOLV_KV_NUM64(&$self->kv); - return $self->kv.num; + SWIGINTERN unsigned long long Datamatch_num_get(Dataiterator *di) { + if (di->key->type == REPOKEY_TYPE_NUM) + return SOLV_KV_NUM64(&di->kv); + return di->kv.num; } - int num2() { - return $self->kv.num2; + SWIGINTERN unsigned int Datamatch_num2_get(Dataiterator *di) { + return di->kv.num2; } + %} %newobject pos; Datapos *pos() { Pool *pool = $self->pool; @@ -1869,12 +1993,16 @@ rb_eval_string( return pos; } #if defined(SWIGPERL) - %rename("str") __str__; + /* cannot use str here because swig reports a bogus conflict... */ + %rename("stringify") __str__; + %perlcode { + *solv::Datamatch::str = *solvc::Datamatch_stringify; + } #endif const char *__str__() { - if (!repodata_stringify($self->pool, $self->data, $self->key, &$self->kv, $self->flags)) - return ""; - return $self->kv.str; + KeyValue kv = $self->kv; + const char *str = repodata_stringify($self->pool, $self->data, $self->key, &kv, SEARCH_FILES | SEARCH_CHECKSUMS); + return str ? str : ""; } } @@ -1886,14 +2014,12 @@ rb_eval_string( return s; } #if defined(SWIGPYTHON) - %newobject __iter__; - Pool_solvable_iterator *__iter__() { - Pool_solvable_iterator *s; - s = solv_calloc(1, sizeof(*s)); - *s = *$self; - return s; + %pythoncode { + def __iter__(self): return self } +#ifndef PYTHON3 %rename("next") __next__(); +#endif %exception __next__ { $action if (!result) { @@ -1902,7 +2028,6 @@ rb_eval_string( } } #endif - #ifdef SWIGPERL perliter(solv::Pool_solvable_iterator) #endif @@ -1944,14 +2069,12 @@ rb_eval_string( return s; } #if defined(SWIGPYTHON) - %newobject __iter__; - Pool_repo_iterator *__iter__() { - Pool_repo_iterator *s; - s = solv_calloc(1, sizeof(*s)); - *s = *$self; - return s; + %pythoncode { + def __iter__(self): return self } +#ifndef PYTHON3 %rename("next") __next__(); +#endif %exception __next__ { $action if (!result) { @@ -1960,6 +2083,9 @@ rb_eval_string( } } #endif +#ifdef SWIGPERL + perliter(solv::Pool_repo_iterator) +#endif %newobject __next__; Repo *__next__() { Pool *pool = $self->pool; @@ -1999,14 +2125,12 @@ rb_eval_string( return s; } #if defined(SWIGPYTHON) - %newobject __iter__; - Repo_solvable_iterator *__iter__() { - Repo_solvable_iterator *s; - s = solv_calloc(1, sizeof(*s)); - *s = *$self; - return s; + %pythoncode { + def __iter__(self): return self } +#ifndef PYTHON3 %rename("next") __next__(); +#endif %exception __next__ { $action if (!result) { @@ -2015,6 +2139,9 @@ rb_eval_string( } } #endif +#ifdef SWIGPERL + perliter(solv::Repo_solvable_iterator) +#endif %newobject __next__; XSolvable *__next__() { Repo *repo = $self->repo; @@ -2167,7 +2294,7 @@ rb_eval_string( return solvable_lookup_location($self->pool->solvables + $self->id, OUTPUT); } %newobject Dataiterator; - Dataiterator *Dataiterator(Id key, const char *match, int flags) { + Dataiterator *Dataiterator(Id key, const char *match = 0, int flags = 0) { return new_Dataiterator($self->pool, 0, $self->id, key, match, flags); } #ifdef SWIGRUBY @@ -2324,6 +2451,16 @@ rb_eval_string( return sel; } +#ifdef SWIGRUBY + %rename("identical?") identical; +#endif + bool identical(XSolvable *s2) { + return solvable_identical($self->pool->solvables + $self->id, s2->pool->solvables + s2->id); + } + int evrcmp(XSolvable *s2) { + return pool_evrcmp($self->pool, $self->pool->solvables[$self->id].evr, s2->pool->solvables[s2->id].evr, EVRCMP_COMPARE); + } + bool __eq__(XSolvable *s) { return $self->pool == s->pool && $self->id == s->id; } @@ -2555,9 +2692,9 @@ rb_eval_string( if ($self->type == SOLVER_SOLUTION_JOB || SOLVER_SOLUTION_POOLJOB) return new_Job($self->solv->pool, SOLVER_NOOP, 0); if ($self->type == SOLVER_SOLUTION_INFARCH || $self->type == SOLVER_SOLUTION_DISTUPGRADE || $self->type == SOLVER_SOLUTION_BEST) - return new_Job($self->solv->pool, SOLVER_INSTALL|SOLVER_SOLVABLE|extraflags, $self->p); + return new_Job($self->solv->pool, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_NOTBYUSER|extraflags, $self->p); if ($self->type == SOLVER_SOLUTION_REPLACE || $self->type == SOLVER_SOLUTION_REPLACE_DOWNGRADE || $self->type == SOLVER_SOLUTION_REPLACE_ARCHCHANGE || $self->type == SOLVER_SOLUTION_REPLACE_VENDORCHANGE || $self->type == SOLVER_SOLUTION_REPLACE_NAMECHANGE) - return new_Job($self->solv->pool, SOLVER_INSTALL|SOLVER_SOLVABLE|extraflags, $self->rp); + return new_Job($self->solv->pool, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_NOTBYUSER|extraflags, $self->rp); if ($self->type == SOLVER_SOLUTION_ERASE) return new_Job($self->solv->pool, SOLVER_ERASE|SOLVER_SOLVABLE|extraflags, $self->p); return 0; @@ -2617,6 +2754,10 @@ rb_eval_string( static const int SOLVER_FLAG_NO_INFARCHCHECK = SOLVER_FLAG_NO_INFARCHCHECK; static const int SOLVER_FLAG_BEST_OBEY_POLICY = SOLVER_FLAG_BEST_OBEY_POLICY; static const int SOLVER_FLAG_NO_AUTOTARGET = SOLVER_FLAG_NO_AUTOTARGET; + static const int SOLVER_FLAG_DUP_ALLOW_DOWNGRADE = SOLVER_FLAG_DUP_ALLOW_DOWNGRADE; + static const int SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE = SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE; + static const int SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE = SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE; + static const int SOLVER_FLAG_DUP_ALLOW_NAMECHANGE = SOLVER_FLAG_DUP_ALLOW_NAMECHANGE; static const int SOLVER_REASON_UNRELATED = SOLVER_REASON_UNRELATED; static const int SOLVER_REASON_UNIT_RULE = SOLVER_REASON_UNIT_RULE; @@ -3016,3 +3157,24 @@ rb_eval_string( } } +#ifdef ENABLE_PUBKEY +%extend Solvsig { + Solvsig(FILE *fp) { + return solvsig_create(fp); + } + ~Solvsig() { + solvsig_free($self); + } + %newobject Chksum; + Chksum *Chksum() { + return $self->htype ? (Chksum *)solv_chksum_create($self->htype) : 0; + } +#ifdef ENABLE_PGPVRFY + %newobject verify; + XSolvable *verify(Repo *repo, Chksum *chksum) { + Id p = solvsig_verify($self, repo, chksum); + return new_XSolvable(repo->pool, p); + } +#endif +} +#endif