+ char path_buf[4096];
+ vg_str folder;
+ vg_strnull( &folder, path_buf, 4096 );
+
+ if( workshop_form.submission.type == k_workshop_file_type_board ){
+ vg_strcat( &folder, "boards/" );
+ }
+ else if( workshop_form.submission.type == k_workshop_file_type_world ){
+ vg_strcat( &folder, "maps/" );
+ }
+ vg_strcat( &folder, workshop_form.addon_folder );
+
+ if( !vg_strgood(&folder) ){
+ vg_error( "addon folder path too long\n" );
+ vg_async_call( workshop_async_any_complete, NULL, 0 );
+ return;
+ }
+
+ /*
+ * Create the metadata file
+ * -----------------------------------------------------------------------*/
+ u8 descriptor_buf[ 512 ];
+ vg_msg descriptor;
+ vg_msg_init( &descriptor, descriptor_buf, 512 );
+ vg_msg_frame( &descriptor, "workshop" );
+ vg_msg_wkvstr( &descriptor, "title", workshop_form.submission.title );
+ //vg_msg_wkvstr( &descriptor, "author", "unknown" );
+ vg_msg_wkvuint( &descriptor, "type",
+ u32 value=workshop_form.submission.type);
+ vg_msg_wkvstr( &descriptor, "folder", workshop_form.addon_folder );
+ vg_msg_end_frame( &descriptor );
+ //vg_msg_wkvstr( &descriptor, "location", "USA" );
+ //
+ vg_linear_clear( vg_mem.scratch );
+ char *descriptor_str = vg_linear_alloc( vg_mem.scratch,
+ vg_align8(descriptor.cur*2+1) );
+ vg_bin_str( descriptor_buf, descriptor_str, descriptor.cur );
+ descriptor_str[descriptor.cur*2] = '\0';
+ vg_info( "binstr: %s\n", descriptor_str );
+
+ 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;
+ }
+
+ 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, 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", d_name );
+ break;
+ }
+ }
+ vg_dir_close(&dir);
+
+ vg_str descriptor_file = folder;
+ vg_strcat( &descriptor_file, "/addon.inf" );
+ if( !vg_strgood(&descriptor_file) ){
+ vg_error( "Addon info path too long\n" );
+ vg_async_call( workshop_async_any_complete, NULL, 0 );
+ return;
+ }
+
+ FILE *fp = fopen( descriptor_file.buffer, "wb" );
+ if( !fp ){
+ vg_error( "Could not open addon info file '%s'\n",
+ descriptor_file.buffer );
+ vg_async_call( workshop_async_any_complete, NULL, 0 );
+ return;
+ }
+ fwrite( descriptor_buf, descriptor.cur, 1, fp );
+ fclose( fp );
+
+ /* Save the preview
+ * -----------------------------------------------------------------------*/
+ vg_str preview = folder;
+ vg_strcat( &preview, "/preview.jpg" );
+
+ if( !vg_strgood(&preview) ){
+ vg_error( "preview image path too long\n" );
+ vg_async_call( workshop_async_any_complete, NULL, 0 );
+ return;
+ }
+