@ -1,9 +1,15 @@
# define _GNU_SOURCE
# include "activity.h"
# include "json/json.h"
# include "fs_list.h"
# include "collections/array.h"
# include "model/server.h"
# include <stddef.h>
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
static struct json_enum ap_signature_type_enum [ ] = {
@ -20,8 +26,10 @@ static struct json_object_field ap_signature_layout[] = {
} ;
static struct json_enum ap_activity_type_enum [ ] = {
{ " Undo " , 1 } ,
{ " Follow " , 2 } ,
{ " Undo " , apat_undo } ,
{ " Follow " , apat_follow } ,
{ " Delete " , apat_delete } ,
{ " Accept " , apat_accept } ,
{ NULL , 0 } ,
} ;
@ -32,6 +40,53 @@ struct ap_activity* ap_activity_new()
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 ;
}
printf ( " duplicated tag = %d \n " , act - > object . tag ) ;
new_act - > object . tag = act - > object . tag ;
new_act - > signature . type = act - > signature . type ;
if ( act - > signature . creator ) {
new_act - > signature . creator = strdup ( act - > signature . creator ) ;
} ;
if ( act - > signature . created ) {
new_act - > signature . created = strdup ( act - > signature . created ) ;
}
if ( act - > signature . value ) {
new_act - > signature . value = strdup ( act - > signature . value ) ;
}
return new_act ;
}
static void * ap_activity_alloc ( )
{
return ( void * ) ap_activity_new ( ) ;
@ -39,6 +94,7 @@ static void* ap_activity_alloc()
void ap_activity_free ( struct ap_activity * act )
{
if ( ! act ) { return ; }
printf ( " ap_activity_free( %p ) \n " , act ) ;
ap_activity_free_composite ( act ) ;
free ( act ) ;
}
@ -62,14 +118,19 @@ void ap_activity_free_composite( struct ap_activity* act )
}
free ( act - > bcc . items ) ;
free ( act - > object . ref ) ;
ap_activity_free ( act - > object . ptr ) ;
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 - > signature . creator ) ;
free ( act - > signature . created ) ;
free ( act - > signature . value ) ;
free ( act ) ;
}
static void ap_activity_free2 ( void * ptr )
{
@ -85,6 +146,12 @@ struct json_field_type ap_activity_type = {
. free = ap_activity_free2 ,
} ;
struct json_object_field activity_ref_types [ ] = {
{ ( char * ) apaot_ref , offsetof ( struct ap_activity , object . ref ) , false , & json_field_string } ,
{ ( char * ) apaot_activity , offsetof ( struct ap_activity , object . ptr ) , false , & json_field_object_pointer , ap_activity_layout } ,
{ NULL } ,
} ;
struct json_object_field ap_activity_layout [ ] = {
{ " id " , offsetof ( struct ap_activity , id ) , true , & json_field_string } ,
{ " type " , offsetof ( struct ap_activity , type ) , true , & json_field_enum , ap_activity_type_enum } ,
@ -92,8 +159,52 @@ struct json_object_field ap_activity_layout[] = {
{ " to " , offsetof ( struct ap_activity , to ) , true , & json_field_array_of , & json_field_string } ,
{ " cc " , offsetof ( struct ap_activity , cc ) , false , & json_field_array_of , & json_field_string } ,
{ " bcc " , offsetof ( struct ap_activity , bcc ) , false , & json_field_array_of , & json_field_string } ,
{ " object " , offsetof ( struct ap_activity , object . ref ) , false , & json_field_string } ,
{ " object " , offsetof ( struct ap_activity , object . ptr ) , false , & json_field_object_pointer , ap_activity_layout } ,
{ " object " , offsetof ( struct ap_activity , object . tag ) , false , & json_field_tagged_union , & activity_ref_types } ,
//{ "object", offsetof( struct ap_activity, object.ref ), false, &json_field_string },
//{ "object", offsetof( struct ap_activity, object.ptr ), false, &json_field_object_pointer, ap_activity_layout },
{ " signature " , offsetof ( struct ap_activity , signature ) , false , & json_field_object_composite , ap_signature_layout } ,
{ NULL , 0 , true , NULL , & ap_activity_type } ,
} ;
void ap_activity_write_to_FILE ( struct ap_activity * act , FILE * f )
{
struct json_writer jw = {
. f = f ,
. indentation = " \t " ,
. indent = 0 ,
} ;
json_write_pretty_object_layout ( & jw , ap_activity_layout , act ) ;
}
struct ap_activity * ap_activity_create_accept ( struct ap_activity * act )
{
int id = fs_list_get ( " data/outbox/HEAD " ) + 1 ;
fs_list_set ( " data/outbox/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 ) ;
printf ( " accept->to = { .count = %d, .items = %p } \n " , accept - > to . count , accept - > to . items ) ;
printf ( " ...->to.items[0] = %s \n " , accept - > to . items [ 0 ] ) ;
accept - > object . tag = apaot_activity ;
accept - > object . ptr = ap_activity_dup ( act ) ;
accept - > signature . type = apst_rsa_signature_2017 ;
accept - > signature . creator = strdup ( actor ) ;
accept - > signature . creator = strdup ( actor ) ;
accept - > signature . created = strdup ( " TBD " ) ;
accept - > signature . value = strdup ( " TBD " ) ;
return accept ;
}