From f3333bffda8467fae126c516c547b4e01a7da3fb Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 10 Jul 2019 20:38:35 +0000
Subject: [PATCH] Create a use new sbbs_t method: term_type(), returns the
 auto-generated terminal "type" string (ANSI, RIP, PETSCII, or DUMB). Expose
 this value in JS via the new console.type read-only property. The TERM @-code
 now expands to this string rather than the (often client-supplied)
 sbbs_t.terminal string value.

---
 src/sbbs3/atcodes.cpp    |  7 +++++--
 src/sbbs3/con_out.cpp    | 32 ++++++++++++++++++++++++++++++++
 src/sbbs3/js_console.cpp | 20 ++++++++++++++++++--
 src/sbbs3/sbbs.h         |  2 ++
 src/sbbs3/useredit.cpp   |  9 ++++-----
 5 files changed, 61 insertions(+), 9 deletions(-)

diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index b4748ce41e..3063fd64ec 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -268,8 +268,11 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
 		safe_snprintf(str,maxlen,"%lu",rows);
 		return(str);
 	}
-	if(!strcmp(sp,"TERM"))
-		return(terminal);
+	if(strcmp(sp,"TERM") == 0)
+		return term_type();
+
+	if(strcmp(sp,"CHARSET") == 0)
+		return term_charset();
 
 	if(!strcmp(sp,"CONN"))
 		return(connection);
diff --git a/src/sbbs3/con_out.cpp b/src/sbbs3/con_out.cpp
index 12a3e14197..88c4f910e7 100644
--- a/src/sbbs3/con_out.cpp
+++ b/src/sbbs3/con_out.cpp
@@ -384,6 +384,38 @@ long sbbs_t::term_supports(long cmp_flags)
 	return(cmp_flags ? ((flags&cmp_flags)==cmp_flags) : (flags&TERM_FLAGS));
 }
 
+/****************************************************************************/
+/* Returns description of the terminal type									*/
+/****************************************************************************/
+const char* sbbs_t::term_type(long term)
+{
+	if(term == -1)
+		term = term_supports();
+	if(term&PETSCII)
+		return "PETSCII";
+	if(term&RIP)
+		return "RIP";
+	if(term&ANSI)
+		return "ANSI";
+	return "DUMB";
+}
+
+/****************************************************************************/
+/* Returns description of the terminal supported character set (charset)	*/
+/****************************************************************************/
+const char* sbbs_t::term_charset(long term)
+{
+	if(term == -1)
+		term = term_supports();
+	if(term&PETSCII)
+		return "CBM-ASCII";
+	if(term&UTF8)
+		return "UTF-8";
+	if(term&NO_EXASCII)
+		return "US-ASCII";
+	return "CP437";
+}
+
 /****************************************************************************/
 /* Outputs character														*/
 /* Performs terminal translations (e.g. EXASCII-to-ASCII, FF->ESC[2J)		*/
diff --git a/src/sbbs3/js_console.cpp b/src/sbbs3/js_console.cpp
index e4a53a92e0..079a027e95 100644
--- a/src/sbbs3/js_console.cpp
+++ b/src/sbbs3/js_console.cpp
@@ -55,6 +55,8 @@ enum {
 	,CON_PROP_TABSTOP
 	,CON_PROP_AUTOTERM
 	,CON_PROP_TERMINAL
+	,CON_PROP_TERM_TYPE
+	,CON_PROP_CHARSET
 	,CON_PROP_CTERM_VERSION
 	,CON_PROP_WORDWRAP
 	,CON_PROP_QUESTION
@@ -125,6 +127,16 @@ static JSBool js_console_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 				return(JS_FALSE);
 			*vp = STRING_TO_JSVAL(js_str);
 			return(JS_TRUE);
+		case CON_PROP_TERM_TYPE:
+			if((js_str=JS_NewStringCopyZ(cx, sbbs->term_type()))==NULL)
+				return(JS_FALSE);
+			*vp = STRING_TO_JSVAL(js_str);
+			return(JS_TRUE);
+		case CON_PROP_CHARSET:
+			if((js_str=JS_NewStringCopyZ(cx, sbbs->term_charset()))==NULL)
+				return(JS_FALSE);
+			*vp = STRING_TO_JSVAL(js_str);
+			return(JS_TRUE);
 		case CON_PROP_CTERM_VERSION:
 			val=sbbs->cterm_version;
 			break;
@@ -334,6 +346,8 @@ static jsSyncPropertySpec js_console_properties[] = {
 	{	"tabstop"			,CON_PROP_TABSTOP			,CON_PROP_FLAGS	,31700},
 	{	"autoterm"			,CON_PROP_AUTOTERM			,CON_PROP_FLAGS	,310},
 	{	"terminal"			,CON_PROP_TERMINAL			,CON_PROP_FLAGS ,311},
+	{	"type"				,CON_PROP_TERM_TYPE			,JSPROP_ENUMERATE|JSPROP_READONLY ,31702},
+	{	"charset"			,CON_PROP_CHARSET			,JSPROP_ENUMERATE|JSPROP_READONLY ,31702},
 	{	"cterm_version"		,CON_PROP_CTERM_VERSION		,CON_PROP_FLAGS ,317},
 	{	"inactivity_warning",CON_PROP_INACTIV_WARN		,CON_PROP_FLAGS, 31401},
 	{	"inactivity_hangup"	,CON_PROP_INACTIV_HANGUP	,CON_PROP_FLAGS, 31401},
@@ -366,7 +380,9 @@ static const char* con_prop_desc[] = {
 	,"current tab stop interval (tab size), in columns"
 	,"bit-field of automatically detected terminal settings "
 		"(see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"terminal type description (e.g. 'ANSI')"
+	,"terminal type description, possibly supplied by client (e.g. 'ANSI')"
+	,"terminal type (i.e. 'ANSI', 'RIP', 'PETSCII', or 'DUMB')"
+	,"terminal character set (i.e. 'UTF-8', 'CP437', 'CBM-ASCII', or 'US-ASCII')"
 	,"detected CTerm (SyncTERM) version as an integer > 1000 where major version is cterm_version / 1000 and minor version is cterm_version % 1000"
 	,"number of seconds before displaying warning (Are you really there?) due to user/keyboard inactivity"
 	,"number of seconds before disconnection due to user/keyboard inactivity"
@@ -1983,7 +1999,7 @@ static jsSyncMethodSpec js_console_functions[] = {
 	},
 	{"wide",			js_wide,			1, JSTYPE_VOID,		JSDOCSTR("text")
 	,JSDOCSTR("display a string double-wide on the screen (sending \"fullwidth\" Unicode characters when possible)")
-	,0x317c
+	,31702
 	},
 	{"strlen",			js_strlen,			1, JSTYPE_NUMBER,	JSDOCSTR("text")
 	,JSDOCSTR("returns the number of characters in text, excluding Ctrl-A codes")
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index fc77e57d43..b4d8b40050 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -732,6 +732,8 @@ public:
 	void	line_feed(void);
 	void	newline(void);
 	long	term_supports(long cmp_flags=0);
+	const char* term_type(long term_supports = -1);
+	const char* term_charset(long term_supports = -1);
 	int		backfill(const char* str, float pct, int full_attr, int empty_attr);
 	void	progress(const char* str, int count, int total, int interval=1);
 	bool	saveline(void);
diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp
index a1f171e0c4..387c2e3a0a 100644
--- a/src/sbbs3/useredit.cpp
+++ b/src/sbbs3/useredit.cpp
@@ -816,13 +816,12 @@ void sbbs_t::maindflts(user_t* user)
 							,user->misc&AUTOTERM ? text[TerminalAutoDetect]:nulstr
 							,cols, text[TerminalColumns]);
 		else
-			safe_snprintf(str,sizeof(str),"%s%s%s%s%s%s"
+			safe_snprintf(str,sizeof(str),"%s%s / %s %s%s"
 							,user->misc&AUTOTERM ? text[TerminalAutoDetect]:nulstr
-							,term&ANSI ? "ANSI ":"TTY "
+							,term_charset(term)
+							,term_type(term)
 							,term&COLOR ? (term&ICE_COLOR ? text[TerminalIceColor] : text[TerminalColor]) : text[TerminalMonochrome]
-							,term&RIP ? "RIP " : nulstr
-							,term&UTF8 ? "UTF-8 " : (term&NO_EXASCII ? "ASCII ":"CP437 ")
-							,term&SWAP_DELETE ? "DEL=BS " : nulstr);
+							,term&SWAP_DELETE ? "DEL=BS" : nulstr);
 		bprintf(text[UserDefaultsTerminal], truncsp(str));
 		if(user->rows)
 			ultoa(user->rows,tmp,10);
-- 
GitLab