diff options
author | Matthew Newhook <matthew@zeroc.com> | 2005-02-01 17:42:12 +0000 |
---|---|---|
committer | Matthew Newhook <matthew@zeroc.com> | 2005-02-01 17:42:12 +0000 |
commit | c34ec25e9755709f7959e17e5303be04af849fca (patch) | |
tree | c24bf753ca359c81ce100e8f4ecb7fa1d5092185 /cpp/demo/Glacier2/chat/ChatSessionI.cpp | |
parent | Docu fixes (diff) | |
download | ice-c34ec25e9755709f7959e17e5303be04af849fca.tar.bz2 ice-c34ec25e9755709f7959e17e5303be04af849fca.tar.xz ice-c34ec25e9755709f7959e17e5303be04af849fca.zip |
chat demo.
Diffstat (limited to 'cpp/demo/Glacier2/chat/ChatSessionI.cpp')
-rwxr-xr-x | cpp/demo/Glacier2/chat/ChatSessionI.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/cpp/demo/Glacier2/chat/ChatSessionI.cpp b/cpp/demo/Glacier2/chat/ChatSessionI.cpp new file mode 100755 index 00000000000..64452734c53 --- /dev/null +++ b/cpp/demo/Glacier2/chat/ChatSessionI.cpp @@ -0,0 +1,99 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2004 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Ice/Ice.h> +#include <ChatSessionI.h> + +using namespace std; +using namespace Demo; + +ChatRoomMembers::ChatRoomMembers() +{ +} + +void +ChatRoomMembers::add(const ChatCallbackPrx& callback) +{ + IceUtil::Mutex::Lock sync(*this); + _members.push_back(callback); +} + +void +ChatRoomMembers::remove(const ChatCallbackPrx& callback) +{ + IceUtil::Mutex::Lock sync(*this); + list<ChatCallbackPrx>::iterator p = find(_members.begin(), _members.end(), callback); + if(p != _members.end()) + { + _members.erase(p); + } +} + +void +ChatRoomMembers::message(const string& data) +{ + IceUtil::Mutex::Lock sync(*this); + list<ChatCallbackPrx>::iterator p = _members.begin(); + while(p != _members.end()) + { + try + { + (*p)->message(data); + } + catch(const Ice::LocalException&) + { + p = _members.erase(p); + continue; + } + ++p; + } +} + +ChatSessionI::ChatSessionI(const ChatRoomMembersPtr& members, const string& userId) : + _members(members), + _userId(userId), + _destroy(false) +{ + _members->message(_userId + " has entered the chat room."); +} + +void +ChatSessionI::setCallback(const ChatCallbackPrx& callback, const Ice::Current& current) +{ + IceUtil::Mutex::Lock sync(*this); + if(!_callback) + { + _callback = callback; + _members->add(callback); + } +} + +void +ChatSessionI::say(const string& data, const Ice::Current&) +{ + _members->message(_userId + " says: " + data); +} + +void +ChatSessionI::destroy(const Ice::Current& current) +{ + IceUtil::Mutex::Lock sync(*this); + if(!_destroy) + { + _destroy = true; + if(_callback) + { + _members->remove(_callback); + _callback = 0; + } + current.adapter->remove(current.id); + _members->message(_userId + " has left the chat room."); + } +} + |