[Scummvm-cvs-logs] CVS: scummvm/gui EditTextWidget.cpp,1.26,1.27 EditTextWidget.h,1.14,1.15 launcher.cpp,1.106,1.107

Max Horn fingolfin at users.sourceforge.net
Thu Dec 30 04:55:02 CET 2004


Update of /cvsroot/scummvm/scummvm/gui
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9838

Modified Files:
	EditTextWidget.cpp EditTextWidget.h launcher.cpp 
Log Message:
Fix for bug #1091801 (ALL: Possible to create corrupt config file)

Index: EditTextWidget.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/EditTextWidget.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- EditTextWidget.cpp	28 Sep 2004 20:19:26 -0000	1.26
+++ EditTextWidget.cpp	30 Dec 2004 12:54:04 -0000	1.27
@@ -71,6 +71,14 @@
 		draw();
 }
 
+bool EditTextWidget::tryInsertChar(char c, int pos) {
+	if (isprint(c)) {
+		_label.insertChar(c, pos);
+		return true;
+	}
+	return false;
+}
+
 bool EditTextWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers) {
 	bool handled = true;
 	bool dirty = false;
@@ -126,9 +134,8 @@
 		dirty = adjustOffset();
 		break;
 	default:
-		if (isprint((char)ascii)) {
-			_label.insertChar((char)ascii, _pos++);
-			//_label += (char)ascii;
+		if (tryInsertChar((char)ascii, _pos)) {
+			_pos++;
 			dirty = true;
 		} else {
 			handled = false;

Index: EditTextWidget.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/EditTextWidget.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- EditTextWidget.h	5 Feb 2004 00:19:54 -0000	1.14
+++ EditTextWidget.h	30 Dec 2004 12:54:04 -0000	1.15
@@ -28,6 +28,7 @@
 
 /* EditTextWidget */
 class EditTextWidget : public StaticTextWidget {
+public:
 	typedef Common::StringList StringList;
 	typedef Common::String String;
 protected:
@@ -52,6 +53,8 @@
 
 	int getCaretPos() const;
 	bool adjustOffset();
+	
+	virtual bool tryInsertChar(char c, int pos);
 };
 
 } // End of namespace GUI

Index: launcher.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/launcher.cpp,v
retrieving revision 1.106
retrieving revision 1.107
diff -u -d -r1.106 -r1.107
--- launcher.cpp	25 Dec 2004 23:43:04 -0000	1.106
+++ launcher.cpp	30 Dec 2004 12:54:04 -0000	1.107
@@ -69,6 +69,27 @@
 };
 
 /*
+ * TODO: Clean up this ugly design: we subclass EditTextWidget to perform
+ * input validation. It would be much more elegant to use a decorator pattern,
+ * or a validation callback, or something like that.
+ */
+class DomainEditTextWidget : public EditTextWidget {
+public:
+	DomainEditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text)
+		: EditTextWidget(boss, x, y, w, h, text) {
+	}
+	
+protected:
+	bool tryInsertChar(char c, int pos) {
+		if (isalnum(c) || c == '-' || c == '_') {
+			_label.insertChar(c, pos);
+			return true;
+		}
+		return false;
+	}
+};
+
+/*
  * A dialog that allows the user to edit a config game entry.
  * TODO: add widgets for some/all of the following
  * - Maybe scaler/graphics mode. But there are two problems:
@@ -96,7 +117,7 @@
 
 protected:
 	EditTextWidget *_descriptionWidget;
-	EditTextWidget *_domainWidget;
+	DomainEditTextWidget *_domainWidget;
 
 	StaticTextWidget *_gamePathWidget;
 	StaticTextWidget *_extraPathWidget;
@@ -141,7 +162,7 @@
 
 	// GUI:  Label & edit widget for the game ID
 	new StaticTextWidget(tab, x, yoffset + 2, labelWidth, kLineHeight, "ID: ", kTextAlignRight);
-	_domainWidget = new EditTextWidget(tab, x + labelWidth, yoffset, _w - labelWidth - 10, kLineHeight, _domain);
+	_domainWidget = new DomainEditTextWidget(tab, x + labelWidth, yoffset, _w - labelWidth - 10, kLineHeight, _domain);
 	yoffset += 16;
 
 	// GUI:  Label & edit widget for the description





More information about the Scummvm-git-logs mailing list