#define _GNU_SOURCE #include "activity.h" #include "activity/context.h" #include "ffdb/fs_list.h" #include "collections/array.h" #include "model/server.h" #include #include #include #include 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; }