X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=workshop.c;h=bcb8574a016497006818e5ad81084cc8083c7876;hb=96f8ce1f47009e5f763b05566db3f6cca07cdc76;hp=baa537ce5a8bca4dbf361c8ae90c9381d28c8ac4;hpb=b8ff92a2caafa557608b84f4a037a5b3ce2628f7;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/workshop.c b/workshop.c index baa537c..bcb8574 100644 --- a/workshop.c +++ b/workshop.c @@ -1,6 +1,8 @@ #ifndef WORKSHOP_C #define WORKSHOP_C +#include "workshop.h" + #define VG_GAME #include "vg/vg.h" #include "vg/vg_tex.h" @@ -14,97 +16,6 @@ #include "steam.h" #include "highscores.h" -#define WORKSHOP_VIEW_PER_PAGE 15 - -struct workshop_form{ - struct { - char title[80]; - char description[512]; - char author[32]; - struct ui_dropdown_value submission_type_selection; - enum workshop_file_type type; - - PublishedFileId_t file_id; /* 0 if not published yet */ - - struct ui_dropdown_value visibility; - int submit_title, /* set if the respective controls are touched */ - submit_description, - submit_file_and_image; - } - submission; - - enum workshop_form_page{ - k_workshop_form_hidden, - k_workshop_form_open, /* open but not looking at anything */ - k_workshop_form_edit, /* editing a submission */ - k_workshop_form_cclosing, - k_workshop_form_closing_good, /* post upload screen */ - k_workshop_form_closing_bad, - } - page; - - /* model viewer - * ----------------------------- - */ - - char addon_folder[128]; - struct player_board board_model; - - /* what does the user want to do with the image preview? */ - enum workshop_form_file_intent{ - k_workshop_form_file_intent_none, /* loading probably */ - k_workshop_form_file_intent_new, /* board_model is valid */ - k_workshop_form_file_intent_keep_old /* just browsing */ - } - file_intent; - - world_instance *view_world; - ent_swspreview *ptr_ent; - v2f view_angles, - view_angles_begin; - v3f view_offset, - view_offset_begin; - - float view_dist; - int view_changed; - - /* - * published UGC request - * ------------------------------ - */ - - struct { - UGCQueryHandle_t handle; - EResult result; - - int all_item_count, - returned_item_count; - } - ugc_query; - - /* - * UI information - * ------------------------------------------ - */ - - const char *failure_or_success_string; - - int img_w, img_h; - u8 *img_buffer; - - int view_published_page_count, - view_published_page_id; - - struct published_file{ - EResult result; - int result_index; - char title[80]; - } - published_files_list[WORKSHOP_VIEW_PER_PAGE]; - int published_files_list_length; -} -static workshop_form; - static struct ui_dropdown_opt workshop_form_visibility_opts[] = { { "Public", k_ERemoteStoragePublishedFileVisibilityPublic }, { "Unlisted", k_ERemoteStoragePublishedFileVisibilityUnlisted }, @@ -428,32 +339,32 @@ VG_STATIC void _workshop_form_submit_thread( void *data ) descriptor_str[descriptor.cur*2] = '\0'; vg_info( "binstr: %s\n", descriptor_str ); - DIR *dir = opendir( folder.buffer ); - if( !dir ){ + vg_dir dir; + if( !vg_dir_open( &dir, folder.buffer ) ){ vg_error( "could not open addon folder '%s'\n", folder.buffer ); vg_async_call( workshop_async_any_complete, NULL, 0 ); return; } - struct dirent *entry; - while( (entry = readdir(dir)) ){ - if( entry->d_type == DT_REG ){ - if( entry->d_name[0] == '.' ) continue; + while( vg_dir_next_entry(&dir) ){ + if( vg_dir_entry_type(&dir) == k_vg_entry_type_file ){ + const char *d_name = vg_dir_entry_name(&dir); + if( d_name[0] == '.' ) continue; vg_str file = folder; vg_strcat( &file, "/" ); - vg_strcat( &file, entry->d_name ); + vg_strcat( &file, d_name ); if( !vg_strgood( &file ) ) continue; char *ext = vg_strch( &file, '.' ); if( !ext ) continue; if( strcmp(ext,".mdl") ) continue; - vg_msg_wkvstr( &descriptor, "content", entry->d_name ); + vg_msg_wkvstr( &descriptor, "content", d_name ); break; } } - closedir(dir); + vg_dir_close(&dir); vg_str descriptor_file = folder; vg_strcat( &descriptor_file, "/addon.inf" ); @@ -578,8 +489,8 @@ VG_STATIC void _workshop_form_load_thread( void *data ) return; } - DIR *dir = opendir( folder.buffer ); - if( !dir ){ + vg_dir dir; + if( !vg_dir_open( &dir, folder.buffer ) ){ vg_error( "workshop async load failed: could not open folder\n" ); vg_async_call( workshop_form_loadmodel_async_error, NULL, 0 ); return; @@ -588,14 +499,14 @@ VG_STATIC void _workshop_form_load_thread( void *data ) vg_info( "Searching %s for model files\n", folder.buffer ); int found_mdl = 0; - struct dirent *entry; - while( (entry = readdir(dir)) ){ - if( entry->d_type == DT_REG ){ - if( entry->d_name[0] == '.' ) continue; + while( vg_dir_next_entry(&dir) ){ + if( vg_dir_entry_type(&dir) == k_vg_entry_type_file ){ + const char *d_name = vg_dir_entry_name(&dir); + if( d_name[0] == '.' ) continue; vg_str file = folder; vg_strcat( &file, "/" ); - vg_strcat( &file, entry->d_name ); + vg_strcat( &file, d_name ); if( !vg_strgood( &file ) ) continue; char *ext = vg_strch( &file, '.' ); @@ -605,7 +516,7 @@ VG_STATIC void _workshop_form_load_thread( void *data ) break; } } - closedir(dir); + vg_dir_close(&dir); if( !found_mdl ){ vg_error( "workshop async load failed: no model files found\n" ); @@ -754,7 +665,7 @@ VG_STATIC void workshop_op_download_and_view_submission( int result_index ) snprintf( workshop_form.addon_folder, vg_list_size( workshop_form.addon_folder ), - "Steam Cloud (%lu)", details.m_nPublishedFileId ); + "Steam Cloud ("PRINTF_U64")", details.m_nPublishedFileId ); workshop_form.submission.file_id = details.m_nPublishedFileId; workshop_form.file_intent = k_workshop_form_file_intent_keep_old; @@ -769,31 +680,25 @@ VG_STATIC void workshop_op_download_and_view_submission( int result_index ) u32 len = strlen(metadata_str); vg_info( "Metadata: %s\n", metadata_str ); vg_str_bin( metadata_str, metadata_buf, len ); - vg_msg msg; - vg_msg_init( &msg, metadata_buf, len/2 ); + vg_msg root; + vg_msg_init( &root, metadata_buf, len/2 ); - vg_msg_cmd cmd; - while( vg_msg_next( &msg, &cmd ) ){ - if( (msg.depth == 1) && (cmd.code == k_vg_msg_code_frame) ){ - if( VG_STRDJB2_EQ( "workshop", cmd.key, cmd.key_djb2 ) ){ - u32 depth = msg.depth; - while( (msg.depth == depth) && vg_msg_next( &msg, &cmd ) ){ - if( cmd.code & k_vg_msg_code_unsigned ){ - if( VG_STRDJB2_EQ( "type", cmd.key, cmd.key_djb2 ) ){ - workshop_form.submission.type = cmd.value._u32; - workshop_form.submission.submission_type_selection.value = cmd.value._u32; - } - } - else if( cmd.code == k_vg_msg_code_kvstring ){ - if( VG_STRDJB2_EQ( "folder", cmd.key, cmd.key_djb2 ) ){ - vg_strncpy( cmd.value._buf, - workshop_form.addon_folder, - sizeof(workshop_form.addon_folder), - k_strncpy_always_add_null ); - } - } - } - } + vg_msg workshop; + 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 ){ + u32 u = kv_type.value._u32; + workshop_form.submission.type = u; + workshop_form.submission.submission_type_selection.value = u; + } + + const char *kv_folder = vg_msg_seekkvstr( &workshop, "folder", + k_vg_msg_first ); + if( kv_folder ){ + vg_strncpy( kv_folder, workshop_form.addon_folder, + sizeof(workshop_form.addon_folder), + k_strncpy_always_add_null ); } } }