You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

140 lines
3.7 KiB

#include "Identity.hh"
#include <typeinfo>
#include <pEp/identity_list.h>
namespace pEp {
namespace PythonAdapter {
using namespace std;
Identity::Identity()
: _ident(new_identity(NULL, NULL, NULL, NULL))
{
if (!_ident)
throw bad_alloc();
}
Identity::Identity(const Identity& second)
: _ident(identity_dup(second._ident))
{
if (!_ident)
throw bad_alloc();
}
Identity::Identity(pEp_identity *ident)
: _ident(ident)
{
}
Identity::~Identity()
{
free_identity(_ident);
}
void Identity::attach(pEp_identity *ident)
{
free_identity(_ident);
_ident = ident;
}
pEp_identity *Identity::detach()
{
pEp_identity *new_one = new_identity(NULL, NULL, NULL, NULL);
if (!new_one)
throw bad_alloc();
pEp_identity *ident = _ident;
_ident = new_one;
return ident;
}
void Identity::lang(string value)
{
if (value == "")
memset(_ident->lang, 0, 3);
else if (value.length() != 2)
throw length_error("length of lang must be 2");
else
memcpy(_ident->lang, value.data(), 2);
}
string Identity::lang()
{
return _ident->lang;
}
object identity_attr(pEp_identity *&ident)
{
pEp_identity *_dup;
if (!ident)
_dup = new_identity(NULL, NULL, NULL, NULL);
else
_dup = identity_dup(ident);
if (!_dup)
throw bad_alloc();
Identity *_ident = new Identity(_dup);
return object(_ident);
}
void identity_attr(pEp_identity *&ident, object value)
{
extract< string > extract_string(value);
if (extract_string.check()) {
string str = extract_string();
pEp_identity *_ident = new_identity(str.c_str(), NULL, NULL,
NULL);
if (!_ident)
throw bad_alloc();
free_identity(ident);
ident = _ident;
return;
}
Identity& _ident = extract< Identity& >(value);
free_identity(ident);
ident = _ident.detach();
}
list identitylist_attr(identity_list *&il)
{
list result;
for (identity_list *_il = il; _il && _il->ident; _il = _il->next) {
pEp_identity *ident = identity_dup(_il->ident);
if (!ident)
throw bad_alloc();
result.append(object(Identity(ident)));
}
return result;
}
void identitylist_attr(identity_list *&il, list value)
{
identity_list *_il = new_identity_list(NULL);
if (!_il)
throw bad_alloc();
identity_list *_i = _il;
for (int i=0; i<len(value); i++) {
extract< Identity& > extract_identity(value[i]);
if (!extract_identity.check()) {
free_identity_list(_il);
}
pEp_identity *_ident = extract_identity().detach();
_i = identity_list_add(_i, _ident);
if (!_i) {
free_identity_list(_il);
throw bad_alloc();
}
}
free_identity_list(il);
il = _il;
}
}
}