Add enableCache() and flushCache().
This commit is contained in:
parent
4459a0b130
commit
15fb486c4b
123
cwUi.cpp
123
cwUi.cpp
@ -97,6 +97,15 @@ namespace cw
|
|||||||
unsigned sessN;
|
unsigned sessN;
|
||||||
unsigned sessAllocN;
|
unsigned sessAllocN;
|
||||||
|
|
||||||
|
|
||||||
|
bool msgCacheEnableFl;
|
||||||
|
unsigned msgCacheSessId;
|
||||||
|
char* msgCache;
|
||||||
|
unsigned msgCacheAllocN;
|
||||||
|
unsigned msgCacheDataN;
|
||||||
|
unsigned msgCacheN;
|
||||||
|
unsigned msgCacheMsgN;
|
||||||
|
|
||||||
} ui_t;
|
} ui_t;
|
||||||
|
|
||||||
ui_t* _handleToPtr( handle_t h )
|
ui_t* _handleToPtr( handle_t h )
|
||||||
@ -317,28 +326,100 @@ namespace cw
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_t _websockSend( ui_t* p, unsigned wsSessId, const char* msg )
|
|
||||||
|
rc_t _cache_flush( ui_t* p )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
//return websock::send( websockSrv::websockHandle( p->wssH ), kUiProtocolId, wsSessId, msg, strlen(msg) );
|
if( p->msgCacheMsgN > 0 )
|
||||||
if( p->sendCbFunc != nullptr )
|
|
||||||
{
|
{
|
||||||
unsigned msgByteN = msg==nullptr ? 0 : strlen(msg);
|
assert( p->msgCacheN <= p->msgCacheDataN );
|
||||||
|
p->msgCache[ p->msgCacheN+0 ] = ']';
|
||||||
|
p->msgCache[ p->msgCacheN+1 ] = '}';
|
||||||
|
p->msgCache[ p->msgCacheN+2 ] = 0;
|
||||||
|
|
||||||
if( wsSessId != kInvalidId )
|
rc = p->sendCbFunc( p->sendCbArg, p->msgCacheSessId, p->msgCache, strlen(p->msgCache) );
|
||||||
rc = p->sendCbFunc( p->sendCbArg, wsSessId, msg, msgByteN );
|
|
||||||
else
|
p->msgCacheN = snprintf(p->msgCache,p->msgCacheAllocN,"{\"op\":\"cache\", \"array\": [");
|
||||||
{
|
p->msgCacheSessId = kInvalidId;
|
||||||
for(unsigned i=0; i<p->sessN; ++i)
|
p->msgCacheMsgN = 0;
|
||||||
rc = p->sendCbFunc( p->sendCbArg, p->sessA[i], msg, msgByteN );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_t _cache_send( ui_t* p, unsigned wsSessId, const char* msg, unsigned msgByteN )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
|
unsigned msgByteCommaN = msgByteN + 1;
|
||||||
|
|
||||||
|
// if the cache buffer has not yet been allocated
|
||||||
|
if( p->msgCache == nullptr && p->msgCacheAllocN>0 )
|
||||||
|
{
|
||||||
|
p->msgCacheDataN = p->msgCacheAllocN - 3; // "]}/0" three char's must be reserved to terminate the cache message (See _cache_flush().)
|
||||||
|
p->msgCache = mem::allocZ<char>( p->msgCacheAllocN );
|
||||||
|
p->msgCacheSessId = kInvalidId;
|
||||||
|
p->msgCacheN = snprintf(p->msgCache,p->msgCacheDataN,"{\"op\":\"cache\", \"array\": [");
|
||||||
|
p->msgCacheMsgN = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( wsSessId != p->msgCacheSessId || p->msgCacheN + msgByteCommaN > p->msgCacheDataN || msgByteN > p->msgCacheDataN )
|
||||||
|
rc = _cache_flush(p);
|
||||||
|
|
||||||
|
if( msgByteN > p->msgCacheDataN )
|
||||||
|
rc = p->sendCbFunc( p->sendCbArg, wsSessId, msg, msgByteN );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert( p->msgCacheN + msgByteCommaN <= p->msgCacheDataN );
|
||||||
|
|
||||||
|
// if this isn't the first msg is the buffer then prepend a ','
|
||||||
|
if( p->msgCacheMsgN != 0 )
|
||||||
|
strncat(p->msgCache,",",2);
|
||||||
|
else
|
||||||
|
msgByteCommaN -= 1; // otherwise the msgByteCommaN is the same as msgByteN
|
||||||
|
|
||||||
|
strncat(p->msgCache,msg,msgByteN);
|
||||||
|
|
||||||
|
p->msgCacheN += msgByteCommaN;
|
||||||
|
p->msgCacheSessId = wsSessId;
|
||||||
|
p->msgCacheMsgN += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _send_or_cache( ui_t* p, unsigned sessId, const char* msg, unsigned msgByteCnt )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
if( p->msgCacheEnableFl )
|
||||||
|
rc = _cache_send( p, sessId, msg, msgByteCnt );
|
||||||
|
else
|
||||||
|
rc = p->sendCbFunc( p->sendCbArg, sessId, msg, msgByteCnt );
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _websockSend( ui_t* p, unsigned wsSessId, const char* msg )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
|
if( p->sendCbFunc != nullptr )
|
||||||
|
{
|
||||||
|
unsigned msgByteN = msg==nullptr ? 0 : strlen(msg);
|
||||||
|
|
||||||
|
if( wsSessId != kInvalidId )
|
||||||
|
rc = _send_or_cache( p, wsSessId, msg, msgByteN );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(unsigned i=0; i<p->sessN; ++i)
|
||||||
|
rc = _send_or_cache( p, p->sessA[i], msg, msgByteN );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
// terminating condition for format_attributes()
|
// terminating condition for format_attributes()
|
||||||
void _create_attributes( ele_t* e )
|
void _create_attributes( ele_t* e )
|
||||||
@ -1191,6 +1272,7 @@ cw::rc_t cw::ui::create(
|
|||||||
p->recvBufIdx = 0;
|
p->recvBufIdx = 0;
|
||||||
p->recvShiftN = 0;
|
p->recvShiftN = 0;
|
||||||
p->uiRsrc = uiRsrc->duplicate();
|
p->uiRsrc = uiRsrc->duplicate();
|
||||||
|
p->msgCacheSessId = kInvalidId;
|
||||||
|
|
||||||
// create the root element
|
// create the root element
|
||||||
if((ele = _createBaseEle(p, nullptr, kRootAppId, kInvalidId, "uiDivId" )) == nullptr || ele->uuId != kRootUuId )
|
if((ele = _createBaseEle(p, nullptr, kRootAppId, kInvalidId, "uiDivId" )) == nullptr || ele->uuId != kRootUuId )
|
||||||
@ -1243,6 +1325,24 @@ cw::rc_t cw::ui::destroy( handle_t& h )
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cw::rc_t cw::ui::enableCache( handle_t h, unsigned cacheByteCnt )
|
||||||
|
{
|
||||||
|
ui_t* p = _handleToPtr(h);
|
||||||
|
p->msgCacheEnableFl = true;
|
||||||
|
p->msgCacheAllocN = cacheByteCnt;
|
||||||
|
return kOkRC;
|
||||||
|
}
|
||||||
|
|
||||||
|
cw::rc_t cw::ui::flushCache( handle_t h )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
ui_t* p = _handleToPtr(h);
|
||||||
|
|
||||||
|
if( p->msgCacheEnableFl && p->msgCache != nullptr )
|
||||||
|
rc =_cache_flush(p);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned cw::ui::sessionIdCount(handle_t h)
|
unsigned cw::ui::sessionIdCount(handle_t h)
|
||||||
{
|
{
|
||||||
@ -1657,7 +1757,6 @@ cw::rc_t cw::ui::createLog( handle_t h, unsigned& uuIdRef, unsigned parentUuId
|
|||||||
cw::rc_t cw::ui::createList( handle_t h, unsigned& uuIdRef, unsigned parentUuId, const char* eleName, unsigned appId, unsigned chanId, const char* clas, const char* title )
|
cw::rc_t cw::ui::createList( handle_t h, unsigned& uuIdRef, unsigned parentUuId, const char* eleName, unsigned appId, unsigned chanId, const char* clas, const char* title )
|
||||||
{ return _createOneEle( _handleToPtr(h), uuIdRef, "list", kInvalidId, parentUuId, eleName, appId, chanId, clas, title); }
|
{ return _createOneEle( _handleToPtr(h), uuIdRef, "list", kInvalidId, parentUuId, eleName, appId, chanId, clas, title); }
|
||||||
|
|
||||||
|
|
||||||
cw::rc_t cw::ui::setNumbRange( handle_t h, unsigned uuId, double minValue, double maxValue, double stepValue, unsigned decPl, double value )
|
cw::rc_t cw::ui::setNumbRange( handle_t h, unsigned uuId, double minValue, double maxValue, double stepValue, unsigned decPl, double value )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
3
cwUi.h
3
cwUi.h
@ -32,6 +32,9 @@ namespace cw
|
|||||||
|
|
||||||
rc_t destroy( handle_t& h );
|
rc_t destroy( handle_t& h );
|
||||||
|
|
||||||
|
rc_t enableCache( handle_t h, unsigned cacheByteCnt=4096 );
|
||||||
|
rc_t flushCache( handle_t h );
|
||||||
|
|
||||||
unsigned sessionIdCount(handle_t h); // Count of connected remote UI's
|
unsigned sessionIdCount(handle_t h); // Count of connected remote UI's
|
||||||
const unsigned* sessionIdArray(handle_t h); // Array of 'sessionIdCount()' remote UI id's
|
const unsigned* sessionIdArray(handle_t h); // Array of 'sessionIdCount()' remote UI id's
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user