Working Version
This commit is contained in:
		
							parent
							
								
									46f98dff69
								
							
						
					
					
						commit
						20d5c99517
					
				| @ -8,11 +8,12 @@ namespace core { | |||||||
|       return 0; |       return 0; | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    void Command::output(Session *session) {} |    void Command::output(std::stringstream &out) { | ||||||
|  |       out << "Write your own command description here for the help system." << std::endl; | ||||||
|  |    } | ||||||
| 
 | 
 | ||||||
|    bool Command::check(coreutils::ZString request) { |    bool Command::check(coreutils::ZString request) { | ||||||
| 	   return request[0].equals(name); | 	   return request[0].equals(name); | ||||||
| 
 |  | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    void Command::setName(std::string name) { |    void Command::setName(std::string name) { | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								Command.h
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								Command.h
									
									
									
									
									
								
							| @ -9,36 +9,36 @@ | |||||||
| namespace core { | namespace core { | ||||||
| 
 | 
 | ||||||
|    class CommandList; |    class CommandList; | ||||||
|     | 
 | ||||||
|    class Session; |    class Session; | ||||||
|     | 
 | ||||||
|    ///
 |    ///
 | ||||||
|    /// Command
 |    /// Command
 | ||||||
|    ///
 |    ///
 | ||||||
|    /// Use the Command object in combination with a CommandList object to maintain 
 |    /// Use the Command object in combination with a CommandList object to maintain 
 | ||||||
|    /// a list of functions that can be invoked as a result of processing a request.
 |    /// a list of functions that can be invoked as a result of processing a request.
 | ||||||
|    ///
 |    ///
 | ||||||
|     | 
 | ||||||
|    class Command { |    class Command { | ||||||
|        | 
 | ||||||
|     public:    |     public: | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// Implement check method to provide a special check rule upon the request to see
 |       /// Implement check method to provide a special check rule upon the request to see
 | ||||||
|       /// if the command should be processed. 
 |       /// if the command should be processed.
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// The default rule is to verify that the first token in the request string matches
 |       /// The default rule is to verify that the first token in the request string matches
 | ||||||
|       /// the name given on the registration of the command to the CommandList. This can
 |       /// the name given on the registration of the command to the CommandList. This can
 | ||||||
|       /// be overridden by implementing the check() method to perform the test and return
 |       /// be overridden by implementing the check() method to perform the test and return
 | ||||||
|       /// the condition of the command.
 |       /// the condition of the command.
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// @param request The request passed to the parser to check the rule. 
 |       /// @param request The request passed to the parser to check the rule.
 | ||||||
|       /// @return Return true to execute the command. Returning false will cause no action
 |       /// @return Return true to execute the command. Returning false will cause no action
 | ||||||
|       ///         on this command.
 |       ///         on this command.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       virtual bool check(coreutils::ZString request); |       virtual bool check(coreutils::ZString request); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// This method is used to implement the functionality of the requested command.
 |       /// This method is used to implement the functionality of the requested command.
 | ||||||
|       /// This pure virtual function must be implemented in your inheriting object. 
 |       /// This pure virtual function must be implemented in your inheriting object. 
 | ||||||
| @ -49,17 +49,17 @@ namespace core { | |||||||
|       /// @return Returns 0 if execution of the command was successful. Otherwise returns 
 |       /// @return Returns 0 if execution of the command was successful. Otherwise returns 
 | ||||||
|       ///         a non-zero value indicating an error condition.
 |       ///         a non-zero value indicating an error condition.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       virtual int processCommand(coreutils::ZString &request, TCPSession &session); |       virtual int processCommand(coreutils::ZString &request, TCPSession &session); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// Specify the output that will occur to the specified session.
 |       /// Specify the output that will occur to the specified session.
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// @param session The session that will receive the output.
 |       /// @param session The session that will receive the output.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       virtual void output(Session *session); |       virtual void output(std::stringstream &out); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// Set the name of this command used in default rule checking during request parsing.
 |       /// Set the name of this command used in default rule checking during request parsing.
 | ||||||
|       /// NOTE: You do not need to call this under normal conditions as adding a Command
 |       /// NOTE: You do not need to call this under normal conditions as adding a Command
 | ||||||
| @ -68,16 +68,16 @@ namespace core { | |||||||
|       ///
 |       ///
 | ||||||
|       /// @param name Specify the name of this command for default parsing.
 |       /// @param name Specify the name of this command for default parsing.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       void setName(std::string name); |       void setName(std::string name); | ||||||
|        | 
 | ||||||
|       std::string getName(); |       std::string getName(); | ||||||
|              | 
 | ||||||
|     private: |     private: | ||||||
|       std::string name;       |       std::string name; | ||||||
|        | 
 | ||||||
|    }; |    }; | ||||||
|     | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -26,20 +26,20 @@ namespace core { | |||||||
|       ///
 |       ///
 | ||||||
| 
 | 
 | ||||||
|       void add(Command &command, std::string name = ""); |       void add(Command &command, std::string name = ""); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// Remove a command object from the command list.
 |       /// Remove a command object from the command list.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       void remove(Command &command); |       void remove(Command &command); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// Use this method to apply a parsed ZString to the command set and execute 
 |       /// Use this method to apply a parsed ZString to the command set and execute 
 | ||||||
|       /// the matching parameter. The selected command will return a true on a call
 |       /// the matching parameter. The selected command will return a true on a call
 | ||||||
|       /// to check(). If there is a handler that has a grab on the process handler
 |       /// to check(). If there is a handler that has a grab on the process handler
 | ||||||
|       /// then control is given to the process handler holding the grab on the input.
 |       /// then control is given to the process handler holding the grab on the input.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       bool processRequest(coreutils::ZString &request, TCPSession &session); |       bool processRequest(coreutils::ZString &request, TCPSession &session); | ||||||
| 
 | 
 | ||||||
|       ///
 |       ///
 | ||||||
| @ -47,32 +47,32 @@ namespace core { | |||||||
|       /// all further input from the socket. Use releaseGrab() method to release the session
 |       /// all further input from the socket. Use releaseGrab() method to release the session
 | ||||||
|       /// back to normal command processing.
 |       /// back to normal command processing.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       bool grabInput(TCPSession &session, Command &command); |       bool grabInput(TCPSession &session, Command &command); | ||||||
| 
 | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       ///
 |       ///
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       void clearGrab(TCPSession &session); |       void clearGrab(TCPSession &session); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       ///
 |       ///
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       int processCommand(coreutils::ZString &request, TCPSession &session); |       int processCommand(coreutils::ZString &request, TCPSession &session); | ||||||
|        | 
 | ||||||
|     protected: |     protected: | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// The vector of all registered commands.
 |       /// The vector of all registered commands.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       std::vector<Command *> commands; |       std::vector<Command *> commands; | ||||||
|       std::string delimiter; |       std::string delimiter; | ||||||
|        | 
 | ||||||
|    }; |    }; | ||||||
|     | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -4,18 +4,18 @@ | |||||||
| #include "Log.h" | #include "Log.h" | ||||||
| 
 | 
 | ||||||
| namespace core { | namespace core { | ||||||
|     | 
 | ||||||
|    ConsoleServer::ConsoleServer(EPoll &ePoll, IPAddress address) : TCPServer(ePoll, address, "Console") { |    ConsoleServer::ConsoleServer(EPoll &ePoll, IPAddress address) : TCPServer(ePoll, address, "Console") { | ||||||
|       coreutils::Log(this);  |       coreutils::Log(this); | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|    void ConsoleServer::logSend(std::string out) { |    void ConsoleServer::logSend(std::string out) { | ||||||
|       for(auto *session : sessions)  |       for(auto *session : sessions) | ||||||
|         ((ConsoleSession *)session)->writeLog(out); |         ((ConsoleSession *)session)->writeLog(out); | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|    TCPSession * ConsoleServer::getSocketAccept(EPoll &ePoll) { |    TCPSession * ConsoleServer::getSocketAccept(EPoll &ePoll) { | ||||||
|       return new ConsoleSession(ePoll, *this); |       return new ConsoleSession(ePoll, *this); | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -113,7 +113,7 @@ namespace core { | |||||||
|       event.data.ptr = socket; |       event.data.ptr = socket; | ||||||
|       event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET; |       event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET; | ||||||
|       if(socket->needsToWrite()) |       if(socket->needsToWrite()) | ||||||
| 	event.events |= EPOLLWRNORM; | 	     event.events |= EPOLLWRNORM; | ||||||
|       epoll_ctl(epfd, EPOLL_CTL_MOD, socket->getDescriptor(), &event); |       epoll_ctl(epfd, EPOLL_CTL_MOD, socket->getDescriptor(), &event); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								EPoll.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								EPoll.h
									
									
									
									
									
								
							| @ -27,17 +27,17 @@ namespace core { | |||||||
|    /// Threads are used to establish a read queue for epoll. The desired number of threads (or
 |    /// Threads are used to establish a read queue for epoll. The desired number of threads (or
 | ||||||
|    /// queues) is established by a parameter on the start method.
 |    /// queues) is established by a parameter on the start method.
 | ||||||
|    ///
 |    ///
 | ||||||
|     | 
 | ||||||
|    class EPoll : public Command { |    class EPoll : public Command { | ||||||
|        | 
 | ||||||
|     public:  |     public: | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       /// The constructor for the BMAEPoll object.
 |       /// The constructor for the BMAEPoll object.
 | ||||||
|       ///
 |       ///
 | ||||||
|        | 
 | ||||||
|       EPoll(); |       EPoll(); | ||||||
|        | 
 | ||||||
|       ///
 |       ///
 | ||||||
|      /// The destructor for the BMAEPoll object.
 |      /// The destructor for the BMAEPoll object.
 | ||||||
|       ///
 |       ///
 | ||||||
|  | |||||||
| @ -63,10 +63,8 @@ namespace core { | |||||||
|       return new TCPSession(ePoll, *this); |       return new TCPSession(ePoll, *this); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    void TCPServer::output(TCPSession *session) { |    void TCPServer::output(std::stringstream &out) { | ||||||
|       std::stringstream out; |       out << "Use the 'help' command to list the commands for this server." << std::endl; | ||||||
|       out << "|" << session->ipAddress.getClientAddressAndPort(); |  | ||||||
|       session->send(); |  | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    int TCPServer::processCommand(coreutils::ZString &request, TCPSession &session) { |    int TCPServer::processCommand(coreutils::ZString &request, TCPSession &session) { | ||||||
|  | |||||||
| @ -85,7 +85,7 @@ namespace core { | |||||||
| 
 | 
 | ||||||
|       void removeFromSessionList(TCPSession *session); |       void removeFromSessionList(TCPSession *session); | ||||||
| 
 | 
 | ||||||
|       void output(TCPSession *session); ///<Output the consoles array to the console.
 |       void output(std::stringstream &out); ///<Output the consoles array to the console.
 | ||||||
| 
 | 
 | ||||||
|       ///
 |       ///
 | ||||||
|       ///
 |       ///
 | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ namespace core { | |||||||
| 
 | 
 | ||||||
|    void TCPSession::onRegistered() { |    void TCPSession::onRegistered() { | ||||||
|       onConnected(); |       onConnected(); | ||||||
|       protocol((char *)""); |       protocol(coreutils::ZString("")); | ||||||
|       send(); |       send(); | ||||||
|       if(term) |       if(term) | ||||||
|      	  shutdown("termination requested"); |      	  shutdown("termination requested"); | ||||||
|  | |||||||
							
								
								
									
										57
									
								
								Thread.cpp
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								Thread.cpp
									
									
									
									
									
								
							| @ -2,23 +2,23 @@ | |||||||
| #include "EPoll.h" | #include "EPoll.h" | ||||||
| 
 | 
 | ||||||
| namespace core { | namespace core { | ||||||
|     | 
 | ||||||
|    Thread::Thread(EPoll &ePoll) : ePoll(ePoll) {} |    Thread::Thread(EPoll &ePoll) : ePoll(ePoll) {} | ||||||
|     | 
 | ||||||
|    Thread::~Thread() {} |    Thread::~Thread() {} | ||||||
|     | 
 | ||||||
|    void Thread::start() { |    void Thread::start() { | ||||||
|       _thread = new std::thread(&Thread::run, this);    |       _thread = new std::thread(&Thread::run, this); | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|    void Thread::join() { |    void Thread::join() { | ||||||
|       _thread->join(); |       _thread->join(); | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|    std::string Thread::getStatus() { |    std::string Thread::getStatus() { | ||||||
|       return status;     |       return status; | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|    pid_t Thread::getThreadId() { |    pid_t Thread::getThreadId() { | ||||||
|       return threadId; |       return threadId; | ||||||
|    } |    } | ||||||
| @ -26,44 +26,43 @@ namespace core { | |||||||
|    int Thread::getCount() { |    int Thread::getCount() { | ||||||
|       return count; |       return count; | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|    void Thread::output(std::stringstream &data) {    |    void Thread::output(std::stringstream &data) { | ||||||
|       data << "|" << getThreadId();  |       data << "|" << getThreadId(); | ||||||
|       data << "|" << getStatus(); |       data << "|" << getStatus(); | ||||||
|       data << "|" << getCount();        |       data << "|" << getCount(); | ||||||
|    } |    } | ||||||
|     | 
 | ||||||
|     |  | ||||||
|    void Thread::run() { |    void Thread::run() { | ||||||
|        | 
 | ||||||
|       threadId = syscall(SYS_gettid); |       threadId = syscall(SYS_gettid); | ||||||
|        | 
 | ||||||
|       coreutils::Log(coreutils::LOG_DEBUG_1) << "Thread started with thread id " << threadId << "."; |       coreutils::Log(coreutils::LOG_DEBUG_1) << "Thread started with thread id " << threadId << "."; | ||||||
|        | 
 | ||||||
|       count = 0; |       count = 0; | ||||||
|        | 
 | ||||||
|       struct epoll_event events[50]; |       struct epoll_event events[50]; | ||||||
|        | 
 | ||||||
|       while(1) { |       while(1) { | ||||||
| 	  | 
 | ||||||
| 	 if(ePoll.isStopping()) | 	 if(ePoll.isStopping()) | ||||||
|            break; |            break; | ||||||
| 	  | 
 | ||||||
| 	 status = "WAITING";       | 	 status = "WAITING"; | ||||||
| 	 int rc = epoll_wait(ePoll.getDescriptor(), events, 50, -1); | 	 int rc = epoll_wait(ePoll.getDescriptor(), events, 50, -1); | ||||||
| 	 status = "RUNNING"; | 	 status = "RUNNING"; | ||||||
| 	  | 
 | ||||||
| 	 if(rc < 0) { | 	 if(rc < 0) { | ||||||
| 	    // TODO: Make log entry indicating status received and ignore for now.
 | 	    // TODO: Make log entry indicating status received and ignore for now.
 | ||||||
| 	 } else if(rc == 0) {  	  | 	 } else if(rc == 0) { | ||||||
| 	    break; | 	    break; | ||||||
| 	 } else if(rc > 0) {  | 	 } else if(rc > 0) { | ||||||
| 	    for(int ix = 0; ix < rc; ++ix) {	     | 	    for(int ix = 0; ix < rc; ++ix) { | ||||||
| 	       ++count;    		     | 	       ++count; | ||||||
| 	       if(((Socket *)events[ix].data.ptr)->eventReceived(events[ix])) | 	       if(((Socket *)events[ix].data.ptr)->eventReceived(events[ix])) | ||||||
| 		 ePoll.resetSocket((Socket *)events[ix].data.ptr); | 		 ePoll.resetSocket((Socket *)events[ix].data.ptr); | ||||||
| 	    }             | 	    } | ||||||
| 	 }       | 	 } | ||||||
|       } |       } | ||||||
|       coreutils::Log(coreutils::LOG_DEBUG_1) << "Thread ending with thread id " << threadId << "."; |       coreutils::Log(coreutils::LOG_DEBUG_1) << "Thread ending with thread id " << threadId << "."; | ||||||
|    } |    } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Brad Arant
						Brad Arant