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.

133 lines
3.2 KiB
C

#define _GNU_SOURCE
#include "activity.h"
#include "activity/context.h"
#include "ffdb/fs_list.h"
#include "collections/array.h"
#include "model/server.h"
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct ap_activity* ap_activity_new()
{
struct ap_activity* act = malloc(sizeof(struct ap_activity));
memset(act,0,sizeof(struct ap_activity));
return act;
}
struct ap_activity* ap_activity_dup( struct ap_activity* act )
{
struct ap_activity* new_act = ap_activity_new();
new_act->id = strdup(act->id);
new_act->local_id = act->local_id;
new_act->type = act->type;
new_act->actor = strdup(act->actor);
array_dup( &new_act->to, sizeof(char*), &act->to );
for( int i = 0; i < new_act->to.count; ++i ) {
new_act->to.items[i] = strdup(new_act->to.items[i]);
}
array_dup( &new_act->cc, sizeof(char*), &act->cc );
for( int i = 0; i < new_act->cc.count; ++i ) {
new_act->cc.items[i] = strdup(new_act->cc.items[i]);
}
array_dup( &new_act->bcc, sizeof(char*), &act->bcc );
for( int i = 0; i < new_act->bcc.count; ++i ) {
new_act->bcc.items[i] = strdup(new_act->bcc.items[i]);
}
switch( act->object.tag ) {
case apaot_ref:
new_act->object.ref = strdup(act->object.ref);
break;
case apaot_activity:
new_act->object.ptr = ap_activity_dup(act->object.ptr);
break;
}
new_act->object.tag = act->object.tag;
if( act->state ) {
new_act->state = strdup( act->state );
}
if( act->has_signature ) {
new_act->has_signature = true;
new_act->signature.type = act->signature.type;
new_act->signature.creator = strdup(act->signature.creator);
new_act->signature.created = act->signature.created;
new_act->signature.value = strdup(act->signature.value);
}
return new_act;
}
void ap_activity_free( struct ap_activity* act )
{
if( !act ) { return; }
ap_activity_free_composite(act);
free(act);
}
void ap_activity_free_composite( struct ap_activity* act )
{
free(act->id);
free(act->actor);
for( int i = 0; i < act->to.count; ++i ) {
free(act->to.items[i]);
}
free(act->to.items);
for( int i = 0; i < act->cc.count; ++i ) {
free(act->cc.items[i]);
}
free(act->cc.items);
for( int i = 0; i < act->bcc.count; ++i ) {
free(act->bcc.items[i]);
}
free(act->bcc.items);
switch( act->object.tag ) {
case apaot_ref:
free( act->object.ref );
break;
case apaot_activity:
ap_activity_free( act->object.ptr );
act->object.ptr = 0;
break;
};
free( act->state );
free( act->signature.creator );
free( act->signature.value );
}
struct ap_activity* ap_activity_create_accept( struct ap_activity* act )
{
int id = fs_list_get("data/activities/HEAD") + 1;
fs_list_set( "data/activities/HEAD", id );
char* act_id; asprintf( &act_id,"https://%s/activity/%d", g_server_name, id );
char* actor; asprintf( &actor, "https://%s/owner/actor", g_server_name );
struct ap_activity* accept = malloc(sizeof(struct ap_activity));
memset(accept,0,sizeof(*accept));
accept->id = act_id;
accept->local_id = id;
accept->type = apat_accept;
accept->actor = actor;
char* new_act_actor = strdup(act->actor);
array_append( &accept->to, sizeof(char*), &new_act_actor );
accept->object.tag = apaot_activity;
accept->object.ptr = ap_activity_dup(act);
return accept;
}