rlm@1: // MovieOpen.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "MovieOpen.h" rlm@1: #include "MainWnd.h" rlm@1: #include "FileDlg.h" rlm@1: #include "WinResUtil.h" rlm@1: #include "WinMiscUtil.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: #include "../gba/GBA.h" rlm@1: #include "../gb/gbGlobals.h" rlm@1: #include "../common/Util.h" rlm@1: #include "7zip/OpenArchive.h" rlm@1: rlm@1: // MovieOpen dialog rlm@1: rlm@1: IMPLEMENT_DYNAMIC(MovieOpen, CDialog) rlm@1: MovieOpen::MovieOpen(CWnd *pParent /*=NULL*/) rlm@1: : CDialog(MovieOpen::IDD, pParent) rlm@1: {} rlm@1: rlm@1: MovieOpen::~MovieOpen() rlm@1: { rlm@1: SetArchiveParentHWND(NULL); rlm@1: } rlm@1: rlm@1: BOOL MovieOpen::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: pauseFrame = 0; rlm@1: ZeroMemory(&movieInfo, sizeof SMovie); rlm@1: rlm@1: SetArchiveParentHWND(GetSafeHwnd()); rlm@1: rlm@1: GetDlgItem(IDC_CHECK_HIDEBORDER)->ShowWindow(FALSE); rlm@1: GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText(""); rlm@1: GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(""); rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText(""); rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_CHECK_PAUSEFRAME)->EnableWindow(FALSE); rlm@1: rlm@1: CheckDlgButton(IDC_READONLY, TRUE); rlm@1: m_editDescription.SetReadOnly(theApp.movieReadOnly); rlm@1: rlm@1: m_editFilename.LimitText(_MAX_PATH); rlm@1: m_editAuthor.LimitText(MOVIE_METADATA_AUTHOR_SIZE); rlm@1: m_editDescription.LimitText(MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: m_editPauseFrame.LimitText(8); rlm@1: rlm@1: // convert the ROM filename into a default movie name rlm@1: CString movieName = winGetDestFilename(theApp.gameFilename, IDS_MOVIE_DIR, ".vbm"); rlm@1: rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(movieName); rlm@1: rlm@1: // scroll to show the rightmost side of the movie filename rlm@1: ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel((DWORD)(movieName.GetLength() - 1), FALSE); rlm@1: rlm@1: OnBnClickedMovieRefresh(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void MovieOpen::DoDataExchange(CDataExchange *pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(MovieCreate) rlm@1: DDX_Control(pDX, IDC_EDIT_AUTHOR, m_editAuthor); rlm@1: DDX_Control(pDX, IDC_EDIT_DESCRIPTION, m_editDescription); rlm@1: DDX_Control(pDX, IDC_MOVIE_FILENAME, m_editFilename); rlm@1: DDX_Control(pDX, IDC_EDIT_PAUSEFRAME, m_editPauseFrame); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(MovieOpen, CDialog) rlm@1: ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse) rlm@1: ON_BN_CLICKED(IDOK, OnBnClickedOk) rlm@1: ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) rlm@1: ON_BN_CLICKED(IDC_MOVIE_REFRESH, OnBnClickedMovieRefresh) rlm@1: ON_BN_CLICKED(IDC_READONLY, OnBnClickedReadonly) rlm@1: ON_BN_CLICKED(IDC_CHECK_PAUSEFRAME, OnBnClickedCheckPauseframe) rlm@1: ON_BN_CLICKED(IDC_CHECK_HIDEBORDER, OnBnClickedHideborder) rlm@1: ON_EN_CHANGE(IDC_MOVIE_FILENAME, OnEnChangeMovieFilename) rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: // MovieOpen message handlers rlm@1: rlm@1: // FIXME: file-scope-global rlm@1: static bool shouldReopenBrowse = false; rlm@1: rlm@1: void MovieOpen::OnBnClickedBrowse() rlm@1: { rlm@1: theApp.winCheckFullscreen(); // FIXME: necessary or not? rlm@1: rlm@1: LPCTSTR exts[] = { ".vbm", NULL }; rlm@1: rlm@1: CString filter = winResLoadFilter(IDS_FILTER_MOVIE); rlm@1: CString title = winResLoadString(IDS_SELECT_MOVIE_NAME); rlm@1: rlm@1: CString movieName = winGetDestFilename(theApp.gameFilename, IDS_MOVIE_DIR, exts[0]); rlm@1: CString movieDir = winGetDestDir(IDS_MOVIE_DIR); rlm@1: rlm@1: FileDlg dlg(this, movieName, filter, 1, "VBM", exts, movieDir, title, false, true); rlm@1: rlm@1: do rlm@1: { rlm@1: shouldReopenBrowse = false; rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: movieName = dlg.GetPathName(); rlm@1: rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(movieName); rlm@1: rlm@1: // SetWindowText calls OnEnChangeMovieFilename which calls OnBnClickedMovieRefresh rlm@1: // so this extra call to OnBnClickedMovieRefresh is bad rlm@1: //OnBnClickedMovieRefresh(); rlm@1: } rlm@1: while (shouldReopenBrowse); rlm@1: rlm@1: // scroll to show the rightmost side of the movie filename rlm@1: ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel((DWORD)(movieName.GetLength() - 1), FALSE); rlm@1: } rlm@1: rlm@1: // some extensions that might commonly be near emulation-related files that we almost certainly can't open, or at least not rlm@1: // directly. rlm@1: // also includes definitely non-movie extensions we know about, since we only use this variable in a movie opening function. rlm@1: // we do this by exclusion instead of inclusion because we don't want to exclude extensions used for any archive files, even rlm@1: // extensionless or unusually-named archives. rlm@1: static const char *s_movieIgnoreExtensions [] = { rlm@1: "gba", "gbc", "gb", "sgb", "cgb", "bin", "agb", "bios", "mb", "elf", "sgm", "clt", "dat", "gbs", "gcf", "spc", rlm@1: "xpc", "pal", "act", "dmp", "avi", "ini", "txt", "nfo", "htm", "html", "jpg", "jpeg", "png", "bmp", "gif", "mp3", rlm@1: "wav", "lnk", "exe", "bat", "sav", "luasav" rlm@1: }; rlm@1: rlm@1: void MovieOpen::OnBnClickedMovieRefresh() rlm@1: { rlm@1: static int recursionDepth = 0; rlm@1: if (recursionDepth > 0) rlm@1: return; rlm@1: struct Scope {Scope(){ ++ recursionDepth; } ~Scope(){ --recursionDepth; }} scope; rlm@1: rlm@1: CString tempName; rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->GetWindowText(tempName); rlm@1: rlm@1: #if 1 rlm@1: // use ObtainFile to support opening files within archives (.7z, .rar, .zip, .zip.rar.7z, etc.) rlm@1: rlm@1: if (movieLogicalName.GetLength() > 2048) movieLogicalName.Truncate(2048); rlm@1: rlm@1: char LogicalName[2048], PhysicalName[2048]; rlm@1: if (ObtainFile(tempName, LogicalName, PhysicalName, "mov", s_movieIgnoreExtensions, rlm@1: sizeof(s_movieIgnoreExtensions) / sizeof(*s_movieIgnoreExtensions))) rlm@1: { rlm@1: if (tempName != LogicalName) rlm@1: { rlm@1: int selStart = 0, selEnd = 0; rlm@1: ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->GetSel(selStart, selEnd); rlm@1: rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(LogicalName); rlm@1: rlm@1: ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel(selStart, selEnd, FALSE); rlm@1: } rlm@1: moviePhysicalName = PhysicalName; rlm@1: movieLogicalName = LogicalName; rlm@1: ReleaseTempFileCategory("mov", PhysicalName); rlm@1: } rlm@1: else rlm@1: { rlm@1: shouldReopenBrowse = true; rlm@1: return; rlm@1: } rlm@1: #else rlm@1: // old version that only supports uncompressed movies rlm@1: moviePhysicalName = tempName; rlm@1: movieLogicalName = tempName; rlm@1: #endif rlm@1: rlm@1: if (VBAMovieGetInfo(moviePhysicalName, &movieInfo) == MOVIE_SUCCESS) rlm@1: { rlm@1: if (movieInfo.readOnly) rlm@1: { rlm@1: CheckDlgButton(IDC_READONLY, TRUE); rlm@1: m_editDescription.SetReadOnly(TRUE); rlm@1: } rlm@1: rlm@1: char buffer[MOVIE_METADATA_SIZE]; rlm@1: rlm@1: strncpy(buffer, movieInfo.authorInfo, MOVIE_METADATA_AUTHOR_SIZE); rlm@1: buffer[MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0'; rlm@1: GetDlgItem(IDC_EDIT_AUTHOR)->SetWindowText(buffer); rlm@1: rlm@1: strncpy(buffer, movieInfo.authorInfo + MOVIE_METADATA_AUTHOR_SIZE, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: buffer[MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0'; rlm@1: GetDlgItem(IDC_EDIT_DESCRIPTION)->SetWindowText(buffer); rlm@1: rlm@1: int option = 2; rlm@1: if (movieInfo.header.startFlags & MOVIE_START_FROM_SRAM) rlm@1: option = 1; rlm@1: if (movieInfo.header.startFlags & MOVIE_START_FROM_SNAPSHOT) rlm@1: option = 0; rlm@1: CheckRadioButton(IDC_RECNOW, IDC_RECSTART, IDC_RECNOW + option); rlm@1: rlm@1: option = 3; rlm@1: if (movieInfo.header.typeFlags & MOVIE_TYPE_SGB) rlm@1: option = 2; rlm@1: if (movieInfo.header.typeFlags & MOVIE_TYPE_GBC) rlm@1: option = 1; rlm@1: if (movieInfo.header.typeFlags & MOVIE_TYPE_GBA) rlm@1: option = 0; rlm@1: CheckRadioButton(IDC_REC_GBA, IDC_REC_GB, IDC_REC_GBA + option); rlm@1: rlm@1: GetDlgItem(IDC_CHECK_HIDEBORDER)->ShowWindow(option == 2 ? TRUE : FALSE); rlm@1: rlm@1: if (movieInfo.header.typeFlags & MOVIE_TYPE_GBA) rlm@1: { rlm@1: if (movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) rlm@1: { rlm@1: if (movieInfo.header.optionFlags & MOVIE_SETTING_SKIPBIOSFILE) rlm@1: option = 2; rlm@1: else rlm@1: option = 3; rlm@1: } rlm@1: else rlm@1: option = 1; rlm@1: } rlm@1: else rlm@1: option = 0; rlm@1: rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_NOBIOS + option); rlm@1: rlm@1: { rlm@1: char * p; rlm@1: time_t ttime = (time_t)movieInfo.header.uid; rlm@1: strncpy(buffer, ctime(&ttime), 127); rlm@1: buffer[127] = '\0'; rlm@1: if ((p = strrchr(buffer, '\n'))) rlm@1: *p = '\0'; rlm@1: GetDlgItem(IDC_LABEL_DATE)->SetWindowText(buffer); rlm@1: rlm@1: uint32 div = 60; rlm@1: uint32 l = (movieInfo.header.length_frames + (div >> 1)) / div; rlm@1: uint32 seconds = l % 60; rlm@1: l /= 60; rlm@1: uint32 minutes = l % 60; rlm@1: l /= 60; rlm@1: uint32 hours = l % 60; rlm@1: sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds); rlm@1: GetDlgItem(IDC_LABEL_LENGTH)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%ld", movieInfo.header.length_frames); rlm@1: GetDlgItem(IDC_LABEL_FRAMES)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%ld", movieInfo.header.rerecord_count); rlm@1: GetDlgItem(IDC_LABEL_RERECORD)->SetWindowText(buffer); rlm@1: } rlm@1: rlm@1: { rlm@1: char warning1 [1024], warning2 [1024], buffer [1024]; rlm@1: rlm@1: strcpy(warning1, ""); rlm@1: strcpy(warning2, ""); rlm@1: rlm@1: char romTitle [12]; rlm@1: uint32 romGameCode; rlm@1: uint16 checksum; rlm@1: uint8 crc; rlm@1: rlm@1: VBAMovieGetRomInfo(movieInfo, romTitle, romGameCode, checksum, crc); rlm@1: rlm@1: // rather than treat these as warnings, might as well always show the info in the dialog (it's probably more rlm@1: // informative and reassuring) rlm@1: /// if (strncmp(movieInfo.header.romTitle,romTitle,12) != 0) rlm@1: { rlm@1: char str [13]; rlm@1: strncpy(str, movieInfo.header.romTitle, 12); rlm@1: str[12] = '\0'; rlm@1: sprintf(buffer, "title=%s ", str); rlm@1: strcat(warning1, buffer); rlm@1: rlm@1: strncpy(str, romTitle, 12); rlm@1: str[12] = '\0'; rlm@1: sprintf(buffer, "title=%s ", str); rlm@1: strcat(warning2, buffer); rlm@1: } rlm@1: /// if (((movieInfo.header.typeFlags & MOVIE_TYPE_GBA)!=0) != (systemCartridgeType == 0)) rlm@1: { rlm@1: sprintf(buffer, "type=%s ", rlm@1: (movieInfo.header.typeFlags & MOVIE_TYPE_GBA) ? "GBA" : (movieInfo.header.typeFlags & rlm@1: MOVIE_TYPE_GBC) ? "GBC" : (movieInfo.header. rlm@1: typeFlags & rlm@1: MOVIE_TYPE_SGB) ? "SGB" : "GB"); rlm@1: strcat(warning1, buffer); rlm@1: rlm@1: sprintf(buffer, "type=%s ", systemCartridgeType == rlm@1: 0 ? "GBA" : (gbRom[0x143] & 0x80 ? "GBC" : (gbRom[0x146] == 0x03 ? "SGB" : "GB"))); rlm@1: strcat(warning2, buffer); rlm@1: } rlm@1: /// if (movieInfo.header.romCRC != crc) rlm@1: { rlm@1: sprintf(buffer, "crc=%02x ", movieInfo.header.romCRC); rlm@1: strcat(warning1, buffer); rlm@1: rlm@1: sprintf(buffer, "crc=%02x ", crc); rlm@1: strcat(warning2, buffer); rlm@1: } rlm@1: /// if (movieInfo.header.romGameCode != romGameCode) rlm@1: { rlm@1: char code [5]; rlm@1: if (movieInfo.header.typeFlags & MOVIE_TYPE_GBA) rlm@1: { rlm@1: memcpy(code, &movieInfo.header.romGameCode, 4); rlm@1: code[4] = '\0'; rlm@1: sprintf(buffer, "code=%s ", code); rlm@1: strcat(warning1, buffer); rlm@1: } rlm@1: rlm@1: if (systemCartridgeType == 0) rlm@1: { rlm@1: memcpy(code, &romGameCode, 4); rlm@1: code[4] = '\0'; rlm@1: sprintf(buffer, "code=%s ", code); rlm@1: strcat(warning2, buffer); rlm@1: } rlm@1: } rlm@1: /// if (movieInfo.header.romOrBiosChecksum != checksum && !((movieInfo.header.optionFlags & rlm@1: // MOVIE_SETTING_USEBIOSFILE)==0 rlm@1: // && checksum==0)) rlm@1: { rlm@1: sprintf(buffer, rlm@1: movieInfo.header.typeFlags & rlm@1: MOVIE_TYPE_GBA ? ((movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) == rlm@1: 0 ? "(bios=none) " : "(bios=%04x) ") : "check=%04x ", rlm@1: movieInfo.header.romOrBiosChecksum); rlm@1: strcat(warning1, buffer); rlm@1: rlm@1: sprintf(buffer, rlm@1: checksum == 0 ? "(bios=none) " : systemCartridgeType == 0 ? "(bios=%04x) " : "check=%04x ", rlm@1: checksum); rlm@1: strcat(warning2, buffer); rlm@1: } rlm@1: rlm@1: if (strlen(warning1) > 0) rlm@1: { rlm@1: sprintf(buffer, "Movie ROM: %s", warning1); rlm@1: GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText(buffer); rlm@1: rlm@1: sprintf(buffer, "Your ROM: %s", warning2); rlm@1: rlm@1: //if(movieInfo.header.romCRC != crc rlm@1: //|| strncmp(movieInfo.header.romTitle,romTitle,12) != 0 rlm@1: //|| movieInfo.header.romOrBiosChecksum != checksum && !((movieInfo.header.optionFlags & rlm@1: // MOVIE_SETTING_USEBIOSFILE)==0 && checksum==0)) rlm@1: // strcat(buffer, "<-- MISMATCH"); rlm@1: rlm@1: GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(buffer); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText("(No problems detected)"); rlm@1: GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(" "); rlm@1: } rlm@1: } rlm@1: GetDlgItem(IDC_CHECK_PAUSEFRAME)->EnableWindow(TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_LABEL_DATE)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_LABEL_LENGTH)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_LABEL_FRAMES)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_LABEL_RERECORD)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_EDIT_AUTHOR)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_EDIT_DESCRIPTION)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText(" "); rlm@1: GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(" "); rlm@1: rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText(""); rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(FALSE); rlm@1: GetDlgItem(IDC_CHECK_PAUSEFRAME)->EnableWindow(FALSE); rlm@1: CheckDlgButton(IDC_CHECK_PAUSEFRAME, FALSE); rlm@1: /* rlm@1: /// FIXME: how to un-check all the radio buttons? rlm@1: CheckRadioButton(IDC_RECNOW, IDC_RECSTART, -1); rlm@1: CheckRadioButton(IDC_REC_GBA, IDC_REC_GB, -1); rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, -1);*/ rlm@1: } rlm@1: } rlm@1: rlm@1: BOOL MovieOpen::OnWndMsg(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *res) rlm@1: { rlm@1: switch (msg) rlm@1: { rlm@1: case WM_CTLCOLORSTATIC: rlm@1: { rlm@1: //HWND hwndDlg = GetSafeHwnd(); rlm@1: HWND warnDlg = NULL; rlm@1: GetDlgItem(IDC_LABEL_WARNING2, &warnDlg); rlm@1: rlm@1: if ((HWND)lParam == warnDlg) rlm@1: { rlm@1: char romTitle [12]; rlm@1: uint32 romGameCode; rlm@1: uint16 checksum; rlm@1: uint8 crc; rlm@1: rlm@1: VBAMovieGetRomInfo(movieInfo, romTitle, romGameCode, checksum, crc); rlm@1: rlm@1: if (movieInfo.header.romCRC != crc rlm@1: || strncmp(movieInfo.header.romTitle, romTitle, 12) != 0 rlm@1: || movieInfo.header.romOrBiosChecksum != checksum rlm@1: && !((movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) == 0 && checksum == 0)) rlm@1: { rlm@1: // draw the md5 sum in red if it's different from the md5 of the rom used in the replay rlm@1: HDC hdcStatic = (HDC)wParam; rlm@1: SetTextColor(hdcStatic, RGB(255, 0, 0)); // use red for a mismatch rlm@1: rlm@1: // I'm not sure why this doesn't work to make the background transparent... it turns white anyway rlm@1: SetBkMode(hdcStatic, TRANSPARENT); rlm@1: return (LONG)GetStockObject(NULL_BRUSH); rlm@1: } rlm@1: } rlm@1: return FALSE; rlm@1: } rlm@1: } rlm@1: return CDialog::OnWndMsg(msg, wParam, lParam, res); rlm@1: } rlm@1: rlm@1: void MovieOpen::OnBnClickedOk() rlm@1: { rlm@1: bool useBIOSFile = (movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) != 0; rlm@1: if (useBIOSFile) rlm@1: { rlm@1: extern bool systemLoadBIOS(const char *biosFileName, bool useBiosFile); rlm@1: if (!systemLoadBIOS(theApp.biosFileName, useBIOSFile)) rlm@1: { rlm@1: systemMessage(0, "This movie requires a valid GBA BIOS file to play.\nPlease locate a BIOS file."); rlm@1: ((MainWnd *)theApp.m_pMainWnd)->OnOptionsEmulatorSelectbiosfile(); rlm@1: if (!systemLoadBIOS(theApp.biosFileName, useBIOSFile)) rlm@1: { rlm@1: systemMessage(0, "\"%s\" is not a valid BIOS file; cannot play movie without one.", theApp.biosFileName); rlm@1: return; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: int code = VBAMovieOpen(moviePhysicalName, IsDlgButtonChecked(IDC_READONLY) != FALSE); rlm@1: rlm@1: if (code != MOVIE_SUCCESS) rlm@1: { rlm@1: if (code == MOVIE_FILE_NOT_FOUND) rlm@1: systemMessage(0, "Could not find movie file \"%s\".", (const char *)movieLogicalName); rlm@1: else if (code == MOVIE_WRONG_FORMAT) rlm@1: systemMessage(0, "Movie file \"%s\" is not in proper VBM format.", (const char *)movieLogicalName); rlm@1: else if (code == MOVIE_WRONG_VERSION) rlm@1: systemMessage(0, "Movie file \"%s\" is not a supported version.", (const char *)movieLogicalName); rlm@1: else rlm@1: systemMessage(0, "Failed to open movie \"%s\".", (const char *)movieLogicalName); rlm@1: return; rlm@1: } rlm@1: else rlm@1: { rlm@1: // get author and movie info from the edit fields (the description might change): rlm@1: char info[MOVIE_METADATA_SIZE], buffer[MOVIE_METADATA_SIZE]; rlm@1: rlm@1: GetDlgItem(IDC_EDIT_AUTHOR)->GetWindowText(buffer, MOVIE_METADATA_AUTHOR_SIZE); rlm@1: strncpy(info, buffer, MOVIE_METADATA_AUTHOR_SIZE); rlm@1: info[MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0'; rlm@1: rlm@1: GetDlgItem(IDC_EDIT_DESCRIPTION)->GetWindowText(buffer, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: strncpy(info + MOVIE_METADATA_AUTHOR_SIZE, buffer, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: info[MOVIE_METADATA_SIZE - 1] = '\0'; rlm@1: rlm@1: VBAMovieSetMetadata(info); rlm@1: } rlm@1: rlm@1: if (IsDlgButtonChecked(IDC_CHECK_PAUSEFRAME)) rlm@1: { rlm@1: char buffer [9]; rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->GetWindowText(buffer, 8); rlm@1: buffer[8] = '\0'; rlm@1: rlm@1: int pauseFrame = atoi(buffer); rlm@1: if (pauseFrame >= 0) rlm@1: VBAMovieSetPauseAt(pauseFrame); rlm@1: } rlm@1: rlm@1: OnOK(); rlm@1: } rlm@1: rlm@1: void MovieOpen::OnBnClickedCancel() rlm@1: { rlm@1: OnCancel(); rlm@1: } rlm@1: rlm@1: void MovieOpen::OnBnClickedReadonly() rlm@1: { rlm@1: theApp.movieReadOnly = IsDlgButtonChecked(IDC_READONLY) != 0; rlm@1: m_editDescription.SetReadOnly(theApp.movieReadOnly); rlm@1: OnBnClickedMovieRefresh(); rlm@1: } rlm@1: rlm@1: void MovieOpen::OnBnClickedCheckPauseframe() rlm@1: { rlm@1: if (IsDlgButtonChecked(IDC_CHECK_PAUSEFRAME)) rlm@1: { rlm@1: char buffer [8]; rlm@1: _itoa(movieInfo.header.length_frames, buffer, 10); rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText(buffer); rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText(""); rlm@1: GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(FALSE); rlm@1: } rlm@1: } rlm@1: rlm@1: void MovieOpen::OnBnClickedHideborder() rlm@1: { rlm@1: theApp.hideMovieBorder = IsDlgButtonChecked(IDC_CHECK_HIDEBORDER) != 0; rlm@1: } rlm@1: rlm@1: void MovieOpen::OnEnChangeMovieFilename() rlm@1: { rlm@1: OnBnClickedMovieRefresh(); rlm@1: } rlm@1: