// save mission to a file BOOL CFREDDoc::OnSaveDocument(LPCTSTR pathname) { CFred_mission_save save; char name[1024]; int len; DWORD attrib; FILE *fp; len = strlen(pathname); strcpy(name, pathname); if (name[len - 4] == '.') len -= 4; name[len] = 0; // drop extension while (len--) if ((name[len] == '\\') || (name[len] == ':')) break; strcpy(Mission_filename, name + len + 1); Fred_view_wnd->global_error_check(); if (Briefing_dialog) { Briefing_dialog->update_data(1); Briefing_dialog->save_editor_state(); } if (Event_editor_dlg) Fred_main_wnd->MessageBox("Event editor dialog is still open, so changes there won't be saved"); if (Message_editor_dlg) Fred_main_wnd->MessageBox("Message editor dialog is still open, so changes there won't be saved"); fp = fopen(pathname, "r"); if (fp) { fclose(fp); attrib = GetFileAttributes(pathname); if (attrib & FILE_ATTRIBUTE_READONLY) { Fred_main_wnd->MessageBox("File is read-only. You need to check it out before saving to it"); return FALSE; } } if (save.save_mission_file((char *) pathname)) { Fred_main_wnd->MessageBox("An error occured while saving!", NULL, MB_OK | MB_ICONEXCLAMATION); return FALSE; } SetModifiedFlag(FALSE); if (load_mission((char *) pathname)) Error(LOCATION, "Failed attempting to reload mission after saving. Report this bug now!"); if (Briefing_dialog) { Briefing_dialog->restore_editor_state(); Briefing_dialog->update_data(1); } return TRUE; // return CDocument::OnSaveDocument(pathname); }
void CFREDDoc::OnFileImportFSM() { char fs1_mission_path[MAX_PATH_LEN]; char fs2_mission_path[MAX_PATH_LEN]; char dest_directory[MAX_PATH + 1]; // path stuff { char *ch; // get base paths strcpy_s(fs1_mission_path, Fred_exe_dir); ch = strrchr(fs1_mission_path, DIR_SEPARATOR_CHAR); if (ch != NULL) *ch = '\0'; strcpy_s(fs2_mission_path, Fred_exe_dir); ch = strrchr(fs2_mission_path, DIR_SEPARATOR_CHAR); if (ch != NULL) *ch = '\0'; // estimate the mission path for FS1 if ((ch = stristr(fs1_mission_path, "FreeSpace2")) != NULL) { strcpy(ch, "FreeSpace\\Data\\Missions"); } // estimate the mission path for FS2 strcat_s(fs2_mission_path, "\\Data\\Missions"); } // if mission has been modified, offer to save before continuing. if (!SaveModified()) return; // get location to import from CFileDialog dlgFile(TRUE, "fsm", NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_ALLOWMULTISELECT, "FreeSpace Missions (*.fsm)|*.fsm|All files (*.*)|*.*||"); dlgFile.m_ofn.lpstrTitle = "Select one or more missions to import"; dlgFile.m_ofn.lpstrInitialDir = fs1_mission_path; // get FSM files if (dlgFile.DoModal() != IDOK) return; memset(dest_directory, 0, sizeof(dest_directory)); // get location to save to #if ( _MFC_VER >= 0x0700 ) //ITEMIDLIST fs2_mission_pidl = {0}; //SHParseDisplayName(A2CW(fs2_mission_path), NULL, fs2_mission_pidl, 0, 0); BROWSEINFO bi; bi.hwndOwner = theApp.GetMainWnd()->GetSafeHwnd(); //bi.pidlRoot = &fs2_mission_pidl; bi.pidlRoot = NULL; bi.pszDisplayName = dest_directory; bi.lpszTitle = "Select a location to save in"; bi.ulFlags = 0; bi.lpfn = NULL; bi.lParam = NULL; bi.iImage = NULL; LPCITEMIDLIST ret_val = SHBrowseForFolder(&bi); if (ret_val == NULL) return; SHGetPathFromIDList(ret_val, dest_directory); #else CFolderDialog dlgFolder(_T("Select a location to save in"), fs2_mission_path, NULL); if (dlgFolder.DoModal() != IDOK) return; strcpy_s(dest_directory, dlgFolder.GetFolderPath()); #endif // clean things up first if (Briefing_dialog) Briefing_dialog->icon_select(-1); clear_mission(); // process all missions POSITION pos(dlgFile.GetStartPosition()); while (pos) { char *ch; char filename[1024]; char fs1_path[MAX_PATH_LEN]; char dest_path[MAX_PATH_LEN]; CString fs1_path_mfc(dlgFile.GetNextPathName(pos)); CFred_mission_save save; DWORD attrib; FILE *fp; // path name too long? if (strlen(fs1_path_mfc) > MAX_PATH_LEN - 1) continue; // nothing here? if (!strlen(fs1_path_mfc)) continue; // get our mission strcpy_s(fs1_path, fs1_path_mfc); // load mission into memory if (load_mission(fs1_path, MPF_IMPORT_FSM)) continue; // get filename ch = strrchr(fs1_path, DIR_SEPARATOR_CHAR) + 1; if (ch != NULL) strcpy_s(filename, ch); else strcpy_s(filename, fs1_path); // truncate extension ch = strrchr(filename, '.'); if (ch != NULL) *ch = '\0'; // add new extension strcat_s(filename, ".fs2"); strcpy_s(Mission_filename, filename); // get new path strcpy_s(dest_path, dest_directory); strcat_s(dest_path, "\\"); strcat_s(dest_path, filename); // check attributes fp = fopen(dest_path, "r"); if (fp) { fclose(fp); attrib = GetFileAttributes(dest_path); if (attrib & FILE_ATTRIBUTE_READONLY) continue; } // try to save it if (save.save_mission_file(dest_path)) continue; // success } create_new_mission(); MessageBox(NULL, "Import complete. Please check the destination folder to verify all missions were imported successfully.", "Status", MB_OK); recreate_dialogs(); }