* #35924 (zrtp): switch to libzrtpcpp
diff --git a/jni/libzrtp/sources/common/EventClass.cpp b/jni/libzrtp/sources/common/EventClass.cpp
new file mode 100644
index 0000000..bfe117f9
--- /dev/null
+++ b/jni/libzrtp/sources/common/EventClass.cpp
@@ -0,0 +1,197 @@
+//
+// EventClass.cpp: implementation file
+//
+// Copyright (C) Walter E. Capers. All rights reserved
+//
+// This source is free to use as you like. If you make
+// any changes please keep me in the loop. Email them to
+// walt.capers@comcast.net.
+//
+// PURPOSE:
+//
+// To implement event signals as a C++ object
+//
+// REVISIONS
+// =======================================================
+// Date: 10.25.07
+// Name: Walter E. Capers
+// Description: File creation
+//
+// Date: 11/02/07
+// Name: Walter E. Capers
+// Description: removed unnessary code identified by On Freund from Code Project
+//
+//
+#include "Thread.h"
+
+#ifndef WINDOWS
+#include <sys/time.h>
+#endif
+
+#include <iostream>
+using namespace std;
+
+CEventClass::CEventClass(void)
+:m_bCreated(TRUE)
+{
+ memset(&m_owner,0,sizeof(ThreadId_t));
+#ifdef WINDOWS
+ m_event = CreateEvent(NULL,FALSE,FALSE,NULL);
+ if( !m_event )
+ {
+ m_bCreated = FALSE;
+ }
+#else
+ pthread_mutexattr_t mattr;
+
+ pthread_mutexattr_init(&mattr);
+ pthread_mutex_init(&m_lock,&mattr);
+ pthread_cond_init(&m_ready,NULL);
+
+#endif
+}
+
+CEventClass::~CEventClass(void)
+{
+#ifdef WINDOWS
+ CloseHandle(m_event);
+#else
+ pthread_cond_destroy(&m_ready);
+ pthread_mutex_destroy(&m_lock);
+#endif
+}
+
+
+/**
+ *
+ * Set
+ * set an event to signaled
+ *
+ **/
+void
+CEventClass::Set()
+{
+#ifdef WINDOWS
+ SetEvent(m_event);
+#else
+ pthread_cond_signal(&m_ready);
+#endif
+}
+
+/**
+ *
+ * Wait
+ * wait for an event -- wait for an event object
+ * to be set to signaled. must be paired with a
+ * call to reset within the same thread.
+ *
+ **/
+BOOL
+CEventClass::Wait(DWORD tmout)
+{
+
+ try
+ {
+ ThreadId_t id = CThread::ThreadId();
+ if( CThread::ThreadIdsEqual(&id,&m_owner) )
+ {
+ throw "\n\tinvalid Wait call, Wait can not be called more than once"
+ "\n\twithout a corresponding call to Reset!\n";
+ }
+ ThreadId_t zero;
+ memset(&zero,0,sizeof(ThreadId_t));
+
+ if( memcmp(&zero,&m_owner,sizeof(ThreadId_t)) != 0 )
+ {
+ throw "\n\tanother thread is already waiting on this event!\n";
+ }
+
+ m_owner = CThread::ThreadId();
+#ifdef WINDOWS
+ tmout = tmout == 0 ? INFINITE : tmout;
+ DWORD rc = WaitForSingleObject(m_event, tmout);
+ e_timeout = FALSE;
+ if (rc == WAIT_OBJECT_0) {
+ return TRUE;
+ }
+ else if (rc == WAIT_TIMEOUT) {
+ e_timeout = TRUE;
+ return TRUE;
+ }
+ else
+ return FALSE;
+#else
+ pthread_mutex_lock(&m_lock);
+ e_timeout = FALSE;
+ if (tmout == 0) {
+ pthread_cond_wait(&m_ready,&m_lock);
+ return TRUE;
+ }
+ struct timespec ts;
+ timeval tv;
+ gettimeofday(&tv, NULL);
+ ts.tv_sec = tv.tv_sec;
+ ts.tv_nsec = tv.tv_usec * 1000l;
+ ts.tv_sec += tmout / 1000;
+ ts.tv_nsec += (tmout % 1000) * 1000000l;
+ while(ts.tv_nsec > 1000000000l) {
+ ++ts.tv_sec;
+ ts.tv_nsec -= 1000000000l;
+ }
+ int rc = pthread_cond_timedwait(&m_ready, &m_lock, &ts);
+ if (rc == ETIMEDOUT)
+ e_timeout = TRUE;
+ return TRUE;
+#endif
+ }
+ catch( char *psz )
+ {
+#ifdef WINDOWS
+ MessageBoxA(NULL,&psz[2],"Fatal exception CEventClass::Wait",MB_ICONHAND);
+ exit(-1);
+#else
+ cerr << "Fatal exception CEventClass::Wait: " << psz;
+#endif
+
+ }
+ return TRUE;
+}
+
+
+/**
+ *
+ * Reset
+ * reset an event flag to unsignaled
+ * wait must be paired with reset within the same thread.
+ *
+ **/
+void
+CEventClass::Reset()
+{
+ try
+ {
+ ThreadId_t id = CThread::ThreadId();
+ if( !CThread::ThreadIdsEqual(&id,&m_owner) )
+ {
+ throw "\n\tunbalanced call to Reset, Reset must be called from\n"
+ "\n\tthe same Wait-Reset pair!\n";
+ }
+
+ memset(&m_owner,0,sizeof(ThreadId_t));
+
+#ifndef WINDOWS
+ pthread_mutex_unlock(&m_lock);
+#endif
+ }
+ catch( char *psz )
+ {
+#ifdef WINDOWS
+ MessageBoxA(NULL,&psz[2],"Fatal exception CEventClass::Reset",MB_ICONHAND);
+ exit(-1);
+#else
+ cerr << "Fatal exception CEventClass::Reset: " << psz;
+#endif
+
+ }
+}
+