add basic controls to ent_routes
[carveJwlIkooP6JGAAIwe30JlM.git] / addon.c
diff --git a/addon.c b/addon.c
index c387edd6379a7f29cb893e15045e2a0e06bd5fb9..fcec0b9f6e8ba945dc8d46a6197ef750368819c5 100644 (file)
--- 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; count<addon_system.registry_type_counts[alias->type]; 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;
 }
@@ -718,7 +758,7 @@ static u16 addon_cache_create_viewer( enum addon_type type, u16 reg_id ){
 static u16 addon_cache_create_viewer_from_uid( enum addon_type type,
                                                char uid[ADDON_UID_MAX] ){
    addon_alias q;
-   addon_uid_to_alias( uid, &q );
+   if( !addon_uid_to_alias( uid, &q ) ) return 0;
    if( q.type != type ) return 0;
 
    u32 reg_id = addon_match( &q );