VirtualBox

source: vbox/trunk/src/VBox/Main/DisplayUtils.cpp@ 34927

Last change on this file since 34927 was 32398, checked in by vboxsync, 14 years ago

Main: Save guest dimension in save state; add method for queering this info to IMachine.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 KB
Line 
1/* $Id: DisplayUtils.cpp 32398 2010-09-10 12:46:23Z vboxsync $ */
2/** @file
3 * Implementation of IDisplay helpers.
4 */
5
6/*
7 * Copyright (C) 2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#include <DisplayUtils.h>
19
20#include <iprt/log.h>
21#include <VBox/err.h>
22#include <VBox/ssm.h>
23
24int readSavedDisplayScreenshot(const Utf8Str &strStateFilePath, uint32_t u32Type, uint8_t **ppu8Data, uint32_t *pcbData, uint32_t *pu32Width, uint32_t *pu32Height)
25{
26 LogFlowFunc(("u32Type = %d [%s]\n", u32Type, strStateFilePath.c_str()));
27
28 /* @todo cache read data */
29 if (strStateFilePath.isEmpty())
30 {
31 /* No saved state data. */
32 return VERR_NOT_SUPPORTED;
33 }
34
35 uint8_t *pu8Data = NULL;
36 uint32_t cbData = 0;
37 uint32_t u32Width = 0;
38 uint32_t u32Height = 0;
39
40 PSSMHANDLE pSSM;
41 int vrc = SSMR3Open(strStateFilePath.c_str(), 0 /*fFlags*/, &pSSM);
42 if (RT_SUCCESS(vrc))
43 {
44 uint32_t uVersion;
45 vrc = SSMR3Seek(pSSM, "DisplayScreenshot", 1100 /*iInstance*/, &uVersion);
46 if (RT_SUCCESS(vrc))
47 {
48 if (uVersion == sSSMDisplayScreenshotVer)
49 {
50 uint32_t cBlocks;
51 vrc = SSMR3GetU32(pSSM, &cBlocks);
52 AssertRCReturn(vrc, vrc);
53
54 for (uint32_t i = 0; i < cBlocks; i++)
55 {
56 uint32_t cbBlock;
57 vrc = SSMR3GetU32(pSSM, &cbBlock);
58 AssertRCBreak(vrc);
59
60 uint32_t typeOfBlock;
61 vrc = SSMR3GetU32(pSSM, &typeOfBlock);
62 AssertRCBreak(vrc);
63
64 LogFlowFunc(("[%d] type %d, size %d bytes\n", i, typeOfBlock, cbBlock));
65
66 if (typeOfBlock == u32Type)
67 {
68 if (cbBlock > 2 * sizeof(uint32_t))
69 {
70 cbData = cbBlock - 2 * sizeof(uint32_t);
71 pu8Data = (uint8_t *)RTMemAlloc(cbData);
72 if (pu8Data == NULL)
73 {
74 vrc = VERR_NO_MEMORY;
75 break;
76 }
77
78 vrc = SSMR3GetU32(pSSM, &u32Width);
79 AssertRCBreak(vrc);
80 vrc = SSMR3GetU32(pSSM, &u32Height);
81 AssertRCBreak(vrc);
82 vrc = SSMR3GetMem(pSSM, pu8Data, cbData);
83 AssertRCBreak(vrc);
84 }
85 else
86 {
87 /* No saved state data. */
88 vrc = VERR_NOT_SUPPORTED;
89 }
90
91 break;
92 }
93 else
94 {
95 /* displaySSMSaveScreenshot did not write any data, if
96 * cbBlock was == 2 * sizeof (uint32_t).
97 */
98 if (cbBlock > 2 * sizeof (uint32_t))
99 {
100 vrc = SSMR3Skip(pSSM, cbBlock);
101 AssertRCBreak(vrc);
102 }
103 }
104 }
105 }
106 else
107 {
108 vrc = VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
109 }
110 }
111
112 SSMR3Close(pSSM);
113 }
114
115 if (RT_SUCCESS(vrc))
116 {
117 if (u32Type == 0 && cbData % 4 != 0)
118 {
119 /* Bitmap is 32bpp, so data is invalid. */
120 vrc = VERR_SSM_UNEXPECTED_DATA;
121 }
122 }
123
124 if (RT_SUCCESS(vrc))
125 {
126 *ppu8Data = pu8Data;
127 *pcbData = cbData;
128 *pu32Width = u32Width;
129 *pu32Height = u32Height;
130 LogFlowFunc(("cbData %d, u32Width %d, u32Height %d\n", cbData, u32Width, u32Height));
131 }
132
133 LogFlowFunc(("vrc %Rrc\n", vrc));
134 return vrc;
135}
136
137void freeSavedDisplayScreenshot(uint8_t *pu8Data)
138{
139 /* @todo not necessary when caching is implemented. */
140 RTMemFree(pu8Data);
141}
142
143int readSavedGuestSize(const Utf8Str &strStateFilePath, uint32_t u32ScreenId, uint32_t *pu32Width, uint32_t *pu32Height)
144{
145 LogFlowFunc(("u32ScreenId = %d [%s]\n", u32ScreenId, strStateFilePath.c_str()));
146
147 /* @todo cache read data */
148 if (strStateFilePath.isEmpty())
149 {
150 /* No saved state data. */
151 return VERR_NOT_SUPPORTED;
152 }
153
154 uint32_t u32Width = 0;
155 uint32_t u32Height = 0;
156
157 PSSMHANDLE pSSM;
158 int vrc = SSMR3Open(strStateFilePath.c_str(), 0 /*fFlags*/, &pSSM);
159 if (RT_SUCCESS(vrc))
160 {
161 uint32_t uVersion;
162 vrc = SSMR3Seek(pSSM, "DisplayData", 0 /*iInstance*/, &uVersion);
163 if (RT_SUCCESS(vrc))
164 {
165 /* Only the second version is supported. */
166 if (uVersion == sSSMDisplayVer2)
167 {
168 uint32_t cMonitors;
169 SSMR3GetU32(pSSM, &cMonitors);
170 if (u32ScreenId > cMonitors)
171 vrc = -2;
172 else
173 {
174 /* Skip all previous monitors and the first 3 entries. */
175 SSMR3Skip(pSSM, u32ScreenId * 5 * sizeof(uint32_t) + 3 * sizeof(uint32_t));
176 SSMR3GetU32(pSSM, &u32Width);
177 SSMR3GetU32(pSSM, &u32Height);
178 }
179 }
180 }
181
182 SSMR3Close(pSSM);
183 }
184
185 if (RT_SUCCESS(vrc))
186 {
187 *pu32Width = u32Width;
188 *pu32Height = u32Height;
189 }
190
191 LogFlowFunc(("vrc %Rrc\n", vrc));
192 return vrc;
193}
194
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette