#ifndef CARDREADER_H #define CARDREADER_H #include #include #include #include static v8::Persistent name_symbol; static v8::Persistent connected_symbol; class CardReader: public node::ObjectWrap { // We use a struct to store information about the asynchronous "work request". struct Baton { uv_work_t request; v8::Persistent callback; CardReader *reader; void *input; void *result; }; struct ConnectResult { LONG result; unsigned long card_protocol; }; struct TransmitInput { uint32_t card_protocol; unsigned char *in_data; unsigned long in_len; unsigned long out_len; }; struct TransmitResult { LONG result; unsigned char *data; unsigned long len; }; struct AsyncResult { LONG result; unsigned long status; bool do_exit; }; struct AsyncBaton { uv_async_t async; v8::Persistent callback; CardReader *reader; AsyncResult *async_result; }; public: static void init(v8::Handle target); private: CardReader(const std::string &reader_name); ~CardReader(); static v8::Persistent constructor; static v8::Handle New(const v8::Arguments& args); static v8::Handle GetStatus(const v8::Arguments& args); static v8::Handle Connect(const v8::Arguments& args); static v8::Handle Disconnect(const v8::Arguments& args); static v8::Handle Transmit(const v8::Arguments& args); static v8::Handle Close(const v8::Arguments& args); static void HandleReaderStatusChange(uv_async_t *handle, int status); static void* HandlerFunction(void* arg); static void DoConnect(uv_work_t* req); static void AfterConnect(uv_work_t* req); static void DoDisconnect(uv_work_t* req); static void AfterDisconnect(uv_work_t* req); static void DoTransmit(uv_work_t* req); static void AfterTransmit(uv_work_t* req); static void CloseCallback(uv_handle_t *handle); private: SCARDCONTEXT m_card_context; SCARDCONTEXT m_status_card_context; SCARDHANDLE m_card_handle; std::string m_name; pthread_t m_status_thread; pthread_mutex_t m_mutex; }; #endif /* CARDREADER_H */