Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

282 lines
13 KiB

/****************************************************************************/
/* assiapi.cpp */
/* */
/* SaveScreenBits Interceptor API functions. */
/* */
/* Copyright(c) Microsoft, PictureTel 1992-1996 */
/* Copyright(c) Data Connection 1996 */
/* (C) 1997-1998 Microsoft Corp. */
/****************************************************************************/
#include <precomp.h>
#pragma hdrstop
#define TRC_FILE "assiapi"
#include <as_conf.hpp>
/****************************************************************************/
/* SSI_Init(..) */
/****************************************************************************/
void RDPCALL SHCLASS SSI_Init(void)
{
DC_BEGIN_FN("SSI_Init");
#define DC_INIT_DATA
#include <assidata.c>
#undef DC_INIT_DATA
TRC_DBG((TB, "Initializing SSI"));
DC_END_FN();
}
/****************************************************************************/
/* API FUNCTION: SSI_PartyJoiningShare */
/* */
/* Called when a new party is joining the share. */
/* */
/* PARAMETERS: */
/* */
/* locPersonID - local person ID of remote person joining the share. */
/* */
/* oldShareSize - the number of the parties which were in the share (ie */
/* excludes the joining party). */
/* */
/* RETURNS: TRUE if the party can join the share. */
/* FALSE if the party can NOT join the share. */
/****************************************************************************/
BOOL RDPCALL SHCLASS SSI_PartyJoiningShare(LOCALPERSONID locPersonID,
unsigned oldShareSize)
{
PTS_ORDER_CAPABILITYSET pLocalOrderCaps;
DC_BEGIN_FN("SSI_PartyJoiningShare");
DC_IGNORE_PARAMETER(oldShareSize)
/************************************************************************/
/* If this is the first party in the share, reset the interceptor code. */
/************************************************************************/
if (oldShareSize == 0)
{
SSIResetInterceptor();
}
/************************************************************************/
/* Redetermine the size of the save screen bitmap. */
/************************************************************************/
SSIRedetermineSaveBitmapSize();
TRC_DBG((TB, "Person with network ID %d joining share", locPersonID));
SSICapabilitiesChanged();
DC_END_FN();
return(TRUE);
}
/****************************************************************************/
/* API FUNCTION: SSI_PartyLeftShare() */
/* */
/* SSI function called when a party has left the share. */
/* */
/* PARAMETERS: */
/* */
/* locPersonID - local person ID of remote person leaving the share. */
/* */
/* newShareSize - the number of the parties now in the call (ie excludes */
/* the leaving party). */
/****************************************************************************/
void RDPCALL SHCLASS SSI_PartyLeftShare(LOCALPERSONID locPersonID,
unsigned newShareSize)
{
DC_BEGIN_FN("SSI_PartyLeftShare");
DC_IGNORE_PARAMETER(locPersonID)
/************************************************************************/
/* Redetermine the size of the save screen bitmap. */
/************************************************************************/
SSIRedetermineSaveBitmapSize();
/************************************************************************/
/* If this is the last party in the share, free all resources for the */
/* call. */
/************************************************************************/
if (newShareSize == 0)
{
/********************************************************************/
/* Discard all saved bitmaps. */
/********************************************************************/
SSIResetInterceptor();
}
else
{
/********************************************************************/
/* Deal with new capabilities. */
/********************************************************************/
SSICapabilitiesChanged();
}
TRC_DBG((TB, "Person with network ID %d leaving share", locPersonID));
DC_END_FN();
}
/****************************************************************************/
/* FUNCTION: SSI_SyncUpdatesNow */
/* */
/* Called by the USR to start syncing data to the remote parties. */
/* The datastream subsequently sent by the SSI must not refer to any */
/* previously sent. */
/****************************************************************************/
void RDPCALL SHCLASS SSI_SyncUpdatesNow(void)
{
DC_BEGIN_FN("SSI_SyncUpdatesNow");
/************************************************************************/
/* Discard any saved bitmaps. This ensures that the subsequent */
/* datastream will not refer to any previously sent data. */
/************************************************************************/
SSIResetInterceptor();
DC_END_FN();
}
/****************************************************************************/
/* FUNCTION: SSI_UpdateShm */
/* */
/* Updates the Shared Memory with local values. Called on WinStation */
/* context. */
/****************************************************************************/
void RDPCALL SHCLASS SSI_UpdateShm(void)
{
DC_BEGIN_FN("SSI_UpdateShm");
m_pShm->ssi.resetInterceptor =
(m_pShm->ssi.resetInterceptor || ssiResetInterceptor);
ssiResetInterceptor = FALSE;
m_pShm->ssi.newSaveBitmapSize = ssiNewSaveBitmapSize;
m_pShm->ssi.saveBitmapSizeChanged =
(m_pShm->ssi.saveBitmapSizeChanged || ssiSaveBitmapSizeChanged);
ssiSaveBitmapSizeChanged = FALSE;
TRC_NRM((TB, "resetInterceptor(%u) newSaveBitmapSize(%u)"
" saveBitmapSizeChanged(%u)",
m_pShm->ssi.resetInterceptor,
m_pShm->ssi.newSaveBitmapSize,
m_pShm->ssi.saveBitmapSizeChanged ));
DC_END_FN();
}
/****************************************************************************/
/* FUNCTION: SSIEnumBitmapCacheCaps() */
/* */
/* Function passed to CPC_EnumerateCapabilities. It will be called with a */
/* capability structure for each person in the call corresponding to the */
/* TS_CAPSETTYPE_ORDER capability structure. */
/* */
/* PARAMETERS: */
/* */
/* personID - ID of person with these capabilities. */
/* */
/* pProtCaps - pointer to capabilities structure for this person. This */
/* pointer is only valid within the call to this function. */
/****************************************************************************/
void RDPCALL SHCLASS SSIEnumBitmapCacheCaps(
LOCALPERSONID personID,
UINT_PTR UserData,
PTS_CAPABILITYHEADER pCaps)
{
PTS_ORDER_CAPABILITYSET pOrderCaps;
DC_BEGIN_FN("SSIEnumBitmapCacheCaps");
DC_IGNORE_PARAMETER(UserData);
pOrderCaps = (PTS_ORDER_CAPABILITYSET)pCaps;
TRC_NRM((TB, "[%u]Receiver bitmap size %ld", (unsigned)personID,
pOrderCaps->desktopSaveSize));
/************************************************************************/
/* Set the size of the local send save screen bitmap to the minimum of */
/* its current size and this party's receive save screen bitmap size. */
/************************************************************************/
ssiNewSaveBitmapSize = min(ssiNewSaveBitmapSize,
pOrderCaps->desktopSaveSize);
DC_END_FN();
}
/****************************************************************************/
/* FUNCTION: SSIRedetermineSaveBitmapSize */
/* */
/* Enumerates all the people in the share and redetermines the size of the */
/* save screen bitmap depending on their and the local receive */
/* capabilities. */
/****************************************************************************/
void RDPCALL SHCLASS SSIRedetermineSaveBitmapSize(void)
{
PTS_ORDER_CAPABILITYSET pOrderCaps;
DC_BEGIN_FN("SSIRedetermineSaveBitmapSize");
/************************************************************************/
/* Enumerate all the save screen bitmap receive capabilities of the */
/* parties in the share. The usable size of the send save screen */
/* bitmap is then the minimum of all the remote receive sizes and the */
/* local send size. */
/************************************************************************/
ssiNewSaveBitmapSize = SAVE_BITMAP_WIDTH * SAVE_BITMAP_HEIGHT;
CPC_EnumerateCapabilities(TS_CAPSETTYPE_ORDER, NULL,
SSIEnumBitmapCacheCaps);
TRC_NRM((TB, "Sender bitmap size %ld", ssiNewSaveBitmapSize));
DC_END_FN();
}
/****************************************************************************/
/* SSIResetInterceptor */
/* */
/* DESCRIPTION: Reset the save screen bits interceptor */
/****************************************************************************/
void RDPCALL SHCLASS SSIResetInterceptor(void)
{
DC_BEGIN_FN("SSIResetInterceptor");
/************************************************************************/
/* Make sure the display driver resets the save level. */
/************************************************************************/
ssiResetInterceptor = TRUE;
DCS_TriggerUpdateShmCallback();
DC_END_FN();
}
/****************************************************************************/
/* Name: SSICapabilitiesChanged */
/* */
/* Purpose: Called when the SSI capabilities have been renegotiated. */
/****************************************************************************/
void RDPCALL SHCLASS SSICapabilitiesChanged(void)
{
DC_BEGIN_FN("SSICapabilitiesChanged");
ssiSaveBitmapSizeChanged = TRUE;
DCS_TriggerUpdateShmCallback();
DC_END_FN();
}