mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-21 10:43:36 +00:00
Added ILibChain_ReadAndSaveStateEx()
Updated Windows IPC Socket, so client connection uses ReadAndSaveState, to start in paused state.
This commit is contained in:
@@ -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);
|
void ILibDuktape_net_server_IPC_ResumeSink(ILibDuktape_DuplexStream *sender, void *user);
|
||||||
int ILibDuktape_net_server_IPC_unshiftSink(ILibDuktape_DuplexStream *sender, int unshiftBytes, 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);
|
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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -416,6 +417,9 @@ duk_ret_t ILibDuktape_net_socket_connect(duk_context *ctx)
|
|||||||
winIPC->mSocket = duk_get_heapptr(ctx, -1);
|
winIPC->mSocket = duk_get_heapptr(ctx, -1);
|
||||||
winIPC->mChain = duk_ctx_chain(ctx);
|
winIPC->mChain = duk_ctx_chain(ctx);
|
||||||
winIPC->paused = 1;
|
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)
|
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;
|
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), "data", ILibDuktape_net_socket_ipc_dataHookCallback);
|
||||||
ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "end", 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)
|
if (onConnectSpecified == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3346,6 +3346,27 @@ void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h)
|
|||||||
}
|
}
|
||||||
return(ret);
|
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)
|
void ILibChain_WaitHandle_RestoreState(void *chain, void *state)
|
||||||
{
|
{
|
||||||
ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)state;
|
ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)state;
|
||||||
|
|||||||
@@ -1008,6 +1008,7 @@ int ILibIsRunningOnChainThread(void* chain);
|
|||||||
void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h);
|
void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h);
|
||||||
void ILibChain_WaitHandle_RestoreState(void *chain, void *state);
|
void ILibChain_WaitHandle_RestoreState(void *chain, void *state);
|
||||||
void ILibChain_WaitHandle_DestroySavedState(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);
|
BOOL ILibChain_WaitHandleAdded(void *chain, HANDLE h);
|
||||||
|
|
||||||
void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata);
|
void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata);
|
||||||
|
|||||||
Reference in New Issue
Block a user