[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