changeset 18755:c49df8e47d29 draft

(svn r23603) -Add: support for control commands in strings, in both network and safe/load (Rubidium)
author truebrain <truebrain@openttd.org>
date Mon, 19 Dec 2011 20:50:44 +0000
parents 114868c40989
children 57f6fb58e30a
files src/command_type.h src/network/network_command.cpp src/saveload/saveload.cpp src/saveload/saveload.h src/string.cpp src/string_type.h
diffstat 6 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/command_type.h
+++ b/src/command_type.h
@@ -355,6 +355,7 @@
 	CMD_NO_WATER  = 0x040, ///< set the DC_NO_WATER flag on this command
 	CMD_CLIENT_ID = 0x080, ///< set p2 with the ClientID of the sending client.
 	CMD_DEITY     = 0x100, ///< the command may be executed by COMPANY_DEITY
+	CMD_STR_CTRL  = 0x200, ///< the command's string may contain control strings
 };
 DECLARE_ENUM_AS_BIT_SET(CommandFlags)
 
--- a/src/network/network_command.cpp
+++ b/src/network/network_command.cpp
@@ -294,16 +294,16 @@
 {
 	cp->company = (CompanyID)p->Recv_uint8();
 	cp->cmd     = p->Recv_uint32();
+	if (!IsValidCommand(cp->cmd))               return "invalid command";
+	if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) return "offline only command";
+	if ((cp->cmd & CMD_FLAGS_MASK) != 0)        return "invalid command flag";
+
 	cp->p1      = p->Recv_uint32();
 	cp->p2      = p->Recv_uint32();
 	cp->tile    = p->Recv_uint32();
-	p->Recv_string(cp->text, lengthof(cp->text));
+	p->Recv_string(cp->text, lengthof(cp->text), (!_network_server && GetCommandFlags(cp->cmd) & CMD_STR_CTRL) != 0 ? SVS_ALLOW_CONTROL_CODE | SVS_REPLACE_WITH_QUESTION_MARK : SVS_REPLACE_WITH_QUESTION_MARK);
 
 	byte callback = p->Recv_uint8();
-
-	if (!IsValidCommand(cp->cmd))               return "invalid command";
-	if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) return "offline only command";
-	if ((cp->cmd & CMD_FLAGS_MASK) != 0)        return "invalid command flag";
 	if (callback >= lengthof(_callback_table))  return "invalid callback";
 
 	cp->callback = _callback_table[callback];
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -1089,7 +1089,14 @@
 			}
 
 			((char *)ptr)[len] = '\0'; // properly terminate the string
-			str_validate((char *)ptr, (char *)ptr + len);
+			StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK;
+			if ((conv & SLF_ALLOW_CONTROL) != 0) {
+				settings = settings | SVS_ALLOW_CONTROL_CODE;
+			}
+			if ((conv & SLF_ALLOW_NEWLINE) != 0) {
+				settings = settings | SVS_ALLOW_NEWLINE;
+			}
+			str_validate((char *)ptr, (char *)ptr + len, settings);
 			break;
 		}
 		case SLA_PTRS: break;
@@ -1442,7 +1449,7 @@
 					}
 					break;
 				case SL_ARR: SlArray(ptr, sld->length, conv); break;
-				case SL_STR: SlString(ptr, sld->length, conv); break;
+				case SL_STR: SlString(ptr, sld->length, sld->conv); break;
 				case SL_LST: SlList(ptr, (SLRefType)conv); break;
 				default: NOT_REACHED();
 			}
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -174,7 +174,9 @@
 	SLF_NOT_IN_SAVE     = 1 <<  8, ///< do not save with savegame, basically client-based
 	SLF_NOT_IN_CONFIG   = 1 <<  9, ///< do not save to config file
 	SLF_NO_NETWORK_SYNC = 1 << 10, ///< do not synchronize over network (but it is saved if SLF_NOT_IN_SAVE is not set)
-	/* 5 more possible flags */
+	SLF_ALLOW_CONTROL   = 1 << 11, ///< allow control codes in the strings
+	SLF_ALLOW_NEWLINE   = 1 << 12, ///< allow new lines in the strings
+	/* 3 more possible flags */
 };
 
 typedef uint32 VarType;
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -207,7 +207,7 @@
 		 * characters to be skipped */
 		if (c == '\0') break;
 
-		if (IsPrintable(c) && (c < SCC_SPRITE_START || c > SCC_SPRITE_END)) {
+		if ((IsPrintable(c) && (c < SCC_SPRITE_START || c > SCC_SPRITE_END)) || ((settings & SVS_ALLOW_CONTROL_CODE) != 0 && IsInsideMM(c, SCC_CONTROL_START, SCC_CONTROL_END))) {
 			/* Copy the character back. Even if dst is current the same as str
 			 * (i.e. no characters have been changed) this is quicker than
 			 * moving the pointers ahead by len */
--- a/src/string_type.h
+++ b/src/string_type.h
@@ -49,6 +49,7 @@
 	SVS_NONE                       = 0,      ///< Allow nothing and replace nothing.
 	SVS_REPLACE_WITH_QUESTION_MARK = 1 << 0, ///< Replace the unknown/bad bits with question marks.
 	SVS_ALLOW_NEWLINE              = 1 << 1, ///< Allow newlines.
+	SVS_ALLOW_CONTROL_CODE         = 1 << 2, ///< Allow the special control codes.
 };
 DECLARE_ENUM_AS_BIT_SET(StringValidationSettings);