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.
 
 
 
 
 
 

190 lines
8.1 KiB

/****************************************************************************/
/* apmapi.cpp */
/* */
/* Palette Manager API Functions. */
/* */
/* Copyright(c) Microsoft, PictureTel 1992-1997 */
/* Copyright (c) Microsoft 1997 - 2000 */
/****************************************************************************/
#include <precomp.h>
#pragma hdrstop
#define TRC_FILE "apmapi"
#include <as_conf.hpp>
/****************************************************************************/
/* PM_Init() */
/* */
/* Initializes the Palette Manager. */
/****************************************************************************/
void RDPCALL SHCLASS PM_Init(void)
{
TS_COLORTABLECACHE_CAPABILITYSET ColorTableCaps;
DC_BEGIN_FN("PM_Init");
#define DC_INIT_DATA
#include <apmdata.c>
#undef DC_INIT_DATA
// Set up the PM capabilities.
ColorTableCaps.capabilitySetType = TS_CAPSETTYPE_COLORCACHE;
ColorTableCaps.colorTableCacheSize = SBC_NUM_COLOR_TABLE_CACHE_ENTRIES;
ColorTableCaps.pad2octets = 0;
CPC_RegisterCapabilities((PTS_CAPABILITYHEADER)&ColorTableCaps,
sizeof(TS_COLORTABLECACHE_CAPABILITYSET));
DC_END_FN();
}
/****************************************************************************/
/* PM_MaybeSendPalettePacket() */
/* */
/* Tries to broadcast a palette packet to all remote people in a share if */
/* necessary. */
/* */
/* PM_MaybeSendPalettePacket returns a boolean indicating whether it has */
/* successfully sent a palette packet. We only send further updates if */
/* the palette packet is successfully sent. */
/* */
/* RETURNS: TRUE if palette packet was successfully sent, or if no packet */
/* needs to be sent. FALSE if a packet needs to be sent but could not be. */
/****************************************************************************/
BOOL RDPCALL SHCLASS PM_MaybeSendPalettePacket(PPDU_PACKAGE_INFO pPkgInfo)
{
BOOL rc = TRUE;
unsigned i;
unsigned cbPalettePacketSize;
BYTE *pPackageSpace;
DC_BEGIN_FN("PM_MaybeSendPalettePacket");
if (m_pShm->pm.paletteChanged || pmMustSendPalette) {
TRC_NRM((TB, "Send palette packet"));
// Set up a palette packet. First calculate the packet size.
cbPalettePacketSize = scUpdatePDUHeaderSpace +
sizeof(TS_UPDATE_PALETTE_PDU_DATA) +
((PM_NUM_8BPP_PAL_ENTRIES - 1) * sizeof(TS_COLOR));
// Get space in the PDU package.
pPackageSpace = SC_GetSpaceInPackage(pPkgInfo, cbPalettePacketSize);
if (pPackageSpace != NULL) {
TS_UPDATE_PALETTE_PDU_DATA UNALIGNED *pData;
BYTE *pEncode;
// Fill in the packet header.
if (scUseFastPathOutput) {
pPackageSpace[0] = scCompressionUsedValue |
TS_UPDATETYPE_PALETTE;
pData = (TS_UPDATE_PALETTE_PDU_DATA UNALIGNED *)
(pPackageSpace + scUpdatePDUHeaderSpace);
}
else {
TS_UPDATE_PALETTE_PDU UNALIGNED *pPalettePDU;
pPalettePDU = (PTS_UPDATE_PALETTE_PDU)pPackageSpace;
pPalettePDU->shareDataHeader.pduType2 = TS_PDUTYPE2_UPDATE;
pData = &pPalettePDU->data;
}
pData->updateType = TS_UPDATETYPE_PALETTE;
pData->numberColors = PM_NUM_8BPP_PAL_ENTRIES;
// Convert the DCRGBQUADs in the color table to DCCOLORs as we copy
// them into the packet.
for (i = 0; i < PM_NUM_8BPP_PAL_ENTRIES; i++) {
// Convert each RGBQUAD entry in the palette to a DCCOLOR entry
// in the palette PDU. We swap the elements because the client
// wants to treat the palette entries as DWORDs and lift them
// straight out of the packet.
pData->palette[i].red = m_pShm->pm.palette[i].rgbBlue;
pData->palette[i].green = m_pShm->pm.palette[i].rgbGreen;
pData->palette[i].blue = m_pShm->pm.palette[i].rgbRed;
}
// Now send the packet to the remote application.
SC_AddToPackage(pPkgInfo, cbPalettePacketSize, TRUE);
// We no longer need to send a palette packet.
m_pShm->pm.paletteChanged = FALSE;
pmMustSendPalette = FALSE;
}
else {
TRC_ALT((TB, "Failed to allocate packet"));
rc = FALSE;
}
}
DC_END_FN();
return rc;
}
/****************************************************************************/
/* API FUNCTION: PM_SyncNow */
/* */
/* Resyncs to the remote PM by ensuring that the datastream does not refer */
/* to any previously sent data. */
/****************************************************************************/
void RDPCALL SHCLASS PM_SyncNow(void)
{
DC_BEGIN_FN("PM_SyncNow");
// Ensure we send a palette to the remote PM next time we are called.
TRC_NRM((TB, "Palette sync"));
pmMustSendPalette = TRUE;
DC_END_FN();
}
#ifdef NotUsed
/****************************************************************************/
/* FUNCTION: PMEnumPMCaps */
/* */
/* PM callback function for CPC capabilities enumeration. */
/* */
/* PARAMETERS: */
/* personID - ID of this person */
/* pCapabilities - pointer to this person's cursor capabilites */
/****************************************************************************/
void CALLBACK SHCLASS PMEnumPMCaps(
LOCALPERSONID locPersonID,
UINT_PTR UserData,
PTS_CAPABILITYHEADER pCapabilities)
{
PTS_COLORTABLECACHE_CAPABILITYSET pColorCacheCaps;
unsigned cTxCacheSize;
DC_BEGIN_FN("PMEnumPMCaps");
DC_IGNORE_PARAMETER(UserData);
pColorCacheCaps = (PTS_COLORTABLECACHE_CAPABILITYSET)pCapabilities;
// If the person does not have any color table caching capabilites we
// still get called, but the sizeOfCapabilities field is zero.
if (pColorCacheCaps->lengthCapability <
sizeof(PTS_COLORTABLECACHE_CAPABILITYSET)) {
TRC_NRM((TB, "[%u] No color cache caps", (unsigned)locPersonID));
cTxCacheSize = 1;
}
else {
TRC_NRM((TB, "[%u] capsID(%u) size(%u) CacheSize(%u)",
(unsigned)locPersonID,
pColorCacheCaps->capabilitySetType,
pColorCacheCaps->lengthCapability,
pColorCacheCaps->colorTableCacheSize));
cTxCacheSize = pColorCacheCaps->colorTableCacheSize;
}
pmNewTxCacheSize = min(pmNewTxCacheSize, cTxCacheSize);
DC_END_FN();
}
#endif // NotUsed