[Box Backup-commit] COMMIT r1685 - box/chris/general/lib/win32

boxbackup-dev at fluffy.co.uk boxbackup-dev at fluffy.co.uk
Sat May 26 16:27:29 BST 2007


Author: chris
Date: 2007-05-26 16:27:29 +0100 (Sat, 26 May 2007)
New Revision: 1685

Modified:
   box/chris/general/lib/win32/emu.cpp
   box/chris/general/lib/win32/emu.h
Log:
Add a function to get default config file paths at runtime, dependent on
the location of the executable being run.


Modified: box/chris/general/lib/win32/emu.cpp
===================================================================
--- box/chris/general/lib/win32/emu.cpp	2007-05-26 15:26:35 UTC (rev 1684)
+++ box/chris/general/lib/win32/emu.cpp	2007-05-26 15:27:29 UTC (rev 1685)
@@ -218,9 +218,47 @@
 	}
 }
 
+// forward declaration
+char* ConvertFromWideString(const WCHAR* pString, unsigned int codepage);
+
 // --------------------------------------------------------------------------
 //
 // Function
+//		Name:    GetDefaultConfigFilePath(std::string name)
+//		Purpose: Calculates the default configuration file name,
+//			 by using the directory location of the currently
+//			 executing program, and appending the provided name.
+//			 In case of fire, returns an empty string.
+//		Created: 26th May 2007
+//
+// --------------------------------------------------------------------------
+std::string GetDefaultConfigFilePath(const std::string& rName)
+{
+	WCHAR exePathWide[MAX_PATH];
+	GetModuleFileNameW(NULL, exePathWide, MAX_PATH-1);
+
+	char* exePathUtf8 = ConvertFromWideString(exePathWide, CP_UTF8);
+	if (exePathUtf8 == NULL)
+	{
+		return "";
+	}
+
+	std::string configfile = exePathUtf8;
+	delete [] exePathUtf8;
+	
+	// make the default config file name,
+	// based on the program path
+	configfile = configfile.substr(0,
+		configfile.rfind('\\'));
+	configfile += "\\";
+	configfile += rName;
+
+	return configfile;
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
 //		Name:    ConvertToWideString
 //		Purpose: Converts a string from specified codepage to 
 //			 a wide string (WCHAR*). Returns a buffer which 
@@ -1247,15 +1285,15 @@
 	// Work out the executable file name, to register ourselves
 	// as the event source
 
-	char cmd[MAX_PATH];
-	if (GetModuleFileName(NULL, cmd, sizeof(cmd)-1) == 0)
+	WCHAR cmd[MAX_PATH];
+	DWORD len = GetModuleFileNameW(NULL, cmd, MAX_PATH);
+
+	if (len == 0)
 	{
 		::syslog(LOG_ERR, "Failed to get the program file name: %s",
 			GetErrorMessage(GetLastError()).c_str());
 		return FALSE;
 	}
-	cmd[sizeof(cmd)-1] = 0;
- 	std::string exepath(cmd);
 
 	// Create the event source as a subkey of the log. 
 
@@ -1277,12 +1315,12 @@
 
 	// Set the name of the message file. 
  
-	if (RegSetValueEx(hk,                // subkey handle 
-			 "EventMessageFile", // value name 
-			 0,                  // must be zero 
-			 REG_EXPAND_SZ,      // value type 
-			 (LPBYTE) exepath.c_str(),  // pointer to value data 
-			 (DWORD) (exepath.size()))) // data size
+	if (RegSetValueExW(hk,                 // subkey handle 
+			   L"EventMessageFile", // value name 
+			   0,                  // must be zero 
+			   REG_EXPAND_SZ,      // value type 
+			   (LPBYTE)cmd,        // pointer to value data 
+			   len*sizeof(WCHAR))) // data size
 	{
 		::syslog(LOG_ERR, "Failed to set the event message file: %s",
 			GetErrorMessage(GetLastError()).c_str());
@@ -1310,12 +1348,12 @@
  
 	// Set the category message file and number of categories.
 
-	if (RegSetValueEx(hk,                        // subkey handle 
-			  "CategoryMessageFile",     // value name 
-			  0,                         // must be zero 
-			  REG_EXPAND_SZ,             // value type 
-			  (LPBYTE) exepath.c_str(),  // pointer to value data 
-			  (DWORD) (exepath.size()))) // data size
+	if (RegSetValueExW(hk,                    // subkey handle 
+			   L"CategoryMessageFile", // value name 
+			   0,                     // must be zero 
+			   REG_EXPAND_SZ,         // value type 
+			   (LPBYTE)cmd,           // pointer to value data 
+			   len*sizeof(WCHAR)))    // data size
 	{
 		::syslog(LOG_ERR, "Failed to set the category message file: "
 			"%s", GetErrorMessage(GetLastError()).c_str());

Modified: box/chris/general/lib/win32/emu.h
===================================================================
--- box/chris/general/lib/win32/emu.h	2007-05-26 15:26:35 UTC (rev 1684)
+++ box/chris/general/lib/win32/emu.h	2007-05-26 15:27:29 UTC (rev 1685)
@@ -377,6 +377,10 @@
 bool ConvertUtf8ToConsole(const char* pString, std::string& rDest);
 bool ConvertConsoleToUtf8(const char* pString, std::string& rDest);
 
+// Utility function which returns a default config file name,
+// based on the path of the current executable.
+std::string GetDefaultConfigFilePath(const std::string& rName);
+
 // GetErrorMessage() returns a system error message, like strerror() 
 // but for Windows error codes.
 std::string GetErrorMessage(DWORD errorCode);




More information about the Boxbackup-commit mailing list