88 lines
2.3 KiB
Lua

require "socket"
require "oil" -- Load OiL package
local Viewer = require "loop.debug.Viewer"
--------------------------------------------------------------------------------
local orb = oil.init{ flavor = "intercepted;corba;typed;cooperative;base" }
local viewer = Viewer{ maxdepth = 2 }
local interceptor = {}
--------------------------------------------------------------------------------
local receive_context_idl = orb:loadidl [[
struct ServerInfo {
long memory;
};
]]
function interceptor:receiverequest(request)
request.start_time = socket.gettime()
print("intercepting request to "..request.operation.."("..viewer:tostring(unpack(request, 1, request.count))..")")
for _, context in ipairs(request.service_context) do
if context.context_id == 1234 then
local decoder = orb:newdecoder(context.context_data)
local result = decoder:get(receive_context_idl)
print("\tmemory:", result.memory)
return
end
end
io.stderr:write("context 1234 not found! Canceling...\n")
request.success = false
request.count = 1
request[1] = orb:newexcept{ "CORBA::BAD_OPERATION", minor_code_value = 0 }
end
--------------------------------------------------------------------------------
local send_context_idl = orb:loadidl [[
struct ClientInfo {
double start;
double ending;
};
]]
function interceptor:sendreply(reply)
print("intercepting reply of opreation "..reply.operation)
print("\tsuccess:", reply.success)
print("\tresults:", unpack(reply, 1, reply.count))
local encoder = orb:newencoder()
encoder:put({
start = reply.start_time,
ending = socket.gettime(),
}, send_context_idl)
reply.service_context = {
{
context_id = 4321,
context_data = encoder:getdata()
}
}
end
--------------------------------------------------------------------------------
orb:setserverinterceptor(interceptor)
--------------------------------------------------------------------------------
oil.main(function()
orb:loadidl [[
module Concurrency {
interface Server {
boolean do_something_for(in double seconds);
};
};
]]
local server_impl = {}
function server_impl:do_something_for(seconds)
oil.sleep(seconds)
return true
end
local server = orb:newservant(server_impl, nil, "Concurrency::Server")
assert(oil.writeto("server.ior", orb:tostring(server)))
orb:run()
end)