cwUI.h/cpp : Added session id tracking and 'idle' message generation.
This commit is contained in:
parent
d3502e1379
commit
87455db469
55
cwUi.cpp
55
cwUi.cpp
@ -15,6 +15,9 @@ namespace cw
|
|||||||
{
|
{
|
||||||
namespace ui
|
namespace ui
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct appIdMapRecd_str
|
typedef struct appIdMapRecd_str
|
||||||
{
|
{
|
||||||
struct appIdMapRecd_str* link;
|
struct appIdMapRecd_str* link;
|
||||||
@ -45,6 +48,11 @@ namespace cw
|
|||||||
char* buf; // buf[bufN] output message formatting buffer
|
char* buf; // buf[bufN] output message formatting buffer
|
||||||
unsigned bufN; //
|
unsigned bufN; //
|
||||||
bool initFl; // This UI has been initialized.
|
bool initFl; // This UI has been initialized.
|
||||||
|
|
||||||
|
unsigned* sessA;
|
||||||
|
unsigned sessN;
|
||||||
|
unsigned sessAllocN;
|
||||||
|
|
||||||
} ui_t;
|
} ui_t;
|
||||||
|
|
||||||
ui_t* _handleToPtr( handle_t h )
|
ui_t* _handleToPtr( handle_t h )
|
||||||
@ -78,6 +86,7 @@ namespace cw
|
|||||||
m = m0;
|
m = m0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem::release(p->sessA);
|
||||||
mem::release(p->eleA);
|
mem::release(p->eleA);
|
||||||
mem::release(p->buf);
|
mem::release(p->buf);
|
||||||
mem::release(p);
|
mem::release(p);
|
||||||
@ -613,6 +622,7 @@ namespace cw
|
|||||||
{ kInitOpId, "init" },
|
{ kInitOpId, "init" },
|
||||||
{ kValueOpId, "value" },
|
{ kValueOpId, "value" },
|
||||||
{ kEchoOpId, "echo" },
|
{ kEchoOpId, "echo" },
|
||||||
|
{ kIdleOpId, "idle" },
|
||||||
{ kDisconnectOpId, "disconnect" },
|
{ kDisconnectOpId, "disconnect" },
|
||||||
{ kInvalidOpId, "<invalid>" },
|
{ kInvalidOpId, "<invalid>" },
|
||||||
};
|
};
|
||||||
@ -720,10 +730,34 @@ cw::rc_t cw::ui::destroy( handle_t& h )
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned cw::ui::sessionIdCount(handle_t h)
|
||||||
|
{
|
||||||
|
ui_t* p = _handleToPtr(h);
|
||||||
|
return p->sessN;
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned* cw::ui::sessionIdArray(handle_t h)
|
||||||
|
{
|
||||||
|
ui_t* p = _handleToPtr(h);
|
||||||
|
return p->sessA;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
cw::rc_t cw::ui::onConnect( handle_t h, unsigned wsSessId )
|
cw::rc_t cw::ui::onConnect( handle_t h, unsigned wsSessId )
|
||||||
{
|
{
|
||||||
ui_t* p = _handleToPtr(h);
|
ui_t* p = _handleToPtr(h);
|
||||||
|
|
||||||
|
// if the session id array is full ...
|
||||||
|
if( p->sessN == p->sessAllocN )
|
||||||
|
{
|
||||||
|
// ... then expand it
|
||||||
|
p->sessAllocN += 16;
|
||||||
|
p->sessA = mem::resizeZ<unsigned>(p->sessA,p->sessAllocN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// append the new session id
|
||||||
|
p->sessA[p->sessN++] = wsSessId;
|
||||||
|
|
||||||
p->uiCbFunc( p->uiCbArg, wsSessId, kConnectOpId, kInvalidId, kInvalidId, kInvalidId, nullptr );
|
p->uiCbFunc( p->uiCbArg, wsSessId, kConnectOpId, kInvalidId, kInvalidId, kInvalidId, nullptr );
|
||||||
return kOkRC;
|
return kOkRC;
|
||||||
}
|
}
|
||||||
@ -731,7 +765,21 @@ cw::rc_t cw::ui::onConnect( handle_t h, unsigned wsSessId )
|
|||||||
cw::rc_t cw::ui::onDisconnect( handle_t h, unsigned wsSessId )
|
cw::rc_t cw::ui::onDisconnect( handle_t h, unsigned wsSessId )
|
||||||
{
|
{
|
||||||
ui_t* p = _handleToPtr(h);
|
ui_t* p = _handleToPtr(h);
|
||||||
|
|
||||||
p->uiCbFunc( p->uiCbArg, wsSessId, kDisconnectOpId, kInvalidId, kInvalidId, kInvalidId, nullptr );
|
p->uiCbFunc( p->uiCbArg, wsSessId, kDisconnectOpId, kInvalidId, kInvalidId, kInvalidId, nullptr );
|
||||||
|
|
||||||
|
// erase the disconnected session id by shrinking the array
|
||||||
|
for(unsigned i=0; i<p->sessN; ++i)
|
||||||
|
if( p->sessA[i] == wsSessId )
|
||||||
|
{
|
||||||
|
for(; i+1<p->sessN; ++i)
|
||||||
|
p->sessA[i] = p->sessA[i+1];
|
||||||
|
|
||||||
|
p->sessN -= 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return kOkRC;
|
return kOkRC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,10 +819,13 @@ cw::rc_t cw::ui::onReceive( handle_t h, unsigned wsSessId, const void* msg, unsi
|
|||||||
unsigned parentEleAppId = ele->parent == nullptr ? kInvalidId : ele->parent->appId;
|
unsigned parentEleAppId = ele->parent == nullptr ? kInvalidId : ele->parent->appId;
|
||||||
|
|
||||||
p->uiCbFunc( p->uiCbArg, wsSessId, opId, parentEleAppId, ele->uuId, ele->appId, nullptr );
|
p->uiCbFunc( p->uiCbArg, wsSessId, opId, parentEleAppId, ele->uuId, ele->appId, nullptr );
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kIdleOpId:
|
||||||
|
p->uiCbFunc( p->uiCbArg, kInvalidId, opId, kInvalidId, kInvalidId, kInvalidId, nullptr );
|
||||||
|
break;
|
||||||
|
|
||||||
case kInvalidOpId:
|
case kInvalidOpId:
|
||||||
cwLogError(kInvalidIdRC,"The UI received a NULL op. id.");
|
cwLogError(kInvalidIdRC,"The UI received a NULL op. id.");
|
||||||
break;
|
break;
|
||||||
@ -1140,6 +1191,8 @@ cw::rc_t cw::ui::ws::exec( handle_t h, unsigned timeOutMs )
|
|||||||
if((rc = websock::exec( p->wsH, p->wsTimeOutMs )) != kOkRC)
|
if((rc = websock::exec( p->wsH, p->wsTimeOutMs )) != kOkRC)
|
||||||
cwLogError(rc,"The UI websock execution failed.");
|
cwLogError(rc,"The UI websock execution failed.");
|
||||||
|
|
||||||
|
// make the idle callback
|
||||||
|
ui::onReceive( p->uiH, kInvalidId, "idle", strlen("idle") );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
4
cwUi.h
4
cwUi.h
@ -22,6 +22,7 @@ namespace cw
|
|||||||
kInitOpId,
|
kInitOpId,
|
||||||
kValueOpId,
|
kValueOpId,
|
||||||
kEchoOpId,
|
kEchoOpId,
|
||||||
|
kIdleOpId,
|
||||||
kDisconnectOpId
|
kDisconnectOpId
|
||||||
} opId_t;
|
} opId_t;
|
||||||
|
|
||||||
@ -69,6 +70,9 @@ namespace cw
|
|||||||
|
|
||||||
rc_t destroy( handle_t& h );
|
rc_t destroy( handle_t& h );
|
||||||
|
|
||||||
|
unsigned sessionIdCount(handle_t h);
|
||||||
|
const unsigned* sessionIdArray(handle_t h);
|
||||||
|
|
||||||
rc_t onConnect( handle_t h, unsigned wsSessId );
|
rc_t onConnect( handle_t h, unsigned wsSessId );
|
||||||
rc_t onDisconnect( handle_t h, unsigned wsSessId );
|
rc_t onDisconnect( handle_t h, unsigned wsSessId );
|
||||||
rc_t onReceive( handle_t h, unsigned wsSessId, const void* msg, unsigned byteN );
|
rc_t onReceive( handle_t h, unsigned wsSessId, const void* msg, unsigned byteN );
|
||||||
|
Loading…
Reference in New Issue
Block a user