1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4
5 #include <Ice/Ice.h>
6 #include <BlobjectI.h>
7 #include <Test.h>
8 #include <TestHelper.h>
9
10 using namespace std;
11
12 bool
invokeInternal(Ice::InputStream & in,vector<Ice::Byte> & outEncaps,const Ice::Current & current)13 invokeInternal(Ice::InputStream& in, vector<Ice::Byte>& outEncaps, const Ice::Current& current)
14 {
15 Ice::CommunicatorPtr communicator = current.adapter->getCommunicator();
16 Ice::OutputStream out(communicator);
17 out.startEncapsulation();
18 if(current.operation == "opOneway")
19 {
20 return true;
21 }
22 else if(current.operation == "opString")
23 {
24 string s;
25 in.startEncapsulation();
26 in.read(s);
27 in.endEncapsulation();
28 out.write(s);
29 out.write(s);
30 out.endEncapsulation();
31 out.finished(outEncaps);
32 return true;
33 }
34 else if(current.operation == "opException")
35 {
36 if(current.ctx.find("raise") != current.ctx.end())
37 {
38 throw Test::MyException();
39 }
40 Test::MyException ex;
41 out.writeException(ex);
42 out.endEncapsulation();
43 out.finished(outEncaps);
44 return false;
45 }
46 else if(current.operation == "shutdown")
47 {
48 out.endEncapsulation();
49 out.finished(outEncaps);
50 communicator->shutdown();
51 return true;
52 }
53 else if(current.operation == "ice_isA")
54 {
55 string s;
56 in.startEncapsulation();
57 in.read(s);
58 in.endEncapsulation();
59 if(s == "::Test::MyClass")
60 {
61 out.write(true);
62 }
63 else
64 {
65 out.write(false);
66 }
67 out.endEncapsulation();
68 out.finished(outEncaps);
69 return true;
70 }
71 else
72 {
73 Ice::OperationNotExistException ex(__FILE__, __LINE__);
74 ex.id = current.id;
75 ex.facet = current.facet;
76 ex.operation = current.operation;
77 throw ex;
78 }
79 }
80
81 bool
ice_invoke(ICE_IN (vector<Ice::Byte>)inEncaps,vector<Ice::Byte> & outEncaps,const Ice::Current & current)82 BlobjectI::ice_invoke(ICE_IN(vector<Ice::Byte>) inEncaps, vector<Ice::Byte>& outEncaps, const Ice::Current& current)
83 {
84 Ice::InputStream in(current.adapter->getCommunicator(), current.encoding, inEncaps);
85 return invokeInternal(in, outEncaps, current);
86 }
87
88 bool
ice_invoke(ICE_IN (pair<const Ice::Byte *,const Ice::Byte * >)inEncaps,vector<Ice::Byte> & outEncaps,const Ice::Current & current)89 BlobjectArrayI::ice_invoke(ICE_IN(pair<const Ice::Byte*, const Ice::Byte*>) inEncaps, vector<Ice::Byte>& outEncaps,
90 const Ice::Current& current)
91 {
92 Ice::InputStream in(current.adapter->getCommunicator(), current.encoding, inEncaps);
93 return invokeInternal(in, outEncaps, current);
94 }
95
96 #ifdef ICE_CPP11_MAPPING
97 void
ice_invokeAsync(vector<Ice::Byte> inEncaps,function<void (bool,const vector<Ice::Byte> &)> response,function<void (exception_ptr)>,const Ice::Current & current)98 BlobjectAsyncI::ice_invokeAsync(vector<Ice::Byte> inEncaps,
99 function<void(bool, const vector<Ice::Byte>&)> response,
100 function<void(exception_ptr)>,
101 const Ice::Current& current)
102 {
103 Ice::InputStream in(current.adapter->getCommunicator(), inEncaps);
104 vector<Ice::Byte> outEncaps;
105 bool ok = invokeInternal(in, outEncaps, current);
106 response(ok, outEncaps);
107 }
108
109 void
ice_invokeAsync(pair<const Ice::Byte *,const Ice::Byte * > inEncaps,function<void (bool,const pair<const Ice::Byte *,const Ice::Byte * > &)> response,function<void (exception_ptr)>,const Ice::Current & current)110 BlobjectArrayAsyncI::ice_invokeAsync(pair<const Ice::Byte*, const Ice::Byte*> inEncaps,
111 function<void(bool, const pair<const Ice::Byte*, const Ice::Byte*>&)> response,
112 function<void(exception_ptr)>,
113 const Ice::Current& current)
114 {
115 Ice::InputStream in(current.adapter->getCommunicator(), inEncaps);
116 vector<Ice::Byte> outEncaps;
117 bool ok = invokeInternal(in, outEncaps, current);
118 #if (defined(_MSC_VER) && (_MSC_VER >= 1600))
119 pair<const Ice::Byte*, const Ice::Byte*> outPair(static_cast<const Ice::Byte*>(nullptr), static_cast<const Ice::Byte*>(nullptr));
120 #else
121 pair<const Ice::Byte*, const Ice::Byte*> outPair(0, 0);
122 #endif
123 if(outEncaps.size() != 0)
124 {
125 outPair.first = &outEncaps[0];
126 outPair.second = &outEncaps[0] + outEncaps.size();
127 }
128 response(ok, outPair);
129 }
130 #else
131 void
ice_invoke_async(const Ice::AMD_Object_ice_invokePtr & cb,const vector<Ice::Byte> & inEncaps,const Ice::Current & current)132 BlobjectAsyncI::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& cb, const vector<Ice::Byte>& inEncaps,
133 const Ice::Current& current)
134 {
135 Ice::InputStream in(current.adapter->getCommunicator(), current.encoding, inEncaps);
136 vector<Ice::Byte> outEncaps;
137 bool ok = invokeInternal(in, outEncaps, current);
138 cb->ice_response(ok, outEncaps);
139 }
140
141 void
ice_invoke_async(const Ice::AMD_Object_ice_invokePtr & cb,const pair<const Ice::Byte *,const Ice::Byte * > & inEncaps,const Ice::Current & current)142 BlobjectArrayAsyncI::ice_invoke_async(const Ice::AMD_Object_ice_invokePtr& cb,
143 const pair<const Ice::Byte*, const Ice::Byte*>& inEncaps,
144 const Ice::Current& current)
145 {
146 Ice::InputStream in(current.adapter->getCommunicator(), current.encoding, inEncaps);
147 vector<Ice::Byte> outEncaps;
148 bool ok = invokeInternal(in, outEncaps, current);
149 #if (defined(_MSC_VER) && (_MSC_VER >= 1600))
150 pair<const Ice::Byte*, const Ice::Byte*> outPair(static_cast<const Ice::Byte*>(nullptr), static_cast<const Ice::Byte*>(nullptr));
151 #else
152 pair<const Ice::Byte*, const Ice::Byte*> outPair(0, 0);
153 #endif
154 if(outEncaps.size() != 0)
155 {
156 outPair.first = &outEncaps[0];
157 outPair.second = &outEncaps[0] + outEncaps.size();
158 }
159 cb->ice_response(ok, outPair);
160 }
161 #endif
162