📄 chatsessioni.cpp
字号:
// **********************************************************************//// Copyright (c) 2003-2007 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 <ChatSessionI.h>#include <Ice/Ice.h>#include <list>using namespace std;using namespace Demo;class ChatRoom;typedef IceUtil::Handle<ChatRoom> ChatRoomPtr;class ChatRoom : public IceUtil::Mutex, public IceUtil::Shared{public: static ChatRoomPtr& instance(); void enter(const Demo::ChatCallbackPrx&); void leave(const Demo::ChatCallbackPrx&); void message(const string&) const;private: list<Demo::ChatCallbackPrx> _members; static ChatRoomPtr _instance; static IceUtil::StaticMutex _instanceMutex;};ChatRoomPtr ChatRoom::_instance;IceUtil::StaticMutex ChatRoom::_instanceMutex = ICE_STATIC_MUTEX_INITIALIZER;ChatRoomPtr&ChatRoom::instance(){ IceUtil::StaticMutex::Lock sync(_instanceMutex); if(!_instance) { _instance = new ChatRoom; } return _instance;}voidChatRoom::enter(const ChatCallbackPrx& callback){ Lock sync(*this); _members.push_back(ChatCallbackPrx::uncheckedCast(callback->ice_oneway()));}voidChatRoom::leave(const ChatCallbackPrx& callback){ Lock sync(*this); list<ChatCallbackPrx>::iterator p; for(p = _members.begin(); p != _members.end(); ++p) { if(Ice::proxyIdentityEqual(callback, *p)) { break; } } assert(p != _members.end()); _members.erase(p);}voidChatRoom::message(const string& data) const{ Lock sync(*this); for(list<ChatCallbackPrx>::const_iterator p = _members.begin(); p != _members.end(); ++p) { try { (*p)->message(data); } catch(const Ice::LocalException&) { } }}ChatSessionI::ChatSessionI(const string& userId) : _userId(userId){}voidChatSessionI::setCallback(const ChatCallbackPrx& callback, const Ice::Current& current){ Lock sync(*this); if(!_callback) { _callback = callback; ChatRoomPtr chatRoom = ChatRoom::instance(); chatRoom->message(_userId + " has entered the chat room."); chatRoom->enter(callback); }}voidChatSessionI::say(const string& data, const Ice::Current&){ ChatRoom::instance()->message(_userId + " says: " + data);}voidChatSessionI::destroy(const Ice::Current& current){ Lock sync(*this); if(_callback) { ChatRoomPtr chatRoom = ChatRoom::instance(); chatRoom->leave(_callback); _callback = 0; chatRoom->message(_userId + " has left the chat room."); } current.adapter->remove(current.id);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -