summaryrefslogtreecommitdiff
path: root/cpp/src/Glacier2/RouterI.cpp
blob: 7162786f31734e6f1b441c6c1f0c86ed11672439 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// **********************************************************************
//
// Copyright (c) 2003-2004 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

#include <Ice/RoutingTable.h>
#include <Glacier2/RouterI.h>

using namespace std;
using namespace Ice;
using namespace Glacier2;

class RouterLocator : public ServantLocator
{
public:

    RouterLocator(const ServerBlobjectPtr& serverBlobject) :
	_serverBlobject(serverBlobject)
    {
    }

    virtual ObjectPtr
    locate(const Current& current, LocalObjectPtr&)
    {
	return _serverBlobject;
    }
    
    virtual void
    finished(const Current&, const ObjectPtr&, const LocalObjectPtr&)
    {
    }
    
    virtual void
    deactivate(const string&)
    {
    }

private:

    ServerBlobjectPtr _serverBlobject;
};

Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter,
			   const ObjectAdapterPtr& serverAdapter,
			   const TransportInfoPtr& transport) :
    _communicator(clientAdapter->getCommunicator()),
    _routingTable(new IceInternal::RoutingTable),
    _routingTableTraceLevel(_communicator->getProperties()->getPropertyAsInt("Glacier2.Trace.RoutingTable")),
    _clientProxy(clientAdapter->createProxy(stringToIdentity("dummy"))),
    _clientBlobject(new ClientBlobject(_communicator, _routingTable, ""))
{
    try
    {
	if(serverAdapter)
	{
	    ObjectPrx& serverProxy = const_cast<ObjectPrx&>(_serverProxy);
	    Identity ident;
	    ident.name = "dummy";
	    ident.category.resize(20);
	    for(string::iterator p = ident.category.begin(); p != ident.category.end(); ++p)
	    {
		*p = static_cast<char>(33 + rand() % (127-33)); // We use ASCII 33-126 (from ! to ~, w/o space).
	    }
	    serverProxy = serverAdapter->createProxy(ident);
	    
	    ServerBlobjectPtr& serverBlobject = const_cast<ServerBlobjectPtr&>(_serverBlobject);
	    serverBlobject = new ServerBlobject(_communicator, transport);
	    serverAdapter->addServantLocator(new RouterLocator(serverBlobject), ident.category);
	    serverAdapter->activate();
	}
    }
    catch(...)
    {
	destroy();
	throw;
    }
}

Glacier2::RouterI::~RouterI()
{
}

void
Glacier2::RouterI::destroy()
{
    _clientBlobject->destroy();

    if(_serverBlobject)
    {
	_serverBlobject->destroy();
    }	
}

ObjectPrx
Glacier2::RouterI::getClientProxy(const Current&) const
{
    return _clientProxy;
}

ObjectPrx
Glacier2::RouterI::getServerProxy(const Current&) const
{
    return _serverProxy;
}

void
Glacier2::RouterI::addProxy(const ObjectPrx& proxy, const Current&)
{
    if(_routingTableTraceLevel)
    {
	Trace out(_communicator->getLogger(), "Glacier2");
	out << "adding proxy to routing table:\n" << _communicator->proxyToString(proxy);
    }

    _routingTable->add(proxy);
}

void
Glacier2::RouterI::createSession(const std::string&, const std::string&, const Current&)
{
    assert(false); // Must not be called in this router implementation.
}

ClientBlobjectPtr
Glacier2::RouterI::getClientBlobject() const
{
    return _clientBlobject;
}

ServerBlobjectPtr
Glacier2::RouterI::getServerBlobject() const
{
    return _serverBlobject;
}