virtypedparam.h 6.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * virtypedparam.h: managing typed parameters
 *
 * Copyright (C) 2011-2012 Red Hat, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library.  If not, see
O
Osier Yang 已提交
18
 * <http://www.gnu.org/licenses/>.
19 20 21
 *
 */

22
#pragma once
23

24 25
#include "internal.h"
#include "virenum.h"
26

27 28 29 30 31 32
/**
 * VIR_TYPED_PARAM_MULTIPLE:
 *
 * Flag indicating that the params has multiple occurrences of the parameter.
 * Only used as a flag for @type argument of the virTypedParamsValidate.
 */
33
#define VIR_TYPED_PARAM_MULTIPLE (1U << 31)
34

35
G_STATIC_ASSERT(!(VIR_TYPED_PARAM_LAST & VIR_TYPED_PARAM_MULTIPLE));
36

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
typedef struct _virTypedParameterRemoteValue virTypedParameterRemoteValue;
typedef struct virTypedParameterRemoteValue *virTypedParameterRemoteValuePtr;

struct _virTypedParameterRemoteValue {
    int type;
    union {
        int i; /* exempt from syntax-check */
        unsigned int ui;
        long long int l;
        unsigned long long int ul;
        double d;
        char b;
        char *s;
    } remote_typed_param_value;
};

typedef struct _virTypedParameterRemote *virTypedParameterRemotePtr;

struct _virTypedParameterRemote {
    char *field;
    virTypedParameterRemoteValue value;
};


61 62
int virTypedParamsValidate(virTypedParameterPtr params, int nparams,
                           /* const char *name, int type ... */ ...)
63
    G_GNUC_NULL_TERMINATED G_GNUC_WARN_UNUSED_RESULT;
64

65 66 67 68 69
bool virTypedParamsCheck(virTypedParameterPtr params,
                         int nparams,
                         const char **names,
                         int nnames);

70 71 72 73 74 75 76 77 78 79
int
virTypedParamsGetStringList(virTypedParameterPtr params,
                            int nparams,
                            const char *name,
                            const char ***values);
int
virTypedParamsFilter(virTypedParameterPtr params,
                     int nparams,
                     const char *name,
                     virTypedParameterPtr **ret)
80
    G_GNUC_WARN_UNUSED_RESULT;
81 82


83
int virTypedParameterAssign(virTypedParameterPtr param, const char *name,
E
Eric Blake 已提交
84
                            int type, /* TYPE arg */ ...)
85
    G_GNUC_WARN_UNUSED_RESULT;
86

87 88 89 90 91
int virTypedParamsReplaceString(virTypedParameterPtr *params,
                                int *nparams,
                                const char *name,
                                const char *value);

92 93 94 95
int virTypedParamsCopy(virTypedParameterPtr *dst,
                       virTypedParameterPtr src,
                       int nparams);

96 97
char *virTypedParameterToString(virTypedParameterPtr param);

98 99 100
void virTypedParamsRemoteFree(virTypedParameterRemotePtr remote_params_val,
                              unsigned int remote_params_len);

101 102 103 104 105 106
int virTypedParamsDeserialize(virTypedParameterRemotePtr remote_params,
                              unsigned int remote_params_len,
                              int limit,
                              virTypedParameterPtr *params,
                              int *nparams);

107 108
int virTypedParamsSerialize(virTypedParameterPtr params,
                            int nparams,
109
                            int limit,
110 111 112 113
                            virTypedParameterRemotePtr *remote_params_val,
                            unsigned int *remote_params_len,
                            unsigned int flags);

114
VIR_ENUM_DECL(virTypedParameter);
115

116
#define VIR_TYPED_PARAMS_DEBUG(params, nparams) \
117 118 119 120 121 122 123 124 125 126 127 128
    do { \
        int _i; \
        if (!params) \
            break; \
        for (_i = 0; _i < (nparams); _i++) { \
            char *_value = virTypedParameterToString((params) + _i); \
            VIR_DEBUG("params[\"%s\"]=(%s)%s", \
                      (params)[_i].field, \
                      virTypedParameterTypeToString((params)[_i].type), \
                      NULLSTR(_value)); \
            VIR_FREE(_value); \
        } \
129
    } while (0)
130 131 132 133 134 135 136 137 138 139 140

typedef struct _virTypedParamList virTypedParamList;
typedef virTypedParamList *virTypedParamListPtr;

struct _virTypedParamList {
    virTypedParameterPtr par;
    size_t npar;
    size_t par_alloc;
};

void virTypedParamListFree(virTypedParamListPtr list);
141
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virTypedParamList, virTypedParamListFree);
142 143 144 145 146 147 148 149

size_t virTypedParamListStealParams(virTypedParamListPtr list,
                                    virTypedParameterPtr *params);

int virTypedParamListAddInt(virTypedParamListPtr list,
                            int value,
                            const char *namefmt,
                            ...)
150
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;
151 152 153 154
int virTypedParamListAddUInt(virTypedParamListPtr list,
                             unsigned int value,
                             const char *namefmt,
                             ...)
155
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;
156 157 158 159
int virTypedParamListAddLLong(virTypedParamListPtr list,
                              long long value,
                              const char *namefmt,
                              ...)
160
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;
161 162 163 164
int virTypedParamListAddULLong(virTypedParamListPtr list,
                               unsigned long long value,
                               const char *namefmt,
                               ...)
165
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;
166 167 168 169
int virTypedParamListAddString(virTypedParamListPtr list,
                               const char *value,
                               const char *namefmt,
                               ...)
170
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;
171 172 173 174
int virTypedParamListAddBoolean(virTypedParamListPtr list,
                                bool value,
                                const char *namefmt,
                                ...)
175
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;
176 177 178 179
int virTypedParamListAddDouble(virTypedParamListPtr list,
                               double value,
                               const char *namefmt,
                               ...)
180
    G_GNUC_PRINTF(3, 4) G_GNUC_WARN_UNUSED_RESULT;