/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright (C) 2010 Red Hat, Inc.
*
* This program is free software: you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include "result.h"
#include "result-private.h"
#include "error.h"
struct QCDMResult {
guint32 refcount;
GHashTable *hash;
};
static void
gvalue_destroy (gpointer data)
{
GValue *value = (GValue *) data;
g_value_unset (value);
g_slice_free (GValue, value);
}
QCDMResult *
qcdm_result_new (void)
{
QCDMResult *result;
g_type_init ();
result = g_malloc0 (sizeof (QCDMResult));
result->hash = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, gvalue_destroy);
result->refcount = 1;
return result;
}
QCDMResult *
qcdm_result_ref (QCDMResult *result)
{
g_return_val_if_fail (result != NULL, NULL);
g_return_val_if_fail (result->refcount > 0, NULL);
result->refcount++;
return result;
}
void
qcdm_result_unref (QCDMResult *result)
{
g_return_if_fail (result != NULL);
g_return_if_fail (result->refcount > 0);
result->refcount--;
if (result->refcount == 0) {
g_hash_table_destroy (result->hash);
memset (result, 0, sizeof (QCDMResult));
g_free (result);
}
}
void
qcdm_result_add_string (QCDMResult *result,
const char *key,
const char *str)
{
GValue *val;
g_return_if_fail (result != NULL);
g_return_if_fail (result->refcount > 0);
g_return_if_fail (key != NULL);
g_return_if_fail (str != NULL);
val = g_slice_new0 (GValue);
g_value_init (val, G_TYPE_STRING);
g_value_set_string (val, str);
g_hash_table_insert (result->hash, (gpointer) key, val);
}
gboolean
qcdm_result_get_string (QCDMResult *result,
const char *key,
const char **out_val)
{
GValue *val;
g_return_val_if_fail (result != NULL, FALSE);
g_return_val_if_fail (result->refcount > 0, FALSE);
g_return_val_if_fail (key != NULL, FALSE);
g_return_val_if_fail (out_val != NULL, FALSE);
g_return_val_if_fail (*out_val == NULL, FALSE);
val = g_hash_table_lookup (result->hash, key);
if (!val)
return FALSE;
g_warn_if_fail (G_VALUE_HOLDS_STRING (val));
if (!G_VALUE_HOLDS_STRING (val))
return FALSE;
*out_val = g_value_get_string (val);
return TRUE;
}
void
qcdm_result_add_uint8 (QCDMResult *result,
const char *key,
guint8 num)
{
GValue *val;
g_return_if_fail (result != NULL);
g_return_if_fail (result->refcount > 0);
g_return_if_fail (key != NULL);
val = g_slice_new0 (GValue);
g_value_init (val, G_TYPE_UCHAR);
g_value_set_uchar (val, (unsigned char) num);
g_hash_table_insert (result->hash, (gpointer) key, val);
}
gboolean
qcdm_result_get_uint8 (QCDMResult *result,
const char *key,
guint8 *out_val)
{
GValue *val;
g_return_val_if_fail (result != NULL, FALSE);
g_return_val_if_fail (result->refcount > 0, FALSE);
g_return_val_if_fail (key != NULL, FALSE);
g_return_val_if_fail (out_val != NULL, FALSE);
val = g_hash_table_lookup (result->hash, key);
if (!val)
return FALSE;
g_warn_if_fail (G_VALUE_HOLDS_UCHAR (val));
if (!G_VALUE_HOLDS_UCHAR (val))
return FALSE;
*out_val = (guint8) g_value_get_uchar (val);
return TRUE;
}
void
qcdm_result_add_uint32 (QCDMResult *result,
const char *key,
guint32 num)
{
GValue *val;
g_return_if_fail (result != NULL);
g_return_if_fail (result->refcount > 0);
g_return_if_fail (key != NULL);
val = g_slice_new0 (GValue);
g_value_init (val, G_TYPE_UINT);
g_value_set_uint (val, num);
g_hash_table_insert (result->hash, (gpointer) key, val);
}
gboolean
qcdm_result_get_uint32 (QCDMResult *result,
const char *key,
guint32 *out_val)
{
GValue *val;
g_return_val_if_fail (result != NULL, FALSE);
g_return_val_if_fail (result->refcount > 0, FALSE);
g_return_val_if_fail (key != NULL, FALSE);
g_return_val_if_fail (out_val != NULL, FALSE);
val = g_hash_table_lookup (result->hash, key);
if (!val)
return FALSE;
g_warn_if_fail (G_VALUE_HOLDS_UINT (val));
if (!G_VALUE_HOLDS_UINT (val))
return FALSE;
*out_val = (guint32) g_value_get_uint (val);
return TRUE;
}
void
qcdm_result_add_boxed (QCDMResult *result,
const char *key,
GType btype,
gpointer boxed)
{
GValue *val;
g_return_if_fail (result != NULL);
g_return_if_fail (result->refcount > 0);
g_return_if_fail (key != NULL);
val = g_slice_new0 (GValue);
g_value_init (val, btype);
g_value_set_static_boxed (val, boxed);
g_hash_table_insert (result->hash, (gpointer) key, val);
}
gboolean
qcdm_result_get_boxed (QCDMResult *result,
const char *key,
gpointer *out_val)
{
GValue *val;
g_return_val_if_fail (result != NULL, FALSE);
g_return_val_if_fail (result->refcount > 0, FALSE);
g_return_val_if_fail (key != NULL, FALSE);
g_return_val_if_fail (out_val != NULL, FALSE);
val = g_hash_table_lookup (result->hash, key);
if (!val)
return FALSE;
g_warn_if_fail (G_VALUE_HOLDS_BOXED (val));
if (!G_VALUE_HOLDS_BOXED (val))
return FALSE;
*out_val = g_value_get_boxed (val);
return TRUE;
}