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