#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 ];
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 );
}
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 ){
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];
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;
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 */