annotate src/win32/MovieOpen.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // MovieOpen.cpp : implementation file
rlm@1 2 //
rlm@1 3
rlm@1 4 #include "stdafx.h"
rlm@1 5 #include "resource.h"
rlm@1 6 #include "MovieOpen.h"
rlm@1 7 #include "MainWnd.h"
rlm@1 8 #include "FileDlg.h"
rlm@1 9 #include "WinResUtil.h"
rlm@1 10 #include "WinMiscUtil.h"
rlm@1 11 #include "VBA.h"
rlm@1 12
rlm@1 13 #include "../gba/GBA.h"
rlm@1 14 #include "../gb/gbGlobals.h"
rlm@1 15 #include "../common/Util.h"
rlm@1 16 #include "7zip/OpenArchive.h"
rlm@1 17
rlm@1 18 // MovieOpen dialog
rlm@1 19
rlm@1 20 IMPLEMENT_DYNAMIC(MovieOpen, CDialog)
rlm@1 21 MovieOpen::MovieOpen(CWnd *pParent /*=NULL*/)
rlm@1 22 : CDialog(MovieOpen::IDD, pParent)
rlm@1 23 {}
rlm@1 24
rlm@1 25 MovieOpen::~MovieOpen()
rlm@1 26 {
rlm@1 27 SetArchiveParentHWND(NULL);
rlm@1 28 }
rlm@1 29
rlm@1 30 BOOL MovieOpen::OnInitDialog()
rlm@1 31 {
rlm@1 32 CDialog::OnInitDialog();
rlm@1 33
rlm@1 34 pauseFrame = 0;
rlm@1 35 ZeroMemory(&movieInfo, sizeof SMovie);
rlm@1 36
rlm@1 37 SetArchiveParentHWND(GetSafeHwnd());
rlm@1 38
rlm@1 39 GetDlgItem(IDC_CHECK_HIDEBORDER)->ShowWindow(FALSE);
rlm@1 40 GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText("");
rlm@1 41 GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText("");
rlm@1 42 GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText("");
rlm@1 43 GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(FALSE);
rlm@1 44 GetDlgItem(IDC_CHECK_PAUSEFRAME)->EnableWindow(FALSE);
rlm@1 45
rlm@1 46 CheckDlgButton(IDC_READONLY, TRUE);
rlm@1 47 m_editDescription.SetReadOnly(theApp.movieReadOnly);
rlm@1 48
rlm@1 49 m_editFilename.LimitText(_MAX_PATH);
rlm@1 50 m_editAuthor.LimitText(MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 51 m_editDescription.LimitText(MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 52 m_editPauseFrame.LimitText(8);
rlm@1 53
rlm@1 54 // convert the ROM filename into a default movie name
rlm@1 55 CString movieName = winGetDestFilename(theApp.gameFilename, IDS_MOVIE_DIR, ".vbm");
rlm@1 56
rlm@1 57 GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(movieName);
rlm@1 58
rlm@1 59 // scroll to show the rightmost side of the movie filename
rlm@1 60 ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel((DWORD)(movieName.GetLength() - 1), FALSE);
rlm@1 61
rlm@1 62 OnBnClickedMovieRefresh();
rlm@1 63
rlm@1 64 return TRUE; // return TRUE unless you set the focus to a control
rlm@1 65 // EXCEPTION: OCX Property Pages should return FALSE
rlm@1 66 }
rlm@1 67
rlm@1 68 void MovieOpen::DoDataExchange(CDataExchange *pDX)
rlm@1 69 {
rlm@1 70 CDialog::DoDataExchange(pDX);
rlm@1 71 //{{AFX_DATA_MAP(MovieCreate)
rlm@1 72 DDX_Control(pDX, IDC_EDIT_AUTHOR, m_editAuthor);
rlm@1 73 DDX_Control(pDX, IDC_EDIT_DESCRIPTION, m_editDescription);
rlm@1 74 DDX_Control(pDX, IDC_MOVIE_FILENAME, m_editFilename);
rlm@1 75 DDX_Control(pDX, IDC_EDIT_PAUSEFRAME, m_editPauseFrame);
rlm@1 76 //}}AFX_DATA_MAP
rlm@1 77 }
rlm@1 78
rlm@1 79 BEGIN_MESSAGE_MAP(MovieOpen, CDialog)
rlm@1 80 ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse)
rlm@1 81 ON_BN_CLICKED(IDOK, OnBnClickedOk)
rlm@1 82 ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
rlm@1 83 ON_BN_CLICKED(IDC_MOVIE_REFRESH, OnBnClickedMovieRefresh)
rlm@1 84 ON_BN_CLICKED(IDC_READONLY, OnBnClickedReadonly)
rlm@1 85 ON_BN_CLICKED(IDC_CHECK_PAUSEFRAME, OnBnClickedCheckPauseframe)
rlm@1 86 ON_BN_CLICKED(IDC_CHECK_HIDEBORDER, OnBnClickedHideborder)
rlm@1 87 ON_EN_CHANGE(IDC_MOVIE_FILENAME, OnEnChangeMovieFilename)
rlm@1 88 END_MESSAGE_MAP()
rlm@1 89
rlm@1 90 // MovieOpen message handlers
rlm@1 91
rlm@1 92 // FIXME: file-scope-global
rlm@1 93 static bool shouldReopenBrowse = false;
rlm@1 94
rlm@1 95 void MovieOpen::OnBnClickedBrowse()
rlm@1 96 {
rlm@1 97 theApp.winCheckFullscreen(); // FIXME: necessary or not?
rlm@1 98
rlm@1 99 LPCTSTR exts[] = { ".vbm", NULL };
rlm@1 100
rlm@1 101 CString filter = winResLoadFilter(IDS_FILTER_MOVIE);
rlm@1 102 CString title = winResLoadString(IDS_SELECT_MOVIE_NAME);
rlm@1 103
rlm@1 104 CString movieName = winGetDestFilename(theApp.gameFilename, IDS_MOVIE_DIR, exts[0]);
rlm@1 105 CString movieDir = winGetDestDir(IDS_MOVIE_DIR);
rlm@1 106
rlm@1 107 FileDlg dlg(this, movieName, filter, 1, "VBM", exts, movieDir, title, false, true);
rlm@1 108
rlm@1 109 do
rlm@1 110 {
rlm@1 111 shouldReopenBrowse = false;
rlm@1 112
rlm@1 113 if (dlg.DoModal() == IDCANCEL)
rlm@1 114 {
rlm@1 115 return;
rlm@1 116 }
rlm@1 117
rlm@1 118 movieName = dlg.GetPathName();
rlm@1 119
rlm@1 120 GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(movieName);
rlm@1 121
rlm@1 122 // SetWindowText calls OnEnChangeMovieFilename which calls OnBnClickedMovieRefresh
rlm@1 123 // so this extra call to OnBnClickedMovieRefresh is bad
rlm@1 124 //OnBnClickedMovieRefresh();
rlm@1 125 }
rlm@1 126 while (shouldReopenBrowse);
rlm@1 127
rlm@1 128 // scroll to show the rightmost side of the movie filename
rlm@1 129 ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel((DWORD)(movieName.GetLength() - 1), FALSE);
rlm@1 130 }
rlm@1 131
rlm@1 132 // some extensions that might commonly be near emulation-related files that we almost certainly can't open, or at least not
rlm@1 133 // directly.
rlm@1 134 // also includes definitely non-movie extensions we know about, since we only use this variable in a movie opening function.
rlm@1 135 // we do this by exclusion instead of inclusion because we don't want to exclude extensions used for any archive files, even
rlm@1 136 // extensionless or unusually-named archives.
rlm@1 137 static const char *s_movieIgnoreExtensions [] = {
rlm@1 138 "gba", "gbc", "gb", "sgb", "cgb", "bin", "agb", "bios", "mb", "elf", "sgm", "clt", "dat", "gbs", "gcf", "spc",
rlm@1 139 "xpc", "pal", "act", "dmp", "avi", "ini", "txt", "nfo", "htm", "html", "jpg", "jpeg", "png", "bmp", "gif", "mp3",
rlm@1 140 "wav", "lnk", "exe", "bat", "sav", "luasav"
rlm@1 141 };
rlm@1 142
rlm@1 143 void MovieOpen::OnBnClickedMovieRefresh()
rlm@1 144 {
rlm@1 145 static int recursionDepth = 0;
rlm@1 146 if (recursionDepth > 0)
rlm@1 147 return;
rlm@1 148 struct Scope {Scope(){ ++ recursionDepth; } ~Scope(){ --recursionDepth; }} scope;
rlm@1 149
rlm@1 150 CString tempName;
rlm@1 151 GetDlgItem(IDC_MOVIE_FILENAME)->GetWindowText(tempName);
rlm@1 152
rlm@1 153 #if 1
rlm@1 154 // use ObtainFile to support opening files within archives (.7z, .rar, .zip, .zip.rar.7z, etc.)
rlm@1 155
rlm@1 156 if (movieLogicalName.GetLength() > 2048) movieLogicalName.Truncate(2048);
rlm@1 157
rlm@1 158 char LogicalName[2048], PhysicalName[2048];
rlm@1 159 if (ObtainFile(tempName, LogicalName, PhysicalName, "mov", s_movieIgnoreExtensions,
rlm@1 160 sizeof(s_movieIgnoreExtensions) / sizeof(*s_movieIgnoreExtensions)))
rlm@1 161 {
rlm@1 162 if (tempName != LogicalName)
rlm@1 163 {
rlm@1 164 int selStart = 0, selEnd = 0;
rlm@1 165 ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->GetSel(selStart, selEnd);
rlm@1 166
rlm@1 167 GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(LogicalName);
rlm@1 168
rlm@1 169 ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel(selStart, selEnd, FALSE);
rlm@1 170 }
rlm@1 171 moviePhysicalName = PhysicalName;
rlm@1 172 movieLogicalName = LogicalName;
rlm@1 173 ReleaseTempFileCategory("mov", PhysicalName);
rlm@1 174 }
rlm@1 175 else
rlm@1 176 {
rlm@1 177 shouldReopenBrowse = true;
rlm@1 178 return;
rlm@1 179 }
rlm@1 180 #else
rlm@1 181 // old version that only supports uncompressed movies
rlm@1 182 moviePhysicalName = tempName;
rlm@1 183 movieLogicalName = tempName;
rlm@1 184 #endif
rlm@1 185
rlm@1 186 if (VBAMovieGetInfo(moviePhysicalName, &movieInfo) == MOVIE_SUCCESS)
rlm@1 187 {
rlm@1 188 if (movieInfo.readOnly)
rlm@1 189 {
rlm@1 190 CheckDlgButton(IDC_READONLY, TRUE);
rlm@1 191 m_editDescription.SetReadOnly(TRUE);
rlm@1 192 }
rlm@1 193
rlm@1 194 char buffer[MOVIE_METADATA_SIZE];
rlm@1 195
rlm@1 196 strncpy(buffer, movieInfo.authorInfo, MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 197 buffer[MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0';
rlm@1 198 GetDlgItem(IDC_EDIT_AUTHOR)->SetWindowText(buffer);
rlm@1 199
rlm@1 200 strncpy(buffer, movieInfo.authorInfo + MOVIE_METADATA_AUTHOR_SIZE, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 201 buffer[MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0';
rlm@1 202 GetDlgItem(IDC_EDIT_DESCRIPTION)->SetWindowText(buffer);
rlm@1 203
rlm@1 204 int option = 2;
rlm@1 205 if (movieInfo.header.startFlags & MOVIE_START_FROM_SRAM)
rlm@1 206 option = 1;
rlm@1 207 if (movieInfo.header.startFlags & MOVIE_START_FROM_SNAPSHOT)
rlm@1 208 option = 0;
rlm@1 209 CheckRadioButton(IDC_RECNOW, IDC_RECSTART, IDC_RECNOW + option);
rlm@1 210
rlm@1 211 option = 3;
rlm@1 212 if (movieInfo.header.typeFlags & MOVIE_TYPE_SGB)
rlm@1 213 option = 2;
rlm@1 214 if (movieInfo.header.typeFlags & MOVIE_TYPE_GBC)
rlm@1 215 option = 1;
rlm@1 216 if (movieInfo.header.typeFlags & MOVIE_TYPE_GBA)
rlm@1 217 option = 0;
rlm@1 218 CheckRadioButton(IDC_REC_GBA, IDC_REC_GB, IDC_REC_GBA + option);
rlm@1 219
rlm@1 220 GetDlgItem(IDC_CHECK_HIDEBORDER)->ShowWindow(option == 2 ? TRUE : FALSE);
rlm@1 221
rlm@1 222 if (movieInfo.header.typeFlags & MOVIE_TYPE_GBA)
rlm@1 223 {
rlm@1 224 if (movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE)
rlm@1 225 {
rlm@1 226 if (movieInfo.header.optionFlags & MOVIE_SETTING_SKIPBIOSFILE)
rlm@1 227 option = 2;
rlm@1 228 else
rlm@1 229 option = 3;
rlm@1 230 }
rlm@1 231 else
rlm@1 232 option = 1;
rlm@1 233 }
rlm@1 234 else
rlm@1 235 option = 0;
rlm@1 236
rlm@1 237 CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_NOBIOS + option);
rlm@1 238
rlm@1 239 {
rlm@1 240 char * p;
rlm@1 241 time_t ttime = (time_t)movieInfo.header.uid;
rlm@1 242 strncpy(buffer, ctime(&ttime), 127);
rlm@1 243 buffer[127] = '\0';
rlm@1 244 if ((p = strrchr(buffer, '\n')))
rlm@1 245 *p = '\0';
rlm@1 246 GetDlgItem(IDC_LABEL_DATE)->SetWindowText(buffer);
rlm@1 247
rlm@1 248 uint32 div = 60;
rlm@1 249 uint32 l = (movieInfo.header.length_frames + (div >> 1)) / div;
rlm@1 250 uint32 seconds = l % 60;
rlm@1 251 l /= 60;
rlm@1 252 uint32 minutes = l % 60;
rlm@1 253 l /= 60;
rlm@1 254 uint32 hours = l % 60;
rlm@1 255 sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds);
rlm@1 256 GetDlgItem(IDC_LABEL_LENGTH)->SetWindowText(buffer);
rlm@1 257 sprintf(buffer, "%ld", movieInfo.header.length_frames);
rlm@1 258 GetDlgItem(IDC_LABEL_FRAMES)->SetWindowText(buffer);
rlm@1 259 sprintf(buffer, "%ld", movieInfo.header.rerecord_count);
rlm@1 260 GetDlgItem(IDC_LABEL_RERECORD)->SetWindowText(buffer);
rlm@1 261 }
rlm@1 262
rlm@1 263 {
rlm@1 264 char warning1 [1024], warning2 [1024], buffer [1024];
rlm@1 265
rlm@1 266 strcpy(warning1, "");
rlm@1 267 strcpy(warning2, "");
rlm@1 268
rlm@1 269 char romTitle [12];
rlm@1 270 uint32 romGameCode;
rlm@1 271 uint16 checksum;
rlm@1 272 uint8 crc;
rlm@1 273
rlm@1 274 VBAMovieGetRomInfo(movieInfo, romTitle, romGameCode, checksum, crc);
rlm@1 275
rlm@1 276 // rather than treat these as warnings, might as well always show the info in the dialog (it's probably more
rlm@1 277 // informative and reassuring)
rlm@1 278 /// if (strncmp(movieInfo.header.romTitle,romTitle,12) != 0)
rlm@1 279 {
rlm@1 280 char str [13];
rlm@1 281 strncpy(str, movieInfo.header.romTitle, 12);
rlm@1 282 str[12] = '\0';
rlm@1 283 sprintf(buffer, "title=%s ", str);
rlm@1 284 strcat(warning1, buffer);
rlm@1 285
rlm@1 286 strncpy(str, romTitle, 12);
rlm@1 287 str[12] = '\0';
rlm@1 288 sprintf(buffer, "title=%s ", str);
rlm@1 289 strcat(warning2, buffer);
rlm@1 290 }
rlm@1 291 /// if (((movieInfo.header.typeFlags & MOVIE_TYPE_GBA)!=0) != (systemCartridgeType == 0))
rlm@1 292 {
rlm@1 293 sprintf(buffer, "type=%s ",
rlm@1 294 (movieInfo.header.typeFlags & MOVIE_TYPE_GBA) ? "GBA" : (movieInfo.header.typeFlags &
rlm@1 295 MOVIE_TYPE_GBC) ? "GBC" : (movieInfo.header.
rlm@1 296 typeFlags &
rlm@1 297 MOVIE_TYPE_SGB) ? "SGB" : "GB");
rlm@1 298 strcat(warning1, buffer);
rlm@1 299
rlm@1 300 sprintf(buffer, "type=%s ", systemCartridgeType ==
rlm@1 301 0 ? "GBA" : (gbRom[0x143] & 0x80 ? "GBC" : (gbRom[0x146] == 0x03 ? "SGB" : "GB")));
rlm@1 302 strcat(warning2, buffer);
rlm@1 303 }
rlm@1 304 /// if (movieInfo.header.romCRC != crc)
rlm@1 305 {
rlm@1 306 sprintf(buffer, "crc=%02x ", movieInfo.header.romCRC);
rlm@1 307 strcat(warning1, buffer);
rlm@1 308
rlm@1 309 sprintf(buffer, "crc=%02x ", crc);
rlm@1 310 strcat(warning2, buffer);
rlm@1 311 }
rlm@1 312 /// if (movieInfo.header.romGameCode != romGameCode)
rlm@1 313 {
rlm@1 314 char code [5];
rlm@1 315 if (movieInfo.header.typeFlags & MOVIE_TYPE_GBA)
rlm@1 316 {
rlm@1 317 memcpy(code, &movieInfo.header.romGameCode, 4);
rlm@1 318 code[4] = '\0';
rlm@1 319 sprintf(buffer, "code=%s ", code);
rlm@1 320 strcat(warning1, buffer);
rlm@1 321 }
rlm@1 322
rlm@1 323 if (systemCartridgeType == 0)
rlm@1 324 {
rlm@1 325 memcpy(code, &romGameCode, 4);
rlm@1 326 code[4] = '\0';
rlm@1 327 sprintf(buffer, "code=%s ", code);
rlm@1 328 strcat(warning2, buffer);
rlm@1 329 }
rlm@1 330 }
rlm@1 331 /// if (movieInfo.header.romOrBiosChecksum != checksum && !((movieInfo.header.optionFlags &
rlm@1 332 // MOVIE_SETTING_USEBIOSFILE)==0
rlm@1 333 // && checksum==0))
rlm@1 334 {
rlm@1 335 sprintf(buffer,
rlm@1 336 movieInfo.header.typeFlags &
rlm@1 337 MOVIE_TYPE_GBA ? ((movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) ==
rlm@1 338 0 ? "(bios=none) " : "(bios=%04x) ") : "check=%04x ",
rlm@1 339 movieInfo.header.romOrBiosChecksum);
rlm@1 340 strcat(warning1, buffer);
rlm@1 341
rlm@1 342 sprintf(buffer,
rlm@1 343 checksum == 0 ? "(bios=none) " : systemCartridgeType == 0 ? "(bios=%04x) " : "check=%04x ",
rlm@1 344 checksum);
rlm@1 345 strcat(warning2, buffer);
rlm@1 346 }
rlm@1 347
rlm@1 348 if (strlen(warning1) > 0)
rlm@1 349 {
rlm@1 350 sprintf(buffer, "Movie ROM: %s", warning1);
rlm@1 351 GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText(buffer);
rlm@1 352
rlm@1 353 sprintf(buffer, "Your ROM: %s", warning2);
rlm@1 354
rlm@1 355 //if(movieInfo.header.romCRC != crc
rlm@1 356 //|| strncmp(movieInfo.header.romTitle,romTitle,12) != 0
rlm@1 357 //|| movieInfo.header.romOrBiosChecksum != checksum && !((movieInfo.header.optionFlags &
rlm@1 358 // MOVIE_SETTING_USEBIOSFILE)==0 && checksum==0))
rlm@1 359 // strcat(buffer, "<-- MISMATCH");
rlm@1 360
rlm@1 361 GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(buffer);
rlm@1 362 }
rlm@1 363 else
rlm@1 364 {
rlm@1 365 GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText("(No problems detected)");
rlm@1 366 GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(" ");
rlm@1 367 }
rlm@1 368 }
rlm@1 369 GetDlgItem(IDC_CHECK_PAUSEFRAME)->EnableWindow(TRUE);
rlm@1 370 }
rlm@1 371 else
rlm@1 372 {
rlm@1 373 GetDlgItem(IDC_LABEL_DATE)->SetWindowText(" ");
rlm@1 374 GetDlgItem(IDC_LABEL_LENGTH)->SetWindowText(" ");
rlm@1 375 GetDlgItem(IDC_LABEL_FRAMES)->SetWindowText(" ");
rlm@1 376 GetDlgItem(IDC_LABEL_RERECORD)->SetWindowText(" ");
rlm@1 377 GetDlgItem(IDC_EDIT_AUTHOR)->SetWindowText(" ");
rlm@1 378 GetDlgItem(IDC_EDIT_DESCRIPTION)->SetWindowText(" ");
rlm@1 379 GetDlgItem(IDC_LABEL_WARNING1)->SetWindowText(" ");
rlm@1 380 GetDlgItem(IDC_LABEL_WARNING2)->SetWindowText(" ");
rlm@1 381
rlm@1 382 GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText("");
rlm@1 383 GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(FALSE);
rlm@1 384 GetDlgItem(IDC_CHECK_PAUSEFRAME)->EnableWindow(FALSE);
rlm@1 385 CheckDlgButton(IDC_CHECK_PAUSEFRAME, FALSE);
rlm@1 386 /*
rlm@1 387 /// FIXME: how to un-check all the radio buttons?
rlm@1 388 CheckRadioButton(IDC_RECNOW, IDC_RECSTART, -1);
rlm@1 389 CheckRadioButton(IDC_REC_GBA, IDC_REC_GB, -1);
rlm@1 390 CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, -1);*/
rlm@1 391 }
rlm@1 392 }
rlm@1 393
rlm@1 394 BOOL MovieOpen::OnWndMsg(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *res)
rlm@1 395 {
rlm@1 396 switch (msg)
rlm@1 397 {
rlm@1 398 case WM_CTLCOLORSTATIC:
rlm@1 399 {
rlm@1 400 //HWND hwndDlg = GetSafeHwnd();
rlm@1 401 HWND warnDlg = NULL;
rlm@1 402 GetDlgItem(IDC_LABEL_WARNING2, &warnDlg);
rlm@1 403
rlm@1 404 if ((HWND)lParam == warnDlg)
rlm@1 405 {
rlm@1 406 char romTitle [12];
rlm@1 407 uint32 romGameCode;
rlm@1 408 uint16 checksum;
rlm@1 409 uint8 crc;
rlm@1 410
rlm@1 411 VBAMovieGetRomInfo(movieInfo, romTitle, romGameCode, checksum, crc);
rlm@1 412
rlm@1 413 if (movieInfo.header.romCRC != crc
rlm@1 414 || strncmp(movieInfo.header.romTitle, romTitle, 12) != 0
rlm@1 415 || movieInfo.header.romOrBiosChecksum != checksum
rlm@1 416 && !((movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) == 0 && checksum == 0))
rlm@1 417 {
rlm@1 418 // draw the md5 sum in red if it's different from the md5 of the rom used in the replay
rlm@1 419 HDC hdcStatic = (HDC)wParam;
rlm@1 420 SetTextColor(hdcStatic, RGB(255, 0, 0)); // use red for a mismatch
rlm@1 421
rlm@1 422 // I'm not sure why this doesn't work to make the background transparent... it turns white anyway
rlm@1 423 SetBkMode(hdcStatic, TRANSPARENT);
rlm@1 424 return (LONG)GetStockObject(NULL_BRUSH);
rlm@1 425 }
rlm@1 426 }
rlm@1 427 return FALSE;
rlm@1 428 }
rlm@1 429 }
rlm@1 430 return CDialog::OnWndMsg(msg, wParam, lParam, res);
rlm@1 431 }
rlm@1 432
rlm@1 433 void MovieOpen::OnBnClickedOk()
rlm@1 434 {
rlm@1 435 bool useBIOSFile = (movieInfo.header.optionFlags & MOVIE_SETTING_USEBIOSFILE) != 0;
rlm@1 436 if (useBIOSFile)
rlm@1 437 {
rlm@1 438 extern bool systemLoadBIOS(const char *biosFileName, bool useBiosFile);
rlm@1 439 if (!systemLoadBIOS(theApp.biosFileName, useBIOSFile))
rlm@1 440 {
rlm@1 441 systemMessage(0, "This movie requires a valid GBA BIOS file to play.\nPlease locate a BIOS file.");
rlm@1 442 ((MainWnd *)theApp.m_pMainWnd)->OnOptionsEmulatorSelectbiosfile();
rlm@1 443 if (!systemLoadBIOS(theApp.biosFileName, useBIOSFile))
rlm@1 444 {
rlm@1 445 systemMessage(0, "\"%s\" is not a valid BIOS file; cannot play movie without one.", theApp.biosFileName);
rlm@1 446 return;
rlm@1 447 }
rlm@1 448 }
rlm@1 449 }
rlm@1 450
rlm@1 451 int code = VBAMovieOpen(moviePhysicalName, IsDlgButtonChecked(IDC_READONLY) != FALSE);
rlm@1 452
rlm@1 453 if (code != MOVIE_SUCCESS)
rlm@1 454 {
rlm@1 455 if (code == MOVIE_FILE_NOT_FOUND)
rlm@1 456 systemMessage(0, "Could not find movie file \"%s\".", (const char *)movieLogicalName);
rlm@1 457 else if (code == MOVIE_WRONG_FORMAT)
rlm@1 458 systemMessage(0, "Movie file \"%s\" is not in proper VBM format.", (const char *)movieLogicalName);
rlm@1 459 else if (code == MOVIE_WRONG_VERSION)
rlm@1 460 systemMessage(0, "Movie file \"%s\" is not a supported version.", (const char *)movieLogicalName);
rlm@1 461 else
rlm@1 462 systemMessage(0, "Failed to open movie \"%s\".", (const char *)movieLogicalName);
rlm@1 463 return;
rlm@1 464 }
rlm@1 465 else
rlm@1 466 {
rlm@1 467 // get author and movie info from the edit fields (the description might change):
rlm@1 468 char info[MOVIE_METADATA_SIZE], buffer[MOVIE_METADATA_SIZE];
rlm@1 469
rlm@1 470 GetDlgItem(IDC_EDIT_AUTHOR)->GetWindowText(buffer, MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 471 strncpy(info, buffer, MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 472 info[MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0';
rlm@1 473
rlm@1 474 GetDlgItem(IDC_EDIT_DESCRIPTION)->GetWindowText(buffer, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 475 strncpy(info + MOVIE_METADATA_AUTHOR_SIZE, buffer, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE);
rlm@1 476 info[MOVIE_METADATA_SIZE - 1] = '\0';
rlm@1 477
rlm@1 478 VBAMovieSetMetadata(info);
rlm@1 479 }
rlm@1 480
rlm@1 481 if (IsDlgButtonChecked(IDC_CHECK_PAUSEFRAME))
rlm@1 482 {
rlm@1 483 char buffer [9];
rlm@1 484 GetDlgItem(IDC_EDIT_PAUSEFRAME)->GetWindowText(buffer, 8);
rlm@1 485 buffer[8] = '\0';
rlm@1 486
rlm@1 487 int pauseFrame = atoi(buffer);
rlm@1 488 if (pauseFrame >= 0)
rlm@1 489 VBAMovieSetPauseAt(pauseFrame);
rlm@1 490 }
rlm@1 491
rlm@1 492 OnOK();
rlm@1 493 }
rlm@1 494
rlm@1 495 void MovieOpen::OnBnClickedCancel()
rlm@1 496 {
rlm@1 497 OnCancel();
rlm@1 498 }
rlm@1 499
rlm@1 500 void MovieOpen::OnBnClickedReadonly()
rlm@1 501 {
rlm@1 502 theApp.movieReadOnly = IsDlgButtonChecked(IDC_READONLY) != 0;
rlm@1 503 m_editDescription.SetReadOnly(theApp.movieReadOnly);
rlm@1 504 OnBnClickedMovieRefresh();
rlm@1 505 }
rlm@1 506
rlm@1 507 void MovieOpen::OnBnClickedCheckPauseframe()
rlm@1 508 {
rlm@1 509 if (IsDlgButtonChecked(IDC_CHECK_PAUSEFRAME))
rlm@1 510 {
rlm@1 511 char buffer [8];
rlm@1 512 _itoa(movieInfo.header.length_frames, buffer, 10);
rlm@1 513 GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText(buffer);
rlm@1 514 GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(TRUE);
rlm@1 515 }
rlm@1 516 else
rlm@1 517 {
rlm@1 518 GetDlgItem(IDC_EDIT_PAUSEFRAME)->SetWindowText("");
rlm@1 519 GetDlgItem(IDC_EDIT_PAUSEFRAME)->EnableWindow(FALSE);
rlm@1 520 }
rlm@1 521 }
rlm@1 522
rlm@1 523 void MovieOpen::OnBnClickedHideborder()
rlm@1 524 {
rlm@1 525 theApp.hideMovieBorder = IsDlgButtonChecked(IDC_CHECK_HIDEBORDER) != 0;
rlm@1 526 }
rlm@1 527
rlm@1 528 void MovieOpen::OnEnChangeMovieFilename()
rlm@1 529 {
rlm@1 530 OnBnClickedMovieRefresh();
rlm@1 531 }
rlm@1 532