more refactors..
[carveJwlIkooP6JGAAIwe30JlM.git] / addon.c
diff --git a/addon.c b/addon.c
index 29b24a020ba59bf01fba14f3c3fc17f8d564d623..d408654100b3d5c5a8a0d66c7e7a45993c59fe08 100644 (file)
--- 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; count<addon_system.registry_type_counts[type]; i++ ){
+      addon_reg *reg = &addon_system.registry[i];
+      if( reg->type == 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; i<addon_system.registry_count; i++ ){
       addon_reg *reg = &addon_system.registry[i];
@@ -207,8 +238,10 @@ VG_STATIC addon_reg *addon_mount_local_addon( const char *folder,
 
    if( reg->metadata_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 */