Skip to content

Commit

Permalink
tv-casting-app: Implementing FabricDelegate to update cache on Fabric…
Browse files Browse the repository at this point in the history
…Index removal
  • Loading branch information
sharadb-amazon committed Feb 18, 2023
1 parent 52b2735 commit beb293b
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@

constexpr size_t kMaxCachedVideoPlayers = 32;

class PersistenceManager
class PersistenceManager : public chip::FabricTable::Delegate
{
public:
CHIP_ERROR AddVideoPlayer(TargetVideoPlayerInfo * targetVideoPlayerInfo);

CHIP_ERROR ReadAllVideoPlayers(TargetVideoPlayerInfo outVideoPlayers[]);

void OnFabricRemoved(const chip::FabricTable & fabricTable, chip::FabricIndex fabricIndex);

CHIP_ERROR PurgeVideoPlayerCache();

private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ CHIP_ERROR CastingServer::Init(AppParams * AppParams)
// Initialize binding handlers
ReturnErrorOnFailure(InitBindingHandlers());

// Set FabricDelegate
chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&mPersistenceManager);

// Add callback to send Content casting commands after commissioning completes
ReturnErrorOnFailure(DeviceLayer::PlatformMgrImpl().AddEventHandler(DeviceEventCallback, 0));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,44 @@ CHIP_ERROR PersistenceManager::ReadAllVideoPlayers(TargetVideoPlayerInfo outVide
return CHIP_NO_ERROR;
}

void PersistenceManager::OnFabricRemoved(const FabricTable & fabricTable, FabricIndex fabricIndex)
{
ChipLogProgress(AppServer, "PersistenceManager::OnFabricRemoved called for fabricIndex: %d", fabricIndex);

// Read cached video players
TargetVideoPlayerInfo cachedVideoPlayers[kMaxCachedVideoPlayers];
CHIP_ERROR err = ReadAllVideoPlayers(cachedVideoPlayers);
if (err != CHIP_NO_ERROR)
{
ChipLogError(AppServer, "PersistenceManager::OnFabricRemoved could not read cached video players %" CHIP_ERROR_FORMAT, err.Format());
}

// Delete video players that match the passed in fabricIndex
for (size_t i = 0; i < kMaxCachedVideoPlayers && cachedVideoPlayers[i].IsInitialized(); i++)
{
if(cachedVideoPlayers[i].GetFabricIndex() == fabricIndex)
{
ChipLogProgress(AppServer, "PersistenceManager::OnFabricRemoved removing video player with nodeId: 0x" ChipLogFormatX64 " from cache", ChipLogValueX64(cachedVideoPlayers[i].GetNodeId()));

// shift elements back by 1 and mark the last array element for deletion
size_t indexToDelete = i;
if(indexToDelete + 1 < kMaxCachedVideoPlayers && cachedVideoPlayers[indexToDelete + 1].IsInitialized())
{
while(indexToDelete + 1 < kMaxCachedVideoPlayers && cachedVideoPlayers[indexToDelete + 1].IsInitialized())
{
cachedVideoPlayers[indexToDelete] = cachedVideoPlayers[indexToDelete + 1];
indexToDelete++;
}
}

// memset cachedVideoPlayers[indexToDelete] to zeroes
memset(&cachedVideoPlayers[indexToDelete], 0, sizeof(cachedVideoPlayers[indexToDelete]));
}
}

WriteAllVideoPlayers(cachedVideoPlayers);
}

CHIP_ERROR PersistenceManager::PurgeVideoPlayerCache()
{
ChipLogProgress(AppServer, "PersistenceManager::PurgeVideoPlayerCache called");
Expand Down

0 comments on commit beb293b

Please sign in to comment.