blob: 0e28150cfc320ed8f4a9a4a9668738cf9034c151 [file] [log] [blame]
Adrien Béraud04d822c2015-04-02 17:44:36 -04001/*
Adrien Béraudec528bb2016-01-14 16:52:51 -05002 * Copyright (C) 2004-2016 Savoir-faire Linux Inc.
3 *
Adrien Béraud04d822c2015-04-02 17:44:36 -04004 * Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
Adrien Béraudec528bb2016-01-14 16:52:51 -05005 *
Adrien Béraud04d822c2015-04-02 17:44:36 -04006 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Adrien Béraud04d822c2015-04-02 17:44:36 -040019 */
20
21/* File : jni_interface.i */
22%module (directors="1") Ringservice
23
24#define SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON
25%include "typemaps.i"
26%include "std_string.i" /* std::string typemaps */
27%include "enums.swg"
28%include "arrays_java.i";
29%include "carrays.i";
30%include "std_map.i";
31%include "std_vector.i";
32%include "stdint.i";
Adrien Béraud7f97ca92015-06-07 15:36:06 -040033%header %{
34
35#include <android/log.h>
36
37%}
Adrien Béraud04d822c2015-04-02 17:44:36 -040038
39/* void* shall be handled as byte arrays */
40%typemap(jni) void * "void *"
41%typemap(jtype) void * "byte[]"
42%typemap(jstype) void * "byte[]"
43%typemap(javain) void * "$javainput"
44%typemap(in) void * %{
45 $1 = $input;
46%}
47%typemap(javadirectorin) void * "$jniinput"
48%typemap(out) void * %{
49 $result = $1;
50%}
51%typemap(javaout) void * {
52 return $jnicall;
53}
54
55namespace std {
Adrien Béraud7f97ca92015-06-07 15:36:06 -040056
Adrien Béraudb30e6dd2015-06-10 12:22:15 -040057%typemap(javacode) map<string, string> %{
58 public static $javaclassname toSwig(java.util.Map<String,String> in) {
59 $javaclassname n = new $javaclassname();
60 for (java.util.Map.Entry<String, String> entry : in.entrySet()) {
61 n.set(entry.getKey(), entry.getValue());
Adrien Béraud7f97ca92015-06-07 15:36:06 -040062 }
Adrien Béraudb30e6dd2015-06-10 12:22:15 -040063 return n;
64 }
Adrien Béraudda712a42015-11-22 23:45:26 -050065 public java.util.HashMap<String,String> toNative() {
66 java.util.HashMap<String,String> out = new java.util.HashMap<>((int)size());
Adrien Béraudb30e6dd2015-06-10 12:22:15 -040067 StringVect keys = keys();
68 for (String s : keys)
69 out.put(s, get(s));
70 return out;
71 }
Adrien Béraud2246a832016-01-27 15:05:25 -050072 public java.util.HashMap<String,String> toNativeFromUtf8() {
73 java.util.HashMap<String,String> out = new java.util.HashMap<>((int)size());
74 StringVect keys = keys();
75 for (String s : keys)
76 out.put(s, getRaw(s).toJavaString());
77 return out;
78 }
Adrien Béraudb30e6dd2015-06-10 12:22:15 -040079%}
80%extend map<string, string> {
81 std::vector<std::string> keys() const {
82 std::vector<std::string> k;
83 k.reserve($self->size());
84 for (const auto& i : *$self)
85 k.push_back(i.first);
86 return k;
Adrien Béraud7f97ca92015-06-07 15:36:06 -040087 }
Adrien Béraud2246a832016-01-27 15:05:25 -050088 void setRaw(std::string key, const vector<uint8_t>& value) {
89 (*$self)[key] = std::string(value.data(), value.data()+value.size());
90 }
91 std::vector<uint8_t> getRaw(std::string key) {
92 auto& v = $self->at(key);
93 return {v.begin(), v.end()};
94 }
Adrien Béraudb30e6dd2015-06-10 12:22:15 -040095}
96%template(StringMap) map<string, string>;
Adrien Béraud7f97ca92015-06-07 15:36:06 -040097
Adrien Béraudb30e6dd2015-06-10 12:22:15 -040098%typemap(javabase) vector<string> "java.util.AbstractList<String>"
99%typemap(javainterface) vector<string> "java.util.RandomAccess"
100%extend vector<string> {
101 value_type set(int i, const value_type& in) throw (std::out_of_range) {
102 const std::string old = $self->at(i);
103 $self->at(i) = in;
104 return old;
105 }
106 bool add(const value_type& in) {
107 $self->push_back(in);
108 return true;
109 }
110 int32_t size() const {
111 return $self->size();
112 }
113}
114%template(StringVect) vector<string>;
115
116%typemap(javacode) vector< map<string,string> > %{
117 public java.util.ArrayList<java.util.Map<String, String>> toNative() {
118 java.util.ArrayList<java.util.Map<String, String>> out = new java.util.ArrayList<>();
119 for (int i = 0; i < size(); ++i)
120 out.add(get(i).toNative());
121 return out;
122 }
123%}
124%template(VectMap) vector< map<string,string> >;
125%template(IntegerMap) map<string,int>;
126%template(IntVect) vector<int32_t>;
127%template(UintVect) vector<uint32_t>;
Adrien Béraud2246a832016-01-27 15:05:25 -0500128
129%typemap(javacode) vector<uint8_t> %{
130 public static Blob fromString(String in) {
131 byte[] dat;
132 try {
133 dat = in.getBytes("UTF-8");
134 } catch (java.io.UnsupportedEncodingException e) {
135 dat = in.getBytes();
136 }
137 Blob n = new Blob(dat.length);
138 for (int i=0; i<dat.length; i++)
139 n.set(i, dat[i]);
140 return n;
141 }
142 public String toJavaString() {
143 byte[] dat = new byte[(int)size()];
144 for (int i=0; i<dat.length; i++)
145 dat[i] = (byte)get(i);
146 try {
147 return new String(dat, "utf-8");
148 } catch (java.io.UnsupportedEncodingException e) {
149 return "";
150 }
151 }
152%}
Adrien Béraudb30e6dd2015-06-10 12:22:15 -0400153%template(Blob) vector<uint8_t>;
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500154%template(FloatVect) vector<float>;
Adrien Béraud04d822c2015-04-02 17:44:36 -0400155}
156
157/* not parsed by SWIG but needed by generated C files */
158%header %{
159
160#include <functional>
161
162%}
163
164/* parsed by SWIG to generate all the glue */
165/* %include "../managerimpl.h" */
166/* %include <client/callmanager.h> */
167
168%include "managerimpl.i"
169%include "callmanager.i"
170%include "configurationmanager.i"
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500171%include "videomanager.i"
Adrien Béraud04d822c2015-04-02 17:44:36 -0400172
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400173#include "dring/callmanager_interface.h"
174
Adrien Béraud04d822c2015-04-02 17:44:36 -0400175%inline %{
176/* some functions that need to be declared in *_wrap.cpp
177 * that are not declared elsewhere in the c++ code
178 */
Adrien Béraud04d822c2015-04-02 17:44:36 -0400179
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500180void init(ConfigurationCallback* confM, Callback* callM, VideoCallback* videoM) {
Adrien Béraud04d822c2015-04-02 17:44:36 -0400181 using namespace std::placeholders;
Adrien Béraud04d822c2015-04-02 17:44:36 -0400182
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400183 using std::bind;
184 using DRing::exportable_callback;
185 using DRing::CallSignal;
186 using DRing::ConfigurationSignal;
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500187 using DRing::VideoSignal;
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400188
189 using SharedCallback = std::shared_ptr<DRing::CallbackWrapperBase>;
Adrien Béraud04d822c2015-04-02 17:44:36 -0400190
191 // Call event handlers
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400192 const std::map<std::string, SharedCallback> callEvHandlers = {
193 exportable_callback<CallSignal::StateChange>(bind(&Callback::callStateChanged, callM, _1, _2, _3)),
194 exportable_callback<CallSignal::TransferFailed>(bind(&Callback::transferFailed, callM)),
195 exportable_callback<CallSignal::TransferSucceeded>(bind(&Callback::transferSucceeded, callM)),
196 exportable_callback<CallSignal::RecordPlaybackStopped>(bind(&Callback::recordPlaybackStopped, callM, _1)),
197 exportable_callback<CallSignal::VoiceMailNotify>(bind(&Callback::voiceMailNotify, callM, _1, _2)),
198 exportable_callback<CallSignal::IncomingMessage>(bind(&Callback::incomingMessage, callM, _1, _2, _3)),
199 exportable_callback<CallSignal::IncomingCall>(bind(&Callback::incomingCall, callM, _1, _2, _3)),
200 exportable_callback<CallSignal::RecordPlaybackFilepath>(bind(&Callback::recordPlaybackFilepath, callM, _1, _2)),
201 exportable_callback<CallSignal::ConferenceCreated>(bind(&Callback::conferenceCreated, callM, _1)),
202 exportable_callback<CallSignal::ConferenceChanged>(bind(&Callback::conferenceChanged, callM, _1, _2)),
203 exportable_callback<CallSignal::UpdatePlaybackScale>(bind(&Callback::updatePlaybackScale, callM, _1, _2, _3)),
204 exportable_callback<CallSignal::ConferenceRemoved>(bind(&Callback::conferenceRemoved, callM, _1)),
205 exportable_callback<CallSignal::NewCallCreated>(bind(&Callback::newCallCreated, callM, _1, _2, _3)),
206 exportable_callback<CallSignal::RecordingStateChanged>(bind(&Callback::recordingStateChanged, callM, _1, _2)),
207 exportable_callback<CallSignal::SecureSdesOn>(bind(&Callback::secureSdesOn, callM, _1)),
208 exportable_callback<CallSignal::SecureSdesOff>(bind(&Callback::secureSdesOff, callM, _1)),
209 exportable_callback<CallSignal::SecureZrtpOn>(bind(&Callback::secureZrtpOn, callM, _1, _2)),
210 exportable_callback<CallSignal::SecureZrtpOff>(bind(&Callback::secureZrtpOff, callM, _1)),
211 exportable_callback<CallSignal::ShowSAS>(bind(&Callback::showSAS, callM, _1, _2, _3)),
212 exportable_callback<CallSignal::ZrtpNotSuppOther>(bind(&Callback::zrtpNotSuppOther, callM, _1)),
213 exportable_callback<CallSignal::ZrtpNegotiationFailed>(bind(&Callback::zrtpNegotiationFailed, callM, _1, _2, _3)),
214 exportable_callback<CallSignal::RtcpReportReceived>(bind(&Callback::onRtcpReportReceived, callM, _1, _2)),
215 exportable_callback<CallSignal::PeerHold>(bind(&Callback::peerHold, callM, _1, _2))
Adrien Béraud04d822c2015-04-02 17:44:36 -0400216 };
217
218 // Configuration event handlers
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400219 const std::map<std::string, SharedCallback> configEvHandlers = {
220 exportable_callback<ConfigurationSignal::VolumeChanged>(bind(&ConfigurationCallback::volumeChanged, confM, _1, _2)),
221 exportable_callback<ConfigurationSignal::AccountsChanged>(bind(&ConfigurationCallback::accountsChanged, confM)),
222 exportable_callback<ConfigurationSignal::StunStatusFailed>(bind(&ConfigurationCallback::stunStatusFailure, confM, _1)),
223 exportable_callback<ConfigurationSignal::RegistrationStateChanged>(bind(&ConfigurationCallback::registrationStateChanged, confM, _1, _2, _3, _4)),
224 exportable_callback<ConfigurationSignal::VolatileDetailsChanged>(bind(&ConfigurationCallback::volatileAccountDetailsChanged, confM, _1, _2)),
225 exportable_callback<ConfigurationSignal::Error>(bind(&ConfigurationCallback::errorAlert, confM, _1)),
226 exportable_callback<ConfigurationSignal::IncomingAccountMessage>(bind(&ConfigurationCallback::incomingAccountMessage, confM, _1, _2, _3 )),
Adrien Béraud9f4d86d2015-07-15 10:52:16 -0400227 exportable_callback<ConfigurationSignal::IncomingTrustRequest>(bind(&ConfigurationCallback::incomingTrustRequest, confM, _1, _2, _3, _4 )),
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400228 exportable_callback<ConfigurationSignal::CertificatePinned>(bind(&ConfigurationCallback::certificatePinned, confM, _1 )),
229 exportable_callback<ConfigurationSignal::CertificatePathPinned>(bind(&ConfigurationCallback::certificatePathPinned, confM, _1, _2 )),
230 exportable_callback<ConfigurationSignal::CertificateExpired>(bind(&ConfigurationCallback::certificateExpired, confM, _1 )),
231 exportable_callback<ConfigurationSignal::CertificateStateChanged>(bind(&ConfigurationCallback::certificateStateChanged, confM, _1, _2, _3 )),
Adrien Béraudb30e6dd2015-06-10 12:22:15 -0400232 exportable_callback<ConfigurationSignal::GetHardwareAudioFormat>(bind(&ConfigurationCallback::getHardwareAudioFormat, confM, _1 )),
Adrien Béraud62a280b2015-06-15 23:32:19 -0400233 exportable_callback<ConfigurationSignal::GetAppDataPath>(bind(&ConfigurationCallback::getAppDataPath, confM, _1, _2 ))
Adrien Béraud04d822c2015-04-02 17:44:36 -0400234 };
235
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400236/*
237 // Presence event handlers
238 const std::map<std::string, SharedCallback> presEvHandlers = {
239 exportable_callback<PresenceSignal::NewServerSubscriptionRequest>(bind(&DBusPresenceManager::newServerSubscriptionRequest, presM, _1)),
240 exportable_callback<PresenceSignal::ServerError>(bind(&DBusPresenceManager::serverError, presM, _1, _2, _3)),
241 exportable_callback<PresenceSignal::NewBuddyNotification>(bind(&DBusPresenceManager::newBuddyNotification, presM, _1, _2, _3, _4)),
242 exportable_callback<PresenceSignal::SubscriptionStateChanged>(bind(&DBusPresenceManager::subscriptionStateChanged, presM, _1, _2, _3)),
243 };
244
245#ifdef RING_VIDEO
246 // Video event handlers
247 const std::map<std::string, SharedCallback> videoEvHandlers = {
248 exportable_callback<VideoSignal::DeviceEvent>(bind(&DBusVideoManager::deviceEvent, videoM)),
249 exportable_callback<VideoSignal::DecodingStarted>(bind(&DBusVideoManager::startedDecoding, videoM, _1, _2, _3, _4, _5)),
250 exportable_callback<VideoSignal::DecodingStopped>(bind(&DBusVideoManager::stoppedDecoding, videoM, _1, _2, _3)),
251 };
252#endif
253*/
254
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500255 const std::map<std::string, SharedCallback> videoEvHandlers = {
256 exportable_callback<VideoSignal::GetCameraInfo>(bind(&VideoCallback::getCameraInfo, videoM, _1, _2, _3, _4)),
257 exportable_callback<VideoSignal::SetParameters>(bind(&VideoCallback::setParameters, videoM, _1, _2, _3, _4, _5)),
258 exportable_callback<VideoSignal::StartCapture>(bind(&VideoCallback::startCapture, videoM, _1)),
259 exportable_callback<VideoSignal::StopCapture>(bind(&VideoCallback::stopCapture, videoM)),
260 exportable_callback<VideoSignal::DecodingStarted>(bind(&VideoCallback::decodingStarted, videoM, _1, _2, _3, _4, _5)),
261 exportable_callback<VideoSignal::DecodingStopped>(bind(&VideoCallback::decodingStopped, videoM, _1, _2, _3)),
262 };
263
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400264 if (!DRing::init(static_cast<DRing::InitFlag>(DRing::DRING_FLAG_DEBUG)))
265 return -1;
266
267 registerCallHandlers(callEvHandlers);
268 registerConfHandlers(configEvHandlers);
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500269/* registerPresHandlers(presEvHandlers); */
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400270 registerVideoHandlers(videoEvHandlers);
Adrien Béraudfb6341f2016-03-07 16:18:54 -0500271
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400272 DRing::start();
Adrien Béraud04d822c2015-04-02 17:44:36 -0400273}
274
Adrien Béraud7f97ca92015-06-07 15:36:06 -0400275
Adrien Béraud04d822c2015-04-02 17:44:36 -0400276%}
277#ifndef SWIG
278/* some bad declarations */
279#endif