- Timestamp:
- Feb 26, 2010 4:48:46 PM (15 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
r26753 r26868 786 786 787 787 #ifdef VBOX_WITH_NEW_RUNTIME_CORE 788 UIMachine &VBoxGlobal::virtualMachine(const CSession &session /* = CSession() */)789 { 790 if (!m_pVirtualMachine )788 UIMachine* VBoxGlobal::virtualMachine(const CSession &session /* = CSession() */) 789 { 790 if (!m_pVirtualMachine && !session.isNull()) 791 791 { 792 792 UIMachine *pVirtualMachine = new UIMachine(&m_pVirtualMachine, session); … … 794 794 NOREF(pVirtualMachine); 795 795 } 796 return *m_pVirtualMachine;796 return m_pVirtualMachine; 797 797 } 798 798 #endif -
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
r26714 r26868 308 308 VBoxConsoleWnd &consoleWnd(); 309 309 #ifdef VBOX_WITH_NEW_RUNTIME_CORE 310 UIMachine &virtualMachine(const CSession &session = CSession());310 UIMachine* virtualMachine(const CSession &session = CSession()); 311 311 #endif 312 312 -
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp
r26714 r26868 27 27 #include "VBoxSelectorWnd.h" 28 28 #include "VBoxConsoleWnd.h" 29 #include "UIMachine.h" 29 30 #include "VBoxProgressDialog.h" 30 31 … … 251 252 int aMinDuration) 252 253 { 253 VBoxProgressDialog progressDlg (aProgress, aTitle, aMinDuration, aParent );254 VBoxProgressDialog progressDlg (aProgress, aTitle, aMinDuration, aParent ? aParent : mainWindowShown()); 254 255 255 256 /* run the dialog with the 100 ms refresh interval */ … … 260 261 261 262 /** 262 * Returns what main window ( selector or console) is now shown, or263 * zero if none of them. The selectorwindow takes precedence.263 * Returns what main window (VM selector or main VM window) is now shown, or 264 * zero if none of them. Main VM window takes precedence. 264 265 */ 265 QWidget *VBoxProblemReporter::mainWindowShown() const266 QWidget* VBoxProblemReporter::mainWindowShown() const 266 267 { 267 268 /* It may happen that this method is called during VBoxGlobal 268 269 * initialization or even after it failed (for example, to show some 269 * error message). Return no main window in this case .*/270 * error message). Return no main window in this case: */ 270 271 if (!vboxGlobal().isValid()) 271 272 return 0; 272 273 273 #if defined (VBOX_GUI_SEPARATE_VM_PROCESS) 274 #ifdef VBOX_WITH_NEW_RUNTIME_CORE 275 276 # if defined (VBOX_GUI_SEPARATE_VM_PROCESS) 274 277 if (vboxGlobal().isVMConsoleProcess()) 275 278 { 276 if (vboxGlobal().consoleWnd().isVisible()) 277 return &vboxGlobal().consoleWnd(); 279 if (vboxGlobal().virtualMachine() /* VM is present */ && 280 vboxGlobal().virtualMachine()->mainWindow() /* VM has at least one window */ && 281 vboxGlobal().virtualMachine()->mainWindow()->isVisible() /* that window is visible */) 282 return vboxGlobal().virtualMachine()->mainWindow(); /* return that window */ 278 283 } 279 284 else 280 285 { 281 if (vboxGlobal().selectorWnd().isVisible()) 282 return &vboxGlobal().selectorWnd(); 283 } 286 if (vboxGlobal().selectorWnd().isVisible()) /* VM selector is visible */ 287 return &vboxGlobal().selectorWnd(); /* return that window */ 288 } 289 # else 290 if (vboxGlobal().virtualMachine() /* VM is present */ && 291 vboxGlobal().virtualMachine()->mainWindow() /* VM has at least one window */ && 292 vboxGlobal().virtualMachine()->mainWindow()->isVisible() /* that window is visible */) 293 return vboxGlobal().virtualMachine()->mainWindow(); /* return that window */ 294 295 if (vboxGlobal().selectorWnd().isVisible()) /* VM selector is visible */ 296 return &vboxGlobal().selectorWnd(); /* return that window */ 297 # endif 298 284 299 #else 285 if (vboxGlobal().consoleWnd().isVisible()) 286 return &vboxGlobal().consoleWnd(); 287 if (vboxGlobal().selectorWnd().isVisible()) 288 return &vboxGlobal().selectorWnd(); 300 301 # if defined (VBOX_GUI_SEPARATE_VM_PROCESS) 302 if (vboxGlobal().isVMConsoleProcess()) 303 { 304 if (vboxGlobal().consoleWnd().isVisible()) /* VM window is visible */ 305 return &vboxGlobal().consoleWnd(); /* return that window */ 306 } 307 else 308 { 309 if (vboxGlobal().selectorWnd().isVisible()) /* VM selector is visible */ 310 return &vboxGlobal().selectorWnd(); /* return that window */ 311 } 312 # else 313 if (vboxGlobal().consoleWnd().isVisible()) /* VM window is visible */ 314 return &vboxGlobal().consoleWnd(); /* return that window */ 315 if (vboxGlobal().selectorWnd().isVisible()) /* VM selector is visible */ 316 return &vboxGlobal().selectorWnd(); /* return that window */ 317 # endif 318 289 319 #endif 320 321 return 0; 322 } 323 324 /** 325 * Returns main machine window is now shown, or zero if none of them. 326 */ 327 QWidget* VBoxProblemReporter::mainMachineWindowShown() const 328 { 329 /* It may happen that this method is called during VBoxGlobal 330 * initialization or even after it failed (for example, to show some 331 * error message). Return no main window in this case: */ 332 if (!vboxGlobal().isValid()) 333 return 0; 334 335 #ifdef VBOX_WITH_NEW_RUNTIME_CORE 336 if (vboxGlobal().virtualMachine() /* VM is present */ && 337 vboxGlobal().virtualMachine()->mainWindow() /* VM has at least one window */ && 338 vboxGlobal().virtualMachine()->mainWindow()->isVisible() /* that window is visible */) 339 return vboxGlobal().virtualMachine()->mainWindow(); /* return that window */ 340 #else 341 if (vboxGlobal().consoleWnd().isVisible()) /* VM window is visible */ 342 return &vboxGlobal().consoleWnd(); /* return that window */ 343 #endif 344 290 345 return 0; 291 346 } … … 932 987 ULONG64 aMinVRAM) 933 988 { 934 message ( &vboxGlobal().consoleWnd(), Error,989 message (mainMachineWindowShown(), Error, 935 990 tr ("<p>Could not enter seamless mode due to insufficient guest " 936 991 "video memory.</p>" … … 945 1000 ULONG64 aMinVRAM) 946 1001 { 947 return message ( &vboxGlobal().consoleWnd(), Warning,1002 return message (mainMachineWindowShown(), Warning, 948 1003 tr ("<p>Could not switch the guest display to fullscreen mode due " 949 1004 "to insufficient guest video memory.</p>" … … 1235 1290 if (aRetry) 1236 1291 { 1237 return messageOkCancel (aParent , Question, text1292 return messageOkCancel (aParent ? aParent : mainWindowShown(), Question, text 1238 1293 .arg (mediumToAccusative (aMedium.type(), aMedium.isHostDrive())) 1239 1294 .arg (aMedium.isHostDrive() ? aMedium.name() : aMedium.location()) … … 1245 1300 else 1246 1301 { 1247 return message (aParent , Error, text1302 return message (aParent ? aParent : mainWindowShown(), Error, text 1248 1303 .arg (mediumToAccusative (aMedium.type(), aMedium.isHostDrive())) 1249 1304 .arg (aMedium.isHostDrive() ? aMedium.name() : aMedium.location()) … … 1259 1314 /** @todo (translation-related): the gender of "the" in translations 1260 1315 * will depend on the gender of aMedium.type(). */ 1261 message (aParent , Error,1316 message (aParent ? aParent : mainWindowShown(), Error, 1262 1317 tr ("Failed to open the %1 <nobr><b>%2</b></nobr>.") 1263 1318 .arg (mediumToAccusative (aType)) … … 1384 1439 COMResult res (console); 1385 1440 1386 message ( &vboxGlobal().consoleWnd(), Error,1441 message (mainMachineWindowShown(), Error, 1387 1442 tr ("Failed to attach the USB device <b>%1</b> " 1388 1443 "to the virtual machine <b>%2</b>.") … … 1396 1451 const CVirtualBoxErrorInfo &error) 1397 1452 { 1398 message ( &vboxGlobal().consoleWnd(), Error,1453 message (mainMachineWindowShown(), Error, 1399 1454 tr ("Failed to attach the USB device <b>%1</b> " 1400 1455 "to the virtual machine <b>%2</b>.") … … 1410 1465 COMResult res (console); 1411 1466 1412 message ( &vboxGlobal().consoleWnd(), Error,1467 message (mainMachineWindowShown(), Error, 1413 1468 tr ("Failed to detach the USB device <b>%1</b> " 1414 1469 "from the virtual machine <b>%2</b>.") … … 1422 1477 const CVirtualBoxErrorInfo &error) 1423 1478 { 1424 message ( &vboxGlobal().consoleWnd(), Error,1479 message (mainMachineWindowShown(), Error, 1425 1480 tr ("Failed to detach the USB device <b>%1</b> " 1426 1481 "from the virtual machine <b>%2</b>.") … … 1507 1562 const QString &aSrc2) 1508 1563 { 1509 return message ( &vboxGlobal().consoleWnd(), Question,1564 return message (mainMachineWindowShown(), Question, 1510 1565 tr ("<p>Could not find the VirtualBox Guest Additions " 1511 1566 "CD image file <nobr><b>%1</b></nobr> or " … … 1521 1576 const QString &aReason) 1522 1577 { 1523 message ( &vboxGlobal().consoleWnd(), Error,1578 message (mainMachineWindowShown(), Error, 1524 1579 tr ("<p>Failed to download the VirtualBox Guest Additions CD " 1525 1580 "image from <nobr><a href=\"%1\">%2</a>.</nobr></p><p>%3</p>") … … 1529 1584 void VBoxProblemReporter::cannotMountGuestAdditions (const QString &aMachineName) 1530 1585 { 1531 message ( &vboxGlobal().consoleWnd(), Error,1586 message (mainMachineWindowShown(), Error, 1532 1587 tr ("<p>Could not insert the VirtualBox Guest Additions " 1533 1588 "installer CD image into the virtual machine <b>%1</b>, as the machine " … … 1540 1595 ulong aSize) 1541 1596 { 1542 return messageOkCancel ( &vboxGlobal().consoleWnd(), Question,1597 return messageOkCancel (mainMachineWindowShown(), Question, 1543 1598 tr ("<p>Are you sure you want to download the VirtualBox " 1544 1599 "Guest Additions CD image from " … … 1552 1607 const QString &aSrc) 1553 1608 { 1554 return messageOkCancel ( &vboxGlobal().consoleWnd(), Question,1609 return messageOkCancel (mainMachineWindowShown(), Question, 1555 1610 tr ("<p>The VirtualBox Guest Additions CD image has been " 1556 1611 "successfully downloaded from " … … 1568 1623 const QString &aExpectedVer) 1569 1624 { 1570 message (aParent , VBoxProblemReporter::Error,1625 message (aParent ? aParent : mainMachineWindowShown(), VBoxProblemReporter::Error, 1571 1626 tr ("<p>The VirtualBox Guest Additions installed in the Guest OS are too " 1572 1627 "old: the installed version is %1, the expected version is %2. " … … 1585 1640 const QString &aExpectedVer) 1586 1641 { 1587 message (aParent , VBoxProblemReporter::Warning,1642 message (aParent ? aParent : mainMachineWindowShown(), VBoxProblemReporter::Warning, 1588 1643 tr ("<p>The VirtualBox Guest Additions installed in the Guest OS are " 1589 1644 "outdated: the installed version is %1, the expected version is %2. " … … 1601 1656 const QString &aExpectedVer) 1602 1657 { 1603 message (aParent , VBoxProblemReporter::Error,1658 message (aParent ? aParent : mainMachineWindowShown(), VBoxProblemReporter::Error, 1604 1659 tr ("<p>The VirtualBox Guest Additions installed in the Guest OS are " 1605 1660 "too recent for this version of VirtualBox: the installed version " … … 1687 1742 bool VBoxProblemReporter::confirmInputCapture (bool *aAutoConfirmed /* = NULL */) 1688 1743 { 1689 int rc = message ( &vboxGlobal().consoleWnd(), Info,1744 int rc = message (mainMachineWindowShown(), Info, 1690 1745 tr ("<p>You have <b>clicked the mouse</b> inside the Virtual Machine display " 1691 1746 "or pressed the <b>host key</b>. This will cause the Virtual Machine to " … … 1720 1775 void VBoxProblemReporter::remindAboutAutoCapture() 1721 1776 { 1722 message ( &vboxGlobal().consoleWnd(), Info,1777 message (mainMachineWindowShown(), Info, 1723 1778 tr ("<p>You have the <b>Auto capture keyboard</b> option turned on. " 1724 1779 "This will cause the Virtual Machine to automatically <b>capture</b> " … … 1762 1817 if (aSupportsAbsolute) 1763 1818 { 1764 message ( &vboxGlobal().consoleWnd(), Info,1819 message (mainMachineWindowShown(), Info, 1765 1820 tr ("<p>The Virtual Machine reports that the guest OS supports " 1766 1821 "<b>mouse pointer integration</b>. This means that you do not " … … 1786 1841 else 1787 1842 { 1788 message ( &vboxGlobal().consoleWnd(), Info,1843 message (mainMachineWindowShown(), Info, 1789 1844 tr ("<p>The Virtual Machine reports that the guest OS does not " 1790 1845 "support <b>mouse pointer integration</b> in the current video " … … 1803 1858 { 1804 1859 int rc = message ( 1805 &vboxGlobal().consoleWnd(),1860 mainMachineWindowShown(), 1806 1861 Info, 1807 1862 tr ( … … 1893 1948 bool VBoxProblemReporter::confirmGoingFullscreen (const QString &aHotKey) 1894 1949 { 1895 return messageOkCancel ( &vboxGlobal().consoleWnd(), Info,1950 return messageOkCancel (mainMachineWindowShown(), Info, 1896 1951 tr ("<p>The virtual machine window will be now switched to " 1897 1952 "<b>fullscreen</b> mode. " … … 1915 1970 bool VBoxProblemReporter::confirmGoingSeamless (const QString &aHotKey) 1916 1971 { 1917 return messageOkCancel ( &vboxGlobal().consoleWnd(), Info,1972 return messageOkCancel (mainMachineWindowShown(), Info, 1918 1973 tr ("<p>The virtual machine window will be now switched to " 1919 1974 "<b>Seamless</b> mode. " … … 1942 1997 } 1943 1998 1944 int rc = message ( &vboxGlobal().consoleWnd(), Info,1999 int rc = message (mainMachineWindowShown(), Info, 1945 2000 tr ("<p>The virtual machine window is optimized to work in " 1946 2001 "<b>%1 bit</b> color mode but the " … … 1968 2023 Q_UNUSED (aConsole); 1969 2024 1970 int rc = message ( &vboxGlobal().consoleWnd(), GuruMeditation,2025 int rc = message (mainMachineWindowShown(), GuruMeditation, 1971 2026 tr ("<p>A critical error has occurred while running the virtual " 1972 2027 "machine and the machine execution has been stopped.</p>" … … 2001 2056 bool VBoxProblemReporter::confirmVMReset (QWidget *aParent) 2002 2057 { 2003 return messageOkCancel (aParent , Question,2058 return messageOkCancel (aParent ? aParent : mainMachineWindowShown(), Question, 2004 2059 tr ("<p>Do you really want to reset the virtual machine?</p>" 2005 2060 "<p>This will cause any unsaved data in applications running inside " … … 2207 2262 if (type == Critical) 2208 2263 { 2209 rc = message ( &vboxGlobal().consoleWnd(), type,2264 rc = message (mainMachineWindowShown(), type, 2210 2265 tr ("<p>A fatal error has occurred during virtual machine execution! " 2211 2266 "The virtual machine will be powered off. Please copy the " … … 2219 2274 else if (type == Error) 2220 2275 { 2221 rc = message ( &vboxGlobal().consoleWnd(), type,2276 rc = message (mainMachineWindowShown(), type, 2222 2277 tr ("<p>An error has occurred during virtual machine execution! " 2223 2278 "The error details are shown below. You may try to correct " … … 2228 2283 else 2229 2284 { 2230 rc = message ( &vboxGlobal().consoleWnd(), type,2285 rc = message (mainMachineWindowShown(), type, 2231 2286 tr ("<p>The virtual machine execution may run into an error " 2232 2287 "condition as described below. " -
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h
r26714 r26868 143 143 QWidget *aParent, int aMinDuration = 2000); 144 144 145 QWidget *mainWindowShown() const; 145 QWidget* mainWindowShown() const; 146 QWidget* mainMachineWindowShown() const; 146 147 147 148 /* Generic problem handlers */ -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.cpp
r26845 r26868 28 28 #include "UIActionsPool.h" 29 29 #include "UIMachineLogic.h" 30 #include "UIMachineWindow.h" 30 31 31 32 class UIVisualState : public QObject … … 186 187 } 187 188 189 QWidget* UIMachine::mainWindow() const 190 { 191 if (machineLogic() && 192 machineLogic()->machineWindowWrapper() && 193 machineLogic()->machineWindowWrapper()->machineWindow()) 194 return machineLogic()->machineWindowWrapper()->machineWindow(); 195 else 196 return 0; 197 } 198 188 199 UIMachineLogic* UIMachine::machineLogic() const 189 200 { 190 return m_pVisualState->m_pMachineLogic; 201 if (m_pVisualState && m_pVisualState->m_pMachineLogic) 202 return m_pVisualState->m_pMachineLogic; 203 else 204 return 0; 191 205 } 192 206 -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
r26845 r26868 30 30 #include "UIMachineDefs.h" 31 31 32 /* Global forwards: */ 33 class QWidget; 34 32 35 /* Local forwards */ 33 36 class UISession; … … 43 46 public: 44 47 45 /* Virtual Machine constructor : */48 /* Virtual Machine constructor/destructor: */ 46 49 UIMachine(UIMachine **ppSelf, const CSession &session); 47 50 virtual ~UIMachine(); 51 52 /* Public getters: */ 53 QWidget* mainWindow() const; 48 54 49 55 private slots: -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
r26820 r26868 692 692 if (RT_HIWORD(uVersion) < VMMDEV_VERSION_MAJOR) 693 693 { 694 vboxProblem().warnAboutTooOldAdditions( machineWindowWrapper()->machineWindow(), strRealVersion, strExpectedVersion);694 vboxProblem().warnAboutTooOldAdditions(0, strRealVersion, strExpectedVersion); 695 695 } 696 696 else if (RT_HIWORD(uVersion) == VMMDEV_VERSION_MAJOR && RT_LOWORD(uVersion) < VMMDEV_VERSION_MINOR) 697 697 { 698 vboxProblem().warnAboutOldAdditions( machineWindowWrapper()->machineWindow(), strRealVersion, strExpectedVersion);698 vboxProblem().warnAboutOldAdditions(0, strRealVersion, strExpectedVersion); 699 699 } 700 700 else if (uVersion > VMMDEV_VERSION) 701 701 { 702 vboxProblem().warnAboutNewAdditions( machineWindowWrapper()->machineWindow(), strRealVersion, strExpectedVersion);702 vboxProblem().warnAboutNewAdditions(0, strRealVersion, strExpectedVersion); 703 703 } 704 704 } … … 830 830 { 831 831 /* Show the "Taking Snapshot" progress dialog */ 832 vboxProblem().showModalProgressDialog(progress, machine.GetName(), machineWindowWrapper()->machineWindow(), 0);832 vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0, 0); 833 833 834 834 if (progress.GetResultCode() != 0) … … 856 856 void UIMachineLogic::sltReset() 857 857 { 858 /* Do not process if window is missing! */859 if (!machineWindowWrapper())860 return;861 862 858 /* Confirm/Reset current console: */ 863 if (vboxProblem().confirmVMReset( machineWindowWrapper()->machineWindow()))859 if (vboxProblem().confirmVMReset(0)) 864 860 session().GetConsole().Reset(); 865 861 } … … 1132 1128 { 1133 1129 /* Ask for force remounting: */ 1134 if (vboxProblem().cannotRemountMedium( machineWindowWrapper()->machineWindow(), machine, vboxGlobal().findMedium (fMount ? newId : currentId), fMount, true /* retry? */) == QIMessageBox::Ok)1130 if (vboxProblem().cannotRemountMedium(0, machine, vboxGlobal().findMedium (fMount ? newId : currentId), fMount, true /* retry? */) == QIMessageBox::Ok) 1135 1131 { 1136 1132 /* Force remount medium to the predefined port/device: */ … … 1139 1135 fWasMounted = true; 1140 1136 else 1141 vboxProblem().cannotRemountMedium( machineWindowWrapper()->machineWindow(), machine, vboxGlobal().findMedium (fMount ? newId : currentId), fMount, false /* retry? */);1137 vboxProblem().cannotRemountMedium(0, machine, vboxGlobal().findMedium (fMount ? newId : currentId), fMount, false /* retry? */); 1142 1138 } 1143 1139 } … … 1373 1369 if (!vbox.isOk()) 1374 1370 { 1375 vboxProblem().cannotOpenMedium( machineWindowWrapper()->machineWindow(), vbox, VBoxDefs::MediumType_DVD, strSource);1371 vboxProblem().cannotOpenMedium(0, vbox, VBoxDefs::MediumType_DVD, strSource); 1376 1372 return; 1377 1373 } … … 1416 1412 { 1417 1413 /* Ask for force mounting */ 1418 if (vboxProblem().cannotRemountMedium( machineWindowWrapper()->machineWindow(), machine, VBoxMedium(image, VBoxDefs::MediumType_DVD),1414 if (vboxProblem().cannotRemountMedium(0, machine, VBoxMedium(image, VBoxDefs::MediumType_DVD), 1419 1415 true /* mount? */, true /* retry? */) == QIMessageBox::Ok) 1420 1416 { … … 1424 1420 fIsMounted = true; 1425 1421 else 1426 vboxProblem().cannotRemountMedium( machineWindowWrapper()->machineWindow(), machine, VBoxMedium(image, VBoxDefs::MediumType_DVD),1422 vboxProblem().cannotRemountMedium(0, machine, VBoxMedium(image, VBoxDefs::MediumType_DVD), 1427 1423 true /* mount? */, false /* retry? */); 1428 1424 } -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
r26820 r26868 241 241 { 242 242 /* Show the "VM saving" progress dialog */ 243 vboxProblem().showModalProgressDialog(progress, machine.GetName(), machineWindow(), 0);243 vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0, 0); 244 244 if (progress.GetResultCode() != 0) 245 245 vboxProblem().cannotSaveMachineState(progress); … … 273 273 { 274 274 /* Show the power down progress dialog */ 275 vboxProblem().showModalProgressDialog(progress, machine.GetName(), machineWindow());275 vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0); 276 276 if (progress.GetResultCode() != 0) 277 277 vboxProblem().cannotStopMachine(progress); … … 296 296 { 297 297 /* Show the progress dialog */ 298 vboxProblem().showModalProgressDialog(progress, machine.GetName(), machineWindow());298 vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0); 299 299 if (progress.GetResultCode() != 0) 300 300 vboxProblem().cannotRestoreSnapshot(progress, snapshot.GetName()); … … 361 361 { 362 362 #ifndef VBOX_GUI_SEPARATE_VM_PROCESS 363 vboxGlobal().selectorWnd().show();363 //vboxGlobal().selectorWnd().show(); 364 364 #endif 365 365
Note:
See TracChangeset
for help on using the changeset viewer.