strongswan/src/libimcv/pts/components/pts_comp_func_name.c

163 lines
3.7 KiB
C

/*
* Copyright (C) 2011-2014 Andreas Steffen
*
* HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* 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.
*/
#include "imcv.h"
#include "pts/components/pts_comp_func_name.h"
#include <utils/debug.h>
typedef struct private_pts_comp_func_name_t private_pts_comp_func_name_t;
/**
* Private data of a pts_comp_func_name_t object.
*
*/
struct private_pts_comp_func_name_t {
/**
* Public pts_comp_func_name_t interface.
*/
pts_comp_func_name_t public;
/**
* PTS Component Functional Name Vendor ID
*/
u_int32_t vid;
/**
* PTS Component Functional Name
*/
u_int32_t name;
/**
* PTS Component Functional Name Qualifier
*/
u_int8_t qualifier;
};
METHOD(pts_comp_func_name_t, get_vendor_id, u_int32_t,
private_pts_comp_func_name_t *this)
{
return this->vid;
}
METHOD(pts_comp_func_name_t, get_name, u_int32_t,
private_pts_comp_func_name_t *this)
{
return this->name;
}
METHOD(pts_comp_func_name_t, get_qualifier, u_int8_t,
private_pts_comp_func_name_t *this)
{
return this->qualifier;
}
METHOD(pts_comp_func_name_t, set_qualifier, void,
private_pts_comp_func_name_t *this, u_int8_t qualifier)
{
this->qualifier = qualifier;
}
static bool equals(private_pts_comp_func_name_t *this,
private_pts_comp_func_name_t *other)
{
if (this->vid != other->vid || this->name != other->name)
{
return FALSE;
}
if (this->qualifier == PTS_QUALIFIER_UNKNOWN ||
other->qualifier == PTS_QUALIFIER_UNKNOWN)
{
return TRUE;
}
/* TODO handle qualifier wildcards */
return this->qualifier == other->qualifier;
}
METHOD(pts_comp_func_name_t, clone_, pts_comp_func_name_t*,
private_pts_comp_func_name_t *this)
{
private_pts_comp_func_name_t *clone;
clone = malloc_thing(private_pts_comp_func_name_t);
memcpy(clone, this, sizeof(private_pts_comp_func_name_t));
return &clone->public;
}
METHOD(pts_comp_func_name_t, log_, void,
private_pts_comp_func_name_t *this, char *label)
{
enum_name_t *names, *types;
char flags[8];
int type;
names = imcv_pts_components->get_comp_func_names(imcv_pts_components,
this->vid);
types = imcv_pts_components->get_qualifier_type_names(imcv_pts_components,
this->vid);
type = imcv_pts_components->get_qualifier(imcv_pts_components,
&this->public, flags);
if (names && types)
{
DBG2(DBG_PTS, "%s%N functional component '%N' [%s] '%N'",
label, pen_names, this->vid, names, this->name, flags, types, type);
}
else
{
DBG2(DBG_PTS, "%s0x%06x functional component 0x%08x 0x%02x",
label, this->vid, this->name, this->qualifier);
}
}
METHOD(pts_comp_func_name_t, destroy, void,
private_pts_comp_func_name_t *this)
{
free(this);
}
/**
* See header
*/
pts_comp_func_name_t* pts_comp_func_name_create(u_int32_t vid, u_int32_t name,
u_int8_t qualifier)
{
private_pts_comp_func_name_t *this;
INIT(this,
.public = {
.get_vendor_id = _get_vendor_id,
.get_name = _get_name,
.get_qualifier = _get_qualifier,
.set_qualifier = _set_qualifier,
.equals = (bool(*)(pts_comp_func_name_t*,pts_comp_func_name_t*))equals,
.clone = _clone_,
.log = _log_,
.destroy = _destroy,
},
.vid = vid,
.name = name,
.qualifier = qualifier,
);
return &this->public;
}