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