diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index 7f29d60..f095349 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -139,6 +139,7 @@ void ILibDuktape_net_server_IPC_PauseSink(ILibDuktape_DuplexStream *sender, void void ILibDuktape_net_server_IPC_ResumeSink(ILibDuktape_DuplexStream *sender, void *user); int ILibDuktape_net_server_IPC_unshiftSink(ILibDuktape_DuplexStream *sender, int unshiftBytes, void *user); duk_ret_t ILibDuktape_net_server_IPC_ConnectSink_Finalizer(duk_context *ctx); +BOOL ILibDuktape_server_ipc_ReadSink(void *chain, HANDLE h, ILibWaitHandle_ErrorStatus status, char *buffer, int bytesRead, void* user); #endif @@ -416,6 +417,9 @@ duk_ret_t ILibDuktape_net_socket_connect(duk_context *ctx) winIPC->mSocket = duk_get_heapptr(ctx, -1); winIPC->mChain = duk_ctx_chain(ctx); winIPC->paused = 1; + winIPC->metadata = "net.ipcSocket"; + winIPC->bufferLength = ILibDuktape_net_IPC_BUFFERSIZE; + ILibMemory_ReallocateRaw(&(winIPC->buffer), ILibDuktape_net_IPC_BUFFERSIZE); if ((winIPC->mPipeHandle = CreateFileA(path, GENERIC_READ | FILE_WRITE_DATA, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)) == INVALID_HANDLE_VALUE) { @@ -429,6 +433,7 @@ duk_ret_t ILibDuktape_net_socket_connect(duk_context *ctx) winIPC->ds->readableStream->paused = 1; ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "data", ILibDuktape_net_socket_ipc_dataHookCallback); ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "end", ILibDuktape_net_socket_ipc_dataHookCallback); + winIPC->reservedState = ILibChain_ReadAndSaveStateEx(winIPC->mChain, winIPC->mPipeHandle, &(winIPC->read_overlapped), winIPC->buffer, winIPC->bufferLength, ILibDuktape_server_ipc_ReadSink, winIPC, winIPC->metadata); if (onConnectSpecified == 0) { diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 89da431..f6cae79 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -3346,6 +3346,27 @@ void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h) } return(ret); } +void* ILibChain_ReadAndSaveStateEx(void *chain, HANDLE h, OVERLAPPED *p, char *buffer, int bufferLen, ILibChain_ReadEx_Handler handler, void *user, char *metadata) +{ + int metaDataLen = (int)(metadata == NULL ? 0 : strnlen_s(metadata, 1024)); + ILibChain_WaitHandleInfo *ret = (ILibChain_WaitHandleInfo*)ILibMemory_SmartAllocate(8 + metaDataLen + sizeof(ILibChain_WaitHandleInfo)); + ILibChain_ReadEx_data *state = (ILibChain_ReadEx_data*)ILibMemory_SmartAllocate(sizeof(ILibChain_ReadEx_data)); + BOOL r = ReadFile(h, buffer, bufferLen, NULL, p); + int e = GetLastError(); + + state->buffer = buffer; + state->p = p; + state->handler = handler; + state->fileHandle = h; + state->user = user; + + ret->node = p->hEvent; + ret->user = state; + ret->handler = ILibChain_ReadEx_Sink; + sprintf_s(ret->metaData, metaDataLen + 8, "%s [READ]", metadata == NULL ? "" : metadata); + + return(ret); +} void ILibChain_WaitHandle_RestoreState(void *chain, void *state) { ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)state; diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 51cdae5..f38902e 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -1008,6 +1008,7 @@ int ILibIsRunningOnChainThread(void* chain); void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h); void ILibChain_WaitHandle_RestoreState(void *chain, void *state); void ILibChain_WaitHandle_DestroySavedState(void *chain, void *state); + void* ILibChain_ReadAndSaveStateEx(void *chain, HANDLE h, OVERLAPPED *p, char *buffer, int bufferLen, ILibChain_ReadEx_Handler handler, void *user, char *metadata); BOOL ILibChain_WaitHandleAdded(void *chain, HANDLE h); void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata);