X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=addon.c;h=7ebd165756645a7979a06efdbb3377006143570f;hb=74b2136d5b41b18e2eec698f1fd11b503aa1100a;hp=fcec0b9f6e8ba945dc8d46a6197ef750368819c5;hpb=074fa69f479724f9800849430bad5caf730b01ef;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/addon.c b/addon.c index fcec0b9..7ebd165 100644 --- a/addon.c +++ b/addon.c @@ -7,16 +7,40 @@ #include "steam.h" #include "workshop.h" -static u32 addon_count( enum addon_type type ){ - return addon_system.registry_type_counts[ type ]; +static u32 addon_count( enum addon_type type, u32 ignoreflags ){ + if( ignoreflags ){ + u32 typecount = 0, count = 0; + for( u32 i=0; typecountalias.type == type ){ + typecount ++; + + if( reg->flags & ignoreflags ) + continue; + + count ++; + } + } + + return count; + } + else + return addon_system.registry_type_counts[ type ]; } + /* these kind of suck, oh well. */ -static addon_reg *get_addon_from_index(enum addon_type type, u32 index){ - u32 count = 0; - for( u32 i=0; countalias.type == type ){ + typecount ++; + + if( reg->flags & ignoreflags ) + continue; + if( index == count ) return reg; @@ -116,7 +140,7 @@ static void invalidate_addon_alias( addon_alias *alias ){ /* * parse uid to alias. returns 1 if successful */ -static int addon_uid_to_alias( char uid[ADDON_UID_MAX], addon_alias *alias ){ +static int addon_uid_to_alias( const char *uid, addon_alias *alias ){ /* 1 * 01234567890123 * sr&&&-@@@@@-#* @@ -230,6 +254,7 @@ static addon_reg *addon_alloc_reg( PublishedFileId_t workshop_id, } addon_reg *reg = &addon_system.registry[ addon_system.registry_count ]; + reg->flags = 0; reg->metadata_len = 0; reg->cache_id = 0; reg->state = k_addon_state_indexed; @@ -306,14 +331,11 @@ static addon_reg *addon_mount_workshop_folder( PublishedFileId_t workshop_id, } enum addon_type type = k_addon_type_none; - vg_msg root = {0}; - root.buf = reg->metadata; - root.len = reg->metadata_len; - root.max = sizeof(reg->metadata); + vg_msg msg; + vg_msg_init( &msg, reg->metadata, reg->metadata_len ); - vg_msg workshop = root; - if( vg_msg_seekframe( &workshop, "workshop", k_vg_msg_first )){ - type = vg_msg_seekkvu32( &workshop, "type", k_vg_msg_first ); + if( vg_msg_seekframe( &msg, "workshop" )){ + type = vg_msg_getkvu32( &msg, "type", 0 ); } if( type == k_addon_type_none ){ @@ -358,10 +380,8 @@ static addon_reg *addon_mount_local_addon( const char *folder, if( reg->metadata_len == 0 ){ /* create our own content commands */ - vg_msg msg = {0}; - msg.buf = reg->metadata; - msg.len = 0; - msg.max = sizeof(reg->metadata); + vg_msg msg; + vg_msg_init( &msg, reg->metadata, sizeof(reg->metadata) ); u32 content_count = 0; @@ -394,7 +414,7 @@ static addon_reg *addon_mount_local_addon( const char *folder, if( !content_count ) return NULL; if( msg.error == k_vg_msg_error_OK ) - reg->metadata_len = msg.cur; + reg->metadata_len = msg.cur.co; else{ vg_error( "Error creating metadata: %d\n", msg.error ); return NULL; @@ -502,16 +522,30 @@ static void addon_mount_content_folder( enum addon_type type, /* * write the full path of the addon's folder into the vg_str */ -static int addon_get_content_folder( addon_reg *reg, vg_str *folder ){ +static int addon_get_content_folder( addon_reg *reg, vg_str *folder, int async){ if( reg->alias.workshop_id ){ - vg_async_item *call = - vg_async_alloc( sizeof(struct async_workshop_filepath_info) ); - struct async_workshop_filepath_info *info = call->payload; + struct async_workshop_filepath_info *info = NULL; + vg_async_item *call = NULL; + + if( async ){ + call = vg_async_alloc( sizeof(struct async_workshop_filepath_info) ); + info = call->payload; + } + else + info = alloca( sizeof(struct async_workshop_filepath_info) ); + info->buf = folder->buffer; info->id = reg->alias.workshop_id; info->len = folder->len; - vg_async_dispatch( call, async_workshop_get_filepath ); - vg_async_stall(); /* too bad! */ + + if( async ){ + vg_async_dispatch( call, async_workshop_get_filepath ); + vg_async_stall(); /* too bad! */ + } + else { + async_workshop_get_filepath( info, 0 ); + } + if( info->buf[0] == '\0' ){ vg_error( "Failed SteamAPI_GetItemInstallInfo(" PRINTF_U64 ")\n", reg->alias.workshop_id ); @@ -540,8 +574,8 @@ static int addon_get_content_folder( addon_reg *reg, vg_str *folder ){ static u16 addon_cache_fetch( enum addon_type type, u32 reg_index ){ addon_reg *reg = NULL; - if( reg_index < addon_count( type ) ){ - reg = get_addon_from_index( type, reg_index ); + if( reg_index < addon_count( type, 0 ) ){ + reg = get_addon_from_index( type, reg_index, 0 ); if( reg->cache_id ) return reg->cache_id; } @@ -559,8 +593,8 @@ static u16 addon_cache_alloc( enum addon_type type, u32 reg_index ){ struct addon_cache_entry *new_entry = vg_pool_item( &cache->pool, new_id ); addon_reg *reg = NULL; - if( reg_index < addon_count( type ) ) - reg = get_addon_from_index( type, reg_index ); + if( reg_index < addon_count( type, 0 ) ) + reg = get_addon_from_index( type, reg_index, 0 ); if( new_entry ){ if( new_entry->reg_ptr ) @@ -624,12 +658,10 @@ static int addon_cache_load_request( enum addon_type type, u16 id, * --------------------------------- */ vg_str content_path = folder; - vg_msg root = {0}; - root.buf = reg->metadata; - root.len = reg->metadata_len; - root.max = sizeof(reg->metadata); + vg_msg msg; + vg_msg_init( &msg, reg->metadata, reg->metadata_len ); - const char *kv_content = vg_msg_seekkvstr( &root, "content", 0 ); + const char *kv_content = vg_msg_getkvstr( &msg, "content" ); if( kv_content ){ vg_strcat( &content_path, "/" ); vg_strcat( &content_path, kv_content ); @@ -690,7 +722,7 @@ static void addon_cache_load_loop(void){ vg_info( "process cache load request (%u#%u, reg:%u)\n", type, id, entry->reg_index ); - if( entry->reg_index >= addon_count(type) ){ + if( entry->reg_index >= addon_count(type,0) ){ /* should maybe have a different value for this case */ entry->state = k_addon_cache_state_none; SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); @@ -700,12 +732,12 @@ static void addon_cache_load_loop(void){ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); /* continue with the request */ - addon_reg *reg = get_addon_from_index( type, entry->reg_index ); + addon_reg *reg = get_addon_from_index( type, entry->reg_index, 0 ); entry->reg_ptr = reg; vg_str folder; vg_strnull( &folder, path_buf, 4096 ); - if( addon_get_content_folder( reg, &folder ) ){ + if( addon_get_content_folder( reg, &folder, 1 ) ){ if( addon_cache_load_request( type, id, reg, folder ) ){ vg_async_call( async_addon_setstate, entry, k_addon_cache_state_loaded );