summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/os_calls.c160
-rw-r--r--common/os_calls.h2
-rw-r--r--common/xrdp_constants.h7
3 files changed, 166 insertions, 3 deletions
diff --git a/common/os_calls.c b/common/os_calls.c
index ef057497..bfea9031 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -126,8 +126,12 @@ g_mk_temp_dir(const char *app_name)
{
if (!g_create_dir("/tmp/.xrdp"))
{
- printf("g_mk_temp_dir: g_create_dir failed\n");
- return 1;
+ /* if failed, still check if it got created by someone else */
+ if (!g_directory_exist("/tmp/.xrdp"))
+ {
+ printf("g_mk_temp_dir: g_create_dir failed\n");
+ return 1;
+ }
}
g_chmod_hex("/tmp/.xrdp", 0x1777);
@@ -3172,6 +3176,158 @@ g_time3(void)
#endif
}
+/******************************************************************************/
+/******************************************************************************/
+struct bmp_magic
+{
+ char magic[2];
+};
+
+struct bmp_hdr
+{
+ unsigned int size; /* file size in bytes */
+ unsigned short reserved1;
+ unsigned short reserved2;
+ unsigned int offset; /* offset to image data, in bytes */
+};
+
+struct dib_hdr
+{
+ unsigned int hdr_size;
+ int width;
+ int height;
+ unsigned short nplanes;
+ unsigned short bpp;
+ unsigned int compress_type;
+ unsigned int image_size;
+ int hres;
+ int vres;
+ unsigned int ncolors;
+ unsigned int nimpcolors;
+ };
+
+/******************************************************************************/
+int APP_CC
+g_save_to_bmp(const char* filename, char* data, int stride_bytes,
+ int width, int height, int depth, int bits_per_pixel)
+{
+ struct bmp_magic bm;
+ struct bmp_hdr bh;
+ struct dib_hdr dh;
+ int bytes;
+ int fd;
+ int index;
+ int i1;
+ int pixel;
+ int extra;
+ int file_stride_bytes;
+ char* line;
+ char* line_ptr;
+
+ if ((depth == 24) && (bits_per_pixel == 32))
+ {
+ }
+ else if ((depth == 32) && (bits_per_pixel == 32))
+ {
+ }
+ else
+ {
+ g_writeln("g_save_to_bpp: unimp");
+ return 1;
+ }
+ bm.magic[0] = 'B';
+ bm.magic[1] = 'M';
+
+ /* scan lines are 32 bit aligned, bottom 2 bits must be zero */
+ file_stride_bytes = width * ((depth + 7) / 8);
+ extra = file_stride_bytes;
+ extra = extra & 3;
+ extra = (4 - extra) & 3;
+ file_stride_bytes += extra;
+
+ bh.size = sizeof(bm) + sizeof(bh) + sizeof(dh) + height * file_stride_bytes;
+ bh.reserved1 = 0;
+ bh.reserved2 = 0;
+ bh.offset = sizeof(bm) + sizeof(bh) + sizeof(dh);
+
+ dh.hdr_size = sizeof(dh);
+ dh.width = width;
+ dh.height = height;
+ dh.nplanes = 1;
+ dh.bpp = depth;
+ dh.compress_type = 0;
+ dh.image_size = height * file_stride_bytes;
+ dh.hres = 0xb13;
+ dh.vres = 0xb13;
+ dh.ncolors = 0;
+ dh.nimpcolors = 0;
+
+ fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ if (fd == -1)
+ {
+ g_writeln("g_save_to_bpp: open error");
+ return 1;
+ }
+ bytes = write(fd, &bm, sizeof(bm));
+ if (bytes != sizeof(bm))
+ {
+ g_writeln("g_save_to_bpp: write error");
+ }
+ bytes = write(fd, &bh, sizeof(bh));
+ if (bytes != sizeof(bh))
+ {
+ g_writeln("g_save_to_bpp: write error");
+ }
+ bytes = write(fd, &dh, sizeof(dh));
+ if (bytes != sizeof(dh))
+ {
+ g_writeln("g_save_to_bpp: write error");
+ }
+ data += stride_bytes * height;
+ data -= stride_bytes;
+ if ((depth == 24) && (bits_per_pixel == 32))
+ {
+ line = malloc(file_stride_bytes);
+ memset(line, 0, file_stride_bytes);
+ for (index = 0; index < height; index++)
+ {
+ line_ptr = line;
+ for (i1 = 0; i1 < width; i1++)
+ {
+ pixel = ((int*)data)[i1];
+ *(line_ptr++) = (pixel >> 0) & 0xff;
+ *(line_ptr++) = (pixel >> 8) & 0xff;
+ *(line_ptr++) = (pixel >> 16) & 0xff;
+ }
+ bytes = write(fd, line, file_stride_bytes);
+ if (bytes != file_stride_bytes)
+ {
+ g_writeln("g_save_to_bpp: write error");
+ }
+ data -= stride_bytes;
+ }
+ free(line);
+ }
+ else if (depth == bits_per_pixel)
+ {
+ for (index = 0; index < height; index++)
+ {
+ bytes = write(fd, data, width * (bits_per_pixel / 8));
+ if (bytes != width * (bits_per_pixel / 8))
+ {
+ g_writeln("g_save_to_bpp: write error");
+ }
+ data -= stride_bytes;
+ }
+ }
+ else
+ {
+ g_writeln("g_save_to_bpp: unimp");
+ }
+ close(fd);
+ return 0;
+}
+
/*****************************************************************************/
/* returns boolean */
int APP_CC
diff --git a/common/os_calls.h b/common/os_calls.h
index 1805a6a1..d954a075 100644
--- a/common/os_calls.h
+++ b/common/os_calls.h
@@ -161,6 +161,8 @@ int APP_CC g_check_user_in_group(const char* username, int gid, int* ok);
int APP_CC g_time1(void);
int APP_CC g_time2(void);
int APP_CC g_time3(void);
+int APP_CC g_save_to_bmp(const char* filename, char* data, int stride_bytes,
+ int width, int height, int depth, int bits_per_pixel);
int APP_CC g_text2bool(const char *s);
void * APP_CC g_shmat(int shmid);
int APP_CC g_shmdt(const void *shmaddr);
diff --git a/common/xrdp_constants.h b/common/xrdp_constants.h
index 2ee034c3..25d9495f 100644
--- a/common/xrdp_constants.h
+++ b/common/xrdp_constants.h
@@ -457,6 +457,7 @@
Extended order support flags. */
#define XR_ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT 0x0002
#define XR_ORDERFLAGS_EX_ALTSEC_FRAME_MARKER_SUPPORT 0x0004
+#define XR_ORDERFLAGS_EX_OFFSCREEN_COMPOSITE_SUPPORT 0x0100
/* drawable types */
#define WND_TYPE_BITMAP 0
@@ -548,10 +549,14 @@
#define XR_CODEC_GUID_REMOTEFX \
"\x12\x2F\x77\x76\x72\xBD\x63\x44\xAF\xB3\xB7\x3C\x9C\x6F\x78\x86"
-/* CODEC_GUID_JPEG 0x430C9EED1BAF4CE6869ACB8B37B66237*/
+/* CODEC_GUID_JPEG 0x1BAF4CE6 9EED 430C 869ACB8B37B66237 */
#define XR_CODEC_GUID_JPEG \
"\xE6\x4C\xAF\x1B\xED\x9E\x0C\x43\x86\x9A\xCB\x8B\x37\xB6\x62\x37"
+/* CODEC_GUID_PNG 0xOE0C858D 28E0 45DB ADAA0F83E57CC560 */
+#define XR_CODEC_GUID_PNG \
+ "\x8D\x85\x0C\x0E\xE0\x28\xDB\x45\xAD\xAA\x0F\x83\xE5\x7C\xC5\x60"
+
#define RDP_CAPSET_SURFCMDS 0x1c
#define RDP_CAPLEN_SURFCMDS 0x0c
#define RDP_CAPSET_BMPCODECS 0x1d