Server.cpp 2.2 KB
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//

#include <Ice/Ice.h>
#include <ContextI.h>

using namespace std;



class InterceptorI : public Ice::DispatchInterceptor
{
public:
    InterceptorI(std::shared_ptr<ContextI> servant) :
        _servant(std::move(servant)) 
    {
    }
 
    virtual bool dispatch(Ice::Request& request) override
    {
      auto c = request.getCurrent();
      const auto p = c.ctx.find("token");

      cout << "Operation: " << c.operation << endl;

      if (c.operation == "function") 
        if ( ((p == c.ctx.end()) || (_servant->getSecretToken() == "")) && (p->second != _servant->getSecretToken()) )
          throw Ice::OperationNotExistException(__FILE__, __LINE__);
      return _servant->ice_dispatch(request);
    }
 
    std::shared_ptr<ContextI> _servant;
};


int main(int argc, char* argv[])
{
#ifdef ICE_STATIC_LIBS
    Ice::registerIceSSL();
#endif

    int status = 0;

    try
    {
        //
        // CtrlCHandler must be created before the communicator or any other threads are started
        //
        Ice::CtrlCHandler ctrlCHandler;

        //
        // CommunicatorHolder's ctor initializes an Ice communicator,
        // and its dtor destroys this communicator.
        //
        Ice::CommunicatorHolder ich(argc, argv, "config.server");
        auto communicator = ich.communicator();

        ctrlCHandler.setCallback(
            [communicator](int)
            {
                communicator->shutdown();
            });

        //
        // The communicator initialization removes all Ice-related arguments from argc/argv
        //
        if(argc > 1)
        {
            cerr << argv[0] << ": too many arguments" << endl;
            status = 1;
        }
        else
        {
            auto adapter = communicator->createObjectAdapter("Context");

            auto servant = make_shared<ContextI>();

            auto interceptor = make_shared<InterceptorI>(servant);

            adapter->add(interceptor, Ice::stringToIdentity("context"));
            adapter->activate();

            communicator->waitForShutdown();
        }
    }
    catch(const std::exception& ex)
    {
        cerr << ex.what() << endl;
        status = 1;
    }

    return status;
}