X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=addon.c;h=d408654100b3d5c5a8a0d66c7e7a45993c59fe08;hb=fdd41609e59c7df548682b25001f0015dc1acbea;hp=29b24a020ba59bf01fba14f3c3fc17f8d564d623;hpb=92ba950580dd4877935e90682cd4f66fead8fed2;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/addon.c b/addon.c index 29b24a0..d408654 100644 --- a/addon.c +++ b/addon.c @@ -4,6 +4,8 @@ #include "addon.h" #include "vg/vg_msg.h" #include "steam.h" +#include "workshop_types.h" +#include "workshop.h" static u32 addon_count( enum workshop_file_type type ){ return addon_system.registry_type_counts[ type ]; @@ -40,6 +42,34 @@ static u32 get_index_from_addon( enum workshop_file_type type, addon_reg *a ){ return 0xffffffff; } +static u32 addon_match( enum workshop_file_type type, + u64 workshop_id, const char *foldername ){ + u32 foldername_djb2 = vg_strdjb2( foldername ); + + u32 count = 0; + for( u32 i=0; counttype == type ){ + + if( workshop_id ){ + if( workshop_id == reg->workshop_id ) + return count; + } + else{ + if( reg->foldername_hash == foldername_djb2 ){ + if( !strcmp( reg->foldername, foldername ) ){ + return count; + } + } + } + + count ++; + } + } + + return 0xffffffff; +} + static void addon_system_init( void ){ u32 reg_size = sizeof(addon_reg)*ADDON_MOUNTED_MAX; addon_system.registry = vg_linear_alloc( vg_mem.rtmemory, reg_size ); @@ -138,6 +168,7 @@ VG_STATIC void addon_print_info( addon_reg *reg ){ } VG_STATIC void addon_mount_finish( addon_reg *reg ){ + addon_print_info( reg ); addon_system.registry_count ++; } @@ -155,14 +186,14 @@ VG_STATIC addon_reg *addon_mount_workshop_folder( PublishedFileId_t workshop_id, } enum workshop_file_type type = k_workshop_file_type_none; - vg_msg root; - vg_msg_init( &root, reg->metadata, reg->metadata_len ); + vg_msg root = {0}; + root.buf = reg->metadata; + root.len = reg->metadata_len; + root.max = sizeof(reg->metadata); + vg_msg workshop = root; if( vg_msg_seekframe( &workshop, "workshop", k_vg_msg_first )){ - vg_msg_cmd kv_type = vg_msg_seekkv( &workshop, "type", k_vg_msg_first ); - if( kv_type.code & k_vg_msg_code_integer ){ - type = kv_type.value._u32; - } + type = vg_msg_seekkvu32( &workshop, "type", k_vg_msg_first ); } if( type == k_workshop_file_type_none ){ @@ -187,7 +218,7 @@ VG_STATIC addon_reg *addon_mount_local_addon( const char *folder, vg_strnull( &folder_path, folder_path_buf, 4096 ); vg_strcat( &folder_path, folder ); - const char *folder_name = vg_strch( &folder_path, '/' ); + const char *folder_name = vg_strch( &folder_path, '/' )+1; u32 folder_hash = vg_strdjb2(folder_name); for( u32 i=0; imetadata_len == 0 ){ /* create our own content commands */ - vg_msg msg; - vg_msg_init( &msg, reg->metadata, sizeof(reg->metadata) ); + vg_msg msg = {0}; + msg.buf = reg->metadata; + msg.len = 0; + msg.max = sizeof(reg->metadata); u32 content_count = 0; @@ -347,4 +380,35 @@ VG_STATIC void addon_mount_content_folder( enum workshop_file_type type, vg_dir_close(&dir); } +static int addon_get_content_folder( addon_reg *reg, vg_str *folder ){ + if( reg->workshop_id ){ + vg_async_item *call = + vg_async_alloc( sizeof(struct async_workshop_filepath_info) ); + struct async_workshop_filepath_info *info = call->payload; + info->buf = folder->buffer; + info->id = reg->workshop_id; + info->len = folder->len; + vg_async_dispatch( call, async_workshop_get_filepath ); + vg_async_stall(); /* too bad! */ + if( info->buf[0] == '\0' ){ + vg_error( "Failed SteamAPI_GetItemInstallInfo(" PRINTF_U64 ")\n", + reg->workshop_id ); + return 0; + } + folder->i = strlen( folder->buffer ); + return 1; + } + else{ + folder->i = 0; + if( reg->type == k_workshop_file_type_board ) + vg_strcat( folder, "boards/" ); + else if( reg->type == k_workshop_file_type_world ) + vg_strcat( folder, "maps/" ); + else return 0; + + vg_strcat( folder, reg->foldername ); + return 1; + } +} + #endif /* ADDON_C */