X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=addon.c;h=b599c304a04e2c91f3965460774db4ba22bd6864;hb=b1d22bbb87583cea9fde7620eb1fc16189be5113;hp=29b24a020ba59bf01fba14f3c3fc17f8d564d623;hpb=92ba950580dd4877935e90682cd4f66fead8fed2;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/addon.c b/addon.c index 29b24a0..b599c30 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 ); @@ -155,14 +185,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 +217,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 +379,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 */