* #35924: added zrtp module build instructions
diff --git a/jni/libzrtp/src/ZrtpCallbackWrapper.cpp b/jni/libzrtp/src/ZrtpCallbackWrapper.cpp
new file mode 100644
index 0000000..ca2dce6
--- /dev/null
+++ b/jni/libzrtp/src/ZrtpCallbackWrapper.cpp
@@ -0,0 +1,151 @@
+/*
+    This class maps the ZRTP C++ callback methods to C callback methods.
+    Copyright (C) 2010  Werner Dittmann
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include <libzrtpcpp/ZrtpCallbackWrapper.h>
+
+ZrtpCallbackWrapper::ZrtpCallbackWrapper(zrtp_Callbacks* cb, ZrtpContext* ctx) :
+        c_callbacks(cb), zrtpCtx(ctx)
+{
+    init();
+}
+
+void ZrtpCallbackWrapper::init()
+{
+}
+/*
+* The following methods implement the GNU ZRTP callback interface.
+* For detailed documentation refer to file ZrtpCallback.h
+*/
+int32_t ZrtpCallbackWrapper::sendDataZRTP(const unsigned char* data, int32_t length)
+{
+    return c_callbacks->zrtp_sendDataZRTP(zrtpCtx, data, length);
+}
+
+int32_t ZrtpCallbackWrapper::activateTimer (int32_t time)
+{
+    c_callbacks->zrtp_activateTimer(zrtpCtx, time);
+    return 1;
+}
+
+int32_t ZrtpCallbackWrapper::cancelTimer()
+{
+    c_callbacks->zrtp_cancelTimer(zrtpCtx);
+    return 0;
+}
+
+void ZrtpCallbackWrapper::sendInfo (GnuZrtpCodes::MessageSeverity severity, int32_t subCode)
+{
+    c_callbacks->zrtp_sendInfo(zrtpCtx, (int32_t)severity, subCode);
+}
+
+bool ZrtpCallbackWrapper::srtpSecretsReady(SrtpSecret_t* secrets, EnableSecurity part)
+{
+    C_SrtpSecret_t* cs = new C_SrtpSecret_t;
+    cs->symEncAlgorithm = (zrtp_SrtpAlgorithms)secrets->symEncAlgorithm;
+    cs->initKeyLen = secrets->initKeyLen;
+    cs->initSaltLen = secrets->initSaltLen;
+    cs->keyInitiator = secrets->keyInitiator;
+    cs->keyResponder = secrets->keyResponder;
+    cs->respKeyLen = secrets->respKeyLen;
+    cs->respSaltLen = secrets->respSaltLen;
+    cs->role = (int32_t)secrets->role;
+    cs->saltInitiator = secrets->saltInitiator;
+    cs->saltResponder = secrets->saltResponder;
+    cs->sas = new char [secrets->sas.size()+1];
+    strcpy(cs->sas, secrets->sas.c_str());
+    cs->authAlgorithm = (zrtp_SrtpAlgorithms)secrets->authAlgorithm;
+    cs->srtpAuthTagLen = secrets->srtpAuthTagLen;
+
+    bool retval = (c_callbacks->zrtp_srtpSecretsReady(zrtpCtx, cs, (int32_t)part) == 0) ? false : true ;
+
+    delete[] cs->sas;
+    delete cs;
+
+    return retval;
+}
+
+void ZrtpCallbackWrapper::srtpSecretsOff (EnableSecurity part )
+{
+    c_callbacks->zrtp_srtpSecretsOff(zrtpCtx, (int32_t)part);
+}
+
+void ZrtpCallbackWrapper::srtpSecretsOn ( std::string c, std::string s, bool verified )
+{
+    char* cc = new char [c.size()+1];
+    char* cs = new char [s.size()+1];
+
+    strcpy(cc, c.c_str());
+    if(!s.empty()) 
+        strcpy(cs, s.c_str());
+    else
+        *cs = '\0';
+
+    c_callbacks->zrtp_rtpSecretsOn(zrtpCtx, cc, cs, verified?1:0);
+
+    delete[] cc;
+    delete[] cs;
+}
+
+void ZrtpCallbackWrapper::handleGoClear()
+{
+}
+
+void ZrtpCallbackWrapper::zrtpNegotiationFailed(GnuZrtpCodes::MessageSeverity severity, int32_t subCode)
+{
+    c_callbacks->zrtp_zrtpNegotiationFailed(zrtpCtx, (int32_t)severity, subCode);
+}
+
+void ZrtpCallbackWrapper::zrtpNotSuppOther()
+{
+    c_callbacks->zrtp_zrtpNotSuppOther(zrtpCtx);
+}
+
+void ZrtpCallbackWrapper::synchEnter()
+{
+    c_callbacks->zrtp_synchEnter(zrtpCtx);
+}
+
+
+void ZrtpCallbackWrapper::synchLeave()
+{
+    c_callbacks->zrtp_synchLeave(zrtpCtx);
+}
+
+void ZrtpCallbackWrapper::zrtpAskEnrollment(GnuZrtpCodes::InfoEnrollment info)
+{
+    c_callbacks->zrtp_zrtpAskEnrollment(zrtpCtx, (zrtp_InfoEnrollment)info);
+}
+
+void ZrtpCallbackWrapper::zrtpInformEnrollment(GnuZrtpCodes::InfoEnrollment info)
+{
+    c_callbacks->zrtp_zrtpInformEnrollment(zrtpCtx, (zrtp_InfoEnrollment)info);
+
+}
+
+void ZrtpCallbackWrapper::signSAS(uint8_t* sasHash)
+{
+    c_callbacks->zrtp_signSAS(zrtpCtx, sasHash);
+}
+
+bool ZrtpCallbackWrapper::checkSASSignature(uint8_t* sasHash)
+{
+    bool retval = (c_callbacks->zrtp_checkSASSignature(zrtpCtx, sasHash) == 0) ? false : true;
+
+    return retval;
+}