/* Load a bitmap from the persistent cache */ RDCBOOL pstcache_load_bitmap(rdcConnection conn, uint8 cache_id, uint16 cache_idx) { uint8 *celldata; int fd; CELLHEADER cellhdr; HBITMAP bitmap; if (!conn->bitmapCachePersist) return False; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return False; fd = conn->pstcacheFd[cache_id]; rd_lseek_file(fd, cache_idx * (conn->pstcacheBpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)); celldata = (uint8 *) xmalloc(cellhdr.length); rd_read_file(fd, celldata, cellhdr.length); bitmap = ui_create_bitmap(conn, cellhdr.width, cellhdr.height, celldata); DEBUG(("Load bitmap from disk: id=%d, idx=%d, bmp=0x%x)\n", cache_id, cache_idx, bitmap)); cache_put_bitmap(conn, cache_id, cache_idx, bitmap); xfree(celldata); return True; }
/* Load a bitmap from the persistent cache */ BOOL pstcache_load_bitmap(RDPCLIENT * This, uint8 cache_id, uint16 cache_idx) { uint8 *celldata; int fd; CELLHEADER cellhdr; HBITMAP bitmap; if (!This->bitmap_cache_persist_enable) return False; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return False; fd = This->pstcache_fd[cache_id]; rd_lseek_file(fd, cache_idx * (This->pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)); celldata = (uint8 *) malloc(cellhdr.length); if(celldata == NULL) return False; rd_read_file(fd, celldata, cellhdr.length); bitmap = ui_create_bitmap(This, cellhdr.width, cellhdr.height, celldata); DEBUG(("Load bitmap from disk: id=%d, idx=%d, bmp=0x%x)\n", cache_id, cache_idx, bitmap)); cache_put_bitmap(This, cache_id, cache_idx, bitmap); free(celldata); return True; }
/* Load a bitmap from the persistent cache */ RD_BOOL pstcache_load_bitmap(rdpPcache * pcache, uint8 cache_id, uint16 cache_idx) { uint8 *celldata; int fd; CELLHEADER cellhdr; RD_HBITMAP bitmap; if (!(pcache->rdp->settings->bitmap_cache_persist_enable)) return False; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return False; fd = pcache->pstcache_fd[cache_id]; rd_lseek_file(fd, cache_idx * (pcache->pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)); celldata = (uint8 *) xmalloc(cellhdr.length); rd_read_file(fd, celldata, cellhdr.length); bitmap = ui_create_bitmap(pcache->rdp->inst, cellhdr.width, cellhdr.height, celldata); DEBUG("Load bitmap from disk: id=%d, idx=%d, bmp=0x%x)\n", cache_id, cache_idx, (unsigned int) bitmap); cache_put_bitmap(pcache->rdp->cache, cache_id, cache_idx, bitmap); xfree(celldata); return True; }
/* Load a bitmap from the persistent cache */ RD_BOOL pstcache_load_bitmap(uint8 cache_id, uint16 cache_idx) { uint8 *celldata; int fd; CELLHEADER cellhdr; RD_HBITMAP bitmap; if (!g_bitmap_cache_persist_enable) return False; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return False; fd = g_pstcache_fd[cache_id]; rd_lseek_file(fd, cache_idx * (g_pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)); celldata = (uint8 *) xmalloc(cellhdr.length); rd_read_file(fd, celldata, cellhdr.length); bitmap = ui_create_bitmap(cellhdr.width, cellhdr.height, celldata); logger(Core, Debug, "pstcache_load_bitmap(), load bitmap from disk: id=%d, idx=%d, bmp=%p)", cache_id, cache_idx, bitmap); cache_put_bitmap(cache_id, cache_idx, bitmap); xfree(celldata); return True; }
/* List the bitmap keys from the persistent cache file */ int pstcache_enumerate(rdpPcache * pcache, uint8 id, HASH_KEY * keylist) { int fd, n; uint16 idx; sint16 mru_idx[0xa00]; uint32 mru_stamp[0xa00]; CELLHEADER cellhdr; if (!(pcache->rdp->settings->bitmap_cache && pcache->rdp->settings->bitmap_cache_persist_enable && IS_PERSISTENT(id))) return 0; /* The server disconnects if the bitmap cache content is sent more than once */ if (pcache->pstcache_enumerated) return 0; DEBUG_RDP5("Persistent bitmap cache enumeration... "); for (idx = 0; idx < BMPCACHE2_NUM_PSTCELLS; idx++) { fd = pcache->pstcache_fd[id]; rd_lseek_file(fd, idx * (pcache->pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); if (rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)) <= 0) break; if (memcmp(cellhdr.key, pcache->zero_key, sizeof(HASH_KEY)) != 0) { memcpy(keylist[idx], cellhdr.key, sizeof(HASH_KEY)); /* Pre-cache (not possible for 8 bit color depth cause it needs a colormap) */ if (pcache->rdp->settings->bitmap_cache_precache && cellhdr.stamp && pcache->rdp->settings->server_depth > 8) pstcache_load_bitmap(pcache, id, idx); /* Sort by stamp */ for (n = idx; n > 0 && cellhdr.stamp < mru_stamp[n - 1]; n--) { mru_idx[n] = mru_idx[n - 1]; mru_stamp[n] = mru_stamp[n - 1]; } mru_idx[n] = idx; mru_stamp[n] = cellhdr.stamp; } else { break; } } DEBUG_RDP5("%d cached bitmaps.\n", idx); cache_rebuild_bmpcache_linked_list(pcache->rdp->cache, id, mru_idx, idx); pcache->pstcache_enumerated = True; return idx; }
/* List the bitmap keys from the persistent cache file */ int pstcache_enumerate(uint8 id, HASH_KEY * keylist) { int fd, n; uint16 idx; sint16 mru_idx[0xa00]; uint32 mru_stamp[0xa00]; CELLHEADER cellhdr; if (!(g_bitmap_cache && g_bitmap_cache_persist_enable && IS_PERSISTENT(id))) return 0; /* The server disconnects if the bitmap cache content is sent more than once */ if (g_pstcache_enumerated) return 0; logger(Core, Debug, "pstcache_enumerate(), start enumeration"); for (idx = 0; idx < BMPCACHE2_NUM_PSTCELLS; idx++) { fd = g_pstcache_fd[id]; rd_lseek_file(fd, idx * (g_pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); if (rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)) <= 0) break; if (memcmp(cellhdr.key, zero_key, sizeof(HASH_KEY)) != 0) { memcpy(keylist[idx], cellhdr.key, sizeof(HASH_KEY)); /* Pre-cache (not possible for 8-bit colour depth cause it needs a colourmap) */ if (g_bitmap_cache_precache && cellhdr.stamp && g_server_depth > 8) pstcache_load_bitmap(id, idx); /* Sort by stamp */ for (n = idx; n > 0 && cellhdr.stamp < mru_stamp[n - 1]; n--) { mru_idx[n] = mru_idx[n - 1]; mru_stamp[n] = mru_stamp[n - 1]; } mru_idx[n] = idx; mru_stamp[n] = cellhdr.stamp; } else { break; } } logger(Core, Debug, "pstcache_enumerate(), %d cached bitmaps", idx); cache_rebuild_bmpcache_linked_list(id, mru_idx, idx); g_pstcache_enumerated = True; return idx; }
/* Update mru stamp/index for a bitmap */ void pstcache_touch_bitmap(RDPCLIENT * This, uint8 cache_id, uint16 cache_idx, uint32 stamp) { int fd; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return; fd = This->pstcache_fd[cache_id]; rd_lseek_file(fd, 12 + cache_idx * (This->pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_write_file(fd, &stamp, sizeof(stamp)); }
/* List the bitmap keys from the persistent cache file */ int pstcache_enumerate(rdcConnection conn, uint8 id, HASH_KEY * keylist) { int fd, idx, n; sint16 mru_idx[0xa00]; uint32 mru_stamp[0xa00]; CELLHEADER cellhdr; if (!(conn->bitmapCache && conn->bitmapCachePersist && IS_PERSISTENT(id))) return 0; /* The server disconnects if the bitmap cache content is sent more than once */ if (conn->pstcacheEnumerated) return 0; DEBUG_RDP5(("Persistent bitmap cache enumeration... ")); for (idx = 0; idx < BMPCACHE2_NUM_PSTCELLS; idx++) { fd = conn->pstcacheFd[id]; rd_lseek_file(fd, idx * (conn->pstcacheBpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); if (rd_read_file(fd, &cellhdr, sizeof(CELLHEADER)) <= 0) break; if (memcmp(cellhdr.key, zero_key, sizeof(HASH_KEY)) != 0) { memcpy(keylist[idx], cellhdr.key, sizeof(HASH_KEY)); /* Pre-cache (not possible for 8bpp because 8bpp needs a colourmap) */ if (conn->bitmapCachePrecache && cellhdr.stamp && conn->serverBpp > 8) pstcache_load_bitmap(conn, id, idx); /* Sort by stamp */ for (n = idx; n > 0 && cellhdr.stamp < mru_stamp[n - 1]; n--) { mru_idx[n] = mru_idx[n - 1]; mru_stamp[n] = mru_stamp[n - 1]; } mru_idx[n] = idx; mru_stamp[n] = cellhdr.stamp; } else { break; } } DEBUG_RDP5(("%d cached bitmaps.\n", idx)); cache_rebuild_bmpcache_linked_list(conn, id, mru_idx, idx); conn->pstcacheEnumerated = True; return idx; }
/* Update mru stamp/index for a bitmap */ void pstcache_touch_bitmap(rdcConnection conn, uint8 cache_id, uint16 cache_idx, uint32 stamp) { int fd; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return; fd = conn->pstcacheFd[cache_id]; rd_lseek_file(fd, 12 + cache_idx * (conn->pstcacheBpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_write_file(fd, &stamp, sizeof(stamp)); }
/* Store a bitmap in the persistent cache */ BOOL pstcache_save_bitmap(RDPCLIENT * This, uint8 cache_id, uint16 cache_idx, uint8 * key, uint8 width, uint8 height, uint16 length, uint8 * data) { int fd; CELLHEADER cellhdr; if (!IS_PERSISTENT(cache_id) || cache_idx >= BMPCACHE2_NUM_PSTCELLS) return False; memcpy(cellhdr.key, key, sizeof(HASH_KEY)); cellhdr.width = width; cellhdr.height = height; cellhdr.length = length; cellhdr.stamp = 0; fd = This->pstcache_fd[cache_id]; rd_lseek_file(fd, cache_idx * (This->pstcache_Bpp * MAX_CELL_SIZE + sizeof(CELLHEADER))); rd_write_file(fd, &cellhdr, sizeof(CELLHEADER)); rd_write_file(fd, data, length); return True; }