Fixed up cross-compatibility rebooting and crashlog timestamps.
authorMark Cannon <vyhdycokio@gmail.com>
Fri, 22 Feb 2008 16:31:39 +0000 (16:31 +0000)
committerMark Cannon <vyhdycokio@gmail.com>
Fri, 22 Feb 2008 16:31:39 +0000 (16:31 +0000)
git-svn-id: https://openitg.svn.sourceforge.net/svnroot/openitg@35 83fadc84-e282-4d84-a09a-c4228d6ae7e5

src/Makefile.am
src/ProductInfo.h
src/ProductInfo.inc
src/RageFileDriverDirectHelpers.cpp
src/ScreenArcadePatch.cpp
src/StepMania.cpp
src/StepMania.h
src/arch/MovieTexture/MovieTexture_FFMpeg.cpp
src/archutils/Unix/CrashHandlerChild.cpp
src/archutils/Win32/Crash.cpp

index a247fc0..bdb380d 100755 (executable)
@@ -1,4 +1,4 @@
-bin_PROGRAMS = stepmania
+bin_PROGRAMS = openitg
 TESTS = 
 tests: $(TESTS)
 if BUILD_TESTS
@@ -109,6 +109,7 @@ StepMania = StdString.h \
 LoadingWindow = arch/LoadingWindow/LoadingWindow.h \
                arch/LoadingWindow/LoadingWindow_Null.h
 
+#Make sure any dependencies on these data structure are wrapped.
 #if HAVE_LIBUSB
 LIBS += -lusb
 DataStructures += io/USBDriver.cpp io/USBDriver.h \
@@ -207,8 +208,14 @@ endif
 
 if LINUX
 MemoryCard += arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp arch/MemoryCard/MemoryCardDriverThreaded_Linux.h
-InputHandler +=        arch/InputHandler/InputHandler_Linux_Joystick.h arch/InputHandler/InputHandler_Linux_Joystick.cpp \
-               arch/InputHandler/InputHandler_Linux_PIUIO.h arch/InputHandler/InputHandler_Linux_PIUIO.cpp
+InputHandler +=        arch/InputHandler/InputHandler_Linux_Joystick.h arch/InputHandler/InputHandler_Linux_Joystick.cpp
+
+# These cannot build without USBDriver, which depends on libusb
+#if HAVE_LIBUSB
+InputHandler += arch/InputHandler/InputHandler_Linux_PIUIO.h \
+               arch/InputHandler/InputHandler_Linux_PIUIO.cpp
+#endif
+
 endif
 
 Arch = $(LoadingWindow) $(Sound) $(ArchHooks) $(InputHandler) $(MovieTexture) \
@@ -384,8 +391,8 @@ main_LDADD = \
                  $(XLIBS) \
                  $(srcdir)/libresample/libresample.a
 
-stepmania_SOURCES = $(main_SOURCES)
-stepmania_LDADD = $(main_LDADD)
+openitg_SOURCES = $(main_SOURCES)
+openitg_LDADD = $(main_LDADD)
 #      $(srcdir)/ffmpeg/lib/libavcodec.a $(srcdir)/ffmpeg/lib/libavformat.a
 
 if HAVE_GTK
index 44efa40..074fa57 100755 (executable)
@@ -12,8 +12,9 @@
  * to support problems in dev builds since they're not *
  * official releases and likely have bugs we've fixed. */
 
-#define PRODUCT_NAME "In The Groove 2"
-#define PRODUCT_VER "alpha 3 DEV-3"
+/* I guess this is the official name now. :P   --Vyhd  */
+#define PRODUCT_NAME "OpenITG"
+#define PRODUCT_VER "alpha 3"
 #define PRODUCT_SERIAL "ITG-C-12222007-529-3"
 
 #define PRODUCT_NAME_VER PRODUCT_NAME " " PRODUCT_VER
index 84a6503..4cb7a7d 100755 (executable)
@@ -1,11 +1,11 @@
 ; Included by the NSIS installer script
 ; Don't forget to also change ProductInfo.h!
 
-!define PRODUCT_NAME "In The Groove 2"
+!define PRODUCT_NAME "OpenITG"
 !define PRODUCT_VER "alpha 3"
 ; !define PRODUCT_VER "3.9 alpha 23"
 !define PRODUCT_NAME_VER "${PRODUCT_NAME} ${PRODUCT_VER}"
 
 ; String used for the install directory and registry locations
 ; Official releases = "StepMania"; intermediate releases = "StepMania CVS".
-!define PRODUCT_ID "In The Groove 2 alpha3"
+!define PRODUCT_ID "OpenITG alpha3"
index 5418a37..24d916a 100755 (executable)
@@ -250,7 +250,10 @@ void DirectFilenameDB::PopulateFileSet( FileSet &fs, const CString &path )
        DIR *pDir = opendir(root+sPath);
        if( pDir == NULL )
        {
-               LOG->MapLog("opendir " + root+sPath, "Couldn't opendir(%s%s): %s", root.c_str(), sPath.c_str(), strerror(errno) );
+               // HACK: these messages are annoying me. Keep them out. -- Vyhd
+               if( errno != 2 ) // "No such file or directory"
+                       LOG->MapLog("opendir " + root+sPath, "Couldn't opendir(%s%s): %s", root.c_str(), sPath.c_str(), strerror(errno) );
+
                return;
        }
 
index efa68b5..e6f042e 100644 (file)
@@ -18,6 +18,8 @@
 #include "RageFileDriverZip.h"
 #include "XmlFile.h"
 
+#include "StepMania.h"         // For ExitAndReboot()
+
 #include "Foreach.h"           // Foreach loops without the command is hard.
 #include "MemoryCardManager.h" // Where else are we getting the patch from?
 #include "GameState.h"         // Check which USB...
@@ -47,27 +49,10 @@ int GetRevision()
 
 ScreenArcadePatch::~ScreenArcadePatch()
 {
-       LOG->Warn( "ScreenArcadePatch::~ScreenArcadePatch() %i", (int)g_doReboot );
-       if (g_doReboot)
-       {
-               LOG->Warn("ZOMG REBOOTING");
-               struct stat ncr; // lol get it?
-               if ( stat("/tmp/no-crash-reboot", &ncr) != 0 )
-               {
-                       LOG->Warn("Hard reboot commence...");
-                       reboot(RB_AUTOBOOT);
-               }
-               else
-               {
-                       LOG->Warn("SM Quit commence...");
-                       GAMESTATE->EndGame();
-                       //exit(0);
-               }
-       }
-       else
-       {
-               LOG->Warn("ZOMG NOT REBOOTING");
-       }
+       LOG->Trace( "ScreenArcadePatch::~ScreenArcadePatch() %i", (int)g_doReboot );
+
+       if( g_doReboot )
+               ExitAndReboot();
 }
 
 void ScreenArcadePatch::Init()
@@ -95,8 +80,7 @@ void ScreenArcadePatch::Init()
        
        bChecking = false;
        m_PatchStatus = &m_Status;
-       g_doReboot = false;
-       
+       g_doReboot = true;      
 }
 
 void ScreenArcadePatch::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
index a0d6342..d736d95 100755 (executable)
 #include <windows.h>
 #endif
 
+#if defined(UNIX)
+#include <sys/reboot.h>
+#include <cerrno>
+#endif
+
 #define ZIPS_DIR "Packages/"
 
 int g_argc = 0;
@@ -254,6 +259,59 @@ void ShutdownGame()
        SAFE_DELETE( HOOKS );
 }
 
+/* Does exactly what it suggests. Use with caution; people generally 
+ * don't like having their computers restarted unexpectedly.
+
+ * To simply end StepMania instead of rebooting, have one of these filenames:
+ * "/tmp/no-crash-reboot" - Unix-like only, for ITG compatibility
+ * "Data/no-reboot" - usable for all platforms
+ */
+void ExitAndReboot()
+{
+       /* Should we reboot or just quit? */
+       if( IsAFile("Data/no-reboot") || IsAFile("/rootfs/tmp/no-crash-reboot") )
+       {
+               LOG->Warn( "Found no-reboot file. Exiting OpenITG." );
+               ExitGame();
+               return;
+       }
+
+       LOG->Warn( "Could not find no-reboot file. Rebooting." );
+
+       bool bRestart = false;
+       CString sError;
+
+#if defined(UNIX)
+       /* If reboot() succeeds, we will never pass here. */
+       bRestart = !reboot( RB_AUTOBOOT );
+
+       sError = strerror(errno);
+#elif defined(WIN32) && !defined(XBOX)
+       bRestart = ExitWindowsEx( EWX_REBOOT | EWX_FORCEIFHUNG,
+       SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_MAINTENANCE 
+       | SHTDN_REASON_FLAG_PLANNED ); // returns "0" on failure only
+
+       /* This will be more useful to Windows users than me... */
+       sError = ssprintf( "%#x", (unsigned int)GetLastError() );
+#else
+       sError = "function not implemented for your OS.";
+       bRestart = false;
+#endif
+
+       CString sMessage = ssprintf( "Could not reboot: %s", sError.c_str() );
+
+       /* Windows restarts asynchronously, so bRestart can be true and 
+        * we'll still be here. Wrap this for false conditions, so any 
+        * true conditions can fallthrough to the clean exit. */
+       if( !bRestart )
+       {
+               Dialog::Error( sMessage );
+               exit( 1 );
+       }
+       
+       exit( 0 );
+}
+
 /* Cleanly shut down, show a dialog and exit the game.  We don't go back
  * up the call stack, to avoid having to use exceptions. */
 void HandleException( CString error )
@@ -968,7 +1026,7 @@ int main(int argc, char* argv[])
        int argc = 1;
        char *argv[] = {"default.xbe"};
 #endif
-       
+
        g_argc = argc;
        g_argv = argv;
 
@@ -1035,6 +1093,7 @@ int main(int argc, char* argv[])
        }
        MountTreeOfZips( ZIPS_DIR );
 
+       // TODO: soft-code this!
        {
                CStringArray dzips;
 
index 2e2bc38..8ad0b68 100755 (executable)
@@ -12,6 +12,7 @@ void ApplyGraphicOptions();
 void NORETURN HandleException( CString error );
 void ExitGame();
 void ResetGame();
+void ExitAndReboot();
 void SaveGamePrefsToDisk();
 void ChangeCurrentGame( const Game* g );
 void FocusChanged( bool bHasFocus );
index 5939d9d..b0ceb98 100755 (executable)
@@ -13,6 +13,9 @@
 
 #include <cerrno>
 
+// dumb workaround...dunno if it'll compile. -- Vyhd
+#define HAVE_IMG_CONVERT
+
 #if defined(WIN32) && !defined(XBOX)
 #include <windows.h>
 #endif
index 79c6b24..7aa8941 100755 (executable)
 #include "Backtrace.h"
 #include "BacktraceNames.h"
 
+#include "RageLog.h" /* for RageLog::GetAdditionalLog, etc. only */
 #include "RageUtil.h"
 #include "CrashHandler.h"
 #include "CrashHandlerInternal.h"
-#include "RageLog.h" /* for RageLog::GetAdditionalLog, etc. only */
-#include "ProductInfo.h"
+#include "ProductInfo.h" /* For CRASH_REPORT_URL */
+#include "StepMania.h" /* To call ExitAndReboot() */
 
 #if defined(DARWIN)
 #include "archutils/Darwin/Crash.h"
@@ -261,20 +262,14 @@ static void child_process()
         /* keep going */
     }
 
-       const char *home = getenv( "HOME" );
-       
-       // I make my first move here...
-//     CString sCrashInfoPath = "/tmp"; // Commented...
-       CString sCrashInfoPath = "/stats"; // Yeaaa ITG2AC Style!
+       // We don't need the file/ext, but they're required args.
+       CString sPath, sDir, sFile, sExt;
 
-       if( home )
-               sCrashInfoPath = home;
-               
-       // This is where I make my move!
-       // -- Matt1360
-//     sCrashInfoPath += "/crashinfo.txt"; // Commented...
+       sPath = g_pCrashHandlerArgv0;
+       splitpath( sPath, sDir, sFile, sExt );
+
+       CString sCrashInfoPath = sDir + "Stats";
        
-       // Make the variable
        time_t seconds;
        seconds = time( NULL );
        
@@ -373,10 +368,13 @@ static void child_process()
             "\n"
             "Please report a bug at:\n"
             "\n"
-            "    http://sourceforge.net/tracker/?func=add&group_id=37892&atid=421366\n"
+            "    " CRASH_REPORT_URL "\n"
             "\n"
             );
+
 #endif
+
+       ExitAndReboot(); // restart
 }
 
 
index af6c2f6..ad658c0 100755 (executable)
@@ -4,6 +4,7 @@
 //#include <stdio.h>
 #include <stdarg.h>
 #include <crtdbg.h>
+#include <time.h> // needed for timestamping
 
 #include <windows.h>
 #include <tlhelp32.h>
@@ -782,7 +783,14 @@ static void DoSave()
 {
        char szModName2[MAX_PATH];
 
-       SpliceProgramPath(szModName2, sizeof szModName2, "../crashinfo.txt");
+       /* Set up a timestamp for the crashlog. */
+       time_t seconds;
+       seconds = time( NULL );
+       
+       char sCrashLog[32];
+       sprintf( sCrashLog, "../Stats/crashlog-%ld.txt", seconds );
+
+       SpliceProgramPath(szModName2, sizeof szModName2, sCrashLog);
 
        HANDLE hFile = CreateFile(szModName2, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (INVALID_HANDLE_VALUE == hFile)