/* DPLAYX.DLL name server implementation * * Copyright 2000 - Peter Hunnisett * * * */ /* NOTE: Methods with the NS_ prefix are name server methods */ #include "winbase.h" #include "debugtools.h" #include "dplayx_global.h" #include "name_server.h" /* FIXME: Need to aquire the interface semaphore before didlling data */ DEFAULT_DEBUG_CHANNEL(dplay); /* NS specific structures */ typedef struct tagNSCacheData { struct tagNSCacheData* next; LPDPSESSIONDESC2 data; } NSCacheData, *lpNSCacheData; typedef struct tagNSCache { lpNSCacheData present; /* keep track of what is to be looked at */ lpNSCacheData first; } NSCache, *lpNSCache; /* Local Prototypes */ static void NS_InvalidateSessionCache( lpNSCache lpCache ); /* Name Server functions * --------------------- */ void NS_SetLocalComputerAsNameServer( LPCDPSESSIONDESC2 lpsd ) { DPLAYX_SetLocalSession( lpsd ); } /* This function is responsible for sending a request for all other known nameservers to send us what sessions they have registered locally */ void NS_SendSessionRequestBroadcast( LPVOID lpNSInfo ) { UINT index = 0; lpNSCache lpCache = (lpNSCache)lpNSInfo; LPDPSESSIONDESC2 lpTmp = NULL; /* Invalidate the session cache for the interface */ NS_InvalidateSessionCache( lpCache ); /* Add the local known sessions to the cache */ if( ( lpTmp = DPLAYX_CopyAndAllocateLocalSession( &index ) ) != NULL ) { lpCache->first = (lpNSCacheData)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(lpCache->first) ) ); lpCache->first->data = lpTmp; lpCache->first->next = NULL; lpCache->present = lpCache->first; while( ( lpTmp = DPLAYX_CopyAndAllocateLocalSession( &index ) ) != NULL ) { lpCache->present->next = (lpNSCacheData)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(lpCache->present) ) ); lpCache->present = lpCache->present->next; lpCache->present->data = lpTmp; lpCache->present->next = NULL; } lpCache->present = lpCache->first; } /* Send out requests for matching sessions to all other known computers */ FIXME( ": no remote requests sent\n" ); /* FIXME - how to handle responses to messages anyways? */ } /* Render all data in a session cache invalid */ static void NS_InvalidateSessionCache( lpNSCache lpCache ) { if( lpCache == NULL ) { ERR( ": invalidate non existant cache\n" ); return; } /* Remove everything from the cache */ while( lpCache->first ) { lpCache->present = lpCache->first; lpCache->first = lpCache->first->next; HeapFree( GetProcessHeap(), 0, lpCache->present ); } /* NULL out the cache pointers */ lpCache->present = NULL; lpCache->first = NULL; } /* Create and initialize a session cache */ BOOL NS_InitializeSessionCache( LPVOID* lplpNSInfo ) { lpNSCache lpCache = (lpNSCache)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *lpCache ) ); *lplpNSInfo = lpCache; if( lpCache == NULL ) { return FALSE; } lpCache->first = lpCache->present = NULL; return TRUE; } /* Delete a session cache */ void NS_DeleteSessionCache( LPVOID lpNSInfo ) { NS_InvalidateSessionCache( (lpNSCache)lpNSInfo ); } /* Reinitialize the present pointer for this cache */ void NS_ResetSessionEnumeration( LPVOID lpNSInfo ) { ((lpNSCache)lpNSInfo)->present = ((lpNSCache)lpNSInfo)->first; } LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo ) { LPDPSESSIONDESC2 lpSessionDesc; lpNSCache lpCache = (lpNSCache)lpNSInfo; /* Test for end of the list */ if( lpCache->present == NULL ) { return NULL; } lpSessionDesc = lpCache->present->data; /* Advance tracking pointer */ lpCache->present = lpCache->present->next; return lpSessionDesc; }