From: <Jef...@us...> - 2007-10-09 23:30:17
|
Revision: 258 http://libirc.svn.sourceforge.net/libirc/?rev=258&view=rev Author: JeffM2501 Date: 2007-10-09 16:30:15 -0700 (Tue, 09 Oct 2007) Log Message: ----------- setup high level event system for server add connection event. Modified Paths: -------------- trunk/libirc/include/IRCEvents.h trunk/libirc/include/IRCServer.h trunk/libirc/src/IRCServer.cpp Modified: trunk/libirc/include/IRCEvents.h =================================================================== --- trunk/libirc/include/IRCEvents.h 2007-10-09 22:26:19 UTC (rev 257) +++ trunk/libirc/include/IRCEvents.h 2007-10-09 23:30:15 UTC (rev 258) @@ -61,7 +61,11 @@ // events with no data use this typedef struct trBaseServerEventInfo : public trBaseEventInfo { - IRCServerConnectedClient *client; + trBaseServerEventInfo(IRCServerConnectedClient*c) + { + client = c; + } + IRCServerConnectedClient *client; }trBaseServerEventInfo; // nickname error type events, used for eIRCNickNameError Modified: trunk/libirc/include/IRCServer.h =================================================================== --- trunk/libirc/include/IRCServer.h 2007-10-09 22:26:19 UTC (rev 257) +++ trunk/libirc/include/IRCServer.h 2007-10-09 23:30:15 UTC (rev 258) @@ -123,7 +123,7 @@ std::string name; }; -class IRCServer : public TCPServerDataPendingListener +class IRCServer : public TCPServerDataPendingListener, IRCServerEventCallback { public: IRCServer(); @@ -176,6 +176,17 @@ virtual int listUserHandledCommands ( std::vector<std::string> &commandList ); virtual int listDefaultHandledCommands ( std::vector<std::string> &commandList ); + //event handler methods.... for higher level API + virtual bool registerEventHandler ( teIRCEventType eventType, IRCServerEventCallback *handler ); + virtual bool removeEventHandler ( teIRCEventType eventType, IRCServerEventCallback *handler ); + virtual void callEventHandler ( teIRCEventType eventType, trBaseServerEventInfo &info ); + + // internal event callbacks + virtual bool process ( IRCServer *ircServer, teIRCEventType eventType, trBaseServerEventInfo &info ); + + // super high level common overides + virtual const char * getConnectionText ( IRCServerConnectedClient *client ){return NULL;} + protected: friend class IRCServerConnectedClient; @@ -230,6 +241,15 @@ void clearDefaultCommandHandlers ( void ); void registerDefaultCommandHandlers ( void ); + // event handlers + tmIRCServerEventMap defaultEventHandlers; + tmIRCServerEventListMap userEventHandlers; + + void addDefaultEventHandlers ( teIRCEventType eventType, IRCServerEventCallback* handler ); + void clearDefaultEventHandlers ( void ); + void registerDefaultEventHandlers ( void ); + + }; #endif //_IRC_SERVER_H_ Modified: trunk/libirc/src/IRCServer.cpp =================================================================== --- trunk/libirc/src/IRCServer.cpp 2007-10-09 22:26:19 UTC (rev 257) +++ trunk/libirc/src/IRCServer.cpp 2007-10-09 23:30:15 UTC (rev 258) @@ -400,11 +400,11 @@ for ( unsigned int i = 0; i < size; i++ ) { if ( data[i] != 13 ) - theLine += data[i]; + theLine += data[i]; else { - processIRCLine(theLine,client); - theLine = ""; + processIRCLine(theLine,client); + theLine = ""; } } } @@ -432,6 +432,8 @@ void IRCServer::clientConnect ( IRCServerConnectedClient *client ) { + trBaseServerEventInfo info(client); + callEventHandler(eIRCConnectedEvent,info); } void IRCServer::clientDisconnect ( IRCServerConnectedClient *client ) @@ -495,7 +497,7 @@ void IRCServer::registerDefaultCommandHandlers ( void ) { - + registerDefaultEventHandlers(); } bool IRCServer::registerCommandHandler ( IRCServerCommandHandler *handler ) @@ -570,7 +572,136 @@ return (int)commandList.size(); } +void IRCServer::addDefaultEventHandlers ( teIRCEventType eventType, IRCServerEventCallback* handler ) +{ + if (handler) + defaultEventHandlers[eventType] = handler; +} +void IRCServer::clearDefaultEventHandlers ( void ) +{ + tmIRCServerEventMap::iterator itr = defaultEventHandlers.begin(); + + while ( itr != defaultEventHandlers.end()) + { + if (itr->second && (itr->second != this) ) + delete(itr->second); + itr++; + } + defaultEventHandlers.clear(); +} + +void IRCServer::registerDefaultEventHandlers ( void ) +{ + userEventHandlers.clear(); + clearDefaultEventHandlers(); + + registerEventHandler(eIRCConnectedEvent,this); +} + +bool IRCServer::registerEventHandler ( teIRCEventType eventType, IRCServerEventCallback *handler ) +{ + if (!handler) + return false; + + tmIRCServerEventListMap::iterator eventListItr = userEventHandlers.find(eventType); + if (eventListItr == userEventHandlers.end()) + { + tvIRCServerEventList handlerList; + handlerList.push_back(handler); + userEventHandlers[eventType] = handlerList; + } + else + eventListItr->second.push_back(handler); + + return true; +} + +bool IRCServer::removeEventHandler ( teIRCEventType eventType, IRCServerEventCallback *handler ) +{ + if (!handler) + return false; + + tmIRCServerEventListMap::iterator eventListItr = userEventHandlers.find(eventType); + if (eventListItr == userEventHandlers.end()) + return false; + else + { + tvIRCServerEventList::iterator itr = eventListItr->second.begin(); + while ( itr != eventListItr->second.end()) + { + if ((*itr)== handler) + itr = eventListItr->second.erase(itr); + else + itr++; + } + } + return true; +} + +void IRCServer::callEventHandler ( teIRCEventType eventType, trBaseServerEventInfo &info ) +{ + bool callDefault = true; + + tmIRCServerEventListMap::iterator eventListItr = userEventHandlers.find(eventType); + + // make sure the event type is cool + info.eventType = eventType; + + if (eventListItr != userEventHandlers.end() && eventListItr->second.size()) // do we have a custom command handler + { + // someone has to want us to call the defalt now + callDefault = false; + // is this right? + // should we do them all? or just the first one that "HANDLES" it? + tvIRCServerEventList::iterator itr = eventListItr->second.begin(); + while (itr != eventListItr->second.end()) + { + if ( (*itr)->process(this,eventType,info)) + callDefault = true; + itr++; + } + if (!callDefault) + return; + } + + if (callDefault) // check for the default + { + tmIRCServerEventMap::iterator itr = defaultEventHandlers.find(eventType); + if (itr != defaultEventHandlers.end()) + { + itr->second->process(this,eventType,info); + return; + } + } + return; +} + +bool IRCServer::process ( IRCServer *ircServer, teIRCEventType eventType, trBaseServerEventInfo &info ) +{ + if (ircServer != this) + return false; + + switch(eventType) + { + case eIRCConnectedEvent: + { + char *text = getConnectionText(info.client); + if (!text) + return false; + + std::vector<std::string> lines = string_util::tokenize(std::string(text),std::string("\n")); + for (unsigned int i = 0; i < (unsigned int)lines.size(); i++) + { + // send out each line as it's own message + } + } + return true; + } + return false; +} + + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |