X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=addon.c;h=ef92b0083ce4f1ba1c6a49a39d2a0e4c4a191aea;hb=137d40d96fe923600d8378b8e138e3c276f27ff4;hp=4ac9f91bc1443fc096b0e2d59329fe133051c3df;hpb=730f202673d6ceb2a5199cf244d5c0bddc064fcf;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/addon.c b/addon.c index 4ac9f91..ef92b00 100644 --- a/addon.c +++ b/addon.c @@ -43,7 +43,11 @@ static u32 get_index_from_addon( enum addon_type type, addon_reg *a ){ } static u32 addon_match( addon_alias *alias ){ - u32 foldername_djb2 = vg_strdjb2( alias->foldername ); + if( alias->type == k_addon_type_none ) return 0xffffffff; + + u32 foldername_djb2 = 0; + if( !alias->workshop_id ) + foldername_djb2 = vg_strdjb2( alias->foldername ); u32 count = 0; for( u32 i=0; counttype]; i++ ){ @@ -83,6 +87,32 @@ static void addon_alias_uid( addon_alias *alias, char buf[ADDON_UID_MAX] ){ } } +/* + * equality check + */ +static int addon_alias_eq( addon_alias *a, addon_alias *b ){ + if( a->type == b->type ){ + if( a->workshop_id == b->workshop_id ){ + if( a->workshop_id ) + return 1; + else + return !strcmp( a->foldername, b->foldername ); + } + else + return 0; + } + else return 0; +} + +/* + * make alias represent NULL. + */ +static void invalidate_addon_alias( addon_alias *alias ){ + alias->type = k_addon_type_none; + alias->workshop_id = 0; + alias->foldername[0] = '\0'; +} + /* * parse uid to alias. returns 1 if successful */ @@ -95,8 +125,14 @@ static int addon_uid_to_alias( char uid[ADDON_UID_MAX], addon_alias *alias ){ * | * location */ - if( strlen(uid) < 13 ) return 0; - if( !((uid[0] == 's') && (uid[1] == 'r')) ) return 0; + if( strlen(uid) < 13 ){ + invalidate_addon_alias( alias ); + return 0; + } + if( !((uid[0] == 's') && (uid[1] == 'r')) ){ + invalidate_addon_alias( alias ); + return 0; + } char type[4]; memcpy( type, uid+2, 3 ); @@ -109,10 +145,14 @@ static int addon_uid_to_alias( char uid[ADDON_UID_MAX], addon_alias *alias ){ if( !strcmp(location,"steam") ) alias->workshop_id = atoll( uid+12 ); - else if( !strcmp(location,"local") ) + else if( !strcmp(location,"local") ){ + alias->workshop_id = 0; vg_strncpy( uid+12, alias->foldername, 64, k_strncpy_always_add_null ); - else + } + else{ + invalidate_addon_alias( alias ); return 0; + } return 1; } @@ -266,14 +306,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 ){ @@ -318,10 +355,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; @@ -354,7 +389,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; @@ -584,12 +619,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 );