Move CoreService to a separate file.
							parent
							
								
									3168a2ef62
								
							
						
					
					
						commit
						14d6a62e1d
					
				| @ -0,0 +1,133 @@ | |||||||
|  | /*
 | ||||||
|  | https://github.com/peterix/dfhack
 | ||||||
|  | Copyright (c) 2011 Petr Mrázek <peterix@gmail.com> | ||||||
|  | 
 | ||||||
|  | A thread-safe logging console with a line editor for windows. | ||||||
|  | 
 | ||||||
|  | Based on linenoise win32 port, | ||||||
|  | copyright 2010, Jon Griffiths <jon_p_griffiths at yahoo dot com>. | ||||||
|  | All rights reserved. | ||||||
|  | Based on linenoise, copyright 2010, Salvatore Sanfilippo <antirez at gmail dot com>. | ||||||
|  | The original linenoise can be found at: http://github.com/antirez/linenoise
 | ||||||
|  | 
 | ||||||
|  | Redistribution and use in source and binary forms, with or without | ||||||
|  | modification, are permitted provided that the following conditions are met: | ||||||
|  | 
 | ||||||
|  |   * Redistributions of source code must retain the above copyright notice, | ||||||
|  |     this list of conditions and the following disclaimer. | ||||||
|  |   * Redistributions in binary form must reproduce the above copyright | ||||||
|  |     notice, this list of conditions and the following disclaimer in the | ||||||
|  |     documentation and/or other materials provided with the distribution. | ||||||
|  |   * Neither the name of Redis nor the names of its contributors may be used | ||||||
|  |     to endorse or promote products derived from this software without | ||||||
|  |     specific prior written permission. | ||||||
|  | 
 | ||||||
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||||
|  | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||||
|  | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||||
|  | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||||
|  | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <stdarg.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <iostream> | ||||||
|  | #include <fstream> | ||||||
|  | #include <istream> | ||||||
|  | #include <string> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "RemoteTools.h" | ||||||
|  | #include "PluginManager.h" | ||||||
|  | #include "MiscUtils.h" | ||||||
|  | 
 | ||||||
|  | #include <cstdio> | ||||||
|  | #include <cstdlib> | ||||||
|  | #include <sstream> | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | 
 | ||||||
|  | using namespace DFHack; | ||||||
|  | 
 | ||||||
|  | using dfproto::CoreTextNotification; | ||||||
|  | using dfproto::CoreTextFragment; | ||||||
|  | using google::protobuf::MessageLite; | ||||||
|  | 
 | ||||||
|  | CoreService::CoreService() { | ||||||
|  |     suspend_depth = 0; | ||||||
|  | 
 | ||||||
|  |     // These 2 methods must be first, so that they get id 0 and 1
 | ||||||
|  |     addMethod("BindMethod", &CoreService::BindMethod); | ||||||
|  |     addMethod("RunCommand", &CoreService::RunCommand); | ||||||
|  | 
 | ||||||
|  |     // Add others here:
 | ||||||
|  |     addMethod("CoreSuspend", &CoreService::CoreSuspend); | ||||||
|  |     addMethod("CoreResume", &CoreService::CoreResume); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CoreService::~CoreService() | ||||||
|  | { | ||||||
|  |     while (suspend_depth-- > 0) | ||||||
|  |         Core::getInstance().Resume(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | command_result CoreService::BindMethod(color_ostream &stream, | ||||||
|  |                                        const dfproto::CoreBindRequest *in, | ||||||
|  |                                        dfproto::CoreBindReply *out) | ||||||
|  | { | ||||||
|  |     ServerFunctionBase *fn = connection()->findFunction(stream, in->plugin(), in->method()); | ||||||
|  | 
 | ||||||
|  |     if (!fn) | ||||||
|  |     { | ||||||
|  |         stream.printerr("RPC method not found: %s::%s\n", | ||||||
|  |                         in->plugin().c_str(), in->method().c_str()); | ||||||
|  |         return CR_FAILURE; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (fn->p_in_template->GetTypeName() != in->input_msg() || | ||||||
|  |         fn->p_out_template->GetTypeName() != in->output_msg()) | ||||||
|  |     { | ||||||
|  |         stream.printerr("Requested wrong signature for RPC method: %s::%s\n", | ||||||
|  |                         in->plugin().c_str(), in->method().c_str()); | ||||||
|  |         return CR_FAILURE; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     out->set_assigned_id(fn->getId()); | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | command_result CoreService::RunCommand(color_ostream &stream, | ||||||
|  |                                        const dfproto::CoreRunCommandRequest *in) | ||||||
|  | { | ||||||
|  |     std::string cmd = in->command(); | ||||||
|  |     std::vector<std::string> args; | ||||||
|  |     for (int i = 0; i < in->arguments_size(); i++) | ||||||
|  |         args.push_back(in->arguments(i)); | ||||||
|  | 
 | ||||||
|  |     return Core::getInstance().plug_mgr->InvokeCommand(stream, cmd, args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | command_result CoreService::CoreSuspend(color_ostream &stream, const EmptyMessage*, IntMessage *cnt) | ||||||
|  | { | ||||||
|  |     Core::getInstance().Suspend(); | ||||||
|  |     cnt->set_value(++suspend_depth); | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | command_result CoreService::CoreResume(color_ostream &stream, const EmptyMessage*, IntMessage *cnt) | ||||||
|  | { | ||||||
|  |     if (suspend_depth <= 0) | ||||||
|  |         return CR_WRONG_USAGE; | ||||||
|  | 
 | ||||||
|  |     Core::getInstance().Resume(); | ||||||
|  |     cnt->set_value(--suspend_depth); | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | /*
 | ||||||
|  | https://github.com/peterix/dfhack
 | ||||||
|  | Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) | ||||||
|  | 
 | ||||||
|  | This software is provided 'as-is', without any express or implied | ||||||
|  | warranty. In no event will the authors be held liable for any | ||||||
|  | damages arising from the use of this software. | ||||||
|  | 
 | ||||||
|  | Permission is granted to anyone to use this software for any | ||||||
|  | purpose, including commercial applications, and to alter it and | ||||||
|  | redistribute it freely, subject to the following restrictions: | ||||||
|  | 
 | ||||||
|  | 1. The origin of this software must not be misrepresented; you must | ||||||
|  | not claim that you wrote the original software. If you use this | ||||||
|  | software in a product, an acknowledgment in the product documentation | ||||||
|  | would be appreciated but is not required. | ||||||
|  | 
 | ||||||
|  | 2. Altered source versions must be plainly marked as such, and | ||||||
|  | must not be misrepresented as being the original software. | ||||||
|  | 
 | ||||||
|  | 3. This notice may not be removed or altered from any source | ||||||
|  | distribution. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | #include "Pragma.h" | ||||||
|  | #include "Export.h" | ||||||
|  | #include "RemoteServer.h" | ||||||
|  | 
 | ||||||
|  | namespace  DFHack | ||||||
|  | { | ||||||
|  |     class CoreService : public RPCService { | ||||||
|  |         int suspend_depth; | ||||||
|  |     public: | ||||||
|  |         CoreService(); | ||||||
|  |         ~CoreService(); | ||||||
|  | 
 | ||||||
|  |         command_result BindMethod(color_ostream &stream, | ||||||
|  |                                   const dfproto::CoreBindRequest *in, | ||||||
|  |                                   dfproto::CoreBindReply *out); | ||||||
|  |         command_result RunCommand(color_ostream &stream, | ||||||
|  |                                   const dfproto::CoreRunCommandRequest *in); | ||||||
|  | 
 | ||||||
|  |         // For batching
 | ||||||
|  |         command_result CoreSuspend(color_ostream &stream, const EmptyMessage*, IntMessage *cnt); | ||||||
|  |         command_result CoreResume(color_ostream &stream, const EmptyMessage*, IntMessage *cnt); | ||||||
|  |     }; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue