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
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;
|
|
}
|
|
|