fixed problem with setConfig(). if the new config didn't

include a screen that was already connected under an alias
then that screen wouldn't be disconnected and removed from
the screen list until the screen voluntarily disconnected.
at that time removeConnection() would assert because the
screen name would not be found.  now using the canonical
name in the protocol object as well as CServer.  this
allows setConfig() to always detect removed screens and
disconnect them.
This commit is contained in:
crs 2002-06-09 17:21:33 +00:00
parent a9910041b3
commit 255e46017e
1 changed files with 21 additions and 18 deletions

View File

@ -284,8 +284,7 @@ void CServer::setInfoNoLock(const CString& screen,
assert(zoneSize >= 0); assert(zoneSize >= 0);
// screen must be connected // screen must be connected
CString screenName = m_config.getCanonicalName(screen); CScreenList::iterator index = m_screens.find(screen);
CScreenList::iterator index = m_screens.find(screenName);
if (index == m_screens.end()) { if (index == m_screens.end()) {
throw XBadClient(); throw XBadClient();
} }
@ -344,15 +343,14 @@ void CServer::grabClipboardNoLock(
CClipboardInfo& clipboard = m_clipboards[id]; CClipboardInfo& clipboard = m_clipboards[id];
// screen must be connected // screen must be connected
CString screenName = m_config.getCanonicalName(screen); CScreenList::iterator index = m_screens.find(screen);
CScreenList::iterator index = m_screens.find(screenName);
if (index == m_screens.end()) { if (index == m_screens.end()) {
throw XBadClient(); throw XBadClient();
} }
// ignore grab if sequence number is old. always allow primary // ignore grab if sequence number is old. always allow primary
// screen to grab. // screen to grab.
if (screenName != m_primaryInfo->m_name && if (screen != m_primaryInfo->m_name &&
seqNum < clipboard.m_clipboardSeqNum) { seqNum < clipboard.m_clipboardSeqNum) {
log((CLOG_INFO "ignored screen \"%s\" grab of clipboard %d", screen.c_str(), id)); log((CLOG_INFO "ignored screen \"%s\" grab of clipboard %d", screen.c_str(), id));
return; return;
@ -360,7 +358,7 @@ void CServer::grabClipboardNoLock(
// mark screen as owning clipboard // mark screen as owning clipboard
log((CLOG_INFO "screen \"%s\" grabbed clipboard %d from \"%s\"", screen.c_str(), id, clipboard.m_clipboardOwner.c_str())); log((CLOG_INFO "screen \"%s\" grabbed clipboard %d from \"%s\"", screen.c_str(), id, clipboard.m_clipboardOwner.c_str()));
clipboard.m_clipboardOwner = screenName; clipboard.m_clipboardOwner = screen;
clipboard.m_clipboardSeqNum = seqNum; clipboard.m_clipboardSeqNum = seqNum;
// no screens have the new clipboard except the sender // no screens have the new clipboard except the sender
@ -369,7 +367,7 @@ void CServer::grabClipboardNoLock(
// tell all other screens to take ownership of clipboard // tell all other screens to take ownership of clipboard
for (index = m_screens.begin(); index != m_screens.end(); ++index) { for (index = m_screens.begin(); index != m_screens.end(); ++index) {
if (index->first != screenName) { if (index->first != screen) {
CScreenInfo* info = index->second; CScreenInfo* info = index->second;
if (info->m_protocol == NULL) { if (info->m_protocol == NULL) {
m_primary->grabClipboard(id); m_primary->grabClipboard(id);
@ -1094,6 +1092,11 @@ void CServer::handshakeClient(void* vsocket)
throw XBadClient(); throw XBadClient();
} }
// convert name to canonical form (if any)
if (m_config.isScreen(name)) {
name = m_config.getCanonicalName(name);
}
// create a protocol interpreter for the version // create a protocol interpreter for the version
log((CLOG_DEBUG1 "creating interpreter for client \"%s\" version %d.%d", name.c_str(), major, minor)); log((CLOG_DEBUG1 "creating interpreter for client \"%s\" version %d.%d", name.c_str(), major, minor));
assign(protocol, CServerProtocol::create(major, minor, assign(protocol, CServerProtocol::create(major, minor,
@ -1334,10 +1337,11 @@ void CServer::openPrimaryScreen()
// reset sequence number // reset sequence number
m_seqNum = 0; m_seqNum = 0;
CString primary = m_config.getCanonicalName("primary"); // FIXME
try { try {
// add connection // add connection
m_active = addConnection(CString("primary"/* FIXME */), NULL); m_active = addConnection(primary, NULL);
m_primaryInfo = m_active; m_primaryInfo = m_active;
// open screen // open screen
log((CLOG_DEBUG1 "creating primary screen")); log((CLOG_DEBUG1 "creating primary screen"));
@ -1351,7 +1355,7 @@ void CServer::openPrimaryScreen()
} }
catch (...) { catch (...) {
if (m_primary != NULL) { if (m_primary != NULL) {
removeConnection(CString("primary"/* FIXME */)); removeConnection(primary);
delete m_primary; delete m_primary;
} }
m_primary = NULL; m_primary = NULL;
@ -1376,7 +1380,8 @@ void CServer::closePrimaryScreen()
assert(m_primary != NULL); assert(m_primary != NULL);
// remove connection // remove connection
removeConnection(CString("primary"/* FIXME */)); CString primary = m_config.getCanonicalName("primary"); // FIXME
removeConnection(primary);
// close the primary screen // close the primary screen
try { try {
@ -1468,17 +1473,16 @@ CServer::CScreenInfo* CServer::addConnection(
if (!m_config.isScreen(name)) { if (!m_config.isScreen(name)) {
throw XUnknownClient(name); throw XUnknownClient(name);
} }
CString screenName = m_config.getCanonicalName(name);
// can only have one screen with a given name at any given time // can only have one screen with a given name at any given time
if (m_screens.count(screenName) != 0) { if (m_screens.count(name) != 0) {
throw XDuplicateClient(name); throw XDuplicateClient(name);
} }
// save screen info // save screen info
CScreenInfo* newScreen = new CScreenInfo(screenName, protocol); CScreenInfo* newScreen = new CScreenInfo(name, protocol);
m_screens.insert(std::make_pair(screenName, newScreen)); m_screens.insert(std::make_pair(name, newScreen));
log((CLOG_DEBUG "added connection \"%s\" (\"%s\")", name.c_str(), screenName.c_str())); log((CLOG_DEBUG "added connection \"%s\"", name.c_str()));
return newScreen; return newScreen;
} }
@ -1489,8 +1493,7 @@ void CServer::removeConnection(const CString& name)
CLock lock(&m_mutex); CLock lock(&m_mutex);
// find screen info // find screen info
CString screenName = m_config.getCanonicalName(name); CScreenList::iterator index = m_screens.find(name);
CScreenList::iterator index = m_screens.find(screenName);
assert(index != m_screens.end()); assert(index != m_screens.end());
// if this is active screen then we have to jump off of it // if this is active screen then we have to jump off of it