#ifndef H_HEADER_METHOD #define H_HEADER_METHOD /** \ingroup header * \file rpmdb/header_method.h * Header method prototypes */ #include /** \ingroup header * Create new (empty) header instance. * @return header */ typedef Header (*HDRnew) (void); /** \ingroup header * Dereference a header instance. * @param h header * @return NULL always */ typedef Header (*HDRfree) (Header h); /** \ingroup header * Reference a header instance. * @param h header * @return referenced header instance */ typedef Header (*HDRlink) (Header h); /** \ingroup header * Dereference a header instance. * @param h header * @return NULL always */ typedef Header (*HDRunlink) (Header h); /** \ingroup header * Sort tags in header. * @todo Eliminate from API. * @param h header */ typedef void (*HDRsort) (Header h); /** \ingroup header * Restore tags in header to original ordering. * @todo Eliminate from API. * @param h header */ typedef void (*HDRunsort) (Header h); /** \ingroup header * Return size of on-disk header representation in bytes. * @param h header * @param magicp include size of 8 bytes for (magic, 0)? * @return size of on-disk header */ typedef unsigned int (*HDRsizeof) (Header h, enum hMagic magicp); /** \ingroup header * Convert header to on-disk representation. * @param h header (with pointers) * @return on-disk header blob (i.e. with offsets) */ typedef void * (*HDRunload) (Header h); /** \ingroup header * Convert header to on-disk representation, and then reload. * This is used to insure that all header data is in one chunk. * @param h header (with pointers) * @param tag region tag * @return on-disk header (with offsets) */ typedef Header (*HDRreload) (Header h, int tag); /** \ingroup header * Duplicate a header. * @param h header * @return new header instance */ typedef Header (*HDRcopy) (Header h); /** \ingroup header * Convert header to in-memory representation. * @param uh on-disk header blob (i.e. with offsets) * @return header */ typedef Header (*HDRload) (void * uh); /** \ingroup header * Make a copy and convert header to in-memory representation. * @param uh on-disk header blob (i.e. with offsets) * @return header */ typedef Header (*HDRcopyload) (const void * uh); /** \ingroup header * Read (and load) header from file handle. * @param fd file handle * @param magicp read (and verify) 8 bytes of (magic, 0)? * @return header (or NULL on error) */ typedef Header (*HDRread) (FD_t fd, enum hMagic magicp); /** \ingroup header * Write (with unload) header to file handle. * @param fd file handle * @param h header * @param magicp prefix write with 8 bytes of (magic, 0)? * @return 0 on success, 1 on error */ typedef int (*HDRwrite) (FD_t fd, Header h, enum hMagic magicp); /** \ingroup header * Check if tag is in header. * @param h header * @param tag tag * @return 1 on success, 0 on failure */ typedef int (*HDRisentry) (Header h, int32_t tag); /** \ingroup header * Free data allocated when retrieved from header. * @param h header * @param data address of data (or NULL) * @param type type of data (or -1 to force free) * @return NULL always */ typedef void * (*HDRfreetag) (Header h, const void * data, rpmTagType type); /** \ingroup header * Retrieve tag value. * Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with * RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE * entry is present). * * @param h header * @param tag tag * @retval type address of tag value data type (or NULL) * @retval p address of pointer to tag value(s) (or NULL) * @retval c address of number of values (or NULL) * @return 1 on success, 0 on failure */ typedef int (*HDRget) (Header h, int32_t tag, hTYP_t type, void ** p, hCNT_t c); /** \ingroup header * Retrieve tag value using header internal array. * Get an entry using as little extra RAM as possible to return the tag value. * This is only an issue for RPM_STRING_ARRAY_TYPE. * * @param h header * @param tag tag * @retval type address of tag value data type (or NULL) * @retval p address of pointer to tag value(s) (or NULL) * @retval c address of number of values (or NULL) * @return 1 on success, 0 on failure */ typedef int (*HDRgetmin) (Header h, int32_t tag, hTYP_t type, hPTR_t * p, hCNT_t c); /** \ingroup header * Add tag to header. * Duplicate tags are okay, but only defined for iteration (with the * exceptions noted below). While you are allowed to add i18n string * arrays through this function, you probably don't mean to. See * headerAddI18NString() instead. * * @param h header * @param tag tag * @param type tag value data type * @param p pointer to tag value(s) * @param c number of values * @return 1 on success, 0 on failure */ typedef int (*HDRadd) (Header h, int32_t tag, int32_t type, const void * p, int32_t c); /** \ingroup header * Append element to tag array in header. * Appends item p to entry w/ tag and type as passed. Won't work on * RPM_STRING_TYPE. Any pointers into header memory returned from * headerGetEntryMinMemory() for this entry are invalid after this * call has been made! * * @param h header * @param tag tag * @param type tag value data type * @param p pointer to tag value(s) * @param c number of values * @return 1 on success, 0 on failure */ typedef int (*HDRappend) (Header h, int32_t tag, int32_t type, const void * p, int32_t c); /** \ingroup header * Add or append element to tag array in header. * @todo Arg "p" should have const. * @param h header * @param tag tag * @param type tag value data type * @param p pointer to tag value(s) * @param c number of values * @return 1 on success, 0 on failure */ typedef int (*HDRaddorappend) (Header h, int32_t tag, int32_t type, const void * p, int32_t c); /** \ingroup header * Add locale specific tag to header. * A NULL lang is interpreted as the C locale. Here are the rules: * \verbatim * - If the tag isn't in the header, it's added with the passed string * as new value. * - If the tag occurs multiple times in entry, which tag is affected * by the operation is undefined. * - If the tag is in the header w/ this language, the entry is * *replaced* (like headerModifyEntry()). * \endverbatim * This function is intended to just "do the right thing". If you need * more fine grained control use headerAddEntry() and headerModifyEntry(). * * @param h header * @param tag tag * @param string tag value * @param lang locale * @return 1 on success, 0 on failure */ typedef int (*HDRaddi18n) (Header h, int32_t tag, const char * string, const char * lang); /** \ingroup header * Modify tag in header. * If there are multiple entries with this tag, the first one gets replaced. * @param h header * @param tag tag * @param type tag value data type * @param p pointer to tag value(s) * @param c number of values * @return 1 on success, 0 on failure */ typedef int (*HDRmodify) (Header h, int32_t tag, int32_t type, const void * p, int32_t c); /** \ingroup header * Delete tag in header. * Removes all entries of type tag from the header, returns 1 if none were * found. * * @param h header * @param tag tag * @return 0 on success, 1 on failure (INCONSISTENT) */ typedef int (*HDRremove) (Header h, int32_t tag); /** \ingroup header * Return formatted output string from header tags. * The returned string must be free()d. * * @param h header * @param fmt format to use * @param tags array of tag name/value pairs * @param extensions chained table of formatting extensions. * @retval errmsg error message (if any) * @return formatted output string (malloc'ed) */ typedef char * (*HDRsprintf) (Header h, const char * fmt, const struct headerTagTableEntry_s * tags, const struct headerSprintfExtension_s * extensions, errmsg_t * errmsg); /** \ingroup header * Duplicate tag values from one header into another. * @param headerFrom source header * @param headerTo destination header * @param tagstocopy array of tags that are copied */ typedef void (*HDRcopytags) (Header headerFrom, Header headerTo, hTAG_t tagstocopy); /** \ingroup header * Destroy header tag iterator. * @param hi header tag iterator * @return NULL always */ typedef HeaderIterator (*HDRfreeiter) (HeaderIterator hi); /** \ingroup header * Create header tag iterator. * @param h header * @return header tag iterator */ typedef HeaderIterator (*HDRinititer) (Header h); /** \ingroup header * Return next tag from header. * @param hi header tag iterator * @retval tag address of tag * @retval type address of tag value data type * @retval p address of pointer to tag value(s) * @retval c address of number of values * @return 1 on success, 0 on failure */ typedef int (*HDRnextiter) (HeaderIterator hi, hTAG_t tag, hTYP_t type, hPTR_t * p, hCNT_t c); /** \ingroup header * Header method vectors. */ typedef struct HV_s * HV_t; struct HV_s { HDRlink hdrlink; HDRunlink hdrunlink; HDRfree hdrfree; HDRnew hdrnew; HDRsort hdrsort; HDRunsort hdrunsort; HDRsizeof hdrsizeof; HDRunload hdrunload; HDRreload hdrreload; HDRcopy hdrcopy; HDRload hdrload; HDRcopyload hdrcopyload; HDRread hdrread; HDRwrite hdrwrite; HDRisentry hdrisentry; HDRfreetag hdrfreetag; HDRget hdrget; HDRgetmin hdrgetmin; HDRadd hdradd; HDRappend hdrappend; HDRaddorappend hdraddorappend; HDRaddi18n hdraddi18n; HDRmodify hdrmodify; HDRremove hdrremove; HDRsprintf hdrsprintf; HDRcopytags hdrcopytags; HDRfreeiter hdrfreeiter; HDRinititer hdrinititer; HDRnextiter hdrnextiter; void * hdrvecs; void * hdrdata; int hdrversion; }; #endif /* H_HEADER_METHOD */