diff --git a/cwUi.cpp b/cwUi.cpp index 3ba352f..722ca9f 100644 --- a/cwUi.cpp +++ b/cwUi.cpp @@ -166,7 +166,7 @@ namespace cw bucket_t* b = p->hashA + hash_idx; for(; b!=nullptr; b=b->link) - if( b->ele->appId==appId && b->ele->logical_parent->uuId==parentUuId && (chanId==kInvalidId || b->ele->chanId==chanId) ) + if( b->ele != nullptr && b->ele->logical_parent!=nullptr && b->ele->appId==appId && b->ele->logical_parent->uuId==parentUuId && (chanId==kInvalidId || b->ele->chanId==chanId) ) return b->ele->uuId; } @@ -2249,7 +2249,6 @@ namespace cw void* cbArg; uiCallback_t uiCbFunc; websock::cbFunc_t wsCbFunc; - unsigned wsTimeOutMs; unsigned idleMsgPeriodMs; time::spec_t lastRecvMsgTimeStamp; } ui_ws_t; @@ -2303,7 +2302,7 @@ namespace cw ui_ws_t* p = static_cast(cbArg); return websock::send( p->wsH, kUiProtocolId, wsSessId, msg, msgByteN ); } - + } } } @@ -2331,13 +2330,18 @@ cw::rc_t cw::ui::ws::parseArgs( const object_t& o, args_t& args, const char* ob "rcvBufByteN", args.rcvBufByteN, "xmtBufByteN", args.xmtBufByteN, "fmtBufByteN", args.fmtBufByteN, - "websockTimeOutMs", args.wsTimeOutMs, "idleMsgPeriodMs", args.idleMsgPeriodMs, + "queueBlkCnt", args.queueBlkCnt, + "queueBlkByteCnt", args.queueBlkByteCnt, "uiCfgFn", uiCfgFn )) != kOkRC ) { rc = cwLogError(rc,"'ui' cfg. parse failed."); } + if( op->find_child("websockTimeOutMs") != nullptr ) + cwLogWarning("The UI parameter 'websockTimeOutMs' is obsolete and ignored."); + + // expand the physical root directory if((physRootDir = filesys::expandPath( args.physRootDir)) == nullptr ) { @@ -2388,11 +2392,12 @@ cw::rc_t cw::ui::ws::create( handle_t& h, appIdMapN, wsCbFunc, args.dfltPageFn, - args.wsTimeOutMs, args.idleMsgPeriodMs, args.rcvBufByteN, args.xmtBufByteN, - args.fmtBufByteN ); + args.fmtBufByteN, + args.queueBlkCnt, + args.queueBlkByteCnt); } @@ -2406,11 +2411,12 @@ cw::rc_t cw::ui::ws::create( handle_t& h, unsigned appIdMapN, websock::cbFunc_t wsCbFunc, const char* dfltPageFn, - unsigned websockTimeOutMs, unsigned idleMsgPeriodMs, unsigned rcvBufByteN, unsigned xmtBufByteN, - unsigned fmtBufByteN ) + unsigned fmtBufByteN, + unsigned queueBlkCnt, + unsigned queueBlkByteCnt ) { rc_t rc = kOkRC; @@ -2430,7 +2436,7 @@ cw::rc_t cw::ui::ws::create( handle_t& h, void* wsCbA = wsCbFunc==nullptr ? p : cbArg; // create the websocket - if((rc = websock::create(p->wsH, wsCbF, wsCbA, physRootDir, dfltPageFn, port, protocolA, protocolN )) != kOkRC ) + if((rc = websock::create(p->wsH, wsCbF, wsCbA, physRootDir, dfltPageFn, port, protocolA, protocolN, queueBlkCnt, queueBlkByteCnt )) != kOkRC ) { cwLogError(rc,"UI Websock create failed."); goto errLabel; @@ -2446,7 +2452,6 @@ cw::rc_t cw::ui::ws::create( handle_t& h, p->cbArg = cbArg; p->uiCbFunc = uiCbFunc; p->wsCbFunc = wsCbFunc; - p->wsTimeOutMs = websockTimeOutMs; p->idleMsgPeriodMs = idleMsgPeriodMs; // initialize the last received msg time::get(p->lastRecvMsgTimeStamp); @@ -2479,13 +2484,13 @@ cw::rc_t cw::ui::ws::destroy( handle_t& h ) return rc; } -cw::rc_t cw::ui::ws::exec( handle_t h ) +cw::rc_t cw::ui::ws::exec( handle_t h, unsigned wsTimeOutMs ) { - rc_t rc = kOkRC; ui_ws_t* p = _handleToPtr(h); + rc_t rc = kOkRC; time::spec_t t; - if((rc = websock::exec( p->wsH, p->wsTimeOutMs )) != kOkRC) + if((rc = websock::exec( p->wsH, wsTimeOutMs )) != kOkRC) cwLogError(rc,"The UI websock execution failed."); // make the idle callback @@ -2500,6 +2505,7 @@ cw::rc_t cw::ui::ws::exec( handle_t h ) return rc; } + cw::rc_t cw::ui::ws::onReceive( handle_t h, unsigned protocolId, unsigned sessionId, websock::msgTypeId_t msg_type, const void* msg, unsigned byteN ) { ui_ws_t* p = _handleToPtr(h); @@ -2521,6 +2527,7 @@ cw::ui::handle_t cw::ui::ws::uiHandle( handle_t h ) return p->uiH; } + void cw::ui::ws::realTimeReport( handle_t h ) { ui_ws_t* p = _handleToPtr(h); @@ -2539,6 +2546,7 @@ namespace cw { ws::handle_t wsUiH; thread::handle_t thH; + unsigned wsTimeOutMs; } ui_ws_srv_t; ui_ws_srv_t* _handleToPtr(handle_t h ) @@ -2563,7 +2571,7 @@ namespace cw ui_ws_srv_t* p = static_cast(arg); rc_t rc; - if((rc = ws::exec(p->wsUiH)) != kOkRC ) + if((rc = ws::exec(p->wsUiH,p->wsTimeOutMs)) != kOkRC ) { cwLogError(rc,"Websocket UI exec failed."); } @@ -2574,20 +2582,51 @@ namespace cw } } +cw::rc_t cw::ui::srv::create( handle_t& h, + const ws::args_t& args, + void* cbArg, + uiCallback_t uiCbFunc, + const appIdMap_t* appIdMapA, + unsigned appIdMapN, + unsigned wsTimeOutMs, + websock::cbFunc_t wsCbFunc ) +{ + return create(h, + args.port, + args.physRootDir, + cbArg, + uiCbFunc, + args.uiRsrc, + appIdMapA, + appIdMapN, + wsTimeOutMs, + wsCbFunc, + args.dfltPageFn, + args.idleMsgPeriodMs, + args.rcvBufByteN, + args.xmtBufByteN, + args.fmtBufByteN, + args.queueBlkCnt, + args.queueBlkByteCnt ); +} + cw::rc_t cw::ui::srv::create( handle_t& h, - unsigned port, - const char* physRootDir, - void* cbArg, - uiCallback_t uiCbFunc, - const object_t* uiRsrc, - const appIdMap_t* appIdMapA, - unsigned appIdMapN, - websock::cbFunc_t wsCbFunc, - const char* dfltPageFn, - unsigned websockTimeOutMs, - unsigned rcvBufByteN, - unsigned xmtBufByteN, - unsigned fmtBufByteN ) + unsigned port, + const char* physRootDir, + void* cbArg, + uiCallback_t uiCbFunc, + const object_t* uiRsrc, + const appIdMap_t* appIdMapA, + unsigned appIdMapN, + unsigned wsTimeOutMs, + websock::cbFunc_t wsCbFunc, + const char* dfltPageFn, + unsigned idleMsgPeriodMs, + unsigned rcvBufByteN, + unsigned xmtBufByteN, + unsigned fmtBufByteN, + unsigned queueBlkCnt, + unsigned queueBlkByteCnt ) { rc_t rc = kOkRC; if((rc = destroy(h)) != kOkRC ) @@ -2595,7 +2634,7 @@ cw::rc_t cw::ui::srv::create( handle_t& h, ui_ws_srv_t* p = mem::allocZ(); - if((rc = ws::create(p->wsUiH, port, physRootDir, cbArg, uiCbFunc, uiRsrc,appIdMapA, appIdMapN, wsCbFunc, dfltPageFn, websockTimeOutMs, rcvBufByteN, xmtBufByteN, fmtBufByteN )) != kOkRC ) + if((rc = ws::create(p->wsUiH, port, physRootDir, cbArg, uiCbFunc, uiRsrc,appIdMapA, appIdMapN, wsCbFunc, dfltPageFn, idleMsgPeriodMs, rcvBufByteN, xmtBufByteN, fmtBufByteN, queueBlkCnt, queueBlkByteCnt )) != kOkRC ) { cwLogError(rc,"The websock UI creationg failed."); goto errLabel; @@ -2607,6 +2646,8 @@ cw::rc_t cw::ui::srv::create( handle_t& h, goto errLabel; } + p->wsTimeOutMs = wsTimeOutMs; + h.set(p); errLabel: @@ -2616,32 +2657,6 @@ cw::rc_t cw::ui::srv::create( handle_t& h, return rc; } -cw::rc_t cw::ui::srv::create( handle_t& h, - const ws::args_t& args, - void* cbArg, - uiCallback_t uiCbFunc, - const appIdMap_t* appIdMapA, - unsigned appIdMapN, - websock::cbFunc_t wsCbFunc ) -{ - return create(h, - args.port, - args.physRootDir, - cbArg, - uiCbFunc, - args.uiRsrc, - appIdMapA, - appIdMapN, - wsCbFunc, - args.dfltPageFn, - args.wsTimeOutMs, - args.rcvBufByteN, - args.xmtBufByteN, - args.fmtBufByteN ); -} - - - cw::rc_t cw::ui::srv::destroy( handle_t& h ) { rc_t rc = kOkRC; diff --git a/cwUi.h b/cwUi.h index e4077e4..fa685f9 100644 --- a/cwUi.h +++ b/cwUi.h @@ -188,8 +188,9 @@ namespace cw unsigned rcvBufByteN; unsigned xmtBufByteN; unsigned fmtBufByteN; - unsigned wsTimeOutMs; unsigned idleMsgPeriodMs; // min period without messages before an idle message is generated + unsigned queueBlkCnt; + unsigned queueBlkByteCnt; } args_t; rc_t parseArgs( const object_t& o, args_t& args, const char* object_label="ui" ); @@ -214,20 +215,20 @@ namespace cw unsigned appIdMapN = 0, websock::cbFunc_t wsCbFunc = nullptr, const char* dfltPageFn = "index.html", - unsigned websockTimeOutMs = 50, unsigned idleMsgPeriodMs = 50, unsigned rcvBufByteN = 1024, unsigned xmtBufByteN = 1024, - unsigned fmtBufByteN = 4096 - ); + unsigned fmtBufByteN = 4096, + unsigned queueBlkCnt = 4, + unsigned queueBlkByteCnt = 4096 ); rc_t destroy( handle_t& h ); // This function should be called periodically to send and receive // queued messages to and from the websocket. // Note that this call may block for up to 'wsTimeOutMs' milliseconds - // on the websocket handle. - rc_t exec( handle_t h ); + // while waiting for incoming websocket messages. + rc_t exec( handle_t h, unsigned wsTimeOutMs ); // This function executes the internal default websock callback function. // It is useful if the user provides a custom websock callback function @@ -236,8 +237,7 @@ namespace cw websock::handle_t websockHandle( handle_t h ); ui::handle_t uiHandle( handle_t h ); - - void realTimeReport( handle_t h ); + void realTimeReport( handle_t h ); } @@ -247,27 +247,31 @@ namespace cw typedef handle handle_t; rc_t create( handle_t& h, - const ws::args_t& args, - void* cbArg, - uiCallback_t uiCbFunc, - const appIdMap_t* appIdMapA = nullptr, - unsigned appIdMapN = 0, - websock::cbFunc_t wsCbFunc = nullptr ); + const ws::args_t& args, + void* cbArg, + uiCallback_t uiCbFunc, + const appIdMap_t* appIdMapA = nullptr, + unsigned appIdMapN = 0, + unsigned wsTimeOutMs = 50, + websock::cbFunc_t wsCbFunc = nullptr ); rc_t create( handle_t& h, - unsigned port, - const char* physRootDir, - void* cbArg, - uiCallback_t uiCbFunc, - const object_t* uiRsrc = nullptr, - const appIdMap_t* appIdMapA = nullptr, - unsigned appIdMapN = 0, - websock::cbFunc_t wsCbFunc = nullptr, - const char* dfltPageFn = "index.html", - unsigned websockTimeOutMs = 50, - unsigned rcvBufByteN = 1024, - unsigned xmtBufByteN = 1024, - unsigned fmtBufByteN = 4096 ); + unsigned port, + const char* physRootDir, + void* cbArg, + uiCallback_t uiCbFunc, + const object_t* uiRsrc = nullptr, + const appIdMap_t* appIdMapA = nullptr, + unsigned appIdMapN = 0, + unsigned wsTimeOutMs = 50, + websock::cbFunc_t wsCbFunc = nullptr, + const char* dfltPageFn = "index.html", + unsigned idleMsgPeriodMs = 50, + unsigned rcvBufByteN = 1024, + unsigned xmtBufByteN = 1024, + unsigned fmtBufByteN = 4096, + unsigned queueBlkCnt = 4, + unsigned queueBlkByteCnt = 4096 ); rc_t destroy( handle_t& h );