[Pcsclite-cvs-commit] r4428 - in /trunk/PCSC/src: eventhandler.c eventhandler.h

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Tue Oct 6 08:39:10 UTC 2009


Author: rousseau
Date: Tue Oct  6 08:39:10 2009
New Revision: 4428

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4428
Log:
add EHRegisterClientForEvent(), EHUnregisterClientForEvent() and
EHSignalEventToClients()

Modified:
    trunk/PCSC/src/eventhandler.c
    trunk/PCSC/src/eventhandler.h

Modified: trunk/PCSC/src/eventhandler.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/eventhandler.c?rev=4428&op=diff
==============================================================================
--- trunk/PCSC/src/eventhandler.c (original)
+++ trunk/PCSC/src/eventhandler.c Tue Oct  6 08:39:10 2009
@@ -36,10 +36,71 @@
 #include "prothandler.h"
 #include "strlcpycat.h"
 #include "utils.h"
+#include "winscard_svc.h"
+#include "simclist.h"
 
 static PREADER_STATE readerStates[PCSCLITE_MAX_READERS_CONTEXTS];
+static list_t ClientsWaitingForEvent;	/**< list of client file descriptors */
+PCSCLITE_MUTEX_T ClientsWaitingForEvent_lock;	/**< lock for the above list */
 
 static void EHStatusHandlerThread(PREADER_CONTEXT);
+
+LONG EHRegisterClientForEvent(int32_t filedes)
+{
+	SYS_MutexLock(ClientsWaitingForEvent_lock);
+
+	list_append(&ClientsWaitingForEvent, &filedes);
+	
+	SYS_MutexUnLock(ClientsWaitingForEvent_lock);
+
+	return SCARD_S_SUCCESS;
+} /* EHRegisterClientForEvent */
+
+LONG EHUnregisterClientForEvent(int32_t filedes)
+{
+	LONG rv = SCARD_S_SUCCESS;
+	int pos, ret;
+
+	SYS_MutexLock(ClientsWaitingForEvent_lock);
+
+	pos = list_locate(&ClientsWaitingForEvent, &filedes);
+	ret = list_delete_at(&ClientsWaitingForEvent, pos);
+	
+	SYS_MutexUnLock(ClientsWaitingForEvent_lock);
+	
+	if (ret < 0)
+	{
+		Log2(PCSC_LOG_ERROR, "Can't remove client: %d", filedes);
+		rv = SCARD_F_INTERNAL_ERROR;
+	}
+
+	return rv;
+} /* EHUnregisterClientForEvent */
+
+/**
+ * Sends an asynchronous event to any waiting client
+ */
+LONG EHSignalEventToClients(void)
+{
+	LONG rv = SCARD_S_SUCCESS;
+	int32_t filedes;
+
+	SYS_MutexLock(ClientsWaitingForEvent_lock);
+
+	list_iterator_start(&ClientsWaitingForEvent);
+	while (list_iterator_hasnext(&ClientsWaitingForEvent))
+	{
+        filedes = *(int32_t *)list_iterator_next(&ClientsWaitingForEvent);
+		rv = MSGSignalClient(filedes, SCARD_S_SUCCESS);
+	}
+	list_iterator_stop(&ClientsWaitingForEvent);
+
+	list_clear(&ClientsWaitingForEvent);
+
+	SYS_MutexUnLock(ClientsWaitingForEvent_lock);
+
+	return rv;
+} /* EHSignalEventToClients */
 
 LONG EHInitializeEventStructures(void)
 {

Modified: trunk/PCSC/src/eventhandler.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/eventhandler.h?rev=4428&op=diff
==============================================================================
--- trunk/PCSC/src/eventhandler.h (original)
+++ trunk/PCSC/src/eventhandler.h Tue Oct  6 08:39:10 2009
@@ -42,6 +42,9 @@
 	}
 	READER_STATE, *PREADER_STATE;
 
+	LONG EHRegisterClientForEvent(int32_t filedes);
+	LONG EHUnregisterClientForEvent(int32_t filedes); 
+	LONG EHSignalEventToClients(void);
 	LONG EHInitializeEventStructures(void);
 	LONG EHSpawnEventHandler(PREADER_CONTEXT,
 		/*@null@*/ RESPONSECODE (*)(DWORD));




More information about the Pcsclite-cvs-commit mailing list