[Scummvm-cvs-logs] SF.net SVN: scummvm:[41705] scummvm/trunk/backends/vkeybd

dhewg at users.sourceforge.net dhewg at users.sourceforge.net
Sat Jun 20 13:48:42 CEST 2009


Revision: 41705
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41705&view=rev
Author:   dhewg
Date:     2009-06-20 11:48:42 +0000 (Sat, 20 Jun 2009)

Log Message:
-----------
split loadKeyboardPack(), fallback to the current dir when searching for packs, and free memory in the case of an error.

Modified Paths:
--------------
    scummvm/trunk/backends/vkeybd/virtual-keyboard.cpp
    scummvm/trunk/backends/vkeybd/virtual-keyboard.h

Modified: scummvm/trunk/backends/vkeybd/virtual-keyboard.cpp
===================================================================
--- scummvm/trunk/backends/vkeybd/virtual-keyboard.cpp	2009-06-20 10:52:55 UTC (rev 41704)
+++ scummvm/trunk/backends/vkeybd/virtual-keyboard.cpp	2009-06-20 11:48:42 UTC (rev 41705)
@@ -31,7 +31,6 @@
 #include "backends/vkeybd/virtual-keyboard-parser.h"
 #include "backends/vkeybd/keycode-descriptions.h"
 #include "common/config-manager.h"
-#include "common/fs.h"
 #include "common/unzip.h"
 
 #define KEY_START_CHAR ('[')
@@ -77,51 +76,77 @@
 	_kbdGUI->reset();
 }
 
-bool VirtualKeyboard::loadKeyboardPack(String packName) {
+bool VirtualKeyboard::openPack(const String &packName, const FSNode &node) {
+	if (node.getChild(packName + ".xml").exists()) {
+		_fileArchive = new FSDirectory(node, 1);
+
+		// uncompressed keyboard pack
+		if (!_parser->loadFile(node.getChild(packName + ".xml"))) {
+			delete _fileArchive;
+			_fileArchive = 0;
+			return false;
+		}
+
+		return true;
+	}
+
+#ifdef USE_ZLIB
+	if (node.getChild(packName + ".zip").exists()) {
+		// compressed keyboard pack
+		_fileArchive = new ZipArchive(node.getChild(packName + ".zip"));
+		if (_fileArchive->hasFile(packName + ".xml")) {
+			if (!_parser->loadStream(_fileArchive->createReadStreamForMember(packName + ".xml"))) {
+				delete _fileArchive;
+				_fileArchive = 0;
+				return false;
+			}
+		} else {
+			warning("Could not find %s.xml file in %s.zip keyboard pack", packName.c_str(), packName.c_str());
+			delete _fileArchive;
+			_fileArchive = 0;
+			return false;
+		}
+
+		return true;
+	}
+#endif
+
+	return false;
+}
+
+bool VirtualKeyboard::loadKeyboardPack(const String &packName) {
 	_kbdGUI->initSize(_system->getOverlayWidth(), _system->getOverlayHeight());
 
 	delete _fileArchive;
 	_fileArchive = 0;
+	_loaded = false;
 
-	FSNode vkDir;
+	bool opened = false;
 	if (ConfMan.hasKey("vkeybdpath"))
-		vkDir = FSNode(ConfMan.get("vkeybdpath"));
+		opened = openPack(packName, FSNode(ConfMan.get("vkeybdpath")));
 	else if (ConfMan.hasKey("extrapath"))
-		vkDir = FSNode(ConfMan.get("extrapath"));
-	else // use current directory
-		vkDir = FSNode(".");
+		opened = openPack(packName, FSNode(ConfMan.get("extrapath")));
 
-	if (vkDir.getChild(packName + ".xml").exists()) {
-		_fileArchive = new FSDirectory(vkDir, 1);
+	// fallback to the current dir
+	if (!opened)
+		opened = openPack(packName, FSNode("."));
 
-		// uncompressed keyboard pack
-		if (!_parser->loadFile(vkDir.getChild(packName + ".xml")))
-			return false;
+	if (opened) {
+		_parser->setParseMode(VirtualKeyboardParser::kParseFull);
+		_loaded = _parser->parse();
 
-	} else if (vkDir.getChild(packName + ".zip").exists()) {
-		// compressed keyboard pack
-#ifdef USE_ZLIB
-		_fileArchive = new ZipArchive(vkDir.getChild(packName + ".zip"));
-		if (_fileArchive->hasFile(packName + ".xml")) {
-			if (!_parser->loadStream(_fileArchive->createReadStreamForMember(packName + ".xml")))
-				return false;
+		if (_loaded) {
+			printf("Keyboard pack '%s' loaded successfully!\n", packName.c_str());
 		} else {
-			warning("Could not find %s.xml file in %s.zip keyboard pack", packName.c_str(), packName.c_str());
-			return false;
+			warning("Error parsing the keyboard pack '%s'", packName.c_str());
+
+			delete _fileArchive;
+			_fileArchive = 0;
 		}
-#else
-		return false;
-#endif
 	} else {
 		warning("Keyboard pack not found");
-		return false;
 	}
 
-	_parser->setParseMode(VirtualKeyboardParser::kParseFull);
-	_loaded = _parser->parse();
-	if (_loaded)
-		printf("Keyboard pack '%s' loaded successfully!\n", packName.c_str());
-
 	return _loaded;
 }
 

Modified: scummvm/trunk/backends/vkeybd/virtual-keyboard.h
===================================================================
--- scummvm/trunk/backends/vkeybd/virtual-keyboard.h	2009-06-20 10:52:55 UTC (rev 41704)
+++ scummvm/trunk/backends/vkeybd/virtual-keyboard.h	2009-06-20 11:48:42 UTC (rev 41705)
@@ -37,6 +37,7 @@
 #include "common/keyboard.h"
 #include "common/list.h"
 #include "common/str.h"
+#include "common/fs.h"
 
 #include "backends/vkeybd/image-map.h"
 #include "graphics/surface.h"
@@ -190,7 +191,7 @@
 	 * searches for a compressed keyboard pack by looking for packName.zip.
 	 * @param packName	name of the keyboard pack
 	 */
-	bool loadKeyboardPack(String packName);
+	bool loadKeyboardPack(const String &packName);
 
 	/**
 	 * Shows the keyboard, starting an event loop that will intercept all
@@ -232,6 +233,7 @@
 	VirtualKeyboardParser *_parser;
 
 	void reset();
+	bool openPack(const String &packName, const FSNode &node);
 	void deleteEvents();
 	bool checkModeResolutions();
 	void switchMode(Mode *newMode);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list