+ char path_buf[4096];
+ vg_str folder;
+ vg_strnull( &folder, path_buf, 4096 );
+
+ vg_strcat( &folder, workshop_filetype_folder() );
+ vg_strcat( &folder, workshop_form.addon_folder );
+
+ if( !vg_strgood(&folder) ){
+ vg_error( "addon folder path too long\n" );
+ workshop_form.op = k_workshop_op_none;
+ return;
+ }
+
+ /*
+ * Create the metadata file
+ * -----------------------------------------------------------------------*/
+ u8 descriptor_buf[ 512 ];
+ vg_msg descriptor;
+ vg_msg_init( &descriptor, descriptor_buf, sizeof(descriptor_buf) );
+ vg_linear_clear( vg_mem.scratch );
+
+ /* short description */
+ vg_msg_frame( &descriptor, "workshop" );
+ vg_msg_wkvstr( &descriptor, "title", workshop_form.submission.title );
+ //vg_msg_wkvstr( &descriptor, "author", "unknown" );
+ vg_msg_wkvnum( &descriptor, "type", k_vg_msg_u32, 1,
+ &workshop_form.submission.type );
+ vg_msg_wkvstr( &descriptor, "folder", workshop_form.addon_folder );
+ vg_msg_end_frame( &descriptor );
+ //vg_msg_wkvstr( &descriptor, "location", "USA" );
+
+ char *short_descriptor_str =
+ vg_linear_alloc( vg_mem.scratch, vg_align8(descriptor.cur.co*2+1));
+ vg_bin_str( descriptor_buf, short_descriptor_str, descriptor.cur.co );
+ short_descriptor_str[descriptor.cur.co*2] = '\0';
+ vg_info( "binstr: %s\n", short_descriptor_str );
+
+ vg_dir dir;
+ if( !vg_dir_open( &dir, folder.buffer ) ){
+ vg_error( "could not open addon folder '%s'\n", folder.buffer );
+ workshop_form.op = k_workshop_op_none;
+ 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" );
+ workshop_form.op = k_workshop_op_none;
+ return;
+ }
+
+ FILE *fp = fopen( descriptor_file.buffer, "wb" );
+ if( !fp ){
+ vg_error( "Could not open addon info file '%s'\n",
+ descriptor_file.buffer );
+ workshop_form.op = k_workshop_op_none;
+ return;
+ }
+ fwrite( descriptor_buf, descriptor.cur.co, 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" );
+ workshop_form.op = k_workshop_op_none;
+ return;
+ }
+